20 template <
typename TDest,
typename TArg0>
22 const TDest &rd,
const TArg0 &rm,
const u8 &rotation) {
23 const auto m = ictx.cpua.ReadRegister(rm.Get());
24 const u32 rotated = Alu32::ROR(m, rotation);
26 const auto op_res =
OpResult{data,
false,
false};
28 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,
typename TArg0>
44 const TDest &rd,
const TArg0 &rm,
const u8 &rotation) {
45 const auto m = ictx.cpua.ReadRegister(rm.Get());
46 const u32 rotated = Alu32::ROR(m, rotation);
48 const auto op_res =
OpResult{data,
false,
false};
50 PostExecWriteRegPcExcluded::Call(ictx, rd, op_res.value);
51 PostExecOptionalSetFlags::Call(ictx, iflags, op_res);
52 PostExecAdvancePcAndIt::Call(ictx, iflags);
53 return Ok(kNoInstrExecFlags);
64 template <
typename TDest,
typename TArg0>
66 const TDest &rd,
const TArg0 &rm,
const u8 &rotation) {
67 const auto m = ictx.cpua.ReadRegister(rm.Get());
68 const u32 rotated = Alu32::ROR(m, rotation);
70 const auto op_res =
OpResult{data,
false,
false};
72 PostExecWriteRegPcExcluded::Call(ictx, rd, op_res.value);
73 PostExecOptionalSetFlags::Call(ictx, iflags, op_res);
74 PostExecAdvancePcAndIt::Call(ictx, iflags);
75 return Ok(kNoInstrExecFlags);
86 template <
typename TDest,
typename TArg0>
88 const TDest &rd,
const TArg0 &rm,
const u8 &rotation) {
89 const auto m = ictx.cpua.ReadRegister(rm.Get());
90 const u32 rotated = Alu32::ROR(m, rotation);
92 const auto op_res =
OpResult{val,
false,
false};
94 PostExecWriteRegPcExcluded::Call(ictx, rd, op_res.value);
95 PostExecOptionalSetFlags::Call(ictx, iflags, op_res);
96 PostExecAdvancePcAndIt::Call(ictx, iflags);
97 return Ok(kNoInstrExecFlags);
101template <
typename TOp,
typename TInstrContext>
class BinaryInstrWithRotation {
103 using It =
typename TInstrContext::It;
104 using Pc =
typename TInstrContext::Pc;
106 template <
typename TDest,
typename TArg0>
108 const TDest &rd,
const TArg0 &rm,
const u8 &rotation) {
110 if (!condition_passed) {
111 PostExecAdvancePcAndIt::Call(ictx, iflags);
123 BinaryInstrWithRotation() =
delete;
128 ~BinaryInstrWithRotation() =
delete;
134 BinaryInstrWithRotation(
const BinaryInstrWithRotation &r_src) =
delete;
140 BinaryInstrWithRotation &operator=(
const BinaryInstrWithRotation &r_src) =
delete;
146 BinaryInstrWithRotation(BinaryInstrWithRotation &&r_src) =
delete;
152 BinaryInstrWithRotation &operator=(BinaryInstrWithRotation &&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