6

コードゴルフ/バイナリ実行可能ファイルの最小オペコードサイズx86-64 strlen実装を調査していますが、これはある程度のサイズを超えることは想定されていません(簡単にするためにデモシーンを考えてください)。
一般的なアイデアはhereから、サイズ最適化のアイデアはhereおよびhereから得られます。

入力文字列のアドレスは にありますrdi。最大長は を超えてはいけませんInt32

xor   eax,eax ; 2 bytes
or    ecx,-1  ; 3 bytes
repne scasb   ; 2 bytes
not   ecx     ; 2 bytes
dec   ecx     ; 2 bytes

最終結果はecx合計11バイトです。

質問はに設定ecxすることです-1

選択肢 1 は既に述べた

or ecx,-1 ; 3 bytes

オプション 2

lea ecx,[rax-1] ; 3 bytes 

オプション 3

stc         ; 1 byte
sbb ecx,ecx ; 2 bytes

オプション 4 、おそらく最も遅いもの

push -1 ; 2 bytes
pop rcx ; 1 byte


オプション 1 は以前の値に依存していecxます
オプション 2 は以前の値に依存しています オプション 3以前のrax値に依存しているかどうかわかりませんか? オプション 4 は最も遅いものですか?
ecx

ここに明確な勝者はいますか?
基準は、オペコードのサイズをできるだけ小さく保ち、パフォーマンスに関して最適なものを選択することです。
最新の CPU 命令を使用した実装があることは十分承知していますが、この従来のアプローチは最小のもののようです。

4

2 に答える 2