ランダムなプレフィックスを乱暴に組み合わせた場合に何を期待すべきかについての仕様を見た覚えがないので、CPU の動作は「未定義」であり、おそらく CPU 固有である可能性があると思います。(明らかに、インテルのドキュメントなどで指定されているものもありますが、多くの場合はカバーされていません)。また、一部の組み合わせは、将来の使用のために予約されている場合があります。
私の素朴な仮定は、通常、追加のプレフィックスはノーオペレーションであるというものでしたが、保証はありません。たとえば、一部の最適化マニュアルでは、接頭辞を付けてマルチバイトをNOP
(標準的90h
に)推奨していることを考えると、それは合理的と思われます66h
。
db 66h, 90h; 2-byte NOP
db 66h, 66h, 90h; 3-byte NOP
db 66h, 66h, 66h, 90h; 4-byte NOP
CS
ただし、セグメント オーバーライド プレフィックスは、条件付きジャンプ命令に適用するとDS
、SSE2 分岐ヒント プレフィックス (分岐の実行を予測 = 3Eh
=DS
オーバーライド、分岐の実行を予測 = 2Eh
=オーバーライド) として新しい機能を獲得したことも知っています。CS
とにかく、私は上記の例を見て、常にすべてに設定しXMM1
、すべて0
にXMM7
0FFh
pxor xmm1, xmm1 ; xmm1 <- 0s
pcmpeqw xmm7, xmm7 ; xmm7 <- FFs
次に、問題のコードとxmm1, xmm7
引数を指定します。私が観察したこと (Win64 システムおよび Intel T7300 Core 2 Duo の 32 ビット コード) は次のとおりです。
1)プレフィックスaddsd
を追加しても変化なし66h
db 66h
addsd xmm1, xmm7 ;total sequence = 66 F2 0F 58 CF
2)プレフィックスaddss
を追加しても変化なし0F2h
db 0f2h
addss xmm1,xmm7 ;total sequence = F2 F3 0F 58 CF
3) ただし、次のように接頭辞を付けることで変化を観察しaddpd
ました0F2h
。
db 0f2h
addpd xmm1, xmm7 ;total sequence = F2 66 0F 58 CF
この場合、XMM1 の結果は0000000000000000FFFFFFFFFFFFFFFFh
ではなく でしFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFh
た。
したがって、私の結論は、仮定を立てて「未定義」の動作を期待するべきではないということです。しかし、アグナー フォグのマニュアルに手がかりが見つかったとしても、私は驚かないでしょう。