Я попытался скомпилировать эту программу на компьютере x64:
#include <cstring>
int main(int argc, char* argv[])
{
return ::std::strcmp(argv[0],
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really really really really"
"really really really really really really really long string"
);
}
Я скомпилировал его следующим образом:
g++ -std=c++11 -msse2 -O3 -g a.cpp -o a
Но результирующая разборка выглядит следующим образом:
0x0000000000400480 <+0>: mov (%rsi),%rsi
0x0000000000400483 <+3>: mov $0x400628,%edi
0x0000000000400488 <+8>: mov $0x22d,%ecx
0x000000000040048d <+13>: repz cmpsb %es:(%rdi),%ds:(%rsi)
0x000000000040048f <+15>: seta %al
0x0000000000400492 <+18>: setb %dl
0x0000000000400495 <+21>: sub %edx,%eax
0x0000000000400497 <+23>: movsbl %al,%eax
0x000000000040049a <+26>: retq
Почему SIMD не используется? Я полагаю, это могло бы сравниться, скажем, с 16 символами сразу. Должен ли я писать собственный SIMD strcmp
, или по какой-то причине это бессмысленная идея?