浮点数寄存器与指令

寄存器

AVX浮点体系结构允许数据存储在16个YMM寄存器中

255 127 0
%ymm0 %xmm0 1st FP arg.返回值
%ymm1 %xmm1 2nd FP参数
%ymm2 %xmm2 3rd FP参数
%ymm3 %xmm3 4th FP参数
%ymm4 %xmm4 5th FP参数
%ymm5 %xmm5 6th FP参数
%ymm6 %xmm6 7th FP参数
%ymm7 %xmm7 8th FP参数
%ymm8 %xmm8 调用者保存
%ymm9 %xmm9 调用者保存
%ymm10 %xmm10 调用者保存
%ymm11 %xmm11 调用者保存
%ymm12 %xmm12 调用者保存
%ymm13 %xmm13 调用者保存
%ymm14 %xmm14 调用者保存
%ymm15 %xmm15 调用者保存

媒体寄存器。这些寄存器用于存放浮点数据。每个YMM寄存器保存32个字节。低16字节可以作为XMM寄存器来访问

浮点传送和转换操作

指令 目的 描述
vmovss M32 X 传送单精度数
vmovss X M32 传送单精度数
vmovsd M64 X 传送双精度数
vmovsd X M64 传送双精度数
vmovaps X X 传送对齐的封装好的单精度数
vmovapd X X 传送对齐的封装好的双精度数

浮点传送指令。这些操作在内存和寄存器之间以及一对寄存器之间传送值(X:XMM寄存器(例如%xmm3);M32:32位内存范围;M64:64位内存范围)

指令 目的 描述
vcvttss2si X/M32 R32 用截断的方法把单精度数转换成整数
vcvttsd2si X/M64 R32 用截断的方法把双精度数转换成整数
vcvttss2siq X/M32 R64 用截断的方法把单精度数转换成四字整数
vcvttsd2siq X/M64 R64 用截断的方法把双精度数转换成四字整数

双操作数浮点转换指令。这些操作将浮点数转换成整数(X:XMM寄存器(例如%xmm3); R32:32位通用寄存器(例如%eax);R64:64位通用寄存器(例如%rax);M32:32位内存范围;M64:64位内存范围)

指令 源1 源2 目的 描述
vcvtsi2ss M32/R32 X X 把整数转换成单精度数
vcvtsi2sd M32/R32 X X 把整数转换成双精度数
vcvtsi2ssq M64/R64 X X 把四字整数转换成单精度数
vcvtsi2sdq M64/R64 X X 把四字整数转换成双精度数

三操作数浮点转换指令。这些操作将第一个源的数据类型转换成目的数据类型。第二个源值对结果的低位字节没有影响(X:XMM寄存器(例如%xmm3);M32:32位内存范围;M64:64位内存范围)

gcc实现单精度与双精度的转换需要单独说明(就不具体解释了)

Conversion from single to double precision
vunpcklps %xmm0, %xmm0, %xmm0   Replicate first vector element
vcvtps2pd %xmm0, %xmm0          Convert two vector elements to double
Conversion from double to single precision
vmovddup %xmm0, %xmm0            Replicate first vector element
vcvtpd2psx %xmm0, %xmm0          Convert two vector elements to single

运算操作

标量avx2浮点指令。每条指令有一个(S1)或两个(S1,S2)源操作数,和一个目的操作数。第一个源操作数S1可以是一个XMM寄存器或一个内存位置。第二个源操作数和目的操作数都必须是XMM寄存器。每个操作都有一条针对单精度的指令和一条针对双精度的指令。结果存放在目的寄存器中。

单精度 双精度 效果 描述
vaddss vaddsd D<—S2+S1 浮点数加
vsubss vsubsd D<—S2-S1 浮点数减
vmulss vmulsd D<—S2xS1 浮点数乘
vdivss vdivsd D<—S2/S1 浮点数除
vmaxss vmaxsd D<—max(S2,S1) 浮点数最大值
vminss vminsd D<—min(S2,S1) 浮点数最小值
sqrtss sqrtsd D<— 2 2 浮点数平方根

位级操作

单精度 双精度 效果 描述
vxorps vorpd D<—S2^S1 位级异或(EXCLUSIVE–OR)
vandps andpd D<—S2&S1 位级与(AND)

对封装数据的位级操作(这些指令对一个XMM寄存器中的所有128位进行布尔操作)

比较操作

指令 基于 描述
ucomiss S1,S2 S2-S1 比较单精度值
ucomisd S1,S2 S2-S1 比较双精度值

参数S2必须在XMM寄存器中,而S1可以在XMM寄存器中,也可以在内存中

条件码的设置如下:

顺序S2:S1 CF ZF PF(奇偶标志位)
无序的(NaN) 1 1 1
S2 < S1 1 0 0
S2 = S1 0 1 0
S2 > S1 0 0 0

你可能感兴趣的:(汇编)