⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simd.txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 5 页
字号:
        则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 + -