• fpu,mmx以及sse寄存器的少量简介


    FPU: 8个80位浮点寄存器(数据),16位状态寄存器,16位控制寄存器,16为标识寄存器。
         使用FPU指令对这些寄存器进行操作,这些寄存器构成一个循环栈,st7栈底,st0栈顶,
         当一个值被压入时,被存入st0,原来st0中的值被存入st7
    MMX: 将8个FPU寄存器重命名为8个64位MMX寄存器,即mm0到mm7。[号称多媒体处理技术]
         57条MMX指令,加快了整形浮点运算,但是对于复杂浮点运算无帮助

    SSE: 8个128位寄存器(从xmm0到xmm7),MXSCR寄存器,EFLAGS寄存器,专有指令(复杂浮点运算)
    SSE2: 寄存器和SSE相同,增加了5种数据类型(都是128位),专有指令
    SSE3: 进增加了几个新的指令

    由于MMX使用的寄存器影射到FPU寄存器上,所以MMX指令执行前,需要保存FPU堆栈。

    示例1,FPU寄存器及指令使用(下面所有程序都使用at&t风格汇编):
    data1:
            .byte 0x34, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    data2:
            .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    .section .text
    .globl _start
    _start:
            nop
            fbld  data1     压入st0
            fimul data2     st0中的值和data2相乘,保存在st0中
            fbstp data1     st0弹出到内存44


    示例2, SSE寄存器及指令使用
    .lcomm data 16
    value1:
            .float 12.34, 2345.543, -3493.2, 0.44901
    value2:
            .float -54439.234, 23231.4, 1.0098, 0.000003
    .section .text
    .globl _start
    _start:
            movups value1, %xmm0
            movups value2, %xmm1
            movups %xmm0, %xmm2
            movups %xmm0, data

    由于MMX技术处理的是由几个并行紧缩型数据组合成的一个64位数,因此在MMX运算中,例如算术运算,比较运算,逻辑运算和移位运算等,都是对应的紧缩型数据独立于其他的数据并行进行运算,互相不能影响,也不能简单的当成一个整体的连续的64位数来对待。所以在运算过程中就要注意解决紧缩型数据之间的边界越界问题,因此产生了绕转及饱和这新的MMX运算原则。
      绕转运算:例如带绕转的无符号紧缩型字相加,虽然是64位的紧缩数相加,但是每个紧缩数是由4个独立的16位小整型紧缩型字组成,所以其中每个对应的16位紧缩型字的加法都要独立于其他的加法并行进行。紧缩型字的边界之间不能产生进位或借位,其中每个字边界之间的进位或借位被丢掉,称之为绕转。这样就保证了64位数内4个独立的16位字数据之间的正常并行运算。
      饱和运算:例如带饱和的无符号紧缩型字相加减,当产生一个越界的结果时,边界之间的进位或借位被丢掉,且上溢时本紧缩型字取最大的可表示值为FFFFH,下溢时本紧缩型字取最小的可表示值为0000H,即其值被饱和了。饱和运算对像素运算来说很重要,避免了绕转运算带来的使一个黑(白)像素突然变成白(黑)像素的可能。而对带符号的16位字而言,最大和最小的饱和值为7FFFH和8000H。
      MMX指令中还特别增加了脱胎于DSP的关键的乘和累加指令,能够一次处理4个16位字的4次乘法和2次加法(A3B3+A2B2+A1B1+A0B0)。对许多信号处理算法来说,如向量点积,矩阵相乘,FIR和IIR滤波,FFT,DCT等,该指令十分重要而有效。
      可见,利用MMX技术进行多媒体应用的并行计算比不用MMX技术要节省不少指令和运行时间。

    转载自:http://wordpad.blog.sohu.com/43301264.html


  • 相关阅读:
    阅读《Android 从入门到精通》(29)——四大布局
    UISegmentedControl 修改字体大小 和 颜色
    UITableView Scroll to top 手动设置tableview 滚动到 顶部
    xcode arc 下使用 block警告 Capturing [an object] strongly in this block is likely to lead to a retain cycle” in ARC-enabled code
    iOS key value coding kvc在接收json数据与 model封装中的使用
    NSData 转 bytes 字节数据
    git commit 出现 changes not staged for commit 错误
    iOS exit(),abort(),assert()函数区别
    ios 程序发布使用xcode工具Application Loader 正在通过ITUNES STORE进行鉴定错误
    iOS mac添加证书 不能修改“System Roots”钥匙串错误
  • 原文地址:https://www.cnblogs.com/sifenkesi/p/2041252.html
Copyright © 2020-2023  润新知