20 template <
typename TDest,
typename TArg0>
22 const TDest &rd,
const TArg0 &rn,
24 auto apsr = ictx.cpua.template ReadSpecialRegister<SpecialRegisterId::kApsr>();
25 const auto n = ictx.cpua.ReadRegister(rn.Get());
27 const auto result = Alu32::OR(n, imm_carry.out);
29 OpResult{result, imm_carry.carry_out, (apsr & ApsrRegister::kVMsk) == ApsrRegister::kVMsk};
31 PostExecWriteRegPcExcluded::Call(ictx, rd, op_res.value);
32 PostExecOptionalSetFlags::Call(ictx, iflags, op_res);
33 PostExecAdvancePcAndIt::Call(ictx, iflags);
34 return Ok(kNoInstrExecFlags);
45 template <
typename TDest,
typename TArg0>
47 const TDest &rd,
const TArg0 &rn,
49 auto apsr = ictx.cpua.template ReadSpecialRegister<SpecialRegisterId::kApsr>();
50 const auto n = ictx.cpua.ReadRegister(rn.Get());
51 const auto result = Alu32::EOR(n, imm_carry.out);
53 OpResult{result, imm_carry.carry_out, (apsr & ApsrRegister::kVMsk) == ApsrRegister::kVMsk};
54 PostExecWriteRegPcExcluded::Call(ictx, rd, op_res.value);
55 PostExecOptionalSetFlags::Call(ictx, iflags, op_res);
56 PostExecAdvancePcAndIt::Call(ictx, iflags);
57 return Ok(kNoInstrExecFlags);
68 template <
typename TDest,
typename TArg0>
70 const TDest &rd,
const TArg0 &rn,
72 auto apsr = ictx.cpua.template ReadSpecialRegister<SpecialRegisterId::kApsr>();
73 const auto n = ictx.cpua.ReadRegister(rn.Get());
74 const auto result = Alu32::AND(n, imm_carry.out);
76 OpResult{result, imm_carry.carry_out, (apsr & ApsrRegister::kVMsk) == ApsrRegister::kVMsk};
77 PostExecWriteRegPcExcluded::Call(ictx, rd, op_res.value);
78 PostExecOptionalSetFlags::Call(ictx, iflags, op_res);
79 PostExecAdvancePcAndIt::Call(ictx, iflags);
80 return Ok(kNoInstrExecFlags);
91 template <
typename TDest,
typename TArg0>
93 const TDest &rd,
const TArg0 &rn,
95 auto apsr = ictx.cpua.template ReadSpecialRegister<SpecialRegisterId::kApsr>();
96 const auto n = ictx.cpua.ReadRegister(rn.Get());
97 const auto result = Alu32::AND(n, ~imm_carry.out);
99 OpResult{result, imm_carry.carry_out, (apsr & ApsrRegister::kVMsk) == ApsrRegister::kVMsk};
100 PostExecWriteRegPcExcluded::Call(ictx, rd, op_res.value);
101 PostExecOptionalSetFlags::Call(ictx, iflags, op_res);
102 PostExecAdvancePcAndIt::Call(ictx, iflags);
103 return Ok(kNoInstrExecFlags);
107template <
typename TOp,
typename TInstrContext>
class BinaryInstrWithImmCarry {
109 using It =
typename TInstrContext::It;
110 using Pc =
typename TInstrContext::Pc;
112 template <
typename TDest,
typename TArg0>
114 const TDest &rd,
const TArg0 &rn,
117 if (!condition_passed) {
118 PostExecAdvancePcAndIt::Call(ictx, iflags);
130 BinaryInstrWithImmCarry() =
delete;
135 ~BinaryInstrWithImmCarry() =
delete;
141 BinaryInstrWithImmCarry(
const BinaryInstrWithImmCarry &r_src) =
delete;
147 BinaryInstrWithImmCarry &operator=(
const BinaryInstrWithImmCarry &r_src) =
delete;
153 BinaryInstrWithImmCarry(BinaryInstrWithImmCarry &&r_src) =
delete;
159 BinaryInstrWithImmCarry &operator=(BinaryInstrWithImmCarry &&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