9

SSE では、接頭部066h(オペランド・サイズのオーバーライド) 0F2H(REPNE) および0F3h(REPE) はオペコードの一部です。

非 SSE066hでは、32 ビット (または 64 ビット) と 16 ビットの操作を切り替えます。 文字列操作に使用されます0F2h。と(または) を同じ命令で使用できる0F3hように、それらを組み合わせることができます。これは意味があるためです。SSE 命令の動作は何ですか? たとえば、次のようになります (ここでは mod/rm を無視します)。066h0F2h0F3h

0f 58      addps
66 0f 58   addpd
f2 0f 58   addsd
f3 0f 58   addss

しかし、これは何ですか?

66 f2 0f 58

そしてどうですか?

f2 66 0f 58

競合する 2 つの REP プレフィックスを持つ次のものは言うまでもありません。

f2 f3 0f 58

これらの仕様は何ですか?

4

2 に答える 2

5

ランダムなプレフィックスを乱暴に組み合わせた場合に何を期待すべきかについての仕様を見た覚えがないので、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、すべて0XMM70FFh

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た。

したがって、私の結論は、仮定を立てて「未定義」の動作を期待するべきではないということです。しかし、アグナー フォグのマニュアルに手がかりが見つかったとしても、私は驚かないでしょう。

于 2010-03-09T11:46:20.163 に答える