I have a struct X with two 64-bit integer members, and a constructor:
struct X
{
X(uint64_t a, uint64_t b)
{
a_ = a; b_ = b;
}
uint64_t a_, b_;
};
When I look at the compiler output (x86-64 gcc 8.3 and x86-64 clang 8.0.0, on 64-bit Linux), with no optimizations enabled, I see the following code for the constructor.
x86-64 gcc 8.3:
X::X(unsigned long, unsigned long):
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-8], rdi
mov QWORD PTR [rbp-16], rsi
mov QWORD PTR [rbp-24], rdx
mov rax, QWORD PTR [rbp-8]
mov QWORD PTR [rax], 0
mov rax, QWORD PTR [rbp-8]
mov QWORD PTR [rax+8], 0
mov rax, QWORD PTR [rbp-8]
mov rdx, QWORD PTR [rbp-16]
mov QWORD PTR [rax+8], rdx
mov rax, QWORD PTR [rbp-8]
mov rdx, QWORD PTR [rbp-24]
mov QWORD PTR [rax], rdx
nop
pop rbp
ret
x86-64 clang 8.0.0:
X::X(unsigned long, unsigned long):
push rbp
mov rbp, rsp
mov qword ptr [rbp - 8], rdi
mov qword ptr [rbp - 16], rsi
mov qword ptr [rbp - 24], rdx
mov rdx, qword ptr [rbp - 8]
mov qword ptr [rdx], 0
mov qword ptr [rdx + 8], 0
mov rsi, qword ptr [rbp - 16]
mov qword ptr [rdx + 8], rsi
mov rsi, qword ptr [rbp - 24]
mov qword ptr [rdx], rsi
pop rbp
ret
Does anyone know why the output is so complex? I would have expected two simple "mov" statements, even with no optimizations enabled.