美文网首页
SSE2指令集系列之一----浮点运算指令

SSE2指令集系列之一----浮点运算指令

作者: Justin_901e | 来源:发表于2019-07-17 13:58 被阅读0次

SSE2与SSE1使用相同寄存器,指令描述约定:

MM指64位MMX寄存器

XMM指128XMM寄存器

m32 指32位内存变量

m128指128位内存变量

本小结主要描述双精度浮点运算指令

1.  数据搬移指令

        movapd XMM,XMM/m128

        movapd XMM/m128,XMM

        把源存储器内容值送入目的寄存器,当有m128时,内存变量地址必须16字节对齐.

        movupd XMM,XMM/m128 

        movupd XMM/m128,XMM

        把源存储器内容值送入目的寄存器,内存变量地址不必对齐16字节.

        两条指令同SSE1的浮点搬移指令movaps 和 movups 指令类似

        movlpd XMM,m64 

        movlpd m64,XMM

       把源存储器64位内容送入目的寄存器低64位,高64位不变,内存变量地址不必对齐16字节.

        movhpd XMM,m64 

        movhpd m64,XMM

        把源存储器64位内容送入目的寄存器高64位,低64位不变,内存变量地址不必对齐16字节.

2.    浮点常用算数运算指令

        addpd XMM,XMM/m128        

        addsd XMM,XMM/m128

        subpd XMM,XMM/m128     

        subsd XMM,XMM/m128

        mulpd XMM,XMM/m128          

        mulsd XMM,XMM/m128    

        divpd XMM,XMM/m128        

        divsd XMM,XMM/m128

        sqrtpd XMM,XMM/m128       

        sqrtsd XMM,XMM/m128

        maxpd XMM,XMM/m128     

        maxsd XMM,XMM/m128

        minpd XMM,XMM/m128

        minsd XMM,XMM/m128

 小结: 

     1. 以pd结尾的指令对两个双精度浮点数执行相同的运算

      2. 以sd结尾的指令只对低64位双精度执行运算,高64位保持不变。

      3. 当有m128存储器是要求内存地址必须为16字节对齐。

 3. 位运算指令

  andpd XMM,XMM/m128

  源存储器128个二进制位'与'目的寄存器128个二进制位,结果送入目的寄存器,内存变量地址必须对齐16字节边界.

  andnpd XMM,XMM/m128

  目的寄存器128个二进制位先取'非',再'与'源存储器128个二进制位,结果送入目的寄存器,内存变量地址必须对齐16字节边界

  orpd XMM,XMM/m128

  源存储器128个二进制位'或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量地址必须对齐16字节边界

  xorpd XMM,XMM/m128

  源存储器128个二进制位'异或'目的寄存器128个二进制位,结果送入目的寄存器,内存变量地址必须对齐16字节边界

4. 数据类型转换指令

     4.1 32位浮点与64位浮点之间的转换

        cvtps2pd XMM,XMM/m64

        把源存储器低64位两个单精度浮点数变成两个双精度浮点数,结果送入目的寄存器.

        cvtss2sd XMM,XMM/m32

        把源存储器低32位1个单精度浮点数变成1个双精度浮点数,结果送入目的寄存器的低64位,高64位不变.

        cvtpd2ps XMM,XMM/m128

        把源存储器两个双精度浮点数变成两个单精度浮点数,结果送入目的寄存器的低64位,高64位清零,

        cvtsd2ss XMM,XMM/m64

        把源存储器低64位1个双精度浮点数变成1个单精度浮点数,结果送入目的寄存器的低32位,高96位不变.

     4.2  浮点数与32位整数之间的转换

      4.2.1 双精度与整数之间转换

        cvtpd2pi MM,XMM/m128

        把源存储器两个双精度浮点数变成两个双字有符号整数,结果送入目的寄存器,内存变量必须对齐内存16字节.

        如果结果大于所能表示的范围,那么转化为80000000h(正数也转为此值).

        当XMM1 = 0x 0dd1a5e1f35aec736   41132a4000000000,执行cvtpd2pi MM0,XMM1

        则 MM0 = 0x 80000000 0004ca90

        因为0dd1a5e1f35aec736h(双精度浮点数) = -3.14E140 超过 80000000h所以变为80000000h

        而41132a4000000000h(双精度浮点数) = 3.14E5,所以转为314000 = 0004ca90h(有符号整数)

    cvtpi2pd XMM,MM/m64

        把源存储器两个双字有符号整数变成两个双精度浮点数,结果送入目的寄存器.

        cvtpd2dq XMM,XMM/m128

        把源存储器两个双精度浮点数变成两个双字有符号整数

        结果送入目的寄存器的低64位,高64位清零,内存变量必须对齐内存16字节.

        此运算与cvtpd2pi类似但目的寄存器变为XMM.

        cvtdq2pd XMM,XMM/m128

        把源存储器低64位两个双字有符号整数变成两个双精度浮点数,结果送入目的寄存器,内存变量必须对齐内存16字节.

     cvtsd2si r32,XMM/m64

         把源存储器低64位1个双精度浮点数变成1个双字有符号整数,结果送入目的寄存器.

         此指令目的寄存器是32位通用寄存器

   cvtsi2sd XMM,r32/m32

        把源存储器1个双字有符号整数变成1个双精度浮点数,结果送入目的寄存器的低64位,高64位不变.

 4.2.2 单精度浮点与整数之间转换

        cvtps2dq XMM,XMM/m128

        把源存储器4个单精度浮点数变成4个双字有符号整数,结果送入目的寄存器,内存变量必须对齐内存16字节.

        cvtdq2ps XMM,XMM/m128

        把源存储器4个双字有符号整数变成4个单精度浮点数,结果送入目的寄存器,内存变量必须对齐内存16字节.

---------------------

作者:celerychen2009

来源:CSDN

原文:https://blog.csdn.net/celerychen2009/article/details/8934972

版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章

  • SSE2指令集系列之一----浮点运算指令

    SSE2与SSE1使用相同寄存器,指令描述约定: MM指64位MMX寄存器XMM指128XMM寄存器m32 指32...

  • Linux 概述

    一. CPU的种类: 最新的Intel/AMD的x86架构中 多媒体微指令集:MMX,SSE,SSE2,SSE3,...

  • JavaScript变量语法

    代码的执行过程 指令:指令集,分为精简指令集和复杂指令集; 两种指令的区别:运算上面不一样,使用的0 1代码也是不...

  • 2018-09-17js变量

    1.代码的执行过程 (1)指令:指令级集,分为精简指令集和复杂指令集。 注:计算机是没有减法运算,也没有除法和乘法...

  • javascript变量

    1.代码的执行过程 指令:指令集,分为精简指令集和复杂指令集 区别:运算上不一样,使用的01代码不一样。计算机是没...

  • 日记随笔32/64位cpu 2019-11-30

    CPU CPU可分为精简指令集CPU(如移动端的ARM系列)和复杂指令集CPU(如Intel core和AMD系列...

  • CPU种类

    ref:鸟哥的Linux私房菜 精简指令集:RISC SPARC系列,PowerPC,ARM 复杂指令集:CISC...

  • 系统架构设计师真题解析(8)—— 系统性能

    1 定点运算速度 峰值 MIPS (每秒百万次指令数)用来描述计算机的定点运算速度,通过对计算机指令集中基本指令指...

  • 安卓逆向系列教程(一)Dalvik 指令集

    安卓逆向系列教程(一)Dalvik 指令集 作者:飞龙 寄存器 Dalvik 指令集完全基于寄存器,也就是说,没有...

  • ARM汇编代码速成。

    ARM指令集 1.跳转指令 2.存储器与寄存器交互数据指令 核心 3.数据传送指令 4.数据算术运算指令 5.数据...

网友评论

      本文标题:SSE2指令集系列之一----浮点运算指令

      本文链接:https://www.haomeiwen.com/subject/mmyqlctx.html