data.isa revision 7185
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            if (setCc) {
1077146Sgblack@eecs.umich.edu                return new %(className)sImmCc(machInst, %(dest)s, %(op1)s,
1087141Sgblack@eecs.umich.edu                                               imm, rotC);
1097139Sgblack@eecs.umich.edu            } else {
1107146Sgblack@eecs.umich.edu                return new %(className)sImm(machInst, %(dest)s, %(op1)s,
1117141Sgblack@eecs.umich.edu                                             imm, rotC);
1127139Sgblack@eecs.umich.edu            }
1137139Sgblack@eecs.umich.edu            break;
1147139Sgblack@eecs.umich.edu    '''
1157139Sgblack@eecs.umich.edu
1167141Sgblack@eecs.umich.edu    def instCode(opcode, mnem, dest="rd", op1="rn"):
1177139Sgblack@eecs.umich.edu        global instDecode
1187185Sgblack@eecs.umich.edu        code = '''
1197185Sgblack@eecs.umich.edu          case %(opcode)#x:
1207185Sgblack@eecs.umich.edu        ''' + instDecode
1217185Sgblack@eecs.umich.edu        return code % { "className": mnem.capitalize(),
1227185Sgblack@eecs.umich.edu                        "opcode": opcode,
1237185Sgblack@eecs.umich.edu                        "dest": dest,
1247185Sgblack@eecs.umich.edu                        "op1": op1 }
1257185Sgblack@eecs.umich.edu
1267185Sgblack@eecs.umich.edu    def adrCode(opcode, mnem, dest="rd", op1="rn", add="1"):
1277185Sgblack@eecs.umich.edu        global instDecode
1287185Sgblack@eecs.umich.edu        code = '''
1297185Sgblack@eecs.umich.edu          case %(opcode)#x:
1307185Sgblack@eecs.umich.edu            if (rn == 0xf) {
1317185Sgblack@eecs.umich.edu                return new AdrImm(machInst, %(dest)s, %(add)s,
1327185Sgblack@eecs.umich.edu                                             imm, false);
1337185Sgblack@eecs.umich.edu            } else {
1347185Sgblack@eecs.umich.edu        ''' + instDecode + '''
1357185Sgblack@eecs.umich.edu            }
1367185Sgblack@eecs.umich.edu        '''
1377185Sgblack@eecs.umich.edu        return code % { "className": mnem.capitalize(),
1387185Sgblack@eecs.umich.edu                        "opcode": opcode,
1397185Sgblack@eecs.umich.edu                        "dest": dest,
1407185Sgblack@eecs.umich.edu                        "add": add,
1417185Sgblack@eecs.umich.edu                        "op1": op1 }
1427139Sgblack@eecs.umich.edu
1437139Sgblack@eecs.umich.edu    decode_block = '''
1447139Sgblack@eecs.umich.edu    {
1457139Sgblack@eecs.umich.edu        const bool setCc = (bits(machInst, 20) == 1);
1467139Sgblack@eecs.umich.edu        const uint32_t unrotated = bits(machInst, 7, 0);
1477139Sgblack@eecs.umich.edu        const uint32_t rotation = (bits(machInst, 11, 8) << 1);
1487139Sgblack@eecs.umich.edu        const bool rotC = (rotation != 0);
1497139Sgblack@eecs.umich.edu        const uint32_t imm = rotate_imm(unrotated, rotation);
1507139Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)RD;
1517139Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)RN;
1527139Sgblack@eecs.umich.edu        switch (OPCODE) {
1537139Sgblack@eecs.umich.edu    '''
1547139Sgblack@eecs.umich.edu    decode_block += instCode(0x0, "and")
1557139Sgblack@eecs.umich.edu    decode_block += instCode(0x1, "eor")
1567185Sgblack@eecs.umich.edu    decode_block += adrCode(0x2, "sub", add="(IntRegIndex)0")
1577139Sgblack@eecs.umich.edu    decode_block += instCode(0x3, "rsb")
1587185Sgblack@eecs.umich.edu    decode_block += adrCode(0x4, "add", add="(IntRegIndex)1")
1597139Sgblack@eecs.umich.edu    decode_block += instCode(0x5, "adc")
1607139Sgblack@eecs.umich.edu    decode_block += instCode(0x6, "sbc")
1617139Sgblack@eecs.umich.edu    decode_block += instCode(0x7, "rsc")
1627141Sgblack@eecs.umich.edu    decode_block += instCode(0x8, "tst", dest="INTREG_ZERO")
1637141Sgblack@eecs.umich.edu    decode_block += instCode(0x9, "teq", dest="INTREG_ZERO")
1647141Sgblack@eecs.umich.edu    decode_block += instCode(0xa, "cmp", dest="INTREG_ZERO")
1657141Sgblack@eecs.umich.edu    decode_block += instCode(0xb, "cmn", dest="INTREG_ZERO")
1667139Sgblack@eecs.umich.edu    decode_block += instCode(0xc, "orr")
1677141Sgblack@eecs.umich.edu    decode_block += instCode(0xd, "mov", op1="INTREG_ZERO")
1687139Sgblack@eecs.umich.edu    decode_block += instCode(0xe, "bic")
1697141Sgblack@eecs.umich.edu    decode_block += instCode(0xf, "mvn", op1="INTREG_ZERO")
1707139Sgblack@eecs.umich.edu    decode_block += '''
1717139Sgblack@eecs.umich.edu          default:
1727139Sgblack@eecs.umich.edu            return new Unknown(machInst);
1737139Sgblack@eecs.umich.edu        }
1747139Sgblack@eecs.umich.edu    }
1757139Sgblack@eecs.umich.edu    '''
1767139Sgblack@eecs.umich.edu}};
1777141Sgblack@eecs.umich.edu
1787141Sgblack@eecs.umich.edudef format Thumb16ShiftAddSubMoveCmp() {{
1797141Sgblack@eecs.umich.edu    decode_block = '''
1807141Sgblack@eecs.umich.edu    {
1817141Sgblack@eecs.umich.edu        const uint32_t imm5 = bits(machInst, 10, 6);
1827141Sgblack@eecs.umich.edu        const uint32_t imm3 = bits(machInst, 8, 6);
1837141Sgblack@eecs.umich.edu        const uint32_t imm8 = bits(machInst, 7, 0);
1847141Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 2, 0);
1857141Sgblack@eecs.umich.edu        const IntRegIndex rd8 = (IntRegIndex)(uint32_t)bits(machInst, 10, 8);
1867141Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 5, 3);
1877141Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 8, 6);
1887141Sgblack@eecs.umich.edu        switch (bits(machInst, 13, 11)) {
1897141Sgblack@eecs.umich.edu          case 0x0: // lsl
1907183Sgblack@eecs.umich.edu            return new MovRegCc(machInst, rd, INTREG_ZERO, rn, imm5, LSL);
1917141Sgblack@eecs.umich.edu          case 0x1: // lsr
1927183Sgblack@eecs.umich.edu            return new MovRegCc(machInst, rd, INTREG_ZERO, rn, imm5, LSR);
1937141Sgblack@eecs.umich.edu          case 0x2: // asr
1947183Sgblack@eecs.umich.edu            return new MovRegCc(machInst, rd, INTREG_ZERO, rn, imm5, ASR);
1957141Sgblack@eecs.umich.edu          case 0x3:
1967141Sgblack@eecs.umich.edu            switch (bits(machInst, 10, 9)) {
1977141Sgblack@eecs.umich.edu              case 0x0:
1987183Sgblack@eecs.umich.edu                return new AddRegCc(machInst, rd, rn, rm, 0, LSL);
1997141Sgblack@eecs.umich.edu              case 0x1:
2007183Sgblack@eecs.umich.edu                return new SubRegCc(machInst, rd, rn, rm, 0, LSL);
2017141Sgblack@eecs.umich.edu              case 0x2:
2027183Sgblack@eecs.umich.edu                return new AddImmCc(machInst, rd, rn, imm3, true);
2037141Sgblack@eecs.umich.edu              case 0x3:
2047183Sgblack@eecs.umich.edu                return new SubImmCc(machInst, rd, rn, imm3, true);
2057141Sgblack@eecs.umich.edu            }
2067141Sgblack@eecs.umich.edu          case 0x4:
2077183Sgblack@eecs.umich.edu            return new MovImmCc(machInst, rd8, INTREG_ZERO, imm8, false);
2087141Sgblack@eecs.umich.edu          case 0x5:
2097146Sgblack@eecs.umich.edu            return new CmpImmCc(machInst, INTREG_ZERO, rd8, imm8, true);
2107141Sgblack@eecs.umich.edu          case 0x6:
2117183Sgblack@eecs.umich.edu            return new AddImmCc(machInst, rd8, rd8, imm8, true);
2127141Sgblack@eecs.umich.edu          case 0x7:
2137183Sgblack@eecs.umich.edu            return new SubImmCc(machInst, rd8, rd8, imm8, true);
2147141Sgblack@eecs.umich.edu        }
2157141Sgblack@eecs.umich.edu    }
2167141Sgblack@eecs.umich.edu    '''
2177141Sgblack@eecs.umich.edu}};
2187141Sgblack@eecs.umich.edu
2197141Sgblack@eecs.umich.edudef format Thumb16DataProcessing() {{
2207141Sgblack@eecs.umich.edu    decode_block = '''
2217141Sgblack@eecs.umich.edu    {
2227141Sgblack@eecs.umich.edu        const IntRegIndex rdn = (IntRegIndex)(uint32_t)bits(machInst, 2, 0);
2237141Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 5, 3);
2247141Sgblack@eecs.umich.edu        switch (bits(machInst, 9, 6)) {
2257141Sgblack@eecs.umich.edu          case 0x0:
2267183Sgblack@eecs.umich.edu            return new AndRegCc(machInst, rdn, rdn, rm, 0, LSL);
2277141Sgblack@eecs.umich.edu          case 0x1:
2287183Sgblack@eecs.umich.edu            return new EorRegCc(machInst, rdn, rdn, rm, 0, LSL);
2297141Sgblack@eecs.umich.edu          case 0x2: //lsl
2307183Sgblack@eecs.umich.edu            return new MovRegRegCc(machInst, rdn, INTREG_ZERO, rdn, rm, LSL);
2317141Sgblack@eecs.umich.edu          case 0x3: //lsr
2327183Sgblack@eecs.umich.edu            return new MovRegRegCc(machInst, rdn, INTREG_ZERO, rdn, rm, LSR);
2337141Sgblack@eecs.umich.edu          case 0x4: //asr
2347183Sgblack@eecs.umich.edu            return new MovRegRegCc(machInst, rdn, INTREG_ZERO, rdn, rm, ASR);
2357141Sgblack@eecs.umich.edu          case 0x5:
2367183Sgblack@eecs.umich.edu            return new AdcRegCc(machInst, rdn, rdn, rm, 0, LSL);
2377141Sgblack@eecs.umich.edu          case 0x6:
2387183Sgblack@eecs.umich.edu            return new SbcRegCc(machInst, rdn, rdn, rm, 0, LSL);
2397141Sgblack@eecs.umich.edu          case 0x7: // ror
2407183Sgblack@eecs.umich.edu            return new MovRegRegCc(machInst, rdn, INTREG_ZERO, rdn, rm, ROR);
2417141Sgblack@eecs.umich.edu          case 0x8:
2427183Sgblack@eecs.umich.edu            return new TstRegCc(machInst, INTREG_ZERO, rdn, rm, 0, LSL);
2437141Sgblack@eecs.umich.edu          case 0x9:
2447183Sgblack@eecs.umich.edu            return new RsbImmCc(machInst, rdn, rm, 0, true);
2457141Sgblack@eecs.umich.edu          case 0xa:
2467183Sgblack@eecs.umich.edu            return new CmpRegCc(machInst, INTREG_ZERO, rdn, rm, 0, LSL);
2477141Sgblack@eecs.umich.edu          case 0xb:
2487183Sgblack@eecs.umich.edu            return new CmnRegCc(machInst, INTREG_ZERO, rdn, rm, 0, LSL);
2497141Sgblack@eecs.umich.edu          case 0xc:
2507183Sgblack@eecs.umich.edu            return new OrrRegCc(machInst, rdn, rdn, rm, 0, LSL);
2517141Sgblack@eecs.umich.edu          case 0xd:
2527183Sgblack@eecs.umich.edu            return new MulCc(machInst, rdn, rm, rdn);
2537141Sgblack@eecs.umich.edu          case 0xe:
2547183Sgblack@eecs.umich.edu            return new BicRegCc(machInst, rdn, rdn, rm, 0, LSL);
2557141Sgblack@eecs.umich.edu          case 0xf:
2567183Sgblack@eecs.umich.edu            return new MvnRegCc(machInst, rdn, INTREG_ZERO, rm, 0, LSL);
2577141Sgblack@eecs.umich.edu        }
2587141Sgblack@eecs.umich.edu    }
2597141Sgblack@eecs.umich.edu    '''
2607141Sgblack@eecs.umich.edu}};
2617141Sgblack@eecs.umich.edu
2627141Sgblack@eecs.umich.edudef format Thumb16SpecDataAndBx() {{
2637141Sgblack@eecs.umich.edu    decode_block = '''
2647141Sgblack@eecs.umich.edu    {
2657141Sgblack@eecs.umich.edu        const IntRegIndex rdn =
2667141Sgblack@eecs.umich.edu            (IntRegIndex)(uint32_t)(bits(machInst, 2, 0) |
2677141Sgblack@eecs.umich.edu                                    (bits(machInst, 7) << 3));
2687141Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 6, 3);
2697141Sgblack@eecs.umich.edu        switch (bits(machInst, 9, 8)) {
2707141Sgblack@eecs.umich.edu          case 0x0:
2717146Sgblack@eecs.umich.edu            return new AddReg(machInst, rdn, rdn, rm, 0, LSL);
2727141Sgblack@eecs.umich.edu          case 0x1:
2737183Sgblack@eecs.umich.edu            return new CmpRegCc(machInst, INTREG_ZERO, rdn, rm, 0, LSL);
2747141Sgblack@eecs.umich.edu          case 0x2:
2757146Sgblack@eecs.umich.edu            return new MovReg(machInst, rdn, INTREG_ZERO, rm, 0, LSL);
2767141Sgblack@eecs.umich.edu          case 0x3:
2777154Sgblack@eecs.umich.edu            if (bits(machInst, 7) == 0) {
2787154Sgblack@eecs.umich.edu                return new BxReg(machInst,
2797154Sgblack@eecs.umich.edu                                 (IntRegIndex)(uint32_t)bits(machInst, 6, 3),
2807154Sgblack@eecs.umich.edu                                 COND_UC);
2817154Sgblack@eecs.umich.edu            } else {
2827154Sgblack@eecs.umich.edu                return new BlxReg(machInst,
2837154Sgblack@eecs.umich.edu                                  (IntRegIndex)(uint32_t)bits(machInst, 6, 3),
2847154Sgblack@eecs.umich.edu                                  COND_UC);
2857154Sgblack@eecs.umich.edu            }
2867141Sgblack@eecs.umich.edu        }
2877141Sgblack@eecs.umich.edu    }
2887141Sgblack@eecs.umich.edu    '''
2897141Sgblack@eecs.umich.edu}};
2907141Sgblack@eecs.umich.edu
2917141Sgblack@eecs.umich.edudef format Thumb16Adr() {{
2927141Sgblack@eecs.umich.edu    decode_block = '''
2937141Sgblack@eecs.umich.edu    {
2947141Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 10, 8);
2957141Sgblack@eecs.umich.edu        const uint32_t imm8 = bits(machInst, 7, 0) << 2;
2967185Sgblack@eecs.umich.edu        return new AdrImm(machInst, rd, (IntRegIndex)1, imm8, false);
2977141Sgblack@eecs.umich.edu    }
2987141Sgblack@eecs.umich.edu    '''
2997141Sgblack@eecs.umich.edu}};
3007141Sgblack@eecs.umich.edu
3017141Sgblack@eecs.umich.edudef format Thumb16AddSp() {{
3027141Sgblack@eecs.umich.edu    decode_block = '''
3037141Sgblack@eecs.umich.edu    {
3047141Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 10, 8);
3057141Sgblack@eecs.umich.edu        const uint32_t imm8 = bits(machInst, 7, 0) << 2;
3067146Sgblack@eecs.umich.edu        return new AddImm(machInst, rd, INTREG_SP, imm8, true);
3077141Sgblack@eecs.umich.edu    }
3087141Sgblack@eecs.umich.edu    '''
3097141Sgblack@eecs.umich.edu}};
3107141Sgblack@eecs.umich.edu
3117141Sgblack@eecs.umich.edudef format Thumb16Misc() {{
3127141Sgblack@eecs.umich.edu    decode_block = '''
3137141Sgblack@eecs.umich.edu    {
3147141Sgblack@eecs.umich.edu        switch (bits(machInst, 11, 8)) {
3157141Sgblack@eecs.umich.edu          case 0x0:
3167141Sgblack@eecs.umich.edu            if (bits(machInst, 7)) {
3177146Sgblack@eecs.umich.edu                return new SubImm(machInst, INTREG_SP, INTREG_SP,
3187141Sgblack@eecs.umich.edu                                   bits(machInst, 6, 0) << 2, true);
3197141Sgblack@eecs.umich.edu            } else {
3207146Sgblack@eecs.umich.edu                return new AddImm(machInst, INTREG_SP, INTREG_SP,
3217141Sgblack@eecs.umich.edu                                   bits(machInst, 6, 0) << 2, true);
3227141Sgblack@eecs.umich.edu            }
3237141Sgblack@eecs.umich.edu          case 0x1:
3247154Sgblack@eecs.umich.edu            return new Cbz(machInst,
3257154Sgblack@eecs.umich.edu                           (bits(machInst, 9) << 6) |
3267154Sgblack@eecs.umich.edu                           (bits(machInst, 7, 3) << 1),
3277154Sgblack@eecs.umich.edu                           (IntRegIndex)(uint32_t)bits(machInst, 2, 0));
3287141Sgblack@eecs.umich.edu          case 0x2:
3297141Sgblack@eecs.umich.edu            switch (bits(machInst, 7, 6)) {
3307141Sgblack@eecs.umich.edu              case 0x0:
3317141Sgblack@eecs.umich.edu                return new WarnUnimplemented("sxth", machInst);
3327141Sgblack@eecs.umich.edu              case 0x1:
3337141Sgblack@eecs.umich.edu                return new WarnUnimplemented("sxtb", machInst);
3347141Sgblack@eecs.umich.edu              case 0x2:
3357141Sgblack@eecs.umich.edu                return new WarnUnimplemented("uxth", machInst);
3367141Sgblack@eecs.umich.edu              case 0x3:
3377141Sgblack@eecs.umich.edu                return new WarnUnimplemented("uxtb", machInst);
3387141Sgblack@eecs.umich.edu            }
3397141Sgblack@eecs.umich.edu          case 0x3:
3407154Sgblack@eecs.umich.edu            return new Cbz(machInst,
3417154Sgblack@eecs.umich.edu                           (bits(machInst, 9) << 6) |
3427154Sgblack@eecs.umich.edu                           (bits(machInst, 7, 3) << 1),
3437154Sgblack@eecs.umich.edu                           (IntRegIndex)(uint32_t)bits(machInst, 2, 0));
3447141Sgblack@eecs.umich.edu          case 0x4:
3457141Sgblack@eecs.umich.edu          case 0x5:
3467141Sgblack@eecs.umich.edu            return new WarnUnimplemented("push", machInst);
3477141Sgblack@eecs.umich.edu          case 0x6:
3487141Sgblack@eecs.umich.edu            {
3497141Sgblack@eecs.umich.edu                const uint32_t opBits = bits(machInst, 7, 5);
3507141Sgblack@eecs.umich.edu                if (opBits == 2) {
3517141Sgblack@eecs.umich.edu                    return new WarnUnimplemented("setend", machInst);
3527141Sgblack@eecs.umich.edu                } else if (opBits == 3) {
3537141Sgblack@eecs.umich.edu                    return new WarnUnimplemented("cps", machInst);
3547141Sgblack@eecs.umich.edu                }
3557141Sgblack@eecs.umich.edu            }
3567141Sgblack@eecs.umich.edu          case 0x9:
3577154Sgblack@eecs.umich.edu            return new Cbnz(machInst,
3587154Sgblack@eecs.umich.edu                            (bits(machInst, 9) << 6) |
3597154Sgblack@eecs.umich.edu                            (bits(machInst, 7, 3) << 1),
3607154Sgblack@eecs.umich.edu                            (IntRegIndex)(uint32_t)bits(machInst, 2, 0));
3617141Sgblack@eecs.umich.edu          case 0xa:
3627141Sgblack@eecs.umich.edu            switch (bits(machInst, 7, 5)) {
3637141Sgblack@eecs.umich.edu              case 0x0:
3647141Sgblack@eecs.umich.edu                return new WarnUnimplemented("rev", machInst);
3657141Sgblack@eecs.umich.edu              case 0x1:
3667141Sgblack@eecs.umich.edu                return new WarnUnimplemented("rev16", machInst);
3677141Sgblack@eecs.umich.edu              case 0x3:
3687141Sgblack@eecs.umich.edu                return new WarnUnimplemented("revsh", machInst);
3697141Sgblack@eecs.umich.edu              default:
3707141Sgblack@eecs.umich.edu                break;
3717141Sgblack@eecs.umich.edu            }
3727141Sgblack@eecs.umich.edu            break;
3737141Sgblack@eecs.umich.edu          case 0xb:
3747154Sgblack@eecs.umich.edu            return new Cbnz(machInst,
3757154Sgblack@eecs.umich.edu                            (bits(machInst, 9) << 6) |
3767154Sgblack@eecs.umich.edu                            (bits(machInst, 7, 3) << 1),
3777154Sgblack@eecs.umich.edu                            (IntRegIndex)(uint32_t)bits(machInst, 2, 0));
3787141Sgblack@eecs.umich.edu          case 0xc:
3797141Sgblack@eecs.umich.edu          case 0xd:
3807141Sgblack@eecs.umich.edu            return new WarnUnimplemented("pop", machInst);
3817141Sgblack@eecs.umich.edu          case 0xe:
3827141Sgblack@eecs.umich.edu            return new WarnUnimplemented("bkpt", machInst);
3837141Sgblack@eecs.umich.edu          case 0xf:
3847141Sgblack@eecs.umich.edu            if (bits(machInst, 3, 0) != 0)
3857141Sgblack@eecs.umich.edu                return new WarnUnimplemented("it", machInst);
3867141Sgblack@eecs.umich.edu            switch (bits(machInst, 7, 4)) {
3877141Sgblack@eecs.umich.edu              case 0x0:
3887141Sgblack@eecs.umich.edu                return new WarnUnimplemented("nop", machInst);
3897141Sgblack@eecs.umich.edu              case 0x1:
3907141Sgblack@eecs.umich.edu                return new WarnUnimplemented("yield", machInst);
3917141Sgblack@eecs.umich.edu              case 0x2:
3927141Sgblack@eecs.umich.edu                return new WarnUnimplemented("wfe", machInst);
3937141Sgblack@eecs.umich.edu              case 0x3:
3947141Sgblack@eecs.umich.edu                return new WarnUnimplemented("wfi", machInst);
3957141Sgblack@eecs.umich.edu              case 0x4:
3967141Sgblack@eecs.umich.edu                return new WarnUnimplemented("sev", machInst);
3977141Sgblack@eecs.umich.edu              default:
3987141Sgblack@eecs.umich.edu                return new WarnUnimplemented("unallocated_hint", machInst);
3997141Sgblack@eecs.umich.edu            }
4007141Sgblack@eecs.umich.edu          default:
4017141Sgblack@eecs.umich.edu            break;
4027141Sgblack@eecs.umich.edu        }
4037141Sgblack@eecs.umich.edu        return new Unknown(machInst);
4047141Sgblack@eecs.umich.edu    }
4057141Sgblack@eecs.umich.edu    '''
4067141Sgblack@eecs.umich.edu}};
4077141Sgblack@eecs.umich.edu
4087141Sgblack@eecs.umich.edudef format Thumb32DataProcModImm() {{
4097141Sgblack@eecs.umich.edu
4107141Sgblack@eecs.umich.edu    def decInst(mnem, dest="rd", op1="rn"):
4117141Sgblack@eecs.umich.edu        return '''
4127141Sgblack@eecs.umich.edu            if (s) {
4137146Sgblack@eecs.umich.edu                return new %(mnem)sImmCc(machInst, %(dest)s,
4147183Sgblack@eecs.umich.edu                                          %(op1)s, imm, rotC);
4157141Sgblack@eecs.umich.edu            } else {
4167146Sgblack@eecs.umich.edu                return new %(mnem)sImm(machInst, %(dest)s,
4177183Sgblack@eecs.umich.edu                                        %(op1)s, imm, rotC);
4187141Sgblack@eecs.umich.edu            }
4197141Sgblack@eecs.umich.edu        ''' % {"mnem" : mnem, "dest" : dest, "op1" : op1}
4207141Sgblack@eecs.umich.edu
4217141Sgblack@eecs.umich.edu    decode_block = '''
4227141Sgblack@eecs.umich.edu    {
4237141Sgblack@eecs.umich.edu        const uint32_t op = bits(machInst, 24, 21);
4247141Sgblack@eecs.umich.edu        const bool s = (bits(machInst, 20) == 1);
4257141Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
4267141Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
4277141Sgblack@eecs.umich.edu        const uint32_t ctrlImm = bits(machInst.instBits, 26) << 3 |
4287141Sgblack@eecs.umich.edu                                 bits(machInst, 14, 12);
4297183Sgblack@eecs.umich.edu        const bool rotC = ctrlImm > 3;
4307141Sgblack@eecs.umich.edu        const uint32_t dataImm = bits(machInst, 7, 0);
4317141Sgblack@eecs.umich.edu        const uint32_t imm = modified_imm(ctrlImm, dataImm);
4327141Sgblack@eecs.umich.edu        switch (op) {
4337141Sgblack@eecs.umich.edu          case 0x0:
4347141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
4357141Sgblack@eecs.umich.edu                %(tst)s
4367141Sgblack@eecs.umich.edu            } else {
4377141Sgblack@eecs.umich.edu                %(and)s
4387141Sgblack@eecs.umich.edu            }
4397141Sgblack@eecs.umich.edu          case 0x1:
4407141Sgblack@eecs.umich.edu            %(bic)s
4417141Sgblack@eecs.umich.edu          case 0x2:
4427141Sgblack@eecs.umich.edu            if (rn == INTREG_PC) {
4437141Sgblack@eecs.umich.edu                %(mov)s
4447141Sgblack@eecs.umich.edu            } else {
4457141Sgblack@eecs.umich.edu                %(orr)s
4467141Sgblack@eecs.umich.edu            }
4477141Sgblack@eecs.umich.edu          case 0x3:
4487141Sgblack@eecs.umich.edu            if (rn == INTREG_PC) {
4497141Sgblack@eecs.umich.edu                %(mvn)s
4507141Sgblack@eecs.umich.edu            } else {
4517141Sgblack@eecs.umich.edu                %(orn)s
4527141Sgblack@eecs.umich.edu            }
4537141Sgblack@eecs.umich.edu          case 0x4:
4547141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
4557141Sgblack@eecs.umich.edu                %(teq)s
4567141Sgblack@eecs.umich.edu            } else {
4577141Sgblack@eecs.umich.edu                %(eor)s
4587141Sgblack@eecs.umich.edu            }
4597141Sgblack@eecs.umich.edu          case 0x8:
4607141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
4617141Sgblack@eecs.umich.edu                %(cmn)s
4627141Sgblack@eecs.umich.edu            } else {
4637141Sgblack@eecs.umich.edu                %(add)s
4647141Sgblack@eecs.umich.edu            }
4657141Sgblack@eecs.umich.edu          case 0xa:
4667141Sgblack@eecs.umich.edu            %(adc)s
4677141Sgblack@eecs.umich.edu          case 0xb:
4687141Sgblack@eecs.umich.edu            %(sbc)s
4697141Sgblack@eecs.umich.edu          case 0xd:
4707141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
4717141Sgblack@eecs.umich.edu                %(cmp)s
4727141Sgblack@eecs.umich.edu            } else {
4737141Sgblack@eecs.umich.edu                %(sub)s
4747141Sgblack@eecs.umich.edu            }
4757141Sgblack@eecs.umich.edu          case 0xe:
4767141Sgblack@eecs.umich.edu            %(rsb)s
4777141Sgblack@eecs.umich.edu          default:
4787141Sgblack@eecs.umich.edu            return new Unknown(machInst);
4797141Sgblack@eecs.umich.edu        }
4807141Sgblack@eecs.umich.edu    }
4817141Sgblack@eecs.umich.edu    ''' % {
4827141Sgblack@eecs.umich.edu        "tst" : decInst("Tst", "INTREG_ZERO"),
4837141Sgblack@eecs.umich.edu        "and" : decInst("And"),
4847141Sgblack@eecs.umich.edu        "bic" : decInst("Bic"),
4857141Sgblack@eecs.umich.edu        "mov" : decInst("Mov", op1="INTREG_ZERO"),
4867141Sgblack@eecs.umich.edu        "orr" : decInst("Orr"),
4877141Sgblack@eecs.umich.edu        "mvn" : decInst("Mvn", op1="INTREG_ZERO"),
4887141Sgblack@eecs.umich.edu        "orn" : decInst("Orn"),
4897141Sgblack@eecs.umich.edu        "teq" : decInst("Teq", dest="INTREG_ZERO"),
4907141Sgblack@eecs.umich.edu        "eor" : decInst("Eor"),
4917141Sgblack@eecs.umich.edu        "cmn" : decInst("Cmn", dest="INTREG_ZERO"),
4927141Sgblack@eecs.umich.edu        "add" : decInst("Add"),
4937141Sgblack@eecs.umich.edu        "adc" : decInst("Adc"),
4947141Sgblack@eecs.umich.edu        "sbc" : decInst("Sbc"),
4957141Sgblack@eecs.umich.edu        "cmp" : decInst("Cmp", dest="INTREG_ZERO"),
4967141Sgblack@eecs.umich.edu        "sub" : decInst("Sub"),
4977141Sgblack@eecs.umich.edu        "rsb" : decInst("Rsb")
4987141Sgblack@eecs.umich.edu    }
4997141Sgblack@eecs.umich.edu}};
5007141Sgblack@eecs.umich.edu
5017157Sgblack@eecs.umich.edudef format Thumb32DataProcPlainBin() {{
5027157Sgblack@eecs.umich.edu    decode_block = '''
5037157Sgblack@eecs.umich.edu    {
5047157Sgblack@eecs.umich.edu        const uint32_t op = bits(machInst, 24, 20);
5057157Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
5067157Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
5077157Sgblack@eecs.umich.edu        switch (op) {
5087157Sgblack@eecs.umich.edu          case 0x0:
5097157Sgblack@eecs.umich.edu            {
5107157Sgblack@eecs.umich.edu                const uint32_t imm = bits(machInst, 7, 0) |
5117157Sgblack@eecs.umich.edu                                     (bits(machInst, 14, 12) << 8) |
5127157Sgblack@eecs.umich.edu                                     (bits(machInst, 26) << 11);
5137185Sgblack@eecs.umich.edu                if (rn == 0xf) {
5147185Sgblack@eecs.umich.edu                    return new AdrImm(machInst, rd, (IntRegIndex)1,
5157185Sgblack@eecs.umich.edu                                      imm, false);
5167185Sgblack@eecs.umich.edu                } else {
5177185Sgblack@eecs.umich.edu                    return new AddImm(machInst, rd, rn, imm, true);
5187185Sgblack@eecs.umich.edu                }
5197157Sgblack@eecs.umich.edu            }
5207157Sgblack@eecs.umich.edu          case 0x4:
5217157Sgblack@eecs.umich.edu            {
5227157Sgblack@eecs.umich.edu                const uint32_t imm = bits(machInst, 7, 0) |
5237157Sgblack@eecs.umich.edu                                     (bits(machInst, 14, 12) << 8) |
5247157Sgblack@eecs.umich.edu                                     (bits(machInst, 26) << 11) |
5257157Sgblack@eecs.umich.edu                                     (bits(machInst, 19, 16) << 12);
5267157Sgblack@eecs.umich.edu                return new MovImm(machInst, rd, INTREG_ZERO, imm, true);
5277157Sgblack@eecs.umich.edu            }
5287157Sgblack@eecs.umich.edu          case 0xa:
5297157Sgblack@eecs.umich.edu            {
5307157Sgblack@eecs.umich.edu                const uint32_t imm = bits(machInst, 7, 0) |
5317157Sgblack@eecs.umich.edu                                     (bits(machInst, 14, 12) << 8) |
5327157Sgblack@eecs.umich.edu                                     (bits(machInst, 26) << 11);
5337185Sgblack@eecs.umich.edu                if (rn == 0xf) {
5347185Sgblack@eecs.umich.edu                    return new AdrImm(machInst, rd, (IntRegIndex)0,
5357185Sgblack@eecs.umich.edu                                      imm, false);
5367185Sgblack@eecs.umich.edu                } else {
5377185Sgblack@eecs.umich.edu                    return new SubImm(machInst, rd, rn, imm, true);
5387185Sgblack@eecs.umich.edu                }
5397157Sgblack@eecs.umich.edu            }
5407157Sgblack@eecs.umich.edu          case 0xc:
5417157Sgblack@eecs.umich.edu            {
5427157Sgblack@eecs.umich.edu                const uint32_t imm = bits(machInst, 7, 0) |
5437157Sgblack@eecs.umich.edu                                     (bits(machInst, 14, 12) << 8) |
5447157Sgblack@eecs.umich.edu                                     (bits(machInst, 26) << 11) |
5457157Sgblack@eecs.umich.edu                                     (bits(machInst, 19, 16) << 12);
5467157Sgblack@eecs.umich.edu                return new MovtImm(machInst, rd, rd, imm, true);
5477157Sgblack@eecs.umich.edu            }
5487157Sgblack@eecs.umich.edu          case 0x12:
5497157Sgblack@eecs.umich.edu            if (!(bits(machInst, 14, 12) || bits(machInst, 7, 6))) {
5507157Sgblack@eecs.umich.edu                return new WarnUnimplemented("ssat16", machInst);
5517157Sgblack@eecs.umich.edu            }
5527157Sgblack@eecs.umich.edu            // Fall through on purpose...
5537157Sgblack@eecs.umich.edu          case 0x10:
5547157Sgblack@eecs.umich.edu            return new WarnUnimplemented("ssat", machInst);
5557157Sgblack@eecs.umich.edu          case 0x14:
5567157Sgblack@eecs.umich.edu            return new WarnUnimplemented("sbfx", machInst);
5577157Sgblack@eecs.umich.edu          case 0x16:
5587157Sgblack@eecs.umich.edu            if (rn == 0xf) {
5597157Sgblack@eecs.umich.edu                return new WarnUnimplemented("bfc", machInst);
5607157Sgblack@eecs.umich.edu            } else {
5617157Sgblack@eecs.umich.edu                return new WarnUnimplemented("bfi", machInst);
5627157Sgblack@eecs.umich.edu            }
5637157Sgblack@eecs.umich.edu          case 0x1a:
5647157Sgblack@eecs.umich.edu            if (!(bits(machInst, 14, 12) || bits(machInst, 7, 6))) {
5657157Sgblack@eecs.umich.edu                return new WarnUnimplemented("usat16", machInst);
5667157Sgblack@eecs.umich.edu            }
5677157Sgblack@eecs.umich.edu            // Fall through on purpose...
5687157Sgblack@eecs.umich.edu          case 0x18:
5697157Sgblack@eecs.umich.edu            return new WarnUnimplemented("usat", machInst);
5707157Sgblack@eecs.umich.edu          case 0x1c:
5717157Sgblack@eecs.umich.edu            return new WarnUnimplemented("ubfx", machInst);
5727157Sgblack@eecs.umich.edu          default:
5737157Sgblack@eecs.umich.edu            return new Unknown(machInst);
5747157Sgblack@eecs.umich.edu        }
5757157Sgblack@eecs.umich.edu    }
5767157Sgblack@eecs.umich.edu    '''
5777157Sgblack@eecs.umich.edu}};
5787157Sgblack@eecs.umich.edu
5797141Sgblack@eecs.umich.edudef format Thumb32DataProcShiftReg() {{
5807141Sgblack@eecs.umich.edu
5817141Sgblack@eecs.umich.edu    def decInst(mnem, dest="rd", op1="rn"):
5827141Sgblack@eecs.umich.edu        return '''
5837141Sgblack@eecs.umich.edu            if (s) {
5847146Sgblack@eecs.umich.edu                return new %(mnem)sRegCc(machInst, %(dest)s,
5857141Sgblack@eecs.umich.edu                                          %(op1)s, rm, amt, type);
5867141Sgblack@eecs.umich.edu            } else {
5877146Sgblack@eecs.umich.edu                return new %(mnem)sReg(machInst, %(dest)s,
5887141Sgblack@eecs.umich.edu                                        %(op1)s, rm, amt, type);
5897141Sgblack@eecs.umich.edu            }
5907141Sgblack@eecs.umich.edu        ''' % {"mnem" : mnem, "dest" : dest, "op1" : op1}
5917141Sgblack@eecs.umich.edu
5927141Sgblack@eecs.umich.edu    decode_block = '''
5937141Sgblack@eecs.umich.edu    {
5947141Sgblack@eecs.umich.edu        const uint32_t op = bits(machInst, 24, 21);
5957141Sgblack@eecs.umich.edu        const bool s = (bits(machInst, 20) == 1);
5967141Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
5977141Sgblack@eecs.umich.edu        const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
5987141Sgblack@eecs.umich.edu        const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 3, 0);
5997141Sgblack@eecs.umich.edu        const uint32_t amt = (bits(machInst, 14, 12) << 2) |
6007141Sgblack@eecs.umich.edu                              bits(machInst, 7, 6);
6017141Sgblack@eecs.umich.edu        const ArmShiftType type = (ArmShiftType)(uint32_t)bits(machInst, 5, 4);
6027141Sgblack@eecs.umich.edu        switch (op) {
6037141Sgblack@eecs.umich.edu          case 0x0:
6047141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
6057141Sgblack@eecs.umich.edu                %(tst)s
6067141Sgblack@eecs.umich.edu            } else {
6077141Sgblack@eecs.umich.edu                %(and)s
6087141Sgblack@eecs.umich.edu            }
6097141Sgblack@eecs.umich.edu          case 0x1:
6107141Sgblack@eecs.umich.edu            %(bic)s
6117141Sgblack@eecs.umich.edu          case 0x2:
6127141Sgblack@eecs.umich.edu            if (rn == INTREG_PC) {
6137141Sgblack@eecs.umich.edu                %(mov)s
6147141Sgblack@eecs.umich.edu            } else {
6157141Sgblack@eecs.umich.edu                %(orr)s
6167141Sgblack@eecs.umich.edu            }
6177141Sgblack@eecs.umich.edu          case 0x3:
6187141Sgblack@eecs.umich.edu            if (rn == INTREG_PC) {
6197141Sgblack@eecs.umich.edu                %(mvn)s
6207141Sgblack@eecs.umich.edu            } else {
6217141Sgblack@eecs.umich.edu                %(orn)s
6227141Sgblack@eecs.umich.edu            }
6237141Sgblack@eecs.umich.edu          case 0x4:
6247141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
6257141Sgblack@eecs.umich.edu                %(teq)s
6267141Sgblack@eecs.umich.edu            } else {
6277141Sgblack@eecs.umich.edu                %(eor)s
6287141Sgblack@eecs.umich.edu            }
6297141Sgblack@eecs.umich.edu          case 0x6:
6307141Sgblack@eecs.umich.edu            return new WarnUnimplemented("pkh", machInst);
6317141Sgblack@eecs.umich.edu          case 0x8:
6327141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
6337141Sgblack@eecs.umich.edu                %(cmn)s
6347141Sgblack@eecs.umich.edu            } else {
6357141Sgblack@eecs.umich.edu                %(add)s
6367141Sgblack@eecs.umich.edu            }
6377141Sgblack@eecs.umich.edu          case 0xa:
6387141Sgblack@eecs.umich.edu            %(adc)s
6397141Sgblack@eecs.umich.edu          case 0xb:
6407141Sgblack@eecs.umich.edu            %(sbc)s
6417141Sgblack@eecs.umich.edu          case 0xd:
6427141Sgblack@eecs.umich.edu            if (rd == INTREG_PC) {
6437141Sgblack@eecs.umich.edu                %(cmp)s
6447141Sgblack@eecs.umich.edu            } else {
6457141Sgblack@eecs.umich.edu                %(sub)s
6467141Sgblack@eecs.umich.edu            }
6477141Sgblack@eecs.umich.edu          case 0xe:
6487141Sgblack@eecs.umich.edu            %(rsb)s
6497141Sgblack@eecs.umich.edu          default:
6507141Sgblack@eecs.umich.edu            return new Unknown(machInst);
6517141Sgblack@eecs.umich.edu        }
6527141Sgblack@eecs.umich.edu    }
6537141Sgblack@eecs.umich.edu    ''' % {
6547141Sgblack@eecs.umich.edu        "tst" : decInst("Tst", "INTREG_ZERO"),
6557141Sgblack@eecs.umich.edu        "and" : decInst("And"),
6567141Sgblack@eecs.umich.edu        "bic" : decInst("Bic"),
6577141Sgblack@eecs.umich.edu        "mov" : decInst("Mov", op1="INTREG_ZERO"),
6587141Sgblack@eecs.umich.edu        "orr" : decInst("Orr"),
6597141Sgblack@eecs.umich.edu        "mvn" : decInst("Mvn", op1="INTREG_ZERO"),
6607141Sgblack@eecs.umich.edu        "orn" : decInst("Orn"),
6617141Sgblack@eecs.umich.edu        "teq" : decInst("Teq", "INTREG_ZERO"),
6627141Sgblack@eecs.umich.edu        "eor" : decInst("Eor"),
6637141Sgblack@eecs.umich.edu        "cmn" : decInst("Cmn", "INTREG_ZERO"),
6647141Sgblack@eecs.umich.edu        "add" : decInst("Add"),
6657141Sgblack@eecs.umich.edu        "adc" : decInst("Adc"),
6667141Sgblack@eecs.umich.edu        "sbc" : decInst("Sbc"),
6677141Sgblack@eecs.umich.edu        "cmp" : decInst("Cmp", "INTREG_ZERO"),
6687141Sgblack@eecs.umich.edu        "sub" : decInst("Sub"),
6697141Sgblack@eecs.umich.edu        "rsb" : decInst("Rsb")
6707141Sgblack@eecs.umich.edu    }
6717141Sgblack@eecs.umich.edu}};
672