コード例 #1
0
ファイル: jit.c プロジェクト: triplekill/calc
static inline void JIT_visit(ASTNode *node, int regs[], int reg) {
  switch(node->type) {
    case AST_BINARY_OP: {
      ASTBinaryOp *binary_op = (ASTBinaryOp*)node;

      int a_reg = alloc_reg(regs);
      JIT_visit(binary_op->lhs, regs, a_reg);
      int b_reg = alloc_reg(regs);
      JIT_visit(binary_op->rhs, regs, b_reg);

      switch(binary_op->op) {
        case '+': jit_addr_i(reg, a_reg, b_reg); break;
        case '-': jit_subr_i(reg, a_reg, b_reg); break;
        case '*': jit_mulr_i(reg, a_reg, b_reg); break;
        case '/': jit_divr_i(reg, a_reg, b_reg); break;
      }

      free_reg(regs, a_reg);
      free_reg(regs, b_reg);
      break;
    }
    case AST_INT: {
      jit_movi_i(reg, ((ASTInt*)node)->value);
      break;
    }
  }
}
コード例 #2
0
ファイル: rpn.c プロジェクト: pcpa/lightning
/* Store in R0 the result of evaluating the operator TOK with
   two register operands SRC1 and SRC2.  */
void
gen_reg_reg (int src1, int src2, int tok)
{
  switch (tok)
    {
    case '+': jit_addr_i (JIT_R0, src1, src2); break;
    case '-': jit_subr_i (JIT_R0, src1, src2); break;
    case '*': jit_mulr_i (JIT_R0, src1, src2); break;
    case '/': jit_divr_i (JIT_R0, src1, src2); break;
    case '%': jit_modr_i (JIT_R0, src1, src2); break;
    case '&': jit_andr_i (JIT_R0, src1, src2); break;
    case '|': jit_orr_i (JIT_R0, src1, src2); break;
    case '^': jit_xorr_i (JIT_R0, src1, src2); break;
    case '=': jit_eqr_i (JIT_R0, src1, src2); break;
    case '<': jit_ltr_i (JIT_R0, src1, src2); break;
    case '>': jit_gtr_i (JIT_R0, src1, src2); break;
    case LE: jit_ler_i (JIT_R0, src1, src2); break;
    case GE: jit_ger_i (JIT_R0, src1, src2); break;
    case NE: jit_ner_i (JIT_R0, src1, src2); break;
    case LSH: jit_lshr_i (JIT_R0, src1, src2); break;
    case RSH: jit_rshr_i (JIT_R0, src1, src2); break;
    case RSHU: jit_rshr_ui (JIT_R0, src1, src2); break;
    default: abort ();
    }
}