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