16template <
typename TInstrContext>
class VariadicStoreInstrDb {
18 using It =
typename TInstrContext::It;
19 using Pc =
typename TInstrContext::Pc;
21 template <
typename TArg0>
23 const TArg0 &rn,
const u32 ®isters) {
26 if (!condition_passed) {
27 PostExecAdvancePcAndIt::Call(ictx, iflags);
30 const auto n = ictx.cpua.ReadRegister(rn.Get());
32 u32 address = n - 4U * reg_count;
34 for (u32 reg = 0U; reg <= 14U; ++reg) {
36 if ((registers & bm) != 0U) {
37 const auto r = ictx.cpua.ReadRegister(
static_cast<RegisterId>(reg));
39 ictx.bus.template WriteOrRaise<u32>(ictx.cpua, address, r,
40 BusExceptionType::kRaisePreciseDataBusError));
49 const bool is_wback = (iflags &
static_cast<InstrFlagsSet
>(InstrFlags::kWBack)) != 0U;
52 const auto wback_val = n - 4U * reg_count;
55 PostExecWriteRegPcExcluded::Call(ictx, rn, wback_val);
57 PostExecAdvancePcAndIt::Call(ictx, iflags);
66 VariadicStoreInstrDb() =
delete;
71 ~VariadicStoreInstrDb() =
delete;
77 VariadicStoreInstrDb(
const VariadicStoreInstrDb &r_src) =
delete;
83 VariadicStoreInstrDb &operator=(
const VariadicStoreInstrDb &r_src) =
delete;
89 VariadicStoreInstrDb(VariadicStoreInstrDb &&r_src) =
delete;
95 VariadicStoreInstrDb &operator=(VariadicStoreInstrDb &&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
#define TRY(OUT_TYPE, CALL)
Try to call a function and return an error if the call fails.
Definition result.h:138