data.isa revision 7183
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
1717183Sgblack@eecs.umich.edu            return new MovRegCc(machInst, rd, INTREG_ZERO, rn, imm5, LSL);
1727141Sgblack@eecs.umich.edu          case 0x1: // lsr
1737183Sgblack@eecs.umich.edu            return new MovRegCc(machInst, rd, INTREG_ZERO, rn, imm5, LSR);
1747141Sgblack@eecs.umich.edu          case 0x2: // asr
1757183Sgblack@eecs.umich.edu            return new MovRegCc(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:
1797183Sgblack@eecs.umich.edu                return new AddRegCc(machInst, rd, rn, rm, 0, LSL);
1807141Sgblack@eecs.umich.edu              case 0x1:
1817183Sgblack@eecs.umich.edu                return new SubRegCc(machInst, rd, rn, rm, 0, LSL);
1827141Sgblack@eecs.umich.edu              case 0x2:
1837183Sgblack@eecs.umich.edu                return new AddImmCc(machInst, rd, rn, imm3, true);
1847141Sgblack@eecs.umich.edu              case 0x3:
1857183Sgblack@eecs.umich.edu                return new SubImmCc(machInst, rd, rn, imm3, true);
1867141Sgblack@eecs.umich.edu            }
1877141Sgblack@eecs.umich.edu          case 0x4:
1887183Sgblack@eecs.umich.edu            return new MovImmCc(machInst, rd8, INTREG_ZERO, imm8, false);
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:
1927183Sgblack@eecs.umich.edu            return new AddImmCc(machInst, rd8, rd8, imm8, true);
1937141Sgblack@eecs.umich.edu          case 0x7:
1947183Sgblack@eecs.umich.edu            return new SubImmCc(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:
2077183Sgblack@eecs.umich.edu            return new AndRegCc(machInst, rdn, rdn, rm, 0, LSL);
2087141Sgblack@eecs.umich.edu          case 0x1:
2097183Sgblack@eecs.umich.edu            return new EorRegCc(machInst, rdn, rdn, rm, 0, LSL);
2107141Sgblack@eecs.umich.edu          case 0x2: //lsl
2117183Sgblack@eecs.umich.edu            return new MovRegRegCc(machInst, rdn, INTREG_ZERO, rdn, rm, LSL);
2127141Sgblack@eecs.umich.edu          case 0x3: //lsr
2137183Sgblack@eecs.umich.edu            return new MovRegRegCc(machInst, rdn, INTREG_ZERO, rdn, rm, LSR);
2147141Sgblack@eecs.umich.edu          case 0x4: //asr
2157183Sgblack@eecs.umich.edu            return new MovRegRegCc(machInst, rdn, INTREG_ZERO, rdn, rm, ASR);
2167141Sgblack@eecs.umich.edu          case 0x5:
2177183Sgblack@eecs.umich.edu            return new AdcRegCc(machInst, rdn, rdn, rm, 0, LSL);
2187141Sgblack@eecs.umich.edu          case 0x6:
2197183Sgblack@eecs.umich.edu            return new SbcRegCc(machInst, rdn, rdn, rm, 0, LSL);
2207141Sgblack@eecs.umich.edu          case 0x7: // ror
2217183Sgblack@eecs.umich.edu            return new MovRegRegCc(machInst, rdn, INTREG_ZERO, rdn, rm, ROR);
2227141Sgblack@eecs.umich.edu          case 0x8:
2237183Sgblack@eecs.umich.edu            return new TstRegCc(machInst, INTREG_ZERO, rdn, rm, 0, LSL);
2247141Sgblack@eecs.umich.edu          case 0x9:
2257183Sgblack@eecs.umich.edu            return new RsbImmCc(machInst, rdn, rm, 0, true);
2267141Sgblack@eecs.umich.edu          case 0xa:
2277183Sgblack@eecs.umich.edu            return new CmpRegCc(machInst, INTREG_ZERO, rdn, rm, 0, LSL);
2287141Sgblack@eecs.umich.edu          case 0xb:
2297183Sgblack@eecs.umich.edu            return new CmnRegCc(machInst, INTREG_ZERO, rdn, rm, 0, LSL);
2307141Sgblack@eecs.umich.edu          case 0xc:
2317183Sgblack@eecs.umich.edu            return new OrrRegCc(machInst, rdn, rdn, rm, 0, LSL);
2327141Sgblack@eecs.umich.edu          case 0xd:
2337183Sgblack@eecs.umich.edu            return new MulCc(machInst, rdn, rm, rdn);
2347141Sgblack@eecs.umich.edu          case 0xe:
2357183Sgblack@eecs.umich.edu            return new BicRegCc(machInst, rdn, rdn, rm, 0, LSL);
2367141Sgblack@eecs.umich.edu          case 0xf:
2377183Sgblack@eecs.umich.edu            return new MvnRegCc(machInst, rdn, INTREG_ZERO, rm, 0, LSL);
2387141Sgblack@eecs.umich.edu        }
2397141Sgblack@eecs.umich.edu    }
2407141Sgblack@eecs.umich.edu    '''
2417141Sgblack@eecs.umich.edu}};
2427141Sgblack@eecs.umich.edu
2437141Sgblack@eecs.umich.edudef format Thumb16SpecDataAndBx() {{
2447141Sgblack@eecs.umich.edu    decode_block = '''
2457141Sgblack@eecs.umich.edu    {
2467141Sgblack@eecs.umich.edu        const IntRegIndex rdn =
2477141Sgblack@eecs.umich.edu            (IntRegIndex)(uint32_t)(bits(machInst, 2, 0) |
2487141Sgblack@eecs.umich.edu                                    (bits(machInst, 7) << 3));
2497141Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 6, 3);
2507141Sgblack@eecs.umich.edu        switch (bits(machInst, 9, 8)) {
2517141Sgblack@eecs.umich.edu          case 0x0:
2527146Sgblack@eecs.umich.edu            return new AddReg(machInst, rdn, rdn, rm, 0, LSL);
2537141Sgblack@eecs.umich.edu          case 0x1:
2547183Sgblack@eecs.umich.edu            return new CmpRegCc(machInst, INTREG_ZERO, rdn, rm, 0, LSL);
2557141Sgblack@eecs.umich.edu          case 0x2:
2567146Sgblack@eecs.umich.edu            return new MovReg(machInst, rdn, INTREG_ZERO, rm, 0, LSL);
2577141Sgblack@eecs.umich.edu          case 0x3:
2587154Sgblack@eecs.umich.edu            if (bits(machInst, 7) == 0) {
2597154Sgblack@eecs.umich.edu                return new BxReg(machInst,
2607154Sgblack@eecs.umich.edu                                 (IntRegIndex)(uint32_t)bits(machInst, 6, 3),
2617154Sgblack@eecs.umich.edu                                 COND_UC);
2627154Sgblack@eecs.umich.edu            } else {
2637154Sgblack@eecs.umich.edu                return new BlxReg(machInst,
2647154Sgblack@eecs.umich.edu                                  (IntRegIndex)(uint32_t)bits(machInst, 6, 3),
2657154Sgblack@eecs.umich.edu                                  COND_UC);
2667154Sgblack@eecs.umich.edu            }
2677141Sgblack@eecs.umich.edu        }
2687141Sgblack@eecs.umich.edu    }
2697141Sgblack@eecs.umich.edu    '''
2707141Sgblack@eecs.umich.edu}};
2717141Sgblack@eecs.umich.edu
2727141Sgblack@eecs.umich.edudef format Thumb16Adr() {{
2737141Sgblack@eecs.umich.edu    decode_block = '''
2747141Sgblack@eecs.umich.edu    {
2757141Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 10, 8);
2767141Sgblack@eecs.umich.edu        const uint32_t imm8 = bits(machInst, 7, 0) << 2;
2777146Sgblack@eecs.umich.edu        return new AddImm(machInst, rd, INTREG_PC, imm8, true);
2787141Sgblack@eecs.umich.edu    }
2797141Sgblack@eecs.umich.edu    '''
2807141Sgblack@eecs.umich.edu}};
2817141Sgblack@eecs.umich.edu
2827141Sgblack@eecs.umich.edudef format Thumb16AddSp() {{
2837141Sgblack@eecs.umich.edu    decode_block = '''
2847141Sgblack@eecs.umich.edu    {
2857141Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 10, 8);
2867141Sgblack@eecs.umich.edu        const uint32_t imm8 = bits(machInst, 7, 0) << 2;
2877146Sgblack@eecs.umich.edu        return new AddImm(machInst, rd, INTREG_SP, imm8, true);
2887141Sgblack@eecs.umich.edu    }
2897141Sgblack@eecs.umich.edu    '''
2907141Sgblack@eecs.umich.edu}};
2917141Sgblack@eecs.umich.edu
2927141Sgblack@eecs.umich.edudef format Thumb16Misc() {{
2937141Sgblack@eecs.umich.edu    decode_block = '''
2947141Sgblack@eecs.umich.edu    {
2957141Sgblack@eecs.umich.edu        switch (bits(machInst, 11, 8)) {
2967141Sgblack@eecs.umich.edu          case 0x0:
2977141Sgblack@eecs.umich.edu            if (bits(machInst, 7)) {
2987146Sgblack@eecs.umich.edu                return new SubImm(machInst, INTREG_SP, INTREG_SP,
2997141Sgblack@eecs.umich.edu                                   bits(machInst, 6, 0) << 2, true);
3007141Sgblack@eecs.umich.edu            } else {
3017146Sgblack@eecs.umich.edu                return new AddImm(machInst, INTREG_SP, INTREG_SP,
3027141Sgblack@eecs.umich.edu                                   bits(machInst, 6, 0) << 2, true);
3037141Sgblack@eecs.umich.edu            }
3047141Sgblack@eecs.umich.edu          case 0x1:
3057154Sgblack@eecs.umich.edu            return new Cbz(machInst,
3067154Sgblack@eecs.umich.edu                           (bits(machInst, 9) << 6) |
3077154Sgblack@eecs.umich.edu                           (bits(machInst, 7, 3) << 1),
3087154Sgblack@eecs.umich.edu                           (IntRegIndex)(uint32_t)bits(machInst, 2, 0));
3097141Sgblack@eecs.umich.edu          case 0x2:
3107141Sgblack@eecs.umich.edu            switch (bits(machInst, 7, 6)) {
3117141Sgblack@eecs.umich.edu              case 0x0:
3127141Sgblack@eecs.umich.edu                return new WarnUnimplemented("sxth", machInst);
3137141Sgblack@eecs.umich.edu              case 0x1:
3147141Sgblack@eecs.umich.edu                return new WarnUnimplemented("sxtb", machInst);
3157141Sgblack@eecs.umich.edu              case 0x2:
3167141Sgblack@eecs.umich.edu                return new WarnUnimplemented("uxth", machInst);
3177141Sgblack@eecs.umich.edu              case 0x3:
3187141Sgblack@eecs.umich.edu                return new WarnUnimplemented("uxtb", machInst);
3197141Sgblack@eecs.umich.edu            }
3207141Sgblack@eecs.umich.edu          case 0x3:
3217154Sgblack@eecs.umich.edu            return new Cbz(machInst,
3227154Sgblack@eecs.umich.edu                           (bits(machInst, 9) << 6) |
3237154Sgblack@eecs.umich.edu                           (bits(machInst, 7, 3) << 1),
3247154Sgblack@eecs.umich.edu                           (IntRegIndex)(uint32_t)bits(machInst, 2, 0));
3257141Sgblack@eecs.umich.edu          case 0x4:
3267141Sgblack@eecs.umich.edu          case 0x5:
3277141Sgblack@eecs.umich.edu            return new WarnUnimplemented("push", machInst);
3287141Sgblack@eecs.umich.edu          case 0x6:
3297141Sgblack@eecs.umich.edu            {
3307141Sgblack@eecs.umich.edu                const uint32_t opBits = bits(machInst, 7, 5);
3317141Sgblack@eecs.umich.edu                if (opBits == 2) {
3327141Sgblack@eecs.umich.edu                    return new WarnUnimplemented("setend", machInst);
3337141Sgblack@eecs.umich.edu                } else if (opBits == 3) {
3347141Sgblack@eecs.umich.edu                    return new WarnUnimplemented("cps", machInst);
3357141Sgblack@eecs.umich.edu                }
3367141Sgblack@eecs.umich.edu            }
3377141Sgblack@eecs.umich.edu          case 0x9:
3387154Sgblack@eecs.umich.edu            return new Cbnz(machInst,
3397154Sgblack@eecs.umich.edu                            (bits(machInst, 9) << 6) |
3407154Sgblack@eecs.umich.edu                            (bits(machInst, 7, 3) << 1),
3417154Sgblack@eecs.umich.edu                            (IntRegIndex)(uint32_t)bits(machInst, 2, 0));
3427141Sgblack@eecs.umich.edu          case 0xa:
3437141Sgblack@eecs.umich.edu            switch (bits(machInst, 7, 5)) {
3447141Sgblack@eecs.umich.edu              case 0x0:
3457141Sgblack@eecs.umich.edu                return new WarnUnimplemented("rev", machInst);
3467141Sgblack@eecs.umich.edu              case 0x1:
3477141Sgblack@eecs.umich.edu                return new WarnUnimplemented("rev16", machInst);
3487141Sgblack@eecs.umich.edu              case 0x3:
3497141Sgblack@eecs.umich.edu                return new WarnUnimplemented("revsh", machInst);
3507141Sgblack@eecs.umich.edu              default:
3517141Sgblack@eecs.umich.edu                break;
3527141Sgblack@eecs.umich.edu            }
3537141Sgblack@eecs.umich.edu            break;
3547141Sgblack@eecs.umich.edu          case 0xb:
3557154Sgblack@eecs.umich.edu            return new Cbnz(machInst,
3567154Sgblack@eecs.umich.edu                            (bits(machInst, 9) << 6) |
3577154Sgblack@eecs.umich.edu                            (bits(machInst, 7, 3) << 1),
3587154Sgblack@eecs.umich.edu                            (IntRegIndex)(uint32_t)bits(machInst, 2, 0));
3597141Sgblack@eecs.umich.edu          case 0xc:
3607141Sgblack@eecs.umich.edu          case 0xd:
3617141Sgblack@eecs.umich.edu            return new WarnUnimplemented("pop", machInst);
3627141Sgblack@eecs.umich.edu          case 0xe:
3637141Sgblack@eecs.umich.edu            return new WarnUnimplemented("bkpt", machInst);
3647141Sgblack@eecs.umich.edu          case 0xf:
3657141Sgblack@eecs.umich.edu            if (bits(machInst, 3, 0) != 0)
3667141Sgblack@eecs.umich.edu                return new WarnUnimplemented("it", machInst);
3677141Sgblack@eecs.umich.edu            switch (bits(machInst, 7, 4)) {
3687141Sgblack@eecs.umich.edu              case 0x0:
3697141Sgblack@eecs.umich.edu                return new WarnUnimplemented("nop", machInst);
3707141Sgblack@eecs.umich.edu              case 0x1:
3717141Sgblack@eecs.umich.edu                return new WarnUnimplemented("yield", machInst);
3727141Sgblack@eecs.umich.edu              case 0x2:
3737141Sgblack@eecs.umich.edu                return new WarnUnimplemented("wfe", machInst);
3747141Sgblack@eecs.umich.edu              case 0x3:
3757141Sgblack@eecs.umich.edu                return new WarnUnimplemented("wfi", machInst);
3767141Sgblack@eecs.umich.edu              case 0x4:
3777141Sgblack@eecs.umich.edu                return new WarnUnimplemented("sev", machInst);
3787141Sgblack@eecs.umich.edu              default:
3797141Sgblack@eecs.umich.edu                return new WarnUnimplemented("unallocated_hint", machInst);
3807141Sgblack@eecs.umich.edu            }
3817141Sgblack@eecs.umich.edu          default:
3827141Sgblack@eecs.umich.edu            break;
3837141Sgblack@eecs.umich.edu        }
3847141Sgblack@eecs.umich.edu        return new Unknown(machInst);
3857141Sgblack@eecs.umich.edu    }
3867141Sgblack@eecs.umich.edu    '''
3877141Sgblack@eecs.umich.edu}};
3887141Sgblack@eecs.umich.edu
3897141Sgblack@eecs.umich.edudef format Thumb32DataProcModImm() {{
3907141Sgblack@eecs.umich.edu
3917141Sgblack@eecs.umich.edu    def decInst(mnem, dest="rd", op1="rn"):
3927141Sgblack@eecs.umich.edu        return '''
3937141Sgblack@eecs.umich.edu            if (s) {
3947146Sgblack@eecs.umich.edu                return new %(mnem)sImmCc(machInst, %(dest)s,
3957183Sgblack@eecs.umich.edu                                          %(op1)s, imm, rotC);
3967141Sgblack@eecs.umich.edu            } else {
3977146Sgblack@eecs.umich.edu                return new %(mnem)sImm(machInst, %(dest)s,
3987183Sgblack@eecs.umich.edu                                        %(op1)s, imm, rotC);
3997141Sgblack@eecs.umich.edu            }
4007141Sgblack@eecs.umich.edu        ''' % {"mnem" : mnem, "dest" : dest, "op1" : op1}
4017141Sgblack@eecs.umich.edu
4027141Sgblack@eecs.umich.edu    decode_block = '''
4037141Sgblack@eecs.umich.edu    {
4047141Sgblack@eecs.umich.edu        const uint32_t op = bits(machInst, 24, 21);
4057141Sgblack@eecs.umich.edu        const bool s = (bits(machInst, 20) == 1);
4067141Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
4077141Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
4087141Sgblack@eecs.umich.edu        const uint32_t ctrlImm = bits(machInst.instBits, 26) << 3 |
4097141Sgblack@eecs.umich.edu                                 bits(machInst, 14, 12);
4107183Sgblack@eecs.umich.edu        const bool rotC = ctrlImm > 3;
4117141Sgblack@eecs.umich.edu        const uint32_t dataImm = bits(machInst, 7, 0);
4127141Sgblack@eecs.umich.edu        const uint32_t imm = modified_imm(ctrlImm, dataImm);
4137141Sgblack@eecs.umich.edu        switch (op) {
4147141Sgblack@eecs.umich.edu          case 0x0:
4157141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
4167141Sgblack@eecs.umich.edu                %(tst)s
4177141Sgblack@eecs.umich.edu            } else {
4187141Sgblack@eecs.umich.edu                %(and)s
4197141Sgblack@eecs.umich.edu            }
4207141Sgblack@eecs.umich.edu          case 0x1:
4217141Sgblack@eecs.umich.edu            %(bic)s
4227141Sgblack@eecs.umich.edu          case 0x2:
4237141Sgblack@eecs.umich.edu            if (rn == INTREG_PC) {
4247141Sgblack@eecs.umich.edu                %(mov)s
4257141Sgblack@eecs.umich.edu            } else {
4267141Sgblack@eecs.umich.edu                %(orr)s
4277141Sgblack@eecs.umich.edu            }
4287141Sgblack@eecs.umich.edu          case 0x3:
4297141Sgblack@eecs.umich.edu            if (rn == INTREG_PC) {
4307141Sgblack@eecs.umich.edu                %(mvn)s
4317141Sgblack@eecs.umich.edu            } else {
4327141Sgblack@eecs.umich.edu                %(orn)s
4337141Sgblack@eecs.umich.edu            }
4347141Sgblack@eecs.umich.edu          case 0x4:
4357141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
4367141Sgblack@eecs.umich.edu                %(teq)s
4377141Sgblack@eecs.umich.edu            } else {
4387141Sgblack@eecs.umich.edu                %(eor)s
4397141Sgblack@eecs.umich.edu            }
4407141Sgblack@eecs.umich.edu          case 0x8:
4417141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
4427141Sgblack@eecs.umich.edu                %(cmn)s
4437141Sgblack@eecs.umich.edu            } else {
4447141Sgblack@eecs.umich.edu                %(add)s
4457141Sgblack@eecs.umich.edu            }
4467141Sgblack@eecs.umich.edu          case 0xa:
4477141Sgblack@eecs.umich.edu            %(adc)s
4487141Sgblack@eecs.umich.edu          case 0xb:
4497141Sgblack@eecs.umich.edu            %(sbc)s
4507141Sgblack@eecs.umich.edu          case 0xd:
4517141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
4527141Sgblack@eecs.umich.edu                %(cmp)s
4537141Sgblack@eecs.umich.edu            } else {
4547141Sgblack@eecs.umich.edu                %(sub)s
4557141Sgblack@eecs.umich.edu            }
4567141Sgblack@eecs.umich.edu          case 0xe:
4577141Sgblack@eecs.umich.edu            %(rsb)s
4587141Sgblack@eecs.umich.edu          default:
4597141Sgblack@eecs.umich.edu            return new Unknown(machInst);
4607141Sgblack@eecs.umich.edu        }
4617141Sgblack@eecs.umich.edu    }
4627141Sgblack@eecs.umich.edu    ''' % {
4637141Sgblack@eecs.umich.edu        "tst" : decInst("Tst", "INTREG_ZERO"),
4647141Sgblack@eecs.umich.edu        "and" : decInst("And"),
4657141Sgblack@eecs.umich.edu        "bic" : decInst("Bic"),
4667141Sgblack@eecs.umich.edu        "mov" : decInst("Mov", op1="INTREG_ZERO"),
4677141Sgblack@eecs.umich.edu        "orr" : decInst("Orr"),
4687141Sgblack@eecs.umich.edu        "mvn" : decInst("Mvn", op1="INTREG_ZERO"),
4697141Sgblack@eecs.umich.edu        "orn" : decInst("Orn"),
4707141Sgblack@eecs.umich.edu        "teq" : decInst("Teq", dest="INTREG_ZERO"),
4717141Sgblack@eecs.umich.edu        "eor" : decInst("Eor"),
4727141Sgblack@eecs.umich.edu        "cmn" : decInst("Cmn", dest="INTREG_ZERO"),
4737141Sgblack@eecs.umich.edu        "add" : decInst("Add"),
4747141Sgblack@eecs.umich.edu        "adc" : decInst("Adc"),
4757141Sgblack@eecs.umich.edu        "sbc" : decInst("Sbc"),
4767141Sgblack@eecs.umich.edu        "cmp" : decInst("Cmp", dest="INTREG_ZERO"),
4777141Sgblack@eecs.umich.edu        "sub" : decInst("Sub"),
4787141Sgblack@eecs.umich.edu        "rsb" : decInst("Rsb")
4797141Sgblack@eecs.umich.edu    }
4807141Sgblack@eecs.umich.edu}};
4817141Sgblack@eecs.umich.edu
4827157Sgblack@eecs.umich.edudef format Thumb32DataProcPlainBin() {{
4837157Sgblack@eecs.umich.edu    decode_block = '''
4847157Sgblack@eecs.umich.edu    {
4857157Sgblack@eecs.umich.edu        const uint32_t op = bits(machInst, 24, 20);
4867157Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
4877157Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
4887157Sgblack@eecs.umich.edu        switch (op) {
4897157Sgblack@eecs.umich.edu          case 0x0:
4907157Sgblack@eecs.umich.edu            {
4917157Sgblack@eecs.umich.edu                const uint32_t imm = bits(machInst, 7, 0) |
4927157Sgblack@eecs.umich.edu                                     (bits(machInst, 14, 12) << 8) |
4937157Sgblack@eecs.umich.edu                                     (bits(machInst, 26) << 11);
4947157Sgblack@eecs.umich.edu                return new AddImm(machInst, rd, rn, imm, true);
4957157Sgblack@eecs.umich.edu            }
4967157Sgblack@eecs.umich.edu          case 0x4:
4977157Sgblack@eecs.umich.edu            {
4987157Sgblack@eecs.umich.edu                const uint32_t imm = bits(machInst, 7, 0) |
4997157Sgblack@eecs.umich.edu                                     (bits(machInst, 14, 12) << 8) |
5007157Sgblack@eecs.umich.edu                                     (bits(machInst, 26) << 11) |
5017157Sgblack@eecs.umich.edu                                     (bits(machInst, 19, 16) << 12);
5027157Sgblack@eecs.umich.edu                return new MovImm(machInst, rd, INTREG_ZERO, imm, true);
5037157Sgblack@eecs.umich.edu            }
5047157Sgblack@eecs.umich.edu          case 0xa:
5057157Sgblack@eecs.umich.edu            {
5067157Sgblack@eecs.umich.edu                const uint32_t imm = bits(machInst, 7, 0) |
5077157Sgblack@eecs.umich.edu                                     (bits(machInst, 14, 12) << 8) |
5087157Sgblack@eecs.umich.edu                                     (bits(machInst, 26) << 11);
5097157Sgblack@eecs.umich.edu                return new SubImm(machInst, rd, rn, imm, true);
5107157Sgblack@eecs.umich.edu            }
5117157Sgblack@eecs.umich.edu          case 0xc:
5127157Sgblack@eecs.umich.edu            {
5137157Sgblack@eecs.umich.edu                const uint32_t imm = bits(machInst, 7, 0) |
5147157Sgblack@eecs.umich.edu                                     (bits(machInst, 14, 12) << 8) |
5157157Sgblack@eecs.umich.edu                                     (bits(machInst, 26) << 11) |
5167157Sgblack@eecs.umich.edu                                     (bits(machInst, 19, 16) << 12);
5177157Sgblack@eecs.umich.edu                return new MovtImm(machInst, rd, rd, imm, true);
5187157Sgblack@eecs.umich.edu            }
5197157Sgblack@eecs.umich.edu          case 0x12:
5207157Sgblack@eecs.umich.edu            if (!(bits(machInst, 14, 12) || bits(machInst, 7, 6))) {
5217157Sgblack@eecs.umich.edu                return new WarnUnimplemented("ssat16", machInst);
5227157Sgblack@eecs.umich.edu            }
5237157Sgblack@eecs.umich.edu            // Fall through on purpose...
5247157Sgblack@eecs.umich.edu          case 0x10:
5257157Sgblack@eecs.umich.edu            return new WarnUnimplemented("ssat", machInst);
5267157Sgblack@eecs.umich.edu          case 0x14:
5277157Sgblack@eecs.umich.edu            return new WarnUnimplemented("sbfx", machInst);
5287157Sgblack@eecs.umich.edu          case 0x16:
5297157Sgblack@eecs.umich.edu            if (rn == 0xf) {
5307157Sgblack@eecs.umich.edu                return new WarnUnimplemented("bfc", machInst);
5317157Sgblack@eecs.umich.edu            } else {
5327157Sgblack@eecs.umich.edu                return new WarnUnimplemented("bfi", machInst);
5337157Sgblack@eecs.umich.edu            }
5347157Sgblack@eecs.umich.edu          case 0x1a:
5357157Sgblack@eecs.umich.edu            if (!(bits(machInst, 14, 12) || bits(machInst, 7, 6))) {
5367157Sgblack@eecs.umich.edu                return new WarnUnimplemented("usat16", machInst);
5377157Sgblack@eecs.umich.edu            }
5387157Sgblack@eecs.umich.edu            // Fall through on purpose...
5397157Sgblack@eecs.umich.edu          case 0x18:
5407157Sgblack@eecs.umich.edu            return new WarnUnimplemented("usat", machInst);
5417157Sgblack@eecs.umich.edu          case 0x1c:
5427157Sgblack@eecs.umich.edu            return new WarnUnimplemented("ubfx", machInst);
5437157Sgblack@eecs.umich.edu          default:
5447157Sgblack@eecs.umich.edu            return new Unknown(machInst);
5457157Sgblack@eecs.umich.edu        }
5467157Sgblack@eecs.umich.edu    }
5477157Sgblack@eecs.umich.edu    '''
5487157Sgblack@eecs.umich.edu}};
5497157Sgblack@eecs.umich.edu
5507141Sgblack@eecs.umich.edudef format Thumb32DataProcShiftReg() {{
5517141Sgblack@eecs.umich.edu
5527141Sgblack@eecs.umich.edu    def decInst(mnem, dest="rd", op1="rn"):
5537141Sgblack@eecs.umich.edu        return '''
5547141Sgblack@eecs.umich.edu            if (s) {
5557146Sgblack@eecs.umich.edu                return new %(mnem)sRegCc(machInst, %(dest)s,
5567141Sgblack@eecs.umich.edu                                          %(op1)s, rm, amt, type);
5577141Sgblack@eecs.umich.edu            } else {
5587146Sgblack@eecs.umich.edu                return new %(mnem)sReg(machInst, %(dest)s,
5597141Sgblack@eecs.umich.edu                                        %(op1)s, rm, amt, type);
5607141Sgblack@eecs.umich.edu            }
5617141Sgblack@eecs.umich.edu        ''' % {"mnem" : mnem, "dest" : dest, "op1" : op1}
5627141Sgblack@eecs.umich.edu
5637141Sgblack@eecs.umich.edu    decode_block = '''
5647141Sgblack@eecs.umich.edu    {
5657141Sgblack@eecs.umich.edu        const uint32_t op = bits(machInst, 24, 21);
5667141Sgblack@eecs.umich.edu        const bool s = (bits(machInst, 20) == 1);
5677141Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
5687141Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
5697141Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 3, 0);
5707141Sgblack@eecs.umich.edu        const uint32_t amt = (bits(machInst, 14, 12) << 2) |
5717141Sgblack@eecs.umich.edu                              bits(machInst, 7, 6);
5727141Sgblack@eecs.umich.edu        const ArmShiftType type = (ArmShiftType)(uint32_t)bits(machInst, 5, 4);
5737141Sgblack@eecs.umich.edu        switch (op) {
5747141Sgblack@eecs.umich.edu          case 0x0:
5757141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
5767141Sgblack@eecs.umich.edu                %(tst)s
5777141Sgblack@eecs.umich.edu            } else {
5787141Sgblack@eecs.umich.edu                %(and)s
5797141Sgblack@eecs.umich.edu            }
5807141Sgblack@eecs.umich.edu          case 0x1:
5817141Sgblack@eecs.umich.edu            %(bic)s
5827141Sgblack@eecs.umich.edu          case 0x2:
5837141Sgblack@eecs.umich.edu            if (rn == INTREG_PC) {
5847141Sgblack@eecs.umich.edu                %(mov)s
5857141Sgblack@eecs.umich.edu            } else {
5867141Sgblack@eecs.umich.edu                %(orr)s
5877141Sgblack@eecs.umich.edu            }
5887141Sgblack@eecs.umich.edu          case 0x3:
5897141Sgblack@eecs.umich.edu            if (rn == INTREG_PC) {
5907141Sgblack@eecs.umich.edu                %(mvn)s
5917141Sgblack@eecs.umich.edu            } else {
5927141Sgblack@eecs.umich.edu                %(orn)s
5937141Sgblack@eecs.umich.edu            }
5947141Sgblack@eecs.umich.edu          case 0x4:
5957141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
5967141Sgblack@eecs.umich.edu                %(teq)s
5977141Sgblack@eecs.umich.edu            } else {
5987141Sgblack@eecs.umich.edu                %(eor)s
5997141Sgblack@eecs.umich.edu            }
6007141Sgblack@eecs.umich.edu          case 0x6:
6017141Sgblack@eecs.umich.edu            return new WarnUnimplemented("pkh", machInst);
6027141Sgblack@eecs.umich.edu          case 0x8:
6037141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
6047141Sgblack@eecs.umich.edu                %(cmn)s
6057141Sgblack@eecs.umich.edu            } else {
6067141Sgblack@eecs.umich.edu                %(add)s
6077141Sgblack@eecs.umich.edu            }
6087141Sgblack@eecs.umich.edu          case 0xa:
6097141Sgblack@eecs.umich.edu            %(adc)s
6107141Sgblack@eecs.umich.edu          case 0xb:
6117141Sgblack@eecs.umich.edu            %(sbc)s
6127141Sgblack@eecs.umich.edu          case 0xd:
6137141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
6147141Sgblack@eecs.umich.edu                %(cmp)s
6157141Sgblack@eecs.umich.edu            } else {
6167141Sgblack@eecs.umich.edu                %(sub)s
6177141Sgblack@eecs.umich.edu            }
6187141Sgblack@eecs.umich.edu          case 0xe:
6197141Sgblack@eecs.umich.edu            %(rsb)s
6207141Sgblack@eecs.umich.edu          default:
6217141Sgblack@eecs.umich.edu            return new Unknown(machInst);
6227141Sgblack@eecs.umich.edu        }
6237141Sgblack@eecs.umich.edu    }
6247141Sgblack@eecs.umich.edu    ''' % {
6257141Sgblack@eecs.umich.edu        "tst" : decInst("Tst", "INTREG_ZERO"),
6267141Sgblack@eecs.umich.edu        "and" : decInst("And"),
6277141Sgblack@eecs.umich.edu        "bic" : decInst("Bic"),
6287141Sgblack@eecs.umich.edu        "mov" : decInst("Mov", op1="INTREG_ZERO"),
6297141Sgblack@eecs.umich.edu        "orr" : decInst("Orr"),
6307141Sgblack@eecs.umich.edu        "mvn" : decInst("Mvn", op1="INTREG_ZERO"),
6317141Sgblack@eecs.umich.edu        "orn" : decInst("Orn"),
6327141Sgblack@eecs.umich.edu        "teq" : decInst("Teq", "INTREG_ZERO"),
6337141Sgblack@eecs.umich.edu        "eor" : decInst("Eor"),
6347141Sgblack@eecs.umich.edu        "cmn" : decInst("Cmn", "INTREG_ZERO"),
6357141Sgblack@eecs.umich.edu        "add" : decInst("Add"),
6367141Sgblack@eecs.umich.edu        "adc" : decInst("Adc"),
6377141Sgblack@eecs.umich.edu        "sbc" : decInst("Sbc"),
6387141Sgblack@eecs.umich.edu        "cmp" : decInst("Cmp", "INTREG_ZERO"),
6397141Sgblack@eecs.umich.edu        "sub" : decInst("Sub"),
6407141Sgblack@eecs.umich.edu        "rsb" : decInst("Rsb")
6417141Sgblack@eecs.umich.edu    }
6427141Sgblack@eecs.umich.edu}};
643