目前我正在阅读CSAPP 3d版,我发现说明书有点冗长(在我看来)就像
vucomiss
,所以我搜索了说明书的全名以帮助记忆。
我找到了描述“无序比较标量单精度浮点值”,因此u指的是无序,com指的是比较,ss指的是单精度标量,但是字母i在哪里?
vcomiss
和vucomiss
(以及SSE1版本comiss
和ucomiss
)中的字母i是什么意思?
我假设“i”代表整数,就像与整数FLAGS寄存器进行比较一样,与x87不同
fcom
。
comiss
/ ucomiss
助记符显然是受到 x87 指令 fcomi
和 fucomi
的启发,这是 P6 (Pentium Pro) 中的新指令。 英特尔关于这些指令的第 2 卷手册条目并未阐明“i”代表什么;我没有看过其他卷的 Intel 手册或 AMD 手册(尽管 Intel 给它们起了名字。)
在 P6 之前,唯一的 x87 比较设置 x87 状态寄存器,需要
fstsw
和 sahf
(或直接使用 test
/jcc
测试这些位)。 因此像 fcom
和 fucom
这样的指令仅在 x87 单元内执行,仅将结果写入 x87 状态字。 (这是一个单独的芯片,通过外部引脚与 8086 到 386 中的实际 CPU 进行通信。487 只是一个 486DX,它接管系统并运行整数指令,P5 及后来的版本始终具有集成的 FPU)。
请参阅 为什么 x86 FP 像无符号整数一样比较集合 CF,而不是使用有符号条件?了解有关 SSE/AVX 比较 FLAG 设置如何从 x87 演变而来的更多信息,以及 x87 在 P6 之前如何进行比较
fcomi
。
请注意,
vcomiss
是SSE1comiss
的AVX1版本。 您最初的问题询问了这一点,但链接了ucomiss
(其手动输入也涵盖了vucomiss
)。 助记符上的“v”前缀代表以 VEX 为前缀的 AVX 编码,但这些指令实际上可以追溯到 Pentium III 中的原始 SSE。 (双精度版本,[u]comisd
,可以追溯到 Pentium 4 中的 SSE2。)vpermps
。