📄 simd.txt
字号:
则XMM0 = 045e51000 4240cccd 4a59e540 44844800 h
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
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位不变.
★注:源寄存器是'MM',不是'XMM',但编译时写成'XMM'不会报错,反汇编后发现实际为'MM',所以务必小心!
﹌ ﹌
例:
当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位有符号(补码)整数,放入目的寄存器.
当XMM0 = 2315d4d7 930d9761 c7f12000 47f12000 h,执行cvtps2pi XMM0,MM0
MM0 = 0001e240 fffe1dc0 h
★注:目的寄存器是'MM',不是'XMM',但编译时写成'XMM'不会报错,反汇编后发现实际为'MM',所以务必小心!
cvtss2si r32,XMM/m32
把源存储器低32位1个单精度浮点数转为1个32位有符号(补码)整数,放入目的寄存器.
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字节.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -