• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天衣有縫

            冠蓋滿京華,斯人獨(dú)憔悴~
            posts - 35, comments - 115, trackbacks - 0, articles - 0
               :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
            為什么要需要FPU和MMX/SSE?
            提供了SIMD環(huán)境(single instruction multi data),即單指令多數(shù)據(jù)。
            內(nèi)嵌浮點(diǎn)運(yùn)算單元,64及128位寄存器等。甚至sin/cos等數(shù)學(xué)函數(shù)也囊括其中,
            著名的xvid項(xiàng)目就是使用gcc編譯后使用MMX/SSE優(yōu)化匯編的典型案例。

            轉(zhuǎn)載請(qǐng)注明原創(chuàng):http://www.shnenglu.com/jinglexy
            msn and mail: jinglexy at yahoo dot com dot cn 上海體育館2007.4.18

            FPU: 8個(gè)80位浮點(diǎn)寄存器(數(shù)據(jù)),16位狀態(tài)寄存器,16位控制寄存器,16為標(biāo)識(shí)寄存器。
                 使用FPU指令對(duì)這些寄存器進(jìn)行操作,這些寄存器構(gòu)成一個(gè)循環(huán)棧,st7棧底,st0棧頂,
                 當(dāng)一個(gè)值被壓入時(shí),被存入st0,原來st0中的值被存入st7
            MMX: 將8個(gè)FPU寄存器重命名為8個(gè)64位MMX寄存器,即mm0到mm7。
                 57條MMX指令,加快了整形浮點(diǎn)運(yùn)算,但是對(duì)于復(fù)雜浮點(diǎn)運(yùn)算無幫助

            SSE: 8個(gè)128位寄存器(從xmm0到xmm7),MXSCR寄存器,EFLAGS寄存器,專有指令(復(fù)雜浮點(diǎn)運(yùn)算)
            SSE2: 寄存器和SSE相同,增加了5種數(shù)據(jù)類型(都是128位),專有指令
            SSE3: 僅增加了幾個(gè)新的指令

            由于MMX使用的寄存器影射到FPU寄存器上,所以MMX指令執(zhí)行前,需要保存FPU堆棧。

            示例1,F(xiàn)PU寄存器及指令使用(下面所有程序都使用at&t風(fēng)格匯編):
            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彈出到內(nèi)存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


            Feedback

            # re: fpu, mmx及sse的一些 介紹(原創(chuàng))  回復(fù)  更多評(píng)論   

            2008-02-19 14:47 by 海楓
            你好,我最近也在看FPU的資料(Intel CPU的官方文檔)

            想向你請(qǐng)教一下:
            FPU,SEE和MMX是不是有重疊的部分呢?

            在Intel CPU下的GCC對(duì)于浮點(diǎn)計(jì)算部分代碼是不是轉(zhuǎn)換上只用FPU的指令呢?
            下面是我在Linux下跑的一個(gè)例子,前一部分代碼是C源代碼,后一部分代碼是GCC處理后的相應(yīng)匯編代碼,我發(fā)現(xiàn)里面只有涉及FPU的東西,而沒有MMX和SEE。

            ylin@ylin:~/program/c$ cat double.c

            double sum(double s1, double s2)
            {
            int i = 1;
            double c = 3.0;
            c += s1;
            c += s2;
            c += i;

            return c;
            }


            void test()
            {
            sum(1.0, 2.0);
            }
            ylin@ylin:~/program/c$ cat double.s
            .file "double.c"
            .section .rodata
            .align 8
            .LC0:
            .long 0
            .long 1074266112
            .text
            .globl sum
            .type sum, @function
            sum:
            pushl %ebp
            movl %esp, %ebp
            subl $32, %esp
            movl 8(%ebp), %eax
            movl %eax, -24(%ebp)
            movl 12(%ebp), %eax
            movl %eax, -20(%ebp)
            movl 16(%ebp), %eax
            movl %eax, -32(%ebp)
            movl 20(%ebp), %eax
            movl %eax, -28(%ebp)
            movl $1, -4(%ebp)
            fldl .LC0
            fstpl -16(%ebp)
            fldl -16(%ebp)
            faddl -24(%ebp)
            fstpl -16(%ebp)
            fldl -16(%ebp)
            faddl -32(%ebp)
            fstpl -16(%ebp)
            fildl -4(%ebp)
            fldl -16(%ebp)
            faddp %st, %st(1)
            fstpl -16(%ebp)
            fldl -16(%ebp)
            leave
            ret
            .size sum, .-sum
            .section .rodata
            .align 8
            .LC2:
            .long 0
            .long 1073741824
            .text
            .globl test
            .type test, @function
            test:
            pushl %ebp
            movl %esp, %ebp
            subl $16, %esp
            fldl .LC2
            fstpl 8(%esp)
            fld1
            fstpl (%esp)
            call sum
            fstp %st(0)
            leave
            ret
            .size test, .-test
            .ident "GCC: (GNU) 4.1.2 (Ubuntu 4.1.2-0ubuntu4)"
            .section .note.GNU-stack,"",@progbits

            # re: fpu, mmx及sse的一些 介紹(原創(chuàng))[未登錄]  回復(fù)  更多評(píng)論   

            2008-03-19 10:44 by 補(bǔ)考少年
            [b]原始短消息:[/b] [url=http://bbs.chinaunix.net/pm.php?action=view&folder=inbox&pmid=757158]你好![/url]
            [quote]我在你的博客中有留言!!
            想問你個(gè)問題!
            期待你的回復(fù)!![/quote]


            很抱歉,才看到你的短信
            FPU,SEE和MMX是不是有重疊的部分呢?
            你是說寄存器重疊嗎?fpu和mmx使用相同的寄存器,名字不同,使用任意一個(gè)之前最好保存相關(guān)上下文寄存器。
            sse和sse2只有比較新的cpu(pII以上)才支持,為了保證兼容性,默認(rèn)編譯器不會(huì)使用它。
            gcc幫助中有:
            i386 and x86-64 Options -mtune=cpu-type -march=cpu-type -mfp-
            math=unit -masm=dialect -mno-fancy-math-387 -mno-fp-ret-in-387
            -msoft-float -msvr3-shlib -mno-wide-multiply -mrtd -malign-dou-
            ble -mpreferred-stack-boundary=num -mmmx -msse -msse2 -msse3
            -m3dnow -mthreads -mno-align-stringops -minline-all-stringops
            -mpush-args -maccumulate-outgoing-args -m128bit-long-double
            -m96bit-long-double -mregparm=num -momit-leaf-frame-pointer
            -mno-red-zone -mno-tls-direct-seg-refs -mcmodel=code-model -m32
            -m64
            就像沒有fpu的時(shí)候使用libc中軟浮點(diǎn)一樣,默認(rèn)gcc對(duì)一些復(fù)雜算法使用fpu指令和軟件算法來解決
            可以比較一下:
            gcc -c double.c -o double -msse2
            objdump -d double
            gcc -c double.c -o double -m3dnow
            objdump -d double
            對(duì)優(yōu)化的一些猜測(cè):針對(duì)各個(gè)平臺(tái)編譯一套dll或.so(不同的編譯優(yōu)化選項(xiàng)),然后啟動(dòng)時(shí)判斷平臺(tái),加載不同的dll

            具體的我也沒深入研究過,都是一知半解,希望對(duì)你有幫助
            亚洲AV无码久久精品狠狠爱浪潮| 伊人久久大香线蕉av不卡| 久久婷婷国产综合精品| 无码超乳爆乳中文字幕久久| 欧美日韩精品久久免费| 日韩人妻无码精品久久免费一| 国产亚洲综合久久系列| A级毛片无码久久精品免费| 久久久久亚洲精品中文字幕| 人人妻久久人人澡人人爽人人精品| 国产一区二区久久久| 午夜欧美精品久久久久久久 | 久久久久99精品成人片欧美| 精品免费久久久久久久| 久久久久久无码国产精品中文字幕 | 91精品国产色综久久| 久久久久亚洲精品男人的天堂| 久久这里只有精品首页| 久久精品国产精品国产精品污| 久久久国产精品| 91视频国产91久久久| 合区精品久久久中文字幕一区| 久久国产精品一国产精品金尊| 久久精品国产一区二区| 久久精品99久久香蕉国产色戒| 欧美激情精品久久久久久久| 久久er热视频在这里精品| 久久人人爽人人爽人人av东京热| 青青青青久久精品国产h| 男女久久久国产一区二区三区 | 久久九九兔免费精品6| 一级做a爱片久久毛片| 精品熟女少妇AV免费久久| 国产精品免费看久久久香蕉| 久久久女人与动物群交毛片| 亚洲精品tv久久久久久久久久| 欧美综合天天夜夜久久| 日韩人妻无码一区二区三区久久| 女人高潮久久久叫人喷水| 欧美国产成人久久精品| 久久国产视频99电影|