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)。下面详细讲述这些标志位/域的含义与用法。
注:指令参考
指令 |
描述 |
LDMXCSR |
格式:LDMXCSR m32 将m32中的32位值加载到MXCSR寄存器中
Intel C/C++ Compiler Intrinsic Equivalent |
STMXCSR |
格式:STMXCSR m32 将MXCSR寄存器中的值保存到m32中
Intel C/C++ Compiler Intrinsic Equivalent |
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
MXCSR寄存器的第0~5比特位指示处理器是否要检测SIMD浮点异常。这些标志位是“粘滞的(sticky)”标志位,即一旦某个标志位被设置了,除非明确显式的清除这个标志位,否则这个标志位就保持在设置状态。要清除这些标志位,可以使用LDMXCSR/FXRSTOR指令。
第7~12比特位对应个SIMD浮点异常的屏蔽位(mask bits)。如果某个异常的屏蔽位被设置,则对应的异常被屏蔽,即不产生异常;如果屏蔽位被清除,则会产生异常。当处理器冷启动或者重置时,所有的异常屏蔽位都被设置,即处理器被初始化为不产生异常。
如果使用LDMXCSR/FXRSTOR指令清除了掩码位同时设置了对应的异常标志位(意图启用处理器异常),这个操作不会立刻产生SIMD浮点异常。只有当下一条SSE/SSE2/SSE3指令执行时,才可能会产生启用的异常。
SIMD Floating-Point Rounding Control Field
MXCSR寄存器的第13~14比特位是RC(rounding control,舍入控制)域,用于控制计算结果如何进行舍入。
Flush-To-Zero
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
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,即不检测浮点异常 |