我是靠谱客的博主 飘逸纸鹤,最近开发中收集的这篇文章主要介绍SSE指令 SSE(Streaming SIMD Extensions,单指令多数据流扩展)指令集是Intel在Pentium III处理器中率先推出的。其实,早在PIII正式推出之前,Intel公司就曾经通过各种渠道公布过所谓的KNI(Katmai New Instruction)指令集,这个指令集也就是SSE指令集的前身,并一度被很多传媒称之为MMX指令集的下一个版本,即MMX2指令集。究其背景,原来"KNI"指令集是Intel公司最早为其下一代芯片命名的指令集名称,而所谓的"MMX2"则完,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
SSE(Streaming SIMD Extensions,单指令多数据流扩展)指令集是Intel在Pentium III处理器中率先推出的。其实,早在PIII正式推出之前,Intel公司就曾经通过各种渠道公布过所谓的KNI(Katmai New Instruction)指令集,这个指令集也就是SSE指令集的前身,并一度被很多传媒称之为MMX指令集的下一个版本,即MMX2指令集。究其背景,原来"KNI"指令集是Intel公司最早为其下一代芯片命名的指令集名称,而所谓的"MMX2"则完全是硬件评论家们和媒体凭感觉和印象对"KNI"的 评价,Intel公司从未正式发布过关于MMX2的消息。
作者:HAM(参考资料:Intel 开发文档)
大部分涉及到128位
内存变量
操作的,
内存变量
首地址必须要对齐16
字节
,也就是
内存地址
低4位为0,否则会引起CPU异常,导致指令执行失败,此错误
编译器
不检查.
SSE1:
主要是单精度浮点运算
SSE有8个128位独立
寄存器
(XMM0~XMM7).
MM指64位MMX
寄存器
XMM指XMM寄存器
m128指128位内存变量
movaps XMM,XMM/m128 movaps XMM/128,XMM
把源
存储器
内容值送入目的寄存器,当有m128时,必须对齐内存16字节,也就是内存地址低4位为0.
﹋﹋﹋﹋﹋﹋﹋﹋﹋﹋﹋
movups XMM,XMM/m128 movaps XMM/128,XMM
把源
存储器
内容值送入目的寄存器,但不必对齐内存16字节.
﹋﹋﹋﹋﹋﹋﹋﹋﹋﹋
movlps XMM,m64
把源
存储器
64位内容送入目的寄存器低64位,高64位不变,
内存变量
不必对齐内存16字节.
movhps XMM,m64
把源
存储器
64位内容送入目的寄存器高64位,低64位不变,
内存变量
不必对齐内存16字节.
movhlps XMM,XMM
把源寄存器高64位送入目的寄存器低64位,高64位不变.
movlhps XMM,XMM
把源寄存器低64位送入目的寄存器高64位,低64位不变.
movss XMM,m32/XMM
原
操作数
为m32时:
dest[31-00] <== m32
dest[127-32] <== 0
原
操作数
为XMM时:
dest[31-00] <== src[31-00]
dest[127-32]不变
movmskpd r32,XMM
r32[0] <== XMM[63]
r32[1] <== XMM[127]
r32[31-2] <== 0
movmskps r32,XMM
r32[0] <== XMM[31]
r32[1] <== XMM[63]
r32[2] <== XMM[95]
r32[3] <== XMM[127]
r32[31-4] <== 0
pmovmskb r32,XMM
r[0] <== XMM[7]
r[1] <== XMM[15]
r[2] <== XMM[23]
r[3] <== XMM[31]
r[4] <== XMM[39]
r[5] <== XMM[47]
r[6] <== XMM[55]
r[7] <== XMM[63]
r[8] <== XMM[71]
r[9] <== XMM[79]
r[10] <== XMM[87]
r[11] <== XMM[95]
r[12] <== XMM[103]
r[13] <== XMM[111]
r[14] <== XMM[119]
r[15] <== XMM[127]
r[31-16] <== 0
movntps m128,XMM
m128 <== XMM 直接把XMM中的值送入m128,不经过cache,必须对齐16字节.
movntpd m128,XMM
m128 <== XMM 直接把XMM中的值送入m128,不经过cache,必须对齐16字节.
movnti m32,r32
m32 <== r32 把32寄存器的值送入m32,不经过cache.
addps XMM,XMM/m128
源
存储器
内容按双字对齐,共4个单精度浮点数与目的
寄存器
相加,结果送入目的寄存器,
内存变量
必须对齐内存16字节.
例:
当XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,当执行addps XMM0,XMM1
则XMM0 = 045992000 44350ccd 4a5b52e0 3c59018e h
因为XMM0 = -2.43E3 6.76E2 2.34E4 1.23E-2 'xEy'指x * 10^y,如 1.0E2 = 100,1.0E-2 = 0.01,
XMM1 = 7.33E3 4.82E1 3.57E6 9.45E-4 当中'E'不是16进制中的'e',而是指数'EXP'
结果XMM0 = 4.9E3 7.242E2 3.5934E6 1.3245E-2
addss XMM,XMM/m32
源
存储器
的低32位1个单精度浮点数与目的
寄存器
的低32位1个单精度浮点数相加,结果送入目的
寄存器
的低32位
高96位不变,
内存变量
不必对齐内存16字节.
例:
当XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,当执行addss XMM0,XMM1
则XMM0 = 0c517e000 44290000 46b6d000 3c59018e h
subps XMM,XMM/m128
源
存储器
内容按双字对齐,共4个单精度浮点数与目的
寄存器
相减(目的减去源),结果送入目的寄存器,
内存变量
必须对齐内存16字节.
例:
当XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,当执行addss XMM0,XMM1
则XMM0 = 0c6188000 441cf333 ca5877a0 3c3a0a52 h
因为XMM0 = -2.43E3 6.76E2 2.34E4 1.23E-2
XMM1 = 7.33E3 4.82E1 3.57E6 9.45E-4
结果XMM0 = -9.76E3 6.278E2 -3.5466E6 1.1355E-2
subss XMM,XMM/m32
源
存储器
的低32位1个单精度浮点数与目的
寄存器
的低32位1个单精度浮点数相减(目的减去源),
结果送入目的
寄存器
的低32位,高96位不变,
内存变量
不必对齐内存16字节.
例:
当XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,当执行addss XMM0,XMM1
则XMM0 = 0c517e000 44290000 46b6d000 3c3a0a52 h
maxps XMM,XMM/m128
源
存储器
4个单精度浮点数与目的
寄存器
4个单精度浮点数比较,较大数放入对应目的寄存器,
内存变量
必须对齐内存16字节.
例:
当XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,当执行maxps XMM0,XMM1
则XMM0 = 045e51000 44290000 4a59e540 3c4985f0 h
因为XMM0 = -2.43E3 6.76E2 2.34E4 1.23E-2
XMM1 = 7.33E3 4.82E1 3.57E6 9.45E-4
结果XMM0 = 7.33E3 6.76E2 3.57E6 1.23E-2
maxss XMM,XMM/m32
源
存储器
低32位1个单精度浮点数与目的
寄存器
低32位1个单精度浮点数比较,较大数放入目的
寄存器
低32位,高96位不变
内存变量
不必对齐内存16字节.
例:
当XMM0 = 045e51000 4240cccd 4a59e540 3a77b9e0 h
XMM1 = 0c517e000 44290000 46b6d000 3c4985f0 h,当执行maxss XMM0,XMM1
则XMM0 = 045e51000 4240cccd 4a59e540 3c4985f0 h
minps XMM,XMM/m128
源
存储器
4个单精度浮点数与目的
寄存器
4个单精度浮点数比较,较小数放入对应目的寄存器,
内存变量
必须对齐内存16字节.
minss XMM,XMM/m32
源
存储器
低32位1个单精度浮点数与目的
寄存器
低32位1个单精度浮点数比较,较小数放入目的
寄存器
低32位,高96位不变
内存变量不必对齐内存16字节.
cmpps XMM0,XMM1,imm8 imm8是
立即数
范围是0~7
根据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
rcpps XMM,XMM/m128
源存储器4个单精度浮点数的倒数放入对应目的寄存器,
内存变量
必须对齐内存16字节.
注:比如2.0E0的倒数为1÷2.0E0 = 5.0E-1
例:
当XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,执行rcpps XMM0,XMM1
则XMM0 = 0390f0800 3ca9f800 34966000 44844800 h
因为XMM1 = 7.33E3 4.82E1 3.57E6 9.45E-4
结果XMM0 = 1.36E-4 2.075E-2 2.8E-7 1.06E3
这操作只有12bit的精度.
用这种方法可以提高精度到23bit(牛顿-拉弗森方法):
x0 = RCPSS(d)
x1 = x0 * (2 - d * x0) = 2*x0 - d * x0 * x0
x0是直接用倒数指令得到的除数d的倒数的逼近;x1则是更精确的逼近。
以下操作:XMM0=DIVIDENDS / DIVISORS(这种方法比直接用divps更快速)
MOVAPS XMM1,[DIVISORS];载入除数
RCPPS XMM0,XMM1;求得倒数的逼近
MULPS XMM1,XMM0;牛顿-Raphson公式
MULPS XMM1,XMM0
ADDPS XMM0,XMM0
SUBPS XMM0,XMM1
MULPS XMM0,[DIVIDENDS];结果在XMM0中
rcpss XMM,XMM/32
源
存储器
低32位1个单精度浮点数的倒数放入目的寄存器低32位,高96位不变
例:
当XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,执行rcpss XMM0,XMM1
则XMM0 = 045e51000 4240cccd 4a59e540 44844800 h
精度同rcpps
rsqrtps XMM,XMM/m128
源存储器4个单精度浮点数的开方的倒数放入对应目的寄存器,
内存变量
必须对齐内存16字节.
比如2.0E0的开方的倒数为1÷√2.0E0 ≈ 7.0711E-1
例:
当XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,执行rsqrtps XMM0,XMM1
则XMM0 = 03c3f6000 3e138000 3a0ab800 42022000 h
因为XMM1 = 7.33E3 4.82E1 3.57E6 9.45E-4
结果XMM0 = 1.17E-2 1.44E-1 5.29E-4 3.25E1
这操作只有12bit的精度.
用这种方法可以提高精度到23bit(牛顿-拉弗森方法).
x0 = RSQRTSS(a)
x1 = 0.5 * x0 * (3 - (a * x0)) * x0)
rsqrtss XMM,XMM/32
源存储器低32位1个单精度浮点数的开方的倒数放入目的寄存器低32位,高96位不变,
内存变量
不必对齐内存16字节.
mulps XMM,XMM/m128
源
存储器
内容按双字对齐,共4个单精度浮点数与目的
寄存器
相乘,结果送入目的
寄存器
,内存变量必须对齐内存16字节.
mulss XMM,XMM/32
源
存储器
的低32位1个单精度浮点数与目的
寄存器
的低32位1个单精度浮点数相乘,结果送入目的寄存器的低32位,
高96位不变,内存变量不必对齐内存16字节.
divps XMM,XMM/m128
目的
寄存器
共4个单精度浮点数除以源
存储器
4个单精度浮点数,结果送入目的寄存器,
内存变量
必须对齐内存16字节.
divss XMM,XMM/32
目的
寄存器
低32位1个单精度浮点数除以源
存储器
低32位1个单精度浮点数,结果送入目的寄存器的低32位,
高96位不变,内存变量不必对齐内存16字节.
andps XMM,XMM/m128
源
存储器
128个二进制位'与'目的寄存器128个二进制位,结果送入目的寄存器,
内存变量
必须对齐内存16字节.
orps XMM,XMM/m128
源
存储器
128个二进制位'或'目的寄存器128个二进制位,结果送入目的寄存器,
内存变量
必须对齐内存16字节.
xorps XMM,XMM/m128
源
存储器
128个二进制位'异或'目的寄存器128个二进制位,结果送入目的寄存器,
内存变量
必须对齐内存16字节.
unpckhps XMM,XMM/m128
源
存储器
与目的寄存器高64位按双字交错排列,结果送入目的
寄存器
,内存变量必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0 | a1 | a2 | a3
源存储器: b0 | b1 | b2 | b3
目的
寄存器
结果: b0 | a0 | b1 | a1
例:
当XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,当执行unpckhps XMM0,XMM1
则XMM0 = 045e51000 c517e000 4240cccd 44290000 h
unpcklps XMM,XMM/m128
源
存储器
与目的寄存器低64位按双字交错排列,结果送入目的寄存器,
内存变量
必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0 | a1 | a2 | a3
源存储器: b0 | b1 | b2 | b3
目的寄存器结果: b2 | a2 | b3 | a3
例:
当XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,执行unpcklps XMM0,XMM1
则XMM0 = 04a59e540 46b6d000 3a77b9e0 3c4985f0 h
cvtpi2ps XMM,MM/m64
源
存储器
64位两个32位有符号(补码)整数转为两个单精度浮点数,放入目的
寄存器
低64中,高64位不变.
例:
当XMM0 = 2315d4d7 930d9761 82748383 ed2782cb h
MM0 = 0001e240 fffe1dc0 h,执行cvtpi2ps XMM0,MM0
则XMM0 = 2315d4d7 930d9761 c7f12000 47f12000 h
因为0001e240h(有符号整数) = 123456 = 1.23456E5 = 47f12000h(单精浮点)
fffe1dc0h(有符号整数) = -123456 = -1.23456E5 = 0c7f12000h(单精浮点)
cvtsi2ss XMM,r32/m32
源
存储器
1个32位有符号(补码)整数转为1个单精度浮点数,放入目的
寄存器
低32中,高96位不变.
cvtps2pi MM,XMM/m64
把源
存储器
低64位两个32位单精度浮点数转为两个32位有符号(补码)整数,放入目的
寄存器
.
cvttps2pi MM,XMM/m64
类似于cvtps2pi,截断取整.
cvtss2si r32,XMM/m32
把源
存储器
低32位1个单精度浮点数转为1个32位有符号(补码)整数,放入目的
寄存器
.
cvttss2si r32,XMM/m32
类似cvtss2si,截断取整.
pavgb MM,MM/m64 pavgb XMM,XMM/m128
把源
存储器
与目的寄存器按
字节
无符号整数
相加,再除以2,结果四舍五入为整数放入目的寄存器,
源存储器为m128时,
内存变量
必须对齐内存16字节.
注:此运算不会产生溢出.
例:
当MM0 = 9a bc de f0 12 34 56 78 h
MM1 = 8d ec 5b f8 98 25 71 47 h,执行pavgb MM0,MM1
则MM0 = 94 d4 9d f4 55 2d 64 60 h
9ah = 154,8dh = 141,154+141 = 295,295÷2 = 147.5 ≈ 148(四舍五入) = 94h
pavgw MM,MM/m64 pavgw XMM,XMM/m128
把源
存储器
与目的寄存器按字
无符号整数
相加,再除以2,结果四舍五入为整数放入目的寄存器,
源存储器为m128时,内存变量必须对齐内存16字节.
pextrw r32,MM,imm8 pextrw r32,XMM,imm8 imm8为8位
立即数
(无符号)
从源寄存器中选第imm8(0~3 或 0~7)个字送入目的寄存器的低16位,高16位清零.
★注:imm8范围为 0~255,当源寄存器为'MM'时,有效值= imm8 mod 4,当目的寄存器为'XMM'时,有效值= imm8 mod 8
pinsrw MM,r32/m32,imm8 pinsrw XMM,r32/m32,imm8
把源
存储器
的低16位内容送入目的寄存器第imm8(0~3 或 0~7)个字,其余字不变.
注:imm8范围为 0~255,当目的寄存器为'MM'时,有效值= imm8 mod 4,当目的寄存器为'XMM'时,有效值= imm8 mod 8
例:
7 6 5 4 3 2 1 0
当XMM0 = 0ffff ffff ffff ffff ffff ffff ffff ffff h
eax = 01234 5678 h,执行pinsrw XMM0,eax,3
﹌﹌
则XMM0 = 0ffff ffff ffff ffff 5678 ffff ffff ffff h
﹌﹌
执行pinsrw XMM0,eax,9
则XMM0 = 0ffff ffff ffff ffff ffff ffff 5678 ffff h
﹌﹌
pmaxsw MM,MM/m64 pmaxsw XMM,XMM/m128
把源
存储器
与目的寄存器按字有符号(补码)整数比较,大数放入目的寄存器对应字,
源存储器为m128时,内存变量必须对齐内存16字节.
pmaxub MM,MM/m64 pmaxsw XMM,XMM/m128
把源
存储器
与目的寄存器按
字节
无符号整数
比较,大数放入目的寄存器对应字节,
源存储器为m128时,内存变量必须对齐内存16字节.
pminsw MM,MM/m64 pmaxsw XMM,XMM/m128
把源
存储器
与目的寄存器按字有符号(补码)整数比较,较小数放入目的寄存器对应字,
源存储器为m128时,内存变量必须对齐内存16字节.
pminub MM,MM/m64 pmaxsw XMM,XMM/m128
把源
存储器
与目的寄存器按字节
无符号整数
比较,较小数放入目的寄存器对应字节,
源存储器为m128时,内存变量必须对齐内存16字节.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SSE2:
主要是双精度浮点运算
SSE2与SSE1使用相同寄存器
movapd XMM,XMM/m128 movapd XMM/m128,XMM
把源存储器内容值送入目的寄存器,当有m128时,必须对齐内存16字节.
movupd XMM,XMM/m128 movapd XMM/m128,XMM
把源存储器内容值送入目的寄存器,但不必对齐内存16字节.
我感觉这两条指令同movaps 和 movups 指令一样,不过又不确定.
movlpd XMM,m64 movlpd m64,XMM
把源存储器64位内容送入目的寄存器低64位,高64位不变,内存变量不必对齐内存16字节.
movhpd XMM,m64 movhpd m64,XMM
把源存储器64位内容送入目的寄存器高64位,低64位不变,内存变量不必对齐内存16字节.
addpd XMM,XMM/m128
源
存储器
内容按四字对齐,共两个双精度浮点数与目的
寄存器
相加,结果送入目的
寄存器
,内存变量必须对齐内存16字节.
addsd XMM,XMM/m64
源
存储器
的低64位1个双精度浮点数与目的
寄存器
的低64位1个双精度浮点数相加,结果送入目的
寄存器
的低64位
高64位不变,内存变量不必对齐内存16字节.
subpd XMM,XMM/m128
把目的
寄存器
内容按四字对齐,两个双精度浮点数,减去源存储器两个双精度浮点数,
结果送入目的寄存器,
内存变量
必须对齐内存16字节.
subsd XMM,XMM/m128
把目的
寄存器
的低64位1个双精度浮点数,减去源
存储器
低64位1个双精度浮点数,结果送入目的
寄存器
的低64位
高64位不变,内存变量不必对齐内存16字节.
mulpd XMM,XMM/m128
源
存储器
内容按四字对齐,共两个双精度浮点数与目的
寄存器
相乘,结果送入目的寄存器,
内存变量
必须对齐内存16字节.
mulsd XMM,XMM/m128
源
存储器
的低64位1个双精度浮点数与目的
寄存器
的低64位1个双精度浮点数相乘,结果送入目的
寄存器
的低64位,
高64位不变,内存变量不必对齐内存16字节.
divpd XMM,XMM/m128
目的
寄存器
共两个双精度浮点数除以源
存储器
两个双精度浮点数,结果送入目的寄存器,
内存变量
必须对齐内存16字节.
divsd XMM,XMM/m128
目的
寄存器
低64位1个双精度浮点数除以源
存储器
低64位1个双精度浮点数,结果送入目的寄存器的低64位,
高64位不变,内存变量不必对齐内存16字节.
sqrtpd XMM,XMM/m128
源
存储器
两个双精度浮点数的开方放入对应目的
寄存器
,内存变量必须对齐内存16字节.
sqrtsd XMM,XMM/m128
源存储器低64位1个双精度浮点数的开方放入目的
寄存器
低64位,高64位不变,内存变量不必对齐内存16字节.
maxpd XMM,XMM/m128
源
存储器
两个双精度浮点数与目的
寄存器
两个双精度浮点数比较,较大数放入对应目的寄存器,
内存变量
必须对齐内存16字节.
maxsd XMM,XMM/m128
源存储器低64位1个双精度浮点数与目的
寄存器
低64位1个双精度浮点数比较,较大数放入目的寄存器低64位,高64位不变
内存变量不必对齐内存16字节.
minpd XMM,XMM/m128
源
存储器
两个双精度浮点数与目的
寄存器
两个双精度浮点数比较,较小数放入对应目的寄存器,
内存变量
必须对齐内存16字节.
minsd XMM,XMM/m128
源存储器低64位1个双精度浮点数与目的
寄存器
低64位1个双精度浮点数比较,较小数放入目的寄存器低64位,高64位不变
内存变量不必对齐内存16字节.
andpd XMM,XMM/m128
源存储器128个二进制位'与'目的寄存器128个二进制位,结果送入目的
寄存器
,内存变量必须对齐内存16字节.
andnpd XMM,XMM/m128
目的寄存器128个二进制位先取'非',再'与'源
存储器
128个二进制位,结果送入目的寄存器,
内存变量
必须对齐内存16字节.
orpd XMM,XMM/m128
源存储器128个二进制位'或'目的寄存器128个二进制位,结果送入目的寄存器,
内存变量
必须对齐内存16字节.
xorpd XMM,XMM/m128
源存储器128个二进制位'异或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.
───────────────────────────
cvtps2pd XMM,XMM/m64
把源
存储器
低64位两个单精度浮点数变成两个双精度浮点数,结果送入目的
寄存器
.
cvtss2sd XMM,XMM/m32
把源
存储器
低32位1个单精度浮点数变成1个双精度浮点数,结果送入目的寄存器的低64位,高64位不变.
cvtpd2ps XMM,XMM/m128
把源存储器两个双精度浮点数变成两个单精度浮点数,结果送入目的寄存器的低64位,高64位清零,
内存变量
必须对齐内存16字节.
例:
当XMM0 = 011112222 33334444 55556666 77778888 h,
XMM1 = 0dd1a5e1f35aec736 41132a4000000000 h,执行cvtpd2ps XMM0,XMM1
则XMM0 = 000000000 00000000 ff800000 48995200 h
^特殊状态 ^3.14E5
(表示负无穷大)
因为XMM1 = -3.14E140 3.14E5
而单精浮点最小可表示1.18E-38(规格化),-3.14E140已远超过,所以变成一种特殊状态,
指数位全为1,尾数全为0,符号位不变,3.14E5则变为正常的单精度3.14E5
cvtsd2ss XMM,XMM/m64
把源
存储器
低64位1个双精度浮点数变成1个单精度浮点数,结果送入目的寄存器的低32位,高96位不变.
cvtpd2pi MM,XMM/m128
把源存储器两个双精度浮点数变成两个双字有符号整数,结果送入目的寄存器,内存变量必须对齐内存16字节.
如果结果大于所能表示的范围,那么转化为80000000h(正数也转为此值).
当XMM1 = 0dd1a5e1f35aec736 41132a4000000000 h,执行cvtpd2pi MM0,XMM1
则 MM0 = 80000000 0004ca90 h
因为0dd1a5e1f35aec736h(双精度浮点数) = -3.14E140 超过 80000000h所以变为80000000h
而41132a4000000000h(双精度浮点数) = 3.14E5,所以转为314000 = 0004ca90h(有符号整数)
cvttpd2pi MM,XMM/m128
类似于cvtpd2pi,截断取整.
cvtpi2pd XMM,MM/m64
把源
存储器
两个双字有符号整数变成两个双精度浮点数,结果送入目的
寄存器
.
cvtpd2dq XMM,XMM/m128
把源存储器两个双精度浮点数变成两个双字有符号整数(此运算与cvtpd2pi类似但目的寄存器变为XMM),
结果送入目的寄存器的低64位,高64位清零,
内存变量
必须对齐内存16字节.
cvttpd2dq XMM,XMM/m128
类似于cvtpd2dq,为截断取整.
cvtdq2pd XMM,XMM/m128
把源
存储器
低64位两个双字有符号整数变成两个双精度浮点数,结果送入目的寄存器,内存变量必须对齐内存16字节.
cvtsd2si r32,XMM/m64
把源
存储器
低64位1个双精度浮点数变成1个双字有符号整数,结果送入目的
寄存器
.
cvttsd2si r32,XMM/m64
类似于cvtsd2si,截断取整.
cvtsi2sd XMM,r32/m32
把源存储器1个双字有符号整数变成1个双精度浮点数,结果送入目的寄存器的低64位,高64位不变.
cvtps2dq XMM,XMM/m128
把源
存储器
4个单精度浮点数变成4个双字有符号整数,结果送入目的寄存器,内存变量必须对齐内存16字节.
cvttps2dq XMM,XMM/m128
类似于cvtps2dq,截断取整.
cvtdq2ps XMM,XMM/m128
把源存储器4个双字有符号整数变成4个单精度浮点数,结果送入目的寄存器,内存变量必须对齐内存16字节.
───────────────────────────
movdqa XMM,XMM/m128 movdqa XMM/m128,XMM
把源存储器内容值送入目的寄存器,当有m128时,必须对齐内存16字节.
movdqu XMM,XMM/m128 movdqu XMM/m128,XMM
把源存储器内容值送入目的寄存器,但不必对齐内存16字节.
paddd XMM,XMM/m128
把源
存储器
与目的寄存器按双字对齐无符号整数普通相加,结果送入目的寄存器,内存变量必须对齐内存16字节.
paddq XMM,XMM/m128
把源
存储器
与目的寄存器按四字对齐
无符号整数
普通相加,结果送入目的寄存器,内存变量必须对齐内存16字节.
paddq MM,MM/m64
把源
存储器
与目的寄存器四字
无符号整数
普通相加,结果送入目的寄存器.
psubd XMM,XMM/m128
把目的
寄存器
与源存储器按双字对齐
无符号整数
普通相减,结果送入目的寄存器,
内存变量
必须对齐内存16字节.(目的减去源)
psubq XMM,XMM/m128
把目的寄存器与源存储器按四字对齐
无符号整数
普通相减,结果送入目的寄存器,
内存变量必须对齐内存16字节.(目的减去源)
psubq MM,MM/m64
把目的寄存器与源存储器四字
无符号整数
普通相减,结果送入目的寄存器.(目的减去源)
pmuludq XMM,XMM/m128
把源
存储器
与目的寄存器的低32位
无符号整数
相乘,结果变为64位,送入目的寄存器低64位,
把源
存储器
与目的寄存器的高64位的低32位无符号整数相乘,结果变为64位,送入目的寄存器高64位.
内存变量必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0 | a1 | a2 | a3
源存储器: b0 | b1 | b2 | b3
目的寄存器结果: b1*a1 | b3*a3
pmuludq MM,MM/m64
把源
存储器
与目的寄存器的低32位无符号整数相乘,结果变为64位,送入目的寄存器.
高32位 | 低32位
目的寄存器: a0 | a1
源存储器: b0 | b1
目的寄存器结果: b1*a1
pslldq XMM,imm8
把目的寄存器128位按imm8(
立即数
)指定字节数逻辑左移,移出的字节丢失.
imm8 == 1时,代表左移8位,imm8 == 2时,代表左移16位.
psrldq XMM,imm8
把目的寄存器128位按imm8(
立即数
)指定字节数逻辑右移,移出的字节丢失.
imm8 == 1时,代表右移8位,imm8 == 2时,代表右移16位.
psllw XMM,XMM/m128 psllw XMM,imm8
把目的寄存器按字由源存储器(或imm8
立即数
)指定位数逻辑左移,移出的位丢失.
低字移出的位不会移入高字,
内存变量
必须对齐内存16字节.
psrlw XMM,XMM/m128 psrlw XMM,imm8
把目的寄存器按字由源存储器(或imm8
立即数
)指定位数逻辑右移,移出的位丢失.
高字移出的位不会移入低字,
内存变量
必须对齐内存16字节.
pslld XMM,XMM/m128 pslld XMM,XMM imm8
把目的寄存器按双字由源
存储器
(或imm8
立即数
)指定位数逻辑左移,移出的位丢失.
低双字移出的位不会移入高双字,
内存变量
必须对齐内存16字节.
psrld XMM,XMM/m128 psrld XMM,imm8
把目的寄存器按双字由源
存储器
(或imm8
立即数
)指定位数逻辑右移,移出的位丢失.
高双字移出的位不会移入低双字,
内存变量
必须对齐内存16字节.
movq2dq XMM,MM
把源寄存器内容送入目的寄存器的低64位,高64位清零.
movdq2q MM,XMM
把源寄存器低64位内容送入目的寄存器.
pmaddwd XMM,XMM/m128
把源
存储器
与目的寄存器分4组进行向量点乘(有符号补码操作),
内存变量
必须对齐内存16字节..
高64位 | 低64位
目的寄存器: a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7
源存储器: b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7
目的寄存器结果: a0*b0+a1*b1 | a2*b2+a3*b3 | a4*b4+a5*b5 | a6*b6+a7*b7
paddsb XMM,XMM/m128
源
存储器
与目的寄存器按
字节对齐
有符号补码饱和相加,
内存变量
必须对齐内存16字节.
paddsw XMM,XMM/m128
源
存储器
与目的寄存器按字对齐有符号补码饱和相加,
内存变量
必须对齐内存16字节.
psubsb XMM,XMM/m128
源
存储器
与目的寄存器按
字节对齐
有符号补码饱和相减(目的减去源),
内存变量
必须对齐内存16字节.
psubsw XMM,XMM/m128
源
存储器
与目的寄存器按字对齐有符号补码饱和相减(目的减去源),
内存变量
必须对齐内存16字节.
paddusb XMM,XMM/m128
源
存储器
与目的寄存器按
字节对齐
无符号饱和相加,
内存变量
必须对齐内存16字节.
paddusw XMM,XMM/m128
源
存储器
与目的寄存器按字对齐无符号饱和相加,内存变量必须对齐内存16字节.
psubusb XMM,XMM/m128
源存储器与目的寄存器按
字节对齐
无符号饱和相减(目的减去源),
内存变量
必须对齐内存16字节.
psubusw XMM,XMM/m128
源存储器与目的寄存器按字对齐无符号饱和相减(目的减去源),
内存变量
必须对齐内存16字节.
paddb XMM,XMM/m128
源存储器与目的寄存器按
字节对齐
无符号普通相加,
内存变量
必须对齐内存16字节.
paddw XMM,XMM/m128
源存储器与目的寄存器按字对齐无符号普通相加,
内存变量
必须对齐内存16字节.
paddd XMM,XMM/m128
源存储器与目的寄存器按双字对齐无符号普通相加,
内存变量
必须对齐内存16字节.
paddq XMM,XMM/m128
源存储器与目的寄存器按四字对齐无符号普通相加,
内存变量
必须对齐内存16字节.
psubb XMM,XMM/m128
源存储器与目的寄存器按
字节对齐
无符号普通相减(目的减去源),内存变量必须对齐内存16字节.
psubw XMM,XMM/m128
源存储器与目的寄存器按字对齐无符号普通相减(目的减去源),内存变量必须对齐内存16字节.
psubd XMM,XMM/m128
源存储器与目的寄存器按双字对齐无符号普通相减(目的减去源),内存变量必须对齐内存16字节.
psubq XMM,XMM/m128
源存储器与目的寄存器按四字对齐无符号普通相减(目的减去源),内存变量必须对齐内存16字节.
pmulhw XMM,XMM/m128
源存储器与目的寄存器按字对齐有符号补码饱和相乘,取结果的高16位放入目的寄存器对应字中.
内存变量必须对齐内存16字节.
pmullw XMM,XMM/m128
源存储器与目的寄存器按字对齐有符号补码饱和相乘,取结果的低16位放入目的寄存器对应字中.
内存变量必须对齐内存16字节.
pcmpeqb XMM,XMM/m128
目的
寄存器
与源存储器按
字节
比较,如果对应字节相等,就置目的寄存器对应字节为0ffh,否则为00h,
内存变量必须对齐内存16字节.
pcmpeqw XMM,XMM/m128
目的
寄存器
与源存储器按字比较,如果对应字相等,就置目的寄存器对应字为0ffffh,否则为0000h,
内存变量必须对齐内存16字节.
pcmpeqd XMM,XMM/m128
目的
寄存器
与源存储器按双字比较,如果对应双字相等,就置目的寄存器对应双字为0ffffffffh,否则为00000000h,
内存变量必须对齐内存16字节.
pcmpgtb XMM,XMM/m128
目的寄存器与源存储器按
字节
(有符号补码)比较,如果目的寄存器对应字节大于源存储器,就置目的寄存器对应字节为0ffh,
否则为00h,
内存变量
必须对齐内存16字节.
pcmpgtw XMM,XMM/m128
目的寄存器与源
存储器
按字(有符号补码)比较,如果目的寄存器对应字大于源存储器,就置目的寄存器对应字为0ffffh,
否则为0000h,
内存变量
必须对齐内存16字节.
pcmpgtd XMM,XMM/m128
目的寄存器与源
存储器
按双字(有符号补码)比较,如果目的寄存器对应双字大于源存储器,
就置目的寄存器对应双字为0ffffffffh,否则为00000000h,
内存变量
必须对齐内存16字节.
movd XMM,r32/m32
把源
存储器
32位内容送入目的寄存器的低32位,高96位清零.
movd r32/m32,XMM
把源
寄存器
的低32位内容送入目的
存储器
32位.
movq XMM,XMM/m64
把源存储器低64位内容送入目的寄存器的低64位,高64位清零.
movq m64,XMM
把源寄存器的低64位内容送入目的
存储器
.
pand XMM,XMM/m128
源存储器128个二进制位'与'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.
◎我发现与andpd功能差不多,就不知其它特性是否一样.
pandn XMM,XMM/m128
目的寄存器128个二进制位先取'非',再'与'源存储器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.
por XMM,XMM/m128
源存储器128个二进制位'或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.
pxor XMM,XMM/m128
源存储器128个二进制位'异或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.
packuswb XMM,XMM/m128 (此指令与前面的MMX指令packuswb MM,MM/m64操作相同,只是变成了128位)
把目的寄存器按字有符号数压缩为字节无符号数放入目的寄存器低64位
把源寄存器按字有符号数压缩为字节无符号数放入目的寄存器高64位
压缩时负数变为00h,大于255的正数变为0ffh,
内存变量
必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7
源
寄存器
: b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7
目的寄存器压缩结果: b0|b1| b2| b3| b4|b5| b6|b7| a0|a1| a2|a3| a4|a5| a6| a7
packsswb XMM,XMM/m128 (此指令与前面的MMX指令packsswb MM,MM/m64操作相同,只是变成了128位)
把目的寄存器按字有符号数压缩为字节有符号数放入目的寄存器低64位
把源寄存器按字有符号数压缩为字节有符号数放入目的寄存器高64位
压缩时小于-128负数变为80h,大于127的正数变为7fh,
内存变量
必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7
源寄存器: b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7
目的寄存器压缩结果: b0|b1| b2| b3| b4|b5| b6|b7| a0|a1| a2|a3| a4|a5| a6| a7
packssdw XMM,XMM/m128
把目的寄存器按双字有符号数压缩为字有符号数放入目的寄存器低64位
把源寄存器按双字有符号数压缩为字有符号数放入目的寄存器高64位
压缩时小于-32768负数变为8000h,大于32767的正数变为7fffh,
内存变量
必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0 | a1 | a2 | a3
源寄存器: b0 | b1 | b2 | b3
目的寄存器压缩结果: b0 | b1 | b2 | b3 | a0 | a1 | a2 | a3
punpckldq XMM,XMM/m128
把源
存储器
与目的寄存器低64位按双字交错排列,
内存变量
必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0 | a1 | a2 | a3
源寄存器: b0 | b1 | b2 | b3
目的
寄存器
排列结果: b2 | a2 | b3 | a3
punpckhdq XMM,XMM/m128
把源存储器与目的
寄存器
高64位按双字交错排列,
内存变量
必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0 | a1 | a2 | a3
源寄存器: b0 | b1 | b2 | b3
目的寄存器排列结果: b0 | a0 | b1 | a1
punpcklwd XMM,XMM/m128
把源
存储器
与目的寄存器低64位按字交错排列,
内存变量
必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7
源寄存器: b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7
目的寄存器排列结果: b4 | a4 | b5 | a5 | b6 | a6 | b7 | a7
punpckhwd XMM,XMM/m128
把源存储器与目的
寄存器
高64位按字交错排列,
内存变量
必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7
源寄存器: b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7
目的寄存器排列结果: b0 | a0 | b1 | a1 | b2 | a2 | b3 | a3
punpcklbw XMM,XMM/m128
把源
存储器
与目的寄存器低64位按
字节
交错排列,
内存变量
必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0|a1| a2| a3| a4|a5| a6|a7| a8|a9| aA|aB| aC|aD| aE| aF
源寄存器: b0|b1| b2| b3| b4|b5| b6|b7| b8|b9| bA|bB| bC|bD| bE| bF
目的寄存器排列结果: b8|a8| b9| a9| bA|aA| bB|aB| bC|aC| bD|aD| bE|aE| bF| aF
punpckhbw XMM,XMM/m128
把源存储器与目的寄存器高64位按
字节
交错排列,
内存变量
必须对齐内存16字节.
高64位 | 低64位
目的寄存器: a0|a1| a2| a3| a4|a5| a6|a7| a8|a9| aA|aB| aC|aD| aE| aF
源寄存器: b0|b1| b2| b3| b4|b5| b6|b7| b8|b9| bA|bB| bC|bD| bE| bF
目的寄存器排列结果: b0|a0| b1| a1| b2|a2| b3|a3| b4|a4| b5|a5| b6|a6| b7| a7
───────────────────────────
shufps XMM,XMM/m128,imm8(0~255) SSE1指令
把源存储器与目的寄存器按双字划分,由imm8(
立即数
)八个二进制位(00~11,00^11,00~11,00~11)指定排列,
内存变量必须对齐内存16字节.目的
寄存器
高64位放源
存储器
被指定数,目的寄存器低64位放目的寄存器被指定数.
'( )'中的都是二进制数.
高64位 | 低64位
目的寄存器: a(11) | a(10) | a(01) | a(00)
源寄存器: b(11) | b(10) | b(01) | b(00)
目的寄存器排列结果: b(00~11) | b(00~11) | a(00~11) | a(00~11)
目的寄存器压缩结果'( )'中的值由imm8对应的两位二进制位指定.
例:
( 11 ) ( 10 ) ( 01 ) ( 00 ) ( 11 ) ( 10 ) ( 01 ) ( 00 )
当XMM0 = 090a0b0c 0d0e0f11 01020304 05060708 h,XMM1 = 0aabbccdd eeff1234 22334455 66778899 h,
imm8 ══> (XMM1 10) (XMM1 01) (XMM0 11) (XMM0 00)
执行shufps XMM0,XMM1,10 01 11 00 b(二进制),则XMM0 = 0eeff1234 22334455 090a0b0c 05060708 h
由例子中我们发现imm8=10011100b,imm8的高4位选的是源
存储器
,低4位选的是目的寄存器,imm8的最高两位
为 10b 那么就选则XMM1中的第 2(从0开始选择) 个双字,发现为0eeff1234h,就放入XMM0的高32位(原来的
值已经自动保护起来了),01b就选择XMM1中的第2个,11选择XMM0中的第3个,00选择XMM0中的第0个.
当然imm8中4个选则也可以相同,比如shufps XMM0,XMM1,10 10 10 10 b,那么结果为:
XMM0 = 0eeff1234 eeff1234 0d0e0f11 0d0e0f11 h.
shufpd XMM,XMM/m128,imm8(0~255) imm8(操作值) = imm8(输入值) mod 4
把源存储器与目的寄存器按四字划分,由imm8(
立即数
)4个二进制位(0~1,0^1,0~1,0~1)指定排列,
内存变量必须对齐内存16字节.目的寄存器高64位放源存储器被指定数,目的寄存器低64位放目的寄存器被指定数.
高64位 | 低64位
目的寄存器: a(1) | a(0)
源寄存器: b(1) | b(0)
目的寄存器排列结果: b(0~1) | a(0~1)
例:
当XMM0 = 1111111122222222 3333333344444444 h
XMM1 = 5555555566666666 aaaaaaaacccccccc h,执行shufpd XMM0,XMM1,101001 1 0 b
则XMM0 = 5555555566666666 3333333344444444 h
因为101001 1 0 b mod 4(101001 1 0 b & 11b),得到操作值为1 0b,
1选择XMM1的第1位5555555566666666h,0选择XMM0的第0位3333333344444444.
pshuflw XMM,XMM/m128,imm8(0~255)
先把源存储器的高64位内容送入目的寄存器的高64位,然后用imm8将源存储器的低64位4个字选入
目的寄存器的低64位,
内存变量
必须对齐内存16字节.
低64位
源寄存器低64位: b(11) | b(10) | b(01) | b(00)
目的寄存器低64位排列结果: b(00~11) | b(00~11) | b(00~11) | b(00~11)
例:
当XMM0 = 1111111122222222 3333 4444 5555 6666 h
XMM1 = 5555555566666666 7777 8888 9999 cccc h,执行pshuflw XMM0,XMM1,10 10 01 10 b
则XMM0 = 5555555566666666 8888 8888 9999 8888 h
pshufhw XMM,XMM/m128,imm8(0~255)
先把源
存储器
的低64位内容送入目的寄存器的低64位,然后用imm8将源存储器的高64位4个字选入
目的寄存器的高64位,
内存变量
必须对齐内存16字节.
高64位
源寄存器高64位: b(11) | b(10) | b(01) | b(00)
目的寄存器高64位排列结果: b(00~11) | b(00~11) | b(00~11) | b(00~11)
例:
当XMM0 = 3333 4444 5555 6666 1111111122222222 h
XMM1 = 7777 8888 9999 cccc 5555555566666666 h,执行pshufhw XMM0,XMM1,10 10 01 10 b
则XMM0 = 8888 8888 9999 8888 5555555566666666 h
pshufd XMM,XMM/m128,imm8(0~255)
将源存储器的4个双字由imm8指定选入目的寄存器,内存变量必须对齐内存16字节.
高64位 | 低64位
源寄存器: b(11) | b(10) | b(01) | b(00)
目的寄存器排列结果: b(00~11) | b(00~11) | b(00~11) | b(00~11)
例:
当XMM1 = 11111111 22222222 33333333 44444444 h,执行pshufd XMM0,XMM1,11 01 01 10b
则XMM0 = 11111111 33333333 33333333 22222222 h
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SSE3:
fisttp m16,m32,m64
将浮点堆栈st(0)的内容截断小数格式化为有符号整数送入目的内存.
可以不必设置
控制寄存器
RC位.
addsubps dest,src
128bit XMM寄存器操作,与内存操作时要对齐地址16Byte.
单精度浮点操作.
dest[31-00] <== dest[31-00] - src[31-00]
dest[63-32] <== dest[63-32] + src[63-32]
dest[95-64] <== dest[95-64] - src[95-64]
dest[127-96] <== dest[127-96] + src[127-96]
addsubpd dest,src
128bit XMM寄存器操作,与内存操作时要对齐地址16Byte.
双精度浮点操作.
dest[63-00] <== dest[63-00] - src[63-00]
dest[127-64] <== dest[127-64] + src[127-64]
movsldup dest,src
128bit XMM寄存器操作,与内存操作时要对齐地址16Byte.
dest[31-00] <== src[31-00]
dest[63-32] <== src[31-00]
dest[95-64] <== src[95-64]
dest[127-96] <== src[95-64]
movshdup dest,src
128bit XMM寄存器操作,与内存操作时要对齐地址16Byte.
dest[31-00] <== src[63-32]
dest[63-32] <== src[63-32]
dest[95-64] <== src[127-96]
dest[127-96] <== src[127-96]
movddup dest,src
当src为m64内存时:
dest[63-00] <== m64
dest[127-64] <== m64
当src为XMM寄存器时:
dest[63-00] <== src[63-00]
dest[127-64] <== src[63-00]
lddqu dest,src
对SSE2指令movdqu的改进,使与内存操作时不必对齐16Byte.
dest[127-00] <== src[127-00]
haddps dest,src
128bit XMM寄存器操作,与内存操作时要对齐地址16Byte.
单精度浮点操作.
dest[31-00] <== dest[31-00] + dest[63-32]
dest[63-32] <== dest[95-64] + dest[127-96]
dest[95-64] <== src[31-00] + src[63-32]
dest[127-96] <== src[95-64] + src[127-96]
hsubps dest,src
128bit XMM寄存器操作,与内存操作时要对齐地址16Byte.
单精度浮点操作.
dest[31-00] <== dest[31-00] - dest[63-32]
dest[63-32] <== dest[95-64] - dest[127-96]
dest[95-64] <== src[31-00] - src[63-32]
dest[127-96] <== src[95-64] - src[127-96]
haddpd dest,src
128bit XMM寄存器操作,与内存操作时要对齐地址16Byte.
双精度浮点操作.
dest[63-00] <== dest[63-00] + dest[127-64]
dest[127-64] <== src[63-00] + src[127-64]
hsubpd dest,src
128bit XMM寄存器操作,与内存操作时要对齐地址16Byte.
双精度浮点操作.
dest[63-00] <== dest[63-00] - dest[127-64]
dest[127-64] <== src[63-00] - src[127-64]
monitor
线程同步
指令,r0下使用.
mwait
线程同步指令,r0下使用.
转至百度百科
最后
以上就是飘逸纸鹤为你收集整理的SSE指令 SSE(Streaming SIMD Extensions,单指令多数据流扩展)指令集是Intel在Pentium III处理器中率先推出的。其实,早在PIII正式推出之前,Intel公司就曾经通过各种渠道公布过所谓的KNI(Katmai New Instruction)指令集,这个指令集也就是SSE指令集的前身,并一度被很多传媒称之为MMX指令集的下一个版本,即MMX2指令集。究其背景,原来"KNI"指令集是Intel公司最早为其下一代芯片命名的指令集名称,而所谓的"MMX2"则完的全部内容,希望文章能够帮你解决SSE指令 SSE(Streaming SIMD Extensions,单指令多数据流扩展)指令集是Intel在Pentium III处理器中率先推出的。其实,早在PIII正式推出之前,Intel公司就曾经通过各种渠道公布过所谓的KNI(Katmai New Instruction)指令集,这个指令集也就是SSE指令集的前身,并一度被很多传媒称之为MMX指令集的下一个版本,即MMX2指令集。究其背景,原来"KNI"指令集是Intel公司最早为其下一代芯片命名的指令集名称,而所谓的"MMX2"则完所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复