求一份SSE指令的说明文档.

解决方案 »

  1.   

    有一种工具叫googleSSE指令  作者:HAM(参考资料:Intel 开发文档)
      大部分涉及到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位不变.
      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.   

    我肯定Google过,不过都不太全,包括你发的也不全嘛.
      

  3.   

    SSE 指令表SSE 提供标量与包裹式(packed)浮点指令。浮点指令:
    内存到暂存器/暂存器到内存/暂存器之间的资料搬移
    标量 – MOVSS
    包裹式 – MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS
    数学运算
    标量 – ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS
    包裹式 – ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS
    比较
    标量 – CMPSS, COMISS, UCOMISS
    包裹式 – CMPPS
    资料拆包(unpack)与随机搬移(shuffle)
    包裹式 – SHUFPS, UNPCKHPS, UNPCKLPS
    资料型态转换
    标量 – CVTSI2SS, CVTSS2SI, CVTTSS2SI
    包裹式 – CVTPI2PS, CVTPS2PI, CVTTPS2PI
    逐位逻辑运算
    包裹式 – ANDPS, ORPS, XORPS, ANDNPS整数指令:
    数学运算
    PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW
    资料搬移
    PEXTRW, PINSRW
    其他
    PMOVMSKB, PSHUFW其他指令:
    MXCSR 管理
    LDMXCSR, STMXCSR
    快取与内存管理
    MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE
      

  4.   

    自己去intel网页去下,都是免费的文档,定期更新的
      

  5.   

    http://softpixel.com/~cwright/programming/simd/sse3.php
      

  6.   

    http://developer.intel.com/products/processor/manuals/index.htm卷1、卷2里都有,如果需要经常写汇编的话这两卷一定是要下的