C++ JIT Assembler for Digamma

ディガンマはバグと戦ってこれを倒した。
ディガンマは経験値とJITアセンブラという名前の武器を手に入れた :)

Schemeアセンブラだけだとブートストラップが面倒なのでC++だけで使えるものを作っちゃいました。IA32とAMD64(Intel64)の基本的な命令だけをサポートした「おれおれ仕様」のオリジナルです:p

void test(void* vmi_thunk)
{
    using_nanoasm;

    GLOBAL(VMI_THUNK);
    EQU(VMI_THUNK, vmi_thunk);

    LOCAL(TOP);
    LOCAL(L1);
    LOCAL(L2);

    LABEL(TOP);
    __  mov(rsi, qword[rbp+0x18]);
    __  mov(rdi, qword[rbp+0xc]);
    __  mov(rax, qword[rdi-0xc]);
    __  mov(qword[rsi], rax);
    __  add(rsi, 0x4);
    __  mov(rax, qword[rdi-0x8]);
    __  test(al, 0x7);
    __  jz(L1);
    __  jmp(VMI_THUNK);

    LABEL(L1);
    __  mov(rax, qword[rax+0x4]);
    __  mov(qword[rsi], rax);
    __  add(rsi, 0x4);
    __  mov(qword[rbp+0x18], rsi);
    __  lea(rax, offset(L2));
    __  mov(qword[rbp+0x20], rax);
    __  jmp(VMI_THUNK);

    LABEL(L2);
    __  dq(TOP);
}

やっぱりアセンブラは素敵です :D