HN414
【x86-64】アセンブラでstring.hを自作せよ!CPU命令をフル活用した高速文字列操作術(2025年版)
Writing string.h functions using string instructions in asm x86-64 (2025)
thaisstein・3か月前
Writing string.h functions using string instructions in asm x86-64 (2025)
x86-64のアセンブリ言語を使用して、C言語の標準ライブラリであるstring.hに含まれる関数(strlen, strcpy, memcpyなど)を実装する方法についてのトピックです。CPUの強力な文字列命令を活用し、極限まで最適化されたコードを作成するテクニックを学びましょう。
vpcmpestri xmm2, xmm3, BYTEWISE_CMP
test cx, 0x10 ; if(rcx != 16)
この命令の後に test/cmp が入るのをよく見かけるんだけど、意味がよくわからないんだよね。pcmpestri は edx < 16 なら ZF を、eax < 16 なら SF をセットするわけで、必要なステータスはもうそこで出てるはずだし。それに、より大きなレジスタの下位ワードをテストするのはすごく低速だし、パイプラインハザードにもなるはず。
せっかくの強力な命令なのに、みんな周りにわざわざ低速な処理を詰め込んでるというか、慎重になりすぎな気がする。x86 のマニュアルの読み方を間違えてるのかな?
Visual Studio が長年どういう挙動をしてきたのかはよくわからないけど、『James Bond 007 Nightfire』(2002年)で Gearbox のユーティリティ .dll をデコンパイルしたとき、これらの命令を使って書かれた文字列操作関数が山ほどあったのを覚えてるよ。