正如Intel 64 and IA-32 Architectures Software Developer's Manual Combined Volumes 2A and 2B: Instruction Set Reference, A-Z中所说
2.1.1指令前缀
F3H还用作POPCNT,LZCNT和ADOX指令的必需前缀。
但在
2.1.2操作码
例如,CVTDQ2PD由以下序列组成:F3 0F E6。第一个字节是强制性前缀(不视为重复前缀)。
我可以说如果intel's手册中操作码的第一个字节是F3H,它是该指令的必需前缀吗?
最佳答案
是。
在序列0F E6
中,第一个字节0F
是一个两字节操作码转义。
另一个字节E6
根据附录A(第A.3节)中的表进行翻译,并在此处以简写形式报告
高行是字节的低半字节,第一列是高字节。
我们可以看到,没有F3
字节,序列0F E6
不会编码任何指令。66 0F E6
编码vcvttpd2dq
F3 0F E6
编码vcvtdq2pd
F2 0F E6
编码vcvtpd2dq
是的,F3
是强制性的。
诚然,英特尔所做的只是一个怪癖,字节F3
是真实的rep
前缀,但CPU并没有这样解释。
您可以将0F E6
视为未命名的指令,例如unm2
,这样:unm2
的行为与ud2
rep unm2
的行为与vcvtdq2pd
repne unm2
的行为与vcvtpd2dq
大小覆盖的unm2
行为与vcvttpd2dq