Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(3) - MXCSR寄存器详解

时间:2024-03-23 16:28:19

MXCSR Control and Status Register

32位宽的MXCSR寄存器(参看下图)包含了控制与状态标志位,适用于SSE,SSE2和SSE3 SIMD浮点操作。这些标志位包括:

  • SIMD浮点异常的标志位与掩码位
  • SIMD浮点操作的舍入控制域
  • 下溢清零标志位(flush-to-zero),控制当SIMD浮点操作出现下溢时的结果
  • 非规格化数据作零标志位(denormals-are-zero),控制当SIMD浮点操作处理遇到非规格化源操作数时的行为

这个寄存器的值可以经由LDMXCSR/FXRSTOR指令从存储器中加载,也可以经由STMXCSR/FXSAVE指令保存到存储器中。

参考下图,MXCSR寄存器的第16~31比特位是保留位,当处理器冷启动或者重置时,会被清零。试图通过FXRESTOR/LDMXCSR指令向保留位写入非零值时,会触发处理器的一般保护异常(#GP)。下面详细讲述这些标志位/域的含义与用法。

Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(3) - MXCSR寄存器详解

注:指令参考

指令

描述

LDMXCSR

格式:LDMXCSR m32

将m32中的32位值加载到MXCSR寄存器中

 

Intel C/C++ Compiler Intrinsic Equivalent
_mm_setcsr(unsigned int i)

STMXCSR

格式:STMXCSR m32

将MXCSR寄存器中的值保存到m32中

 

Intel C/C++ Compiler Intrinsic Equivalent
_mm_getcsr(void)

FXRSTOR

格式:FXRSTOR m512byte

从m512byte中恢复x87 FPU,MMX,XMM以及MXCSR的值

FXSAVE

格式:FXSAVE m512byte

将x87 FPU,MMX,XMM以及MXCSR的值保存到m512byte中

SIMD Floating-Point Mask and Flag Bits

Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(3) - MXCSR寄存器详解

MXCSR寄存器的第0~5比特位指示处理器是否要检测SIMD浮点异常。这些标志位是“粘滞的(sticky)”标志位,即一旦某个标志位被设置了,除非明确显式的清除这个标志位,否则这个标志位就保持在设置状态。要清除这些标志位,可以使用LDMXCSR/FXRSTOR指令。

第7~12比特位对应个SIMD浮点异常的屏蔽位(mask bits)。如果某个异常的屏蔽位被设置,则对应的异常被屏蔽,即不产生异常;如果屏蔽位被清除,则会产生异常。当处理器冷启动或者重置时,所有的异常屏蔽位都被设置,即处理器被初始化为不产生异常。

如果使用LDMXCSR/FXRSTOR指令清除了掩码位同时设置了对应的异常标志位(意图启用处理器异常),这个操作不会立刻产生SIMD浮点异常。只有当下一条SSE/SSE2/SSE3指令执行时,才可能会产生启用的异常。

SIMD Floating-Point Rounding Control Field

Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(3) - MXCSR寄存器详解

MXCSR寄存器的第13~14比特位是RC(rounding control,舍入控制)域,用于控制计算结果如何进行舍入。

 

Flush-To-Zero

Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(3) - MXCSR寄存器详解

MXCSR寄存器的第15比特位是FTZ(flush-to-zero,下溢则零)标志位,表示启用FTZ模式,这个模式控制SIMD浮点计算结果下溢时的屏蔽响应。当产生下溢异常被屏蔽且启用了FTZ模式时,处理器在侦测到浮点下溢条件时,会执行下列操作:

  • 结果设置为0,但是保持结果的符号(即从负数,还是从正数设置为0的)
  • 设置精度precision和下溢underflow异常标志位。

如果下溢异常没有被屏蔽(UM标志位=0),则FTZ标志位被忽略。处理器在下溢时会调用异常处理器程序。

注意:FTZ模式不兼容IEEE 754浮点标准。IEEE强制要求的对下溢条件的屏蔽响应是返回非规格话的结果。FTZ模式主要是出于性能考虑,代价是些微的精度损失,但是当程序经常出现计算下溢且程序可以接受下溢当0这种结果时,可以带来更好的性能。

处理器在冷启动或者重置时,FTZ标志位被清除,禁用FTZ模式。

 

Denormals-Are-Zeros

 

Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(3) - MXCSR寄存器详解

MXCSR寄存器的第6比特位是DAZ(denormals-are-zeros,非规格话数当0)标志,用于控制处理器遇到SIMD浮点非规格化操作数条件时的响应。当DAZ标志被设置为1时,处理器在进行任何计算之前会将所有的非规格化源操作数处置为0且保留符号位;处理器不会设置DE(denormal-operand exception,非规格化数异常)标志位,无视DM(denormal-operand exception mask)标志位;而且如果DE异常没有被屏蔽,也不产生DE异常。

DAZ模式与IEEE 754浮点标准不兼容。DAZ模式的主要意图是提升处理器性能,尤其是流媒体处理程序,当把非规格化的操作数舍入为0时并不会明显的影响处理数据的质量。

当处理器冷启动或重置时,DAZ被清除,禁用DAZ模式。

小结一下处理器冷启动或重置时,MXCSR寄存器的标志位设置。

标志位

设定值 & 含义

16~31

保留位,初始化为0

15 (FTZ)

浮点下溢置0,初始化为0,不采用FTZ模式

13~14 (RC)

舍入控制,初始化为00B,舍入到最近的无限精度结果;若两个值距离相同,则结果采用偶数值(即,最低有效比特位是0的那个值)

7~12

浮点异常屏蔽位,初始化为1,屏蔽所有的浮点异常

6 (DAZ)

非规格化浮点数置0,初始化为0,不采用DAZ模式

0~5

浮点异常检测标志,初始化为0,即不检测浮点异常