20 template <
typename TDest>
23 auto apsr = ictx.cpua.template ReadSpecialRegister<SpecialRegisterId::kApsr>();
24 const auto op_res =
OpResult{imm_carry.out, imm_carry.carry_out,
25 (apsr & ApsrRegister::kVMsk) == ApsrRegister::kVMsk};
27 PostExecWriteRegPcExcluded::Call(ictx, rd, op_res.value);
29 PostExecOptionalSetFlags::Call(ictx, iflags, op_res);
30 PostExecAdvancePcAndIt::Call(ictx, iflags);
31 return Ok(kNoInstrExecFlags);
42 template <
typename TDest>
45 auto apsr = ictx.cpua.template ReadSpecialRegister<SpecialRegisterId::kApsr>();
46 const auto op_res =
OpResult{~imm_carry.out, imm_carry.carry_out,
47 (apsr & ApsrRegister::kVMsk) == ApsrRegister::kVMsk};
49 PostExecWriteRegPcExcluded::Call(ictx, rd, op_res.value);
50 PostExecOptionalSetFlags::Call(ictx, iflags, op_res);
51 PostExecAdvancePcAndIt::Call(ictx, iflags);
52 return Ok(kNoInstrExecFlags);
56template <
typename TOp,
typename TInstrContext>
class UnaryInstrImmCarry {
58 using It =
typename TInstrContext::It;
59 using Pc =
typename TInstrContext::Pc;
61 template <
typename TDest>
65 if (!condition_passed) {
66 PostExecAdvancePcAndIt::Call(ictx, iflags);
78 UnaryInstrImmCarry() =
delete;
83 ~UnaryInstrImmCarry() =
delete;
89 UnaryInstrImmCarry(
const UnaryInstrImmCarry &r_src) =
delete;
95 UnaryInstrImmCarry &operator=(
const UnaryInstrImmCarry &r_src) =
delete;
101 UnaryInstrImmCarry(UnaryInstrImmCarry &&r_src) =
delete;
107 UnaryInstrImmCarry &operator=(UnaryInstrImmCarry &&r_src) =
delete;
#define TRY_ASSIGN(NAME, OUT_TYPE, CALL)
Try to assign a value to a variable and return an error if the assignment fails.
Definition result.h:123