我不记得在疯狂组合随机前缀的情况下看过任何关于你应该期待什么的规范,所以我猜 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
.
所以我的结论是,不应该做出任何假设并期望“未定义”的行为。但是,如果您能在 Agner fog 的手册中找到一些线索,我不会感到惊讶。