题
在SSE前缀066h
(操作数大小覆盖)0F2H
(REPNE)和0F3h
(REPE)是操作码的一部分。
在32位(或64位)和16位操作之间的非SSE 066h
开关。 0F2h
和0F3h
用于字符串操作。它们可以被组合,使得066h
和0F2h
(或0F3h
)可以在相同的指令一起使用,因为这是有意义的。什么是在SSE指令的行为?例如,我们已经(忽略MOD / RM现在):
0f 58
- > addps
66 0f 58
- > addpd
f2 0f 58
- > addsd
f3 0f 58
- > addss
但是,这是什么?
66 f2 0f 58
和怎么样?
f2 66 0f 58
更不用说其具有两个相互冲突的REP前缀的情况如下:
f2 f3 0f 58
什么是规格为这些?
解决方案
我不记得见过你应该期望在广泛结合随机前缀的情况下,什么任何规范,所以我猜CPU行为可能是“不确定”,并可能CPU专用的。 (显然,有些事情是在例如Intel的文档说明,但并不涵盖很多情况下)。并且一些组合可以被保留以备将来使用。
我天真的假设一般会一直附加前缀是空操作,但不能保证。这似乎是合理的假设如一些优化手册通过用NOP
,e.g前缀推荐多字节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的系统和英特尔T7300酷睿2在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
。
所以我的结论是,我们不应该做任何假设和预期“不确定”的行为即可。我也不会感到惊讶,但是,如果你能找到昂纳雾的手册的一些线索。