17template <
typename TInstrContext>
class Mls3Op {
19 template <
typename TDest,
typename TArg0,
typename TArg1,
typename TArg2>
21 const TDest &rd,
const TArg0 &rn,
const TArg1 &rm,
23 const auto n = ictx.cpua.ReadRegister(rn.Get());
24 const auto m = ictx.cpua.ReadRegister(rm.Get());
25 const auto a = ictx.cpua.ReadRegister(ra.Get());
28 static_cast<u32
>(
static_cast<i32
>(a) -
static_cast<i32
>(n) *
static_cast<i32
>(m));
30 const auto op_result =
OpResult{result,
false,
false};
32 PostExecWriteRegPcExcluded::Call(ictx, rd, op_result.value);
33 PostExecOptionalSetFlags::Call(ictx, iflags, op_result);
34 PostExecAdvancePcAndIt::Call(ictx, iflags);
35 return Ok(kNoInstrExecFlags);
44template <
typename TInstrContext>
class Mla3Op {
46 template <
typename TDest,
typename TArg0,
typename TArg1,
typename TArg2>
48 const TDest &rd,
const TArg0 &rn,
const TArg1 &rm,
50 const auto n = ictx.cpua.ReadRegister(rn.Get());
51 const auto m = ictx.cpua.ReadRegister(rm.Get());
52 const auto a = ictx.cpua.ReadRegister(ra.Get());
54 auto apsr = ictx.cpua.template ReadSpecialRegister<SpecialRegisterId::kApsr>();
57 static_cast<u32
>(
static_cast<i32
>(n) *
static_cast<i32
>(m) +
static_cast<i32
>(a));
59 const auto op_result =
OpResult{result, (apsr & ApsrRegister::kCMsk) == ApsrRegister::kCMsk,
60 (apsr & ApsrRegister::kVMsk) == ApsrRegister::kVMsk};
62 PostExecWriteRegPcExcluded::Call(ictx, rd, op_result.value);
63 PostExecOptionalSetFlags::Call(ictx, iflags, op_result);
64 PostExecAdvancePcAndIt::Call(ictx, iflags);
65 return Ok(kNoInstrExecFlags);
69template <
typename TOp,
typename TInstrContext>
class TernaryInstr {
71 using It =
typename TInstrContext::It;
72 using Pc =
typename TInstrContext::Pc;
74 template <
typename TDest,
typename TArg0,
typename TArg1,
typename TArg2>
76 const TDest &rd,
const TArg0 &rn,
const TArg1 &rm,
79 if (!condition_passed) {
80 PostExecAdvancePcAndIt::Call(ictx, iflags);
92 TernaryInstr() =
delete;
97 ~TernaryInstr() =
delete;
103 TernaryInstr(
const TernaryInstr &r_src) =
delete;
109 TernaryInstr &operator=(
const TernaryInstr &r_src) =
delete;
115 TernaryInstr(TernaryInstr &&r_src) =
delete;
121 TernaryInstr &operator=(TernaryInstr &&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