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