18template <
typename TInstrContext>
class Umull2Op {
20 template <
typename TDestLo,
typename TDestHi,
typename TArg0,
typename TArg1>
22 const TDestLo &rd_lo,
const TDestHi &rd_hi,
const TArg0 &rn,
24 const auto n = ictx.cpua.ReadRegister(rn.Get());
25 const auto m = ictx.cpua.ReadRegister(rm.Get());
27 const u64 result = (
static_cast<u64
>(n) *
static_cast<u64
>(m));
28 const u32 result_lo =
static_cast<u32
>(result & 0xFFFFFFFFU);
29 const u32 result_hi =
static_cast<u32
>((result >> 32U) & 0xFFFFFFFFU);
31 PostExecWriteRegPcExcluded::Call(ictx, rd_lo, result_lo);
32 PostExecWriteRegPcExcluded::Call(ictx, rd_hi, result_hi);
33 PostExecAdvancePcAndIt::Call(ictx, iflags);
35 return Ok(kNoInstrExecFlags);
44template <
typename TInstrContext>
class Smull2Op {
46 template <
typename TDestLo,
typename TDestHi,
typename TArg0,
typename TArg1>
48 const TDestLo &rd_lo,
const TDestHi &rd_hi,
const TArg0 &rn,
50 const auto n =
static_cast<i32
>(ictx.cpua.ReadRegister(rn.Get()));
51 const auto m =
static_cast<i32
>(ictx.cpua.ReadRegister(rm.Get()));
52 const u64 result =
static_cast<u64
>(
static_cast<i64
>(n) *
static_cast<i64
>(m));
53 const u32 result_lo =
static_cast<u32
>(result & 0xFFFFFFFFU);
54 const u32 result_hi =
static_cast<u32
>((result >> 32U) & 0xFFFFFFFFU);
56 PostExecWriteRegPcExcluded::Call(ictx, rd_lo, result_lo);
57 PostExecWriteRegPcExcluded::Call(ictx, rd_hi, result_hi);
58 PostExecAdvancePcAndIt::Call(ictx, iflags);
60 return Ok(kNoInstrExecFlags);
69template <
typename TInstrContext>
class Umlal2Op {
71 template <
typename TDestLo,
typename TDestHi,
typename TArg0,
typename TArg1>
73 const TDestLo &rd_lo,
const TDestHi &rd_hi,
const TArg0 &rn,
76 const u32 rdhi = ictx.cpua.ReadRegister(rd_hi.Get());
77 const u32 rdlo = ictx.cpua.ReadRegister(rd_lo.Get());
78 const u32 rd =
static_cast<u64
>(rdhi) << 32U |
static_cast<u64
>(rdlo);
80 const auto n = ictx.cpua.ReadRegister(rn.Get());
81 const auto m = ictx.cpua.ReadRegister(rm.Get());
83 const u64 result = (
static_cast<u64
>(n) *
static_cast<u64
>(m)) + rd;
84 const u32 result_lo =
static_cast<u32
>(result & 0xFFFFFFFFU);
85 const u32 result_hi =
static_cast<u32
>((result >> 32U) & 0xFFFFFFFFU);
87 PostExecWriteRegPcExcluded::Call(ictx, rd_lo, result_lo);
88 PostExecWriteRegPcExcluded::Call(ictx, rd_hi, result_hi);
89 PostExecAdvancePcAndIt::Call(ictx, iflags);
91 return Ok(kNoInstrExecFlags);
95template <
typename TOp,
typename TInstrContext>
class Binary64bitInstr {
97 using It =
typename TInstrContext::It;
98 using Pc =
typename TInstrContext::Pc;
100 template <
typename TDestLo,
typename TDestHi,
typename TArg0,
typename TArg1>
102 const TDestLo &rd_lo,
const TDestHi &rd_hi,
const TArg0 &rn,
105 if (!condition_passed) {
106 PostExecAdvancePcAndIt::Call(ictx, iflags);
118 Binary64bitInstr() =
delete;
123 ~Binary64bitInstr() =
delete;
129 Binary64bitInstr(
const Binary64bitInstr &r_src) =
delete;
135 Binary64bitInstr &operator=(
const Binary64bitInstr &r_src) =
delete;
141 Binary64bitInstr(Binary64bitInstr &&r_src) =
delete;
147 Binary64bitInstr &operator=(Binary64bitInstr &&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