📄 arm_iss.cpp
字号:
WRITE_REG(rd, READ_REG(rn) - (READ_REG(rm)>>shift_imm) - (1-C_FLAG));}void SIMIT_IMP(sbc_sign_mode2_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; WRITE_REG(rd, READ_REG(rn) - (BIT31(READ_REG(rm))?~0:0) - (1-C_FLAG));}void SIMIT_IMP(sbc_asr_mode2_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned shift_imm = (inst>>7)&31; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; WRITE_REG(rd, READ_REG(rn) - ((int32_t)(READ_REG(rm))>>shift_imm) - (1-C_FLAG));}void SIMIT_IMP(sbc_rrx_mode2_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; WRITE_REG(rd, READ_REG(rn) - ((READ_REG(rm)>>1)|(C_FLAG<<31)) - (1-C_FLAG));}void SIMIT_IMP(sbc_ror_mode2_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned shift_imm = (inst>>7)&31; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; WRITE_REG(rd, READ_REG(rn) - (val32=READ_REG(rm), (val32>>shift_imm)|(val32<<(32-shift_imm))) - (1-C_FLAG));}void SIMIT_IMP(sbc_lsl_mode3_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned rs = (inst>>8)&15; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; uint32_t tmp32; WRITE_REG(rd, READ_REG(rn) - (tmp32=READ_REG(rs)&0xFF, val32=READ_REG(rm), (tmp32<32)?(val32<<tmp32):0) - (1-C_FLAG));}void SIMIT_IMP(sbc_lsr_mode3_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned rs = (inst>>8)&15; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; uint32_t tmp32; WRITE_REG(rd, READ_REG(rn) - (tmp32=READ_REG(rs)&0xFF, val32=READ_REG(rm), (tmp32<32)?(val32>>tmp32):0) - (1-C_FLAG));}void SIMIT_IMP(sbc_asr_mode3_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned rs = (inst>>8)&15; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; uint32_t tmp32; WRITE_REG(rd, READ_REG(rn) - (tmp32=READ_REG(rs)&0xFF, val32=READ_REG(rm), (int32_t)val32>>(tmp32<32?tmp32:31)) - (1-C_FLAG));}void SIMIT_IMP(sbc_ror_mode3_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned rs = (inst>>8)&15; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; uint32_t tmp32; WRITE_REG(rd, READ_REG(rn) - (tmp32=READ_REG(rs)&0xFF, val32=READ_REG(rm), (val32>>(tmp32&0x1f))|(val32<<(32-(tmp32&0x1f)))) - (1-C_FLAG));}void SIMIT_IMP(sbcs_lsl_mode2_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned shift_imm = (inst>>7)&31; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; uint32_t tmp32; uint32_t rslt32; uint32_t carry; tmp32 = (READ_REG(rm)<<shift_imm); val32 = READ_REG(rn); if (C_FLAG) { rslt32 = val32 - tmp32; carry = val32 >= tmp32; } else { rslt32 = val32 - tmp32 - 1; carry = val32 > tmp32; } if (rd==15) WRITE_CPSR(SPSR); else ASGN_NZCV(rslt32, carry, (val32 ^ tmp32) & (val32 ^ rslt32)); WRITE_REG(rd, rslt32);}void SIMIT_IMP(sbcs_zero_mode2_) (emulator_t *emu, target_inst_t inst){ unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; uint32_t tmp32; uint32_t rslt32; uint32_t carry; tmp32 = 0; val32 = READ_REG(rn); if (C_FLAG) { rslt32 = val32 - tmp32; carry = val32 >= tmp32; } else { rslt32 = val32 - tmp32 - 1; carry = val32 > tmp32; } if (rd==15) WRITE_CPSR(SPSR); else ASGN_NZCV(rslt32, carry, (val32 ^ tmp32) & (val32 ^ rslt32)); WRITE_REG(rd, rslt32);}void SIMIT_IMP(sbcs_lsr_mode2_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned shift_imm = (inst>>7)&31; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; uint32_t tmp32; uint32_t rslt32; uint32_t carry; tmp32 = (READ_REG(rm)>>shift_imm); val32 = READ_REG(rn); if (C_FLAG) { rslt32 = val32 - tmp32; carry = val32 >= tmp32; } else { rslt32 = val32 - tmp32 - 1; carry = val32 > tmp32; } if (rd==15) WRITE_CPSR(SPSR); else ASGN_NZCV(rslt32, carry, (val32 ^ tmp32) & (val32 ^ rslt32)); WRITE_REG(rd, rslt32);}void SIMIT_IMP(sbcs_sign_mode2_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; uint32_t tmp32; uint32_t rslt32; uint32_t carry; tmp32 = (BIT31(READ_REG(rm))?~0:0); val32 = READ_REG(rn); if (C_FLAG) { rslt32 = val32 - tmp32; carry = val32 >= tmp32; } else { rslt32 = val32 - tmp32 - 1; carry = val32 > tmp32; } if (rd==15) WRITE_CPSR(SPSR); else ASGN_NZCV(rslt32, carry, (val32 ^ tmp32) & (val32 ^ rslt32)); WRITE_REG(rd, rslt32);}void SIMIT_IMP(sbcs_asr_mode2_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned shift_imm = (inst>>7)&31; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; uint32_t tmp32; uint32_t rslt32; uint32_t carry; tmp32 = ((int32_t)(READ_REG(rm))>>shift_imm); val32 = READ_REG(rn); if (C_FLAG) { rslt32 = val32 - tmp32; carry = val32 >= tmp32; } else { rslt32 = val32 - tmp32 - 1; carry = val32 > tmp32; } if (rd==15) WRITE_CPSR(SPSR); else ASGN_NZCV(rslt32, carry, (val32 ^ tmp32) & (val32 ^ rslt32)); WRITE_REG(rd, rslt32);}void SIMIT_IMP(sbcs_rrx_mode2_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; uint32_t tmp32; uint32_t rslt32; uint32_t carry; tmp32 = ((READ_REG(rm)>>1)|(C_FLAG<<31)); val32 = READ_REG(rn); if (C_FLAG) { rslt32 = val32 - tmp32; carry = val32 >= tmp32; } else { rslt32 = val32 - tmp32 - 1; carry = val32 > tmp32; } if (rd==15) WRITE_CPSR(SPSR); else ASGN_NZCV(rslt32, carry, (val32 ^ tmp32) & (val32 ^ rslt32)); WRITE_REG(rd, rslt32);}void SIMIT_IMP(sbcs_ror_mode2_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned shift_imm = (inst>>7)&31; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; uint32_t tmp32; uint32_t rslt32; uint32_t carry; tmp32 = (val32=READ_REG(rm), (val32>>shift_imm)|(val32<<(32-shift_imm))); val32 = READ_REG(rn); if (C_FLAG) { rslt32 = val32 - tmp32; carry = val32 >= tmp32; } else { rslt32 = val32 - tmp32 - 1; carry = val32 > tmp32; } if (rd==15) WRITE_CPSR(SPSR); else ASGN_NZCV(rslt32, carry, (val32 ^ tmp32) & (val32 ^ rslt32)); WRITE_REG(rd, rslt32);}void SIMIT_IMP(sbcs_lsl_mode3_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned rs = (inst>>8)&15; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; uint32_t tmp32; uint32_t rslt32; uint32_t carry; tmp32 = (tmp32=READ_REG(rs)&0xFF, val32=READ_REG(rm), (tmp32<32)?(val32<<tmp32):0); val32 = READ_REG(rn); if (C_FLAG) { rslt32 = val32 - tmp32; carry = val32 >= tmp32; } else { rslt32 = val32 - tmp32 - 1; carry = val32 > tmp32; } if (rd==15) WRITE_CPSR(SPSR); else ASGN_NZCV(rslt32, carry, (val32 ^ tmp32) & (val32 ^ rslt32)); WRITE_REG(rd, rslt32);}void SIMIT_IMP(sbcs_lsr_mode3_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned rs = (inst>>8)&15; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; uint32_t tmp32; uint32_t rslt32; uint32_t carry; tmp32 = (tmp32=READ_REG(rs)&0xFF, val32=READ_REG(rm), (tmp32<32)?(val32>>tmp32):0); val32 = READ_REG(rn); if (C_FLAG) { rslt32 = val32 - tmp32; carry = val32 >= tmp32; } else { rslt32 = val32 - tmp32 - 1; carry = val32 > tmp32; } if (rd==15) WRITE_CPSR(SPSR); else ASGN_NZCV(rslt32, carry, (val32 ^ tmp32) & (val32 ^ rslt32)); WRITE_REG(rd, rslt32);}void SIMIT_IMP(sbcs_asr_mode3_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned rs = (inst>>8)&15; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; uint32_t tmp32; uint32_t rslt32; uint32_t carry; tmp32 = (tmp32=READ_REG(rs)&0xFF, val32=READ_REG(rm), (int32_t)val32>>(tmp32<32?tmp32:31)); val32 = READ_REG(rn); if (C_FLAG) { rslt32 = val32 - tmp32; carry = val32 >= tmp32; } else { rslt32 = val32 - tmp32 - 1; carry = val32 > tmp32; } if (rd==15) WRITE_CPSR(SPSR); else ASGN_NZCV(rslt32, carry, (val32 ^ tmp32) & (val32 ^ rslt32)); WRITE_REG(rd, rslt32);}void SIMIT_IMP(sbcs_ror_mode3_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned rs = (inst>>8)&15; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; uint32_t tmp32; uint32_t rslt32; uint32_t carry; tmp32 = (tmp32=READ_REG(rs)&0xFF, val32=READ_REG(rm), (val32>>(tmp32&0x1f))|(val32<<(32-(tmp32&0x1f)))); val32 = READ_REG(rn); if (C_FLAG) { rslt32 = val32 - tmp32; carry = val32 >= tmp32; } else { rslt32 = val32 - tmp32 - 1; carry = val32 > tmp32; } if (rd==15) WRITE_CPSR(SPSR); else ASGN_NZCV(rslt32, carry, (val32 ^ tmp32) & (val32 ^ rslt32)); WRITE_REG(rd, rslt32);}void SIMIT_IMP(rsbi_imm_mode1_) (emulator_t *emu, target_inst_t inst){ unsigned imm8 = (inst>>0)&255; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; WRITE_REG(rd, imm8 - READ_REG(rn));}void SIMIT_IMP(rsbi_rot_mode1_) (emulator_t *emu, target_inst_t inst){ unsigned imm8 = (inst>>0)&255; unsigned rotate = (inst>>8)&15; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; WRITE_REG(rd, ((imm8>>(rotate<<1))|(imm8<<(32-(rotate<<1)))) - READ_REG(rn));}void SIMIT_IMP(rsbis_imm_mode1_) (emulator_t *emu, target_inst_t inst){ unsigned imm8 = (inst>>0)&255; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; uint32_t tmp32; uint32_t rslt32; val32 = imm8; tmp32 = READ_REG(rn); rslt32 = val32 - tmp32; if (rd==15) WRITE_CPSR(SPSR); else ASGN_NZCV(rslt32, val32>=tmp32, (val32 ^ tmp32) & (val32 ^ rslt32)); WRITE_REG(rd, rslt32);}void SIMIT_IMP(rsbis_rot_mode1_) (emulator_t *emu, target_inst_t inst){ unsigned imm8 = (inst>>0)&255; unsigned rotate = (inst>>8)&15; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; uint32_t tmp32; uint32_t rslt32; val32 = ((imm8>>(rotate<<1))|(imm8<<(32-(rotate<<1)))); tmp32 = READ_REG(rn); rslt32 = val32 - tmp32; if (rd==15) WRITE_CPSR(SPSR); else ASGN_NZCV(rslt32, val32>=tmp32, (val32 ^ tmp32) & (val32 ^ rslt32)); WRITE_REG(rd, rslt32);}void SIMIT_IMP(rsb_lsl_mode2_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned shift_imm = (inst>>7)&31; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; WRITE_REG(rd, (READ_REG(rm)<<shift_imm) - READ_REG(rn));}void SIMIT_IMP(rsb_zero_mode2_) (emulator_t *emu, target_inst_t inst){ unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; WRITE_REG(rd, 0 - READ_REG(rn));}void SIMIT_IMP(rsb_lsr_mode2_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned shift_imm = (inst>>7)&31; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; WRITE_REG(rd, (READ_REG(rm)>>shift_imm) - READ_REG(rn));}void SIMIT_IMP(rsb_sign_mode2_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; WRITE_REG(rd, (BIT31(READ_REG(rm))?~0:0) - READ_REG(rn));}void SIMIT_IMP(rsb_asr_mode2_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned shift_imm = (inst>>7)&31; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; WRITE_REG(rd, ((int32_t)(READ_REG(rm))>>shift_imm) - READ_REG(rn));}void SIMIT_IMP(rsb_rrx_mode2_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; WRITE_REG(rd, ((READ_REG(rm)>>1)|(C_FLAG<<31)) - READ_REG(rn));}void SIMIT_IMP(rsb_ror_mode2_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned shift_imm = (inst>>7)&31; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; WRITE_REG(rd, (val32=READ_REG(rm), (val32>>shift_imm)|(val32<<(32-shift_imm))) - READ_REG(rn));}void SIMIT_IMP(rsb_lsl_mode3_) (emulator_t *emu, target_inst_t inst){ unsigned rm = (inst>>0)&15; unsigned rs = (inst>>8)&15; unsigned rd = (inst>>12)&15; unsigned rn = (inst>>16)&15; uint32_t val32; uint32_t tmp32; WRITE_REG(rd, (tmp32=READ_REG(rs)&0xFF, val32=RE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -