📄 x86_emit.h
字号:
check_for_interrupts(); if(reg[REG_CPSR] & 0x20) address |= 0x01; return address;}#define generate_store_reg_pc_flags(ireg, reg_index) \ generate_store_reg(ireg, reg_index); \ if(reg_index == 15) \ { \ generate_mov(a0, ireg); \ generate_function_call(execute_spsr_restore); \ generate_mov(a0, rv); \ generate_indirect_branch_dual(); \ } \typedef enum{ CONDITION_TRUE, CONDITION_FALSE, CONDITION_EQUAL, CONDITION_NOT_EQUAL} condition_check_type;#define generate_condition_eq(ireg_a, ireg_b) \ generate_load_reg(ireg_a, REG_Z_FLAG); \ condition_check = CONDITION_TRUE \#define generate_condition_ne(ireg_a, ireg_b) \ generate_load_reg(ireg_a, REG_Z_FLAG); \ condition_check = CONDITION_FALSE \#define generate_condition_cs(ireg_a, ireg_b) \ generate_load_reg(ireg_a, REG_C_FLAG); \ condition_check = CONDITION_TRUE \#define generate_condition_cc(ireg_a, ireg_b) \ generate_load_reg(ireg_a, REG_C_FLAG); \ condition_check = CONDITION_FALSE \#define generate_condition_mi(ireg_a, ireg_b) \ generate_load_reg(ireg_a, REG_N_FLAG); \ condition_check = CONDITION_TRUE \#define generate_condition_pl(ireg_a, ireg_b) \ generate_load_reg(ireg_a, REG_N_FLAG); \ condition_check = CONDITION_FALSE \#define generate_condition_vs(ireg_a, ireg_b) \ generate_load_reg(ireg_a, REG_V_FLAG); \ condition_check = CONDITION_TRUE \#define generate_condition_vc(ireg_a, ireg_b) \ generate_load_reg(ireg_a, REG_V_FLAG); \ condition_check = CONDITION_FALSE \#define generate_condition_hi(ireg_a, ireg_b) \ generate_load_reg(ireg_a, REG_C_FLAG); \ generate_xor_imm(ireg_a, 1); \ generate_load_reg(ireg_b, REG_Z_FLAG); \ generate_or(ireg_a, ireg_b); \ condition_check = CONDITION_FALSE \#define generate_condition_ls(ireg_a, ireg_b) \ generate_load_reg(ireg_a, REG_C_FLAG); \ generate_xor_imm(ireg_a, 1); \ generate_load_reg(ireg_b, REG_Z_FLAG); \ generate_or(ireg_a, ireg_b); \ condition_check = CONDITION_TRUE \#define generate_condition_ge(ireg_a, ireg_b) \ generate_load_reg(ireg_a, REG_N_FLAG); \ generate_load_reg(ireg_b, REG_V_FLAG); \ condition_check = CONDITION_EQUAL \#define generate_condition_lt(ireg_a, ireg_b) \ generate_load_reg(ireg_a, REG_N_FLAG); \ generate_load_reg(ireg_b, REG_V_FLAG); \ condition_check = CONDITION_NOT_EQUAL \#define generate_condition_gt(ireg_a, ireg_b) \ generate_load_reg(ireg_a, REG_N_FLAG); \ generate_load_reg(ireg_b, REG_V_FLAG); \ generate_xor(ireg_b, ireg_a); \ generate_load_reg(a0, REG_Z_FLAG); \ generate_or(ireg_a, ireg_b); \ condition_check = CONDITION_FALSE \#define generate_condition_le(ireg_a, ireg_b) \ generate_load_reg(ireg_a, REG_N_FLAG); \ generate_load_reg(ireg_b, REG_V_FLAG); \ generate_xor(ireg_b, ireg_a); \ generate_load_reg(a0, REG_Z_FLAG); \ generate_or(ireg_a, ireg_b); \ condition_check = CONDITION_TRUE \#define generate_condition(ireg_a, ireg_b) \ switch(condition) \ { \ case 0x0: \ generate_condition_eq(ireg_a, ireg_b); \ break; \ \ case 0x1: \ generate_condition_ne(ireg_a, ireg_b); \ break; \ \ case 0x2: \ generate_condition_cs(ireg_a, ireg_b); \ break; \ \ case 0x3: \ generate_condition_cc(ireg_a, ireg_b); \ break; \ \ case 0x4: \ generate_condition_mi(ireg_a, ireg_b); \ break; \ \ case 0x5: \ generate_condition_pl(ireg_a, ireg_b); \ break; \ \ case 0x6: \ generate_condition_vs(ireg_a, ireg_b); \ break; \ \ case 0x7: \ generate_condition_vc(ireg_a, ireg_b); \ break; \ \ case 0x8: \ generate_condition_hi(ireg_a, ireg_b); \ break; \ \ case 0x9: \ generate_condition_ls(ireg_a, ireg_b); \ break; \ \ case 0xA: \ generate_condition_ge(ireg_a, ireg_b); \ break; \ \ case 0xB: \ generate_condition_lt(ireg_a, ireg_b); \ break; \ \ case 0xC: \ generate_condition_gt(ireg_a, ireg_b); \ break; \ \ case 0xD: \ generate_condition_le(ireg_a, ireg_b); \ break; \ \ case 0xE: \ /* AL */ \ break; \ \ case 0xF: \ /* Reserved */ \ break; \ } \#define generate_conditional_branch_type(ireg_a, ireg_b) \ switch(condition_check) \ { \ case CONDITION_TRUE: \ generate_conditional_branch(ireg_a, ireg_b, true, backpatch_address); \ break; \ \ case CONDITION_FALSE: \ generate_conditional_branch(ireg_a, ireg_b, false, backpatch_address); \ break; \ \ case CONDITION_EQUAL: \ generate_conditional_branch(ireg_a, ireg_b, equal, backpatch_address); \ break; \ \ case CONDITION_NOT_EQUAL: \ generate_conditional_branch(ireg_a, ireg_b, not_equal, \ backpatch_address); \ break; \ } \#define generate_branch() \{ \ generate_branch_cycle_update( \ block_exits[block_exit_position].branch_source, \ block_exits[block_exit_position].branch_target); \ block_exit_position++; \} \#define rm_op_reg rm#define rm_op_imm imm#define arm_data_proc_reg_flags() \ arm_decode_data_proc_reg(); \ if(flag_status & 0x02) \ { \ generate_load_rm_sh(flags) \ } \ else \ { \ generate_load_rm_sh(no_flags); \ } \#define arm_data_proc_reg() \ arm_decode_data_proc_reg(); \ generate_load_rm_sh(no_flags) \#define arm_data_proc_imm() \ arm_decode_data_proc_imm(); \ generate_load_imm(a0, imm) \#define arm_data_proc(name, type, flags_op) \{ \ arm_data_proc_##type(); \ generate_load_reg_pc(a1, rn, 8); \ generate_function_call(execute_##name); \ generate_store_reg_pc_##flags_op(rv, rd); \} \#define arm_data_proc_test(name, type) \{ \ arm_data_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -