sse2指令集
sse2指令集

sse2指令集sse2指令集1移动指令:1. Movapsmovaps XMM,XMM/m128 movaps XMM/128,XMM把源存储器内容值送入目的寄存器,当有m128时,必须对齐内存16字节,也就是内存地址低4位为0.2. Movupsmovups XMM,XMM/m128 movaps XMM/128,XMM把源存储器内容值送入目的寄存器,但不必对齐内存16字节3. Movlpsmovlps XMM,m64把源存储器64位内容送入目的寄存器低64位,高64位不变,内存变量不必对齐内存16字节4. Movhpsmovhps XMM,m64把源存储器64位内容送入目的寄存器高64位,低64位不变,内存变量不必对齐内存16字节.5. Movhlpsmovhlps XMM,XMM把源寄存器高64位送入目的寄存器低64位,高64位不变.6. Movlhpsmovlhps XMM,XMM把源寄存器低64位送入目的寄存器高64位,低64位不变.7. movssmovss XMM,m32/XMM原操作数为m32时:dest[31-00] <== m32 dest[127-32] <== 0原操作数为XMM时: dest[31-00] <== src[31-00] dest[127-32]不变8. movmskpdmovmskpd r32,XMM取64位操作数符号位r32[0] <== XMM[63] r32[1] <== XMM[127] r32[31-2] <== 09. movmskpsmovmskps r32,XMM取32位操作数符号位r32[0] <== XMM[31] r32[1] <== XMM[63] r32[2] <== XMM[95] r32[3] <== XMM[127] r32[31-4] <== 010. pmovmskbpmovmskb r32,XMM取16位操作数符号位具体操作同前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] <== 011. movntpsmovntps m128,XMMm128 <== XMM 直接把XMM中的值送入m128,不经过cache,必须对齐16字节.12. Movntpdmovntpd m128,XMMm128 <== XMM 直接把XMM中的值送入m128,不经过cache,必须对齐16字节.13. Movntimovnti m32,r32m32 <== r32 把32寄存器的值送入m32,不经过cache.14. Movapdmovapd XMM,XMM/m128 movapd XMM/m128,XMM把源存储器内容值送入目的寄存器,当有m128时,必须对齐内存16字节15. Movupdmovupd XMM,XMM/m128 movapd XMM/m128,XMM把源存储器内容值送入目的寄存器,但不必对齐内存16字节.我感觉这两条指令同movaps 和 movups 指令一样,不过又不确定.16. Movlpdmovlpd XMM,m64 movlpd m64,XMM把源存储器64位内容送入目的寄存器低64位,高64位不变,内存变量不必对齐内存16字节17. Movhpdmovhpd XMM,m64 movhpd m64,XMM把源存储器64位内容送入目的寄存器高64位,低64位不变,内存变量不必对齐内存16字节.18. Movdqamovdqa XMM,XMM/m128 movdqa XMM/m128,XMM把源存储器内容值送入目的寄存器,当有m128时,必须对齐内存16字节.19. Movdqumovdqu XMM,XMM/m128 movdqu XMM/m128,XMM把源存储器内容值送入目的寄存器,但不必对齐内存16字节.20. movq2dqmovq2dq XMM,MM把源寄存器内容送入目的寄存器的低64位,高64位清零.21. movdq2qmovdq2q MM,XMM把源寄存器低64位内容送入目的寄存器.22. Movdmovd XMM,r32/m32 movd MM,r32/m32把源存储器32位内容送入目的寄存器的低32位,高96位清零.movd r32/m32,XMM movd r32/m32,MM把源寄存器的低32位内容送入目的存储器32位.23. Movqmovq XMM,XMM/m64 movq MM,MM/m64把源存储器低64位内容送入目的寄存器的低64位,高64位清零.movq m64,XMM把源寄存器的低64位内容送入目的存储器.2 加法操作1. addpsaddps XMM,XMM/m128源存储器内容按双字对齐,共4个单精度浮点数与目的寄存器相加,结果送入目的寄存器,内存变量必须对齐内存16字节2. addsaddss XMM,XMM/m32源存储器的低32位1个单精度浮点数与目的寄存器的低32位1个单精度浮点数相加,结果送入目的寄存器的低32位高96位不变,内存变量不必对齐内存16字节3. addpdaddpd XMM,XMM/m128源存储器内容按四字对齐,共两个双精度浮点数与目的寄存器相加,结果送入目的寄存器,内存变量必须对齐内存16字节.4. addsdaddsd XMM,XMM/m64源存储器的低64位1个双精度浮点数与目的寄存器的低64位1个双精度浮点数相加,结果送入目的寄存器的低64位, 高64位不变,内存变量不必对齐内存16字节5. padddpaddd XMM,XMM/m128把源存储器与目的寄存器按双字对齐无符号整数普通相加,结果送入目的寄存器,内存变量必须对齐内存16字节.6. Paddqpaddq XMM,XMM/m128把源存储器与目的寄存器按四字对齐无符号整数普通相加,结果送入目的寄存器,内存变量必须对齐内存16字节.7. Paddqpaddq MM,MM/m64把源存储器与目的寄存器四字无符号整数普通相加,结果送入目的寄存器.8. Pmaddwdpmaddwd 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*b79. Paddsbpaddsb XMM,XMM/m128 paddsb MM,MM/m64源存储器与目的寄存器按字节对齐有符号补码饱和相加,内存变量必须对齐内存16字节.10. paddswpaddsw XMM,XMM/m128源存储器与目的寄存器按字对齐有符号补码饱和相加,内存变量必须对齐内存16字节.11. paddusbpaddusb XMM,XMM/m128源存储器与目的寄存器按字节对齐无符号饱和相加,内存变量必须对齐内存16字节.12. Padduswpaddusw XMM,XMM/m128源存储器与目的寄存器按字对齐无符号饱和相加,内存变量必须对齐内存16字节.13. Paddbpaddb XMM,XMM/m128源存储器与目的寄存器按字节对齐无符号普通相加,内存变量必须对齐内存16字节.14. Paddwpaddw XMM,XMM/m128源存储器与目的寄存器按字对齐无符号普通相加,内存变量必须对齐内存16字节.15. Padddpaddd XMM,XMM/m128源存储器与目的寄存器按双字对齐无符号普通相加,内存变量必须对齐内存16字节.16. Paddqpaddq XMM,XMM/m128源存储器与目的寄存器按四字对齐无符号普通相加,内存变量必须对齐内存16字节.17.3 减法操作1. subpssubps XMM,XMM/m128源存储器内容按双字对齐,共4个单精度浮点数与目的寄存器相减(目的减去源),结果送入目的寄存器, 内存变量必须对齐内存16字节.2. Subsssubss XMM,XMM/m32源存储器的低32位1个单精度浮点数与目的寄存器的低32位1个单精度浮点数相减(目的减去源), 结果送入目的寄存器的低32位,高96位不变,内存变量不必对齐内存16字节3. Subpdsubpd XMM,XMM/m128把目的寄存器内容按四字对齐,两个双精度浮点数,减去源存储器两个双精度浮点数, 结果送入目的寄存器,内存变量必须对齐内存16字节.4. subsdsubsd XMM,XMM/m128把目的寄存器的低64位1个双精度浮点数,减去源存储器低64位1个双精度浮点数,结果送入目的寄存器的低64位, 高64位不变,内存变量不必对齐内存16字节5. Psubdpsubd XMM,XMM/m128把目的寄存器与源存储器按双字对齐无符号整数普通相减,结果送入目的寄存器, 内存变量必须对齐内存16字节.(目的减去源)6. Psubqpsubq XMM,XMM/m128把目的寄存器与源存储器按四字对齐无符号整数普通相减,结果送入目的寄存器, 内存变量必须对齐内存16字节.(目的减去源)7. Psubqpsubq MM,MM/m64把目的寄存器与源存储器四字无符号整数普通相减,结果送入目的寄存器.(目的减去源)8. psubsbpsubsb XMM,XMM/m128源存储器与目的寄存器按字节对齐有符号补码饱和相减(目的减去源),内存变量必须对齐内存16字节.9. Psubswpsubsw XMM,XMM/m128源存储器与目的寄存器按字对齐有符号补码饱和相减(目的减去源),内存变量必须对齐内存16字节.10. Psubusbpsubusb XMM,XMM/m128源存储器与目的寄存器按字节对齐无符号饱和相减(目的减去源),内存变量必须对齐内存16字节.11. Psubuswpsubusw XMM,XMM/m128源存储器与目的寄存器按字对齐无符号饱和相减(目的减去源),内存变量必须对齐内存16字节.12. psubbpsubb XMM,XMM/m128源存储器与目的寄存器按字节对齐无符号普通相减(目的减去源),内存变量必须对齐内存16字节.13. Psubwpsubw XMM,XMM/m128源存储器与目的寄存器按字对齐无符号普通相减(目的减去源),内存变量必须对齐内存16字节.14. Psubdpsubd XMM,XMM/m128源存储器与目的寄存器按双字对齐无符号普通相减(目的减去源),内存变量必须对齐内存16字节.15. Psubqpsubq XMM,XMM/m128源存储器与目的寄存器按四字对齐无符号普通相减(目的减去源),内存变量必须对齐内存16字节.16.4 比较操作1. Maxpsmaxps XMM,XMM/m128源存储器4个单精度浮点数与目的寄存器4个单精度浮点数比较,较大数放入对应目的寄存器,内存变量必须对齐内存16字节.2. Maxssmaxss XMM,XMM/m32源存储器低32位1个单精度浮点数与目的寄存器低32位1个单精度浮点数比较,较大数放入目的寄存器低32位,高96位不变内存变量不必对齐内存16字节3. Minpsminps XMM,XMM/m128源存储器4个单精度浮点数与目的寄存器4个单精度浮点数比较,较小数放入对应目的寄存器,内存变量必须对齐内存16字节.4. minssminss XMM,XMM/m32源存储器低32位1个单精度浮点数与目的寄存器低32位1个单精度浮点数比较,较小数放入目的寄存器低32位,高96位不变内存变量不必对齐内存16字节5. cmppscmpps XMM0,XMM1,imm8 imm8是立即数范围是0~7根据imm8的值进行4对单精度浮点数的比较,符合imm8的就置目的寄存器对应的32位全1,否则全0当imm8 = 0时,目的寄存器等于原寄存器数时,置目的寄存器对应的32位全1,否则全0imm8 = 1 时,目的寄存器小于原寄存器数时,置目的寄存器对应的32位全1,否则全0imm8 = 2 时,目的寄存器小于等于原寄存器数时,置目的寄存器对应的32位全1,否则全0imm8 = 4 时,目的寄存器不等于原寄存器数时,置目的寄存器对应的32位全1,否则全0imm8 = 5 时,目的寄存器大于等于原寄存器数时,置目的寄存器对应的32位全1,否则全0imm8 = 6 时,目的寄存器大于原寄存器数时,置目的寄存器对应的32位全1,否则全06. pcmpeqbpcmpeqb XMM,XMM/m128目的寄存器与源存储器按字节比较,如果对应字节相等,就置目的寄存器对应字节为0ffh,否则为00h内存变量必须对齐内存16字节.7. Pcmpeqwpcmpeqw XMM,XMM/m128目的寄存器与源存储器按字比较,如果对应字相等,就置目的寄存器对应字为0ffffh,否则为0000h, 内存变量必须对齐内存16字节8. Pcmpeqdpcmpeqd XMM,XMM/m128目的寄存器与源存储器按双字比较,如果对应双字相等,就置目的寄存器对应双字为0ffffffffh,否则为00000000h内存变量必须对齐内存16字节9. Pcmpgtbpcmpgtb XMM,XMM/m128目的寄存器与源存储器按字节(有符号补码)比较,如果目的寄存器对应字节大于源存储器,就置目的寄存器对应字节为0ffh, 否则为00h,内存变量必须对齐内存16字节10. Pcmpgtwpcmpgtw XMM,XMM/m128目的寄存器与源存储器按字(有符号补码)比较,如果目的寄存器对应字大于源存储器,就置目的寄存器对应字为0ffffh, 否则为0000h,内存变量必须对齐内存16字节.11. Pcmpgtdpcmpgtd XMM,XMM/m128目的寄存器与源存储器按双字(有符号补码)比较,如果目的寄存器对应双字大于源存储器, 就置目的寄存器对应双字为0ffffffffh,否则为00000000h,内存变量必须对齐内存16字节.5 计算操作1. rcppsrcpps XMM,XMM/m128源存储器4个单精度浮点数的倒数放入对应目的寄存器,内存变量必须对齐内存16字节注:比如2.0E0的倒数为1÷2.0E0 = 5.0E-1, 这操作只有12bit的精度2. rcpssrcpss XMM,XMM/32源存储器低32位1个单精度浮点数的倒数放入目的寄存器低32位,高96位不变3. rsqrtpsrsqrtps XMM,XMM/m128源存储器4个单精度浮点数的开方的倒数放入对应目的寄存器,内存变量必须对齐内存16字节. 比如2.0E0的开方的倒数为1÷√2.0E0 ≈ 7.0711E-1, 这操作只有12bit的精度.4. Rsqrtssrsqrtss XMM,XMM/32源存储器低32位1个单精度浮点数的开方的倒数放入目的寄存器低32位,高96位不变,内存变量不必对齐内存16字节.5. Pavgbpavgb MM,MM/m64 pavgb XMM,XMM/m128把源存储器与目的寄存器按字节无符号整数相加,再除以2,结果四舍五入为整数放入目的寄存器, 源存储器为m128时,内存变量必须对齐内存16字节. 注:此运算不会产生溢出.6. Pavgwpavgw MM,MM/m64 pavgw XMM,XMM/m128把源存储器与目的寄存器按字无符号整数相加,再除以2,结果四舍五入为整数放入目的寄存器, 源存储器为m128时,内存变量必须对齐内存16字节.7. Sqrtpdsqrtpd XMM,XMM/m128源存储器两个双精度浮点数的开方放入对应目的寄存器,内存变量必须对齐内存16字节.8. Sqrtsdsqrtsd XMM,XMM/m128源存储器低64位1个双精度浮点数的开方放入目的寄存器低64位,高64位不变,内存变量不必对齐内存16字节6 乘法操作1. Mulpsmulps XMM,XMM/m128源存储器内容按双字对齐,共4个单精度浮点数与目的寄存器相乘,结果送入目的寄存器,内存变量必须对齐内存16字节.2. Mulssmulss XMM,XMM/32源存储器的低32位1个单精度浮点数与目的寄存器的低32位1个单精度浮点数相乘,结果送入目的寄存器的低32位, 高96位不变,内存变量不必对齐内存16字节3. Mulpdmulpd XMM,XMM/m128源存储器内容按四字对齐,共两个双精度浮点数与目的寄存器相乘,结果送入目的寄存器,内存变量必须对齐内存16字节4. Mulsdmulsd XMM,XMM/m128源存储器的低64位1个双精度浮点数与目的寄存器的低64位1个双精度浮点数相乘,结果送入目的寄存器的低64位, 高64位不变,内存变量不必对齐内存16字节5. Pmuludqpmuludq XMM,XMM/m128把源存储器与目的寄存器的低32位无符号整数相乘,结果变为64位,送入目的寄存器低64位, 把源存储器与目的寄存器的高64位的低32位无符号整数相乘,结果变为64位,送入目的寄存器高64位内存变量必须对齐内存16字节.高64位 | 低64位目的寄存器: a0 | a1 | a2 | a3源存储器: b0 | b1 | b2 | b3目的寄存器结果: b1*a1 | b3*a36. Pmuludqpmuludq MM,MM/m64把源存储器与目的寄存器的低32位无符号整数相乘,结果变为64位,送入目的寄存器.7. pmulhwpmulhw XMM,XMM/m128源存储器与目的寄存器按字对齐有符号补码饱和相乘,取结果的高16位放入目的寄存器对应字中. 内存变量必须对齐内存16字节8. pmullwpmullw XMM,XMM/m128源存储器与目的寄存器按字对齐有符号补码饱和相乘,取结果的低16位放入目的寄存器对应字中. 内存变量必须对齐内存16字节.9.7 除法操作1. Divpsdivps XMM,XMM/m128目的寄存器共4个单精度浮点数除以源存储器4个单精度浮点数,结果送入目的寄存器,内存变量必须对齐内存16字节.2. Divssdivss XMM,XMM/32目的寄存器低32位1个单精度浮点数除以源存储器低32位1个单精度浮点数,结果送入目的寄存器的低32位, 高96位不变,内存变量不必对齐内存16字节3. Divpddivpd XMM,XMM/m128目的寄存器共两个双精度浮点数除以源存储器两个双精度浮点数,结果送入目的寄存器,内存变量必须对齐内存16字节4. Divsddivsd XMM,XMM/m128目的寄存器低64位1个双精度浮点数除以源存储器低64位1个双精度浮点数,结果送入目的寄存器的低64位, 高64位不变,内存变量不必对齐内存16字节.8 位操作1. Andpsandps XMM,XMM/m128源存储器128个二进制位'与'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.2. Orpsorps XMM,XMM/m128源存储器128个二进制位'或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.3. Xorpsxorps XMM,XMM/m128源存储器128个二进制位'异或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.4. Unpckhpsunpckhps XMM,XMM/m128源存储器与目的寄存器高64位按双字交错排列,结果送入目的寄存器,内存变量必须对齐内存16字节.高64位 | 低64位目的寄存器: a0 | a1 | a2 | a3源存储器: b0 | b1 | b2 | b3目的寄存器结果: b0 | a0 | b1 | a15. Unpcklpsunpcklps XMM,XMM/m128源存储器与目的寄存器低64位按双字交错排列,结果送入目的寄存器,内存变量必须对齐内存16字节高64位 | 低64位目的寄存器: a0 | a1 | a2 | a3源存储器: b0 | b1 | b2 | b3目的寄存器结果: b2 | a2 | b3 | a36. Pextrwpextrw 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 87. Pinsrwpinsrw 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 88. Pmaxswpmaxsw MM,MM/m64 pmaxsw XMM,XMM/m128把源存储器与目的寄存器按字有符号(补码)整数比较,大数放入目的寄存器对应字, 源存储器为m128时,内存变量必须对齐内存16字节9. Pmaxubpmaxub MM,MM/m64 pmaxsw XMM,XMM/m128把源存储器与目的寄存器按字节无符号整数比较,大数放入目的寄存器对应字节, 源存储器为m128时,内存变量必须对齐内存16字节.10. pminswpminsw MM,MM/m64 pmaxsw XMM,XMM/m128把源存储器与目的寄存器按字有符号(补码)整数比较,较小数放入目的寄存器对应字, 源存储器为m128时,内存变量必须对齐内存16字节.11. Pminubpminub MM,MM/m64 pmaxsw XMM,XMM/m128把源存储器与目的寄存器按字节无符号整数比较,较小数放入目的寄存器对应字节, 源存储器为m128时,内存变量必须对齐内存16字节12. Maxpdmaxpd XMM,XMM/m128源存储器两个双精度浮点数与目的寄存器两个双精度浮点数比较,较大数放入对应目的寄存器,内存变量必须对齐内存16字节.13. Maxsdmaxsd XMM,XMM/m128源存储器低64位1个双精度浮点数与目的寄存器低64位1个双精度浮点数比较,较大数放入目的寄存器低64位,高64位不变内存变量不必对齐内存16字节.14. Minpdminpd XMM,XMM/m128源存储器两个双精度浮点数与目的寄存器两个双精度浮点数比较,较小数放入对应目的寄存器,内存变量必须对齐内存16字节.15. Minsdminsd XMM,XMM/m128源存储器低64位1个双精度浮点数与目的寄存器低64位1个双精度浮点数比较,较小数放入目的寄存器低64位,高64位不变内存变量不必对齐内存16字节.16. Andpdandpd XMM,XMM/m128源存储器128个二进制位'与'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.17. Andnpdandnpd XMM,XMM/m128目的寄存器128个二进制位先取'非',再'与'源存储器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节18. Orpdorpd XMM,XMM/m128源存储器128个二进制位'或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.19. Xorpdxorpd XMM,XMM/m128源存储器128个二进制位'异或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.20. Pslldqpslldq XMM,imm8把目的寄存器128位按imm8(立即数)指定字节数逻辑左移,移出的字节丢失.imm8 == 1时,代表左移8位,imm8 == 2时,代表左移16位.21. Psrldqpsrldq XMM,imm8把目的寄存器128位按imm8(立即数)指定字节数逻辑右移,移出的字节丢失.imm8 == 1时,代表右移8位,imm8 == 2时,代表右移16位.22. Psllwpsllw XMM,XMM/m128 psllw XMM,imm8把目的寄存器按字由源存储器(或imm8 立即数)指定位数逻辑左移,移出的位丢失. 低字移出的位不会移入高字,内存变量必须对齐内存16字节.23. Psrlwpsrlw XMM,XMM/m128 psrlw XMM,imm8把目的寄存器按字由源存储器(或imm8 立即数)指定位数逻辑右移,移出的位丢失.高字移出的位不会移入低字,内存变量必须对齐内存16字节.24. Pslldpslld XMM,XMM/m128 pslld XMM,XMM imm8把目的寄存器按双字由源存储器(或imm8 立即数)指定位数逻辑左移,移出的位丢失. 低双字移出的位不会移入高双字,内存变量必须对齐内存16字节.25. Psrldpsrld XMM,XMM/m128 psrld XMM,imm8把目的寄存器按双字由源存储器(或imm8 立即数)指定位数逻辑右移,移出的位丢失.高双字移出的位不会移入低双字,内存变量必须对齐内存16字节.pandpand XMM,XMM/m128源存储器128个二进制位'与'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节. 我发现与andpd功能差不多,就不知其它特性是否一样26. Pandnpandn XMM,XMM/m128目的寄存器128个二进制位先取'非',再'与'源存储器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节27. Porpor XMM,XMM/m128源存储器128个二进制位'或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.28. Pxorpxor XMM,XMM/m128源存储器128个二进制位'异或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.29. packuswbpackuswb XMM,XMM/m128 packuswb MM,MM/m64把目的寄存器按字有符号数压缩为字节无符号数放入目的寄存器低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| a730. packsswbpacksswb XMM,XMM/m128 packsswb MM,MM/m64把目的寄存器按字有符号数压缩为字节有符号数放入目的寄存器低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| a731. packssdwpackssdw 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 | a332. punpckldqpunpckldq XMM,XMM/m128把源存储器与目的寄存器低64位按双字交错排列,内存变量必须对齐内存16字节.高64位 | 低64位目的寄存器: a0 | a1 | a2 | a3源寄存器: b0 | b1 | b2 | b3目的寄存器排列结果: b2 | a2 | b3 | a333. punpckhdq把源存储器与目的寄存器高64位按双字交错排列,内存变量必须对齐内存16字节.高64位 | 低64位目的寄存器: a0 | a1 | a2 | a3源寄存器: b0 | b1 | b2 | b3目的寄存器排列结果: b0 | a0 | b1 | a134. punpcklwd把源存储器与目的寄存器低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 | a735. punpckhwdpunpckhwd 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 | a336. punpcklbwpunpcklbw 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| aF37. punpckhbw把源存储器与目的寄存器高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| a738. shufpsshufps XMM,XMM/m128,imm8把源存储器与目的寄存器按双字划分,由imm8(立即数)八个二进制位(00~11,00^11,00~11,00~11)指定排列, 内存变量必须对齐内存16字节.目的寄存器高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 h39. shufpdshufpd XMM,XMM/m128,imm8(0~255) imm8(操作值) = imm8(输入值) mod 4把源存储器与目的寄存器按四字划分,由imm8(立即数)4个二进制位(0~1,0^1,0~1,0~1)指定排列, 内存变量必须对齐内存16字节.目的寄存器高64位放源存储器被指定数,目的寄存器低64位放目的寄存器被指定数.当XMM0 = 1111111122222222 3333333344444444 hXMM1 = 5555555566666666 aaaaaaaacccccccc h,执行shufpd XMM0,XMM1,101001 1 0 b则XMM0 = 5555555566666666 3333333344444444 h40. pshuflwpshuflw XMM,XMM/m128,imm8(0~255)先把源存储器的高64位内容送入目的寄存器的高64位,然后用imm8将源存储器的低64位4个字选入目的寄存器的低64位,内存变量必须对齐内存16字节.源寄存器低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 hXMM1 = 5555555566666666 7777 8888 9999 cccc h,执行pshuflw XMM0,XMM1,10 10 01 10 b则XMM0 = 5555555566666666 8888 8888 9999 8888 h41. pshufhwpshufhw XMM,XMM/m128,imm8(0~255)先把源存储器的低64位内容送入目的寄存器的低64位,然后用imm8将源存储器的高64位4个字选入目的寄存器的高64位,内存变量必须对齐内存16字节.源寄存器高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 hXMM1 = 7777 8888 9999 cccc 5555555566666666 h,执行pshufhw XMM0,XMM1,10 10 01 10 b则XMM0 = 8888 8888 9999 8888 5555555566666666 h42. pshufdpshufd XMM,XMM/m128,imm8(0~255)将源存储器的4个双字由imm8指定选入目的寄存器,内存变量必须对齐内存16字节.源寄存器: 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 h9 数据类型操作43. cvtpi2pscvtpi2ps XMM,MM/m64源存储器64位两个32位有符号(补码)整数转为两个单精度浮点数,放入目的寄存器低64中,高64位不变.44. cvtsi2sscvtsi2ss XMM,r32/m32源存储器1个32位有符号(补码)整数转为1个单精度浮点数,放入目的寄存器低32中,高96位不变.45. cvtps2picvtps2pi MM,XMM/m64把源存储器低64位两个32位单精度浮点数转为两个32位有符号(补码)整数,放入目的寄存器46. cvttps2picvttps2pi MM,XMM/m64类似于cvtps2pi,截断取整.47. cvtss2sicvtss2si r32,XMM/m32把源存储器低32位1个单精度浮点数转为1个32位有符号(补码)整数,放入目的寄存器.48. cvttss2sicvttss2si r32,XMM/m32类似cvtss2si,截断取整.49. cvtps2pdcvtps2pd XMM,XMM/m64把源存储器低64位两个单精度浮点数变成两个双精度浮点数,结果送入目的寄存器.50. cvtss2sdcvtss2sd XMM,XMM/m32把源存储器低32位1个单精度浮点数变成1个双精度浮点数,结果送入目的寄存器的低64位,高64位不变.51. cvtpd2ps把源存储器两个双精度浮点数变成两个单精度浮点数,结果送入目的寄存器的低64位,高64位清零, 内存变量必须对齐内存16字节.^特殊状态^3.14E5 (表示负无穷大)52. cvtsd2sscvtsd2ss XMM,XMM/m64把源存储器低64位1个双精度浮点数变成1个单精度浮点数,结果送入目的寄存器的低32位,高96位不变.53. cvtpd2picvtpd2pi MM,XMM/m128把源存储器两个双精度浮点数变成两个双字有符号整数,结果送入目的寄存器,内存变量必须对齐内存16字节. 如果结果大于所能表示的范围,那么转化为80000000h(正数也转为此值).54. cvttpd2picvttpd2pi MM,XMM/m128类似于cvtpd2pi,截断取整.55. cvtpi2pdcvtpi2pd XMM,MM/m64把源存储器两个双字有符号整数变成两个双精度浮点数,结果送入目的寄存器.56. cvtpd2dqcvtpd2dq XMM,XMM/m128把源存储器两个双精度浮点数变成两个双字有符号整数(此运算与cvtpd2pi类似但目的寄存器变为XMM), 结果送入目的寄存器的低64位,高64位清零,内存变量必须对齐内存16字节.57. cvttpd2dqcvttpd2dq XMM,XMM/m128。
cpu指令集

CPU_多媒体指令集解释CPU依靠指令来计算和控制系统,每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。
指令的强弱也是CPU的重要指标,指令集是提高微处理器效率的最有效工具之一。
从现阶段的主流体系结构讲,指令集可分为复杂指令集和精简指令集两部分,而从具体运用看,如Intel的MMX(Multi Media Extended)、SSE、 SSE2(Streaming-Single instruction multiple data-Extensions 2)和AMD的3DNow!等都是CPU的扩展指令集,分别增强了CPU的多媒体、图形图象和Internet等的处理能力。
我们通常会把CPU的扩展指令集称为"CPU的指令集"。
精简指令集的运用在最初发明计算机的数十年里,随着计算机功能日趋增大,性能日趋变强,内部元器件也越来越多,指令集日趋复杂,过于冗杂的指令严重的影响了计算机的工作效率。
后来经过研究发现,在计算机中,80%程序只用到了20%的指令集,基于这一发现,RISC精简指令集被提了出来,这是计算机系统架构的一次深刻革命。
RISC体系结构的基本思路是:抓住CISC 指令系统指令种类太多、指令格式不规范、寻址方式太多的缺点,通过减少指令种类、规范指令格式和简化寻址方式,方便处理器内部的并行处理,提高VLSI器件的使用效率,从而大幅度地提高处理器的性能。
RISC指令集有许多特征,其中最重要的有:1. 指令种类少,指令格式规范:RISC指令集通常只使用一种或少数几种格式。
指令长度单一(一般4个字节),并且在字边界上对齐。
字段位置、特别是操作码的位置是固定的。
2. 寻址方式简化:几乎所有指令都使用寄存器寻址方式,寻址方式总数一般不超过5个。
其他更为复杂的寻址方式,如间接寻址等则由软件利用简单的寻址方式来合成。
3. 大量利用寄存器间操作:RISC指令集中大多数操作都是寄存器到寄存器操作,只以简单的Load和Store操作访问内存。
指令集

CPU作为一台电脑中的核心,它的作用是无法替代的。
而CPU本身只是在块硅晶片上所集成的超大规模的集成电路,集成的晶体管数量可达到上亿个,是由非常先进复杂的制造工艺制造出来的,拥有相当高的科技含量。
然而如此一颗精密的芯片为什么能够控制一个庞大而复杂的电脑系统呢?这就是CPU中所集成的指令集。
所谓指令集,就是CPU中用来计算和控制计算机系统的一套指令的集合,而每一种新型的CPU在设计时就规定了一系列与其他硬件电路相配合的指令系统。
而指令集的先进与否,也关系到CPU的性能发挥,它也是CPU性能体现的一个重要标志。
CPU的指令集从主流的体系结构上分为精简指令集和复杂指令集,而在普通的计算机处理器基本上是使用的复杂指令集。
在计算机早期的发展过程中,CPU 中的指令集是没有划分类型的,而是都将各种程序需要相配合的指令集成到CPU 中,但是随着科技的进步,计算机的功能也越来越强大,计算机内部的元件也越来越多,而且越来越复杂,CPU的指令也相应的变得十分复杂,而在使用过程中,并不是每一条指令都要完全被执行,在技术人员的研究过程中发现,约有80%的程序只用到了20%的指令,而一些过于冗余的指令严重影响到了计算机的工作效率,就这一现象,精简指令集的概念就被提了出来。
精简指令集RISC就是(Reduced Instruction Set Computing)的缩写,而复杂指令集CISC则是(Complex Instruction Set Computing)的缩写。
它们之间的不同之处就在于RISC指令集的指令数目少,而且每条指令采用相同的字节长度,一般长度为4个字节,并且在字边界上对齐,字段位置固定,特别是操作码的位置。
而CISC指令集特点就是指令数目多而且复杂,每条指令的长度也不相等。
在操作上,RISC指令集中大多数操作都是寄存器到寄存器之间的操作,只以简单的Load(读取)和Sotre(存储)操作访问内存地址。
因此,每条指令中访问的内存地址不会超过1个,指令访问内存的操作不会与算术操作混在一起。
Intel_SSE_指令集整理

目录MMX(TM)技术的固有指令 (4)MMX(TM)技术普遍支持指令 (4)MMX(TM)技术包装的算法指令 (5)MMX(TM)技术移位指令 (6)MMX(TM)技术逻辑指令 (8)MMX(TM)技术比较指令 (8)MMX(TM)技术置位指令 (9)SSE的固有指令 (10)SSE的算术操作 (10)SSE的逻辑操作 (13)SSE的比较操作 (13)SSE的转换操作 (18)SSE的加载操作 (20)SSE的置位操作 (22)SSE的存储操作 (23)利用SSE进行缓存支持 (24)利用SSE指令的整型指令 (24)SSE的读写寄存器指令 (27)利用SSE的混杂指令 (27)SSE2的固有指令 (29)综述 (29)浮点指令 (30)浮点算术操作 (30)浮点逻辑操作 (31)浮点比较操作 (32)浮点转换操作 (36)浮点加载操作 (38)浮点置位操作 (40)浮点存储操作 (41)整型指令 (42)整型算术操作 (42)整型逻辑操作 (47)整型移位操作 (48)整型比较操作 (50)整型转换操作 (52)整型移动操作 (53)整型加载操作 (53)整型置位操作 (54)整型存储操作 (56)其它函数和指令 (57)缓存支持指令 (57)混杂指令 (58)类型转换指令 (61)暂停指令 (62)重排宏 (62)SSE3的固有指令 (62)综述 (62)整型向量指令 (62)单精度浮点型向量指令 (62)双精度浮点型向量指令 (63)宏函数 (64)混杂指令 (64)SSE3补充的固有指令 (65)综述 (65)加法指令 (65)减法指令 (66)乘法指令 (67)绝对值指令 (68)重排指令 (68)连接指令 (69)SSE4的固有指令 (72)综述 (72)向量化编译器和媒体加速器 (72)综述:SSE4向量化编译器和媒体加速器 (72)打包混合指令 (72)浮点型点积指令 (73)打包格式化转换指令 (73)打包整型min/max指令 (74)浮点型舍入指令 (75)DWORD乘法指令 (76)寄存器插入/提取指令 (77)测试指令 (78)打包DWORD到无符号WORD指令 (78)打包等于比较指令 (78)可缓存性支持指令 (78)高效加速的字符串和文本处理器 (79)综述 (79)打包比较指令 (79)应用定向加速器指令 (80)适用所有Intel架构的固有指令 (81)综述 (81)整型算术指令 (81)浮点型指令 (82)字符串和块拷贝指令 (85)混杂指令 (86)Intrinsics for IA-32 and Intel® 64 Architectures Only (88)固有指令:命名和使用语法高级加密标准执行的固有指令转换半float的指令交叉编译器的固有指令数据对齐,内存分配和内联汇编的固有指令IA-64架构的固有指令MMX(TM)技术的固有指令综述关于MMX技术指令的细节EMMS指令:为什么需要它EMMS使用指南MMX(TM)技术普遍支持指令原型在mmintrin.h头文件中MMX(TM)技术包装的算法指令原型在mmintrin.h头文件中MMX(TM)技术移位指令原型在mmintrin.h头文件中MMX(TM)技术逻辑指令原型在mmintrin.h头文件中MMX(TM)技术比较指令原型在mmintrin.h头文件中MMX(TM)技术置位指令原型在mmintrin.h头文件中置2个有符号32位整型置4个有符号16位置8个有符号8位置2个有符号32位置4个有置8个有符号8位逆序置2个有符号32位整型逆序置4个有符号16位逆序置8个有符号8位IA-64架构上的MMX(TM)技术指令SSE的固有指令综述SSE指令的细节利用SSE指令编写程序SSE的算术操作原型在xmmintrin.h头文件中每个指令操作的结果存放在寄存器中。
CPU主流技术和指令集

CPU 主流技术及指令集引文:CPU有哪些主流技术?实际使用中对性能有怎样的影响?Intel官网对I5-2400S spec网址:/pr oducts/52208/Intel-Core-i5-2400S-Processor-(6M-Cache-2_50-GHz)1. CPU主流技术1.1.I ntel EISTSpeedStep技术,使CPU频率能在高、低两个确定的频率间切换,而且这种切换不是即时调整的,通常设置为当用电池时降为低频,而在用交流电源时恢复到高频(全速)。
由于降为低频的同时也会降低电压和功耗,一方面CPU本身耗电量减少,另一方面发热量也会减少,这样还能缩减甚至完全避免使用风扇散热,进一步的节约了用电,因此能延长电池的使用时间;另一方面在用交流电的时候又能恢复为全速工作以获得最高性能。
EIST—Enhanced Intel Speed Step Technology(增强型Intel SpeedStep技术),与早期的SpeedStep 技术不同的是,增强型SpeedStep 技术可以动态调整CPU 频率,当CPU使用率低下或接近零的时候动态降低CPU的倍率,令其工作频率下降,从而降低电压、功耗以及发热;而一旦监测到CPU使用率很高的时候,立即恢复到原始的速率工作。
AMD的CPU有类似效果的技术,称作Power Now!(移动平台)或者Cool'n'Quiet (桌面平台)。
测试过程中若是关闭了EIST, 可用tool监测到CPU的频率会固定在标准频率,相反打开则频率会根据工作任务动态的调整频率。
1.2.I ntel Tubor boost智能加速技术又称睿频加速技术,Turbo Boost为新一代能效管理方案,与EIST的降低主频以达到控制能耗的想法不同,Turbo Boost的主旨在于——在不超过总TDP (Thermal Design Power) 的前提下,尽量挖掘CPU的性能潜力。
CPU指令集浅说

许多人在选择CPU,或了解CPU性能时,常常忽略指令集这个指标,甚至认为它无关紧要的。
其实,指令集对于CPU来讲,是相当重要的。
举个常见的例子吧,有些使用老机子的人,在玩3D、视频、音频、图像、游戏等多媒体文件时,常常会感到效果不好。
速度慢、卡、甚至无法处理等。
这其中最重要的一个原因,就是老机子的CPU缺少先进的指令集。
本文就是力图用最通俗的语言,给非专业人士说说CPU的指令集。
都是从网上学来的,纯属个人理解,绝非权威观点。
由于尽量不使用那些艰涩难懂的专业术语,所以难免有不严谨之处。
就当扫盲吧。
CPU指令集浅说啥是指令集?我们对电脑下达的每一个命令都需要CPU根据预先设定好的某一条指令来完成。
这些预先设定好的指令是预存在CPU中的。
CPU依靠外来指令“激活”自己内存的指令,来计算和操控电脑。
每款CPU在设计时就规定了一系列与电脑其它部件相配合的指令系统。
预先存储的指令越多,CPU越“聪明”。
可以做的“动作”越多。
预先存储的指令越先进,CPU就越高级。
就好比大人脑袋里的知识多,所以比小孩聪明。
多个指令集中在一起,通常叫指令集。
基本指令集与扩展指令集CPU都有一个基本的指令集,在基本功能方面,它们的差别并不太大。
没有基本指令集的CPU,就是“傻子”一样的摆设。
为了提高CPU在某些方面的性能,就必须增加一些特殊的指令满足特殊的需求,这些新增的指令就构成了扩展指令集。
也就是常说的指令集。
精简指令集与复杂指令集不管是基本指令集还是扩展指令集,都有精简与复杂之分。
千万不要认为精简一定不如复杂。
恰恰相反的是,目前的精简指令集比复杂指令集好得多。
所以精简指令集基本用于中、高档服务器中。
尤其是高档服务器,使用的都是精简指令集。
而且,精简指令集有不断向个人电脑领域发展的趋势。
从长远上讲,精简指令集是以后高性能CPU的发展方向。
预计总有一天会一统江湖。
说到这,您一定会明白一个事实,那就是,目前绝大部分个人电脑都是使用复杂指令集的。
CPU指令集MMXSSESSE2SSE33

CPU指令集MMX SSE SSE2SSE3 3原文地址:CPU指令集:MMX SSE SSE2 SSE3 3DNow!AMD64 EM64T作者:老鬼MMX:MMX(Multi Media eXtension多媒体扩展指令)指令集是Intel公司在1996年为旗下的Pentium系列处理器所开发的一项多媒体指令增强技术。
MMX指令集中包括了57条多媒体指令,通过这些指令可以一次性处理多个数据,在处理结果超过实际处理能力的时候仍能够进行正常处理,如果在软件的配合下,可以得到更强的处理性能。
使用MMX指令集的好处就是当时所使用的操作系统可以在不做任何改变的情况下执行MMX指令。
但是,MMX指令集的问题也是比较明显的,MMX指令集不能与X86的浮点运算指令同时执行,必须做密集式的交错切换才可以正常执行,但是这样一来,就会造成整个系统运行速度的下降。
SSE:SSE是Streaming SIMD Extension(SIMD扩展指令集)的缩写,而其中SIMD的为含意为Single Istruction Multiple Data(单指令多数据),所以SSE指令集也叫单指令多数据流扩展。
该指令集最先运用于Intel的PentiumIII系列处理器,其实在Pentium III推出之前,Intel方面就已经泄漏过关于KNI(Katmai New Instruction)指令集的消息。
这个KNI指令集也就是SSE指令集的前身,当时也有不少的媒体将该指令集称之为MMX2指令集,但是Intel方面却从没有发布有关MMX2指令集的消息。
最后在Intel推出Pentium III处理器的时候,SSE指令集也终于水落石出。
SSE指令集是为提高处理器浮点性能而开发的扩展指令集,它共有70条指令,其中包含提高3D图形运算效率的50条SIMD浮点运算指令、12条MMX整数运算增强指令、8条优化内存中的连续数据块传输指令。
理论上这些指令对当时流行的图像处理、浮点运算、3D运算、多媒体处理等众多多媒体的应用能力起到全面提升的作用。
SSE体系结构与编程

// 计算y’(i)和y’(i+1) mx0 = _mm_mul_pd(tx, WM->dm10); //tx, ty, tz已经事先读入 mx1 = _mm_mul_pd(ty, WM->dm11); mx2 = _mm_mul_pd(tz, WM->dm12); mx0 = _mm_add_pd(mx0, _mm_add_pd(mx1, _mm_add_pd(mx2, WM->dm13))); _mm_store_pd(vertex.y + i, mx0); // 计算z’(i)和z’(i+1) mx0 = _mm_mul_pd(tx, WM->dm20); mx1 = _mm_mul_pd(ty, WM->dm21); mx2 = _mm_mul_pd(tz, WM->dm22); mx0 = _mm_add_pd(mx0, _mm_add_pd(mx1, _mm_add_pd(mx2, WM->dm23))); _mm_store_pd(vertex.z + i, mx0); //计算z’(i)和z’(i+1) mx0 = _mm_mul_pd(tx, WM->dm30); mx1 = _mm_mul_pd(ty, WM->dm31); mx2 = _mm_mul_pd(tz, WM->dm32); mx0 = _mm_add_pd(mx0, _mm_add_pd(mx1, _mm_add_pd(mx2, WM->dm33))); _mm_store_pd(vertex.w + i, mx0); }
SSE程序实例
两种不同的数据结构 数组-结构(the array-of-structures format(AoS) ) 结构-数组(the structures-of-arrays data format(SoA) )
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
sse2指令集1移动指令:1. Movapsmovaps XMM,XMM/m128 movaps XMM/128,XMM把源存储器内容值送入目的寄存器,当有m128时,必须对齐内存16字节,也就是内存地址低4位为0.2. Movupsmovups XMM,XMM/m128 movaps XMM/128,XMM把源存储器内容值送入目的寄存器,但不必对齐内存16字节3. Movlpsmovlps XMM,m64把源存储器64位内容送入目的寄存器低64位,高64位不变,内存变量不必对齐内存16字节4. Movhpsmovhps XMM,m64把源存储器64位内容送入目的寄存器高64位,低64位不变,内存变量不必对齐内存16字节.5. Movhlpsmovhlps XMM,XMM把源寄存器高64位送入目的寄存器低64位,高64位不变.6. Movlhpsmovlhps XMM,XMM把源寄存器低64位送入目的寄存器高64位,低64位不变.7. movssmovss XMM,m32/XMM原操作数为m32时:dest[31-00] <== m32 dest[127-32] <== 0原操作数为XMM时: dest[31-00] <== src[31-00] dest[127-32]不变8. movmskpdmovmskpd r32,XMM取64位操作数符号位r32[0] <== XMM[63] r32[1] <== XMM[127] r32[31-2] <== 09. movmskpsmovmskps r32,XMM取32位操作数符号位r32[0] <== XMM[31] r32[1] <== XMM[63] r32[2] <== XMM[95] r32[3] <== XMM[127] r32[31-4] <== 010. pmovmskbpmovmskb r32,XMM取16位操作数符号位具体操作同前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] <== 011. movntpsmovntps m128,XMMm128 <== XMM 直接把XMM中的值送入m128,不经过cache,必须对齐16字节.12. Movntpdmovntpd m128,XMMm128 <== XMM 直接把XMM中的值送入m128,不经过cache,必须对齐16字节.13. Movntimovnti m32,r32m32 <== r32 把32寄存器的值送入m32,不经过cache.14. Movapdmovapd XMM,XMM/m128 movapd XMM/m128,XMM把源存储器内容值送入目的寄存器,当有m128时,必须对齐内存16字节15. Movupdmovupd XMM,XMM/m128 movapd XMM/m128,XMM把源存储器内容值送入目的寄存器,但不必对齐内存16字节.我感觉这两条指令同movaps 和 movups 指令一样,不过又不确定.16. Movlpdmovlpd XMM,m64 movlpd m64,XMM把源存储器64位内容送入目的寄存器低64位,高64位不变,内存变量不必对齐内存16字节17. Movhpdmovhpd XMM,m64 movhpd m64,XMM把源存储器64位内容送入目的寄存器高64位,低64位不变,内存变量不必对齐内存16字节.18. Movdqamovdqa XMM,XMM/m128 movdqa XMM/m128,XMM把源存储器内容值送入目的寄存器,当有m128时,必须对齐内存16字节.19. Movdqumovdqu XMM,XMM/m128 movdqu XMM/m128,XMM把源存储器内容值送入目的寄存器,但不必对齐内存16字节.20. movq2dqmovq2dq XMM,MM把源寄存器内容送入目的寄存器的低64位,高64位清零.21. movdq2qmovdq2q MM,XMM把源寄存器低64位内容送入目的寄存器.22. Movdmovd XMM,r32/m32 movd MM,r32/m32把源存储器32位内容送入目的寄存器的低32位,高96位清零.movd r32/m32,XMM movd r32/m32,MM把源寄存器的低32位内容送入目的存储器32位.23. Movqmovq XMM,XMM/m64 movq MM,MM/m64把源存储器低64位内容送入目的寄存器的低64位,高64位清零.movq m64,XMM把源寄存器的低64位内容送入目的存储器.2 加法操作1. addpsaddps XMM,XMM/m128源存储器内容按双字对齐,共4个单精度浮点数与目的寄存器相加,结果送入目的寄存器,内存变量必须对齐内存16字节2. addsaddss XMM,XMM/m32源存储器的低32位1个单精度浮点数与目的寄存器的低32位1个单精度浮点数相加,结果送入目的寄存器的低32位高96位不变,内存变量不必对齐内存16字节3. addpdaddpd XMM,XMM/m128源存储器内容按四字对齐,共两个双精度浮点数与目的寄存器相加,结果送入目的寄存器,内存变量必须对齐内存16字节.4. addsdaddsd XMM,XMM/m64源存储器的低64位1个双精度浮点数与目的寄存器的低64位1个双精度浮点数相加,结果送入目的寄存器的低64位,高64位不变,内存变量不必对齐内存16字节5. padddpaddd XMM,XMM/m128把源存储器与目的寄存器按双字对齐无符号整数普通相加,结果送入目的寄存器,内存变量必须对齐内存16字节.6. Paddqpaddq XMM,XMM/m128把源存储器与目的寄存器按四字对齐无符号整数普通相加,结果送入目的寄存器,内存变量必须对齐内存16字节.7. Paddqpaddq MM,MM/m64把源存储器与目的寄存器四字无符号整数普通相加,结果送入目的寄存器.8. Pmaddwdpmaddwd 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*b79. Paddsbpaddsb XMM,XMM/m128 paddsb MM,MM/m64源存储器与目的寄存器按字节对齐有符号补码饱和相加,内存变量必须对齐内存16字节. 10. paddswpaddsw XMM,XMM/m128源存储器与目的寄存器按字对齐有符号补码饱和相加,内存变量必须对齐内存16字节.11. paddusbpaddusb XMM,XMM/m128源存储器与目的寄存器按字节对齐无符号饱和相加,内存变量必须对齐内存16字节.12. Padduswpaddusw XMM,XMM/m128源存储器与目的寄存器按字对齐无符号饱和相加,内存变量必须对齐内存16字节.13. Paddbpaddb XMM,XMM/m128源存储器与目的寄存器按字节对齐无符号普通相加,内存变量必须对齐内存16字节.14. Paddwpaddw XMM,XMM/m128源存储器与目的寄存器按字对齐无符号普通相加,内存变量必须对齐内存16字节.15. Padddpaddd XMM,XMM/m128源存储器与目的寄存器按双字对齐无符号普通相加,内存变量必须对齐内存16字节.16. Paddqpaddq XMM,XMM/m128源存储器与目的寄存器按四字对齐无符号普通相加,内存变量必须对齐内存16字节.17.3 减法操作1. subpssubps XMM,XMM/m128源存储器内容按双字对齐,共4个单精度浮点数与目的寄存器相减(目的减去源),结果送入目的寄存器, 内存变量必须对齐内存16字节.2. Subsssubss XMM,XMM/m32源存储器的低32位1个单精度浮点数与目的寄存器的低32位1个单精度浮点数相减(目的减去源), 结果送入目的寄存器的低32位,高96位不变,内存变量不必对齐内存16字节3. Subpdsubpd XMM,XMM/m128把目的寄存器内容按四字对齐,两个双精度浮点数,减去源存储器两个双精度浮点数, 结果送入目的寄存器,内存变量必须对齐内存16字节.4. subsdsubsd XMM,XMM/m128把目的寄存器的低64位1个双精度浮点数,减去源存储器低64位1个双精度浮点数,结果送入目的寄存器的低64位,高64位不变,内存变量不必对齐内存16字节5. Psubdpsubd XMM,XMM/m128把目的寄存器与源存储器按双字对齐无符号整数普通相减,结果送入目的寄存器, 内存变量必须对齐内存16字节.(目的减去源)6. Psubqpsubq XMM,XMM/m128把目的寄存器与源存储器按四字对齐无符号整数普通相减,结果送入目的寄存器, 内存变量必须对齐内存16字节.(目的减去源)7. Psubqpsubq MM,MM/m64把目的寄存器与源存储器四字无符号整数普通相减,结果送入目的寄存器.(目的减去源)8. psubsbpsubsb XMM,XMM/m128源存储器与目的寄存器按字节对齐有符号补码饱和相减(目的减去源),内存变量必须对齐内存16字节.9. Psubswpsubsw XMM,XMM/m128源存储器与目的寄存器按字对齐有符号补码饱和相减(目的减去源),内存变量必须对齐内存16字节.10. Psubusbpsubusb XMM,XMM/m128源存储器与目的寄存器按字节对齐无符号饱和相减(目的减去源),内存变量必须对齐内存16字节.11. Psubuswpsubusw XMM,XMM/m128源存储器与目的寄存器按字对齐无符号饱和相减(目的减去源),内存变量必须对齐内存16字节.12. psubbpsubb XMM,XMM/m128源存储器与目的寄存器按字节对齐无符号普通相减(目的减去源),内存变量必须对齐内存16字节.13. Psubwpsubw XMM,XMM/m128源存储器与目的寄存器按字对齐无符号普通相减(目的减去源),内存变量必须对齐内存16字节.14. Psubdpsubd XMM,XMM/m128源存储器与目的寄存器按双字对齐无符号普通相减(目的减去源),内存变量必须对齐内存16字节.15. Psubqpsubq XMM,XMM/m128源存储器与目的寄存器按四字对齐无符号普通相减(目的减去源),内存变量必须对齐内存16字节.16.4 比较操作1. Maxpsmaxps XMM,XMM/m128源存储器4个单精度浮点数与目的寄存器4个单精度浮点数比较,较大数放入对应目的寄存器,内存变量必须对齐内存16字节.2. Maxssmaxss XMM,XMM/m32源存储器低32位1个单精度浮点数与目的寄存器低32位1个单精度浮点数比较,较大数放入目的寄存器低32位,高96位不变内存变量不必对齐内存16字节3. Minpsminps XMM,XMM/m128源存储器4个单精度浮点数与目的寄存器4个单精度浮点数比较,较小数放入对应目的寄存器,内存变量必须对齐内存16字节.4. minssminss XMM,XMM/m32源存储器低32位1个单精度浮点数与目的寄存器低32位1个单精度浮点数比较,较小数放入目的寄存器低32位,高96位不变内存变量不必对齐内存16字节5. cmppscmpps XMM0,XMM1,imm8 imm8是立即数范围是0~7根据imm8的值进行4对单精度浮点数的比较,符合imm8的就置目的寄存器对应的32位全1,否则全0当imm8 = 0时,目的寄存器等于原寄存器数时,置目的寄存器对应的32位全1,否则全0imm8 = 1 时,目的寄存器小于原寄存器数时,置目的寄存器对应的32位全1,否则全0imm8 = 2 时,目的寄存器小于等于原寄存器数时,置目的寄存器对应的32位全1,否则全0 imm8 = 4 时,目的寄存器不等于原寄存器数时,置目的寄存器对应的32位全1,否则全0 imm8 = 5 时,目的寄存器大于等于原寄存器数时,置目的寄存器对应的32位全1,否则全0 imm8 = 6 时,目的寄存器大于原寄存器数时,置目的寄存器对应的32位全1,否则全06. pcmpeqbpcmpeqb XMM,XMM/m128目的寄存器与源存储器按字节比较,如果对应字节相等,就置目的寄存器对应字节为0ffh,否则为00h内存变量必须对齐内存16字节.7. Pcmpeqwpcmpeqw XMM,XMM/m128目的寄存器与源存储器按字比较,如果对应字相等,就置目的寄存器对应字为0ffffh,否则为0000h, 内存变量必须对齐内存16字节8. Pcmpeqdpcmpeqd XMM,XMM/m128目的寄存器与源存储器按双字比较,如果对应双字相等,就置目的寄存器对应双字为0ffffffffh,否则为00000000h内存变量必须对齐内存16字节9. Pcmpgtbpcmpgtb XMM,XMM/m128目的寄存器与源存储器按字节(有符号补码)比较,如果目的寄存器对应字节大于源存储器,就置目的寄存器对应字节为0ffh, 否则为00h,内存变量必须对齐内存16字节10. Pcmpgtwpcmpgtw XMM,XMM/m128目的寄存器与源存储器按字(有符号补码)比较,如果目的寄存器对应字大于源存储器,就置目的寄存器对应字为0ffffh, 否则为0000h,内存变量必须对齐内存16字节.11. Pcmpgtdpcmpgtd XMM,XMM/m128目的寄存器与源存储器按双字(有符号补码)比较,如果目的寄存器对应双字大于源存储器, 就置目的寄存器对应双字为0ffffffffh,否则为00000000h,内存变量必须对齐内存16字节.5 计算操作1. rcppsrcpps XMM,XMM/m128源存储器4个单精度浮点数的倒数放入对应目的寄存器,内存变量必须对齐内存16字节注:比如2.0E0的倒数为1÷2.0E0 = 5.0E-1, 这操作只有12bit的精度2. rcpssrcpss XMM,XMM/32源存储器低32位1个单精度浮点数的倒数放入目的寄存器低32位,高96位不变3. rsqrtpsrsqrtps XMM,XMM/m128源存储器4个单精度浮点数的开方的倒数放入对应目的寄存器,内存变量必须对齐内存16字节. 比如2.0E0的开方的倒数为1÷√2.0E0 ≈ 7.0711E-1, 这操作只有12bit的精度.4. Rsqrtssrsqrtss XMM,XMM/32源存储器低32位1个单精度浮点数的开方的倒数放入目的寄存器低32位,高96位不变,内存变量不必对齐内存16字节.5. Pavgbpavgb MM,MM/m64 pavgb XMM,XMM/m128把源存储器与目的寄存器按字节无符号整数相加,再除以2,结果四舍五入为整数放入目的寄存器, 源存储器为m128时,内存变量必须对齐内存16字节. 注:此运算不会产生溢出.6. Pavgwpavgw MM,MM/m64 pavgw XMM,XMM/m128把源存储器与目的寄存器按字无符号整数相加,再除以2,结果四舍五入为整数放入目的寄存器, 源存储器为m128时,内存变量必须对齐内存16字节.7. Sqrtpdsqrtpd XMM,XMM/m128源存储器两个双精度浮点数的开方放入对应目的寄存器,内存变量必须对齐内存16字节. 8. Sqrtsdsqrtsd XMM,XMM/m128源存储器低64位1个双精度浮点数的开方放入目的寄存器低64位,高64位不变,内存变量不必对齐内存16字节6 乘法操作1. Mulpsmulps XMM,XMM/m128源存储器内容按双字对齐,共4个单精度浮点数与目的寄存器相乘,结果送入目的寄存器,内存变量必须对齐内存16字节.2. Mulssmulss XMM,XMM/32源存储器的低32位1个单精度浮点数与目的寄存器的低32位1个单精度浮点数相乘,结果送入目的寄存器的低32位,高96位不变,内存变量不必对齐内存16字节3. Mulpdmulpd XMM,XMM/m128源存储器内容按四字对齐,共两个双精度浮点数与目的寄存器相乘,结果送入目的寄存器,内存变量必须对齐内存16字节4. Mulsdmulsd XMM,XMM/m128源存储器的低64位1个双精度浮点数与目的寄存器的低64位1个双精度浮点数相乘,结果送入目的寄存器的低64位,高64位不变,内存变量不必对齐内存16字节5. Pmuludqpmuludq XMM,XMM/m128把源存储器与目的寄存器的低32位无符号整数相乘,结果变为64位,送入目的寄存器低64位, 把源存储器与目的寄存器的高64位的低32位无符号整数相乘,结果变为64位,送入目的寄存器高64位内存变量必须对齐内存16字节.高64位 | 低64位目的寄存器: a0 | a1 | a2 | a3源存储器: b0 | b1 | b2 | b3目的寄存器结果: b1*a1 | b3*a36. Pmuludqpmuludq MM,MM/m64把源存储器与目的寄存器的低32位无符号整数相乘,结果变为64位,送入目的寄存器.7. pmulhwpmulhw XMM,XMM/m128源存储器与目的寄存器按字对齐有符号补码饱和相乘,取结果的高16位放入目的寄存器对应字中. 内存变量必须对齐内存16字节8. pmullwpmullw XMM,XMM/m128源存储器与目的寄存器按字对齐有符号补码饱和相乘,取结果的低16位放入目的寄存器对应字中. 内存变量必须对齐内存16字节.9.7 除法操作1. Divpsdivps XMM,XMM/m128目的寄存器共4个单精度浮点数除以源存储器4个单精度浮点数,结果送入目的寄存器,内存变量必须对齐内存16字节.2. Divssdivss XMM,XMM/32目的寄存器低32位1个单精度浮点数除以源存储器低32位1个单精度浮点数,结果送入目的寄存器的低32位,高96位不变,内存变量不必对齐内存16字节3. Divpddivpd XMM,XMM/m128目的寄存器共两个双精度浮点数除以源存储器两个双精度浮点数,结果送入目的寄存器,内存变量必须对齐内存16字节4. Divsddivsd XMM,XMM/m128目的寄存器低64位1个双精度浮点数除以源存储器低64位1个双精度浮点数,结果送入目的寄存器的低64位,高64位不变,内存变量不必对齐内存16字节.8 位操作1. Andpsandps XMM,XMM/m128源存储器128个二进制位'与'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.2. Orpsorps XMM,XMM/m128源存储器128个二进制位'或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.3. Xorpsxorps XMM,XMM/m128源存储器128个二进制位'异或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.4. Unpckhpsunpckhps XMM,XMM/m128源存储器与目的寄存器高64位按双字交错排列,结果送入目的寄存器,内存变量必须对齐内存16字节.高64位 | 低64位目的寄存器: a0 | a1 | a2 | a3源存储器: b0 | b1 | b2 | b3目的寄存器结果: b0 | a0 | b1 | a15. Unpcklpsunpcklps XMM,XMM/m128源存储器与目的寄存器低64位按双字交错排列,结果送入目的寄存器,内存变量必须对齐内存16字节高64位 | 低64位目的寄存器: a0 | a1 | a2 | a3源存储器: b0 | b1 | b2 | b3目的寄存器结果: b2 | a2 | b3 | a36. Pextrwpextrw 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 87. Pinsrwpinsrw 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 88. Pmaxswpmaxsw MM,MM/m64 pmaxsw XMM,XMM/m128把源存储器与目的寄存器按字有符号(补码)整数比较,大数放入目的寄存器对应字, 源存储器为m128时,内存变量必须对齐内存16字节9. Pmaxubpmaxub MM,MM/m64 pmaxsw XMM,XMM/m128把源存储器与目的寄存器按字节无符号整数比较,大数放入目的寄存器对应字节, 源存储器为m128时,内存变量必须对齐内存16字节.10. pminswpminsw MM,MM/m64 pmaxsw XMM,XMM/m128把源存储器与目的寄存器按字有符号(补码)整数比较,较小数放入目的寄存器对应字, 源存储器为m128时,内存变量必须对齐内存16字节.11. Pminubpminub MM,MM/m64 pmaxsw XMM,XMM/m128把源存储器与目的寄存器按字节无符号整数比较,较小数放入目的寄存器对应字节, 源存储器为m128时,内存变量必须对齐内存16字节12. Maxpdmaxpd XMM,XMM/m128源存储器两个双精度浮点数与目的寄存器两个双精度浮点数比较,较大数放入对应目的寄存器,内存变量必须对齐内存16字节.13. Maxsdmaxsd XMM,XMM/m128源存储器低64位1个双精度浮点数与目的寄存器低64位1个双精度浮点数比较,较大数放入目的寄存器低64位,高64位不变内存变量不必对齐内存16字节.14. Minpdminpd XMM,XMM/m128源存储器两个双精度浮点数与目的寄存器两个双精度浮点数比较,较小数放入对应目的寄存器,内存变量必须对齐内存16字节.15. Minsdminsd XMM,XMM/m128源存储器低64位1个双精度浮点数与目的寄存器低64位1个双精度浮点数比较,较小数放入目的寄存器低64位,高64位不变内存变量不必对齐内存16字节.16. Andpdandpd XMM,XMM/m128源存储器128个二进制位'与'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.17. Andnpdandnpd XMM,XMM/m128目的寄存器128个二进制位先取'非',再'与'源存储器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节18. Orpdorpd XMM,XMM/m128源存储器128个二进制位'或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.19. Xorpdxorpd XMM,XMM/m128源存储器128个二进制位'异或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.20. Pslldqpslldq XMM,imm8把目的寄存器128位按imm8(立即数)指定字节数逻辑左移,移出的字节丢失.imm8 == 1时,代表左移8位,imm8 == 2时,代表左移16位.21. Psrldqpsrldq XMM,imm8把目的寄存器128位按imm8(立即数)指定字节数逻辑右移,移出的字节丢失.imm8 == 1时,代表右移8位,imm8 == 2时,代表右移16位.22. Psllwpsllw XMM,XMM/m128 psllw XMM,imm8把目的寄存器按字由源存储器(或imm8 立即数)指定位数逻辑左移,移出的位丢失. 低字移出的位不会移入高字,内存变量必须对齐内存16字节.23. Psrlwpsrlw XMM,XMM/m128 psrlw XMM,imm8把目的寄存器按字由源存储器(或imm8 立即数)指定位数逻辑右移,移出的位丢失.高字移出的位不会移入低字,内存变量必须对齐内存16字节.24. Pslldpslld XMM,XMM/m128 pslld XMM,XMM imm8把目的寄存器按双字由源存储器(或imm8 立即数)指定位数逻辑左移,移出的位丢失. 低双字移出的位不会移入高双字,内存变量必须对齐内存16字节.25. Psrldpsrld XMM,XMM/m128 psrld XMM,imm8把目的寄存器按双字由源存储器(或imm8 立即数)指定位数逻辑右移,移出的位丢失.高双字移出的位不会移入低双字,内存变量必须对齐内存16字节.pandpand XMM,XMM/m128源存储器128个二进制位'与'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节. 我发现与andpd功能差不多,就不知其它特性是否一样26. Pandnpandn XMM,XMM/m128目的寄存器128个二进制位先取'非',再'与'源存储器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节27. Porpor XMM,XMM/m128源存储器128个二进制位'或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.28. Pxorpxor XMM,XMM/m128源存储器128个二进制位'异或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量必须对齐内存16字节.29. packuswbpackuswb XMM,XMM/m128 packuswb MM,MM/m64把目的寄存器按字有符号数压缩为字节无符号数放入目的寄存器低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| a730. packsswbpacksswb XMM,XMM/m128 packsswb MM,MM/m64把目的寄存器按字有符号数压缩为字节有符号数放入目的寄存器低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| a731. packssdwpackssdw 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 | a332. punpckldqpunpckldq XMM,XMM/m128把源存储器与目的寄存器低64位按双字交错排列,内存变量必须对齐内存16字节. 高64位 | 低64位目的寄存器: a0 | a1 | a2 | a3源寄存器: b0 | b1 | b2 | b3目的寄存器排列结果: b2 | a2 | b3 | a333. punpckhdq把源存储器与目的寄存器高64位按双字交错排列,内存变量必须对齐内存16字节. 高64位 | 低64位目的寄存器: a0 | a1 | a2 | a3源寄存器: b0 | b1 | b2 | b3目的寄存器排列结果: b0 | a0 | b1 | a134. punpcklwd把源存储器与目的寄存器低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 | a735. punpckhwdpunpckhwd 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 | a336. punpcklbwpunpcklbw 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 37. punpckhbw把源存储器与目的寄存器高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| a738. shufpsshufps XMM,XMM/m128,imm8把源存储器与目的寄存器按双字划分,由imm8(立即数)八个二进制位(00~11,00^11,00~11,00~11)指定排列, 内存变量必须对齐内存16字节.目的寄存器高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 h39. shufpdshufpd XMM,XMM/m128,imm8(0~255) imm8(操作值) = imm8(输入值) mod 4把源存储器与目的寄存器按四字划分,由imm8(立即数)4个二进制位(0~1,0^1,0~1,0~1)指定排列, 内存变量必须对齐内存16字节.目的寄存器高64位放源存储器被指定数,目的寄存器低64位放目的寄存器被指定数.当XMM0 = 1111111122222222 3333333344444444 hXMM1 = 5555555566666666 aaaaaaaacccccccc h,执行shufpd XMM0,XMM1,101001 1 0 b 则XMM0 = 5555555566666666 3333333344444444 h40. pshuflwpshuflw XMM,XMM/m128,imm8(0~255)先把源存储器的高64位内容送入目的寄存器的高64位,然后用imm8将源存储器的低64位4个字选入目的寄存器的低64位,内存变量必须对齐内存16字节.源寄存器低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 hXMM1 = 5555555566666666 7777 8888 9999 cccc h,执行pshuflw XMM0,XMM1,10 10 01 10 b则XMM0 = 5555555566666666 8888 8888 9999 8888 h41. pshufhwpshufhw XMM,XMM/m128,imm8(0~255)先把源存储器的低64位内容送入目的寄存器的低64位,然后用imm8将源存储器的高64位4个字选入目的寄存器的高64位,内存变量必须对齐内存16字节.源寄存器高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 hXMM1 = 7777 8888 9999 cccc 5555555566666666 h,执行pshufhw XMM0,XMM1,10 10 01 10 b则XMM0 = 8888 8888 9999 8888 5555555566666666 h42. pshufdpshufd XMM,XMM/m128,imm8(0~255)将源存储器的4个双字由imm8指定选入目的寄存器,内存变量必须对齐内存16字节.源寄存器: 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 h9 数据类型操作43. cvtpi2pscvtpi2ps XMM,MM/m64源存储器64位两个32位有符号(补码)整数转为两个单精度浮点数,放入目的寄存器低64中,高64位不变.44. cvtsi2sscvtsi2ss XMM,r32/m32源存储器1个32位有符号(补码)整数转为1个单精度浮点数,放入目的寄存器低32中,高96位不变.45. cvtps2picvtps2pi MM,XMM/m64把源存储器低64位两个32位单精度浮点数转为两个32位有符号(补码)整数,放入目的寄存器46. cvttps2picvttps2pi MM,XMM/m64类似于cvtps2pi,截断取整.47. cvtss2sicvtss2si r32,XMM/m32把源存储器低32位1个单精度浮点数转为1个32位有符号(补码)整数,放入目的寄存器. 48. cvttss2sicvttss2si r32,XMM/m32类似cvtss2si,截断取整.49. cvtps2pdcvtps2pd XMM,XMM/m64把源存储器低64位两个单精度浮点数变成两个双精度浮点数,结果送入目的寄存器.50. cvtss2sdcvtss2sd XMM,XMM/m32把源存储器低32位1个单精度浮点数变成1个双精度浮点数,结果送入目的寄存器的低64位,高64位不变.51. cvtpd2ps把源存储器两个双精度浮点数变成两个单精度浮点数,结果送入目的寄存器的低64位,高64位清零, 内存变量必须对齐内存16字节.^特殊状态^3.14E5 (表示负无穷大)52. cvtsd2sscvtsd2ss XMM,XMM/m64把源存储器低64位1个双精度浮点数变成1个单精度浮点数,结果送入目的寄存器的低32位,高96位不变.53. cvtpd2picvtpd2pi MM,XMM/m128把源存储器两个双精度浮点数变成两个双字有符号整数,结果送入目的寄存器,内存变量必须对齐内存16字节. 如果结果大于所能表示的范围,那么转化为80000000h(正数也转为此值).54. cvttpd2picvttpd2pi MM,XMM/m128类似于cvtpd2pi,截断取整.55. cvtpi2pdcvtpi2pd XMM,MM/m64把源存储器两个双字有符号整数变成两个双精度浮点数,结果送入目的寄存器.56. cvtpd2dqcvtpd2dq XMM,XMM/m128。