寄存器
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<— | 浮点数平方根 |
位级操作
单精度 | 双精度 | 效果 | 描述 |
---|---|---|---|
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 |