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 阅读(2266) 评论(1)  编辑 收藏 引用 所属分类: Work
Comments
  • # re: lib介绍,GNU Lightning内嵌汇编的C++封装
    bi
    Posted @ 2007-03-14 03:38
    多谢您对froofyJIT表示有兴趣!其实froofyJIT主要是用在那些有事先未能预知的运算的情况(如blit、语言JIT等)。还有,如果运用得当的话,C++一层并不会在执行时(runtime)增加消耗,只是编译(compile)的时间比较久而已。

    -- bi  回复  更多评论   

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理