📄 simd.txt
字号:
pcmpgtb MM,MM/m64
源寄存器与目的寄存器按字节(有符号补码)比较,
当目的寄存器对应字节大于源寄存器就置目的寄存器对应字节为0ffh,否则为00h
例:
当MM0 == 80 12 11 h,MM1 == 7f 12 10h,执行pcmpgtb MM0,MM1,则MM0 = 00 00 ffh
因为80h = -128,7fh = 127,-128<127,所以结果为00h
pcmpgtw MM,MM/m64
源寄存器与目的寄存器按字(有符号补码)比较,
当目的寄存器对应字大于源寄存器就置目的寄存器对应字为0ffffh,否则为0000h
pcmpgtd MM,MM/m64
源寄存器与目的寄存器按双字(有符号补码)比较,
当目的寄存器对应双字大于源寄存器就置目的寄存器对应双字为0ffffffffh,否则为00000000h
packuswb MM,MM/m64
把目的寄存器按字有符号数压缩为字节无符号数放入目的寄存器低32位
把源寄存器按字有符号数压缩为字节无符号数放入目的寄存器高32位
压缩时负数变为00h,大于255的正数变为0ffh.
高32位 | 低32位
目的寄存器: a0 | a1 | a2 | a3
源寄存器: b0 | b1 | b2 | b3
目的寄存器压缩结果: b0|b1| b2|b3| a0|a1|a2|a3
例:
当MM0 == 7fff 8000 1234 00ae h,MM1 == 00ad 0123 80ff 0100 h,
执行packuswb MM0,MM1,则MM0 = ad ff 00 ff ff 00 ff ae h.
packsswb MM,MM/m64
把目的寄存器按字有符号数压缩为字节有符号数放入目的寄存器低32位
把源寄存器按字有符号数压缩为字节有符号数放入目的寄存器高32位
压缩时小于-128负数变为80h,大于127的正数变为7fh.
高32位 | 低32位
目的寄存器: a0 | a1 | a2 | a3
源寄存器: b0 | b1 | b2 | b3
目的寄存器压缩结果: b0|b1| b2|b3| a0|a1|a2|a3
例:
当MM0 == 0fff ff06 0080 0012 h,MM1 == 0001 8000 ffff 7fff h,
执行packsswb MM0,MM1,则MM0 = 01 80 ff 7f 7f 80 7f 12 h
packssdw MM,MM/m64
把目的寄存器按双字有符号数压缩为单字有符号数放入目的寄存器低32位
把源寄存器按双字有符号数压缩为单字有符号数放入目的寄存器高32位
压缩时小于-32768负数变为8000h,大于32767的正数变为7fffh.
高32位 | 低32位
目的寄存器: a0 | a1
源寄存器: b0 | b1
目的寄存器压缩结果: b0 | b1 | a0 | a1
punpcklbw MM,MM/m64
把目的寄存器与源寄存器的低32位按字节交错排列放入目的寄存器
高32位 | 低32位
目的寄存器: a0|a1|a2|a3|a4|a5|a6|a7
源寄存器: b0|b1|b2|b3|b4|b5|b6|b7
目的寄存器结果: b4|a4|b5|a5|b6|a6|b7|a7
例:
当MM0 == 01 02 03 04 05 06 07 08 h,MM1 == 09 0a 0b 0c 0d 0e 0f 00 h
执行punpcklbw MM0,MM1,则MM0 = 0d 05 0e 06 0f 07 00 08 h
punpcklwd MM,MM/m64
把目的寄存器与源寄存器的低32位按字交错排列放入目的寄存器
高32位 | 低32位
目的寄存器: a0 | a1 | a2 | a3
源寄存器: b0 | b1 | b2 | b3
目的寄存器结果: b2 | a2 | b3 | a3
punpckldq MM,MM/m64
把目的寄存器与源寄存器的低32位按双字交错排列放入目的寄存器
高32位 | 低32位
目的寄存器: a0 | a1
源寄存器: b0 | b1
目的寄存器结果: b1 | a1
punpckhbw MM,MM/m64
把目的寄存器与源寄存器的高32位按字节交错排列放入目的寄存器
高32位 | 低32位
目的寄存器: a0|a1|a2|a3|a4|a5|a6|a7
源寄存器: b0|b1|b2|b3|b4|b5|b6|b7
目的寄存器结果: b0|a0|b1|a1|b2|a2|b3|a3
例:
当MM0 == 01 02 03 04 05 06 07 08 h,MM1 == 09 0a 0b 0c 0d 0e 0f 00 h
执行punpcklbw MM0,MM1,则MM0 = 09 01 0a 02 0b 03 0c 04 h
punpckhwd MM,MM/m64
把目的寄存器与源寄存器的高32位按字交错排列放入目的寄存器
高32位 | 低32位
目的寄存器: a0 | a1 | a2 | a3
源寄存器: b0 | b1 | b2 | b3
目的寄存器结果: b0 | a0 | b1 | a1
punpckhdq MM,MM/m64
把目的寄存器与源寄存器的高32位按双字交错排列放入目的寄存器
高32位 | 低32位
目的寄存器: a0 | a1
源寄存器: b0 | b1
目的寄存器结果: b0 | a0
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
★★★★★注:除 movups,movupd 指令外,其它涉及到128位内存变量操作的,
内存变量首地址必须要对齐16字节,也就是内存地址低4位为0,
否则会引起CPU异常,导致指令执行失败,此错误编译器不检查.
SSE1:
主要是单精度浮点运算
SSE有8个128位独立寄存器(XMM1~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位不变.
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
◆关于浮点数的转为字符串的程序我已有程序贴在此论坛上(www.aogosoft.com),你只须稍微改动一下,就可用来测试此类指令.
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字节.
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
rcpss XMM,XMM/32
源存储器低32位1个单精度浮点数的倒数放入目的寄存器低32位,高96位不变
例:
当XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,执行rcpss XMM0,XMM1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -