- 浏览: 131395 次
文章分类
最新评论
本文介绍的浮点寄存器是基于 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 1493上一节介绍了浮点数与各种数值类型之间的相互转换 ... -
浮点数类型转换指令
2019-05-15 22:37 1571在浮点寄存 ... -
汇编指令之跳转指令
2019-04-15 00:21 4478正常执行的情况下,指令会按照顺序一条条地执行, ... -
汇编指令之条件码
2019-04-08 21:05 2239在系统底层,除了整数寄存器,CPU 还维护着一 ... -
汇编指令之算术和逻辑操作指令
2019-03-28 22:16 1158下表是 x86-64 ... -
汇编指令之数据传送指令
2019-03-25 21:28 1216在x86-64 中的 ... -
x86-64 中的寄存器与汇编操作数杂述
2019-03-20 21:45 918Intel 中常用 ... -
hello 程序执行背后的故事
2018-12-26 21:48 559源文件 hello. ... -
linux启动服务概述
2017-04-08 02:43 365传统的linux中定义了七个运行级,分别如下: ... -
unix限制
2017-04-04 16:08 529UNIX系统实现定义了很多幻数和常量,其中有很 ... -
linux引导加载程序--GRUB
2017-04-04 04:22 579linux世界里有两种 ... -
存储器映射
2016-06-13 00:12 509注:本文摘自《深入理解计算机操作系统》第九章--虚拟存 ... -
虚拟存储器对存储器管理的作用
2016-06-10 16:00 658注:本文中的大部分内容均是摘录自《深入理解计算机系统》一书,权 ... -
信号处理问题
2016-06-03 08:31 525注:本文摘自《深入理解计算机系统》第8章 --- 异常控制流。 ... -
僵尸进程
2016-05-23 23:57 325在解释僵尸进程的概念之前,我们得先了解这样的一个事实: 一个进 ... -
程序优化之存储器别名使用
2016-05-20 08:55 759说明:本文示例摘自《深入理解计算机系统》第五章----优化程序 ... -
条件变量基本概念与原理(转载)
2016-05-20 08:54 1516对于条件变量,我一直感到很困惑,搞不清其与互斥锁到底有啥区别, ... -
CPU与磁盘的交互过程
2016-05-19 09:05 1745对于计算机系统底层技术,想必很多人都和我一样不太了解,最近在学 ... -
存储器层次结构中基本的缓存原理
2016-05-19 09:00 622对于操作系统,我们知道,越靠近CPU的存储器,其存储速度就会越 ... -
异常处理
2016-05-19 00:29 385我知道很多人都知道异常处理,但可能对其底层并不太了解,现在我们 ...
相关推荐
1.5.2 标志寄存器操作指令 1.6 汇编源程序举例 第2章 寻址方式 2.1 寄存器寻址 2.2 寄存器间接寻址 2.3 变址寻址 2.4 基址加变址寻址 2.5 立即寻址 2.6 直接寻址 2.7 寻址方式的有关问题 2.8 寻址方式综合...
1.5.2 标志寄存器操作指令 1.6 汇编源程序举例 第2章 寻址方式 2.1 寄存器寻址 2.2 寄存器间接寻址 2.3 变址寻址 2.4 基址加变址寻址 2.5 立即寻址 2.6 直接寻址 2.7 寻址方式的有关问题 2.8 寻址方式综合...
3.8 寄存器类型强制转换 3.9 栈段与PUSH及POP指令 3.10 动态内存分配和堆段 3.11 INC和DEC指令 3.12 获取存储器对象的地址 3.13 更多信息 第4章 常量、变量与数据类型 4.1 本章概述 4.2 一些额外的指令:INTMUL、...
第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 ...
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 汇编器的实际考虑因素 ...
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 中断...
7.2 开发工具VisualDSP++概述 7.3 集成开发环境 7.3.1 创建一个新的工程文件 7.3.2 设置工程选项 7.3.3 添加或编辑工程源文件 7.3.4 生成一个调试版的工程 7.3.5 调试一个工程 7.3.6 一个正式版的...
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 ...
概述 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 操作数的类型、表示和大小 ...
前 言 、 PLC 的发展背景及其功能概述................................................. 1-1 1. 1 梯形图工作原理..................................................................... 1-1 1. 2 传统梯形图与...
第1章 计算机系统概述 §1.1 计算机系统的组成 一个完整的计算机系统由硬件系统和软件系统两部分组成,如图1.1所示。硬件系统 是构成计算机系统的各种物理设备的总称。硬件是机器的实体,软件是它的灵魂。计算 机的...
第1 章编译器概述 1.1 简介 .............................................................................................................. 13 1.2 编译器说明和文档 ..........................................
第 一 章 概述 1-1 简述计算机程序设计语言的发展历程。 解: 迄今为止计算机程序设计语言的发展经历了机器语言、汇编语言、高级语言等阶段,C++语言是一种面向对象的编程语言,也属于高级语言。 1-2 面向对象的...