data.isa revision 7146
17139Sgblack@eecs.umich.edu// Copyright (c) 2010 ARM Limited
27139Sgblack@eecs.umich.edu// All rights reserved
37139Sgblack@eecs.umich.edu//
47139Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall
57139Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual
67139Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating
77139Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software
87139Sgblack@eecs.umich.edu// licensed hereunder.  You may use the software subject to the license
97139Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated
107139Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software,
117139Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form.
127139Sgblack@eecs.umich.edu//
137139Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without
147139Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are
157139Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright
167139Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer;
177139Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright
187139Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the
197139Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution;
207139Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its
217139Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from
227139Sgblack@eecs.umich.edu// this software without specific prior written permission.
237139Sgblack@eecs.umich.edu//
247139Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
257139Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
267139Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
277139Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
287139Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
297139Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
307139Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
317139Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
327139Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
337139Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
347139Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
357139Sgblack@eecs.umich.edu//
367139Sgblack@eecs.umich.edu// Authors: Gabe Black
377139Sgblack@eecs.umich.edu
387139Sgblack@eecs.umich.edudef format ArmDataProcReg() {{
397139Sgblack@eecs.umich.edu    instDecode = '''
407139Sgblack@eecs.umich.edu          case %(opcode)#x:
417139Sgblack@eecs.umich.edu            if (immShift) {
427139Sgblack@eecs.umich.edu                if (setCc) {
437146Sgblack@eecs.umich.edu                    return new %(className)sRegCc(machInst, %(dest)s, %(op1)s,
447141Sgblack@eecs.umich.edu                                                   rm, imm5, type);
457139Sgblack@eecs.umich.edu                } else {
467146Sgblack@eecs.umich.edu                    return new %(className)sReg(machInst, %(dest)s, %(op1)s,
477141Sgblack@eecs.umich.edu                                                 rm, imm5, type);
487139Sgblack@eecs.umich.edu                }
497139Sgblack@eecs.umich.edu            } else {
507139Sgblack@eecs.umich.edu                if (setCc) {
517146Sgblack@eecs.umich.edu                    return new %(className)sRegRegCc(machInst, %(dest)s,
527141Sgblack@eecs.umich.edu                                                      %(op1)s, rm, rs, type);
537139Sgblack@eecs.umich.edu                } else {
547146Sgblack@eecs.umich.edu                    return new %(className)sRegReg(machInst, %(dest)s,
557141Sgblack@eecs.umich.edu                                                    %(op1)s, rm, rs, type);
567139Sgblack@eecs.umich.edu                }
577139Sgblack@eecs.umich.edu            }
587139Sgblack@eecs.umich.edu            break;
597139Sgblack@eecs.umich.edu    '''
607139Sgblack@eecs.umich.edu
617141Sgblack@eecs.umich.edu    def instCode(opcode, mnem, dest="rd", op1="rn"):
627139Sgblack@eecs.umich.edu        global instDecode
637139Sgblack@eecs.umich.edu        return instDecode % { "className": mnem.capitalize(),
647141Sgblack@eecs.umich.edu                              "opcode": opcode,
657141Sgblack@eecs.umich.edu                              "dest": dest,
667141Sgblack@eecs.umich.edu                              "op1": op1 }
677139Sgblack@eecs.umich.edu
687139Sgblack@eecs.umich.edu    decode_block = '''
697139Sgblack@eecs.umich.edu    {
707139Sgblack@eecs.umich.edu        const bool immShift = (bits(machInst, 4) == 0);
717139Sgblack@eecs.umich.edu        const bool setCc = (bits(machInst, 20) == 1);
727139Sgblack@eecs.umich.edu        const uint32_t imm5 = bits(machInst, 11, 7);
737139Sgblack@eecs.umich.edu        const ArmShiftType type = (ArmShiftType)(uint32_t)bits(machInst, 6, 5);
747139Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)RD;
757139Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)RN;
767139Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)RM;
777139Sgblack@eecs.umich.edu        const IntRegIndex rs = (IntRegIndex)(uint32_t)RS;
787139Sgblack@eecs.umich.edu        switch (OPCODE) {
797139Sgblack@eecs.umich.edu    '''
807139Sgblack@eecs.umich.edu    decode_block += instCode(0x0, "and")
817139Sgblack@eecs.umich.edu    decode_block += instCode(0x1, "eor")
827139Sgblack@eecs.umich.edu    decode_block += instCode(0x2, "sub")
837139Sgblack@eecs.umich.edu    decode_block += instCode(0x3, "rsb")
847139Sgblack@eecs.umich.edu    decode_block += instCode(0x4, "add")
857139Sgblack@eecs.umich.edu    decode_block += instCode(0x5, "adc")
867139Sgblack@eecs.umich.edu    decode_block += instCode(0x6, "sbc")
877139Sgblack@eecs.umich.edu    decode_block += instCode(0x7, "rsc")
887141Sgblack@eecs.umich.edu    decode_block += instCode(0x8, "tst", dest="INTREG_ZERO")
897141Sgblack@eecs.umich.edu    decode_block += instCode(0x9, "teq", dest="INTREG_ZERO")
907141Sgblack@eecs.umich.edu    decode_block += instCode(0xa, "cmp", dest="INTREG_ZERO")
917141Sgblack@eecs.umich.edu    decode_block += instCode(0xb, "cmn", dest="INTREG_ZERO")
927139Sgblack@eecs.umich.edu    decode_block += instCode(0xc, "orr")
937141Sgblack@eecs.umich.edu    decode_block += instCode(0xd, "mov", op1="INTREG_ZERO")
947139Sgblack@eecs.umich.edu    decode_block += instCode(0xe, "bic")
957141Sgblack@eecs.umich.edu    decode_block += instCode(0xf, "mvn", op1="INTREG_ZERO")
967139Sgblack@eecs.umich.edu    decode_block += '''
977139Sgblack@eecs.umich.edu          default:
987139Sgblack@eecs.umich.edu            return new Unknown(machInst);
997139Sgblack@eecs.umich.edu        }
1007139Sgblack@eecs.umich.edu    }
1017139Sgblack@eecs.umich.edu    '''
1027139Sgblack@eecs.umich.edu}};
1037139Sgblack@eecs.umich.edu
1047139Sgblack@eecs.umich.edudef format ArmDataProcImm() {{
1057139Sgblack@eecs.umich.edu    instDecode = '''
1067139Sgblack@eecs.umich.edu          case %(opcode)#x:
1077139Sgblack@eecs.umich.edu            if (setCc) {
1087146Sgblack@eecs.umich.edu                return new %(className)sImmCc(machInst, %(dest)s, %(op1)s,
1097141Sgblack@eecs.umich.edu                                               imm, rotC);
1107139Sgblack@eecs.umich.edu            } else {
1117146Sgblack@eecs.umich.edu                return new %(className)sImm(machInst, %(dest)s, %(op1)s,
1127141Sgblack@eecs.umich.edu                                             imm, rotC);
1137139Sgblack@eecs.umich.edu            }
1147139Sgblack@eecs.umich.edu            break;
1157139Sgblack@eecs.umich.edu    '''
1167139Sgblack@eecs.umich.edu
1177141Sgblack@eecs.umich.edu    def instCode(opcode, mnem, dest="rd", op1="rn"):
1187139Sgblack@eecs.umich.edu        global instDecode
1197139Sgblack@eecs.umich.edu        return instDecode % { "className": mnem.capitalize(),
1207141Sgblack@eecs.umich.edu                              "opcode": opcode,
1217141Sgblack@eecs.umich.edu                              "dest": dest,
1227141Sgblack@eecs.umich.edu                              "op1": op1 }
1237139Sgblack@eecs.umich.edu
1247139Sgblack@eecs.umich.edu    decode_block = '''
1257139Sgblack@eecs.umich.edu    {
1267139Sgblack@eecs.umich.edu        const bool setCc = (bits(machInst, 20) == 1);
1277139Sgblack@eecs.umich.edu        const uint32_t unrotated = bits(machInst, 7, 0);
1287139Sgblack@eecs.umich.edu        const uint32_t rotation = (bits(machInst, 11, 8) << 1);
1297139Sgblack@eecs.umich.edu        const bool rotC = (rotation != 0);
1307139Sgblack@eecs.umich.edu        const uint32_t imm = rotate_imm(unrotated, rotation);
1317139Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)RD;
1327139Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)RN;
1337139Sgblack@eecs.umich.edu        switch (OPCODE) {
1347139Sgblack@eecs.umich.edu    '''
1357139Sgblack@eecs.umich.edu    decode_block += instCode(0x0, "and")
1367139Sgblack@eecs.umich.edu    decode_block += instCode(0x1, "eor")
1377139Sgblack@eecs.umich.edu    decode_block += instCode(0x2, "sub")
1387139Sgblack@eecs.umich.edu    decode_block += instCode(0x3, "rsb")
1397139Sgblack@eecs.umich.edu    decode_block += instCode(0x4, "add")
1407139Sgblack@eecs.umich.edu    decode_block += instCode(0x5, "adc")
1417139Sgblack@eecs.umich.edu    decode_block += instCode(0x6, "sbc")
1427139Sgblack@eecs.umich.edu    decode_block += instCode(0x7, "rsc")
1437141Sgblack@eecs.umich.edu    decode_block += instCode(0x8, "tst", dest="INTREG_ZERO")
1447141Sgblack@eecs.umich.edu    decode_block += instCode(0x9, "teq", dest="INTREG_ZERO")
1457141Sgblack@eecs.umich.edu    decode_block += instCode(0xa, "cmp", dest="INTREG_ZERO")
1467141Sgblack@eecs.umich.edu    decode_block += instCode(0xb, "cmn", dest="INTREG_ZERO")
1477139Sgblack@eecs.umich.edu    decode_block += instCode(0xc, "orr")
1487141Sgblack@eecs.umich.edu    decode_block += instCode(0xd, "mov", op1="INTREG_ZERO")
1497139Sgblack@eecs.umich.edu    decode_block += instCode(0xe, "bic")
1507141Sgblack@eecs.umich.edu    decode_block += instCode(0xf, "mvn", op1="INTREG_ZERO")
1517139Sgblack@eecs.umich.edu    decode_block += '''
1527139Sgblack@eecs.umich.edu          default:
1537139Sgblack@eecs.umich.edu            return new Unknown(machInst);
1547139Sgblack@eecs.umich.edu        }
1557139Sgblack@eecs.umich.edu    }
1567139Sgblack@eecs.umich.edu    '''
1577139Sgblack@eecs.umich.edu}};
1587141Sgblack@eecs.umich.edu
1597141Sgblack@eecs.umich.edudef format Thumb16ShiftAddSubMoveCmp() {{
1607141Sgblack@eecs.umich.edu    decode_block = '''
1617141Sgblack@eecs.umich.edu    {
1627141Sgblack@eecs.umich.edu        const uint32_t imm5 = bits(machInst, 10, 6);
1637141Sgblack@eecs.umich.edu        const uint32_t imm3 = bits(machInst, 8, 6);
1647141Sgblack@eecs.umich.edu        const uint32_t imm8 = bits(machInst, 7, 0);
1657141Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 2, 0);
1667141Sgblack@eecs.umich.edu        const IntRegIndex rd8 = (IntRegIndex)(uint32_t)bits(machInst, 10, 8);
1677141Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 5, 3);
1687141Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 8, 6);
1697141Sgblack@eecs.umich.edu        switch (bits(machInst, 13, 11)) {
1707141Sgblack@eecs.umich.edu          case 0x0: // lsl
1717146Sgblack@eecs.umich.edu            return new MovReg(machInst, rd, INTREG_ZERO, rn, imm5, LSL);
1727141Sgblack@eecs.umich.edu          case 0x1: // lsr
1737146Sgblack@eecs.umich.edu            return new MovReg(machInst, rd, INTREG_ZERO, rn, imm5, LSR);
1747141Sgblack@eecs.umich.edu          case 0x2: // asr
1757146Sgblack@eecs.umich.edu            return new MovReg(machInst, rd, INTREG_ZERO, rn, imm5, ASR);
1767141Sgblack@eecs.umich.edu          case 0x3:
1777141Sgblack@eecs.umich.edu            switch (bits(machInst, 10, 9)) {
1787141Sgblack@eecs.umich.edu              case 0x0:
1797146Sgblack@eecs.umich.edu                return new AddReg(machInst, rd, rn, rm, 0, LSL);
1807141Sgblack@eecs.umich.edu              case 0x1:
1817146Sgblack@eecs.umich.edu                return new SubReg(machInst, rd, rn, rm, 0, LSL);
1827141Sgblack@eecs.umich.edu              case 0x2:
1837146Sgblack@eecs.umich.edu                return new AddImm(machInst, rd, rn, imm3, true);
1847141Sgblack@eecs.umich.edu              case 0x3:
1857146Sgblack@eecs.umich.edu                return new SubImm(machInst, rd, rn, imm3, true);
1867141Sgblack@eecs.umich.edu            }
1877141Sgblack@eecs.umich.edu          case 0x4:
1887146Sgblack@eecs.umich.edu            return new MovImm(machInst, rd8, INTREG_ZERO, imm8, true);
1897141Sgblack@eecs.umich.edu          case 0x5:
1907146Sgblack@eecs.umich.edu            return new CmpImmCc(machInst, INTREG_ZERO, rd8, imm8, true);
1917141Sgblack@eecs.umich.edu          case 0x6:
1927146Sgblack@eecs.umich.edu            return new AddImm(machInst, rd8, rd8, imm8, true);
1937141Sgblack@eecs.umich.edu          case 0x7:
1947146Sgblack@eecs.umich.edu            return new SubImm(machInst, rd8, rd8, imm8, true);
1957141Sgblack@eecs.umich.edu        }
1967141Sgblack@eecs.umich.edu    }
1977141Sgblack@eecs.umich.edu    '''
1987141Sgblack@eecs.umich.edu}};
1997141Sgblack@eecs.umich.edu
2007141Sgblack@eecs.umich.edudef format Thumb16DataProcessing() {{
2017141Sgblack@eecs.umich.edu    decode_block = '''
2027141Sgblack@eecs.umich.edu    {
2037141Sgblack@eecs.umich.edu        const IntRegIndex rdn = (IntRegIndex)(uint32_t)bits(machInst, 2, 0);
2047141Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 5, 3);
2057141Sgblack@eecs.umich.edu        switch (bits(machInst, 9, 6)) {
2067141Sgblack@eecs.umich.edu          case 0x0:
2077146Sgblack@eecs.umich.edu            return new AndReg(machInst, rdn, rdn, rm, 0, LSL);
2087141Sgblack@eecs.umich.edu          case 0x1:
2097146Sgblack@eecs.umich.edu            return new EorReg(machInst, rdn, rdn, rm, 0, LSL);
2107141Sgblack@eecs.umich.edu          case 0x2: //lsl
2117146Sgblack@eecs.umich.edu            return new MovRegReg(machInst, rdn, INTREG_ZERO, rdn, rm, LSL);
2127141Sgblack@eecs.umich.edu          case 0x3: //lsr
2137146Sgblack@eecs.umich.edu            return new MovRegReg(machInst, rdn, INTREG_ZERO, rdn, rm, LSR);
2147141Sgblack@eecs.umich.edu          case 0x4: //asr
2157146Sgblack@eecs.umich.edu            return new MovRegReg(machInst, rdn, INTREG_ZERO, rdn, rm, ASR);
2167141Sgblack@eecs.umich.edu          case 0x5:
2177146Sgblack@eecs.umich.edu            return new AdcReg(machInst, rdn, rdn, rm, 0, LSL);
2187141Sgblack@eecs.umich.edu          case 0x6:
2197146Sgblack@eecs.umich.edu            return new SbcReg(machInst, rdn, rdn, rm, 0, LSL);
2207141Sgblack@eecs.umich.edu          case 0x7: // ror
2217146Sgblack@eecs.umich.edu            return new MovRegReg(machInst, rdn, INTREG_ZERO, rdn, rm, ROR);
2227141Sgblack@eecs.umich.edu          case 0x8:
2237146Sgblack@eecs.umich.edu            return new TstReg(machInst, INTREG_ZERO, rdn, rm, 0, LSL);
2247141Sgblack@eecs.umich.edu          case 0x9:
2257146Sgblack@eecs.umich.edu            return new RsbImm(machInst, rdn, rm, 0, true);
2267141Sgblack@eecs.umich.edu          case 0xa:
2277146Sgblack@eecs.umich.edu            return new CmpReg(machInst, INTREG_ZERO, rdn, rm, 0, LSL);
2287141Sgblack@eecs.umich.edu          case 0xb:
2297146Sgblack@eecs.umich.edu            return new CmnReg(machInst, INTREG_ZERO, rdn, rm, 0, LSL);
2307141Sgblack@eecs.umich.edu          case 0xc:
2317146Sgblack@eecs.umich.edu            return new OrrReg(machInst, rdn, rdn, rm, 0, LSL);
2327141Sgblack@eecs.umich.edu          case 0xd:
2337141Sgblack@eecs.umich.edu            //XXX Implement me!
2347141Sgblack@eecs.umich.edu            return new WarnUnimplemented("mul", machInst);
2357141Sgblack@eecs.umich.edu          case 0xe:
2367146Sgblack@eecs.umich.edu            return new BicReg(machInst, rdn, rdn, rm, 0, LSL);
2377141Sgblack@eecs.umich.edu          case 0xf:
2387146Sgblack@eecs.umich.edu            return new MvnReg(machInst, rdn, INTREG_ZERO, rm, 0, LSL);
2397141Sgblack@eecs.umich.edu        }
2407141Sgblack@eecs.umich.edu    }
2417141Sgblack@eecs.umich.edu    '''
2427141Sgblack@eecs.umich.edu}};
2437141Sgblack@eecs.umich.edu
2447141Sgblack@eecs.umich.edudef format Thumb16SpecDataAndBx() {{
2457141Sgblack@eecs.umich.edu    decode_block = '''
2467141Sgblack@eecs.umich.edu    {
2477141Sgblack@eecs.umich.edu        const IntRegIndex rdn =
2487141Sgblack@eecs.umich.edu            (IntRegIndex)(uint32_t)(bits(machInst, 2, 0) |
2497141Sgblack@eecs.umich.edu                                    (bits(machInst, 7) << 3));
2507141Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 6, 3);
2517141Sgblack@eecs.umich.edu        switch (bits(machInst, 9, 8)) {
2527141Sgblack@eecs.umich.edu          case 0x0:
2537146Sgblack@eecs.umich.edu            return new AddReg(machInst, rdn, rdn, rm, 0, LSL);
2547141Sgblack@eecs.umich.edu          case 0x1:
2557146Sgblack@eecs.umich.edu            return new CmpReg(machInst, INTREG_ZERO, rdn, rm, 0, LSL);
2567141Sgblack@eecs.umich.edu          case 0x2:
2577146Sgblack@eecs.umich.edu            return new MovReg(machInst, rdn, INTREG_ZERO, rm, 0, LSL);
2587141Sgblack@eecs.umich.edu          case 0x3:
2597141Sgblack@eecs.umich.edu            if (bits(machInst, 7) == 0)
2607141Sgblack@eecs.umich.edu                return new WarnUnimplemented("bx", machInst);
2617141Sgblack@eecs.umich.edu            else
2627141Sgblack@eecs.umich.edu                // The register version.
2637141Sgblack@eecs.umich.edu                return new WarnUnimplemented("blx", machInst);
2647141Sgblack@eecs.umich.edu        }
2657141Sgblack@eecs.umich.edu    }
2667141Sgblack@eecs.umich.edu    '''
2677141Sgblack@eecs.umich.edu}};
2687141Sgblack@eecs.umich.edu
2697141Sgblack@eecs.umich.edudef format Thumb16Adr() {{
2707141Sgblack@eecs.umich.edu    decode_block = '''
2717141Sgblack@eecs.umich.edu    {
2727141Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 10, 8);
2737141Sgblack@eecs.umich.edu        const uint32_t imm8 = bits(machInst, 7, 0) << 2;
2747146Sgblack@eecs.umich.edu        return new AddImm(machInst, rd, INTREG_PC, imm8, true);
2757141Sgblack@eecs.umich.edu    }
2767141Sgblack@eecs.umich.edu    '''
2777141Sgblack@eecs.umich.edu}};
2787141Sgblack@eecs.umich.edu
2797141Sgblack@eecs.umich.edudef format Thumb16AddSp() {{
2807141Sgblack@eecs.umich.edu    decode_block = '''
2817141Sgblack@eecs.umich.edu    {
2827141Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 10, 8);
2837141Sgblack@eecs.umich.edu        const uint32_t imm8 = bits(machInst, 7, 0) << 2;
2847146Sgblack@eecs.umich.edu        return new AddImm(machInst, rd, INTREG_SP, imm8, true);
2857141Sgblack@eecs.umich.edu    }
2867141Sgblack@eecs.umich.edu    '''
2877141Sgblack@eecs.umich.edu}};
2887141Sgblack@eecs.umich.edu
2897141Sgblack@eecs.umich.edudef format Thumb16Misc() {{
2907141Sgblack@eecs.umich.edu    decode_block = '''
2917141Sgblack@eecs.umich.edu    {
2927141Sgblack@eecs.umich.edu        switch (bits(machInst, 11, 8)) {
2937141Sgblack@eecs.umich.edu          case 0x0:
2947141Sgblack@eecs.umich.edu            if (bits(machInst, 7)) {
2957146Sgblack@eecs.umich.edu                return new SubImm(machInst, INTREG_SP, INTREG_SP,
2967141Sgblack@eecs.umich.edu                                   bits(machInst, 6, 0) << 2, true);
2977141Sgblack@eecs.umich.edu            } else {
2987146Sgblack@eecs.umich.edu                return new AddImm(machInst, INTREG_SP, INTREG_SP,
2997141Sgblack@eecs.umich.edu                                   bits(machInst, 6, 0) << 2, true);
3007141Sgblack@eecs.umich.edu            }
3017141Sgblack@eecs.umich.edu          case 0x1:
3027141Sgblack@eecs.umich.edu            return new WarnUnimplemented("cbz", machInst);
3037141Sgblack@eecs.umich.edu          case 0x2:
3047141Sgblack@eecs.umich.edu            switch (bits(machInst, 7, 6)) {
3057141Sgblack@eecs.umich.edu              case 0x0:
3067141Sgblack@eecs.umich.edu                return new WarnUnimplemented("sxth", machInst);
3077141Sgblack@eecs.umich.edu              case 0x1:
3087141Sgblack@eecs.umich.edu                return new WarnUnimplemented("sxtb", machInst);
3097141Sgblack@eecs.umich.edu              case 0x2:
3107141Sgblack@eecs.umich.edu                return new WarnUnimplemented("uxth", machInst);
3117141Sgblack@eecs.umich.edu              case 0x3:
3127141Sgblack@eecs.umich.edu                return new WarnUnimplemented("uxtb", machInst);
3137141Sgblack@eecs.umich.edu            }
3147141Sgblack@eecs.umich.edu          case 0x3:
3157141Sgblack@eecs.umich.edu            return new WarnUnimplemented("cbnz", machInst);
3167141Sgblack@eecs.umich.edu          case 0x4:
3177141Sgblack@eecs.umich.edu          case 0x5:
3187141Sgblack@eecs.umich.edu            return new WarnUnimplemented("push", machInst);
3197141Sgblack@eecs.umich.edu          case 0x6:
3207141Sgblack@eecs.umich.edu            {
3217141Sgblack@eecs.umich.edu                const uint32_t opBits = bits(machInst, 7, 5);
3227141Sgblack@eecs.umich.edu                if (opBits == 2) {
3237141Sgblack@eecs.umich.edu                    return new WarnUnimplemented("setend", machInst);
3247141Sgblack@eecs.umich.edu                } else if (opBits == 3) {
3257141Sgblack@eecs.umich.edu                    return new WarnUnimplemented("cps", machInst);
3267141Sgblack@eecs.umich.edu                }
3277141Sgblack@eecs.umich.edu            }
3287141Sgblack@eecs.umich.edu          case 0x9:
3297141Sgblack@eecs.umich.edu            return new WarnUnimplemented("cbz", machInst);
3307141Sgblack@eecs.umich.edu          case 0xa:
3317141Sgblack@eecs.umich.edu            switch (bits(machInst, 7, 5)) {
3327141Sgblack@eecs.umich.edu              case 0x0:
3337141Sgblack@eecs.umich.edu                return new WarnUnimplemented("rev", machInst);
3347141Sgblack@eecs.umich.edu              case 0x1:
3357141Sgblack@eecs.umich.edu                return new WarnUnimplemented("rev16", machInst);
3367141Sgblack@eecs.umich.edu              case 0x3:
3377141Sgblack@eecs.umich.edu                return new WarnUnimplemented("revsh", machInst);
3387141Sgblack@eecs.umich.edu              default:
3397141Sgblack@eecs.umich.edu                break;
3407141Sgblack@eecs.umich.edu            }
3417141Sgblack@eecs.umich.edu            break;
3427141Sgblack@eecs.umich.edu          case 0xb:
3437141Sgblack@eecs.umich.edu            return new WarnUnimplemented("cbnz", machInst);
3447141Sgblack@eecs.umich.edu          case 0xc:
3457141Sgblack@eecs.umich.edu          case 0xd:
3467141Sgblack@eecs.umich.edu            return new WarnUnimplemented("pop", machInst);
3477141Sgblack@eecs.umich.edu          case 0xe:
3487141Sgblack@eecs.umich.edu            return new WarnUnimplemented("bkpt", machInst);
3497141Sgblack@eecs.umich.edu          case 0xf:
3507141Sgblack@eecs.umich.edu            if (bits(machInst, 3, 0) != 0)
3517141Sgblack@eecs.umich.edu                return new WarnUnimplemented("it", machInst);
3527141Sgblack@eecs.umich.edu            switch (bits(machInst, 7, 4)) {
3537141Sgblack@eecs.umich.edu              case 0x0:
3547141Sgblack@eecs.umich.edu                return new WarnUnimplemented("nop", machInst);
3557141Sgblack@eecs.umich.edu              case 0x1:
3567141Sgblack@eecs.umich.edu                return new WarnUnimplemented("yield", machInst);
3577141Sgblack@eecs.umich.edu              case 0x2:
3587141Sgblack@eecs.umich.edu                return new WarnUnimplemented("wfe", machInst);
3597141Sgblack@eecs.umich.edu              case 0x3:
3607141Sgblack@eecs.umich.edu                return new WarnUnimplemented("wfi", machInst);
3617141Sgblack@eecs.umich.edu              case 0x4:
3627141Sgblack@eecs.umich.edu                return new WarnUnimplemented("sev", machInst);
3637141Sgblack@eecs.umich.edu              default:
3647141Sgblack@eecs.umich.edu                return new WarnUnimplemented("unallocated_hint", machInst);
3657141Sgblack@eecs.umich.edu            }
3667141Sgblack@eecs.umich.edu          default:
3677141Sgblack@eecs.umich.edu            break;
3687141Sgblack@eecs.umich.edu        }
3697141Sgblack@eecs.umich.edu        return new Unknown(machInst);
3707141Sgblack@eecs.umich.edu    }
3717141Sgblack@eecs.umich.edu    '''
3727141Sgblack@eecs.umich.edu}};
3737141Sgblack@eecs.umich.edu
3747141Sgblack@eecs.umich.edudef format Thumb32DataProcModImm() {{
3757141Sgblack@eecs.umich.edu
3767141Sgblack@eecs.umich.edu    def decInst(mnem, dest="rd", op1="rn"):
3777141Sgblack@eecs.umich.edu        return '''
3787141Sgblack@eecs.umich.edu            if (s) {
3797146Sgblack@eecs.umich.edu                return new %(mnem)sImmCc(machInst, %(dest)s,
3807141Sgblack@eecs.umich.edu                                          %(op1)s, imm, true);
3817141Sgblack@eecs.umich.edu            } else {
3827146Sgblack@eecs.umich.edu                return new %(mnem)sImm(machInst, %(dest)s,
3837141Sgblack@eecs.umich.edu                                        %(op1)s, imm, true);
3847141Sgblack@eecs.umich.edu            }
3857141Sgblack@eecs.umich.edu        ''' % {"mnem" : mnem, "dest" : dest, "op1" : op1}
3867141Sgblack@eecs.umich.edu
3877141Sgblack@eecs.umich.edu    decode_block = '''
3887141Sgblack@eecs.umich.edu    {
3897141Sgblack@eecs.umich.edu        const uint32_t op = bits(machInst, 24, 21);
3907141Sgblack@eecs.umich.edu        const bool s = (bits(machInst, 20) == 1);
3917141Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
3927141Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
3937141Sgblack@eecs.umich.edu        const uint32_t ctrlImm = bits(machInst.instBits, 26) << 3 |
3947141Sgblack@eecs.umich.edu                                 bits(machInst, 14, 12);
3957141Sgblack@eecs.umich.edu        const uint32_t dataImm = bits(machInst, 7, 0);
3967141Sgblack@eecs.umich.edu        const uint32_t imm = modified_imm(ctrlImm, dataImm);
3977141Sgblack@eecs.umich.edu        switch (op) {
3987141Sgblack@eecs.umich.edu          case 0x0:
3997141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
4007141Sgblack@eecs.umich.edu                %(tst)s
4017141Sgblack@eecs.umich.edu            } else {
4027141Sgblack@eecs.umich.edu                %(and)s
4037141Sgblack@eecs.umich.edu            }
4047141Sgblack@eecs.umich.edu          case 0x1:
4057141Sgblack@eecs.umich.edu            %(bic)s
4067141Sgblack@eecs.umich.edu          case 0x2:
4077141Sgblack@eecs.umich.edu            if (rn == INTREG_PC) {
4087141Sgblack@eecs.umich.edu                %(mov)s
4097141Sgblack@eecs.umich.edu            } else {
4107141Sgblack@eecs.umich.edu                %(orr)s
4117141Sgblack@eecs.umich.edu            }
4127141Sgblack@eecs.umich.edu          case 0x3:
4137141Sgblack@eecs.umich.edu            if (rn == INTREG_PC) {
4147141Sgblack@eecs.umich.edu                %(mvn)s
4157141Sgblack@eecs.umich.edu            } else {
4167141Sgblack@eecs.umich.edu                %(orn)s
4177141Sgblack@eecs.umich.edu            }
4187141Sgblack@eecs.umich.edu          case 0x4:
4197141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
4207141Sgblack@eecs.umich.edu                %(teq)s
4217141Sgblack@eecs.umich.edu            } else {
4227141Sgblack@eecs.umich.edu                %(eor)s
4237141Sgblack@eecs.umich.edu            }
4247141Sgblack@eecs.umich.edu          case 0x8:
4257141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
4267141Sgblack@eecs.umich.edu                %(cmn)s
4277141Sgblack@eecs.umich.edu            } else {
4287141Sgblack@eecs.umich.edu                %(add)s
4297141Sgblack@eecs.umich.edu            }
4307141Sgblack@eecs.umich.edu          case 0xa:
4317141Sgblack@eecs.umich.edu            %(adc)s
4327141Sgblack@eecs.umich.edu          case 0xb:
4337141Sgblack@eecs.umich.edu            %(sbc)s
4347141Sgblack@eecs.umich.edu          case 0xd:
4357141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
4367141Sgblack@eecs.umich.edu                %(cmp)s
4377141Sgblack@eecs.umich.edu            } else {
4387141Sgblack@eecs.umich.edu                %(sub)s
4397141Sgblack@eecs.umich.edu            }
4407141Sgblack@eecs.umich.edu          case 0xe:
4417141Sgblack@eecs.umich.edu            %(rsb)s
4427141Sgblack@eecs.umich.edu          default:
4437141Sgblack@eecs.umich.edu            return new Unknown(machInst);
4447141Sgblack@eecs.umich.edu        }
4457141Sgblack@eecs.umich.edu    }
4467141Sgblack@eecs.umich.edu    ''' % {
4477141Sgblack@eecs.umich.edu        "tst" : decInst("Tst", "INTREG_ZERO"),
4487141Sgblack@eecs.umich.edu        "and" : decInst("And"),
4497141Sgblack@eecs.umich.edu        "bic" : decInst("Bic"),
4507141Sgblack@eecs.umich.edu        "mov" : decInst("Mov", op1="INTREG_ZERO"),
4517141Sgblack@eecs.umich.edu        "orr" : decInst("Orr"),
4527141Sgblack@eecs.umich.edu        "mvn" : decInst("Mvn", op1="INTREG_ZERO"),
4537141Sgblack@eecs.umich.edu        "orn" : decInst("Orn"),
4547141Sgblack@eecs.umich.edu        "teq" : decInst("Teq", dest="INTREG_ZERO"),
4557141Sgblack@eecs.umich.edu        "eor" : decInst("Eor"),
4567141Sgblack@eecs.umich.edu        "cmn" : decInst("Cmn", dest="INTREG_ZERO"),
4577141Sgblack@eecs.umich.edu        "add" : decInst("Add"),
4587141Sgblack@eecs.umich.edu        "adc" : decInst("Adc"),
4597141Sgblack@eecs.umich.edu        "sbc" : decInst("Sbc"),
4607141Sgblack@eecs.umich.edu        "cmp" : decInst("Cmp", dest="INTREG_ZERO"),
4617141Sgblack@eecs.umich.edu        "sub" : decInst("Sub"),
4627141Sgblack@eecs.umich.edu        "rsb" : decInst("Rsb")
4637141Sgblack@eecs.umich.edu    }
4647141Sgblack@eecs.umich.edu}};
4657141Sgblack@eecs.umich.edu
4667141Sgblack@eecs.umich.edudef format Thumb32DataProcShiftReg() {{
4677141Sgblack@eecs.umich.edu
4687141Sgblack@eecs.umich.edu    def decInst(mnem, dest="rd", op1="rn"):
4697141Sgblack@eecs.umich.edu        return '''
4707141Sgblack@eecs.umich.edu            if (s) {
4717146Sgblack@eecs.umich.edu                return new %(mnem)sRegCc(machInst, %(dest)s,
4727141Sgblack@eecs.umich.edu                                          %(op1)s, rm, amt, type);
4737141Sgblack@eecs.umich.edu            } else {
4747146Sgblack@eecs.umich.edu                return new %(mnem)sReg(machInst, %(dest)s,
4757141Sgblack@eecs.umich.edu                                        %(op1)s, rm, amt, type);
4767141Sgblack@eecs.umich.edu            }
4777141Sgblack@eecs.umich.edu        ''' % {"mnem" : mnem, "dest" : dest, "op1" : op1}
4787141Sgblack@eecs.umich.edu
4797141Sgblack@eecs.umich.edu    decode_block = '''
4807141Sgblack@eecs.umich.edu    {
4817141Sgblack@eecs.umich.edu        const uint32_t op = bits(machInst, 24, 21);
4827141Sgblack@eecs.umich.edu        const bool s = (bits(machInst, 20) == 1);
4837141Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
4847141Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
4857141Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 3, 0);
4867141Sgblack@eecs.umich.edu        const uint32_t amt = (bits(machInst, 14, 12) << 2) |
4877141Sgblack@eecs.umich.edu                              bits(machInst, 7, 6);
4887141Sgblack@eecs.umich.edu        const ArmShiftType type = (ArmShiftType)(uint32_t)bits(machInst, 5, 4);
4897141Sgblack@eecs.umich.edu        switch (op) {
4907141Sgblack@eecs.umich.edu          case 0x0:
4917141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
4927141Sgblack@eecs.umich.edu                %(tst)s
4937141Sgblack@eecs.umich.edu            } else {
4947141Sgblack@eecs.umich.edu                %(and)s
4957141Sgblack@eecs.umich.edu            }
4967141Sgblack@eecs.umich.edu          case 0x1:
4977141Sgblack@eecs.umich.edu            %(bic)s
4987141Sgblack@eecs.umich.edu          case 0x2:
4997141Sgblack@eecs.umich.edu            if (rn == INTREG_PC) {
5007141Sgblack@eecs.umich.edu                %(mov)s
5017141Sgblack@eecs.umich.edu            } else {
5027141Sgblack@eecs.umich.edu                %(orr)s
5037141Sgblack@eecs.umich.edu            }
5047141Sgblack@eecs.umich.edu          case 0x3:
5057141Sgblack@eecs.umich.edu            if (rn == INTREG_PC) {
5067141Sgblack@eecs.umich.edu                %(mvn)s
5077141Sgblack@eecs.umich.edu            } else {
5087141Sgblack@eecs.umich.edu                %(orn)s
5097141Sgblack@eecs.umich.edu            }
5107141Sgblack@eecs.umich.edu          case 0x4:
5117141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
5127141Sgblack@eecs.umich.edu                %(teq)s
5137141Sgblack@eecs.umich.edu            } else {
5147141Sgblack@eecs.umich.edu                %(eor)s
5157141Sgblack@eecs.umich.edu            }
5167141Sgblack@eecs.umich.edu          case 0x6:
5177141Sgblack@eecs.umich.edu            return new WarnUnimplemented("pkh", machInst);
5187141Sgblack@eecs.umich.edu          case 0x8:
5197141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
5207141Sgblack@eecs.umich.edu                %(cmn)s
5217141Sgblack@eecs.umich.edu            } else {
5227141Sgblack@eecs.umich.edu                %(add)s
5237141Sgblack@eecs.umich.edu            }
5247141Sgblack@eecs.umich.edu          case 0xa:
5257141Sgblack@eecs.umich.edu            %(adc)s
5267141Sgblack@eecs.umich.edu          case 0xb:
5277141Sgblack@eecs.umich.edu            %(sbc)s
5287141Sgblack@eecs.umich.edu          case 0xd:
5297141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
5307141Sgblack@eecs.umich.edu                %(cmp)s
5317141Sgblack@eecs.umich.edu            } else {
5327141Sgblack@eecs.umich.edu                %(sub)s
5337141Sgblack@eecs.umich.edu            }
5347141Sgblack@eecs.umich.edu          case 0xe:
5357141Sgblack@eecs.umich.edu            %(rsb)s
5367141Sgblack@eecs.umich.edu          default:
5377141Sgblack@eecs.umich.edu            return new Unknown(machInst);
5387141Sgblack@eecs.umich.edu        }
5397141Sgblack@eecs.umich.edu    }
5407141Sgblack@eecs.umich.edu    ''' % {
5417141Sgblack@eecs.umich.edu        "tst" : decInst("Tst", "INTREG_ZERO"),
5427141Sgblack@eecs.umich.edu        "and" : decInst("And"),
5437141Sgblack@eecs.umich.edu        "bic" : decInst("Bic"),
5447141Sgblack@eecs.umich.edu        "mov" : decInst("Mov", op1="INTREG_ZERO"),
5457141Sgblack@eecs.umich.edu        "orr" : decInst("Orr"),
5467141Sgblack@eecs.umich.edu        "mvn" : decInst("Mvn", op1="INTREG_ZERO"),
5477141Sgblack@eecs.umich.edu        "orn" : decInst("Orn"),
5487141Sgblack@eecs.umich.edu        "teq" : decInst("Teq", "INTREG_ZERO"),
5497141Sgblack@eecs.umich.edu        "eor" : decInst("Eor"),
5507141Sgblack@eecs.umich.edu        "cmn" : decInst("Cmn", "INTREG_ZERO"),
5517141Sgblack@eecs.umich.edu        "add" : decInst("Add"),
5527141Sgblack@eecs.umich.edu        "adc" : decInst("Adc"),
5537141Sgblack@eecs.umich.edu        "sbc" : decInst("Sbc"),
5547141Sgblack@eecs.umich.edu        "cmp" : decInst("Cmp", "INTREG_ZERO"),
5557141Sgblack@eecs.umich.edu        "sub" : decInst("Sub"),
5567141Sgblack@eecs.umich.edu        "rsb" : decInst("Rsb")
5577141Sgblack@eecs.umich.edu    }
5587141Sgblack@eecs.umich.edu}};
559