⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mips_emit.h

📁 psp上的GBA模拟器
💻 H
📖 第 1 页 / 共 5 页
字号:
{                                                                             \  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 + -