m5ops.isa revision 9687:22e9258c06bb
13536SN/A//
211274Sshingarov@labware.com// Copyright (c) 2010 ARM Limited
310595Sgabeblack@google.com// All rights reserved
412109SRekai.GonzalezAlberquilla@arm.com//
57752SWilliam.Wang@arm.com// The license below extends only to copyright in the software and shall
67752SWilliam.Wang@arm.com// not be construed as granting a license to any other intellectual
77752SWilliam.Wang@arm.com// property including but not limited to intellectual property relating
87752SWilliam.Wang@arm.com// to a hardware implementation of the functionality of the software
97752SWilliam.Wang@arm.com// licensed hereunder.  You may use the software subject to the license
107752SWilliam.Wang@arm.com// terms below provided that you ensure that this notice is replicated
117752SWilliam.Wang@arm.com// unmodified and in its entirety in all distributions of the software,
127752SWilliam.Wang@arm.com// modified or unmodified, in source code or in binary form.
137752SWilliam.Wang@arm.com//
147752SWilliam.Wang@arm.com// Redistribution and use in source and binary forms, with or without
157752SWilliam.Wang@arm.com// modification, are permitted provided that the following conditions are
163536SN/A// met: redistributions of source code must retain the above copyright
173536SN/A// notice, this list of conditions and the following disclaimer;
183536SN/A// redistributions in binary form must reproduce the above copyright
193536SN/A// notice, this list of conditions and the following disclaimer in the
203536SN/A// documentation and/or other materials provided with the distribution;
213536SN/A// neither the name of the copyright holders nor the names of its
223536SN/A// contributors may be used to endorse or promote products derived from
233536SN/A// this software without specific prior written permission.
243536SN/A//
253536SN/A// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
263536SN/A// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
273536SN/A// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
283536SN/A// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
293536SN/A// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
303536SN/A// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
313536SN/A// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
323536SN/A// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
333536SN/A// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
343536SN/A// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
353536SN/A// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
363536SN/A//
373536SN/A// Authors: Gene Wu
383536SN/A
393536SN/A
403536SN/Alet {{
413536SN/A    header_output = '''
423536SN/A    uint64_t join32to64(uint32_t r1, uint32_t r0);
437752SWilliam.Wang@arm.com    '''
4411274Sshingarov@labware.com    decoder_output = '''
453536SN/A    uint64_t join32to64(uint32_t r1, uint32_t r0)
463536SN/A    {
473536SN/A        uint64_t r = r1;
488332Snate@binkert.org        r <<= 32;
498332Snate@binkert.org        r |= r0;
503536SN/A        return r;
513536SN/A    }
523536SN/A    '''
533536SN/A    exec_output = '''
543536SN/A    uint64_t join32to64(uint32_t r1, uint32_t r0);
553536SN/A    '''
563536SN/A
575543SN/A
585543SN/A    armCode = '''
593536SN/A    PseudoInst::arm(xc->tcBase());
603536SN/A    '''
613536SN/A    armIop = InstObjParams("arm", "Arm", "PredOp",
623536SN/A                           { "code": armCode,
633536SN/A                             "predicate_test": predicateTest },
643536SN/A                             ["IsNonSpeculative"])
653536SN/A    header_output += BasicDeclare.subst(armIop)
663536SN/A    decoder_output += BasicConstructor.subst(armIop)
673536SN/A    exec_output += PredOpExecute.subst(armIop)
683536SN/A
693536SN/A    quiesceCode = '''
705543SN/A    PseudoInst::quiesce(xc->tcBase());
715543SN/A    '''
723536SN/A    quiesceIop = InstObjParams("quiesce", "Quiesce", "PredOp",
733536SN/A                           { "code": quiesceCode,
743536SN/A                             "predicate_test": predicateTest },
753536SN/A                             ["IsNonSpeculative", "IsQuiesce"])
763536SN/A    header_output += BasicDeclare.subst(quiesceIop)
773536SN/A    decoder_output += BasicConstructor.subst(quiesceIop)
783536SN/A    exec_output += QuiescePredOpExecute.subst(quiesceIop)
793536SN/A
803536SN/A    quiesceNsCode = '''
813536SN/A    PseudoInst::quiesceNs(xc->tcBase(), join32to64(R1, R0));
823536SN/A    '''
833536SN/A
843536SN/A    quiesceNsIop = InstObjParams("quiesceNs", "QuiesceNs", "PredOp",
853536SN/A                           { "code": quiesceNsCode,
863536SN/A                             "predicate_test": predicateTest },
873536SN/A                             ["IsNonSpeculative", "IsQuiesce"])
885543SN/A    header_output += BasicDeclare.subst(quiesceNsIop)
893536SN/A    decoder_output += BasicConstructor.subst(quiesceNsIop)
903536SN/A    exec_output += QuiescePredOpExecute.subst(quiesceNsIop)
913536SN/A
923536SN/A    quiesceCyclesCode = '''
933536SN/A    PseudoInst::quiesceCycles(xc->tcBase(), join32to64(R1, R0));
943536SN/A    '''
953536SN/A
963536SN/A    quiesceCyclesIop = InstObjParams("quiesceCycles", "QuiesceCycles", "PredOp",
973536SN/A                           { "code": quiesceCyclesCode,
983536SN/A                             "predicate_test": predicateTest },
993536SN/A                             ["IsNonSpeculative", "IsQuiesce", "IsUnverifiable"])
1003536SN/A    header_output += BasicDeclare.subst(quiesceCyclesIop)
1013536SN/A    decoder_output += BasicConstructor.subst(quiesceCyclesIop)
1023536SN/A    exec_output += QuiescePredOpExecute.subst(quiesceCyclesIop)
1033536SN/A
1043536SN/A    quiesceTimeCode = '''
1053536SN/A    uint64_t qt_val = PseudoInst::quiesceTime(xc->tcBase());
1063536SN/A    R0 = bits(qt_val, 31, 0);
1073536SN/A    R1 = bits(qt_val, 63, 32);
1085543SN/A    '''
1095543SN/A
1103536SN/A    quiesceTimeIop = InstObjParams("quiesceTime", "QuiesceTime", "PredOp",
1113536SN/A                           { "code": quiesceTimeCode,
1123536SN/A                             "predicate_test": predicateTest },
1133536SN/A                             ["IsNonSpeculative", "IsUnverifiable"])
1143536SN/A    header_output += BasicDeclare.subst(quiesceTimeIop)
1153536SN/A    decoder_output += BasicConstructor.subst(quiesceTimeIop)
1163536SN/A    exec_output += PredOpExecute.subst(quiesceTimeIop)
1173536SN/A
1183536SN/A    rpnsCode = '''
1193536SN/A    uint64_t rpns_val = PseudoInst::rpns(xc->tcBase());
1203536SN/A    R0 = bits(rpns_val, 31, 0);
1213536SN/A    R1 = bits(rpns_val, 63, 32);
1223536SN/A    '''
1233536SN/A
1243536SN/A    rpnsIop = InstObjParams("rpns", "Rpns", "PredOp",
1253536SN/A                           { "code": rpnsCode,
1263536SN/A                             "predicate_test": predicateTest },
1273536SN/A                             ["IsNonSpeculative", "IsUnverifiable"])
1283536SN/A    header_output += BasicDeclare.subst(rpnsIop)
1293536SN/A    decoder_output += BasicConstructor.subst(rpnsIop)
1303536SN/A    exec_output += PredOpExecute.subst(rpnsIop)
1313536SN/A
1323536SN/A    wakeCpuCode = '''
1333536SN/A    PseudoInst::wakeCPU(xc->tcBase(), join32to64(R1,R0));
1343536SN/A    '''
13511793Sbrandon.potter@amd.com
13611793Sbrandon.potter@amd.com    wakeCPUIop = InstObjParams("wakeCPU", "WakeCPU", "PredOp",
1373536SN/A                   { "code": wakeCpuCode,
1385569SN/A                     "predicate_test": predicateTest },
1393536SN/A                     ["IsNonSpeculative", "IsUnverifiable"])
1403536SN/A    header_output += BasicDeclare.subst(wakeCPUIop)
1413536SN/A    decoder_output += BasicConstructor.subst(wakeCPUIop)
1429020Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(wakeCPUIop)
1438229Snate@binkert.org
1448229Snate@binkert.org    deprecated_ivlbIop = InstObjParams("deprecated_ivlb", "Deprecated_ivlb", "PredOp",
14510037SARM gem5 Developers                           { "code": '''warn_once("Obsolete M5 ivlb instruction encountered.\\n");''',
1467752SWilliam.Wang@arm.com                             "predicate_test": predicateTest })
1477752SWilliam.Wang@arm.com    header_output += BasicDeclare.subst(deprecated_ivlbIop)
14810707SAndreas.Sandberg@ARM.com    decoder_output += BasicConstructor.subst(deprecated_ivlbIop)
1493536SN/A    exec_output += PredOpExecute.subst(deprecated_ivlbIop)
1503536SN/A
1513536SN/A    deprecated_ivleIop = InstObjParams("deprecated_ivle", "Deprecated_ivle", "PredOp",
1523536SN/A                           { "code": '''warn_once("Obsolete M5 ivle instruction encountered.\\n");''',
1538229Snate@binkert.org                             "predicate_test": predicateTest })
1543536SN/A    header_output += BasicDeclare.subst(deprecated_ivleIop)
1557752SWilliam.Wang@arm.com    decoder_output += BasicConstructor.subst(deprecated_ivleIop)
1568232Snate@binkert.org    exec_output += PredOpExecute.subst(deprecated_ivleIop)
1578232Snate@binkert.org
1588229Snate@binkert.org    deprecated_exit_code = '''
1593536SN/A        warn_once("Obsolete M5 exit instruction encountered.\\n");
1603536SN/A        PseudoInst::m5exit(xc->tcBase(), 0);
1618782Sgblack@eecs.umich.edu    '''
1623536SN/A
1633536SN/A    deprecated_exitIop = InstObjParams("deprecated_exit", "Deprecated_exit", "PredOp",
1643536SN/A                           { "code": deprecated_exit_code,
1657752SWilliam.Wang@arm.com                             "predicate_test": predicateTest },
1663536SN/A                             ["No_OpClass", "IsNonSpeculative"])
16712449Sgabeblack@google.com    header_output += BasicDeclare.subst(deprecated_exitIop)
16812449Sgabeblack@google.com    decoder_output += BasicConstructor.subst(deprecated_exitIop)
1693536SN/A    exec_output += PredOpExecute.subst(deprecated_exitIop)
1703536SN/A
1713536SN/A    m5exit_code = '''
1725569SN/A        PseudoInst::m5exit(xc->tcBase(), join32to64(R1, R0));
1735569SN/A    '''
1745569SN/A    m5exitIop = InstObjParams("m5exit", "M5exit", "PredOp",
1753536SN/A                                   { "code": m5exit_code,
1763536SN/A                                     "predicate_test": predicateTest },
1773536SN/A                                     ["No_OpClass", "IsNonSpeculative"])
1788782Sgblack@eecs.umich.edu    header_output += BasicDeclare.subst(m5exitIop)
17910707SAndreas.Sandberg@ARM.com    decoder_output += BasicConstructor.subst(m5exitIop)
18012449Sgabeblack@google.com    exec_output += PredOpExecute.subst(m5exitIop)
18110707SAndreas.Sandberg@ARM.com
18210707SAndreas.Sandberg@ARM.com    m5fail_code = '''
1838782Sgblack@eecs.umich.edu        PseudoInst::m5fail(xc->tcBase(), join32to64(R1, R0), join32to64(R3, R2));
18410707SAndreas.Sandberg@ARM.com    '''
1858782Sgblack@eecs.umich.edu    m5failIop = InstObjParams("m5fail", "M5fail", "PredOp",
1868782Sgblack@eecs.umich.edu                                   { "code": m5fail_code,
1878782Sgblack@eecs.umich.edu                                     "predicate_test": predicateTest },
1888782Sgblack@eecs.umich.edu                                     ["No_OpClass", "IsNonSpeculative"])
18912455Sgabeblack@google.com    header_output += BasicDeclare.subst(m5failIop)
19012455Sgabeblack@google.com    decoder_output += BasicConstructor.subst(m5failIop)
19112455Sgabeblack@google.com    exec_output += PredOpExecute.subst(m5failIop)
1928782Sgblack@eecs.umich.edu
1933536SN/A    loadsymbolCode = '''
1943536SN/A    PseudoInst::loadsymbol(xc->tcBase());
1953536SN/A    '''
19611274Sshingarov@labware.com
1973536SN/A    loadsymbolIop = InstObjParams("loadsymbol", "Loadsymbol", "PredOp",
19811274Sshingarov@labware.com                           { "code": loadsymbolCode,
1997752SWilliam.Wang@arm.com                             "predicate_test": predicateTest },
20011274Sshingarov@labware.com                             ["No_OpClass", "IsNonSpeculative"])
20111274Sshingarov@labware.com    header_output += BasicDeclare.subst(loadsymbolIop)
20211274Sshingarov@labware.com    decoder_output += BasicConstructor.subst(loadsymbolIop)
20311274Sshingarov@labware.com    exec_output += PredOpExecute.subst(loadsymbolIop)
20411274Sshingarov@labware.com
2053536SN/A    initparamCode = '''
20611274Sshingarov@labware.com    uint64_t ip_val  = PseudoInst::initParam(xc->tcBase());
20711274Sshingarov@labware.com    R0 = bits(ip_val, 31, 0);
20811274Sshingarov@labware.com    R1 = bits(ip_val, 63, 32);
20911274Sshingarov@labware.com    '''
21011274Sshingarov@labware.com
2113536SN/A    initparamIop = InstObjParams("initparam", "Initparam", "PredOp",
21212109SRekai.GonzalezAlberquilla@arm.com                           { "code": initparamCode,
21312109SRekai.GonzalezAlberquilla@arm.com                             "predicate_test": predicateTest },
21412109SRekai.GonzalezAlberquilla@arm.com                             ["IsNonSpeculative"])
21512109SRekai.GonzalezAlberquilla@arm.com    header_output += BasicDeclare.subst(initparamIop)
2163536SN/A    decoder_output += BasicConstructor.subst(initparamIop)
2173536SN/A    exec_output += PredOpExecute.subst(initparamIop)
2183536SN/A
21911274Sshingarov@labware.com    resetstats_code = '''
2203536SN/A    PseudoInst::resetstats(xc->tcBase(), join32to64(R1, R0), join32to64(R3, R2));
22111274Sshingarov@labware.com    '''
2227752SWilliam.Wang@arm.com
22311274Sshingarov@labware.com    resetstatsIop = InstObjParams("resetstats", "Resetstats", "PredOp",
22411274Sshingarov@labware.com                           { "code": resetstats_code,
22511274Sshingarov@labware.com                             "predicate_test": predicateTest },
22611274Sshingarov@labware.com                             ["IsNonSpeculative"])
22711274Sshingarov@labware.com    header_output += BasicDeclare.subst(resetstatsIop)
22811274Sshingarov@labware.com    decoder_output += BasicConstructor.subst(resetstatsIop)
22911274Sshingarov@labware.com    exec_output += PredOpExecute.subst(resetstatsIop)
23011274Sshingarov@labware.com
2317752SWilliam.Wang@arm.com    dumpstats_code = '''
23211274Sshingarov@labware.com    PseudoInst::dumpstats(xc->tcBase(), join32to64(R1, R0), join32to64(R3, R2));
23311274Sshingarov@labware.com    '''
23411274Sshingarov@labware.com    dumpstatsIop = InstObjParams("dumpstats", "Dumpstats", "PredOp",
23511274Sshingarov@labware.com                           { "code": dumpstats_code,
23611274Sshingarov@labware.com                             "predicate_test": predicateTest },
2373536SN/A                             ["IsNonSpeculative"])
23812109SRekai.GonzalezAlberquilla@arm.com    header_output += BasicDeclare.subst(dumpstatsIop)
23912109SRekai.GonzalezAlberquilla@arm.com    decoder_output += BasicConstructor.subst(dumpstatsIop)
24012109SRekai.GonzalezAlberquilla@arm.com    exec_output += PredOpExecute.subst(dumpstatsIop)
24112109SRekai.GonzalezAlberquilla@arm.com
2423536SN/A    dumpresetstats_code = '''
2433536SN/A    PseudoInst::dumpresetstats(xc->tcBase(), join32to64(R1, R0), join32to64(R3, R2));
24411274Sshingarov@labware.com    '''
24511274Sshingarov@labware.com    dumpresetstatsIop = InstObjParams("dumpresetstats", "Dumpresetstats", "PredOp",
2463536SN/A                           { "code": dumpresetstats_code,
24711274Sshingarov@labware.com                             "predicate_test": predicateTest },
24811274Sshingarov@labware.com                             ["IsNonSpeculative"])
24911274Sshingarov@labware.com    header_output += BasicDeclare.subst(dumpresetstatsIop)
25011274Sshingarov@labware.com    decoder_output += BasicConstructor.subst(dumpresetstatsIop)
25111274Sshingarov@labware.com    exec_output += PredOpExecute.subst(dumpresetstatsIop)
25211274Sshingarov@labware.com
25311274Sshingarov@labware.com    m5checkpoint_code = '''
25411274Sshingarov@labware.com    PseudoInst::m5checkpoint(xc->tcBase(), join32to64(R1, R0), join32to64(R3, R2));
25511274Sshingarov@labware.com    '''
25611274Sshingarov@labware.com    m5checkpointIop = InstObjParams("m5checkpoint", "M5checkpoint", "PredOp",
25711274Sshingarov@labware.com                           { "code": m5checkpoint_code,
25811274Sshingarov@labware.com                             "predicate_test": predicateTest },
25911274Sshingarov@labware.com                             ["IsNonSpeculative", "IsUnverifiable"])
26011274Sshingarov@labware.com    header_output += BasicDeclare.subst(m5checkpointIop)
26111274Sshingarov@labware.com    decoder_output += BasicConstructor.subst(m5checkpointIop)
26211274Sshingarov@labware.com    exec_output += PredOpExecute.subst(m5checkpointIop)
26311274Sshingarov@labware.com
26411274Sshingarov@labware.com    m5readfileCode = '''
26511274Sshingarov@labware.com    int n = 4;
26611274Sshingarov@labware.com    uint64_t offset = getArgument(xc->tcBase(), n, sizeof(uint64_t), false);
26711274Sshingarov@labware.com    R0 = PseudoInst::readfile(xc->tcBase(), R0, join32to64(R3,R2), offset);
26811274Sshingarov@labware.com    '''
26911274Sshingarov@labware.com    m5readfileIop = InstObjParams("m5readfile", "M5readfile", "PredOp",
27011274Sshingarov@labware.com                           { "code": m5readfileCode,
2713536SN/A                             "predicate_test": predicateTest },
2723536SN/A                             ["IsNonSpeculative", "IsUnverifiable"])
27311274Sshingarov@labware.com    header_output += BasicDeclare.subst(m5readfileIop)
27411274Sshingarov@labware.com    decoder_output += BasicConstructor.subst(m5readfileIop)
27511274Sshingarov@labware.com    exec_output += PredOpExecute.subst(m5readfileIop)
27611274Sshingarov@labware.com
27711274Sshingarov@labware.com    m5writefileCode = '''
27811274Sshingarov@labware.com    int n = 4;
27911274Sshingarov@labware.com    uint64_t offset = getArgument(xc->tcBase(), n, sizeof(uint64_t), false);
28011274Sshingarov@labware.com    n = 6;
28111274Sshingarov@labware.com    Addr filenameAddr = getArgument(xc->tcBase(), n, sizeof(Addr), false);
28211274Sshingarov@labware.com    R0 = PseudoInst::writefile(xc->tcBase(), R0, join32to64(R3,R2), offset,
28311274Sshingarov@labware.com                                filenameAddr);
28411274Sshingarov@labware.com    '''
28511274Sshingarov@labware.com    m5writefileIop = InstObjParams("m5writefile", "M5writefile", "PredOp",
28611274Sshingarov@labware.com                           { "code": m5writefileCode,
28711274Sshingarov@labware.com                             "predicate_test": predicateTest },
28811274Sshingarov@labware.com                             ["IsNonSpeculative"])
28911274Sshingarov@labware.com    header_output += BasicDeclare.subst(m5writefileIop)
29011274Sshingarov@labware.com    decoder_output += BasicConstructor.subst(m5writefileIop)
29111274Sshingarov@labware.com    exec_output += PredOpExecute.subst(m5writefileIop)
29211274Sshingarov@labware.com
29311274Sshingarov@labware.com    m5breakIop = InstObjParams("m5break", "M5break", "PredOp",
29411274Sshingarov@labware.com                           { "code": "PseudoInst::debugbreak(xc->tcBase());",
29511274Sshingarov@labware.com                             "predicate_test": predicateTest },
29611274Sshingarov@labware.com                             ["IsNonSpeculative"])
29711274Sshingarov@labware.com    header_output += BasicDeclare.subst(m5breakIop)
29811274Sshingarov@labware.com    decoder_output += BasicConstructor.subst(m5breakIop)
29911274Sshingarov@labware.com    exec_output += PredOpExecute.subst(m5breakIop)
30011274Sshingarov@labware.com
30112449Sgabeblack@google.com    m5switchcpuIop = InstObjParams("m5switchcpu", "M5switchcpu", "PredOp",
30211274Sshingarov@labware.com                           { "code": "PseudoInst::switchcpu(xc->tcBase());",
30311274Sshingarov@labware.com                             "predicate_test": predicateTest },
30412449Sgabeblack@google.com                             ["IsNonSpeculative"])
30512221Sshingarov@gmail.com    header_output += BasicDeclare.subst(m5switchcpuIop)
30612221Sshingarov@gmail.com    decoder_output += BasicConstructor.subst(m5switchcpuIop)
30712031Sgabeblack@google.com    exec_output += PredOpExecute.subst(m5switchcpuIop)
30811274Sshingarov@labware.com
309    m5addsymbolCode = '''
310    PseudoInst::addsymbol(xc->tcBase(), join32to64(R1, R0), R2);
311    '''
312    m5addsymbolIop = InstObjParams("m5addsymbol", "M5addsymbol", "PredOp",
313                           { "code": m5addsymbolCode,
314                             "predicate_test": predicateTest },
315                             ["IsNonSpeculative"])
316    header_output += BasicDeclare.subst(m5addsymbolIop)
317    decoder_output += BasicConstructor.subst(m5addsymbolIop)
318    exec_output += PredOpExecute.subst(m5addsymbolIop)
319
320    m5panicCode = '''panic("M5 panic instruction called at pc=%#x.",
321                     xc->pcState().pc());'''
322    m5panicIop = InstObjParams("m5panic", "M5panic", "PredOp",
323                     { "code": m5panicCode,
324                       "predicate_test": predicateTest },
325                       ["IsNonSpeculative"])
326    header_output += BasicDeclare.subst(m5panicIop)
327    decoder_output += BasicConstructor.subst(m5panicIop)
328    exec_output += PredOpExecute.subst(m5panicIop)
329
330    m5workbeginCode = '''PseudoInst::workbegin(
331                          xc->tcBase(),
332                          join32to64(R1, R0),
333                          join32to64(R3, R2)
334                      );'''
335    m5workbeginIop = InstObjParams("m5workbegin", "M5workbegin", "PredOp",
336                     { "code": m5workbeginCode,
337                       "predicate_test": predicateTest },
338                       ["IsNonSpeculative"])
339    header_output += BasicDeclare.subst(m5workbeginIop)
340    decoder_output += BasicConstructor.subst(m5workbeginIop)
341    exec_output += PredOpExecute.subst(m5workbeginIop)
342
343    m5workendCode = '''PseudoInst::workend(
344                        xc->tcBase(),
345                        join32to64(R1, R0),
346                        join32to64(R3, R2)
347                    );'''
348    m5workendIop = InstObjParams("m5workend", "M5workend", "PredOp",
349                     { "code": m5workendCode,
350                       "predicate_test": predicateTest },
351                       ["IsNonSpeculative"])
352    header_output += BasicDeclare.subst(m5workendIop)
353    decoder_output += BasicConstructor.subst(m5workendIop)
354    exec_output += PredOpExecute.subst(m5workendIop)
355
356}};
357