forked from PlaneteCasio/Casio_asm
132 lines
2.5 KiB
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;
|
|
}
|
|
}
|