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

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

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.CE修改游戏特例说明 模拟器游戏不能直接修改游戏的程序代码(即不能直接使用代码注入的手段修改code段代码),...
    LazzMan阅读 13,574评论 0 8
  • 在编程中我们总要进行一些数学运算以及数字处理,尤其是浮点数的运算和处理,这篇文章主要介绍C语言下的数学库。而其他语...
    欧阳大哥2013阅读 10,787评论 0 12
  • 在我们的生活与工作中所使用到的计算机都是基于冯诺依曼结构实现的,冯诺依曼结构又称冯诺依曼模型或普林斯顿结构,它是一...
    SylvanasSun阅读 8,461评论 1 6
  • 定点小数运算 来自:http://www.eepw.com.cn/article/17893.htm 在DSP世界...
    郝宇峰阅读 13,257评论 0 2
  • 不愿睡的凌晨 夜风里 城在呼吸 一紧一松 街灯玩弄黑影 跳动的鬼火 点点光 融了黑魆魆的墙 为了记住醒着 为了忘却...
    稻香草木中阅读 1,279评论 3 0

友情链接更多精彩内容