先日の日記の続き。
さらに先日の日記のコードを Cygwin 環境で、
$ gcc test_memcpy.cpp -msse2 -std=c++0x -lstdc++ -O3
こんな感じでコンパイルしたら、
test_memcpy.cpp: In function ‘void xmmcpy_da_sa(void*, const void*, size_t)’: test_memcpy.cpp:16:2: error: ‘nullptr’ was not declared in this scope test_memcpy.cpp: In function ‘void xmmcpy_da_s(void*, const void*, size_t)’: test_memcpy.cpp:45:2: error: ‘nullptr’ was not declared in this scope test_memcpy.cpp: In function ‘void xmmcpy_d_sa(void*, const void*, size_t)’: test_memcpy.cpp:74:2: error: ‘nullptr’ was not declared in this scope test_memcpy.cpp: In function ‘void xmmcpy_d_s(void*, const void*, size_t)’: test_memcpy.cpp:103:2: error: ‘nullptr’ was not declared in this scope
なんてエラーが。GCC は 4.5 を使用しているのですが、nullptr って非サポートなんですね。仕方ないので、
$ gcc test_memcpy.cpp -msse2 -std=c++0x -lstdc++ -O3 -Dnullptr=0
でコンパイル通しました。実行してみると、
$ ./a.exe prepare : 13.712 d/s align : 5.959 dst align : 6.505 src align : 7.645 not align : 8.002 normal cpy: 13.557
…あれれ?今度はストアをアライメントした方が速くなりました。不思議。まぁ、いずれにしても非アライメント版よりは速いので良いんですけれど。