GCC's inefficient code generation for C++ initializers
https://godbolt.org/z/PYxz55 (GCC 9, 10, 11)
xorl %eax, %eax
movl $0, -24(%rsp)
movw %ax, -20(%rsp)
movabsq $72057594037927935, %rax
movb $0, -18(%rsp)
andq -24(%rsp), %rax
salq $8, %rax
movb %dil, %al
ret
https://godbolt.org/z/8njqn1 (GCC 9, 10) xorl %edx, %edx
movl $1, %eax
movb $2, %dl
movq %rax, -24(%rsp)
xorl %eax, %eax
movq %rdx, -16(%rsp)
movdqa -24(%rsp), %xmm0
pinsrd $3, %eax, %xmm0
movaps %xmm0, -24(%rsp)
movq -24(%rsp), %rax
movq -16(%rsp), %rdx
ret
https://godbolt.org/z/sronaG (GCC 7, 8, 9, 10, 11) movq %rdi, -24(%rsp)
movq -24(%rsp), %rax
movq %rsi, -16(%rsp)
movq -16(%rsp), %rdx
For each example, two movs and a ret (and no stack access) would suffice.