文档章节

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

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:45
字数 1356
阅读 13
收藏 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字节.


本文转载自:http://www.cnblogs.com/celerychen/archive/2013/05/16/3588205.html

共有 人打赏支持
abcijkxyz
粉丝 63
博文 6196
码字总数 1876
作品 0
深圳
项目经理
微软提前结束部分 Windows 7 电脑的更新功能

前不久,微软悄然关掉了官方论坛Windows 7分版的支持,也就是不再有工作人员上线收集和回应坛友的反馈。在距离2020年1月结束Windows 7外延支持越来越近、Windows 10升级推广压力很大的情况下...

达尔文
06/25
0
0
armeabi和armeabi-v7a 以及x86

原文:http://blog.csdn.net/dxpqxb/article/details/7721156 armeabi和armeabi-v7a 在我们android APK的根目录有一个 libs文件夹,此文件夹下包含了armeabi 和armeabi-v7a两个文件夹,我们的...

QGlaunch
2015/12/23
99
0
【JZ2440】自我学习记录【知识点0】【ARM指令集体系结构和ARM系列】

本文会介绍:1、ARM指令集体系结构及特点; 2、基于ARM指令集体系结构设计的不同CPU家族及特点; 3、ARM指令集体系结构和ARM处理器家族的区别。 ARM系列微处理器的核心及体系结构 序号 ARM微...

huayangshiboqi
2017/12/13
0
0
linux /proc/cpuinfo文件分析

基于不同指令集(ISA)的CPU产生的/proc/cpuinfo文件不一样,基于X86指令集CPU的/proc/cpuinfo文件包含如下内容: processor  : 0 vendorid  :GenuineIntel cpu family  :6 model ...

wulei163
2014/01/03
0
0
cpu指令集包括哪些?

如题!我知道有mmx,sse等等.可是mmx指令集是在96年才有的, 而之前386,486,586等那些呢,包含哪些指令,相关资料在哪下载? 是不是sse1包含mmx,,,,,,,sse2包含sse1,,,,,,,sse3包含sse2 我知道去英...

音乐&编程
2012/09/14
2.1K
3

没有更多内容

加载失败,请刷新页面

加载更多

Flask 开发填坑

插件的选择: flask-security 真的是个鸡肋啊。自带的页面,好丑。还不如用flask-login来做呢。

pearma
14分钟前
0
0
讲述下 :LVM逻辑卷管理遇到的问题

LVM学习逻辑卷管理创建逻辑卷遇到的问题 1 实验环境 系统 内核 发行版本 CentOS 2.6.32-754.2.1.el6.x86_64 CentOS release 6.10 (Final) 由于是最小化安装没有xfs命令,yum安装如下包支持此...

linuxprobe16
50分钟前
0
0
day95-20180922-英语流利阅读-待学习

Hey Jude 半个世纪传唱不衰的背后故事 毛西 2018-09-22 1.今日导读 2004 年,The Beatles 被《滚石》杂志选为“历史上最伟大的 50 位流行音乐家的第一位”。这四名来自英国利物浦的男孩不仅对...

飞鱼说编程
57分钟前
1
0
OSChina 周六乱弹 —— 放假前期焦虑症晚期

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @andonny :分享Matteo的单曲《Panama》: 《Panama》- Matteo 手机党少年们想听歌,请使劲儿戳(这里) @新垣吉衣OSC :我发现只要去有小朋友...

小小编辑
今天
193
10
wait()被notify()后,接着执行wait()后面的语句

wait()被notify()后,接着执行wait()后面的语句

noteman
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部