📄 mips_emit.h
字号:
{ \ s32 pc_delta = new_pc - stored_pc; \ if((pc_delta >= -32768) && (pc_delta <= 32767)) \ { \ mips_emit_addiu(ireg, reg_pc, pc_delta); \ } \ else \ { \ generate_load_imm(ireg, new_pc); \ } \} \#define generate_store_reg(ireg, reg_index) \ mips_emit_addu(arm_to_mips_reg[reg_index], ireg, reg_zero) \#define generate_shift_left(ireg, imm) \ mips_emit_sll(ireg, ireg, imm) \#define generate_shift_right(ireg, imm) \ mips_emit_srl(ireg, ireg, imm) \#define generate_shift_right_arithmetic(ireg, imm) \ mips_emit_sra(ireg, ireg, imm) \#define generate_rotate_right(ireg, imm) \ mips_emit_rotr(ireg, ireg, imm) \#define generate_add(ireg_dest, ireg_src) \ mips_emit_addu(ireg_dest, ireg_dest, ireg_src) \#define generate_sub(ireg_dest, ireg_src) \ mips_emit_subu(ireg_dest, ireg_dest, ireg_src) \#define generate_or(ireg_dest, ireg_src) \ mips_emit_or(ireg_dest, ireg_dest, ireg_src) \#define generate_xor(ireg_dest, ireg_src) \ mips_emit_xor(ireg_dest, ireg_dest, ireg_src) \#define generate_alu_imm(imm_type, reg_type, ireg_dest, ireg_src, imm) \ if(((s32)imm >= -32768) && ((s32)imm <= 32767)) \ { \ mips_emit_##imm_type(ireg_dest, ireg_src, imm); \ } \ else \ { \ generate_load_imm(reg_temp, imm); \ mips_emit_##reg_type(ireg_dest, ireg_src, reg_temp); \ } \#define generate_alu_immu(imm_type, reg_type, ireg_dest, ireg_src, imm) \ if(((u32)imm >= 0) && ((u32)imm <= 65535)) \ { \ mips_emit_##imm_type(ireg_dest, ireg_src, imm); \ } \ else \ { \ generate_load_imm(reg_temp, imm); \ mips_emit_##reg_type(ireg_dest, ireg_src, reg_temp); \ } \#define generate_add_imm(ireg, imm) \ generate_alu_imm(addiu, add, ireg, ireg, imm) \#define generate_sub_imm(ireg, imm) \ generate_alu_imm(addiu, add, ireg, ireg, -imm) \#define generate_xor_imm(ireg, imm) \ generate_alu_immu(xori, xor, ireg, ireg, imm) \#define generate_add_reg_reg_imm(ireg_dest, ireg_src, imm) \ generate_alu_imm(addiu, add, ireg_dest, ireg_src, imm) \#define generate_and_imm(ireg, imm) \ generate_alu_immu(andi, and, ireg, ireg, imm) \#define generate_mov(ireg_dest, ireg_src) \ mips_emit_addu(ireg_dest, ireg_src, reg_zero) \#define generate_multiply_s64() \ mips_emit_mult(arm_to_mips_reg[rm], arm_to_mips_reg[rs]) \#define generate_multiply_u64() \ mips_emit_multu(arm_to_mips_reg[rm], arm_to_mips_reg[rs]) \#define generate_multiply_s64_add() \ mips_emit_madd(arm_to_mips_reg[rm], arm_to_mips_reg[rs]) \#define generate_multiply_u64_add() \ mips_emit_maddu(arm_to_mips_reg[rm], arm_to_mips_reg[rs]) \#define generate_function_call(function_location) \ mips_emit_jal(mips_absolute_offset(function_location)); \ mips_emit_nop() \#define generate_function_call_swap_delay(function_location) \{ \ u32 delay_instruction = address32(translation_ptr, -4); \ translation_ptr -= 4; \ mips_emit_jal(mips_absolute_offset(function_location)); \ address32(translation_ptr, 0) = delay_instruction; \ translation_ptr += 4; \} \#define generate_swap_delay() \{ \ u32 delay_instruction = address32(translation_ptr, -8); \ u32 branch_instruction = address32(translation_ptr, -4); \ branch_instruction = (branch_instruction & 0xFFFF0000) | \ (((branch_instruction & 0x0000FFFF) + 1) & 0x0000FFFF); \ address32(translation_ptr, -8) = branch_instruction; \ address32(translation_ptr, -4) = delay_instruction; \} \#define generate_cycle_update() \ if(cycle_count != 0) \ { \ mips_emit_addiu(reg_cycles, reg_cycles, -cycle_count); \ cycle_count = 0; \ } \#define generate_cycle_update_force() \ mips_emit_addiu(reg_cycles, reg_cycles, -cycle_count); \ cycle_count = 0 \#define generate_branch_patch_conditional(dest, offset) \ *((u16 *)(dest)) = mips_relative_offset(dest, offset) \#define generate_branch_patch_unconditional(dest, offset) \ *((u32 *)(dest)) = (mips_opcode_j << 26) | \ ((mips_absolute_offset(offset)) & 0x3FFFFFF) \#define generate_branch_no_cycle_update(writeback_location, new_pc) \ if(pc == idle_loop_target_pc) \ { \ generate_load_pc(reg_a0, new_pc); \ generate_function_call_swap_delay(mips_update_gba); \ mips_emit_j_filler(writeback_location); \ mips_emit_nop(); \ } \ else \ { \ generate_load_pc(reg_a0, new_pc); \ mips_emit_bltzal(reg_cycles, \ mips_relative_offset(translation_ptr, update_trampoline)); \ generate_swap_delay(); \ mips_emit_j_filler(writeback_location); \ mips_emit_nop(); \ } \#define generate_branch_cycle_update(writeback_location, new_pc) \ generate_cycle_update(); \ generate_branch_no_cycle_update(writeback_location, new_pc) \#define generate_conditional_branch(ireg_a, ireg_b, type, writeback_location) \ generate_branch_filler_##type(ireg_a, ireg_b, writeback_location) \// a0 holds the destination#define generate_indirect_branch_cycle_update(type) \ mips_emit_j(mips_absolute_offset(mips_indirect_branch_##type)); \ generate_cycle_update_force() \#define generate_indirect_branch_no_cycle_update(type) \ mips_emit_j(mips_absolute_offset(mips_indirect_branch_##type)); \ mips_emit_nop() \#define generate_block_prologue() \ update_trampoline = translation_ptr; \ __asm__ \ ( \ "cache 8, 0(%0)\n" \ "cache 8, 0(%0)" : : "r"(translation_ptr) \ ); \ \ mips_emit_j(mips_absolute_offset(mips_update_gba)); \ mips_emit_nop(); \ generate_load_imm(reg_pc, stored_pc) \#define translate_invalidate_dcache() \ sceKernelDcacheWritebackAll() \#define block_prologue_size 8#define check_generate_n_flag \ (flag_status & 0x08) \#define check_generate_z_flag \ (flag_status & 0x04) \#define check_generate_c_flag \ (flag_status & 0x02) \#define check_generate_v_flag \ (flag_status & 0x01) \#define generate_load_reg_pc(ireg, reg_index, pc_offset) \ if(reg_index == REG_PC) \ { \ generate_load_pc(ireg, (pc + pc_offset)); \ } \ else \ { \ generate_load_reg(ireg, reg_index); \ } \#define check_load_reg_pc(arm_reg, reg_index, pc_offset) \ if(reg_index == REG_PC) \ { \ reg_index = arm_reg; \ generate_load_pc(arm_to_mips_reg[arm_reg], (pc + pc_offset)); \ } \#define check_store_reg_pc_no_flags(reg_index) \ if(reg_index == REG_PC) \ { \ generate_indirect_branch_arm(); \ } \#define check_store_reg_pc_flags(reg_index) \ if(reg_index == REG_PC) \ { \ generate_function_call(execute_spsr_restore); \ generate_indirect_branch_dual(); \ } \#define generate_shift_imm_lsl_no_flags(arm_reg, _rm, _shift) \ check_load_reg_pc(arm_reg, _rm, 8); \ if(_shift != 0) \ { \ mips_emit_sll(arm_to_mips_reg[arm_reg], arm_to_mips_reg[_rm], _shift); \ _rm = arm_reg; \ } \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -