20 using It =
typename TInstrContext::It;
21 using Pc =
typename TInstrContext::Pc;
23 template <
typename TArg0>
25 const TArg0 &rn,
const u32 &imm) {
26 const bool is_non_zero = (iflags &
static_cast<InstrFlagsSet
>(InstrFlags::kNonZero)) != 0U;
27 const auto n = ictx.cpua.ReadRegister(rn.Get());
28 const me_adr_t pc =
static_cast<me_adr_t
>(ictx.cpua.template ReadRegister<RegisterId::kPc>());
29 const u32 new_pc = pc + imm;
31 if ((n == 0U) && (is_non_zero ==
false)) {
32 Pc::BranchWritePC(ictx.cpua, new_pc);
33 }
else if ((n != 0U) && (is_non_zero ==
true)) {
34 Pc::BranchWritePC(ictx.cpua, new_pc);
36 PostExecAdvancePcAndIt::Call(ictx, iflags);
39 return Ok(kNoInstrExecFlags);
43template <
typename TOp,
typename TInstrContext>
class BinaryBranchInstrWithImm {
45 using It =
typename TInstrContext::It;
46 using Pc =
typename TInstrContext::Pc;
48 template <
typename TArg0>
50 const TArg0 &rn,
const u32 &imm) {
60 BinaryBranchInstrWithImm() =
delete;
65 ~BinaryBranchInstrWithImm() =
delete;
71 BinaryBranchInstrWithImm(
const BinaryBranchInstrWithImm &r_src) =
delete;
77 BinaryBranchInstrWithImm &operator=(
const BinaryBranchInstrWithImm &r_src) =
delete;
83 BinaryBranchInstrWithImm(BinaryBranchInstrWithImm &&r_src) =
delete;
89 BinaryBranchInstrWithImm &operator=(BinaryBranchInstrWithImm &&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