`

浮点寄存器概述

阅读更多
        本文介绍的浮点寄存器是基于 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
分享到:
评论

相关推荐

    80X86汇编语言程序设计

    1.5.2 标志寄存器操作指令 1.6 汇编源程序举例 第2章 寻址方式 2.1 寄存器寻址 2.2 寄存器间接寻址 2.3 变址寻址 2.4 基址加变址寻址 2.5 立即寻址 2.6 直接寻址 2.7 寻址方式的有关问题 2.8 寻址方式综合...

    [80X86汇编语言程序设计].王元珍.文字版

    1.5.2 标志寄存器操作指令 1.6 汇编源程序举例 第2章 寻址方式 2.1 寄存器寻址 2.2 寄存器间接寻址 2.3 变址寻址 2.4 基址加变址寻址 2.5 立即寻址 2.6 直接寻址 2.7 寻址方式的有关问题 2.8 寻址方式综合...

    The Art of Assembly Language

    3.8 寄存器类型强制转换 3.9 栈段与PUSH及POP指令 3.10 动态内存分配和堆段 3.11 INC和DEC指令 3.12 获取存储器对象的地址 3.13 更多信息 第4章 常量、变量与数据类型 4.1 本章概述 4.2 一些额外的指令:INTMUL、...

    计算机组织与体系结构性能设计(第6版)

    第13章 精简指令集计算机 13.1 指令执行特征 13.2 大寄存器文件的使用 13.3 基于编译器的寄存器优化 13.4 精简指令集结构 13.5 RISC流水线技术 13.5 MIPS4000 13.6 SPARC 13.7 RISe与CISC的争论 13.8 参考文献 13.9 ...

    计算机科学丛书:计算机组成原理 [英] 艾伦·克莱门茨(Alan Clements)(2017.3出版)

    3.2.2 寻址方式概述 96 3.2.3 指令格式 98 3.2.4 操作码与指令 99 3.3 ARM指令集体系结构 101 3.3.1 ARM寄存器集 103 3.3.2 ARM指令集 103 3.4 ARM汇编语言 104 3.4.1 ARM程序结构 105 3.4.2 汇编器的实际考虑因素 ...

    Keil C51语言使用技巧及实战, (带书签pdf, 阅读起来就是爽,不是精品我不发)

    1 概述 2存储区结构 2.1 CODE 区 2.2 DATA 区 2.3 特殊功能寄存器 2.4 IDATA区 2.5 XDATA区 3 位操作和布尔逻辑 4 寻址方式 5 处理器状态 6 电源控制 6 中断系统 6.1 中断优先级寄存器 6.2 中断使能寄存器 6.3 中断...

    DSP接口电路设计与编程

     7.2 开发工具VisualDSP++概述  7.3 集成开发环境  7.3.1 创建一个新的工程文件  7.3.2 设置工程选项  7.3.3 添加或编辑工程源文件  7.3.4 生成一个调试版的工程  7.3.5 调试一个工程  7.3.6 一个正式版的...

    Vivado HLS 视频课程总结

    6.3 浮点数据类型的定义和初始化 19 6.4 隐式数据类型转换 19 6.5 显示数据类型转换 19 7 Vivado HLS中的复合数据类型 20 7.1 结构体 20 7.2 枚举类型 22 8 Vivado HLS中的C++基本运算 23 9 测试平台的基本架构 25 ...

    java8stream源码-emx370:S/370模拟器允许从1978年开始运行VM/370-R6的CMS操作系统

    概述 emx370 允许在模拟虚拟机内部视图的环境中运行 1978 年以来 VM/370-R6 的 CMS 操作系统,该环境由 VM/370 系统的 CP(控制程序)提供。 这种模拟是在Java 8 中实现的,并为老式操作系统提供了 IPL 和运行程序所...

    计算机体系结构试题及答案

    通用寄存器型指令集结构分类 2.2 寻址技术 2.3 指令集结构的功能设计 2.3.1 CISC计算机指令集结构的功能设计 2.3.2 RISC计算机指令集结构的功能设计 2.3.3 控制指令 2.4 操作数的类型、表示和大小 ...

    DVP-PLC应用技术手册(程序篇)

    前 言 、 PLC 的发展背景及其功能概述................................................. 1-1 1. 1 梯形图工作原理..................................................................... 1-1 1. 2 传统梯形图与...

    计算机软硬件基础知识.doc

    第1章 计算机系统概述 §1.1 计算机系统的组成 一个完整的计算机系统由硬件系统和软件系统两部分组成,如图1.1所示。硬件系统 是构成计算机系统的各种物理设备的总称。硬件是机器的实体,软件是它的灵魂。计算 机的...

    MPLABXC8C编驿器

    第1 章编译器概述 1.1 简介 .............................................................................................................. 13 1.2 编译器说明和文档 ..........................................

    语言程序设计课后习题答案

    第 一 章 概述 1-1 简述计算机程序设计语言的发展历程。 解: 迄今为止计算机程序设计语言的发展经历了机器语言、汇编语言、高级语言等阶段,C++语言是一种面向对象的编程语言,也属于高级语言。 1-2 面向对象的...

Global site tag (gtag.js) - Google Analytics