コードゴルフ/バイナリ実行可能ファイルの最小オペコードサイズ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 命令を使用した実装があることは十分承知していますが、この従来のアプローチは最小のもののようです。