// // Copyright (c) 2010, 2012-2013 ARM Limited // All rights reserved // // The license below extends only to copyright in the software and shall // not be construed as granting a license to any other intellectual // property including but not limited to intellectual property relating // to a hardware implementation of the functionality of the software // licensed hereunder. You may use the software subject to the license // terms below provided that you ensure that this notice is replicated // unmodified and in its entirety in all distributions of the software, // modified or unmodified, in source code or in binary form. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer; // redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution; // neither the name of the copyright holders nor the names of its // contributors may be used to endorse or promote products derived from // this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Authors: Gene Wu 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()); ''' 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) }};