misc.isa revision 7400
12623SN/A// -*- mode:c++ -*-
22623SN/A
32623SN/A// Copyright (c) 2010 ARM Limited
42623SN/A// All rights reserved
52623SN/A//
62623SN/A// The license below extends only to copyright in the software and shall
72623SN/A// not be construed as granting a license to any other intellectual
82623SN/A// property including but not limited to intellectual property relating
92623SN/A// to a hardware implementation of the functionality of the software
102623SN/A// licensed hereunder.  You may use the software subject to the license
112623SN/A// terms below provided that you ensure that this notice is replicated
122623SN/A// unmodified and in its entirety in all distributions of the software,
132623SN/A// modified or unmodified, in source code or in binary form.
142623SN/A//
152623SN/A// Redistribution and use in source and binary forms, with or without
162623SN/A// modification, are permitted provided that the following conditions are
172623SN/A// met: redistributions of source code must retain the above copyright
182623SN/A// notice, this list of conditions and the following disclaimer;
192623SN/A// redistributions in binary form must reproduce the above copyright
202623SN/A// notice, this list of conditions and the following disclaimer in the
212623SN/A// documentation and/or other materials provided with the distribution;
222623SN/A// neither the name of the copyright holders nor the names of its
232623SN/A// contributors may be used to endorse or promote products derived from
242623SN/A// this software without specific prior written permission.
252623SN/A//
262623SN/A// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
272665Ssaidi@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
282665Ssaidi@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
292623SN/A// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
302623SN/A// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
313170Sstever@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
323806Ssaidi@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
332623SN/A// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
344040Ssaidi@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
356658Snate@binkert.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
362623SN/A// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
372623SN/A//
383348Sbinkertn@umich.edu// Authors: Gabe Black
393348Sbinkertn@umich.edu
404762Snate@binkert.orglet {{
412901Ssaidi@eecs.umich.edu
422623SN/A    svcCode = '''
432623SN/A#if FULL_SYSTEM
442623SN/A    fault = new SupervisorCall;
452623SN/A#else
462623SN/A    fault = new SupervisorCall(machInst);
475606Snate@binkert.org#endif
482623SN/A    '''
492623SN/A
502623SN/A    svcIop = InstObjParams("svc", "Svc", "PredOp",
512623SN/A                           { "code": svcCode,
522623SN/A                             "predicate_test": predicateTest }, ["IsSyscall"])
532623SN/A    header_output = BasicDeclare.subst(svcIop)
542623SN/A    decoder_output = BasicConstructor.subst(svcIop)
552623SN/A    exec_output = PredOpExecute.subst(svcIop)
562623SN/A
572623SN/A}};
582623SN/A
595336Shines@cs.fsu.edulet {{
602623SN/A
614873Sstever@eecs.umich.edu    header_output = decoder_output = exec_output = ""
622623SN/A
632623SN/A    mrsCpsrCode = "Dest = (Cpsr | CondCodes) & 0xF8FF03DF"
642856Srdreslin@umich.edu    mrsCpsrIop = InstObjParams("mrs", "MrsCpsr", "MrsOp",
656227Snate@binkert.org                               { "code": mrsCpsrCode,
662856Srdreslin@umich.edu                                 "predicate_test": predicateTest }, [])
672856Srdreslin@umich.edu    header_output += MrsDeclare.subst(mrsCpsrIop)
682856Srdreslin@umich.edu    decoder_output += MrsConstructor.subst(mrsCpsrIop)
692856Srdreslin@umich.edu    exec_output += PredOpExecute.subst(mrsCpsrIop)
702856Srdreslin@umich.edu
714968Sacolyte@umich.edu    mrsSpsrCode = "Dest = Spsr"
724968Sacolyte@umich.edu    mrsSpsrIop = InstObjParams("mrs", "MrsSpsr", "MrsOp",
734968Sacolyte@umich.edu                               { "code": mrsSpsrCode,
744968Sacolyte@umich.edu                                 "predicate_test": predicateTest }, [])
752856Srdreslin@umich.edu    header_output += MrsDeclare.subst(mrsSpsrIop)
762856Srdreslin@umich.edu    decoder_output += MrsConstructor.subst(mrsSpsrIop)
772856Srdreslin@umich.edu    exec_output += PredOpExecute.subst(mrsSpsrIop)
782623SN/A
792623SN/A    msrCpsrRegCode = '''
802623SN/A        SCTLR sctlr = Sctlr;
812623SN/A        uint32_t newCpsr =
822623SN/A            cpsrWriteByInstr(Cpsr | CondCodes, Op1, byteMask, false, sctlr.nmfi);
832623SN/A        Cpsr = ~CondCodesMask & newCpsr;
846221Snate@binkert.org        CondCodes = CondCodesMask & newCpsr;
856221Snate@binkert.org    '''
862680Sktlim@umich.edu    msrCpsrRegIop = InstObjParams("msr", "MsrCpsrReg", "MsrRegOp",
872623SN/A                                  { "code": msrCpsrRegCode,
882623SN/A                                    "predicate_test": predicateTest }, [])
895714Shsul@eecs.umich.edu    header_output += MsrRegDeclare.subst(msrCpsrRegIop)
902623SN/A    decoder_output += MsrRegConstructor.subst(msrCpsrRegIop)
912623SN/A    exec_output += PredOpExecute.subst(msrCpsrRegIop)
924968Sacolyte@umich.edu
934968Sacolyte@umich.edu    msrSpsrRegCode = "Spsr = spsrWriteByInstr(Spsr, Op1, byteMask, false);"
944968Sacolyte@umich.edu    msrSpsrRegIop = InstObjParams("msr", "MsrSpsrReg", "MsrRegOp",
954968Sacolyte@umich.edu                                  { "code": msrSpsrRegCode,
964968Sacolyte@umich.edu                                    "predicate_test": predicateTest }, [])
974968Sacolyte@umich.edu    header_output += MsrRegDeclare.subst(msrSpsrRegIop)
985714Shsul@eecs.umich.edu    decoder_output += MsrRegConstructor.subst(msrSpsrRegIop)
995712Shsul@eecs.umich.edu    exec_output += PredOpExecute.subst(msrSpsrRegIop)
1005712Shsul@eecs.umich.edu
1015712Shsul@eecs.umich.edu    msrCpsrImmCode = '''
1022623SN/A        SCTLR sctlr = Sctlr;
1032623SN/A        uint32_t newCpsr =
1042623SN/A            cpsrWriteByInstr(Cpsr | CondCodes, imm, byteMask, false, sctlr.nmfi);
1053349Sbinkertn@umich.edu        Cpsr = ~CondCodesMask & newCpsr;
1062623SN/A        CondCodes = CondCodesMask & newCpsr;
1073184Srdreslin@umich.edu    '''
1082623SN/A    msrCpsrImmIop = InstObjParams("msr", "MsrCpsrImm", "MsrImmOp",
1092623SN/A                                  { "code": msrCpsrImmCode,
1102623SN/A                                    "predicate_test": predicateTest }, [])
1112623SN/A    header_output += MsrImmDeclare.subst(msrCpsrImmIop)
1123349Sbinkertn@umich.edu    decoder_output += MsrImmConstructor.subst(msrCpsrImmIop)
1132623SN/A    exec_output += PredOpExecute.subst(msrCpsrImmIop)
1143310Srdreslin@umich.edu
1153649Srdreslin@umich.edu    msrSpsrImmCode = "Spsr = spsrWriteByInstr(Spsr, imm, byteMask, false);"
1162623SN/A    msrSpsrImmIop = InstObjParams("msr", "MsrSpsrImm", "MsrImmOp",
1172623SN/A                                  { "code": msrSpsrImmCode,
1182623SN/A                                    "predicate_test": predicateTest }, [])
1193349Sbinkertn@umich.edu    header_output += MsrImmDeclare.subst(msrSpsrImmIop)
1202623SN/A    decoder_output += MsrImmConstructor.subst(msrSpsrImmIop)
1213184Srdreslin@umich.edu    exec_output += PredOpExecute.subst(msrSpsrImmIop)
1223184Srdreslin@umich.edu
1232623SN/A    revCode = '''
1242623SN/A    uint32_t val = Op1;
1252623SN/A    Dest = swap_byte(val);
1262623SN/A    '''
1272623SN/A    revIop = InstObjParams("rev", "Rev", "RegRegOp",
1283647Srdreslin@umich.edu                           { "code": revCode,
1293647Srdreslin@umich.edu                             "predicate_test": predicateTest }, [])
1303647Srdreslin@umich.edu    header_output += RegRegOpDeclare.subst(revIop)
1313647Srdreslin@umich.edu    decoder_output += RegRegOpConstructor.subst(revIop)
1323647Srdreslin@umich.edu    exec_output += PredOpExecute.subst(revIop)
1332626SN/A
1343647Srdreslin@umich.edu    rev16Code = '''
1352626SN/A    uint32_t val = Op1;
1362623SN/A    Dest = (bits(val, 15, 8) << 0) |
1372623SN/A           (bits(val, 7, 0) << 8) |
1382623SN/A           (bits(val, 31, 24) << 16) |
1392657Ssaidi@eecs.umich.edu           (bits(val, 23, 16) << 24);
1402623SN/A    '''
1412623SN/A    rev16Iop = InstObjParams("rev16", "Rev16", "RegRegOp",
1422623SN/A                             { "code": rev16Code,
1432623SN/A                               "predicate_test": predicateTest }, [])
1442623SN/A    header_output += RegRegOpDeclare.subst(rev16Iop)
1454192Sktlim@umich.edu    decoder_output += RegRegOpConstructor.subst(rev16Iop)
1464192Sktlim@umich.edu    exec_output += PredOpExecute.subst(rev16Iop)
1474192Sktlim@umich.edu
1484192Sktlim@umich.edu    revshCode = '''
1494192Sktlim@umich.edu    uint16_t val = Op1;
1504192Sktlim@umich.edu    Dest = sext<16>(swap_byte(val));
1514192Sktlim@umich.edu    '''
1524192Sktlim@umich.edu    revshIop = InstObjParams("revsh", "Revsh", "RegRegOp",
1535497Ssaidi@eecs.umich.edu                             { "code": revshCode,
1544192Sktlim@umich.edu                               "predicate_test": predicateTest }, [])
1554192Sktlim@umich.edu    header_output += RegRegOpDeclare.subst(revshIop)
1562623SN/A    decoder_output += RegRegOpConstructor.subst(revshIop)
1575529Snate@binkert.org    exec_output += PredOpExecute.subst(revshIop)
1586078Sgblack@eecs.umich.edu
1595487Snate@binkert.org    rbitCode = '''
1605487Snate@binkert.org    uint8_t *opBytes = (uint8_t *)&Op1;
1614968Sacolyte@umich.edu    uint32_t resTemp;
1624968Sacolyte@umich.edu    uint8_t *destBytes = (uint8_t *)&resTemp;
1632623SN/A    // This reverses the bytes and bits of the input, or so says the
1642623SN/A    // internet.
1652623SN/A    for (int i = 0; i < 4; i++) {
1663647Srdreslin@umich.edu        uint32_t temp = opBytes[i];
1673647Srdreslin@umich.edu        temp = (temp * 0x0802 & 0x22110) | (temp * 0x8020 & 0x88440);
1683647Srdreslin@umich.edu        destBytes[3 - i] = (temp * 0x10101) >> 16;
1692623SN/A    }
1702623SN/A    Dest = resTemp;
1712623SN/A    '''
1722623SN/A    rbitIop = InstObjParams("rbit", "Rbit", "RegRegOp",
1732623SN/A                            { "code": rbitCode,
1746775SBrad.Beckmann@amd.com                              "predicate_test": predicateTest }, [])
1756775SBrad.Beckmann@amd.com    header_output += RegRegOpDeclare.subst(rbitIop)
1766775SBrad.Beckmann@amd.com    decoder_output += RegRegOpConstructor.subst(rbitIop)
1772623SN/A    exec_output += PredOpExecute.subst(rbitIop)
1782623SN/A
1792623SN/A    clzCode = '''
1802623SN/A        Dest = (Op1 == 0) ? 32 : (31 - findMsbSet(Op1));
1812623SN/A    '''
1822915Sktlim@umich.edu    clzIop = InstObjParams("clz", "Clz", "RegRegOp",
1832915Sktlim@umich.edu                           { "code": clzCode,
1846078Sgblack@eecs.umich.edu                             "predicate_test": predicateTest }, [])
1853145Shsul@eecs.umich.edu    header_output += RegRegOpDeclare.subst(clzIop)
1862623SN/A    decoder_output += RegRegOpConstructor.subst(clzIop)
1872623SN/A    exec_output += PredOpExecute.subst(clzIop)
1882623SN/A
1892623SN/A    ssatCode = '''
1902623SN/A        int32_t operand = shift_rm_imm(Op1, shiftAmt, shiftType, 0);
1912623SN/A        int32_t res;
1922623SN/A        if (satInt(res, operand, imm))
1932915Sktlim@umich.edu            CondCodes = CondCodes | (1 << 27);
1942915Sktlim@umich.edu        else
1956078Sgblack@eecs.umich.edu            CondCodes = CondCodes;
1963145Shsul@eecs.umich.edu        Dest = res;
1972915Sktlim@umich.edu    '''
1982915Sktlim@umich.edu    ssatIop = InstObjParams("ssat", "Ssat", "RegImmRegShiftOp",
1992915Sktlim@umich.edu                            { "code": ssatCode,
2002915Sktlim@umich.edu                              "predicate_test": predicateTest }, [])
2012915Sktlim@umich.edu    header_output += RegImmRegShiftOpDeclare.subst(ssatIop)
2022915Sktlim@umich.edu    decoder_output += RegImmRegShiftOpConstructor.subst(ssatIop)
2035220Ssaidi@eecs.umich.edu    exec_output += PredOpExecute.subst(ssatIop)
2045220Ssaidi@eecs.umich.edu
2055220Ssaidi@eecs.umich.edu    usatCode = '''
2064940Snate@binkert.org        int32_t operand = shift_rm_imm(Op1, shiftAmt, shiftType, 0);
2075220Ssaidi@eecs.umich.edu        int32_t res;
2083324Shsul@eecs.umich.edu        if (uSatInt(res, operand, imm))
2095220Ssaidi@eecs.umich.edu            CondCodes = CondCodes | (1 << 27);
2105220Ssaidi@eecs.umich.edu        else
2115606Snate@binkert.org            CondCodes = CondCodes;
2125606Snate@binkert.org        Dest = res;
2132915Sktlim@umich.edu    '''
2142623SN/A    usatIop = InstObjParams("usat", "Usat", "RegImmRegShiftOp",
2152623SN/A                            { "code": usatCode,
2162623SN/A                              "predicate_test": predicateTest }, [])
2172798Sktlim@umich.edu    header_output += RegImmRegShiftOpDeclare.subst(usatIop)
2182623SN/A    decoder_output += RegImmRegShiftOpConstructor.subst(usatIop)
2195496Ssaidi@eecs.umich.edu    exec_output += PredOpExecute.subst(usatIop)
2202798Sktlim@umich.edu
2212623SN/A    ssat16Code = '''
2222798Sktlim@umich.edu        int32_t res;
2232623SN/A        uint32_t resTemp = 0;
2242623SN/A        CondCodes = CondCodes;
2252623SN/A        int32_t argLow = sext<16>(bits(Op1, 15, 0));
2262623SN/A        int32_t argHigh = sext<16>(bits(Op1, 31, 16));
2272623SN/A        if (satInt(res, argLow, imm))
2282623SN/A            CondCodes = CondCodes | (1 << 27);
2294192Sktlim@umich.edu        replaceBits(resTemp, 15, 0, res);
2302623SN/A        if (satInt(res, argHigh, imm))
2312623SN/A            CondCodes = CondCodes | (1 << 27);
2322623SN/A        replaceBits(resTemp, 31, 16, res);
2332680Sktlim@umich.edu        Dest = resTemp;
2342623SN/A    '''
2356221Snate@binkert.org    ssat16Iop = InstObjParams("ssat16", "Ssat16", "RegImmRegOp",
2366221Snate@binkert.org                              { "code": ssat16Code,
2372680Sktlim@umich.edu                                "predicate_test": predicateTest }, [])
2382680Sktlim@umich.edu    header_output += RegImmRegOpDeclare.subst(ssat16Iop)
2392623SN/A    decoder_output += RegImmRegOpConstructor.subst(ssat16Iop)
2405606Snate@binkert.org    exec_output += PredOpExecute.subst(ssat16Iop)
2412623SN/A
2422623SN/A    usat16Code = '''
2432623SN/A        int32_t res;
2443512Sktlim@umich.edu        uint32_t resTemp = 0;
2453512Sktlim@umich.edu        CondCodes = CondCodes;
2463512Sktlim@umich.edu        int32_t argLow = sext<16>(bits(Op1, 15, 0));
2475169Ssaidi@eecs.umich.edu        int32_t argHigh = sext<16>(bits(Op1, 31, 16));
2485712Shsul@eecs.umich.edu        if (uSatInt(res, argLow, imm))
2495712Shsul@eecs.umich.edu            CondCodes = CondCodes | (1 << 27);
2505712Shsul@eecs.umich.edu        replaceBits(resTemp, 15, 0, res);
2512623SN/A        if (uSatInt(res, argHigh, imm))
2522623SN/A            CondCodes = CondCodes | (1 << 27);
2532623SN/A        replaceBits(resTemp, 31, 16, res);
2542623SN/A        Dest = resTemp;
2552623SN/A    '''
2562623SN/A    usat16Iop = InstObjParams("usat16", "Usat16", "RegImmRegOp",
2574940Snate@binkert.org                              { "code": usat16Code,
2584940Snate@binkert.org                                "predicate_test": predicateTest }, [])
2592623SN/A    header_output += RegImmRegOpDeclare.subst(usat16Iop)
2602683Sktlim@umich.edu    decoder_output += RegImmRegOpConstructor.subst(usat16Iop)
2612623SN/A    exec_output += PredOpExecute.subst(usat16Iop)
2622623SN/A
2632623SN/A    sxtbIop = InstObjParams("sxtb", "Sxtb", "RegImmRegOp",
2642623SN/A                            { "code":
2652623SN/A                              "Dest = sext<8>((uint8_t)(Op1.ud >> imm));",
2665101Ssaidi@eecs.umich.edu                              "predicate_test": predicateTest }, [])
2673686Sktlim@umich.edu    header_output += RegImmRegOpDeclare.subst(sxtbIop)
2683430Sgblack@eecs.umich.edu    decoder_output += RegImmRegOpConstructor.subst(sxtbIop)
2695606Snate@binkert.org    exec_output += PredOpExecute.subst(sxtbIop)
2702623SN/A
2712623SN/A    sxtabIop = InstObjParams("sxtab", "Sxtab", "RegRegRegImmOp",
2722623SN/A                             { "code":
2732623SN/A                               '''
2742623SN/A                                   Dest = sext<8>((uint8_t)(Op2.ud >> imm)) +
2752623SN/A                                          Op1;
2762623SN/A                               ''',
2774940Snate@binkert.org                               "predicate_test": predicateTest }, [])
2784940Snate@binkert.org    header_output += RegRegRegImmOpDeclare.subst(sxtabIop)
2792623SN/A    decoder_output += RegRegRegImmOpConstructor.subst(sxtabIop)
2802683Sktlim@umich.edu    exec_output += PredOpExecute.subst(sxtabIop)
2812623SN/A
2826043Sgblack@eecs.umich.edu    sxtb16Code = '''
2836043Sgblack@eecs.umich.edu    uint32_t resTemp = 0;
2846043Sgblack@eecs.umich.edu    replaceBits(resTemp, 15, 0, sext<8>(bits(Op1, imm + 7, imm)));
2852623SN/A    replaceBits(resTemp, 31, 16,
2862626SN/A                sext<8>(bits(Op1, (imm + 23) % 32, (imm + 16) % 32)));
2872626SN/A    Dest = resTemp;
2882626SN/A    '''
2892626SN/A    sxtb16Iop = InstObjParams("sxtb16", "Sxtb16", "RegImmRegOp",
2905606Snate@binkert.org                              { "code": sxtb16Code,
2912623SN/A                                "predicate_test": predicateTest }, [])
2922623SN/A    header_output += RegImmRegOpDeclare.subst(sxtb16Iop)
2932623SN/A    decoder_output += RegImmRegOpConstructor.subst(sxtb16Iop)
2942623SN/A    exec_output += PredOpExecute.subst(sxtb16Iop)
2952623SN/A
2962623SN/A    sxtab16Code = '''
2972623SN/A    uint32_t resTemp = 0;
2987520Sgblack@eecs.umich.edu    replaceBits(resTemp, 15, 0, sext<8>(bits(Op2, imm + 7, imm)) +
2997520Sgblack@eecs.umich.edu                                        bits(Op1, 15, 0));
3002623SN/A    replaceBits(resTemp, 31, 16,
3013169Sstever@eecs.umich.edu                sext<8>(bits(Op2, (imm + 23) % 32, (imm + 16) % 32)) +
3024870Sstever@eecs.umich.edu                bits(Op1, 31, 16));
3032623SN/A    Dest = resTemp;
3042623SN/A    '''
3052623SN/A    sxtab16Iop = InstObjParams("sxtab16", "Sxtab16", "RegRegRegImmOp",
3062623SN/A                               { "code": sxtab16Code,
3072623SN/A                                 "predicate_test": predicateTest }, [])
3084999Sgblack@eecs.umich.edu    header_output += RegRegRegImmOpDeclare.subst(sxtab16Iop)
3096227Snate@binkert.org    decoder_output += RegRegRegImmOpConstructor.subst(sxtab16Iop)
3104999Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(sxtab16Iop)
3117520Sgblack@eecs.umich.edu
3122623SN/A    sxthCode = '''
3134999Sgblack@eecs.umich.edu    uint64_t rotated = (uint32_t)Op1;
3144999Sgblack@eecs.umich.edu    rotated = (rotated | (rotated << 32)) >> imm;
3157520Sgblack@eecs.umich.edu    Dest = sext<16>((uint16_t)rotated);
3164999Sgblack@eecs.umich.edu    '''
3177520Sgblack@eecs.umich.edu    sxthIop = InstObjParams("sxth", "Sxth", "RegImmRegOp",
3187520Sgblack@eecs.umich.edu                              { "code": sxthCode,
3194999Sgblack@eecs.umich.edu                                "predicate_test": predicateTest }, [])
3204999Sgblack@eecs.umich.edu    header_output += RegImmRegOpDeclare.subst(sxthIop)
3214999Sgblack@eecs.umich.edu    decoder_output += RegImmRegOpConstructor.subst(sxthIop)
3227520Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(sxthIop)
3237520Sgblack@eecs.umich.edu
3244999Sgblack@eecs.umich.edu    sxtahCode = '''
3254999Sgblack@eecs.umich.edu    uint64_t rotated = (uint32_t)Op2;
3266023Snate@binkert.org    rotated = (rotated | (rotated << 32)) >> imm;
3274999Sgblack@eecs.umich.edu    Dest = sext<16>((uint16_t)rotated) + Op1;
3284999Sgblack@eecs.umich.edu    '''
3296623Sgblack@eecs.umich.edu    sxtahIop = InstObjParams("sxtah", "Sxtah", "RegRegRegImmOp",
3304999Sgblack@eecs.umich.edu                             { "code": sxtahCode,
3316102Sgblack@eecs.umich.edu                               "predicate_test": predicateTest }, [])
3324999Sgblack@eecs.umich.edu    header_output += RegRegRegImmOpDeclare.subst(sxtahIop)
3337520Sgblack@eecs.umich.edu    decoder_output += RegRegRegImmOpConstructor.subst(sxtahIop)
3344999Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(sxtahIop)
3354999Sgblack@eecs.umich.edu
3364999Sgblack@eecs.umich.edu    uxtbIop = InstObjParams("uxtb", "Uxtb", "RegImmRegOp",
3374999Sgblack@eecs.umich.edu                            { "code": "Dest = (uint8_t)(Op1.ud >> imm);",
3384999Sgblack@eecs.umich.edu                              "predicate_test": predicateTest }, [])
3394999Sgblack@eecs.umich.edu    header_output += RegImmRegOpDeclare.subst(uxtbIop)
3404999Sgblack@eecs.umich.edu    decoder_output += RegImmRegOpConstructor.subst(uxtbIop)
3414999Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(uxtbIop)
3424999Sgblack@eecs.umich.edu
3434999Sgblack@eecs.umich.edu    uxtabIop = InstObjParams("uxtab", "Uxtab", "RegRegRegImmOp",
3445012Sgblack@eecs.umich.edu                             { "code":
3454999Sgblack@eecs.umich.edu                               "Dest = (uint8_t)(Op2.ud >> imm) + Op1;",
3464999Sgblack@eecs.umich.edu                               "predicate_test": predicateTest }, [])
3476102Sgblack@eecs.umich.edu    header_output += RegRegRegImmOpDeclare.subst(uxtabIop)
3484999Sgblack@eecs.umich.edu    decoder_output += RegRegRegImmOpConstructor.subst(uxtabIop)
3494999Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(uxtabIop)
3504968Sacolyte@umich.edu
3514986Ssaidi@eecs.umich.edu    uxtb16Code = '''
3524999Sgblack@eecs.umich.edu    uint32_t resTemp = 0;
3536739Sgblack@eecs.umich.edu    replaceBits(resTemp, 15, 0, (uint8_t)(bits(Op1, imm + 7, imm)));
3546739Sgblack@eecs.umich.edu    replaceBits(resTemp, 31, 16,
3556739Sgblack@eecs.umich.edu                (uint8_t)(bits(Op1, (imm + 23) % 32, (imm + 16) % 32)));
3566739Sgblack@eecs.umich.edu    Dest = resTemp;
3576739Sgblack@eecs.umich.edu    '''
3586739Sgblack@eecs.umich.edu    uxtb16Iop = InstObjParams("uxtb16", "Uxtb16", "RegImmRegOp",
3596739Sgblack@eecs.umich.edu                              { "code": uxtb16Code,
3606739Sgblack@eecs.umich.edu                                "predicate_test": predicateTest }, [])
3614999Sgblack@eecs.umich.edu    header_output += RegImmRegOpDeclare.subst(uxtb16Iop)
3624999Sgblack@eecs.umich.edu    decoder_output += RegImmRegOpConstructor.subst(uxtb16Iop)
3634999Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(uxtb16Iop)
3646078Sgblack@eecs.umich.edu
3656078Sgblack@eecs.umich.edu    uxtab16Code = '''
3666078Sgblack@eecs.umich.edu    uint32_t resTemp = 0;
3676078Sgblack@eecs.umich.edu    replaceBits(resTemp, 15, 0, (uint8_t)(bits(Op2, imm + 7, imm)) +
3684999Sgblack@eecs.umich.edu                                        bits(Op1, 15, 0));
3694968Sacolyte@umich.edu    replaceBits(resTemp, 31, 16,
3703170Sstever@eecs.umich.edu                (uint8_t)(bits(Op2, (imm + 23) % 32, (imm + 16) % 32)) +
3714999Sgblack@eecs.umich.edu                bits(Op1, 31, 16));
3724999Sgblack@eecs.umich.edu    Dest = resTemp;
3734999Sgblack@eecs.umich.edu    '''
3744999Sgblack@eecs.umich.edu    uxtab16Iop = InstObjParams("uxtab16", "Uxtab16", "RegRegRegImmOp",
3754999Sgblack@eecs.umich.edu                               { "code": uxtab16Code,
3767520Sgblack@eecs.umich.edu                                 "predicate_test": predicateTest }, [])
3774999Sgblack@eecs.umich.edu    header_output += RegRegRegImmOpDeclare.subst(uxtab16Iop)
3787520Sgblack@eecs.umich.edu    decoder_output += RegRegRegImmOpConstructor.subst(uxtab16Iop)
3794999Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(uxtab16Iop)
3804999Sgblack@eecs.umich.edu
3812623SN/A    uxthCode = '''
3822623SN/A    uint64_t rotated = (uint32_t)Op1;
3832623SN/A    rotated = (rotated | (rotated << 32)) >> imm;
3847520Sgblack@eecs.umich.edu    Dest = (uint16_t)rotated;
3857520Sgblack@eecs.umich.edu    '''
3867520Sgblack@eecs.umich.edu    uxthIop = InstObjParams("uxth", "Uxth", "RegImmRegOp",
3877520Sgblack@eecs.umich.edu                              { "code": uxthCode,
3887520Sgblack@eecs.umich.edu                                "predicate_test": predicateTest }, [])
3897520Sgblack@eecs.umich.edu    header_output += RegImmRegOpDeclare.subst(uxthIop)
3907520Sgblack@eecs.umich.edu    decoder_output += RegImmRegOpConstructor.subst(uxthIop)
3917520Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(uxthIop)
3927520Sgblack@eecs.umich.edu
3937520Sgblack@eecs.umich.edu    uxtahCode = '''
3947520Sgblack@eecs.umich.edu    uint64_t rotated = (uint32_t)Op2;
3957520Sgblack@eecs.umich.edu    rotated = (rotated | (rotated << 32)) >> imm;
3967520Sgblack@eecs.umich.edu    Dest = (uint16_t)rotated + Op1;
3977520Sgblack@eecs.umich.edu    '''
3987520Sgblack@eecs.umich.edu    uxtahIop = InstObjParams("uxtah", "Uxtah", "RegRegRegImmOp",
3997520Sgblack@eecs.umich.edu                             { "code": uxtahCode,
4002623SN/A                               "predicate_test": predicateTest }, [])
4012623SN/A    header_output += RegRegRegImmOpDeclare.subst(uxtahIop)
4022623SN/A    decoder_output += RegRegRegImmOpConstructor.subst(uxtahIop)
4032623SN/A    exec_output += PredOpExecute.subst(uxtahIop)
4044115Ssaidi@eecs.umich.edu
4054115Ssaidi@eecs.umich.edu    selCode = '''
4064115Ssaidi@eecs.umich.edu        uint32_t resTemp = 0;
4074115Ssaidi@eecs.umich.edu        for (unsigned i = 0; i < 4; i++) {
4084040Ssaidi@eecs.umich.edu            int low = i * 8;
4094040Ssaidi@eecs.umich.edu            int high = low + 7;
4104040Ssaidi@eecs.umich.edu            replaceBits(resTemp, high, low,
4114040Ssaidi@eecs.umich.edu                        bits(CondCodes, 16 + i) ?
4122623SN/A                            bits(Op1, high, low) : bits(Op2, high, low));
4132623SN/A        }
4142623SN/A        Dest = resTemp;
4152623SN/A    '''
4162623SN/A    selIop = InstObjParams("sel", "Sel", "RegRegRegOp",
4172623SN/A                           { "code": selCode,
4182623SN/A                             "predicate_test": predicateTest }, [])
4192623SN/A    header_output += RegRegRegOpDeclare.subst(selIop)
4202623SN/A    decoder_output += RegRegRegOpConstructor.subst(selIop)
4212623SN/A    exec_output += PredOpExecute.subst(selIop)
4222623SN/A
4232623SN/A    usad8Code = '''
4242623SN/A        uint32_t resTemp = 0;
4252623SN/A        for (unsigned i = 0; i < 4; i++) {
4262623SN/A            int low = i * 8;
4272623SN/A            int high = low + 7;
4282623SN/A            int32_t diff = bits(Op1, high, low) -
4292623SN/A                           bits(Op2, high, low);
4302623SN/A            resTemp += ((diff < 0) ? -diff : diff);
4312623SN/A        }
4322623SN/A        Dest = resTemp;
4332623SN/A    '''
4342623SN/A    usad8Iop = InstObjParams("usad8", "Usad8", "RegRegRegOp",
4352623SN/A                             { "code": usad8Code,
4362623SN/A                               "predicate_test": predicateTest }, [])
4372623SN/A    header_output += RegRegRegOpDeclare.subst(usad8Iop)
4382623SN/A    decoder_output += RegRegRegOpConstructor.subst(usad8Iop)
4392623SN/A    exec_output += PredOpExecute.subst(usad8Iop)
4402623SN/A
4412623SN/A    usada8Code = '''
4422623SN/A        uint32_t resTemp = 0;
4432623SN/A        for (unsigned i = 0; i < 4; i++) {
4442623SN/A            int low = i * 8;
4452623SN/A            int high = low + 7;
4462623SN/A            int32_t diff = bits(Op1, high, low) -
4472623SN/A                           bits(Op2, high, low);
4482623SN/A            resTemp += ((diff < 0) ? -diff : diff);
4492623SN/A        }
4502623SN/A        Dest = Op3 + resTemp;
4512623SN/A    '''
4527520Sgblack@eecs.umich.edu    usada8Iop = InstObjParams("usada8", "Usada8", "RegRegRegRegOp",
4537520Sgblack@eecs.umich.edu                              { "code": usada8Code,
4542623SN/A                                "predicate_test": predicateTest }, [])
4553169Sstever@eecs.umich.edu    header_output += RegRegRegRegOpDeclare.subst(usada8Iop)
4564870Sstever@eecs.umich.edu    decoder_output += RegRegRegRegOpConstructor.subst(usada8Iop)
4572623SN/A    exec_output += PredOpExecute.subst(usada8Iop)
4582623SN/A
4592623SN/A    nopIop = InstObjParams("nop", "NopInst", "ArmStaticInst", "", [])
4602623SN/A    header_output += BasicDeclare.subst(nopIop)
4612623SN/A    decoder_output += BasicConstructor.subst(nopIop)
4624999Sgblack@eecs.umich.edu    exec_output += BasicExecute.subst(nopIop)
4636227Snate@binkert.org
4644999Sgblack@eecs.umich.edu    ubfxCode = '''
4657520Sgblack@eecs.umich.edu        Dest = bits(Op1, imm2, imm1);
4662623SN/A    '''
4674999Sgblack@eecs.umich.edu    ubfxIop = InstObjParams("ubfx", "Ubfx", "RegRegImmImmOp",
4684999Sgblack@eecs.umich.edu                            { "code": ubfxCode,
4697520Sgblack@eecs.umich.edu                              "predicate_test": predicateTest }, [])
4704999Sgblack@eecs.umich.edu    header_output += RegRegImmImmOpDeclare.subst(ubfxIop)
4714999Sgblack@eecs.umich.edu    decoder_output += RegRegImmImmOpConstructor.subst(ubfxIop)
4727520Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(ubfxIop)
4734999Sgblack@eecs.umich.edu
4744999Sgblack@eecs.umich.edu    sbfxCode = '''
4754999Sgblack@eecs.umich.edu        int32_t resTemp = bits(Op1, imm2, imm1);
4764999Sgblack@eecs.umich.edu        Dest = resTemp | -(resTemp & (1 << (imm2 - imm1)));
4777520Sgblack@eecs.umich.edu    '''
4784999Sgblack@eecs.umich.edu    sbfxIop = InstObjParams("sbfx", "Sbfx", "RegRegImmImmOp",
4794999Sgblack@eecs.umich.edu                            { "code": sbfxCode,
4806023Snate@binkert.org                              "predicate_test": predicateTest }, [])
4814999Sgblack@eecs.umich.edu    header_output += RegRegImmImmOpDeclare.subst(sbfxIop)
4824999Sgblack@eecs.umich.edu    decoder_output += RegRegImmImmOpConstructor.subst(sbfxIop)
4834999Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(sbfxIop)
4844999Sgblack@eecs.umich.edu
4854999Sgblack@eecs.umich.edu    bfcCode = '''
4864999Sgblack@eecs.umich.edu        Dest = Op1 & ~(mask(imm2 - imm1 + 1) << imm1);
4876102Sgblack@eecs.umich.edu    '''
4884999Sgblack@eecs.umich.edu    bfcIop = InstObjParams("bfc", "Bfc", "RegRegImmImmOp",
4894999Sgblack@eecs.umich.edu                           { "code": bfcCode,
4904999Sgblack@eecs.umich.edu                             "predicate_test": predicateTest }, [])
4914999Sgblack@eecs.umich.edu    header_output += RegRegImmImmOpDeclare.subst(bfcIop)
4924999Sgblack@eecs.umich.edu    decoder_output += RegRegImmImmOpConstructor.subst(bfcIop)
4934999Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(bfcIop)
4944999Sgblack@eecs.umich.edu
4954999Sgblack@eecs.umich.edu    bfiCode = '''
4964999Sgblack@eecs.umich.edu        uint32_t bitMask = (mask(imm2 - imm1 + 1) << imm1);
4974999Sgblack@eecs.umich.edu        Dest = ((Op1 << imm1) & bitMask) | (Dest & ~bitMask);
4986623Sgblack@eecs.umich.edu    '''
4994999Sgblack@eecs.umich.edu    bfiIop = InstObjParams("bfi", "Bfi", "RegRegImmImmOp",
5007520Sgblack@eecs.umich.edu                           { "code": bfiCode,
5014999Sgblack@eecs.umich.edu                             "predicate_test": predicateTest }, [])
5024999Sgblack@eecs.umich.edu    header_output += RegRegImmImmOpDeclare.subst(bfiIop)
5034999Sgblack@eecs.umich.edu    decoder_output += RegRegImmImmOpConstructor.subst(bfiIop)
5044999Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(bfiIop)
5054999Sgblack@eecs.umich.edu
5064999Sgblack@eecs.umich.edu    mrc15code = '''
5074999Sgblack@eecs.umich.edu    CPSR cpsr = Cpsr;
5084999Sgblack@eecs.umich.edu    if (cpsr.mode == MODE_USER)
5094999Sgblack@eecs.umich.edu#if FULL_SYSTEM
5104999Sgblack@eecs.umich.edu        return new UndefinedInstruction;
5114999Sgblack@eecs.umich.edu#else
5124999Sgblack@eecs.umich.edu        return new UndefinedInstruction(false, mnemonic);
5134999Sgblack@eecs.umich.edu#endif
5144999Sgblack@eecs.umich.edu    Dest = MiscOp1;
5154999Sgblack@eecs.umich.edu    '''
5167520Sgblack@eecs.umich.edu
5174999Sgblack@eecs.umich.edu    mrc15Iop = InstObjParams("mrc", "Mrc15", "RegRegOp",
5184999Sgblack@eecs.umich.edu                             { "code": mrc15code,
5194999Sgblack@eecs.umich.edu                               "predicate_test": predicateTest }, [])
5204999Sgblack@eecs.umich.edu    header_output += RegRegOpDeclare.subst(mrc15Iop)
5214999Sgblack@eecs.umich.edu    decoder_output += RegRegOpConstructor.subst(mrc15Iop)
5224878Sstever@eecs.umich.edu    exec_output += PredOpExecute.subst(mrc15Iop)
5234040Ssaidi@eecs.umich.edu
5244040Ssaidi@eecs.umich.edu
5254999Sgblack@eecs.umich.edu    mcr15code = '''
5264999Sgblack@eecs.umich.edu    CPSR cpsr = Cpsr;
5274999Sgblack@eecs.umich.edu    if (cpsr.mode == MODE_USER)
5284999Sgblack@eecs.umich.edu#if FULL_SYSTEM
5296078Sgblack@eecs.umich.edu        return new UndefinedInstruction;
5306078Sgblack@eecs.umich.edu#else
5316078Sgblack@eecs.umich.edu        return new UndefinedInstruction(false, mnemonic);
5326078Sgblack@eecs.umich.edu#endif
5336739Sgblack@eecs.umich.edu    MiscDest = Op1;
5346739Sgblack@eecs.umich.edu    '''
5356739Sgblack@eecs.umich.edu    mcr15Iop = InstObjParams("mcr", "Mcr15", "RegRegOp",
5366739Sgblack@eecs.umich.edu                             { "code": mcr15code,
5376739Sgblack@eecs.umich.edu                               "predicate_test": predicateTest }, [])
5383170Sstever@eecs.umich.edu    header_output += RegRegOpDeclare.subst(mcr15Iop)
5393170Sstever@eecs.umich.edu    decoder_output += RegRegOpConstructor.subst(mcr15Iop)
5404999Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(mcr15Iop)
5414999Sgblack@eecs.umich.edu
5424999Sgblack@eecs.umich.edu    enterxCode = '''
5434999Sgblack@eecs.umich.edu        FNPC = NPC | (1ULL << PcJBitShift) | (1ULL << PcTBitShift);
5444999Sgblack@eecs.umich.edu    '''
5457520Sgblack@eecs.umich.edu    enterxIop = InstObjParams("enterx", "Enterx", "PredOp",
5464999Sgblack@eecs.umich.edu                              { "code": enterxCode,
5477520Sgblack@eecs.umich.edu                                "predicate_test": predicateTest }, [])
5484999Sgblack@eecs.umich.edu    header_output += BasicDeclare.subst(enterxIop)
5494999Sgblack@eecs.umich.edu    decoder_output += BasicConstructor.subst(enterxIop)
5502623SN/A    exec_output += PredOpExecute.subst(enterxIop)
5512623SN/A
5522623SN/A    leavexCode = '''
5532623SN/A        FNPC = (NPC & ~(1ULL << PcJBitShift)) | (1ULL << PcTBitShift);
5547520Sgblack@eecs.umich.edu    '''
5557520Sgblack@eecs.umich.edu    leavexIop = InstObjParams("leavex", "Leavex", "PredOp",
5567520Sgblack@eecs.umich.edu                              { "code": leavexCode,
5577520Sgblack@eecs.umich.edu                                "predicate_test": predicateTest }, [])
5587520Sgblack@eecs.umich.edu    header_output += BasicDeclare.subst(leavexIop)
5597520Sgblack@eecs.umich.edu    decoder_output += BasicConstructor.subst(leavexIop)
5607520Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(leavexIop)
5617520Sgblack@eecs.umich.edu
5627520Sgblack@eecs.umich.edu    setendCode = '''
5637520Sgblack@eecs.umich.edu        CPSR cpsr = Cpsr;
5647520Sgblack@eecs.umich.edu        cpsr.e = imm;
5657520Sgblack@eecs.umich.edu        Cpsr = cpsr;
5667520Sgblack@eecs.umich.edu    '''
5677520Sgblack@eecs.umich.edu    setendIop = InstObjParams("setend", "Setend", "ImmOp",
5687520Sgblack@eecs.umich.edu                              { "code": setendCode,
5697520Sgblack@eecs.umich.edu                                "predicate_test": predicateTest }, [])
5707520Sgblack@eecs.umich.edu    header_output += ImmOpDeclare.subst(setendIop)
5712623SN/A    decoder_output += ImmOpConstructor.subst(setendIop)
5724224Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(setendIop)
5734224Sgblack@eecs.umich.edu
5744224Sgblack@eecs.umich.edu    cpsCode = '''
5754224Sgblack@eecs.umich.edu    uint32_t mode = bits(imm, 4, 0);
5764224Sgblack@eecs.umich.edu    uint32_t f = bits(imm, 5);
5774224Sgblack@eecs.umich.edu    uint32_t i = bits(imm, 6);
5784224Sgblack@eecs.umich.edu    uint32_t a = bits(imm, 7);
5794224Sgblack@eecs.umich.edu    bool setMode = bits(imm, 8);
5804224Sgblack@eecs.umich.edu    bool enable = bits(imm, 9);
5814224Sgblack@eecs.umich.edu    CPSR cpsr = Cpsr;
5824224Sgblack@eecs.umich.edu    SCTLR sctlr = Sctlr;
5832623SN/A    if (cpsr.mode != MODE_USER) {
5842623SN/A        if (enable) {
5852623SN/A            if (f) cpsr.f = 0;
5862623SN/A            if (i) cpsr.i = 0;
5872623SN/A            if (a) cpsr.a = 0;
5882623SN/A        } else {
5892623SN/A            if (f && !sctlr.nmfi) cpsr.f = 1;
5902623SN/A            if (i) cpsr.i = 1;
5912623SN/A            if (a) cpsr.a = 1;
5922623SN/A        }
5932623SN/A        if (setMode) {
5942623SN/A            cpsr.mode = mode;
5952623SN/A        }
5962623SN/A    }
5972623SN/A    Cpsr = cpsr;
5982623SN/A    '''
5992623SN/A    cpsIop = InstObjParams("cps", "Cps", "ImmOp",
6002623SN/A                           { "code": cpsCode,
6012623SN/A                             "predicate_test": predicateTest }, [])
6022623SN/A    header_output += ImmOpDeclare.subst(cpsIop)
6032623SN/A    decoder_output += ImmOpConstructor.subst(cpsIop)
6042623SN/A    exec_output += PredOpExecute.subst(cpsIop)
6052623SN/A}};
6062623SN/A