Casio_asm/interpreter/decoder.c

132 lines
2.5 KiB
C

#include "decoder.h"
#include "decoderImp.h"
void Proc_decodeInstruction(proc_t *proc, opcode_t *op, opcode_data_t *instruction) {
instruction->op=op->op;
instruction->nArgs=op->nArgs;
instruction->ext=0;
switch(op->op) {
case OP_store:
case OP_swreg:
// rule is 2s
decodeInstructionImp(proc, op, instruction, RULE_2s);
break;
case OP_neg_i:
case OP_not:
case OP_not_l:
case OP_is_l:
case OP_push:
case OP_dup:
case OP_pop:
case OP_high:
case OP_jmp:
case OP_call:
case OP_puind:
case OP_inth:
case OP_stat_g:
case OP_ext:
case OP_mem_wr:
case OP_mem_hr:
case OP_mem_br:
case OP_sub:
case OP_unsub:
// rule is 1
decodeInstructionImp(proc, op, instruction, RULE_1);
break;
case OP_nop:
case OP_top:
case OP_halt:
case OP_reset:
case OP_stat:
case OP_lastad:
// rule is 0
decodeInstructionImp(proc, op, instruction, RULE_0);
break;
case OP_add_i:
case OP_sub_i:
case OP_mul_i:
case OP_div_i:
case OP_mod_i:
case OP_shlt:
case OP_shrt:
case OP_and:
case OP_or:
case OP_xor:
case OP_and_l:
case OP_or_l:
case OP_xor_l:
case OP_lt_i:
case OP_le_i:
case OP_gt_i:
case OP_ge_i:
case OP_eq_i:
case OP_neq_i:
case OP_swap:
case OP_jif:
case OP_jnt:
case OP_jind:
case OP_cif:
case OP_cnt:
case OP_stind:
case OP_swregi:
case OP_stat_s:
case OP_mem_ww:
case OP_mem_hw:
case OP_mem_bw:
case OP_int:
// rule is 2
decodeInstructionImp(proc, op, instruction, RULE_2);
break;
}
}
void Proc_decodeInstructionExt(proc_t *proc, opcode_ext_t *op, opcode_data_t *instruction) {
instruction->op=op->op;
instruction->nArgs=op->nArgs;
instruction->ext=1;
switch(op->op) {
case OP_E_add_d:
case OP_E_sub_d:
case OP_E_mul_d:
case OP_E_div_d:
case OP_E_pow_d:
case OP_E_atan2:
case OP_E_lt_d:
case OP_E_le_d:
case OP_E_gt_d:
case OP_E_ge_d:
case OP_E_eq_d:
case OP_E_neq_d:
case OP_E_hypot:
// rule is 2d
decodeInstructionExtImp(proc, op, instruction, RULE_2d);
break;
case OP_E_neg_d:
case OP_E_cos:
case OP_E_sin:
case OP_E_tan:
case OP_E_atan:
case OP_E_d2i:
case OP_E_sqrt:
case OP_E_cbrt:
case OP_E_exp:
case OP_E_ln:
case OP_E_floor:
case OP_E_ceil:
case OP_E_round:
// rule is 1d
decodeInstructionExtImp(proc, op, instruction, RULE_1d);
break;
case OP_E_i2d:
// rule is 1
decodeInstructionExtImp(proc, op, instruction, RULE_1);
break;
case OP_E_nop:
case OP_E_cst_pi:
case OP_E_cst_e:
// rule is 0
decodeInstructionExtImp(proc, op, instruction, RULE_0);
break;
}
}