📄 mips_emit.h
字号:
#define generate_shift_imm_lsr_no_flags(arm_reg, _rm, _shift) \ if(_shift != 0) \ { \ check_load_reg_pc(arm_reg, _rm, 8); \ mips_emit_srl(arm_to_mips_reg[arm_reg], arm_to_mips_reg[_rm], _shift); \ } \ else \ { \ mips_emit_addu(arm_to_mips_reg[arm_reg], reg_zero, reg_zero); \ } \ _rm = arm_reg \#define generate_shift_imm_asr_no_flags(arm_reg, _rm, _shift) \ check_load_reg_pc(arm_reg, _rm, 8); \ if(_shift != 0) \ { \ mips_emit_sra(arm_to_mips_reg[arm_reg], arm_to_mips_reg[_rm], _shift); \ } \ else \ { \ mips_emit_sra(arm_to_mips_reg[arm_reg], arm_to_mips_reg[_rm], 31); \ } \ _rm = arm_reg \#define generate_shift_imm_ror_no_flags(arm_reg, _rm, _shift) \ check_load_reg_pc(arm_reg, _rm, 8); \ if(_shift != 0) \ { \ mips_emit_rotr(arm_to_mips_reg[arm_reg], arm_to_mips_reg[_rm], _shift); \ } \ else \ { \ mips_emit_srl(arm_to_mips_reg[arm_reg], arm_to_mips_reg[_rm], 1); \ mips_emit_ins(arm_to_mips_reg[arm_reg], reg_c_cache, 31, 1); \ } \ _rm = arm_reg \#define generate_shift_imm_lsl_flags(arm_reg, _rm, _shift) \ check_load_reg_pc(arm_reg, _rm, 8); \ if(_shift != 0) \ { \ mips_emit_ext(reg_c_cache, arm_to_mips_reg[_rm], (32 - _shift), 1); \ mips_emit_sll(arm_to_mips_reg[arm_reg], arm_to_mips_reg[_rm], _shift); \ _rm = arm_reg; \ } \#define generate_shift_imm_lsr_flags(arm_reg, _rm, _shift) \ check_load_reg_pc(arm_reg, _rm, 8); \ if(_shift != 0) \ { \ mips_emit_ext(reg_c_cache, arm_to_mips_reg[_rm], (_shift - 1), 1); \ mips_emit_srl(arm_to_mips_reg[arm_reg], arm_to_mips_reg[_rm], _shift); \ } \ else \ { \ mips_emit_srl(reg_c_cache, arm_to_mips_reg[_rm], 31); \ mips_emit_addu(arm_to_mips_reg[arm_reg], reg_zero, reg_zero); \ } \ _rm = arm_reg \#define generate_shift_imm_asr_flags(arm_reg, _rm, _shift) \ check_load_reg_pc(arm_reg, _rm, 8); \ if(_shift != 0) \ { \ mips_emit_ext(reg_c_cache, arm_to_mips_reg[_rm], (_shift - 1), 1); \ mips_emit_sra(arm_to_mips_reg[arm_reg], arm_to_mips_reg[_rm], _shift); \ } \ else \ { \ mips_emit_sra(arm_to_mips_reg[arm_reg], arm_to_mips_reg[_rm], 31); \ mips_emit_andi(reg_c_cache, arm_to_mips_reg[arm_reg], 1); \ } \ _rm = arm_reg \#define generate_shift_imm_ror_flags(arm_reg, _rm, _shift) \ check_load_reg_pc(arm_reg, _rm, 8); \ if(_shift != 0) \ { \ mips_emit_ext(reg_c_cache, arm_to_mips_reg[_rm], (_shift - 1), 1); \ mips_emit_rotr(arm_to_mips_reg[arm_reg], arm_to_mips_reg[_rm], _shift); \ } \ else \ { \ mips_emit_andi(reg_temp, arm_to_mips_reg[_rm], 1); \ mips_emit_srl(arm_to_mips_reg[arm_reg], arm_to_mips_reg[_rm], 1); \ mips_emit_ins(arm_to_mips_reg[arm_reg], reg_c_cache, 31, 1); \ mips_emit_addu(reg_c_cache, reg_temp, reg_zero); \ } \ _rm = arm_reg \#define generate_shift_reg_lsl_no_flags(_rm, _rs) \ mips_emit_sltiu(reg_temp, arm_to_mips_reg[_rs], 32); \ mips_emit_sllv(reg_a0, arm_to_mips_reg[_rm], arm_to_mips_reg[_rs]); \ mips_emit_movz(reg_a0, reg_zero, reg_temp) \#define generate_shift_reg_lsr_no_flags(_rm, _rs) \ mips_emit_sltiu(reg_temp, arm_to_mips_reg[_rs], 32); \ mips_emit_srlv(reg_a0, arm_to_mips_reg[_rm], arm_to_mips_reg[_rs]); \ mips_emit_movz(reg_a0, reg_zero, reg_temp) \#define generate_shift_reg_asr_no_flags(_rm, _rs) \ mips_emit_sltiu(reg_temp, arm_to_mips_reg[_rs], 32); \ mips_emit_b(bne, reg_temp, reg_zero, 2); \ mips_emit_srav(reg_a0, arm_to_mips_reg[_rm], arm_to_mips_reg[_rs]); \ mips_emit_sra(reg_a0, reg_a0, 31) \#define generate_shift_reg_ror_no_flags(_rm, _rs) \ mips_emit_rotrv(reg_a0, arm_to_mips_reg[_rm], arm_to_mips_reg[_rs]) \#define generate_shift_reg_lsl_flags(_rm, _rs) \ generate_load_reg_pc(reg_a0, _rm, 12); \ generate_load_reg_pc(reg_a1, _rs, 8); \ generate_function_call_swap_delay(execute_lsl_flags_reg) \#define generate_shift_reg_lsr_flags(_rm, _rs) \ generate_load_reg_pc(reg_a0, _rm, 12); \ generate_load_reg_pc(reg_a1, _rs, 8) \ generate_function_call_swap_delay(execute_lsr_flags_reg) \#define generate_shift_reg_asr_flags(_rm, _rs) \ generate_load_reg_pc(reg_a0, _rm, 12); \ generate_load_reg_pc(reg_a1, _rs, 8) \ generate_function_call_swap_delay(execute_asr_flags_reg) \#define generate_shift_reg_ror_flags(_rm, _rs) \ mips_emit_b(beq, arm_to_mips_reg[_rs], reg_zero, 3); \ mips_emit_addiu(reg_temp, arm_to_mips_reg[_rs], -1); \ mips_emit_srlv(reg_temp, arm_to_mips_reg[_rm], reg_temp); \ mips_emit_andi(reg_c_cache, reg_temp, 1); \ mips_emit_rotrv(reg_a0, arm_to_mips_reg[_rm], arm_to_mips_reg[_rs]) \#define generate_shift_imm(arm_reg, name, flags_op) \ u32 shift = (opcode >> 7) & 0x1F; \ generate_shift_imm_##name##_##flags_op(arm_reg, rm, shift) \#define generate_shift_reg(arm_reg, name, flags_op) \ u32 rs = ((opcode >> 8) & 0x0F); \ generate_shift_reg_##name##_##flags_op(rm, rs); \ rm = arm_reg \// Made functions due to the macro expansion getting too large.// Returns a new rm if it redirects it (which will happen on most of these// cases)#define generate_load_rm_sh_builder(flags_op) \u32 generate_load_rm_sh_##flags_op(u32 rm) \{ \ switch((opcode >> 4) & 0x07) \ { \ /* LSL imm */ \ case 0x0: \ { \ generate_shift_imm(arm_reg_a0, lsl, flags_op); \ break; \ } \ \ /* LSL reg */ \ case 0x1: \ { \ generate_shift_reg(arm_reg_a0, lsl, flags_op); \ break; \ } \ \ /* LSR imm */ \ case 0x2: \ { \ generate_shift_imm(arm_reg_a0, lsr, flags_op); \ break; \ } \ \ /* LSR reg */ \ case 0x3: \ { \ generate_shift_reg(arm_reg_a0, lsr, flags_op); \ break; \ } \ \ /* ASR imm */ \ case 0x4: \ { \ generate_shift_imm(arm_reg_a0, asr, flags_op); \ break; \ } \ \ /* ASR reg */ \ case 0x5: \ { \ generate_shift_reg(arm_reg_a0, asr, flags_op); \ break; \ } \ \ /* ROR imm */ \ case 0x6: \ { \ generate_shift_imm(arm_reg_a0, ror, flags_op); \ break; \ } \ \ /* ROR reg */ \ case 0x7: \ { \ generate_shift_reg(arm_reg_a0, ror, flags_op); \ break; \ } \ } \ \ return rm; \} \#define read_memory_constant_u8(address) \ read_memory8(address) \#define read_memory_constant_u16(address) \ read_memory16(address) \#define read_memory_constant_u32(address) \ read_memory32(address) \#define read_memory_constant_s8(address) \ (s8)read_memory8(address) \#define read_memory_constant_s16(address) \ (s16)read_memory16_signed(address) \#define generate_load_memory_u8(ireg, offset) \ mips_emit_lbu(ireg, ireg, offset) \#define generate_load_memory_u16(ireg, offset) \ mips_emit_lhu(ireg, ireg, offset) \#define generate_load_memory_u32(ireg, offset) \ mips_emit_lw(ireg, ireg, offset) \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -