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, 1, 0, false;
!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, 1, 0, false;
basis/ movi<i> rr, 1;
ret, 1, 0, false;
!end, codeBuffer;
}

明顯帥了很多。(不要問我這些代碼的含義,我自己都還沒有學會GNU Lightning,研究當中)
不過GNU Lightning本身是不是正如他自己所說,能夠達到嵌入式匯編同樣的效率,小弟還沒有具體測試過。另外,如果再加上一層C++,會不會增加消耗,那就只有研究過原代碼才能確定了。這幾天暫時還沒有時間,遲點有結果再來寫。