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

📄 x86_emit.h

📁 psp上的GBA模拟器
💻 H
📖 第 1 页 / 共 5 页
字号:
   x86_indirect_branch_##type, 4))                                            \#define generate_block_prologue()                                             \#define generate_block_extra_vars_arm()                                       \  void generate_indirect_branch_arm()                                         \  {                                                                           \    if(condition == 0x0E)                                                     \    {                                                                         \      generate_indirect_branch_cycle_update(arm);                             \    }                                                                         \    else                                                                      \    {                                                                         \      generate_indirect_branch_no_cycle_update(arm);                          \    }                                                                         \  }                                                                           \                                                                              \  void generate_indirect_branch_dual()                                        \  {                                                                           \    if(condition == 0x0E)                                                     \    {                                                                         \      generate_indirect_branch_cycle_update(dual);                            \    }                                                                         \    else                                                                      \    {                                                                         \      generate_indirect_branch_no_cycle_update(dual);                         \    }                                                                         \  }                                                                           \#define generate_block_extra_vars_thumb()                                     \#define translate_invalidate_dcache()                                         \#define block_prologue_size 0#define calculate_z_flag(dest)                                                \  reg[REG_Z_FLAG] = (dest == 0)                                               \#define calculate_n_flag(dest)                                                \  reg[REG_N_FLAG] = ((signed)dest < 0)                                        \#define calculate_c_flag_sub(dest, src_a, src_b)                              \  reg[REG_C_FLAG] = ((unsigned)src_b <= (unsigned)src_a)                      \#define calculate_v_flag_sub(dest, src_a, src_b)                              \  reg[REG_V_FLAG] = ((signed)src_b > (signed)src_a) != ((signed)dest < 0)     \#define calculate_c_flag_add(dest, src_a, src_b)                              \  reg[REG_C_FLAG] = ((unsigned)dest < (unsigned)src_a)                        \#define calculate_v_flag_add(dest, src_a, src_b)                              \  reg[REG_V_FLAG] = ((signed)dest < (signed)src_a) != ((signed)src_b < 0)     \#define get_shift_imm()                                                       \  u32 shift = (opcode >> 7) & 0x1F                                            \#define generate_shift_reg(ireg, name, flags_op)                              \  generate_load_reg_pc(ireg, rm, 12);                                         \  generate_load_reg(a1, ((opcode >> 8) & 0x0F));                              \  generate_function_call(execute_##name##_##flags_op##_reg);                  \  generate_mov(ireg, rv)                                                      \u32 function_cc execute_lsl_no_flags_reg(u32 value, u32 shift){  if(shift != 0)  {    if(shift > 31)      value = 0;    else      value <<= shift;  }  return value;}u32 function_cc execute_lsr_no_flags_reg(u32 value, u32 shift){  if(shift != 0)  {    if(shift > 31)      value = 0;    else      value >>= shift;  }  return value;}u32 function_cc execute_asr_no_flags_reg(u32 value, u32 shift){  if(shift != 0)  {    if(shift > 31)      value = (s32)value >> 31;    else      value = (s32)value >> shift;  }  return value;}u32 function_cc execute_ror_no_flags_reg(u32 value, u32 shift){  if(shift != 0)  {    ror(value, value, shift);  }  return value;}u32 function_cc execute_lsl_flags_reg(u32 value, u32 shift){  if(shift != 0)  {    if(shift > 31)    {      if(shift == 32)        reg[REG_C_FLAG] = value & 0x01;      else        reg[REG_C_FLAG] = 0;      value = 0;    }    else    {      reg[REG_C_FLAG] = (value >> (32 - shift)) & 0x01;      value <<= shift;    }  }  return value;}u32 function_cc execute_lsr_flags_reg(u32 value, u32 shift){  if(shift != 0)  {    if(shift > 31)    {      if(shift == 32)        reg[REG_C_FLAG] = (value >> 31) & 0x01;      else        reg[REG_C_FLAG] = 0;      value = 0;    }    else    {      reg[REG_C_FLAG] = (value >> (shift - 1)) & 0x01;      value >>= shift;    }  }  return value;}u32 function_cc execute_asr_flags_reg(u32 value, u32 shift){  if(shift != 0)  {    if(shift > 31)    {      value = (s32)value >> 31;      reg[REG_C_FLAG] = value & 0x01;    }    else    {      reg[REG_C_FLAG] = (value >> (shift - 1)) & 0x01;      value = (s32)value >> shift;    }  }  return value;}u32 function_cc execute_ror_flags_reg(u32 value, u32 shift){  if(shift != 0)  {    reg[REG_C_FLAG] = (value >> (shift - 1)) & 0x01;    ror(value, value, shift);  }  return value;}u32 function_cc execute_rrx_flags(u32 value){  u32 c_flag = reg[REG_C_FLAG];  reg[REG_C_FLAG] = value & 0x01;  return (value >> 1) | (c_flag << 31);}u32 function_cc execute_rrx(u32 value){  return (value >> 1) | (reg[REG_C_FLAG] << 31);}#define generate_shift_imm_lsl_no_flags(ireg)                                 \  generate_load_reg_pc(ireg, rm, 8);                                          \  if(shift != 0)                                                              \  {                                                                           \    generate_shift_left(ireg, shift);                                         \  }                                                                           \#define generate_shift_imm_lsr_no_flags(ireg)                                 \  if(shift != 0)                                                              \  {                                                                           \    generate_load_reg_pc(ireg, rm, 8);                                        \    generate_shift_right(ireg, shift);                                        \  }                                                                           \  else                                                                        \  {                                                                           \    generate_load_imm(ireg, 0);                                               \  }                                                                           \#define generate_shift_imm_asr_no_flags(ireg)                                 \  generate_load_reg_pc(ireg, rm, 8);                                          \  if(shift != 0)                                                              \  {                                                                           \    generate_shift_right_arithmetic(ireg, shift);                             \  }                                                                           \  else                                                                        \  {                                                                           \    generate_shift_right_arithmetic(ireg, 31);                                \  }                                                                           \#define generate_shift_imm_ror_no_flags(ireg)                                 \  if(shift != 0)                                                              \  {                                                                           \    generate_load_reg_pc(ireg, rm, 8);                                        \    generate_rotate_right(ireg, shift);                                       \  }                                                                           \

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -