let {{
- header_output = '''
- uint64_t join32to64(uint32_t r1, uint32_t r0);
- '''
- decoder_output = '''
- uint64_t join32to64(uint32_t r1, uint32_t r0)
- {
- uint64_t r = r1;
- r <<= 32;
- r |= r0;
- return r;
- }
- '''
- exec_output = '''
- uint64_t join32to64(uint32_t r1, uint32_t r0);
- '''
-
-
- armCode = '''
- PseudoInst::arm(xc->tcBase());
- '''
-
- armIop = InstObjParams("arm", "Arm", "PredOp",
- { "code": armCode,
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(armIop)
- decoder_output += BasicConstructor.subst(armIop)
- exec_output += PredOpExecute.subst(armIop)
-
- quiesceCode = '''
- PseudoInst::quiesce(xc->tcBase());
- '''
-
- quiesceIop = InstObjParams("quiesce", "Quiesce", "PredOp",
- { "code": quiesceCode,
- "predicate_test": predicateTest },
- ["IsNonSpeculative", "IsQuiesce"])
- header_output += BasicDeclare.subst(quiesceIop)
- decoder_output += BasicConstructor.subst(quiesceIop)
- exec_output += QuiescePredOpExecute.subst(quiesceIop)
-
- quiesceNsCode = '''
- PseudoInst::quiesceNs(xc->tcBase(), join32to64(R1, R0));
- '''
-
- quiesceNsCode64 = '''
- PseudoInst::quiesceNs(xc->tcBase(), X0);
- '''
-
- quiesceNsIop = InstObjParams("quiesceNs", "QuiesceNs", "PredOp",
- { "code": quiesceNsCode,
- "predicate_test": predicateTest },
- ["IsNonSpeculative", "IsQuiesce"])
- header_output += BasicDeclare.subst(quiesceNsIop)
- decoder_output += BasicConstructor.subst(quiesceNsIop)
- exec_output += QuiescePredOpExecute.subst(quiesceNsIop)
-
- quiesceNsIop = InstObjParams("quiesceNs", "QuiesceNs64", "PredOp",
- { "code": quiesceNsCode64,
- "predicate_test": predicateTest },
- ["IsNonSpeculative", "IsQuiesce"])
- header_output += BasicDeclare.subst(quiesceNsIop)
- decoder_output += BasicConstructor.subst(quiesceNsIop)
- exec_output += QuiescePredOpExecute.subst(quiesceNsIop)
-
- quiesceCyclesCode = '''
- PseudoInst::quiesceCycles(xc->tcBase(), join32to64(R1, R0));
- '''
-
- quiesceCyclesCode64 = '''
- PseudoInst::quiesceCycles(xc->tcBase(), X0);
- '''
-
- quiesceCyclesIop = InstObjParams("quiesceCycles", "QuiesceCycles", "PredOp",
- { "code": quiesceCyclesCode,
- "predicate_test": predicateTest },
- ["IsNonSpeculative", "IsQuiesce", "IsUnverifiable"])
- header_output += BasicDeclare.subst(quiesceCyclesIop)
- decoder_output += BasicConstructor.subst(quiesceCyclesIop)
- exec_output += QuiescePredOpExecute.subst(quiesceCyclesIop)
-
- quiesceCyclesIop = InstObjParams("quiesceCycles", "QuiesceCycles64", "PredOp",
- { "code": quiesceCyclesCode64,
- "predicate_test": predicateTest },
- ["IsNonSpeculative", "IsQuiesce", "IsUnverifiable"])
- header_output += BasicDeclare.subst(quiesceCyclesIop)
- decoder_output += BasicConstructor.subst(quiesceCyclesIop)
- exec_output += QuiescePredOpExecute.subst(quiesceCyclesIop)
-
- quiesceTimeCode = '''
- uint64_t qt_val = PseudoInst::quiesceTime(xc->tcBase());
- R0 = bits(qt_val, 31, 0);
- R1 = bits(qt_val, 63, 32);
- '''
-
- quiesceTimeCode64 = '''
- X0 = PseudoInst::quiesceTime(xc->tcBase());
- '''
- quiesceTimeIop = InstObjParams("quiesceTime", "QuiesceTime", "PredOp",
- { "code": quiesceTimeCode,
- "predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
- header_output += BasicDeclare.subst(quiesceTimeIop)
- decoder_output += BasicConstructor.subst(quiesceTimeIop)
- exec_output += PredOpExecute.subst(quiesceTimeIop)
-
- quiesceTimeIop = InstObjParams("quiesceTime", "QuiesceTime64", "PredOp",
- { "code": quiesceTimeCode64,
- "predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
- header_output += BasicDeclare.subst(quiesceTimeIop)
- decoder_output += BasicConstructor.subst(quiesceTimeIop)
- exec_output += PredOpExecute.subst(quiesceTimeIop)
-
- rpnsCode = '''
- uint64_t rpns_val = PseudoInst::rpns(xc->tcBase());
- R0 = bits(rpns_val, 31, 0);
- R1 = bits(rpns_val, 63, 32);
- '''
-
- rpnsCode64 = '''
- X0 = PseudoInst::rpns(xc->tcBase());
- '''
- rpnsIop = InstObjParams("rpns", "Rpns", "PredOp",
- { "code": rpnsCode,
- "predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
- header_output += BasicDeclare.subst(rpnsIop)
- decoder_output += BasicConstructor.subst(rpnsIop)
- exec_output += PredOpExecute.subst(rpnsIop)
-
- rpnsIop = InstObjParams("rpns", "Rpns64", "PredOp",
- { "code": rpnsCode64,
- "predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
- header_output += BasicDeclare.subst(rpnsIop)
- decoder_output += BasicConstructor.subst(rpnsIop)
- exec_output += PredOpExecute.subst(rpnsIop)
-
- wakeCpuCode = '''
- PseudoInst::wakeCPU(xc->tcBase(), join32to64(R1,R0));
- '''
-
- wakeCpuCode64 = '''
- PseudoInst::wakeCPU(xc->tcBase(), X0);
- '''
-
- wakeCPUIop = InstObjParams("wakeCPU", "WakeCPU", "PredOp",
- { "code": wakeCpuCode,
- "predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
- header_output += BasicDeclare.subst(wakeCPUIop)
- decoder_output += BasicConstructor.subst(wakeCPUIop)
- exec_output += PredOpExecute.subst(wakeCPUIop)
-
- wakeCPUIop = InstObjParams("wakeCPU", "WakeCPU64", "PredOp",
- { "code": wakeCpuCode64,
- "predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
- header_output += BasicDeclare.subst(wakeCPUIop)
- decoder_output += BasicConstructor.subst(wakeCPUIop)
- exec_output += PredOpExecute.subst(wakeCPUIop)
-
- deprecated_ivlbIop = InstObjParams("deprecated_ivlb", "Deprecated_ivlb", "PredOp",
- { "code": '''warn_once("Obsolete M5 ivlb instruction encountered.\\n");''',
- "predicate_test": predicateTest })
- header_output += BasicDeclare.subst(deprecated_ivlbIop)
- decoder_output += BasicConstructor.subst(deprecated_ivlbIop)
- exec_output += PredOpExecute.subst(deprecated_ivlbIop)
-
- deprecated_ivleIop = InstObjParams("deprecated_ivle", "Deprecated_ivle", "PredOp",
- { "code": '''warn_once("Obsolete M5 ivle instruction encountered.\\n");''',
- "predicate_test": predicateTest })
- header_output += BasicDeclare.subst(deprecated_ivleIop)
- decoder_output += BasicConstructor.subst(deprecated_ivleIop)
- exec_output += PredOpExecute.subst(deprecated_ivleIop)
-
- deprecated_exit_code = '''
- warn_once("Obsolete M5 exit instruction encountered.\\n");
- PseudoInst::m5exit(xc->tcBase(), 0);
- '''
-
- deprecated_exitIop = InstObjParams("deprecated_exit", "Deprecated_exit", "PredOp",
- { "code": deprecated_exit_code,
- "predicate_test": predicateTest },
- ["No_OpClass", "IsNonSpeculative"])
- header_output += BasicDeclare.subst(deprecated_exitIop)
- decoder_output += BasicConstructor.subst(deprecated_exitIop)
- exec_output += PredOpExecute.subst(deprecated_exitIop)
-
- m5exit_code = '''
- PseudoInst::m5exit(xc->tcBase(), join32to64(R1, R0));
- '''
-
- m5exit_code64 = '''
- PseudoInst::m5exit(xc->tcBase(), X0);
- '''
-
- m5exitIop = InstObjParams("m5exit", "M5exit", "PredOp",
- { "code": m5exit_code,
- "predicate_test": predicateTest },
- ["No_OpClass", "IsNonSpeculative"])
- header_output += BasicDeclare.subst(m5exitIop)
- decoder_output += BasicConstructor.subst(m5exitIop)
- exec_output += PredOpExecute.subst(m5exitIop)
-
- m5fail_code = '''
- PseudoInst::m5fail(xc->tcBase(), join32to64(R1, R0), join32to64(R3, R2));
- '''
-
- m5fail_code64 = '''
- PseudoInst::m5fail(xc->tcBase(), X0, X1);
- '''
-
- m5failIop = InstObjParams("m5fail", "M5fail", "PredOp",
- { "code": m5fail_code,
- "predicate_test": predicateTest },
- ["No_OpClass", "IsNonSpeculative"])
- header_output += BasicDeclare.subst(m5failIop)
- decoder_output += BasicConstructor.subst(m5failIop)
- exec_output += PredOpExecute.subst(m5failIop)
-
- m5failIop = InstObjParams("m5fail", "M5fail64", "PredOp",
- { "code": m5fail_code64,
- "predicate_test": predicateTest },
- ["No_OpClass", "IsNonSpeculative"])
- header_output += BasicDeclare.subst(m5failIop)
- decoder_output += BasicConstructor.subst(m5failIop)
- exec_output += PredOpExecute.subst(m5failIop)
-
-
- m5exitIop = InstObjParams("m5exit", "M5exit64", "PredOp",
- { "code": m5exit_code64,
- "predicate_test": predicateTest },
- ["No_OpClass", "IsNonSpeculative"])
- header_output += BasicDeclare.subst(m5exitIop)
- decoder_output += BasicConstructor.subst(m5exitIop)
- exec_output += PredOpExecute.subst(m5exitIop)
-
- loadsymbolCode = '''
- PseudoInst::loadsymbol(xc->tcBase());
- '''
-
- m5sum_code = '''
- R0 = PseudoInst::m5sum(xc->tcBase(), R0, R1, R2, R3, R4, R5);
- '''
- m5sumIop = InstObjParams("m5sum", "M5sum", "PredOp",
- { "code": m5sum_code,
- "predicate_test": predicateTest },
- ["No_OpClass", "IsNonSpeculative"])
- header_output += BasicDeclare.subst(m5sumIop)
- decoder_output += BasicConstructor.subst(m5sumIop)
- exec_output += PredOpExecute.subst(m5sumIop)
-
- m5sum_code64 = '''
- X0 = PseudoInst::m5sum(xc->tcBase(), X0, X1, X2, X3, X4, X5);
- '''
- m5sumIop = InstObjParams("m5sum", "M5sum64", "PredOp",
- { "code": m5sum_code64,
- "predicate_test": predicateTest },
- ["No_OpClass", "IsNonSpeculative"])
- header_output += BasicDeclare.subst(m5sumIop)
- decoder_output += BasicConstructor.subst(m5sumIop)
- exec_output += PredOpExecute.subst(m5sumIop)
-
- loadsymbolIop = InstObjParams("loadsymbol", "Loadsymbol", "PredOp",
- { "code": loadsymbolCode,
- "predicate_test": predicateTest },
- ["No_OpClass", "IsNonSpeculative"])
- header_output += BasicDeclare.subst(loadsymbolIop)
- decoder_output += BasicConstructor.subst(loadsymbolIop)
- exec_output += PredOpExecute.subst(loadsymbolIop)
-
- initparamCode = '''
- uint64_t ip_val = PseudoInst::initParam(xc->tcBase(), join32to64(R1, R0),
- join32to64(R3, R2));
- R0 = bits(ip_val, 31, 0);
- R1 = bits(ip_val, 63, 32);
- '''
-
- initparamCode64 = '''
- X0 = PseudoInst::initParam(xc->tcBase(), X0, X1);
- '''
-
- initparamIop = InstObjParams("initparam", "Initparam", "PredOp",
- { "code": initparamCode,
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(initparamIop)
- decoder_output += BasicConstructor.subst(initparamIop)
- exec_output += PredOpExecute.subst(initparamIop)
-
- initparamIop = InstObjParams("initparam", "Initparam64", "PredOp",
- { "code": initparamCode64,
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(initparamIop)
- decoder_output += BasicConstructor.subst(initparamIop)
- exec_output += PredOpExecute.subst(initparamIop)
-
- resetstats_code = '''
- PseudoInst::resetstats(xc->tcBase(), join32to64(R1, R0), join32to64(R3, R2));
- '''
-
- resetstats_code64 = '''
- PseudoInst::resetstats(xc->tcBase(), X0, X1);
- '''
- resetstatsIop = InstObjParams("resetstats", "Resetstats", "PredOp",
- { "code": resetstats_code,
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(resetstatsIop)
- decoder_output += BasicConstructor.subst(resetstatsIop)
- exec_output += PredOpExecute.subst(resetstatsIop)
-
- resetstatsIop = InstObjParams("resetstats", "Resetstats64", "PredOp",
- { "code": resetstats_code64,
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(resetstatsIop)
- decoder_output += BasicConstructor.subst(resetstatsIop)
- exec_output += PredOpExecute.subst(resetstatsIop)
-
- dumpstats_code = '''
- PseudoInst::dumpstats(xc->tcBase(), join32to64(R1, R0), join32to64(R3, R2));
- '''
-
- dumpstats_code64 = '''
- PseudoInst::dumpstats(xc->tcBase(), X0, X1);
- '''
-
- dumpstatsIop = InstObjParams("dumpstats", "Dumpstats", "PredOp",
- { "code": dumpstats_code,
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(dumpstatsIop)
- decoder_output += BasicConstructor.subst(dumpstatsIop)
- exec_output += PredOpExecute.subst(dumpstatsIop)
-
- dumpstatsIop = InstObjParams("dumpstats", "Dumpstats64", "PredOp",
- { "code": dumpstats_code64,
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(dumpstatsIop)
- decoder_output += BasicConstructor.subst(dumpstatsIop)
- exec_output += PredOpExecute.subst(dumpstatsIop)
-
- dumpresetstats_code = '''
- PseudoInst::dumpresetstats(xc->tcBase(), join32to64(R1, R0), join32to64(R3, R2));
- '''
-
- dumpresetstats_code64 = '''
- PseudoInst::dumpresetstats(xc->tcBase(), X0, X1);
- '''
-
- dumpresetstatsIop = InstObjParams("dumpresetstats", "Dumpresetstats", "PredOp",
- { "code": dumpresetstats_code,
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(dumpresetstatsIop)
- decoder_output += BasicConstructor.subst(dumpresetstatsIop)
- exec_output += PredOpExecute.subst(dumpresetstatsIop)
-
- dumpresetstatsIop = InstObjParams("dumpresetstats", "Dumpresetstats64", "PredOp",
- { "code": dumpresetstats_code64,
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(dumpresetstatsIop)
- decoder_output += BasicConstructor.subst(dumpresetstatsIop)
- exec_output += PredOpExecute.subst(dumpresetstatsIop)
-
- m5checkpoint_code = '''
- PseudoInst::m5checkpoint(xc->tcBase(), join32to64(R1, R0), join32to64(R3, R2));
- '''
-
- m5checkpoint_code64 = '''
- PseudoInst::m5checkpoint(xc->tcBase(), X0, X1);
- '''
-
- m5checkpointIop = InstObjParams("m5checkpoint", "M5checkpoint", "PredOp",
- { "code": m5checkpoint_code,
- "predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
- header_output += BasicDeclare.subst(m5checkpointIop)
- decoder_output += BasicConstructor.subst(m5checkpointIop)
- exec_output += PredOpExecute.subst(m5checkpointIop)
-
- m5checkpointIop = InstObjParams("m5checkpoint", "M5checkpoint64", "PredOp",
- { "code": m5checkpoint_code64,
- "predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
- header_output += BasicDeclare.subst(m5checkpointIop)
- decoder_output += BasicConstructor.subst(m5checkpointIop)
- exec_output += PredOpExecute.subst(m5checkpointIop)
-
- m5readfileCode = '''
- int n = 4;
- uint64_t offset = getArgument(xc->tcBase(), n, sizeof(uint64_t), false);
- R0 = PseudoInst::readfile(xc->tcBase(), R0, join32to64(R3,R2), offset);
- '''
-
- m5readfileCode64 = '''
- int n = 2;
- uint64_t offset = getArgument(xc->tcBase(), n, sizeof(uint64_t), false);
- n = 3;
- X0 = PseudoInst::readfile(xc->tcBase(), X0, X1, offset);
- '''
-
- m5readfileIop = InstObjParams("m5readfile", "M5readfile", "PredOp",
- { "code": m5readfileCode,
- "predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
- header_output += BasicDeclare.subst(m5readfileIop)
- decoder_output += BasicConstructor.subst(m5readfileIop)
- exec_output += PredOpExecute.subst(m5readfileIop)
-
- m5readfileIop = InstObjParams("m5readfile", "M5readfile64", "PredOp",
- { "code": m5readfileCode64,
- "predicate_test": predicateTest },
- ["IsNonSpeculative", "IsUnverifiable"])
- header_output += BasicDeclare.subst(m5readfileIop)
- decoder_output += BasicConstructor.subst(m5readfileIop)
- exec_output += PredOpExecute.subst(m5readfileIop)
-
- m5writefileCode = '''
- int n = 4;
- uint64_t offset = getArgument(xc->tcBase(), n, sizeof(uint64_t), false);
- n = 6;
- Addr filenameAddr = getArgument(xc->tcBase(), n, sizeof(Addr), false);
- R0 = PseudoInst::writefile(xc->tcBase(), R0, join32to64(R3,R2), offset,
- filenameAddr);
- '''
-
- m5writefileCode64 = '''
- int n = 2;
- uint64_t offset = getArgument(xc->tcBase(), n, sizeof(uint64_t), false);
- n = 3;
- Addr filenameAddr = getArgument(xc->tcBase(), n, sizeof(Addr), false);
- X0 = PseudoInst::writefile(xc->tcBase(), X0, X1, offset,
- filenameAddr);
- '''
-
- m5writefileIop = InstObjParams("m5writefile", "M5writefile", "PredOp",
- { "code": m5writefileCode,
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(m5writefileIop)
- decoder_output += BasicConstructor.subst(m5writefileIop)
- exec_output += PredOpExecute.subst(m5writefileIop)
-
- m5writefileIop = InstObjParams("m5writefile", "M5writefile64", "PredOp",
- { "code": m5writefileCode64,
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(m5writefileIop)
- decoder_output += BasicConstructor.subst(m5writefileIop)
- exec_output += PredOpExecute.subst(m5writefileIop)
-
- m5breakIop = InstObjParams("m5break", "M5break", "PredOp",
- { "code": "PseudoInst::debugbreak(xc->tcBase());",
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(m5breakIop)
- decoder_output += BasicConstructor.subst(m5breakIop)
- exec_output += PredOpExecute.subst(m5breakIop)
-
- m5switchcpuIop = InstObjParams("m5switchcpu", "M5switchcpu", "PredOp",
- { "code": "PseudoInst::switchcpu(xc->tcBase());",
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(m5switchcpuIop)
- decoder_output += BasicConstructor.subst(m5switchcpuIop)
- exec_output += PredOpExecute.subst(m5switchcpuIop)
-
- m5addsymbolCode = '''
- PseudoInst::addsymbol(xc->tcBase(), join32to64(R1, R0), R2);
- '''
- m5addsymbolCode64 = '''
- PseudoInst::addsymbol(xc->tcBase(), X0, X1);
- '''
- m5addsymbolIop = InstObjParams("m5addsymbol", "M5addsymbol", "PredOp",
- { "code": m5addsymbolCode,
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(m5addsymbolIop)
- decoder_output += BasicConstructor.subst(m5addsymbolIop)
- exec_output += PredOpExecute.subst(m5addsymbolIop)
-
- m5addsymbolIop = InstObjParams("m5addsymbol", "M5addsymbol64", "PredOp",
- { "code": m5addsymbolCode64,
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(m5addsymbolIop)
- decoder_output += BasicConstructor.subst(m5addsymbolIop)
- exec_output += PredOpExecute.subst(m5addsymbolIop)
-
- m5panicCode = '''panic("M5 panic instruction called at pc=%#x.",
- xc->pcState().pc());'''
-
- m5panicIop = InstObjParams("m5panic", "M5panic", "PredOp",
- { "code": m5panicCode,
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(m5panicIop)
- decoder_output += BasicConstructor.subst(m5panicIop)
- exec_output += PredOpExecute.subst(m5panicIop)
-
- m5workbeginCode = '''PseudoInst::workbegin(
- xc->tcBase(),
- join32to64(R1, R0),
- join32to64(R3, R2)
- );'''
-
- m5workbeginCode64 = '''PseudoInst::workbegin(
- xc->tcBase(),
- X0,
- X1
- );'''
-
- m5workbeginIop = InstObjParams("m5workbegin", "M5workbegin", "PredOp",
- { "code": m5workbeginCode,
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(m5workbeginIop)
- decoder_output += BasicConstructor.subst(m5workbeginIop)
- exec_output += PredOpExecute.subst(m5workbeginIop)
-
- m5workbeginIop = InstObjParams("m5workbegin", "M5workbegin64", "PredOp",
- { "code": m5workbeginCode64,
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(m5workbeginIop)
- decoder_output += BasicConstructor.subst(m5workbeginIop)
- exec_output += PredOpExecute.subst(m5workbeginIop)
-
- m5workendCode = '''PseudoInst::workend(
- xc->tcBase(),
- join32to64(R1, R0),
- join32to64(R3, R2)
- );'''
-
- m5workendCode64 = '''PseudoInst::workend(
- xc->tcBase(),
- X0,
- X1
- );'''
-
- m5workendIop = InstObjParams("m5workend", "M5workend", "PredOp",
- { "code": m5workendCode,
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(m5workendIop)
- decoder_output += BasicConstructor.subst(m5workendIop)
- exec_output += PredOpExecute.subst(m5workendIop)
-
- m5workendIop = InstObjParams("m5workend", "M5workend64", "PredOp",
- { "code": m5workendCode64,
- "predicate_test": predicateTest },
- ["IsNonSpeculative"])
- header_output += BasicDeclare.subst(m5workendIop)
- decoder_output += BasicConstructor.subst(m5workendIop)
- exec_output += PredOpExecute.subst(m5workendIop)
+ gem5OpCode = '''
+ uint64_t ret;
+ bool recognized = PseudoInst::pseudoInst<PseudoInstABI>(
+ xc->tcBase(), bits(machInst, 23, 16), ret);
+ if (!recognized)
+ fault = std::make_shared<UndefinedInstruction>(machInst, true);
+ '''
+ gem5OpIop = InstObjParams("gem5op", "Gem5Op64", "PredOp",
+ { "code": gem5OpCode + 'X0 = ret;',
+ "predicate_test": predicateTest },
+ [ "IsNonSpeculative", "IsUnverifiable" ]);
+ header_output += BasicDeclare.subst(gem5OpIop)
+ decoder_output += BasicConstructor.subst(gem5OpIop)
+ exec_output += PredOpExecute.subst(gem5OpIop)
+
+ gem5OpIop = InstObjParams("gem5op", "Gem5Op", "PredOp",
+ { "code": gem5OpCode + \
+ 'R0 = bits(ret, 31, 0);\n' + \
+ 'R1 = bits(ret, 63, 32);',
+ "predicate_test": predicateTest },
+ [ "IsNonSpeculative", "IsUnverifiable" ]);
+ header_output += BasicDeclare.subst(gem5OpIop)
+ decoder_output += BasicConstructor.subst(gem5OpIop)
+ exec_output += PredOpExecute.subst(gem5OpIop)
}};