libmicroemu 0.2.0
ARM Microcontroller Emulator Library
Loading...
Searching...
No Matches
binary_branch_instr_with_imm.h
1#pragma once
2#include "libmicroemu/internal/decoder/decoder.h"
3#include "libmicroemu/internal/executor/instr/post_exec.h"
4#include "libmicroemu/internal/executor/instr_context.h"
5#include "libmicroemu/internal/executor/instr_exec_results.h"
7#include "libmicroemu/internal/utils/rarg.h"
8#include "libmicroemu/register_details.h"
9#include "libmicroemu/types.h"
10
11namespace libmicroemu::internal {
12
18template <typename TInstrContext> class CbNZ1ImmOp {
19public:
20 using It = typename TInstrContext::It;
21 using Pc = typename TInstrContext::Pc;
22
23 template <typename TArg0>
24 static Result<InstrExecFlagsSet> Call(TInstrContext &ictx, const InstrFlagsSet &iflags,
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;
30
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);
35 } else {
36 PostExecAdvancePcAndIt::Call(ictx, iflags);
37 };
38
39 return Ok(kNoInstrExecFlags);
40 }
41};
42
43template <typename TOp, typename TInstrContext> class BinaryBranchInstrWithImm {
44public:
45 using It = typename TInstrContext::It;
46 using Pc = typename TInstrContext::Pc;
47
48 template <typename TArg0>
49 static Result<InstrExecResult> Call(TInstrContext &ictx, const InstrFlagsSet &iflags,
50 const TArg0 &rn, const u32 &imm) {
51
52 TRY_ASSIGN(eflags, InstrExecResult, TOp::Call(ictx, iflags, rn, imm));
53 return Ok(InstrExecResult{eflags});
54 }
55
56private:
60 BinaryBranchInstrWithImm() = delete;
61
65 ~BinaryBranchInstrWithImm() = delete;
66
71 BinaryBranchInstrWithImm(const BinaryBranchInstrWithImm &r_src) = delete;
72
77 BinaryBranchInstrWithImm &operator=(const BinaryBranchInstrWithImm &r_src) = delete;
78
83 BinaryBranchInstrWithImm(BinaryBranchInstrWithImm &&r_src) = delete;
84
89 BinaryBranchInstrWithImm &operator=(BinaryBranchInstrWithImm &&r_src) = delete;
90};
91
92} // namespace libmicroemu::internal
Compare branch.
Definition binary_branch_instr_with_imm.h:18
The libmicroemu::internal namespace contains all classes and functions of libmicroemu which are priva...
Definition bkpt_flags.h:6
Contains the Result class which is used to return the result of a function.
#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
Definition instr_exec_results.h:23
Definition result.h:15