• <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>
            cyt

            froofyJIT,來自 http://fzort.org/bi/sw/froofy/

            先說說 GNU Lightning,來自 http://www.gnu.org/software/lightning/lightning.html
            一個GNU的項目,目的是可以在C/C++中寫跨CPU的匯編代碼,目前支持CPU有x86, SPARC和PowerPC (但浮點數操作只支持x86系列)。
            個人覺得還是挺有意思的一個項目。有時候一些關鍵操作還是需要匯編來處理一下,例如加解密運算、圖像處理等等。以前都是直接嵌套匯編,但這樣一來就會失去C代碼的通用性;又或者通過#define來實現多個CPU下的匯編實現。如果用GNU Lightning,至少代碼統一,管理上好很多。不過換來的代價就是要多學一門“匯編”了。

            GNU Lightning寫的代碼也不是很好看,原因是它本身是C代碼,調用的是C函數形式。froofyJIT就是解決這個問題,下面是froofyJIT重寫GNU Lightning中的計算費波納數列的代碼的節選:

            GNU Lightning:

            typedef int (*pifi)(int);
            pifi      nfibs 
            = (pifi) (jit_set_ip(codeBuffer).iptr);
            int        in;                /* offset of the argument */
            jit_insn  
            *ref;            /* to patch the forward reference */
                        jit_prolog   (
            1);
            in =  jit_arg_ui   ();
                        jit_getarg_ui(JIT_V0, 
            in);              /* V0 = n */
            ref = jit_blti_ui  (jit_forward(), JIT_V0, 2);
                        jit_subi_ui  (JIT_V1, JIT_V0, 
            1);       /* V1 = n-1 */
                        jit_subi_ui  (JIT_V2, JIT_V0, 
            2);       /* V2 = n-2 */
                        jit_prepare_i(
            1);
                        jit_pusharg_ui(JIT_V1);
                        jit_finish(nfibs);
                        jit_retval_i (JIT_V1);                   
            /* V1 = nfibs(n-1) */
                        jit_prepare_i(
            1);
                        jit_pusharg_ui(JIT_V2);
                        jit_finish(nfibs);
                        jit_retval_i (JIT_V2);                   
            /* V2 = nfibs(n-2) */
                        jit_addi_ui(JIT_V1,  JIT_V1,  
            1);
                        jit_addr_ui(JIT_RET, JIT_V1, JIT_V2);   
            /* RET = V1 + V2 + 1 */
                        jit_ret();
            jit_patch(
            ref);                               /* patch jump */
                        jit_movi_i(JIT_RET, 
            1);                 /* RET = 1 */
                        jit_ret();
            /* call the generated code, passing 32 as an argument */
            jit_flush_code(codeBuffer, jit_get_ip().ptr);

            froofyJIT:

            typedef int (*pifi)(int);
            pifi nfibs;
            int in;
            {
                    
            using namespace froofy::jit;
                    label
            <> basis;

            nfibs
            /  !org,           codeBuffer;
                    prolog,         
            10false;
                    
            !arg<ui>        in;
                    getarg
            <ui>      v0, in;
                    blti
            <ui>        basis, v0, 2;
                    subi
            <ui>        v1, v0, 1;
                    subi
            <ui>        v2, v0, 2;
                    prepare
            <i>      1;
                    pusharg
            <ui>     v1;
                    finish,         nfibs;
                    retval
            <i>       v1;
                    prepare
            <i>      1;
                    pusharg
            <ui>     v2;
                    finish,         nfibs;
                    retval
            <i>       v2;
                    addi
            <ui>        v1, v1, 1;
                    addr
            <ui>        rr, v1, v2;
                    ret,            
            10false;
            basis
            /  movi<i>         rr, 1;
                    ret,            
            10false;
                    
            !end,           codeBuffer;
            }


            明顯帥了很多。(不要問我這些代碼的含義,我自己都還沒有學會GNU Lightning,研究當中)
            不過GNU Lightning本身是不是正如他自己所說,能夠達到嵌入式匯編同樣的效率,小弟還沒有具體測試過。另外,如果再加上一層C++,會不會增加消耗,那就只有研究過原代碼才能確定了。這幾天暫時還沒有時間,遲點有結果再來寫。
            posted on 2006-01-19 17:45 cyt 閱讀(2309) 評論(1)  編輯 收藏 引用 所屬分類: Work
            Comments
            • # re: lib介紹,GNU Lightning內嵌匯編的C++封裝
              bi
              Posted @ 2007-03-14 03:38
              多謝您對froofyJIT表示有興趣!其實froofyJIT主要是用在那些有事先未能預知的運算的情況(如blit、語言JIT等)。還有,如果運用得當的話,C++一層并不會在執行時(runtime)增加消耗,只是編譯(compile)的時間比較久而已。

              -- bi  回復  更多評論   
             
            精品一久久香蕉国产线看播放| 久久国产精品无码网站| 亚洲午夜久久久| 亚洲中文字幕久久精品无码喷水| 久久久青草青青国产亚洲免观| 久久综合视频网站| 狠狠色丁香久久婷婷综合蜜芽五月| 亚洲国产日韩综合久久精品| 亚洲精品第一综合99久久 | 狠狠色婷婷久久综合频道日韩| 蜜桃麻豆WWW久久囤产精品| AV狠狠色丁香婷婷综合久久| 久久er热视频在这里精品| 欧美亚洲日本久久精品| 久久亚洲AV成人出白浆无码国产| 久久国产精品-国产精品| 久久久亚洲精品蜜桃臀| 久久久久久综合一区中文字幕| 午夜精品久久久内射近拍高清 | 91精品久久久久久无码| 人妻中文久久久久| 欧美精品一区二区精品久久 | 久久无码精品一区二区三区| 久久精品毛片免费观看| 欧美亚洲国产精品久久久久| 72种姿势欧美久久久久大黄蕉| 久久这里都是精品| 久久精品国产99久久久香蕉 | 色综合久久综精品| 国内精品久久久久| 午夜精品久久久久久99热| 亚洲欧洲久久久精品| 办公室久久精品| 国产精品久久久久…| 亚洲精品无码久久久影院相关影片 | 久久棈精品久久久久久噜噜| 久久天天躁狠狠躁夜夜2020一 | 久久九九久精品国产免费直播| 欧美日韩中文字幕久久久不卡 | 久久亚洲私人国产精品| 亚洲午夜久久久久久久久电影网|