13template <
typename TContext>
class MnemonicBuilderBinaryInstrWithShift {
15 using It =
typename TContext::It;
16 using Reg =
typename TContext::Reg;
17 using SReg =
typename TContext::SReg;
19 template <
typename TDest,
typename TArg0>
20 static void Build(
const char *instr_spec, TContext &mctx,
const MnemonicBuilderFlagsSet &bflags,
21 const InstrFlagsSet &iflags,
const TDest &rd,
const TArg0 &rm,
24 const bool is_setflags = (iflags &
static_cast<InstrFlagsSet
>(InstrFlags::kSetFlags)) != 0U;
25 const bool is_supress_shift_type =
26 (bflags &
static_cast<MnemonicBuilderFlagsSet
>(MnemonicBuilderFlags::kSupressShiftType)) !=
28 mctx.builder.AddString(instr_spec)
29 .AddString(is_setflags ==
true ?
"S" :
"")
30 .AddString(It::GetConditionAsStr(mctx.cpua))
32 .AddString(Reg::GetRegisterName(rd.Get()))
34 .AddString(Reg::GetRegisterName(rm.Get()))
37 if (!is_supress_shift_type) {
38 mctx.builder.AddString(shift_res.GetShiftTypeAsStr()).AddChar(
' ');
41 mctx.builder.AddString(
"#").AddUInt(shift_res.value).Terminate();
48 MnemonicBuilderBinaryInstrWithShift() =
delete;
53 ~MnemonicBuilderBinaryInstrWithShift() =
delete;
59 MnemonicBuilderBinaryInstrWithShift(
const MnemonicBuilderBinaryInstrWithShift &r_src) =
default;
65 MnemonicBuilderBinaryInstrWithShift &
66 operator=(
const MnemonicBuilderBinaryInstrWithShift &r_src) =
delete;
72 MnemonicBuilderBinaryInstrWithShift(MnemonicBuilderBinaryInstrWithShift &&r_src) =
delete;
78 MnemonicBuilderBinaryInstrWithShift &
79 operator=(MnemonicBuilderBinaryInstrWithShift &&r_src) =
delete;