assembly 为什么x86 ldmxcsr/stmxcsr需要一个内存操作数?

dzjeubhm  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(111)

在x86中,无法直接从通用寄存器setstore MXCSR寄存器。强制编码寄存器操作数会导致#UD。当寄存器的主要用途是测试浮点异常或更改浮点环境时,这似乎相当低效,而这两种情况都不需要在内存中反弹。内存操作数的唯一明显而现实的好处是,在不需要额外寄存器的情况下,用常数值加载寄存器。但是,允许寄存器操作数并不会使编码复杂化,那么为什么不同时允许两者呢?作为比较,AArch64使用msr fpcr, x0操作其类似的FPCR(浮点控制寄存器),从通用寄存器阅读。
在AVX中,英特尔增加了这两条指令的VEX编码版本,但并没有放松对操作数的要求,因此这似乎是一种有意的限制。

prdp8dxp

prdp8dxp1#

我也在想同样的事情。上下文切换用例由XSAVE解决,所以是的,我预计大多数MXCSR访问确实是为了更改FP舍入模式或检查/清除FP异常状态。
也许我们的想法是将FP调度与整数调度分离,但要使其不成为灾难,高效的存储转发需要调度器来跟踪。更常见的指令,如ucomiss(与EFLAGS比较),已经需要将FP结果转换为整数。
在我看来,这是一个糟糕的设计决定。这是为SSE 1,几年后,奔腾Pro,所以有时间后见之明RISC的影响,在该设计和他们是否值得硬件简化。
我想知道st/ldmxcsr到/来自内存是否是理想的,以避免必须通过整数反弹,例如如果要交替加载两种不同的舍入模式,则可以选择此选项。如果他们提供了,他们可能不想 * 也 * 为同一个uop提供不同的解码方式,这需要一个复制到整数寄存器和转发网络或从整数寄存器和转发网络复制的uop。直到SSE 2 movd xmm0, r32movd xmm0, m32,我们对XMM注册表有不同的行为。但是MMX在SSE 1之前就存在于P2 / P3上,这对MMX规则也有同样的要求。

相关问题