-
Notifications
You must be signed in to change notification settings - Fork 15.3k
Open
Description
Given the following code
auto equal(
int const * const lhs,
int const * const rhs
) -> bool {
for (int n = 0; n != 10; ++n) {
if (lhs[n] != rhs[n]) {
return false;
}
}
return true;
}I would expect something like a call to memcmp for sufficiently large size. Instead, at -O3 it follows this pattern for 2 <= size <= 59:
equal(int const*, int const*):
mov eax, dword ptr [rdi]
cmp eax, dword ptr [rsi]
jne .LBB0_10
mov eax, dword ptr [rdi + 4]
cmp eax, dword ptr [rsi + 4]
jne .LBB0_10
mov eax, dword ptr [rdi + 8]
cmp eax, dword ptr [rsi + 8]
jne .LBB0_10
mov eax, dword ptr [rdi + 12]
cmp eax, dword ptr [rsi + 12]
jne .LBB0_10
mov eax, dword ptr [rdi + 16]
cmp eax, dword ptr [rsi + 16]
jne .LBB0_10
mov eax, dword ptr [rdi + 20]
cmp eax, dword ptr [rsi + 20]
jne .LBB0_10
mov eax, dword ptr [rdi + 24]
cmp eax, dword ptr [rsi + 24]
jne .LBB0_10
mov eax, dword ptr [rdi + 28]
cmp eax, dword ptr [rsi + 28]
jne .LBB0_10
mov eax, dword ptr [rdi + 32]
cmp eax, dword ptr [rsi + 32]
jne .LBB0_10
mov eax, dword ptr [rdi + 36]
cmp eax, dword ptr [rsi + 36]
sete al
ret
.LBB0_10:
xor eax, eax
retAnd then for size >= 60 it does (with the constant adjusted appropriately)
equal(int const*, int const*):
xor eax, eax
.LBB0_1:
mov ecx, dword ptr [rdi + 4*rax]
mov edx, dword ptr [rsi + 4*rax]
cmp ecx, edx
jne .LBB0_3
cmp rax, 59
lea rax, [rax + 1]
jne .LBB0_1
.LBB0_3:
cmp ecx, edx
sete al
ret