- Notifications
You must be signed in to change notification settings - Fork 15.2k
Open
Open
Copy link
Description
The following code:
#include <cstring> constexpr auto size = 16; struct array { int m[size]; }; auto equal( array const lhs, array const rhs ) -> bool { #ifdef MANUAL for (int n = 0; n != size; ++n) { if (lhs.m[n] != rhs.m[n]) { return false; } } return true; #else return std::memcmp(lhs.m, rhs.m, size * sizeof(int)) == 0; #endif }Generates this assembly with -O3 -DMANUAL
equal(array, array): push rax lea rdi, [rsp + 16] lea rsi, [rsp + 80] mov edx, 64 call memcmp@PLT test eax, eax sete al pop rcx retbut with just -O3 it generates
equal(array, array): push rax lea rdi, [rsp + 16] lea rsi, [rsp + 80] mov edx, 64 call bcmp@PLT test eax, eax sete al pop rcx retSee it live: https://godbolt.org/z/xEeGMP153
I would expect both versions to generate the call to bcmp.