19template <
typename TInstrContext>
class TbbH2Op {
21 using It =
typename TInstrContext::It;
22 using Pc =
typename TInstrContext::Pc;
24 template <
typename TArg0,
typename TArg1>
26 const TArg0 &rn,
const TArg1 &rm) {
28 const bool is_tbh = (iflags &
static_cast<InstrFlagsSet
>(InstrFlags::kTbh)) != 0U;
29 const auto m = ictx.cpua.ReadRegister(rm.Get());
30 const auto n = ictx.cpua.ReadRegister(rn.Get());
31 me_adr_t halfwords{0U};
33 me_adr_t adr = (n + Alu32::LSL(m, 1U));
35 ictx.bus.template ReadOrRaise<u16>(ictx.cpua, adr,
36 BusExceptionType::kRaisePreciseDataBusError));
41 ictx.bus.template ReadOrRaise<u8>(ictx.cpua, adr,
42 BusExceptionType::kRaisePreciseDataBusError));
46 const me_adr_t pc =
static_cast<me_adr_t
>(ictx.cpua.template ReadRegister<RegisterId::kPc>());
47 Pc::BranchWritePC(ictx.cpua, pc + (halfwords << 1U));
48 return Ok(kNoInstrExecFlags);
52template <
typename TOp,
typename TInstrContext>
class BinaryBranchInstr {
54 using It =
typename TInstrContext::It;
55 using Pc =
typename TInstrContext::Pc;
57 template <
typename TArg0,
typename TArg1>
59 const TArg0 &rn,
const TArg1 &rm) {
62 if (!condition_passed) {
63 PostExecAdvancePcAndIt::Call(ictx, iflags);
75 BinaryBranchInstr() =
delete;
80 ~BinaryBranchInstr() =
delete;
86 BinaryBranchInstr(
const BinaryBranchInstr &r_src) =
delete;
92 BinaryBranchInstr &operator=(
const BinaryBranchInstr &r_src) =
delete;
98 BinaryBranchInstr(BinaryBranchInstr &&r_src) =
delete;
104 BinaryBranchInstr &operator=(BinaryBranchInstr &&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