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
_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

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,即不检测浮点异常

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

  1. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(10) - MXCSR状态控制指令

    MXCSR State Management Instructions MXCSR状态管理指令,LDMXCSR与STMXCSR,用于控制MXCSR寄存器状态.LDMXCSR指令从存储器中加载MXCSR ...

  2. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(1) - 概述/历史/新数据类型/XMM寄存器组

    SSE Instructions SSE Overview & History Intel SSE技术的全称是Streaming SIMD Extension,中文译作流式单指令多数据指令扩展 ...

  3. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(9) - 64位整型指令(MMX指令集扩展)

    SSE 64-Bit SIMD Integer Instructions SSE扩展增加了几条64位组合的整型指令,这些指令操作MMX寄存器和64位的存储器操作数,这些指令可以看作是对MMX指令集的扩 ...

  4. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(2) - SSE程序设计环境概述

    SSE Programming Environment 下图是IA-32处理器上的SSE程序设计环境,所有的SSE指令操作XMM寄存器,MMX寄存器,和/或存储器. XMM寄存器,8个,128位宽,存 ...

  5. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(13/E) - FXSAVE/FXRSTOR指令

    FXSAVE and FXRSTOR instructions FXSAVE与FXRSTOR指令是从Pentium II处理器引入到IA-32架构上的,早于SSE指令集的引入.这两条指令的最初版本是用 ...

  6. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(7) - 混洗指令 解组合指令

    SSE Shuffle and Unpack Instructions SSE的混洗指令与解组合指令混洗shuffle或交错interleave单精度浮点操作数,并将结果保存到目标操作数. 指令 描述 ...

  7. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(6) - 逻辑指令 比较指令

    SSE Logical Instructions SSE的逻辑指令执行与,或,非,以及与非操作.操作数是组合的单精度浮点数. 指令 描述 ANDPS 格式:xmm1, xmm2/m128 对操作数执行 ...

  8. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(4) - 数据传输指令

    SSE Instruction Set SSE指令集大致可以分为4个功能组: 组合的与标量的单精度浮点指令 数据传输指令 算术指令 逻辑指令 比较指令 混洗shuffle指令 转换指令 64位SIMD ...

  9. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(12) - 预取指令与SFENCE指令

    PREFETCHn Instructions PREFETCHn指令使得程序可以提前让处理器预先即将访问的数据读入到指定的某级缓存中,这样当程序真正需要这些数据时,可以直接命中缓存.这些指令按照制定了 ...

最新文章

  1. 全卷积目标检测:FCOS
  2. @autowired注解_品Spring:对@Autowired和@Value注解的处理方法(文末附spring系列资源合集)...
  3. solr查询工作原理深入内幕
  4. windows securecrt下文件复制到linux,SecureCRT在linux与windows本地互传文件
  5. c语言字符串67ASDSff,(指针编程题目.doc
  6. Win7系统网页视频无法播放怎么办
  7. HTML+CSS+JS实现 ❤️夜晚云层动画特效❤️
  8. 截屏状态监听 - iOS
  9. Could not link against boost_system 解决办法
  10. SAP自学指南:案例公司的SAP实现(一)
  11. eclipse中设置JVM内存
  12. 读入外挂:ios::sync_with_stdio(false)
  13. Win10下安装Ubuntu16.04-空间不可用-个人志
  14. 开源和免费的gis软件工程索引
  15. 图像的区域选取(matlib)
  16. python-谷歌小恐龙游戏
  17. 农历虎年快到了,我用 Python 写副春联恭祝大家幸福平安
  18. 【万字干货】美团旅游推荐系统的演进
  19. 全网最新最全的 HDFS 文件纠删码技术分析
  20. java2的7次方怎么表示_Java程序练习-计算2的N次方

热门文章

  1. m1芯片Mac安装Apple版TensorFlow(conda-forge)+编译安装sklearn
  2. lan交换和无线教师手册_无线AP组网方式有多种,办公楼的无线覆盖系统的组网方式有哪些?...
  3. vue3 编译很慢_Vue 项目编译时间过长问题
  4. 控制台输出HelloWorld案例
  5. python中画圆的代码_Python使用matplotlib绘制圆形代码实例
  6. 一棵二叉树的中根线索二叉树_二叉树面试题刷题模板(终极版)
  7. Postman中对报文进行AES+Base64加密请求
  8. myeclipse每次保存编译全部_Fuchsia编译运行指南
  9. c语言实现图片卷积_卷积神经网络(CNN)Python的底层实现——以LeNet为例
  10. linux在cd后直接显示文件格式,Linux命令学习笔记之一目录与文件基本操作