17732SAli.Saidi@ARM.com//
210037SARM gem5 Developers// Copyright (c) 2010, 2012-2013 ARM Limited
37732SAli.Saidi@ARM.com// All rights reserved
47732SAli.Saidi@ARM.com//
57732SAli.Saidi@ARM.com// The license below extends only to copyright in the software and shall
67732SAli.Saidi@ARM.com// not be construed as granting a license to any other intellectual
77732SAli.Saidi@ARM.com// property including but not limited to intellectual property relating
87732SAli.Saidi@ARM.com// to a hardware implementation of the functionality of the software
97732SAli.Saidi@ARM.com// licensed hereunder.  You may use the software subject to the license
107732SAli.Saidi@ARM.com// terms below provided that you ensure that this notice is replicated
117732SAli.Saidi@ARM.com// unmodified and in its entirety in all distributions of the software,
127732SAli.Saidi@ARM.com// modified or unmodified, in source code or in binary form.
137732SAli.Saidi@ARM.com//
147732SAli.Saidi@ARM.com// Redistribution and use in source and binary forms, with or without
157732SAli.Saidi@ARM.com// modification, are permitted provided that the following conditions are
167732SAli.Saidi@ARM.com// met: redistributions of source code must retain the above copyright
177732SAli.Saidi@ARM.com// notice, this list of conditions and the following disclaimer;
187732SAli.Saidi@ARM.com// redistributions in binary form must reproduce the above copyright
197732SAli.Saidi@ARM.com// notice, this list of conditions and the following disclaimer in the
207732SAli.Saidi@ARM.com// documentation and/or other materials provided with the distribution;
217732SAli.Saidi@ARM.com// neither the name of the copyright holders nor the names of its
227732SAli.Saidi@ARM.com// contributors may be used to endorse or promote products derived from
237732SAli.Saidi@ARM.com// this software without specific prior written permission.
247732SAli.Saidi@ARM.com//
257732SAli.Saidi@ARM.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
267732SAli.Saidi@ARM.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
277732SAli.Saidi@ARM.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
287732SAli.Saidi@ARM.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
297732SAli.Saidi@ARM.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
307732SAli.Saidi@ARM.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
317732SAli.Saidi@ARM.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
327732SAli.Saidi@ARM.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
337732SAli.Saidi@ARM.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
347732SAli.Saidi@ARM.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
357732SAli.Saidi@ARM.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
367732SAli.Saidi@ARM.com//
377732SAli.Saidi@ARM.com// Authors: Gene Wu
387732SAli.Saidi@ARM.com
397732SAli.Saidi@ARM.com
407732SAli.Saidi@ARM.comlet {{
419554Sandreas.hansson@arm.com    header_output = '''
429554Sandreas.hansson@arm.com    uint64_t join32to64(uint32_t r1, uint32_t r0);
439554Sandreas.hansson@arm.com    '''
448204SAli.Saidi@ARM.com    decoder_output = '''
458204SAli.Saidi@ARM.com    uint64_t join32to64(uint32_t r1, uint32_t r0)
468204SAli.Saidi@ARM.com    {
478204SAli.Saidi@ARM.com        uint64_t r = r1;
488204SAli.Saidi@ARM.com        r <<= 32;
498204SAli.Saidi@ARM.com        r |= r0;
508204SAli.Saidi@ARM.com        return r;
518204SAli.Saidi@ARM.com    }
528204SAli.Saidi@ARM.com    '''
538204SAli.Saidi@ARM.com    exec_output = '''
548204SAli.Saidi@ARM.com    uint64_t join32to64(uint32_t r1, uint32_t r0);
558204SAli.Saidi@ARM.com    '''
568204SAli.Saidi@ARM.com
577732SAli.Saidi@ARM.com
587732SAli.Saidi@ARM.com    armCode = '''
597732SAli.Saidi@ARM.com    PseudoInst::arm(xc->tcBase());
607732SAli.Saidi@ARM.com    '''
6110037SARM gem5 Developers
627732SAli.Saidi@ARM.com    armIop = InstObjParams("arm", "Arm", "PredOp",
637732SAli.Saidi@ARM.com                           { "code": armCode,
647732SAli.Saidi@ARM.com                             "predicate_test": predicateTest },
657732SAli.Saidi@ARM.com                             ["IsNonSpeculative"])
667732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(armIop)
677732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(armIop)
687732SAli.Saidi@ARM.com    exec_output += PredOpExecute.subst(armIop)
697732SAli.Saidi@ARM.com
707732SAli.Saidi@ARM.com    quiesceCode = '''
718204SAli.Saidi@ARM.com    PseudoInst::quiesce(xc->tcBase());
727732SAli.Saidi@ARM.com    '''
7310037SARM gem5 Developers
747732SAli.Saidi@ARM.com    quiesceIop = InstObjParams("quiesce", "Quiesce", "PredOp",
757732SAli.Saidi@ARM.com                           { "code": quiesceCode,
767732SAli.Saidi@ARM.com                             "predicate_test": predicateTest },
777732SAli.Saidi@ARM.com                             ["IsNonSpeculative", "IsQuiesce"])
787732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(quiesceIop)
797732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(quiesceIop)
808142SAli.Saidi@ARM.com    exec_output += QuiescePredOpExecute.subst(quiesceIop)
817732SAli.Saidi@ARM.com
827732SAli.Saidi@ARM.com    quiesceNsCode = '''
838204SAli.Saidi@ARM.com    PseudoInst::quiesceNs(xc->tcBase(), join32to64(R1, R0));
847732SAli.Saidi@ARM.com    '''
857732SAli.Saidi@ARM.com
8610037SARM gem5 Developers    quiesceNsCode64 = '''
8710037SARM gem5 Developers    PseudoInst::quiesceNs(xc->tcBase(), X0);
8810037SARM gem5 Developers    '''
8910037SARM gem5 Developers
907732SAli.Saidi@ARM.com    quiesceNsIop = InstObjParams("quiesceNs", "QuiesceNs", "PredOp",
917732SAli.Saidi@ARM.com                           { "code": quiesceNsCode,
927732SAli.Saidi@ARM.com                             "predicate_test": predicateTest },
937732SAli.Saidi@ARM.com                             ["IsNonSpeculative", "IsQuiesce"])
947732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(quiesceNsIop)
957732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(quiesceNsIop)
968142SAli.Saidi@ARM.com    exec_output += QuiescePredOpExecute.subst(quiesceNsIop)
977732SAli.Saidi@ARM.com
9810037SARM gem5 Developers    quiesceNsIop = InstObjParams("quiesceNs", "QuiesceNs64", "PredOp",
9910037SARM gem5 Developers                           { "code": quiesceNsCode64,
10010037SARM gem5 Developers                             "predicate_test": predicateTest },
10110037SARM gem5 Developers                             ["IsNonSpeculative", "IsQuiesce"])
10210037SARM gem5 Developers    header_output += BasicDeclare.subst(quiesceNsIop)
10310037SARM gem5 Developers    decoder_output += BasicConstructor.subst(quiesceNsIop)
10410037SARM gem5 Developers    exec_output += QuiescePredOpExecute.subst(quiesceNsIop)
10510037SARM gem5 Developers
1067732SAli.Saidi@ARM.com    quiesceCyclesCode = '''
1078204SAli.Saidi@ARM.com    PseudoInst::quiesceCycles(xc->tcBase(), join32to64(R1, R0));
1087732SAli.Saidi@ARM.com    '''
1097732SAli.Saidi@ARM.com
11010037SARM gem5 Developers    quiesceCyclesCode64 = '''
11110037SARM gem5 Developers    PseudoInst::quiesceCycles(xc->tcBase(), X0);
11210037SARM gem5 Developers    '''
11310037SARM gem5 Developers
1147732SAli.Saidi@ARM.com    quiesceCyclesIop = InstObjParams("quiesceCycles", "QuiesceCycles", "PredOp",
1157732SAli.Saidi@ARM.com                           { "code": quiesceCyclesCode,
1167732SAli.Saidi@ARM.com                             "predicate_test": predicateTest },
1177732SAli.Saidi@ARM.com                             ["IsNonSpeculative", "IsQuiesce", "IsUnverifiable"])
1187732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(quiesceCyclesIop)
1197732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(quiesceCyclesIop)
1208142SAli.Saidi@ARM.com    exec_output += QuiescePredOpExecute.subst(quiesceCyclesIop)
1217732SAli.Saidi@ARM.com
12210037SARM gem5 Developers    quiesceCyclesIop = InstObjParams("quiesceCycles", "QuiesceCycles64", "PredOp",
12310037SARM gem5 Developers                           { "code": quiesceCyclesCode64,
12410037SARM gem5 Developers                             "predicate_test": predicateTest },
12510037SARM gem5 Developers                             ["IsNonSpeculative", "IsQuiesce", "IsUnverifiable"])
12610037SARM gem5 Developers    header_output += BasicDeclare.subst(quiesceCyclesIop)
12710037SARM gem5 Developers    decoder_output += BasicConstructor.subst(quiesceCyclesIop)
12810037SARM gem5 Developers    exec_output += QuiescePredOpExecute.subst(quiesceCyclesIop)
12910037SARM gem5 Developers
1307732SAli.Saidi@ARM.com    quiesceTimeCode = '''
1318204SAli.Saidi@ARM.com    uint64_t qt_val = PseudoInst::quiesceTime(xc->tcBase());
1328204SAli.Saidi@ARM.com    R0 = bits(qt_val, 31, 0);
1338204SAli.Saidi@ARM.com    R1 = bits(qt_val, 63, 32);
1347732SAli.Saidi@ARM.com    '''
1357732SAli.Saidi@ARM.com
13610037SARM gem5 Developers    quiesceTimeCode64 = '''
13710037SARM gem5 Developers    X0 = PseudoInst::quiesceTime(xc->tcBase());
13810037SARM gem5 Developers    '''
1397732SAli.Saidi@ARM.com    quiesceTimeIop = InstObjParams("quiesceTime", "QuiesceTime", "PredOp",
1407732SAli.Saidi@ARM.com                           { "code": quiesceTimeCode,
1417732SAli.Saidi@ARM.com                             "predicate_test": predicateTest },
1427732SAli.Saidi@ARM.com                             ["IsNonSpeculative", "IsUnverifiable"])
1437732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(quiesceTimeIop)
1447732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(quiesceTimeIop)
1457732SAli.Saidi@ARM.com    exec_output += PredOpExecute.subst(quiesceTimeIop)
1467732SAli.Saidi@ARM.com
14710037SARM gem5 Developers    quiesceTimeIop = InstObjParams("quiesceTime", "QuiesceTime64", "PredOp",
14810037SARM gem5 Developers                           { "code": quiesceTimeCode64,
14910037SARM gem5 Developers                             "predicate_test": predicateTest },
15010037SARM gem5 Developers                             ["IsNonSpeculative", "IsUnverifiable"])
15110037SARM gem5 Developers    header_output += BasicDeclare.subst(quiesceTimeIop)
15210037SARM gem5 Developers    decoder_output += BasicConstructor.subst(quiesceTimeIop)
15310037SARM gem5 Developers    exec_output += PredOpExecute.subst(quiesceTimeIop)
15410037SARM gem5 Developers
1558204SAli.Saidi@ARM.com    rpnsCode = '''
1568204SAli.Saidi@ARM.com    uint64_t rpns_val = PseudoInst::rpns(xc->tcBase());
1578204SAli.Saidi@ARM.com    R0 = bits(rpns_val, 31, 0);
1588204SAli.Saidi@ARM.com    R1 = bits(rpns_val, 63, 32);
1598204SAli.Saidi@ARM.com    '''
1608204SAli.Saidi@ARM.com
16110037SARM gem5 Developers    rpnsCode64 = '''
16210037SARM gem5 Developers    X0 = PseudoInst::rpns(xc->tcBase());
16310037SARM gem5 Developers    '''
1647732SAli.Saidi@ARM.com    rpnsIop = InstObjParams("rpns", "Rpns", "PredOp",
1658204SAli.Saidi@ARM.com                           { "code": rpnsCode,
1667732SAli.Saidi@ARM.com                             "predicate_test": predicateTest },
1677732SAli.Saidi@ARM.com                             ["IsNonSpeculative", "IsUnverifiable"])
1687732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(rpnsIop)
1697732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(rpnsIop)
1707732SAli.Saidi@ARM.com    exec_output += PredOpExecute.subst(rpnsIop)
1717732SAli.Saidi@ARM.com
17210037SARM gem5 Developers    rpnsIop = InstObjParams("rpns", "Rpns64", "PredOp",
17310037SARM gem5 Developers                           { "code": rpnsCode64,
17410037SARM gem5 Developers                             "predicate_test": predicateTest },
17510037SARM gem5 Developers                             ["IsNonSpeculative", "IsUnverifiable"])
17610037SARM gem5 Developers    header_output += BasicDeclare.subst(rpnsIop)
17710037SARM gem5 Developers    decoder_output += BasicConstructor.subst(rpnsIop)
17810037SARM gem5 Developers    exec_output += PredOpExecute.subst(rpnsIop)
17910037SARM gem5 Developers
1808204SAli.Saidi@ARM.com    wakeCpuCode = '''
1818204SAli.Saidi@ARM.com    PseudoInst::wakeCPU(xc->tcBase(), join32to64(R1,R0));
1828204SAli.Saidi@ARM.com    '''
1838204SAli.Saidi@ARM.com
18410037SARM gem5 Developers    wakeCpuCode64 = '''
18510037SARM gem5 Developers    PseudoInst::wakeCPU(xc->tcBase(), X0);
18610037SARM gem5 Developers    '''
18710037SARM gem5 Developers
1887732SAli.Saidi@ARM.com    wakeCPUIop = InstObjParams("wakeCPU", "WakeCPU", "PredOp",
1898204SAli.Saidi@ARM.com                   { "code": wakeCpuCode,
1908204SAli.Saidi@ARM.com                     "predicate_test": predicateTest },
1918204SAli.Saidi@ARM.com                     ["IsNonSpeculative", "IsUnverifiable"])
1927732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(wakeCPUIop)
1937732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(wakeCPUIop)
1947732SAli.Saidi@ARM.com    exec_output += PredOpExecute.subst(wakeCPUIop)
1957732SAli.Saidi@ARM.com
19610037SARM gem5 Developers    wakeCPUIop = InstObjParams("wakeCPU", "WakeCPU64", "PredOp",
19710037SARM gem5 Developers                   { "code": wakeCpuCode64,
19810037SARM gem5 Developers                     "predicate_test": predicateTest },
19910037SARM gem5 Developers                     ["IsNonSpeculative", "IsUnverifiable"])
20010037SARM gem5 Developers    header_output += BasicDeclare.subst(wakeCPUIop)
20110037SARM gem5 Developers    decoder_output += BasicConstructor.subst(wakeCPUIop)
20210037SARM gem5 Developers    exec_output += PredOpExecute.subst(wakeCPUIop)
20310037SARM gem5 Developers
2047732SAli.Saidi@ARM.com    deprecated_ivlbIop = InstObjParams("deprecated_ivlb", "Deprecated_ivlb", "PredOp",
2057732SAli.Saidi@ARM.com                           { "code": '''warn_once("Obsolete M5 ivlb instruction encountered.\\n");''',
2067732SAli.Saidi@ARM.com                             "predicate_test": predicateTest })
2077732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(deprecated_ivlbIop)
2087732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(deprecated_ivlbIop)
2097732SAli.Saidi@ARM.com    exec_output += PredOpExecute.subst(deprecated_ivlbIop)
2107732SAli.Saidi@ARM.com
2117732SAli.Saidi@ARM.com    deprecated_ivleIop = InstObjParams("deprecated_ivle", "Deprecated_ivle", "PredOp",
2127732SAli.Saidi@ARM.com                           { "code": '''warn_once("Obsolete M5 ivle instruction encountered.\\n");''',
2137732SAli.Saidi@ARM.com                             "predicate_test": predicateTest })
2147732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(deprecated_ivleIop)
2157732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(deprecated_ivleIop)
2167732SAli.Saidi@ARM.com    exec_output += PredOpExecute.subst(deprecated_ivleIop)
2177732SAli.Saidi@ARM.com
2187732SAli.Saidi@ARM.com    deprecated_exit_code = '''
2197732SAli.Saidi@ARM.com        warn_once("Obsolete M5 exit instruction encountered.\\n");
2207732SAli.Saidi@ARM.com        PseudoInst::m5exit(xc->tcBase(), 0);
2217732SAli.Saidi@ARM.com    '''
2227732SAli.Saidi@ARM.com
2237732SAli.Saidi@ARM.com    deprecated_exitIop = InstObjParams("deprecated_exit", "Deprecated_exit", "PredOp",
2247732SAli.Saidi@ARM.com                           { "code": deprecated_exit_code,
2257732SAli.Saidi@ARM.com                             "predicate_test": predicateTest },
2267732SAli.Saidi@ARM.com                             ["No_OpClass", "IsNonSpeculative"])
2277732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(deprecated_exitIop)
2287732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(deprecated_exitIop)
2297732SAli.Saidi@ARM.com    exec_output += PredOpExecute.subst(deprecated_exitIop)
2307732SAli.Saidi@ARM.com
2318204SAli.Saidi@ARM.com    m5exit_code = '''
2328204SAli.Saidi@ARM.com        PseudoInst::m5exit(xc->tcBase(), join32to64(R1, R0));
2338204SAli.Saidi@ARM.com    '''
23410037SARM gem5 Developers
23510037SARM gem5 Developers    m5exit_code64 = '''
23610037SARM gem5 Developers        PseudoInst::m5exit(xc->tcBase(), X0);
23710037SARM gem5 Developers    '''
23810037SARM gem5 Developers
2397732SAli.Saidi@ARM.com    m5exitIop = InstObjParams("m5exit", "M5exit", "PredOp",
2408204SAli.Saidi@ARM.com                                   { "code": m5exit_code,
2418204SAli.Saidi@ARM.com                                     "predicate_test": predicateTest },
2428204SAli.Saidi@ARM.com                                     ["No_OpClass", "IsNonSpeculative"])
2437732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(m5exitIop)
2447732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(m5exitIop)
2457732SAli.Saidi@ARM.com    exec_output += PredOpExecute.subst(m5exitIop)
2467732SAli.Saidi@ARM.com
2479687Sandreas@sandberg.pp.se    m5fail_code = '''
2489687Sandreas@sandberg.pp.se        PseudoInst::m5fail(xc->tcBase(), join32to64(R1, R0), join32to64(R3, R2));
2499687Sandreas@sandberg.pp.se    '''
25011634Sricardo.alves@arm.com
25111634Sricardo.alves@arm.com    m5fail_code64 = '''
25211634Sricardo.alves@arm.com        PseudoInst::m5fail(xc->tcBase(), X0, X1);
25311634Sricardo.alves@arm.com    '''
25411634Sricardo.alves@arm.com
2559687Sandreas@sandberg.pp.se    m5failIop = InstObjParams("m5fail", "M5fail", "PredOp",
2569687Sandreas@sandberg.pp.se                                   { "code": m5fail_code,
2579687Sandreas@sandberg.pp.se                                     "predicate_test": predicateTest },
2589687Sandreas@sandberg.pp.se                                     ["No_OpClass", "IsNonSpeculative"])
2599687Sandreas@sandberg.pp.se    header_output += BasicDeclare.subst(m5failIop)
2609687Sandreas@sandberg.pp.se    decoder_output += BasicConstructor.subst(m5failIop)
2619687Sandreas@sandberg.pp.se    exec_output += PredOpExecute.subst(m5failIop)
2629687Sandreas@sandberg.pp.se
26311634Sricardo.alves@arm.com    m5failIop = InstObjParams("m5fail", "M5fail64", "PredOp",
26411634Sricardo.alves@arm.com                                   { "code": m5fail_code64,
26511634Sricardo.alves@arm.com                                     "predicate_test": predicateTest },
26611634Sricardo.alves@arm.com                                     ["No_OpClass", "IsNonSpeculative"])
26711634Sricardo.alves@arm.com    header_output += BasicDeclare.subst(m5failIop)
26811634Sricardo.alves@arm.com    decoder_output += BasicConstructor.subst(m5failIop)
26911634Sricardo.alves@arm.com    exec_output += PredOpExecute.subst(m5failIop)
27011634Sricardo.alves@arm.com
27111634Sricardo.alves@arm.com
27210037SARM gem5 Developers    m5exitIop = InstObjParams("m5exit", "M5exit64", "PredOp",
27310037SARM gem5 Developers                                   { "code": m5exit_code64,
27410037SARM gem5 Developers                                     "predicate_test": predicateTest },
27510037SARM gem5 Developers                                     ["No_OpClass", "IsNonSpeculative"])
27610037SARM gem5 Developers    header_output += BasicDeclare.subst(m5exitIop)
27710037SARM gem5 Developers    decoder_output += BasicConstructor.subst(m5exitIop)
27810037SARM gem5 Developers    exec_output += PredOpExecute.subst(m5exitIop)
27910037SARM gem5 Developers
2807732SAli.Saidi@ARM.com    loadsymbolCode = '''
2817732SAli.Saidi@ARM.com    PseudoInst::loadsymbol(xc->tcBase());
2827732SAli.Saidi@ARM.com    '''
2837732SAli.Saidi@ARM.com
2847732SAli.Saidi@ARM.com    loadsymbolIop = InstObjParams("loadsymbol", "Loadsymbol", "PredOp",
2857732SAli.Saidi@ARM.com                           { "code": loadsymbolCode,
2867732SAli.Saidi@ARM.com                             "predicate_test": predicateTest },
2877732SAli.Saidi@ARM.com                             ["No_OpClass", "IsNonSpeculative"])
2887732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(loadsymbolIop)
2897732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(loadsymbolIop)
2907732SAli.Saidi@ARM.com    exec_output += PredOpExecute.subst(loadsymbolIop)
2917732SAli.Saidi@ARM.com
2927732SAli.Saidi@ARM.com    initparamCode = '''
29311289Sgabor.dozsa@arm.com    uint64_t ip_val = PseudoInst::initParam(xc->tcBase(), join32to64(R1, R0),
29411289Sgabor.dozsa@arm.com                                            join32to64(R3, R2));
2958659SAli.Saidi@ARM.com    R0 = bits(ip_val, 31, 0);
2968659SAli.Saidi@ARM.com    R1 = bits(ip_val, 63, 32);
2977732SAli.Saidi@ARM.com    '''
2987732SAli.Saidi@ARM.com
29910037SARM gem5 Developers    initparamCode64 = '''
30011289Sgabor.dozsa@arm.com    X0 = PseudoInst::initParam(xc->tcBase(), X0, X1);
30110037SARM gem5 Developers    '''
30210037SARM gem5 Developers
3037732SAli.Saidi@ARM.com    initparamIop = InstObjParams("initparam", "Initparam", "PredOp",
3047732SAli.Saidi@ARM.com                           { "code": initparamCode,
3058659SAli.Saidi@ARM.com                             "predicate_test": predicateTest },
3068659SAli.Saidi@ARM.com                             ["IsNonSpeculative"])
3077732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(initparamIop)
3087732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(initparamIop)
3097732SAli.Saidi@ARM.com    exec_output += PredOpExecute.subst(initparamIop)
3107732SAli.Saidi@ARM.com
31110037SARM gem5 Developers    initparamIop = InstObjParams("initparam", "Initparam64", "PredOp",
31210037SARM gem5 Developers                           { "code": initparamCode64,
31310037SARM gem5 Developers                             "predicate_test": predicateTest },
31410037SARM gem5 Developers                             ["IsNonSpeculative"])
31510037SARM gem5 Developers    header_output += BasicDeclare.subst(initparamIop)
31610037SARM gem5 Developers    decoder_output += BasicConstructor.subst(initparamIop)
31710037SARM gem5 Developers    exec_output += PredOpExecute.subst(initparamIop)
31810037SARM gem5 Developers
3198204SAli.Saidi@ARM.com    resetstats_code = '''
3208204SAli.Saidi@ARM.com    PseudoInst::resetstats(xc->tcBase(), join32to64(R1, R0), join32to64(R3, R2));
3218204SAli.Saidi@ARM.com    '''
3228204SAli.Saidi@ARM.com
32310037SARM gem5 Developers    resetstats_code64 = '''
32410037SARM gem5 Developers    PseudoInst::resetstats(xc->tcBase(), X0, X1);
32510037SARM gem5 Developers    '''
3267732SAli.Saidi@ARM.com    resetstatsIop = InstObjParams("resetstats", "Resetstats", "PredOp",
3278204SAli.Saidi@ARM.com                           { "code": resetstats_code,
3287732SAli.Saidi@ARM.com                             "predicate_test": predicateTest },
3297732SAli.Saidi@ARM.com                             ["IsNonSpeculative"])
3307732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(resetstatsIop)
3317732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(resetstatsIop)
3327732SAli.Saidi@ARM.com    exec_output += PredOpExecute.subst(resetstatsIop)
3337732SAli.Saidi@ARM.com
33410037SARM gem5 Developers    resetstatsIop = InstObjParams("resetstats", "Resetstats64", "PredOp",
33510037SARM gem5 Developers                           { "code": resetstats_code64,
33610037SARM gem5 Developers                             "predicate_test": predicateTest },
33710037SARM gem5 Developers                             ["IsNonSpeculative"])
33810037SARM gem5 Developers    header_output += BasicDeclare.subst(resetstatsIop)
33910037SARM gem5 Developers    decoder_output += BasicConstructor.subst(resetstatsIop)
34010037SARM gem5 Developers    exec_output += PredOpExecute.subst(resetstatsIop)
34110037SARM gem5 Developers
3428204SAli.Saidi@ARM.com    dumpstats_code = '''
3438204SAli.Saidi@ARM.com    PseudoInst::dumpstats(xc->tcBase(), join32to64(R1, R0), join32to64(R3, R2));
3448204SAli.Saidi@ARM.com    '''
34510037SARM gem5 Developers
34610037SARM gem5 Developers    dumpstats_code64 = '''
34710037SARM gem5 Developers    PseudoInst::dumpstats(xc->tcBase(), X0, X1);
34810037SARM gem5 Developers    '''
34910037SARM gem5 Developers
3507732SAli.Saidi@ARM.com    dumpstatsIop = InstObjParams("dumpstats", "Dumpstats", "PredOp",
3518204SAli.Saidi@ARM.com                           { "code": dumpstats_code,
3527732SAli.Saidi@ARM.com                             "predicate_test": predicateTest },
3537732SAli.Saidi@ARM.com                             ["IsNonSpeculative"])
3547732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(dumpstatsIop)
3557732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(dumpstatsIop)
3567732SAli.Saidi@ARM.com    exec_output += PredOpExecute.subst(dumpstatsIop)
3577732SAli.Saidi@ARM.com
35810037SARM gem5 Developers    dumpstatsIop = InstObjParams("dumpstats", "Dumpstats64", "PredOp",
35910037SARM gem5 Developers                           { "code": dumpstats_code64,
36010037SARM gem5 Developers                             "predicate_test": predicateTest },
36110037SARM gem5 Developers                             ["IsNonSpeculative"])
36210037SARM gem5 Developers    header_output += BasicDeclare.subst(dumpstatsIop)
36310037SARM gem5 Developers    decoder_output += BasicConstructor.subst(dumpstatsIop)
36410037SARM gem5 Developers    exec_output += PredOpExecute.subst(dumpstatsIop)
36510037SARM gem5 Developers
3668204SAli.Saidi@ARM.com    dumpresetstats_code = '''
3678204SAli.Saidi@ARM.com    PseudoInst::dumpresetstats(xc->tcBase(), join32to64(R1, R0), join32to64(R3, R2));
3688204SAli.Saidi@ARM.com    '''
36910037SARM gem5 Developers
37010037SARM gem5 Developers    dumpresetstats_code64 = '''
37110037SARM gem5 Developers    PseudoInst::dumpresetstats(xc->tcBase(), X0, X1);
37210037SARM gem5 Developers    '''
37310037SARM gem5 Developers
3747732SAli.Saidi@ARM.com    dumpresetstatsIop = InstObjParams("dumpresetstats", "Dumpresetstats", "PredOp",
3758204SAli.Saidi@ARM.com                           { "code": dumpresetstats_code,
3767732SAli.Saidi@ARM.com                             "predicate_test": predicateTest },
3777732SAli.Saidi@ARM.com                             ["IsNonSpeculative"])
3787732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(dumpresetstatsIop)
3797732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(dumpresetstatsIop)
3807732SAli.Saidi@ARM.com    exec_output += PredOpExecute.subst(dumpresetstatsIop)
3817732SAli.Saidi@ARM.com
38210037SARM gem5 Developers    dumpresetstatsIop = InstObjParams("dumpresetstats", "Dumpresetstats64", "PredOp",
38310037SARM gem5 Developers                           { "code": dumpresetstats_code64,
38410037SARM gem5 Developers                             "predicate_test": predicateTest },
38510037SARM gem5 Developers                             ["IsNonSpeculative"])
38610037SARM gem5 Developers    header_output += BasicDeclare.subst(dumpresetstatsIop)
38710037SARM gem5 Developers    decoder_output += BasicConstructor.subst(dumpresetstatsIop)
38810037SARM gem5 Developers    exec_output += PredOpExecute.subst(dumpresetstatsIop)
38910037SARM gem5 Developers
3908204SAli.Saidi@ARM.com    m5checkpoint_code = '''
3918204SAli.Saidi@ARM.com    PseudoInst::m5checkpoint(xc->tcBase(), join32to64(R1, R0), join32to64(R3, R2));
3928204SAli.Saidi@ARM.com    '''
39310037SARM gem5 Developers
39410037SARM gem5 Developers    m5checkpoint_code64 = '''
39510037SARM gem5 Developers    PseudoInst::m5checkpoint(xc->tcBase(), X0, X1);
39610037SARM gem5 Developers    '''
39710037SARM gem5 Developers
3987732SAli.Saidi@ARM.com    m5checkpointIop = InstObjParams("m5checkpoint", "M5checkpoint", "PredOp",
3998204SAli.Saidi@ARM.com                           { "code": m5checkpoint_code,
4007732SAli.Saidi@ARM.com                             "predicate_test": predicateTest },
4018733Sgeoffrey.blake@arm.com                             ["IsNonSpeculative", "IsUnverifiable"])
4027732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(m5checkpointIop)
4037732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(m5checkpointIop)
4047732SAli.Saidi@ARM.com    exec_output += PredOpExecute.subst(m5checkpointIop)
4057732SAli.Saidi@ARM.com
40610037SARM gem5 Developers    m5checkpointIop = InstObjParams("m5checkpoint", "M5checkpoint64", "PredOp",
40710037SARM gem5 Developers                           { "code": m5checkpoint_code64,
40810037SARM gem5 Developers                             "predicate_test": predicateTest },
40910037SARM gem5 Developers                             ["IsNonSpeculative", "IsUnverifiable"])
41010037SARM gem5 Developers    header_output += BasicDeclare.subst(m5checkpointIop)
41110037SARM gem5 Developers    decoder_output += BasicConstructor.subst(m5checkpointIop)
41210037SARM gem5 Developers    exec_output += PredOpExecute.subst(m5checkpointIop)
41310037SARM gem5 Developers
4147732SAli.Saidi@ARM.com    m5readfileCode = '''
4158204SAli.Saidi@ARM.com    int n = 4;
4168204SAli.Saidi@ARM.com    uint64_t offset = getArgument(xc->tcBase(), n, sizeof(uint64_t), false);
4178204SAli.Saidi@ARM.com    R0 = PseudoInst::readfile(xc->tcBase(), R0, join32to64(R3,R2), offset);
4187732SAli.Saidi@ARM.com    '''
41910037SARM gem5 Developers
42010037SARM gem5 Developers    m5readfileCode64 = '''
42110126Seric.vanhensbergen@arm.com    int n = 2;
42210037SARM gem5 Developers    uint64_t offset = getArgument(xc->tcBase(), n, sizeof(uint64_t), false);
42310126Seric.vanhensbergen@arm.com    n = 3;
42410126Seric.vanhensbergen@arm.com    X0 = PseudoInst::readfile(xc->tcBase(), X0, X1, offset);
42510037SARM gem5 Developers    '''
42610037SARM gem5 Developers
4277732SAli.Saidi@ARM.com    m5readfileIop = InstObjParams("m5readfile", "M5readfile", "PredOp",
4287732SAli.Saidi@ARM.com                           { "code": m5readfileCode,
4297732SAli.Saidi@ARM.com                             "predicate_test": predicateTest },
4308733Sgeoffrey.blake@arm.com                             ["IsNonSpeculative", "IsUnverifiable"])
4317732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(m5readfileIop)
4327732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(m5readfileIop)
4337732SAli.Saidi@ARM.com    exec_output += PredOpExecute.subst(m5readfileIop)
4347732SAli.Saidi@ARM.com
43510037SARM gem5 Developers    m5readfileIop = InstObjParams("m5readfile", "M5readfile64", "PredOp",
43610037SARM gem5 Developers                           { "code": m5readfileCode64,
43710037SARM gem5 Developers                             "predicate_test": predicateTest },
43810037SARM gem5 Developers                             ["IsNonSpeculative", "IsUnverifiable"])
43910037SARM gem5 Developers    header_output += BasicDeclare.subst(m5readfileIop)
44010037SARM gem5 Developers    decoder_output += BasicConstructor.subst(m5readfileIop)
44110037SARM gem5 Developers    exec_output += PredOpExecute.subst(m5readfileIop)
44210037SARM gem5 Developers
4438734Sdam.sunwoo@arm.com    m5writefileCode = '''
4448734Sdam.sunwoo@arm.com    int n = 4;
4458734Sdam.sunwoo@arm.com    uint64_t offset = getArgument(xc->tcBase(), n, sizeof(uint64_t), false);
4468734Sdam.sunwoo@arm.com    n = 6;
4478734Sdam.sunwoo@arm.com    Addr filenameAddr = getArgument(xc->tcBase(), n, sizeof(Addr), false);
4488734Sdam.sunwoo@arm.com    R0 = PseudoInst::writefile(xc->tcBase(), R0, join32to64(R3,R2), offset,
4498734Sdam.sunwoo@arm.com                                filenameAddr);
4508734Sdam.sunwoo@arm.com    '''
45110037SARM gem5 Developers
45210037SARM gem5 Developers    m5writefileCode64 = '''
45310126Seric.vanhensbergen@arm.com    int n = 2;
45410037SARM gem5 Developers    uint64_t offset = getArgument(xc->tcBase(), n, sizeof(uint64_t), false);
45510126Seric.vanhensbergen@arm.com    n = 3;
45610037SARM gem5 Developers    Addr filenameAddr = getArgument(xc->tcBase(), n, sizeof(Addr), false);
45710126Seric.vanhensbergen@arm.com    X0 = PseudoInst::writefile(xc->tcBase(), X0, X1, offset,
45810037SARM gem5 Developers                                filenameAddr);
45910037SARM gem5 Developers    '''
46010037SARM gem5 Developers
4618734Sdam.sunwoo@arm.com    m5writefileIop = InstObjParams("m5writefile", "M5writefile", "PredOp",
4628734Sdam.sunwoo@arm.com                           { "code": m5writefileCode,
4638734Sdam.sunwoo@arm.com                             "predicate_test": predicateTest },
4648734Sdam.sunwoo@arm.com                             ["IsNonSpeculative"])
4658734Sdam.sunwoo@arm.com    header_output += BasicDeclare.subst(m5writefileIop)
4668734Sdam.sunwoo@arm.com    decoder_output += BasicConstructor.subst(m5writefileIop)
4678734Sdam.sunwoo@arm.com    exec_output += PredOpExecute.subst(m5writefileIop)
4688734Sdam.sunwoo@arm.com
46910037SARM gem5 Developers    m5writefileIop = InstObjParams("m5writefile", "M5writefile64", "PredOp",
47010037SARM gem5 Developers                           { "code": m5writefileCode64,
47110037SARM gem5 Developers                             "predicate_test": predicateTest },
47210037SARM gem5 Developers                             ["IsNonSpeculative"])
47310037SARM gem5 Developers    header_output += BasicDeclare.subst(m5writefileIop)
47410037SARM gem5 Developers    decoder_output += BasicConstructor.subst(m5writefileIop)
47510037SARM gem5 Developers    exec_output += PredOpExecute.subst(m5writefileIop)
47610037SARM gem5 Developers
4777732SAli.Saidi@ARM.com    m5breakIop = InstObjParams("m5break", "M5break", "PredOp",
4787732SAli.Saidi@ARM.com                           { "code": "PseudoInst::debugbreak(xc->tcBase());",
4797732SAli.Saidi@ARM.com                             "predicate_test": predicateTest },
4807732SAli.Saidi@ARM.com                             ["IsNonSpeculative"])
4817732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(m5breakIop)
4827732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(m5breakIop)
4837732SAli.Saidi@ARM.com    exec_output += PredOpExecute.subst(m5breakIop)
4847732SAli.Saidi@ARM.com
4857732SAli.Saidi@ARM.com    m5switchcpuIop = InstObjParams("m5switchcpu", "M5switchcpu", "PredOp",
4867732SAli.Saidi@ARM.com                           { "code": "PseudoInst::switchcpu(xc->tcBase());",
4877732SAli.Saidi@ARM.com                             "predicate_test": predicateTest },
4887732SAli.Saidi@ARM.com                             ["IsNonSpeculative"])
4897732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(m5switchcpuIop)
4907732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(m5switchcpuIop)
4917732SAli.Saidi@ARM.com    exec_output += PredOpExecute.subst(m5switchcpuIop)
4927732SAli.Saidi@ARM.com
4937732SAli.Saidi@ARM.com    m5addsymbolCode = '''
4948204SAli.Saidi@ARM.com    PseudoInst::addsymbol(xc->tcBase(), join32to64(R1, R0), R2);
4957732SAli.Saidi@ARM.com    '''
49610037SARM gem5 Developers    m5addsymbolCode64 = '''
49710126Seric.vanhensbergen@arm.com    PseudoInst::addsymbol(xc->tcBase(), X0, X1);
49810037SARM gem5 Developers    '''
4997732SAli.Saidi@ARM.com    m5addsymbolIop = InstObjParams("m5addsymbol", "M5addsymbol", "PredOp",
5007732SAli.Saidi@ARM.com                           { "code": m5addsymbolCode,
5017732SAli.Saidi@ARM.com                             "predicate_test": predicateTest },
5027732SAli.Saidi@ARM.com                             ["IsNonSpeculative"])
5037732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(m5addsymbolIop)
5047732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(m5addsymbolIop)
5057732SAli.Saidi@ARM.com    exec_output += PredOpExecute.subst(m5addsymbolIop)
5067732SAli.Saidi@ARM.com
50710037SARM gem5 Developers    m5addsymbolIop = InstObjParams("m5addsymbol", "M5addsymbol64", "PredOp",
50810037SARM gem5 Developers                           { "code": m5addsymbolCode64,
50910037SARM gem5 Developers                             "predicate_test": predicateTest },
51010037SARM gem5 Developers                             ["IsNonSpeculative"])
51110037SARM gem5 Developers    header_output += BasicDeclare.subst(m5addsymbolIop)
51210037SARM gem5 Developers    decoder_output += BasicConstructor.subst(m5addsymbolIop)
51310037SARM gem5 Developers    exec_output += PredOpExecute.subst(m5addsymbolIop)
51410037SARM gem5 Developers
5157732SAli.Saidi@ARM.com    m5panicCode = '''panic("M5 panic instruction called at pc=%#x.",
5167732SAli.Saidi@ARM.com                     xc->pcState().pc());'''
51710037SARM gem5 Developers
5187732SAli.Saidi@ARM.com    m5panicIop = InstObjParams("m5panic", "M5panic", "PredOp",
5197732SAli.Saidi@ARM.com                     { "code": m5panicCode,
5207732SAli.Saidi@ARM.com                       "predicate_test": predicateTest },
5217732SAli.Saidi@ARM.com                       ["IsNonSpeculative"])
5227732SAli.Saidi@ARM.com    header_output += BasicDeclare.subst(m5panicIop)
5237732SAli.Saidi@ARM.com    decoder_output += BasicConstructor.subst(m5panicIop)
5247732SAli.Saidi@ARM.com    exec_output += PredOpExecute.subst(m5panicIop)
5257732SAli.Saidi@ARM.com
5268354Sgedare@gwmail.gwu.edu    m5workbeginCode = '''PseudoInst::workbegin(
5278354Sgedare@gwmail.gwu.edu                          xc->tcBase(),
5288354Sgedare@gwmail.gwu.edu                          join32to64(R1, R0),
5298354Sgedare@gwmail.gwu.edu                          join32to64(R3, R2)
5308354Sgedare@gwmail.gwu.edu                      );'''
53110037SARM gem5 Developers
53210037SARM gem5 Developers    m5workbeginCode64 = '''PseudoInst::workbegin(
53310037SARM gem5 Developers                          xc->tcBase(),
53410037SARM gem5 Developers                          X0,
53510037SARM gem5 Developers                          X1
53610037SARM gem5 Developers                      );'''
53710037SARM gem5 Developers
5388354Sgedare@gwmail.gwu.edu    m5workbeginIop = InstObjParams("m5workbegin", "M5workbegin", "PredOp",
5398354Sgedare@gwmail.gwu.edu                     { "code": m5workbeginCode,
5408354Sgedare@gwmail.gwu.edu                       "predicate_test": predicateTest },
5418354Sgedare@gwmail.gwu.edu                       ["IsNonSpeculative"])
5428354Sgedare@gwmail.gwu.edu    header_output += BasicDeclare.subst(m5workbeginIop)
5438354Sgedare@gwmail.gwu.edu    decoder_output += BasicConstructor.subst(m5workbeginIop)
5448354Sgedare@gwmail.gwu.edu    exec_output += PredOpExecute.subst(m5workbeginIop)
5458354Sgedare@gwmail.gwu.edu
54610037SARM gem5 Developers    m5workbeginIop = InstObjParams("m5workbegin", "M5workbegin64", "PredOp",
54710037SARM gem5 Developers                     { "code": m5workbeginCode64,
54810037SARM gem5 Developers                       "predicate_test": predicateTest },
54910037SARM gem5 Developers                       ["IsNonSpeculative"])
55010037SARM gem5 Developers    header_output += BasicDeclare.subst(m5workbeginIop)
55110037SARM gem5 Developers    decoder_output += BasicConstructor.subst(m5workbeginIop)
55210037SARM gem5 Developers    exec_output += PredOpExecute.subst(m5workbeginIop)
55310037SARM gem5 Developers
5548354Sgedare@gwmail.gwu.edu    m5workendCode = '''PseudoInst::workend(
5558354Sgedare@gwmail.gwu.edu                        xc->tcBase(),
5568354Sgedare@gwmail.gwu.edu                        join32to64(R1, R0),
5578354Sgedare@gwmail.gwu.edu                        join32to64(R3, R2)
5588354Sgedare@gwmail.gwu.edu                    );'''
55910037SARM gem5 Developers
56010037SARM gem5 Developers    m5workendCode64 = '''PseudoInst::workend(
56110037SARM gem5 Developers                        xc->tcBase(),
56210037SARM gem5 Developers                        X0,
56310037SARM gem5 Developers                        X1
56410037SARM gem5 Developers                    );'''
56510037SARM gem5 Developers
5668354Sgedare@gwmail.gwu.edu    m5workendIop = InstObjParams("m5workend", "M5workend", "PredOp",
5678354Sgedare@gwmail.gwu.edu                     { "code": m5workendCode,
5688354Sgedare@gwmail.gwu.edu                       "predicate_test": predicateTest },
5698354Sgedare@gwmail.gwu.edu                       ["IsNonSpeculative"])
5708354Sgedare@gwmail.gwu.edu    header_output += BasicDeclare.subst(m5workendIop)
5718354Sgedare@gwmail.gwu.edu    decoder_output += BasicConstructor.subst(m5workendIop)
5728354Sgedare@gwmail.gwu.edu    exec_output += PredOpExecute.subst(m5workendIop)
5738354Sgedare@gwmail.gwu.edu
57410037SARM gem5 Developers    m5workendIop = InstObjParams("m5workend", "M5workend64", "PredOp",
57510037SARM gem5 Developers                     { "code": m5workendCode64,
57610037SARM gem5 Developers                       "predicate_test": predicateTest },
57710037SARM gem5 Developers                       ["IsNonSpeculative"])
57810037SARM gem5 Developers    header_output += BasicDeclare.subst(m5workendIop)
57910037SARM gem5 Developers    decoder_output += BasicConstructor.subst(m5workendIop)
58010037SARM gem5 Developers    exec_output += PredOpExecute.subst(m5workendIop)
5817732SAli.Saidi@ARM.com}};
582