x86には様々なNOPがあり、Intel® 64 and IA-32 Architectures Software Developer’s Manual に記載のあるものだけでも1byte長から9byte長までの種類がある。
これにprefix等の選択肢を考えると、まさに無限に広がる大宇宙。といった感じの可能性の広さである。
で、LKML内ではNOPの種類によって速度が変わることが広く知られていて、時折どのNOPを使うのがよいかが熱い議論になる。
特に近年は自己書き換えコードの都合で最速5byte NOP議論が熱い(long jumpが5byteだからね)。
まあ、5byte NOPと3byte NOP + 2byte NOP(とprefix NOP)のどれが速いか、なんて議論は、自転車置き場理論によって無駄にスレッドがのびていくので見ていて楽しい(ほんとか?)
で、最近話題になったのはlong nopっていつ使ってもいいんだっけ議論。
Intel® 64 and IA-32 Architectures Software Developer’s Manual を読むとP6以降はlong nopが使えると書いてあるが、これま間違い。
VIAのCPUで互換性が不十分なものがあり、あれにのっている判定方法だとうまくいかない。まあ、そんなマイナーCPUは忘れる。という選択肢もあるが。
なお悪いことに、Virtual PC 2007 のCPUエミュレーションがいまいちでlong nopが動かないらしい。
そうするとありとあらゆるCPU種別判定が意味がなくなってしまうのでどうすんべ。と。
で、アホなことに(アレゲ、といってもいい)最初はlong nopでコンパイルしておいて#UD(Undefined Opcode exception. 未定義命令例外)があがってきたら、例外ハンドラのなかで自己書き換えコード走らせてshort nopに変換するというパッチ。
あほすぎる。
なぜキミタチはそこまでNOPにコダワリマスカ?
これにprefix等の選択肢を考えると、まさに無限に広がる大宇宙。といった感じの可能性の広さである。
で、LKML内ではNOPの種類によって速度が変わることが広く知られていて、時折どのNOPを使うのがよいかが熱い議論になる。
特に近年は自己書き換えコードの都合で最速5byte NOP議論が熱い(long jumpが5byteだからね)。
まあ、5byte NOPと3byte NOP + 2byte NOP(とprefix NOP)のどれが速いか、なんて議論は、自転車置き場理論によって無駄にスレッドがのびていくので見ていて楽しい(ほんとか?)
で、最近話題になったのはlong nopっていつ使ってもいいんだっけ議論。
Intel® 64 and IA-32 Architectures Software Developer’s Manual を読むとP6以降はlong nopが使えると書いてあるが、これま間違い。
VIAのCPUで互換性が不十分なものがあり、あれにのっている判定方法だとうまくいかない。まあ、そんなマイナーCPUは忘れる。という選択肢もあるが。
なお悪いことに、Virtual PC 2007 のCPUエミュレーションがいまいちでlong nopが動かないらしい。
そうするとありとあらゆるCPU種別判定が意味がなくなってしまうのでどうすんべ。と。
で、アホなことに(アレゲ、といってもいい)最初はlong nopでコンパイルしておいて#UD(Undefined Opcode exception. 未定義命令例外)があがってきたら、例外ハンドラのなかで自己書き換えコード走らせてshort nopに変換するというパッチ。
あほすぎる。
なぜキミタチはそこまでNOPにコダワリマスカ?