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

📄 mips_emit.h

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