libmicroemu 0.2.0
ARM Microcontroller Emulator Library
Loading...
Searching...
No Matches
mnemonic_builder_variadic_loadstore_instr.h
1#pragma once
2
4#include "libmicroemu/types.h"
5
6namespace libmicroemu::internal {
7
8template <typename TContext> class MnemonicBuilderVariadicLoadStoreInstr {
9public:
10 using It = typename TContext::It;
11 using Reg = typename TContext::Reg;
12 using SReg = typename TContext::SReg;
13
14 template <typename TArg0>
15 static void Build(const char *instr_spec, TContext &mctx, const MnemonicBuilderFlagsSet &bflags,
16 const InstrFlagsSet &iflags, const TArg0 &rn, const u32 &registers,
17 bool suppress_dest_register) {
18 static_cast<void>(bflags);
19 const bool is_wback = (iflags & static_cast<InstrFlagsSet>(InstrFlags::kWBack)) != 0U;
20 mctx.builder.AddString(instr_spec).AddString(It::GetConditionAsStr(mctx.cpua)).AddChar(' ');
21
22 if (!suppress_dest_register) {
23 mctx.builder.AddString(Reg::GetRegisterName(rn.Get()));
24 }
25 if (is_wback) {
26 mctx.builder.AddChar('!');
27 }
28 if (!suppress_dest_register) {
29 mctx.builder.AddString(", ");
30 }
31 mctx.builder.AddChar('{');
32 auto regs_cnt = Bm32::BitCount(registers);
33 for (u32 cpua = 0U; cpua <= 15U; ++cpua) {
34 u32 bm = 0b1U << cpua;
35 if ((registers & bm) != 0U) {
36 auto r_spec = Reg::GetRegisterName(static_cast<RegisterId>(cpua));
37
38 mctx.builder.AddString(r_spec);
39 regs_cnt--;
40 if (regs_cnt > 0U) {
41 mctx.builder.AddString(", ");
42 }
43 }
44 }
45 mctx.builder.AddChar('}');
46 mctx.builder.Terminate();
47 }
48
49private:
53 MnemonicBuilderVariadicLoadStoreInstr() = delete;
54
58 ~MnemonicBuilderVariadicLoadStoreInstr() = delete;
59
64 MnemonicBuilderVariadicLoadStoreInstr(const MnemonicBuilderVariadicLoadStoreInstr &r_src) =
65 default;
66
71 MnemonicBuilderVariadicLoadStoreInstr &
72 operator=(const MnemonicBuilderVariadicLoadStoreInstr &r_src) = delete;
73
78 MnemonicBuilderVariadicLoadStoreInstr(MnemonicBuilderVariadicLoadStoreInstr &&r_src) = delete;
79
84 MnemonicBuilderVariadicLoadStoreInstr &
85 operator=(MnemonicBuilderVariadicLoadStoreInstr &&r_src) = delete;
86};
87
88} // namespace libmicroemu::internal
static u32 BitCount(const u32 &value)
Definition bit_manip.h:243
The libmicroemu::internal namespace contains all classes and functions of libmicroemu which are priva...
Definition bkpt_flags.h:6
RegisterId
Enumeration of register IDs.
Definition register_id.h:13
Contains the Result class which is used to return the result of a function.