standard.isa revision 12695:3df197da6069
113481Sgiacomo.travaglini@arm.com// -*- mode:c++ -*-
213481Sgiacomo.travaglini@arm.com
313481Sgiacomo.travaglini@arm.com// Copyright (c) 2015 RISC-V Foundation
413481Sgiacomo.travaglini@arm.com// Copyright (c) 2016-2017 The University of Virginia
513481Sgiacomo.travaglini@arm.com// All rights reserved.
613481Sgiacomo.travaglini@arm.com//
713481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
813481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
913481Sgiacomo.travaglini@arm.com// met: redistributions of source code must retain the above copyright
1013481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer;
1113481Sgiacomo.travaglini@arm.com// redistributions in binary form must reproduce the above copyright
1213481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer in the
1313481Sgiacomo.travaglini@arm.com// documentation and/or other materials provided with the distribution;
1413481Sgiacomo.travaglini@arm.com// neither the name of the copyright holders nor the names of its
1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
1713481Sgiacomo.travaglini@arm.com//
1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2913481Sgiacomo.travaglini@arm.com//
3013481Sgiacomo.travaglini@arm.com// Authors: Alec Roelke
3113481Sgiacomo.travaglini@arm.com
3213481Sgiacomo.travaglini@arm.com////////////////////////////////////////////////////////////////////
3313481Sgiacomo.travaglini@arm.com//
3413481Sgiacomo.travaglini@arm.com// Integer instructions
3513481Sgiacomo.travaglini@arm.com//
3613481Sgiacomo.travaglini@arm.com
3713481Sgiacomo.travaglini@arm.comdef template ImmDeclare {{
3813481Sgiacomo.travaglini@arm.com    //
3913481Sgiacomo.travaglini@arm.com    // Static instruction class for "%(mnemonic)s".
4013481Sgiacomo.travaglini@arm.com    //
4113481Sgiacomo.travaglini@arm.com    class %(class_name)s : public %(base_class)s
4213481Sgiacomo.travaglini@arm.com    {
4313481Sgiacomo.travaglini@arm.com      public:
4413481Sgiacomo.travaglini@arm.com        /// Constructor.
4513481Sgiacomo.travaglini@arm.com        %(class_name)s(MachInst machInst);
4613481Sgiacomo.travaglini@arm.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
4713481Sgiacomo.travaglini@arm.com        std::string generateDisassembly(Addr pc,
4813481Sgiacomo.travaglini@arm.com            const SymbolTable *symtab) const override;
4913481Sgiacomo.travaglini@arm.com    };
5013481Sgiacomo.travaglini@arm.com}};
5113481Sgiacomo.travaglini@arm.com
5213481Sgiacomo.travaglini@arm.comdef template ImmConstructor {{
5313481Sgiacomo.travaglini@arm.com    %(class_name)s::%(class_name)s(MachInst machInst)
5413481Sgiacomo.travaglini@arm.com        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s)
5513481Sgiacomo.travaglini@arm.com    {
5613481Sgiacomo.travaglini@arm.com        %(constructor)s;
5713481Sgiacomo.travaglini@arm.com        %(imm_code)s;
5813481Sgiacomo.travaglini@arm.com    }
5913481Sgiacomo.travaglini@arm.com}};
6013481Sgiacomo.travaglini@arm.com
6113481Sgiacomo.travaglini@arm.comdef template ImmExecute {{
6213481Sgiacomo.travaglini@arm.com    Fault
6313481Sgiacomo.travaglini@arm.com    %(class_name)s::execute(
6413481Sgiacomo.travaglini@arm.com        ExecContext *xc, Trace::InstRecord *traceData) const
6513481Sgiacomo.travaglini@arm.com    {
6613481Sgiacomo.travaglini@arm.com        Fault fault = NoFault;
6713481Sgiacomo.travaglini@arm.com
6813481Sgiacomo.travaglini@arm.com        %(op_decl)s;
6913481Sgiacomo.travaglini@arm.com        %(op_rd)s;
7013481Sgiacomo.travaglini@arm.com        if (fault == NoFault) {
7113481Sgiacomo.travaglini@arm.com            %(code)s;
7213481Sgiacomo.travaglini@arm.com            if (fault == NoFault) {
7313481Sgiacomo.travaglini@arm.com                %(op_wb)s;
7413481Sgiacomo.travaglini@arm.com            }
7513481Sgiacomo.travaglini@arm.com        }
7613481Sgiacomo.travaglini@arm.com        return fault;
7713481Sgiacomo.travaglini@arm.com    }
7813481Sgiacomo.travaglini@arm.com
7913481Sgiacomo.travaglini@arm.com    std::string
8013481Sgiacomo.travaglini@arm.com    %(class_name)s::generateDisassembly(Addr pc,
8113481Sgiacomo.travaglini@arm.com            const SymbolTable *symtab) const
8213481Sgiacomo.travaglini@arm.com    {
8313481Sgiacomo.travaglini@arm.com        std::vector<RegId> indices = {%(regs)s};
8413481Sgiacomo.travaglini@arm.com        std::stringstream ss;
8513481Sgiacomo.travaglini@arm.com        ss << mnemonic << ' ';
8613481Sgiacomo.travaglini@arm.com        for (const RegId& idx: indices)
8713481Sgiacomo.travaglini@arm.com            ss << registerName(idx) << ", ";
8813481Sgiacomo.travaglini@arm.com        ss << imm;
8913481Sgiacomo.travaglini@arm.com        return ss.str();
9013481Sgiacomo.travaglini@arm.com    }
9113481Sgiacomo.travaglini@arm.com}};
9213481Sgiacomo.travaglini@arm.com
9313481Sgiacomo.travaglini@arm.comdef template BranchDeclare {{
9413481Sgiacomo.travaglini@arm.com    //
9513481Sgiacomo.travaglini@arm.com    // Static instruction class for "%(mnemonic)s".
9613481Sgiacomo.travaglini@arm.com    //
9713481Sgiacomo.travaglini@arm.com    class %(class_name)s : public %(base_class)s
9813481Sgiacomo.travaglini@arm.com    {
9913481Sgiacomo.travaglini@arm.com      public:
10013481Sgiacomo.travaglini@arm.com        /// Constructor.
10113481Sgiacomo.travaglini@arm.com        %(class_name)s(MachInst machInst);
10213481Sgiacomo.travaglini@arm.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
10313481Sgiacomo.travaglini@arm.com
10413481Sgiacomo.travaglini@arm.com        std::string
10513481Sgiacomo.travaglini@arm.com        generateDisassembly(Addr pc, const SymbolTable *symtab) const override;
10613481Sgiacomo.travaglini@arm.com
10713481Sgiacomo.travaglini@arm.com        RiscvISA::PCState
10813481Sgiacomo.travaglini@arm.com        branchTarget(const RiscvISA::PCState &branchPC) const override;
10913481Sgiacomo.travaglini@arm.com
11013481Sgiacomo.travaglini@arm.com        using StaticInst::branchTarget;
11113481Sgiacomo.travaglini@arm.com    };
11213481Sgiacomo.travaglini@arm.com}};
11313481Sgiacomo.travaglini@arm.com
11413481Sgiacomo.travaglini@arm.comdef template BranchExecute {{
11513481Sgiacomo.travaglini@arm.com    Fault
11613481Sgiacomo.travaglini@arm.com    %(class_name)s::execute(ExecContext *xc,
11713481Sgiacomo.travaglini@arm.com        Trace::InstRecord *traceData) const
11813481Sgiacomo.travaglini@arm.com    {
11913481Sgiacomo.travaglini@arm.com        Fault fault = NoFault;
12013481Sgiacomo.travaglini@arm.com
12113481Sgiacomo.travaglini@arm.com        %(op_decl)s;
12213481Sgiacomo.travaglini@arm.com        %(op_rd)s;
12313481Sgiacomo.travaglini@arm.com        if (fault == NoFault) {
12413481Sgiacomo.travaglini@arm.com            %(code)s;
12513481Sgiacomo.travaglini@arm.com            if (fault == NoFault) {
12613481Sgiacomo.travaglini@arm.com                %(op_wb)s;
12713481Sgiacomo.travaglini@arm.com            }
12813481Sgiacomo.travaglini@arm.com        }
12913481Sgiacomo.travaglini@arm.com        return fault;
13013481Sgiacomo.travaglini@arm.com    }
13113481Sgiacomo.travaglini@arm.com
13213481Sgiacomo.travaglini@arm.com    RiscvISA::PCState
13313481Sgiacomo.travaglini@arm.com    %(class_name)s::branchTarget(const RiscvISA::PCState &branchPC) const
13413481Sgiacomo.travaglini@arm.com    {
13513481Sgiacomo.travaglini@arm.com        return branchPC.pc() + imm;
13613481Sgiacomo.travaglini@arm.com    }
13713481Sgiacomo.travaglini@arm.com
13813481Sgiacomo.travaglini@arm.com    std::string
13913481Sgiacomo.travaglini@arm.com    %(class_name)s::generateDisassembly(Addr pc,
14013481Sgiacomo.travaglini@arm.com            const SymbolTable *symtab) const
14113481Sgiacomo.travaglini@arm.com    {
14213481Sgiacomo.travaglini@arm.com        std::vector<RegId> indices = {%(regs)s};
14313481Sgiacomo.travaglini@arm.com        std::stringstream ss;
14413481Sgiacomo.travaglini@arm.com        ss << mnemonic << ' ';
14513481Sgiacomo.travaglini@arm.com        for (const RegId& idx: indices)
14613481Sgiacomo.travaglini@arm.com            ss << registerName(idx) << ", ";
14713481Sgiacomo.travaglini@arm.com        ss << imm;
14813481Sgiacomo.travaglini@arm.com        return ss.str();
14913481Sgiacomo.travaglini@arm.com    }
15013481Sgiacomo.travaglini@arm.com}};
15113481Sgiacomo.travaglini@arm.com
15213481Sgiacomo.travaglini@arm.comdef template JumpDeclare {{
15313481Sgiacomo.travaglini@arm.com    //
15413481Sgiacomo.travaglini@arm.com    // Static instruction class for "%(mnemonic)s".
15513481Sgiacomo.travaglini@arm.com    //
15613481Sgiacomo.travaglini@arm.com    class %(class_name)s : public %(base_class)s
15713481Sgiacomo.travaglini@arm.com    {
15813481Sgiacomo.travaglini@arm.com      public:
15913481Sgiacomo.travaglini@arm.com        /// Constructor.
16013481Sgiacomo.travaglini@arm.com        %(class_name)s(MachInst machInst);
16113481Sgiacomo.travaglini@arm.com        Fault execute(ExecContext *, Trace::InstRecord *) const override;
16213481Sgiacomo.travaglini@arm.com
16313481Sgiacomo.travaglini@arm.com        std::string
16413481Sgiacomo.travaglini@arm.com        generateDisassembly(Addr pc, const SymbolTable *symtab) const override;
16513481Sgiacomo.travaglini@arm.com
16613481Sgiacomo.travaglini@arm.com        RiscvISA::PCState
16713481Sgiacomo.travaglini@arm.com        branchTarget(ThreadContext *tc) const override;
16813481Sgiacomo.travaglini@arm.com
16913481Sgiacomo.travaglini@arm.com        using StaticInst::branchTarget;
17013481Sgiacomo.travaglini@arm.com    };
17113481Sgiacomo.travaglini@arm.com}};
17213481Sgiacomo.travaglini@arm.com
17313481Sgiacomo.travaglini@arm.comdef template JumpExecute {{
17413481Sgiacomo.travaglini@arm.com    Fault
17513481Sgiacomo.travaglini@arm.com    %(class_name)s::execute(
17613481Sgiacomo.travaglini@arm.com        ExecContext *xc, Trace::InstRecord *traceData) const
17713481Sgiacomo.travaglini@arm.com    {
17813481Sgiacomo.travaglini@arm.com        Fault fault = NoFault;
17913481Sgiacomo.travaglini@arm.com
18013481Sgiacomo.travaglini@arm.com        %(op_decl)s;
18113481Sgiacomo.travaglini@arm.com        %(op_rd)s;
18213481Sgiacomo.travaglini@arm.com        if (fault == NoFault) {
18313481Sgiacomo.travaglini@arm.com            %(code)s;
18413481Sgiacomo.travaglini@arm.com            if (fault == NoFault) {
18513481Sgiacomo.travaglini@arm.com                %(op_wb)s;
18613481Sgiacomo.travaglini@arm.com            }
18713481Sgiacomo.travaglini@arm.com        }
18813481Sgiacomo.travaglini@arm.com        return fault;
18913481Sgiacomo.travaglini@arm.com    }
19013481Sgiacomo.travaglini@arm.com
19113481Sgiacomo.travaglini@arm.com    RiscvISA::PCState
19213481Sgiacomo.travaglini@arm.com    %(class_name)s::branchTarget(ThreadContext *tc) const
19313481Sgiacomo.travaglini@arm.com    {
19413481Sgiacomo.travaglini@arm.com        PCState pc = tc->pcState();
19513481Sgiacomo.travaglini@arm.com        pc.set((tc->readIntReg(_srcRegIdx[0].index()) + imm)&~0x1);
19613481Sgiacomo.travaglini@arm.com        return pc;
19713481Sgiacomo.travaglini@arm.com    }
19813481Sgiacomo.travaglini@arm.com
19913481Sgiacomo.travaglini@arm.com    std::string
20013481Sgiacomo.travaglini@arm.com    %(class_name)s::generateDisassembly(Addr pc,
20113481Sgiacomo.travaglini@arm.com            const SymbolTable *symtab) const
20213481Sgiacomo.travaglini@arm.com    {
20313481Sgiacomo.travaglini@arm.com        std::vector<RegId> indices = {%(regs)s};
20413481Sgiacomo.travaglini@arm.com        std::stringstream ss;
20513481Sgiacomo.travaglini@arm.com        ss << mnemonic << ' ';
20613481Sgiacomo.travaglini@arm.com        for (const RegId& idx: indices)
20713481Sgiacomo.travaglini@arm.com            ss << registerName(idx) << ", ";
20813481Sgiacomo.travaglini@arm.com        ss << imm;
20913481Sgiacomo.travaglini@arm.com        return ss.str();
21013481Sgiacomo.travaglini@arm.com    }
21113481Sgiacomo.travaglini@arm.com}};
21213481Sgiacomo.travaglini@arm.com
21313481Sgiacomo.travaglini@arm.comdef template CSRExecute {{
21413481Sgiacomo.travaglini@arm.com    Fault
21513481Sgiacomo.travaglini@arm.com    %(class_name)s::execute(ExecContext *xc,
21613481Sgiacomo.travaglini@arm.com        Trace::InstRecord *traceData) const
21713481Sgiacomo.travaglini@arm.com    {
21813481Sgiacomo.travaglini@arm.com        Fault fault = NoFault;
21913481Sgiacomo.travaglini@arm.com
22013481Sgiacomo.travaglini@arm.com        %(op_decl)s;
22113481Sgiacomo.travaglini@arm.com        %(op_rd)s;
22213481Sgiacomo.travaglini@arm.com
22313481Sgiacomo.travaglini@arm.com        MiscReg data, olddata;
22413481Sgiacomo.travaglini@arm.com        switch (csr) {
22513481Sgiacomo.travaglini@arm.com          case CSR_FCSR:
22613481Sgiacomo.travaglini@arm.com            olddata = xc->readMiscReg(MISCREG_FFLAGS) |
22713481Sgiacomo.travaglini@arm.com                      (xc->readMiscReg(MISCREG_FRM) << FRM_OFFSET);
22813481Sgiacomo.travaglini@arm.com            break;
22913481Sgiacomo.travaglini@arm.com          default:
23013481Sgiacomo.travaglini@arm.com            if (CSRData.find(csr) != CSRData.end()) {
23113481Sgiacomo.travaglini@arm.com                olddata = xc->readMiscReg(CSRData.at(csr).physIndex);
23213481Sgiacomo.travaglini@arm.com            } else {
23313481Sgiacomo.travaglini@arm.com                std::string error = csprintf("Illegal CSR index %#x\n", csr);
23413481Sgiacomo.travaglini@arm.com                fault = make_shared<IllegalInstFault>(error);
23513481Sgiacomo.travaglini@arm.com                olddata = 0;
23613481Sgiacomo.travaglini@arm.com            }
23713481Sgiacomo.travaglini@arm.com            break;
23813481Sgiacomo.travaglini@arm.com        }
23913481Sgiacomo.travaglini@arm.com        auto mask = CSRMasks.find(csr);
24013481Sgiacomo.travaglini@arm.com        if (mask != CSRMasks.end())
24113481Sgiacomo.travaglini@arm.com            olddata &= mask->second;
24213481Sgiacomo.travaglini@arm.com        DPRINTF(RiscvMisc, "Reading CSR %s: %#x\n", CSRData.at(csr).name,
24313481Sgiacomo.travaglini@arm.com                olddata);
24413481Sgiacomo.travaglini@arm.com        data = olddata;
24513481Sgiacomo.travaglini@arm.com
24613481Sgiacomo.travaglini@arm.com        if (fault == NoFault) {
24713481Sgiacomo.travaglini@arm.com            %(code)s;
24813481Sgiacomo.travaglini@arm.com            if (fault == NoFault) {
24913481Sgiacomo.travaglini@arm.com                if (mask != CSRMasks.end())
25013481Sgiacomo.travaglini@arm.com                    data &= mask->second;
25113481Sgiacomo.travaglini@arm.com                if (data != olddata) {
25213481Sgiacomo.travaglini@arm.com                    if (bits(csr, 11, 10) == 0x3) {
25313481Sgiacomo.travaglini@arm.com                        std::string error = csprintf("CSR %s is read-only\n",
25413481Sgiacomo.travaglini@arm.com                                                     CSRData.at(csr).name);
25513481Sgiacomo.travaglini@arm.com                        fault = make_shared<IllegalInstFault>(error);
25613481Sgiacomo.travaglini@arm.com                    } else {
25713481Sgiacomo.travaglini@arm.com                        DPRINTF(RiscvMisc, "Writing %#x to CSR %s.\n", data,
25813481Sgiacomo.travaglini@arm.com                                CSRData.at(csr).name);
25913481Sgiacomo.travaglini@arm.com                        switch (csr) {
26013481Sgiacomo.travaglini@arm.com                          case CSR_FCSR:
26113481Sgiacomo.travaglini@arm.com                            xc->setMiscReg(MISCREG_FFLAGS, bits(data, 4, 0));
26213481Sgiacomo.travaglini@arm.com                            xc->setMiscReg(MISCREG_FRM, bits(data, 7, 5));
26313481Sgiacomo.travaglini@arm.com                            break;
26413481Sgiacomo.travaglini@arm.com                          default:
26513481Sgiacomo.travaglini@arm.com                            xc->setMiscReg(CSRData.at(csr).physIndex, data);
26613481Sgiacomo.travaglini@arm.com                            break;
26713481Sgiacomo.travaglini@arm.com                        }
26813481Sgiacomo.travaglini@arm.com                    }
26913481Sgiacomo.travaglini@arm.com                }
27013481Sgiacomo.travaglini@arm.com            }
27113481Sgiacomo.travaglini@arm.com            if (fault == NoFault) {
27213481Sgiacomo.travaglini@arm.com                %(op_wb)s;
27313481Sgiacomo.travaglini@arm.com            }
27413481Sgiacomo.travaglini@arm.com        }
27513481Sgiacomo.travaglini@arm.com        return fault;
27613481Sgiacomo.travaglini@arm.com    }
27713481Sgiacomo.travaglini@arm.com}};
27813481Sgiacomo.travaglini@arm.com
27913481Sgiacomo.travaglini@arm.comdef format ROp(code, *opt_flags) {{
28013481Sgiacomo.travaglini@arm.com    iop = InstObjParams(name, Name, 'RegOp', code, opt_flags)
28113481Sgiacomo.travaglini@arm.com    header_output = BasicDeclare.subst(iop)
28213481Sgiacomo.travaglini@arm.com    decoder_output = BasicConstructor.subst(iop)
28313481Sgiacomo.travaglini@arm.com    decode_block = BasicDecode.subst(iop)
28413481Sgiacomo.travaglini@arm.com    exec_output = BasicExecute.subst(iop)
28513481Sgiacomo.travaglini@arm.com}};
28613481Sgiacomo.travaglini@arm.com
28713481Sgiacomo.travaglini@arm.comdef format IOp(code, imm_type='int64_t', *opt_flags) {{
28813481Sgiacomo.travaglini@arm.com    regs = ['_destRegIdx[0]','_srcRegIdx[0]']
28913481Sgiacomo.travaglini@arm.com    iop = InstObjParams(name, Name, 'ImmOp<%s>' % imm_type,
29013481Sgiacomo.travaglini@arm.com        {'code': code, 'imm_code': 'imm = sext<12>(IMM12);',
29113481Sgiacomo.travaglini@arm.com         'regs': ','.join(regs)}, opt_flags)
29213481Sgiacomo.travaglini@arm.com    header_output = ImmDeclare.subst(iop)
29313481Sgiacomo.travaglini@arm.com    decoder_output = ImmConstructor.subst(iop)
29413481Sgiacomo.travaglini@arm.com    decode_block = BasicDecode.subst(iop)
29513481Sgiacomo.travaglini@arm.com    exec_output = ImmExecute.subst(iop)
29613481Sgiacomo.travaglini@arm.com}};
29713481Sgiacomo.travaglini@arm.com
29813481Sgiacomo.travaglini@arm.comdef format BOp(code, *opt_flags) {{
29913481Sgiacomo.travaglini@arm.com    imm_code = """
30013481Sgiacomo.travaglini@arm.com                imm = BIMM12BITS4TO1 << 1  |
30113481Sgiacomo.travaglini@arm.com                      BIMM12BITS10TO5 << 5 |
30213481Sgiacomo.travaglini@arm.com                      BIMM12BIT11 << 11    |
30313481Sgiacomo.travaglini@arm.com                      IMMSIGN << 12;
30413481Sgiacomo.travaglini@arm.com                imm = sext<13>(imm);
30513481Sgiacomo.travaglini@arm.com               """
30613481Sgiacomo.travaglini@arm.com    regs = ['_srcRegIdx[0]','_srcRegIdx[1]']
30713481Sgiacomo.travaglini@arm.com    iop = InstObjParams(name, Name, 'ImmOp<int64_t>',
30813481Sgiacomo.travaglini@arm.com        {'code': code, 'imm_code': imm_code,
30913481Sgiacomo.travaglini@arm.com         'regs': ','.join(regs)}, opt_flags)
31013481Sgiacomo.travaglini@arm.com    header_output = BranchDeclare.subst(iop)
31113481Sgiacomo.travaglini@arm.com    decoder_output = ImmConstructor.subst(iop)
31213481Sgiacomo.travaglini@arm.com    decode_block = BasicDecode.subst(iop)
31313481Sgiacomo.travaglini@arm.com    exec_output = BranchExecute.subst(iop)
31413481Sgiacomo.travaglini@arm.com}};
31513481Sgiacomo.travaglini@arm.com
31613481Sgiacomo.travaglini@arm.comdef format Jump(code, *opt_flags) {{
31713481Sgiacomo.travaglini@arm.com    regs = ['_destRegIdx[0]', '_srcRegIdx[0]']
31813481Sgiacomo.travaglini@arm.com    iop = InstObjParams(name, Name, 'ImmOp<int64_t>',
31913481Sgiacomo.travaglini@arm.com        {'code': code, 'imm_code': 'imm = sext<12>(IMM12);',
32013481Sgiacomo.travaglini@arm.com         'regs': ','.join(regs)}, opt_flags)
32113481Sgiacomo.travaglini@arm.com    header_output = JumpDeclare.subst(iop)
32213481Sgiacomo.travaglini@arm.com    decoder_output = ImmConstructor.subst(iop)
32313481Sgiacomo.travaglini@arm.com    decode_block = BasicDecode.subst(iop)
32413481Sgiacomo.travaglini@arm.com    exec_output = JumpExecute.subst(iop)
32513481Sgiacomo.travaglini@arm.com}};
32613481Sgiacomo.travaglini@arm.com
32713481Sgiacomo.travaglini@arm.comdef format UOp(code, *opt_flags) {{
32813481Sgiacomo.travaglini@arm.com    regs = ['_destRegIdx[0]']
32913481Sgiacomo.travaglini@arm.com    iop = InstObjParams(name, Name, 'ImmOp<int64_t>',
33013481Sgiacomo.travaglini@arm.com        {'code': code, 'imm_code': 'imm = sext<20>(IMM20) << 12;',
33113481Sgiacomo.travaglini@arm.com         'regs': ','.join(regs)}, opt_flags)
33213481Sgiacomo.travaglini@arm.com    header_output = ImmDeclare.subst(iop)
33313481Sgiacomo.travaglini@arm.com    decoder_output = ImmConstructor.subst(iop)
33413481Sgiacomo.travaglini@arm.com    decode_block = BasicDecode.subst(iop)
33513481Sgiacomo.travaglini@arm.com    exec_output = ImmExecute.subst(iop)
33613481Sgiacomo.travaglini@arm.com}};
33713481Sgiacomo.travaglini@arm.com
33813481Sgiacomo.travaglini@arm.comdef format JOp(code, *opt_flags) {{
33913481Sgiacomo.travaglini@arm.com    imm_code = """
34013481Sgiacomo.travaglini@arm.com                imm = UJIMMBITS10TO1 << 1   |
34113481Sgiacomo.travaglini@arm.com                      UJIMMBIT11 << 11      |
34213481Sgiacomo.travaglini@arm.com                      UJIMMBITS19TO12 << 12 |
34313481Sgiacomo.travaglini@arm.com                      IMMSIGN << 20;
34413481Sgiacomo.travaglini@arm.com                imm = sext<21>(imm);
34513481Sgiacomo.travaglini@arm.com               """
34613481Sgiacomo.travaglini@arm.com    pc = 'pc.set(pc.pc() + imm);'
34713481Sgiacomo.travaglini@arm.com    regs = ['_destRegIdx[0]']
34813481Sgiacomo.travaglini@arm.com    iop = InstObjParams(name, Name, 'ImmOp<int64_t>',
34913481Sgiacomo.travaglini@arm.com        {'code': code, 'imm_code': imm_code,
35013481Sgiacomo.travaglini@arm.com         'regs': ','.join(regs)}, opt_flags)
35113481Sgiacomo.travaglini@arm.com    header_output = BranchDeclare.subst(iop)
35213481Sgiacomo.travaglini@arm.com    decoder_output = ImmConstructor.subst(iop)
35313481Sgiacomo.travaglini@arm.com    decode_block = BasicDecode.subst(iop)
35413481Sgiacomo.travaglini@arm.com    exec_output = BranchExecute.subst(iop)
35513481Sgiacomo.travaglini@arm.com}};
35613481Sgiacomo.travaglini@arm.com
35713481Sgiacomo.travaglini@arm.comdef format SystemOp(code, *opt_flags) {{
35813481Sgiacomo.travaglini@arm.com    iop = InstObjParams(name, Name, 'SystemOp', code, opt_flags)
35913481Sgiacomo.travaglini@arm.com    header_output = BasicDeclare.subst(iop)
36013481Sgiacomo.travaglini@arm.com    decoder_output = BasicConstructor.subst(iop)
36113481Sgiacomo.travaglini@arm.com    decode_block = BasicDecode.subst(iop)
36213481Sgiacomo.travaglini@arm.com    exec_output = BasicExecute.subst(iop)
36313481Sgiacomo.travaglini@arm.com}};
36413481Sgiacomo.travaglini@arm.com
36513481Sgiacomo.travaglini@arm.comdef format CSROp(code, *opt_flags) {{
36613481Sgiacomo.travaglini@arm.com    iop = InstObjParams(name, Name, 'CSROp', code, opt_flags)
36713481Sgiacomo.travaglini@arm.com    header_output = BasicDeclare.subst(iop)
36813481Sgiacomo.travaglini@arm.com    decoder_output = BasicConstructor.subst(iop)
36913481Sgiacomo.travaglini@arm.com    decode_block = BasicDecode.subst(iop)
37013481Sgiacomo.travaglini@arm.com    exec_output = CSRExecute.subst(iop)
37113481Sgiacomo.travaglini@arm.com}};
37213481Sgiacomo.travaglini@arm.com