示例#1
0
void parse(Xbyak::CodeGenerator &gen, FILE *input, int membuf[MEMSIZE]) {
    gen.push(gen.ebx);

    Xbyak::Reg32 memreg = gen.ebx;
    Xbyak::Reg32 eax = gen.eax;
    Xbyak::Address mem = gen.dword[memreg];

    gen.mov(memreg, (int) membuf);

    std::stack<int> labelStack;
    int labelNum = 0;
    int ch;
    while((ch=getc(input)) != EOF) {
        switch (ch) {
            case '+':
                gen.inc(mem);
                break;
            case '-':
                gen.dec(mem);
                break;
            case '>':
                gen.add(memreg, 4);
                break;
            case '<':
                gen.add(memreg, -4);
                break;
            case ',':
                gen.call((void*) getchar);
                gen.mov(mem, gen.eax);
                break;
            case '.':
                gen.push(mem);
                gen.call((void*) putchar);
                gen.pop(gen.eax);
                break;
            case '[':
                gen.L(toLabel('L', labelNum));
                gen.mov(gen.eax, mem);
                gen.test(gen.eax, gen.eax);
                gen.jz(toLabel('R', labelNum), Xbyak::CodeGenerator::T_NEAR);

                labelStack.push(labelNum);
                ++labelNum;
                break;
            case ']':
                int beginNum = labelStack.top();
                labelStack.pop();

                gen.jmp(toLabel('L', beginNum), Xbyak::CodeGenerator::T_NEAR);
                gen.L(toLabel('R', beginNum));
                break;
        }
    }
    gen.pop(gen.ebx);
    gen.ret();
}
示例#2
0
JIT_FUNCTION jit_compile(Xbyak::CodeGenerator &gen, const char *source) {
  int ch;

  gen.mov(gen.eax, 0);

  while ((ch = *source++) != '\0') {
    switch (ch) {
      case '+':
        gen.inc(gen.eax);
        break;
      case '-':
        gen.dec(gen.eax);
        break;
    }
  }

  gen.ret();

  return (JIT_FUNCTION) gen.getCode();
}