`

浮点寄存器概述

阅读更多
        本文介绍的浮点寄存器是基于 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 例子。
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 寄存器复制到内存。


参考书籍:《深入理解计算机系统》第三章——程序的机器级表示。
  • 大小: 727.5 KB
  • 大小: 132.1 KB
分享到:
评论

相关推荐

    浮点指令.doc

    - **浮点寄存器**:`st(i)`表示第i个浮点寄存器,通常浮点寄存器堆栈共有8个位置,每个位置可以存储一个浮点数。 - **出栈、入栈操作**:指的是对浮点寄存器堆栈中的元素进行的添加或移除操作。 - **操作数**:指令...

    计算机系统结构:DLX指令集.doc

    - **双精度寄存器**:双精度寄存器[x]是一个64位的数据量,它代表与浮点寄存器[x]和浮点寄存器[x+1]相同的存储空间。只允许使用偶数值的x(双精度寄存器地址对齐)。 - **浮点格式**:单精度浮点数为32位,双精度...

    Ti C2000系列 DSP C2000助手 寄存器查询

    DSP2812和DSP28335概述** - **DSP2812**:这是一款16位浮点处理器,拥有高性能的CPU内核,支持多种通信接口,如SPI、I²C、CAN等,适用于电机控制、电源管理等应用。其丰富的片上资源包括多个A/D转换器、PWM发生器...

    ARM-architecture.rar_arm linux 寄存器

    4. **向量寄存器**:在某些特定的处理器配置中,如用于浮点运算或向量运算的版本,会有专门的浮点寄存器或者向量处理单元寄存器。 5. **特殊功能寄存器**(SFRs):这些寄存器用于控制和状态,例如中断控制器、MMU...

    544041_Broadwell_DE_EDS_Registers_Vol2_544041_v1_0.pdf

    * 浮点寄存器(Floating Point Registers):用于存储浮点数数据。 * 指令寄存器(Instruction Registers):用于存储指令。 * 状态寄存器(Status Registers):用于存储处理器状态信息。 非核心寄存器 非核心...

    riscv-abi.pdf

    在RISC-V架构中,浮点寄存器的数量通常比整型寄存器多,这是因为浮点运算相对复杂且频繁。 - **传递参数**: - `fa0`至`fa7`: 用于传递前8个浮点参数。 - **返回值**: - `fv0`和`fv1`: 用于保存函数的浮点返回值。 ...

    STM32F1开发指南-寄存器版本_V3.2.zip

    1. **STM32F1系列概述**:STM32F1系列是意法半导体(STMicroelectronics)推出的一系列高性能、低成本、低功耗的32位微控制器,适用于各种嵌入式应用,如工业控制、消费电子、医疗设备等。 2. **Cortex-M3内核**:...

    STM32F767开发指南-寄存器版本_V1.1.zip

    1. **体系结构概述**:介绍STM32F767的处理器架构,包括Cortex-M7内核的特点,如NEON浮点单元、DSP指令集以及硬件乘法器等。 2. **内存组织**:讲解芯片的存储空间布局,包括Flash、SRAM、系统存储区以及各种外设的...

    ARMv8-AArch64 ISA Overview.pdf

    在ARMv8-AArch64 ISA中,寄存器可以分为三个部分:通用寄存器、浮点寄存器和矢量寄存器。通用寄存器用于存储整数值和地址,浮点寄存器用于存储浮点数值,而矢量寄存器用于存储矢量值。 加载和存储 ARMv8-AArch64 ...

    介绍西门子200及罗克韦尔Micro系列寄存器地址类型

    #### 数据类型概述 罗克韦尔Micro系列PLC支持多种数据类型,包括但不限于: - **布尔(BOOL)**: 用于表示真或假的状态。 - **短整型**: 从-128到+127的8位有符号整数。 - **无符号短整型(BYTE)**: 从0到255的无符号...

    ARMv8_5寄存器和指令_f_SVE.zip

    2. **浮点和向量寄存器(Floating-point and vector registers)**: 在ARMv8.5中,SVE扩展了这些寄存器,提供了一组可扩展的向量寄存器Z0到Z799,它们可以处理从128位到2048位的宽泛的数据类型。这些寄存器支持单...

    浮点运算单元设计文档1

    运算顺序是:首先由FPU解码指令,然后从通用寄存器(GPR)或浮点寄存器(FPR)中读取数据,接着在operation模块进行运算,最后将结果存储回GPR/FPR并输出。operation模块又分为不同的子模块,每个子模块对应一种特定...

    (6.6)--MMX及SSE指令集1

    MMX设计了8个64位的MMX寄存器(MM0~MM7),这些寄存器能够利用原有的80位浮点寄存器ST(0)~ST(7)的低64位,以处理8个字节、4个字、2个双字或者1个64位的数据。通过这种单指令多数据(SIMD)的方式,MMX能够同时处理多...

    STM32F4开发指南-寄存器版本_V1.1

    1. **STM32F4架构概述**:STM32F4基于32位ARM Cortex-M4处理器核心,具备浮点运算单元(FPU),可以高效执行浮点运算,支持单指令周期的乘法和除法。其工作频率最高可达180MHz,提供多种存储器配置选项,包括闪存、...

    ARM矢量浮点指令集参考手册

    - ****:向量浮点寄存器列表,由一系列连续的VFP寄存器组成。 - ****:向量浮点系统寄存器,主要包括`FPSCR`和`FPSID`。 - ****:固定点数中的小数位数,范围通常为`0-16`或`1-32`。 - **§2**:表示支持VFPv2及以上...

    【官方】ARM架构的汇编语言参考手册.pdf

    9. ARM 体系结构寄存器:ARM 体系结构寄存器是 ARM 处理器的核心组成部分,包括通用寄存器、浮点寄存器和协处理器寄存器等。 10. RealView 编译工具汇编程序指南:RealView 编译工具是 ARM 公司提供的一款集成开发...

    RISC-V Calling Conventions, Version 1.1

    浮点运算在许多计算任务中至关重要,因此 RISC-V 也定义了一套浮点寄存器约定。这包括: - **f0-f31** 共计 32 个浮点寄存器。 - **f0** 同样被视为零寄存器,其值恒为 0.0。 - **f1-f7** 和 **f26-f31** 作为临时...

Global site tag (gtag.js) - Google Analytics