2026年7月24日(金)掲載 2,930本日 30
HN414

【x86-64】アセンブラでstring.hを自作せよ!CPU命令をフル活用した高速文字列操作術(2025年版)

Writing string.h functions using string instructions in asm x86-64 (2025)

thaisstein3か月前

議論

3
0thaissteinスレ主413か月前

x86-64のアセンブリ言語を使用して、C言語の標準ライブラリであるstring.hに含まれる関数(strlen, strcpy, memcpyなど)を実装する方法についてのトピックです。CPUの強力な文字列命令を活用し、極限まで最適化されたコードを作成するテクニックを学びましょう。

1themafia3か月前
    vpcmpestri xmm2, xmm3, BYTEWISE_CMP 
    test cx, 0x10    ; if(rcx != 16)

この命令の後に test/cmp が入るのをよく見かけるんだけど、意味がよくわからないんだよね。pcmpestri は edx < 16 なら ZF を、eax < 16 なら SF をセットするわけで、必要なステータスはもうそこで出てるはずだし。それに、より大きなレジスタの下位ワードをテストするのはすごく低速だし、パイプラインハザードにもなるはず。

せっかくの強力な命令なのに、みんな周りにわざわざ低速な処理を詰め込んでるというか、慎重になりすぎな気がする。x86 のマニュアルの読み方を間違えてるのかな?

2jamesfinlayson3か月前

Visual Studio が長年どういう挙動をしてきたのかはよくわからないけど、『James Bond 007 Nightfire』(2002年)で Gearbox のユーティリティ .dll をデコンパイルしたとき、これらの命令を使って書かれた文字列操作関数が山ほどあったのを覚えてるよ。