С учетом этого кода:
#include <string.h>
int equal4(const char* a, const char* b)
{
return memcmp(a, b, 4) == 0;
}
int less4(const char* a, const char* b)
{
return memcmp(a, b, 4) < 0;
}
GCC 7 на x86_64 ввел оптимизацию для первого случая (Clang проделал это в течение длительного времени):
mov eax, DWORD PTR [rsi]
cmp DWORD PTR [rdi], eax
sete al
movzx eax, al
Но второй случай все еще вызывает memcmp()
:
sub rsp, 8
mov edx, 4
call memcmp
add rsp, 8
shr eax, 31
Можно ли применить аналогичную оптимизацию ко второму случаю? Какая лучшая сборка для этого и есть ли ясная причина, почему это не делается (GCC или Clang)?
Смотрите на Godbolt Compiler Explorer: https://godbolt.org/g/jv8fcf