- 浏览: 141050 次
文章分类
最新评论
本文介绍的浮点寄存器是基于 AVX2(Advanced Vector Extension,高级向量扩展,2 表示第二个版本)的,这是目前最新的,旧一点的还有如 SSE(Streaming SIMD Extension,流式 SIMD 扩展,SIMD 即单指令多数据)、MMX 等,这些浮点指令体系因为历史原因也被称为媒体指令,因为早期主要是用于支持图形和图像处理。每个扩展都是管理寄存器组中的数据,这些寄存器组在 MMX 中称为“MM”寄存器(64 位),SSE 中称为“XMM”寄存器(128 位),AVX 中则称为“YMM”寄存器(256 位)。
要使 GCC 生成 AVX2 代码,可以使用命令行选项“-mavx2”。基于不同版本的 SSE 以及第一个版本的 AVX 的代码从概念上来说是类似的,不过指令名和格式有所不同。此外,同之前介绍的整数操作指令一样,这里也是使用 ATT 格式,它同 Intel 格式中列出的指令操作数的顺序是不同的。
如下图所示,AVX 浮点体系结构允许数据存储在 16 个 YMM 寄存器中,它们的名字为 %ymm0 ~ %ymm15。每个 YMM 寄存器都是 256 位(32 字节)。当对标量数据操作时,这些寄存器只保存浮点数,而且只使用低 32 位(对于 float)或 64 位(对于 double)。汇编代码用寄存器的 SSE XMM 寄存器名字 %xmm0 ~ %xmm15 来引用它们,每个 XMM 寄存器都是对应的 YMM 寄存器的低 128 位(16 字节)。
类似于整数操作指令,浮点指令也提供了一组在内存和 XMM 寄存器之间以及从一个 XMM 寄存器到另一个不做任何转换的传送浮点数的指令,如下图所示。
这里,引用内存的指令是标量指令,意味着它们只对单个而不是一组封装好的数据值进行操作。数据要么保存在内存中(由图中的 M32 和 M64 指明,分别表示 32 位和 64 位内存范围),要么保存在 XMM 寄存器中(在图中用 X 表示)。无论数据对齐与否,这些指令都能正确执行,不过代码优化规则建议 32 位内存数据满足 4 字节对齐,64 位数据满足 8 字节对齐。内存引用的指定方式与整数 MOV 指令的一样,包括偏移量、基址寄存器、变址寄存器和伸缩因子的所有可能的组合。
GCC 只用标量传送操作从内存传送数据到 XMM 寄存器或从 XMM 寄存器传送数据到内存。对于在两个 XMM 寄存器之间传送数据,GCC 会使用 vmovaps 传送单精度数,用 vmovapd 传送双精度数。对于这些情况,程序复制整个寄存器还是只复制低位值既不会影响程序功能,也不会影响执行速度,所以使用这些指令还是针对标量数据的指令没有实质上的差别。指令名字中的“a”表示“aligned(对齐的)”。当用于读写内存时,如果地址不满足 16 字节对齐,它们会导致异常。在两个寄存器之间传送数据,绝不会出现错误对齐的状况。
下面是一个浮点传送操作的 C 例子。
与它相关联的 x86-64 汇编代码如下。
可以看到它使用了 vmovaps 指令把数据从一个寄存器复制到另一个,使用了 vmovss 指令把数据从内存复制到 XMM 寄存器以及从 XMM 寄存器复制到内存。
参考书籍:《深入理解计算机系统》第三章——程序的机器级表示。
要使 GCC 生成 AVX2 代码,可以使用命令行选项“-mavx2”。基于不同版本的 SSE 以及第一个版本的 AVX 的代码从概念上来说是类似的,不过指令名和格式有所不同。此外,同之前介绍的整数操作指令一样,这里也是使用 ATT 格式,它同 Intel 格式中列出的指令操作数的顺序是不同的。
如下图所示,AVX 浮点体系结构允许数据存储在 16 个 YMM 寄存器中,它们的名字为 %ymm0 ~ %ymm15。每个 YMM 寄存器都是 256 位(32 字节)。当对标量数据操作时,这些寄存器只保存浮点数,而且只使用低 32 位(对于 float)或 64 位(对于 double)。汇编代码用寄存器的 SSE XMM 寄存器名字 %xmm0 ~ %xmm15 来引用它们,每个 XMM 寄存器都是对应的 YMM 寄存器的低 128 位(16 字节)。
类似于整数操作指令,浮点指令也提供了一组在内存和 XMM 寄存器之间以及从一个 XMM 寄存器到另一个不做任何转换的传送浮点数的指令,如下图所示。
这里,引用内存的指令是标量指令,意味着它们只对单个而不是一组封装好的数据值进行操作。数据要么保存在内存中(由图中的 M32 和 M64 指明,分别表示 32 位和 64 位内存范围),要么保存在 XMM 寄存器中(在图中用 X 表示)。无论数据对齐与否,这些指令都能正确执行,不过代码优化规则建议 32 位内存数据满足 4 字节对齐,64 位数据满足 8 字节对齐。内存引用的指定方式与整数 MOV 指令的一样,包括偏移量、基址寄存器、变址寄存器和伸缩因子的所有可能的组合。
GCC 只用标量传送操作从内存传送数据到 XMM 寄存器或从 XMM 寄存器传送数据到内存。对于在两个 XMM 寄存器之间传送数据,GCC 会使用 vmovaps 传送单精度数,用 vmovapd 传送双精度数。对于这些情况,程序复制整个寄存器还是只复制低位值既不会影响程序功能,也不会影响执行速度,所以使用这些指令还是针对标量数据的指令没有实质上的差别。指令名字中的“a”表示“aligned(对齐的)”。当用于读写内存时,如果地址不满足 16 字节对齐,它们会导致异常。在两个寄存器之间传送数据,绝不会出现错误对齐的状况。
下面是一个浮点传送操作的 C 例子。
float float_mov(float v1, float *src, float *dst){ float v2 = *src; *dst = v1; return v2; }
与它相关联的 x86-64 汇编代码如下。
;float float_mov(float v1, float *src, float *dst) ;v1 in %xmm0, src in %rdi, dst in %rsi float_mov: vmovaps %xmm0, %xmm1 ; Copy v1 vmovss (%rdi), %xmm0 ; Read v2 from src vmovss %xmm1, (%rsi) ; Write v1 to dst ret ; Return v2 in %xmm0
可以看到它使用了 vmovaps 指令把数据从一个寄存器复制到另一个,使用了 vmovss 指令把数据从内存复制到 XMM 寄存器以及从 XMM 寄存器复制到内存。
参考书籍:《深入理解计算机系统》第三章——程序的机器级表示。
发表评论
-
浮点运算指令
2019-05-22 23:13 1567上一节介绍了浮点数与各种数值类型之间的相互转换 ... -
浮点数类型转换指令
2019-05-15 22:37 1689在浮点寄存 ... -
汇编指令之跳转指令
2019-04-15 00:21 4767正常执行的情况下,指令会按照顺序一条条地执行, ... -
汇编指令之条件码
2019-04-08 21:05 2336在系统底层,除了整数寄存器,CPU 还维护着一 ... -
汇编指令之算术和逻辑操作指令
2019-03-28 22:16 1347下表是 x86-64 ... -
汇编指令之数据传送指令
2019-03-25 21:28 1274在x86-64 中的 ... -
x86-64 中的寄存器与汇编操作数杂述
2019-03-20 21:45 981Intel 中常用 ... -
hello 程序执行背后的故事
2018-12-26 21:48 606源文件 hello. ... -
linux启动服务概述
2017-04-08 02:43 396传统的linux中定义了七个运行级,分别如下: ... -
unix限制
2017-04-04 16:08 572UNIX系统实现定义了很多幻数和常量,其中有很 ... -
linux引导加载程序--GRUB
2017-04-04 04:22 622linux世界里有两种 ... -
存储器映射
2016-06-13 00:12 550注:本文摘自《深入理解计算机操作系统》第九章--虚拟存 ... -
虚拟存储器对存储器管理的作用
2016-06-10 16:00 692注:本文中的大部分内容均是摘录自《深入理解计算机系统》一书,权 ... -
信号处理问题
2016-06-03 08:31 560注:本文摘自《深入理解计算机系统》第8章 --- 异常控制流。 ... -
僵尸进程
2016-05-23 23:57 358在解释僵尸进程的概念之前,我们得先了解这样的一个事实: 一个进 ... -
程序优化之存储器别名使用
2016-05-20 08:55 793说明:本文示例摘自《深入理解计算机系统》第五章----优化程序 ... -
条件变量基本概念与原理(转载)
2016-05-20 08:54 1567对于条件变量,我一直感到很困惑,搞不清其与互斥锁到底有啥区别, ... -
CPU与磁盘的交互过程
2016-05-19 09:05 1829对于计算机系统底层技术,想必很多人都和我一样不太了解,最近在学 ... -
存储器层次结构中基本的缓存原理
2016-05-19 09:00 663对于操作系统,我们知道,越靠近CPU的存储器,其存储速度就会越 ... -
异常处理
2016-05-19 00:29 422我知道很多人都知道异常处理,但可能对其底层并不太了解,现在我们 ...
相关推荐
- **浮点寄存器**:`st(i)`表示第i个浮点寄存器,通常浮点寄存器堆栈共有8个位置,每个位置可以存储一个浮点数。 - **出栈、入栈操作**:指的是对浮点寄存器堆栈中的元素进行的添加或移除操作。 - **操作数**:指令...
- **双精度寄存器**:双精度寄存器[x]是一个64位的数据量,它代表与浮点寄存器[x]和浮点寄存器[x+1]相同的存储空间。只允许使用偶数值的x(双精度寄存器地址对齐)。 - **浮点格式**:单精度浮点数为32位,双精度...
DSP2812和DSP28335概述** - **DSP2812**:这是一款16位浮点处理器,拥有高性能的CPU内核,支持多种通信接口,如SPI、I²C、CAN等,适用于电机控制、电源管理等应用。其丰富的片上资源包括多个A/D转换器、PWM发生器...
4. **向量寄存器**:在某些特定的处理器配置中,如用于浮点运算或向量运算的版本,会有专门的浮点寄存器或者向量处理单元寄存器。 5. **特殊功能寄存器**(SFRs):这些寄存器用于控制和状态,例如中断控制器、MMU...
* 浮点寄存器(Floating Point Registers):用于存储浮点数数据。 * 指令寄存器(Instruction Registers):用于存储指令。 * 状态寄存器(Status Registers):用于存储处理器状态信息。 非核心寄存器 非核心...
在RISC-V架构中,浮点寄存器的数量通常比整型寄存器多,这是因为浮点运算相对复杂且频繁。 - **传递参数**: - `fa0`至`fa7`: 用于传递前8个浮点参数。 - **返回值**: - `fv0`和`fv1`: 用于保存函数的浮点返回值。 ...
1. **STM32F1系列概述**:STM32F1系列是意法半导体(STMicroelectronics)推出的一系列高性能、低成本、低功耗的32位微控制器,适用于各种嵌入式应用,如工业控制、消费电子、医疗设备等。 2. **Cortex-M3内核**:...
1. **体系结构概述**:介绍STM32F767的处理器架构,包括Cortex-M7内核的特点,如NEON浮点单元、DSP指令集以及硬件乘法器等。 2. **内存组织**:讲解芯片的存储空间布局,包括Flash、SRAM、系统存储区以及各种外设的...
在ARMv8-AArch64 ISA中,寄存器可以分为三个部分:通用寄存器、浮点寄存器和矢量寄存器。通用寄存器用于存储整数值和地址,浮点寄存器用于存储浮点数值,而矢量寄存器用于存储矢量值。 加载和存储 ARMv8-AArch64 ...
#### 数据类型概述 罗克韦尔Micro系列PLC支持多种数据类型,包括但不限于: - **布尔(BOOL)**: 用于表示真或假的状态。 - **短整型**: 从-128到+127的8位有符号整数。 - **无符号短整型(BYTE)**: 从0到255的无符号...
2. **浮点和向量寄存器(Floating-point and vector registers)**: 在ARMv8.5中,SVE扩展了这些寄存器,提供了一组可扩展的向量寄存器Z0到Z799,它们可以处理从128位到2048位的宽泛的数据类型。这些寄存器支持单...
运算顺序是:首先由FPU解码指令,然后从通用寄存器(GPR)或浮点寄存器(FPR)中读取数据,接着在operation模块进行运算,最后将结果存储回GPR/FPR并输出。operation模块又分为不同的子模块,每个子模块对应一种特定...
MMX设计了8个64位的MMX寄存器(MM0~MM7),这些寄存器能够利用原有的80位浮点寄存器ST(0)~ST(7)的低64位,以处理8个字节、4个字、2个双字或者1个64位的数据。通过这种单指令多数据(SIMD)的方式,MMX能够同时处理多...
1. **STM32F4架构概述**:STM32F4基于32位ARM Cortex-M4处理器核心,具备浮点运算单元(FPU),可以高效执行浮点运算,支持单指令周期的乘法和除法。其工作频率最高可达180MHz,提供多种存储器配置选项,包括闪存、...
- ****:向量浮点寄存器列表,由一系列连续的VFP寄存器组成。 - ****:向量浮点系统寄存器,主要包括`FPSCR`和`FPSID`。 - ****:固定点数中的小数位数,范围通常为`0-16`或`1-32`。 - **§2**:表示支持VFPv2及以上...
9. ARM 体系结构寄存器:ARM 体系结构寄存器是 ARM 处理器的核心组成部分,包括通用寄存器、浮点寄存器和协处理器寄存器等。 10. RealView 编译工具汇编程序指南:RealView 编译工具是 ARM 公司提供的一款集成开发...
浮点运算在许多计算任务中至关重要,因此 RISC-V 也定义了一套浮点寄存器约定。这包括: - **f0-f31** 共计 32 个浮点寄存器。 - **f0** 同样被视为零寄存器,其值恒为 0.0。 - **f1-f7** 和 **f26-f31** 作为临时...