汇编 intel SSE指令简介

汇编 intel SSE指令简介

码农世界 2024-05-17 前端 60 次浏览 0个评论

简介:是一组指令集扩展,用于增强处理器的浮点运算和向量操作能力,可以同时对多个数据元素执行相同的操作,采用8个128位寄存器(XMM0~XMM7),适用于需要高性能并行计算的应用场景,能够通过同时处理多个数据元素来提高计算效率,从而加速各种计算密集型任务的执行

应用场景
图像和视频处理加速图像处理算法,如滤波、边缘检测、颜色转换等。在视频编解码中也能提高性能
数值计算对于科学计算、金融建模、工程仿真等需要大量浮点运算的任务,提升计算速度。
数据压缩在压缩算法中,如JPEG、MPEG等,SSE指令集可用于加速离散余弦变换(DCT)和其他复杂运算。
游戏开发游戏引擎和图形渲染中经常需要进行大量的向量运算,提高游戏性能和图形质量。
信号处理在音频处理、语音识别等领域,SSE指令集可用于加速数字信号处理算法

     

数据传输
MOVAPS

MOVAPS xmm(n), xmm2/m128

MOVAPS xmm2/m128, xmm(n)

移动对齐打包单精度,32位; 4个32位数值打包复制到目标地址之中参与运算

MOVUPS

MOVUPS xmm(n), xmm2/m128

MOVUPS xmm2/m128, xmm(n)

移动未对齐的打包单精度,当无法保证打包数据位于16字节的地址边界时

16字节的地址边界:数据将从地址为16的倍数开始存储,而不是任意地址,对齐方式有助于提高内存访问效率和系统性能。

MOVHPS

MOVHPS xmm(n), m64

将m64 数据复制到一个XMM寄存器(xmm1)的高64位中。

MOVLPS

MOVLPS xmm(dest), mem64/xmm(src)

将mem64/xmm(src) 中 两个单精度的低字节数据从源操作数复制到xmm(dest)的低64位

MOVHLPS

MOVHLPS xmm(n), xmm2/mem64

将xmm2/mem64 的低64位(2个32位单精度浮点数)移动到XMM 寄存器的低64位中,高64位不变,

MOVLHPS

MOVLHPS xmm1, xmm2

将xmm2/mem64 的低64位(2个32位单精度浮点数)移动到XMM 寄存器的高64位中,低64位不变,

MOVMSKPS

MOVMSKPS reg, xmm

源操作数中的四个单精度浮点值的最高位(即符号位)移动到目标操作数的四个最低有效位中

MOVSS

MOVSS xmm1, xmm2/m32: xmm2/m32 数据复制到xmm1中

MOVSS xmm2/m32, xmm1

算术
ADDPS

ADDPS xmm1, xmm2/m128

将源操作数中的四个单精度浮点值与目标操作数中的四个单精度浮点值逐元素相加

DEST[31:0] := SRC1[31:0] + SRC2[31:0] DEST[63:32] := SRC1[63:32] + SRC2[63:32] DEST[95:64] := SRC1[95:64] + SRC2[95:64] DEST[127:96] := SRC1[127:96] + SRC2[127:96]
ADDSS

ADDSS xmm1, xmm2/m32

将源操作数中的单精度浮点数与目标操作数中的单精度浮点数相加,并将结果存储在目标操作数中

DEST[31:0] := DEST[31:0] + SRC[31:0]

SUBPS

SUBPS xmm1, xmm2/m128

将源操作数中的四个单精度浮点值与目标操作数中的四个单精度浮点值逐元素相减的操作

指令通常用于在SIMD(单指令,多数据)操作中对打包的单精度浮点数据执行并行减法

SUBSS

SUBSS xmm1, xmm2/m32

将源操作数中的单精度浮点数值从目标操作数中的单精度浮点数值逐元素相减的操作。这个指令通常用于处理单个浮点数值的减法运算。

MULPS

MULPS xmm1, xmm2/m128

将源操作数中的四个单精度浮点值与目标操作数中的四个单精度浮点值逐元素相乘的操作。这个指令通常用于在SIMD(单指令,多数据)操作中对打包的单精度浮点数据执行并行乘法

MULSS

MULSS xmm1,xmm2/m32

将源操作数中的单精度浮点数值与目标操作数中的单精度浮点数值相乘的操作,并将结果存储在目标操作数中。这个指令通常用于处理单个浮点数值的乘法运算

DIVPS

DIVPS xmm1, xmm2/m128

将源操作数中的四个单精度浮点值除以目标操作数中的四个单精度浮点值,逐元素进行除法运算。这个指令通常用于在SIMD(单指令,多数据)操作中对打包的单精度浮点数据执行并行除法。

DIVSS

DIVSS xmm1,xmm2/m32

将目标操作数中的单精度浮点数值除以源操作数中的单精度浮点数值,并将结果存储在目标操作数中。这个指令执行单精度浮点数的除法运算,适用于处理单个浮点数值。

RCPPS

RCPPS xmm1, xmm2/m128

将目标操作数中的四个单精度浮点值分别取倒数,并将结果存储在目标操作数中。这个指令通常用于在SIMD(单指令,多数据)操作中对打包的单精度浮点数据执行逐元素的倒数运算

DEST[31:0] := APPROXIMATE(1/SRC[31:0])

DEST[63:32] := APPROXIMATE(1/SRC[63:32])

DEST[95:64] := APPROXIMATE(1/SRC[95:64])

DEST[127:96] := APPROXIMATE(1/SRC[127:96])

RCPSS

RCPSS xmm1,xmm2/m32

将源操作数中的单精度浮点数值取倒数,并将结果存储在目标操作数中。这个指令通常用于处理单个浮点数值的倒数运算。

SQRTPS

SQRTPS xmm1, xmm2/m128

将目标操作数中的四个单精度浮点值分别进行平方根运算,并将结果存储在目标操作数中。这个指令通常用于在SIMD(单指令,多数据)操作中对打包的单精度浮点数据执行逐元素的平方根运算

SQRTSS

SQRTSS xmm1,xmm2/m32

将源操作数中的单精度浮点数值进行平方根运算,并将结果存储在目标操作数中。这个指令通常用于处理单个浮点数值的平方根运算。

RSQRTPS

RSQRTPS xmm1, xmm2/m128

行将目标操作数中的四个单精度浮点值分别取倒数的平方根,并将结果存储在目标操作数中。这个指令通常用于在SIMD(单指令,多数据)操作中对打包的单精度浮点数据执行逐元素的倒数平方根运算

RSQRTSS

RSQRTSS xmm1, xmm2/m32

将源操作数中的单精度浮点数值取倒数的平方根,并将结果存储在目标操作数中。这个指令通常用于处理单个浮点数值的倒数平方根运算

MAXPS

MAXPS xmm1, xmm2/m128

将源操作数中的四个单精度浮点值与目标操作数中的四个单精度浮点值逐元素比较,然后将每个位置上的最大值存储在目标操作数中

MAXSS

MAXSS xmm1, xmm2/m32

行将源操作数中的单精度浮点数值与目标操作数中的单精度浮点数值进行比较,然后将较大的值存储在目标操作数中。这个指令通常用于处理单个浮点数值的最大值比较。

MINPS

MINPS xmm1, xmm2/m128

将源操作数中的四个单精度浮点值与目标操作数中的四个单精度浮点值逐元素比较,然后将每个位置上的最小值存储在目标操作数中。这个指令通常用于在SIMD(单指令,多数据)操作中对打包的单精度浮点数据执行最小值比较。

MINSS

MINSS xmm1, xmm2/m32

将源操作数中的单精度浮点数值与目标操作数中的单精度浮点数值进行比较,然后将较小的值存储在目标操作数中。这个指令通常用于处理单个浮点数值的最小值比较。

比较
CMPPS

CMPPS xmm1, xmm2/m128, imm8 ; imm8是立即数范围是0~7

它执行将源操作数中的四个单精度浮点值与目标操作数中的四个单精度浮点值逐元素进行比较,并根据条件码选择性地将结果存储在目标操作数中。这个指令通常用于在SIMD(单指令,多数据)操作中对打包的单精度浮点数据执行比较操作。

根据imm8的值进行4对单精度浮点数的比较,符合imm8的就置目的寄存器对应的32位全1,否则全0

当imm8 = 0时,目的寄存器等于原寄存器数时,置目的寄存器对应的32位全1,否则全0

imm8 = 1 时,目的寄存器小于原寄存器数时,置目的寄存器对应的32位全1,否则全0

imm8 = 2 时,目的寄存器小于等于原寄存器数时,置目的寄存器对应的32位全1,否则全0

imm8 = 4 时,目的寄存器不等于原寄存器数时,置目的寄存器对应的32位全1,否则全0

imm8 = 5 时,目的寄存器大于等于原寄存器数时,置目的寄存器对应的32位全1,否则全0

imm8 = 6 时,目的寄存器大于原寄存器数时,置目的寄存器对应的32位全1,否则全0

CMPSS

CMPSS xmm1, xmm2/m32, imm8

同上(CMPPS),单精度处理

COMISS

COMISS xmm1, xmm2/m32

执行比较两个单精度浮点数值,并根据比较结果设置处理器状态寄存器中的条件码

逻辑
ANDPS

ANDPS xmm1, xmm2/m128

将源操作数中的四个单精度浮点值与目标操作数中的四个单精度浮点值逐元素进行按位与运算,并将结果存储在目标操作数中。这个指令通常用于在SIMD(单指令,多数据)操作中对打包的单精度浮点数据执行按位与操作。

ANDNPS

ANDNPS  xmm1, xmm2/m128

执行将源操作数中的四个单精度浮点值与目标操作数中的四个单精度浮点值逐元素进行按位非与运算,并将结果存储在目标操作数中

ORPS

ORPS  xmm1, xmm2/m128

四个单精度 或操作

XORPS

XORPS  xmm1, xmm2/m128

四个单精度 异或操作

Shuffle(混排) and Unpack Instructions
SHUFPS

SHUFPS xmm1, xmm3/m128, imm8; imm8参数是一个立即数决定了如何对数据进行重新排列

用于对寄存器中的单精度浮点数进行重新排列。这个指令可以根据imm8参数指定的模式

xmm1[0:31] 的值从 xmm1 根据imm8 [0:1] 选择哪个单精度的值

mm1[32:63] 的值从 xmm1 根据imm8 [2:3] 选择哪个单精度的值

xmm1[64:95] 的值从 xmm3/m128 根据imm8 [4:5] 选择哪个单精度的值

mm1[96:127] 的值从  xmm3/m128 根据imm8 [6:7] 选择哪个单精度的值

UNPCKHPS

UNPCKHPS xmm1, xmm2/m128

源存储器与目的寄存器高64位按双字交错排列,结果送入目的寄存器

高64位 | 低64位 

目的寄存器: a0 | a1 | a2 | a3 

源存储器:  b0 | b1 | b2 | b3 

目的寄存器结果: b0 | a0 | b1 | a1

UNPCKLPS

UNPCKLPS xmm1, xmm2/m128

源存储器与目的寄存器低64位按双字交错排列,结果送入目的寄存器

高64位 | 低64位

目的寄存器: a0 | a1 | a2 | a3 

源存储器:  b0 | b1 | b2 | b3 

目的寄存器结果: b2 | a2 | b3 | a3

转换
CVTPI2PS

cvtpi2ps XMM,MM/m64

将MM/m64中2个有符号双字节整数转化为成2个单精度浮点数,存入XMM

CVTSI2SS

CVTSI2SS xmm1, r/m32

将 r/m32中1个双字节(32位)整数转化为成1个单精度浮点数; 一个字节16位

CVTPS2PI

CVTPS2PI mm, xmm/m64

将xmm/64中2个单精度浮点数打包转换为2个压缩的双精度整数存入mm中

CVTTPS2PI

CVTTPS2PI mm, xmm/m64

将 xmm/m64 中2个单精度浮点数转换为2个双字有符号整数存入mm中

Convert two single precision floating-point values from xmm/m64 to two signed doubleword signed integers in mm using truncation.

CVTSS2SI

CVTSS2SI r32, xmm1/m32

把xmm1/m32 单精度的浮点数转换为1个有符号双字整数存入r32中

Convert one single precision floating-point value from xmm1/m32 to one signed doubleword integer in r32.

CVTTSS2SI

CVTTSS2SI r32, xmm1/m32

Convert one single precision floating-point value from  xmm1/m32 to one signed doubleword integer in r32  using truncation.

把 xmm1/m32 一个 单精度浮点数转换为一个有符号双字整数到r32中,使用截断方式

MXCSR状态管理
LDMXCSR

LDMXCSR m32

 Load MXCSR register from m32.

从m32 中读取数值加载MXCSR 寄存器

STMXCSR

STMXCSR m32

store contents of MXCSR register to m32

将MXCSR  寄存器内容保存到m32中

64位SIMD整数指令
PAVGB

PAVGB mm1, mm2/m64

Average packed unsigned byte integers from mm2/m64 and mm1 with rounding.

把源存储器与目的寄存器按字节无符号整数相加,再除以2,结果四舍五入为整数放入目的寄存器,

PAVGW

PAVGW mm1, mm2/m64

 Average packed unsigned word integers from mm2/m64 and mm1 with rounding.

把源存储器与目的寄存器按字无符号整数相加,再除以2,结果四舍五入为整数放入目的寄存器,

PEXTRW

PEXTRW reg, mm, imm8

Extract the word specified by imm8 from mm and  move it to reg, bits 15-0. The upper bits of r32 or r64 is zeroed.

从mm 中提取指定 imm8个字数据存入reg 的15-0 位,高位清零.

PINSRW

PINSRW mm, r32/m16, imm8

 Insert the low word from r32 or from m16  into mm at the word position specified by imm8.

通过imm8 从r32 或 从m16 低字节存储到由指定字节位置,

PINSRW dest, src, imm8 (SSE)

SEL := imm8[2:0]

DEST.word[SEL] := src.word[0]

PMAXUB

PMAXUB mm1, mm2/m64

Compare unsigned byte integers in mm2/m64 and  mm1 and returns maximum values.

使用无符号字整数 对比 mm2/m64 和 mm1 的值,返回最大值(保存到mm1中)

PMAXSW

PMAXSW mm1, mm2/m64

Compare signed word integers in mm2/m64 and mm1 and return maximum values.

使用无符号字节整数 对比 mm2/m64 和 mm1 的值,返回最大值(保存到mm1中)

PMINUB
PMINSW
PMOVMSKB

PMOVMSKB reg, mm

 Move a byte mask of mm to reg. The upper bits of r32 or r64 are zeroed

将mm 的一个字节掩码移动到reg,高位设置0

PMULHUW

PMULHUW mm1, mm2/m64

Multiply the packed unsigned word integers in mm1 register and mm2/m64, and store the high 16 bits of the results in mm1.

源操作数mm2/m64和目标操作数mm1中对应元素进行乘法运算,并将结果的高16位存储在mm1中

PSADBW

PSADBW mm1, mm2/m64

Computes the absolute differences of the packed unsigned byte integers from mm2/m64 and mm1; differences are then summed to produce an unsigned word integer result.

计算源操作数mm2/m64和目标操作数mm1中对应字节的绝对差值之和,并将结果存储在mm1中

PSHUFW

PSHUFW mm1, mm2/m64, imm8

Shuffle the words in mm2/m64 based on the encoding in imm8 and store the result in mm1

根据洗牌控制立即数imm8,在源操作数mm2/m64内对字(16位值)进行洗牌,并将结果存储在目标操作数mm1中

SSE可缓存性控制、预取和指令排序指令
MASKMOVQ

MASKMOVQ mm1, mm2

 Selectively write bytes from mm1 to memory location using the byte mask in mm2. The default memory location is specified by DS:DI/EDI/RDI.

使用以mm2为单位的字节掩码,有选择地将mm1中的字节写入内存位置。默认内存位置由DS:DI/EDI/RDI指定。

MOVNTQ

MOVNTQ m64, mm 

Move quadword from mm to m64 using nontemporal hint.

将MMX寄存器mm的内容进行非临时写入,写入到由目标操作数m64指定的内存地址中

MOVNTPS

MOVNTPS m128, xmm1

Move packed single precision values xmm1 to mem using non-temporal hint.

XMM中四个压缩单精度浮点值的非临时存储注册到内存中。

PREFETCHh{0,1,2},

PREFETCHNTA

将32个或更多字节从内存加载到处理器缓存层次结构的选定级别SFENCE序列化存储操作

转载请注明来自码农世界,本文标题:《汇编 intel SSE指令简介》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,60人围观)参与讨论

还没有评论,来说两句吧...

Top