17161Sgblack@eecs.umich.edu// Copyright (c) 2010 ARM Limited 27161Sgblack@eecs.umich.edu// All rights reserved 37161Sgblack@eecs.umich.edu// 47161Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall 57161Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual 67161Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating 77161Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software 87161Sgblack@eecs.umich.edu// licensed hereunder. You may use the software subject to the license 97161Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated 107161Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software, 117161Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form. 127161Sgblack@eecs.umich.edu// 137161Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without 147161Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are 157161Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright 167161Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer; 177161Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright 187161Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the 197161Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution; 207161Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its 217161Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from 227161Sgblack@eecs.umich.edu// this software without specific prior written permission. 237161Sgblack@eecs.umich.edu// 247161Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 257161Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 267161Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 277161Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 287161Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 297161Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 307161Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 317161Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 327161Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 337161Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 347161Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 357161Sgblack@eecs.umich.edu// 367161Sgblack@eecs.umich.edu// Authors: Gabe Black 377161Sgblack@eecs.umich.edu 387161Sgblack@eecs.umich.edudef format ArmMultAndMultAcc() {{ 397161Sgblack@eecs.umich.edu decode_block = ''' 407161Sgblack@eecs.umich.edu { 417161Sgblack@eecs.umich.edu // The manual defines this field as 23-20, but bit 20 is usually 427161Sgblack@eecs.umich.edu // ignored. 437161Sgblack@eecs.umich.edu const uint32_t op = bits(machInst, 23, 21); 447161Sgblack@eecs.umich.edu const bool s = bits(machInst, 20); 457161Sgblack@eecs.umich.edu const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 467161Sgblack@eecs.umich.edu const IntRegIndex ra = (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 477161Sgblack@eecs.umich.edu const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 11, 8); 487161Sgblack@eecs.umich.edu const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 3, 0); 497161Sgblack@eecs.umich.edu switch (op) { 507161Sgblack@eecs.umich.edu case 0x0: 517161Sgblack@eecs.umich.edu if (s) { 527162Sgblack@eecs.umich.edu return new MulCc(machInst, rd, rm, rn); 537161Sgblack@eecs.umich.edu } else { 547162Sgblack@eecs.umich.edu return new Mul(machInst, rd, rm, rn); 557161Sgblack@eecs.umich.edu } 567161Sgblack@eecs.umich.edu case 0x1: 577161Sgblack@eecs.umich.edu if (s) { 587162Sgblack@eecs.umich.edu return new MlaCc(machInst, rd, rn, rm, ra); 597161Sgblack@eecs.umich.edu } else { 607162Sgblack@eecs.umich.edu return new Mla(machInst, rd, rn, rm, ra); 617161Sgblack@eecs.umich.edu } 627161Sgblack@eecs.umich.edu case 0x2: 637162Sgblack@eecs.umich.edu return new Umaal(machInst, ra, rd, rn, rm); 647161Sgblack@eecs.umich.edu case 0x3: 657162Sgblack@eecs.umich.edu return new Mls(machInst, rd, rn, rm, ra); 667161Sgblack@eecs.umich.edu case 0x4: 677161Sgblack@eecs.umich.edu if (s) { 687162Sgblack@eecs.umich.edu return new UmullCc(machInst, ra, rd, rn, rm); 697161Sgblack@eecs.umich.edu } else { 707162Sgblack@eecs.umich.edu return new Umull(machInst, ra, rd, rn, rm); 717161Sgblack@eecs.umich.edu } 727161Sgblack@eecs.umich.edu case 0x5: 737161Sgblack@eecs.umich.edu if (s) { 747162Sgblack@eecs.umich.edu return new UmlalCc(machInst, ra, rd, rn, rm); 757161Sgblack@eecs.umich.edu } else { 767162Sgblack@eecs.umich.edu return new Umlal(machInst, ra, rd, rn, rm); 777161Sgblack@eecs.umich.edu } 787161Sgblack@eecs.umich.edu case 0x6: 797161Sgblack@eecs.umich.edu if (s) { 807162Sgblack@eecs.umich.edu return new SmullCc(machInst, ra, rd, rn, rm); 817161Sgblack@eecs.umich.edu } else { 827162Sgblack@eecs.umich.edu return new Smull(machInst, ra, rd, rn, rm); 837161Sgblack@eecs.umich.edu } 847161Sgblack@eecs.umich.edu case 0x7: 857161Sgblack@eecs.umich.edu if (s) { 867162Sgblack@eecs.umich.edu return new SmlalCc(machInst, ra, rd, rn, rm); 877161Sgblack@eecs.umich.edu } else { 887162Sgblack@eecs.umich.edu return new Smlal(machInst, ra, rd, rn, rm); 897161Sgblack@eecs.umich.edu } 9012595Ssiddhesh.poyarekar@gmail.com default: 9112595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 927161Sgblack@eecs.umich.edu } 937161Sgblack@eecs.umich.edu } 947161Sgblack@eecs.umich.edu ''' 957161Sgblack@eecs.umich.edu}}; 967161Sgblack@eecs.umich.edu 977161Sgblack@eecs.umich.edudef format ArmHalfWordMultAndMultAcc() {{ 987161Sgblack@eecs.umich.edu decode_block = ''' 997161Sgblack@eecs.umich.edu { 1007161Sgblack@eecs.umich.edu const uint32_t op1 = bits(machInst, 22, 21); 1017161Sgblack@eecs.umich.edu const bool op = bits(machInst, 5); 1027161Sgblack@eecs.umich.edu const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 1037161Sgblack@eecs.umich.edu const IntRegIndex ra = (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 1047161Sgblack@eecs.umich.edu const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 11, 8); 1057161Sgblack@eecs.umich.edu const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 3, 0); 1067161Sgblack@eecs.umich.edu switch (op1) { 1077161Sgblack@eecs.umich.edu case 0x0: 1087161Sgblack@eecs.umich.edu switch (bits(machInst, 6, 5)) { 1097161Sgblack@eecs.umich.edu case 0x0: 1107162Sgblack@eecs.umich.edu return new SmlabbCc(machInst, rd, rn, rm, ra); 1117161Sgblack@eecs.umich.edu case 0x1: 1127162Sgblack@eecs.umich.edu return new SmlatbCc(machInst, rd, rn, rm, ra); 1137161Sgblack@eecs.umich.edu case 0x2: 1147162Sgblack@eecs.umich.edu return new SmlabtCc(machInst, rd, rn, rm, ra); 1157161Sgblack@eecs.umich.edu case 0x3: 1167162Sgblack@eecs.umich.edu return new SmlattCc(machInst, rd, rn, rm, ra); 11712595Ssiddhesh.poyarekar@gmail.com default: 11812595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 1197161Sgblack@eecs.umich.edu } 1207161Sgblack@eecs.umich.edu case 0x1: 1217161Sgblack@eecs.umich.edu if (op) { 1227161Sgblack@eecs.umich.edu if (bits(machInst, 6)) { 1237162Sgblack@eecs.umich.edu return new Smulwt(machInst, rd, rn, rm); 1247161Sgblack@eecs.umich.edu } else { 1257162Sgblack@eecs.umich.edu return new Smulwb(machInst, rd, rn, rm); 1267161Sgblack@eecs.umich.edu } 1277161Sgblack@eecs.umich.edu } else { 1287161Sgblack@eecs.umich.edu if (bits(machInst, 6)) { 1297162Sgblack@eecs.umich.edu return new SmlawtCc(machInst, rd, rn, rm, ra); 1307161Sgblack@eecs.umich.edu } else { 1317162Sgblack@eecs.umich.edu return new SmlawbCc(machInst, rd, rn, rm, ra); 1327161Sgblack@eecs.umich.edu } 1337161Sgblack@eecs.umich.edu } 1347161Sgblack@eecs.umich.edu case 0x2: 1357161Sgblack@eecs.umich.edu switch (bits(machInst, 6, 5)) { 1367161Sgblack@eecs.umich.edu case 0x0: 1377162Sgblack@eecs.umich.edu return new Smlalbb(machInst, ra, rd, rn, rm); 1387161Sgblack@eecs.umich.edu case 0x1: 1397162Sgblack@eecs.umich.edu return new Smlaltb(machInst, ra, rd, rn, rm); 1407161Sgblack@eecs.umich.edu case 0x2: 1417162Sgblack@eecs.umich.edu return new Smlalbt(machInst, ra, rd, rn, rm); 1427161Sgblack@eecs.umich.edu case 0x3: 1437162Sgblack@eecs.umich.edu return new Smlaltt(machInst, ra, rd, rn, rm); 14412595Ssiddhesh.poyarekar@gmail.com default: 14512595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 1467161Sgblack@eecs.umich.edu } 1477161Sgblack@eecs.umich.edu case 0x3: 1487161Sgblack@eecs.umich.edu switch (bits(machInst, 6, 5)) { 1497161Sgblack@eecs.umich.edu case 0x0: 1507162Sgblack@eecs.umich.edu return new Smulbb(machInst, rd, rn, rm); 1517161Sgblack@eecs.umich.edu case 0x1: 1527162Sgblack@eecs.umich.edu return new Smultb(machInst, rd, rn, rm); 1537161Sgblack@eecs.umich.edu case 0x2: 1547162Sgblack@eecs.umich.edu return new Smulbt(machInst, rd, rn, rm); 1557161Sgblack@eecs.umich.edu case 0x3: 1567162Sgblack@eecs.umich.edu return new Smultt(machInst, rd, rn, rm); 15712595Ssiddhesh.poyarekar@gmail.com default: 15812595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 1597161Sgblack@eecs.umich.edu } 16012595Ssiddhesh.poyarekar@gmail.com default: 16112595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 1627161Sgblack@eecs.umich.edu } 1637161Sgblack@eecs.umich.edu } 1647161Sgblack@eecs.umich.edu ''' 1657161Sgblack@eecs.umich.edu}}; 1667161Sgblack@eecs.umich.edu 1677161Sgblack@eecs.umich.edudef format Thumb32MulMulAccAndAbsDiff() {{ 1687161Sgblack@eecs.umich.edu decode_block = ''' 1697161Sgblack@eecs.umich.edu { 1707161Sgblack@eecs.umich.edu const uint32_t op1 = bits(machInst, 22, 20); 1717161Sgblack@eecs.umich.edu const uint32_t op2 = bits(machInst, 5, 4); 1727161Sgblack@eecs.umich.edu const IntRegIndex ra = (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 1737161Sgblack@eecs.umich.edu const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 1747161Sgblack@eecs.umich.edu const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 11, 8); 1757161Sgblack@eecs.umich.edu const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 3, 0); 1767161Sgblack@eecs.umich.edu if (op1 != 0x1 && bits(op2, 1) != 0) { 1777161Sgblack@eecs.umich.edu return new Unknown(machInst); 1787161Sgblack@eecs.umich.edu } 1797161Sgblack@eecs.umich.edu switch (op1) { 1807161Sgblack@eecs.umich.edu case 0x0: 1817161Sgblack@eecs.umich.edu if (op2 == 0) { 1827161Sgblack@eecs.umich.edu if (ra == 0xf) { 1837162Sgblack@eecs.umich.edu return new Mul(machInst, rd, rn, rm); 1847161Sgblack@eecs.umich.edu } else { 1857162Sgblack@eecs.umich.edu return new Mla(machInst, rd, rn, rm, ra); 1867161Sgblack@eecs.umich.edu } 1877161Sgblack@eecs.umich.edu } else { 1887162Sgblack@eecs.umich.edu return new Mls(machInst, rd, rn, rm, ra); 1897161Sgblack@eecs.umich.edu } 1907161Sgblack@eecs.umich.edu case 0x1: 1917161Sgblack@eecs.umich.edu if (ra == 0xf) { 1927161Sgblack@eecs.umich.edu switch (bits(machInst, 5, 4)) { 1937161Sgblack@eecs.umich.edu case 0x0: 1947162Sgblack@eecs.umich.edu return new Smulbb(machInst, rd, rn, rm); 1957161Sgblack@eecs.umich.edu case 0x1: 1967162Sgblack@eecs.umich.edu return new Smulbt(machInst, rd, rn, rm); 1977161Sgblack@eecs.umich.edu case 0x2: 1987162Sgblack@eecs.umich.edu return new Smultb(machInst, rd, rn, rm); 1997161Sgblack@eecs.umich.edu case 0x3: 2007162Sgblack@eecs.umich.edu return new Smultt(machInst, rd, rn, rm); 2017161Sgblack@eecs.umich.edu } 2027161Sgblack@eecs.umich.edu } else { 2037161Sgblack@eecs.umich.edu switch (bits(machInst, 5, 4)) { 2047161Sgblack@eecs.umich.edu case 0x0: 2057162Sgblack@eecs.umich.edu return new SmlabbCc(machInst, rd, rn, rm, ra); 2067161Sgblack@eecs.umich.edu case 0x1: 2077162Sgblack@eecs.umich.edu return new SmlabtCc(machInst, rd, rn, rm, ra); 2087161Sgblack@eecs.umich.edu case 0x2: 2097162Sgblack@eecs.umich.edu return new SmlatbCc(machInst, rd, rn, rm, ra); 2107161Sgblack@eecs.umich.edu case 0x3: 2117162Sgblack@eecs.umich.edu return new SmlattCc(machInst, rd, rn, rm, ra); 2127161Sgblack@eecs.umich.edu } 2137161Sgblack@eecs.umich.edu } 21412595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 2157161Sgblack@eecs.umich.edu case 0x2: 2167161Sgblack@eecs.umich.edu if (ra == 0xf) { 2177161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2187162Sgblack@eecs.umich.edu return new SmuadxCc(machInst, rd, rn, rm); 2197161Sgblack@eecs.umich.edu } else { 2207162Sgblack@eecs.umich.edu return new SmuadCc(machInst, rd, rn, rm); 2217161Sgblack@eecs.umich.edu } 2227161Sgblack@eecs.umich.edu } else { 2237161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2247162Sgblack@eecs.umich.edu return new SmladxCc(machInst, rd, rn, rm, ra); 2257161Sgblack@eecs.umich.edu } else { 2267162Sgblack@eecs.umich.edu return new SmladCc(machInst, rd, rn, rm, ra); 2277161Sgblack@eecs.umich.edu } 2287161Sgblack@eecs.umich.edu } 2297161Sgblack@eecs.umich.edu case 0x3: 2307161Sgblack@eecs.umich.edu if (ra == 0xf) { 2317161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2327162Sgblack@eecs.umich.edu return new Smulwt(machInst, rd, rn, rm); 2337161Sgblack@eecs.umich.edu } else { 2347162Sgblack@eecs.umich.edu return new Smulwb(machInst, rd, rn, rm); 2357161Sgblack@eecs.umich.edu } 2367161Sgblack@eecs.umich.edu } else { 2377161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2387162Sgblack@eecs.umich.edu return new SmlawtCc(machInst, rd, rn, rm, ra); 2397161Sgblack@eecs.umich.edu } else { 2407162Sgblack@eecs.umich.edu return new SmlawbCc(machInst, rd, rn, rm, ra); 2417161Sgblack@eecs.umich.edu } 2427161Sgblack@eecs.umich.edu } 2437161Sgblack@eecs.umich.edu case 0x4: 2447161Sgblack@eecs.umich.edu if (ra == 0xf) { 2457161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2467162Sgblack@eecs.umich.edu return new Smusdx(machInst, rd, rn, rm); 2477161Sgblack@eecs.umich.edu } else { 2487162Sgblack@eecs.umich.edu return new Smusd(machInst, rd, rn, rm); 2497161Sgblack@eecs.umich.edu } 2507161Sgblack@eecs.umich.edu } else { 2517161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2527162Sgblack@eecs.umich.edu return new SmlsdxCc(machInst, rd, rn, rm, ra); 2537161Sgblack@eecs.umich.edu } else { 2547162Sgblack@eecs.umich.edu return new SmlsdCc(machInst, rd, rn, rm, ra); 2557161Sgblack@eecs.umich.edu } 2567161Sgblack@eecs.umich.edu } 2577161Sgblack@eecs.umich.edu case 0x5: 2587161Sgblack@eecs.umich.edu if (ra == 0xf) { 2597161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2607162Sgblack@eecs.umich.edu return new Smmulr(machInst, rd, rn, rm); 2617161Sgblack@eecs.umich.edu } else { 2627162Sgblack@eecs.umich.edu return new Smmul(machInst, rd, rn, rm); 2637161Sgblack@eecs.umich.edu } 2647161Sgblack@eecs.umich.edu } else { 2657161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2667162Sgblack@eecs.umich.edu return new Smmlar(machInst, rd, rn, rm, ra); 2677161Sgblack@eecs.umich.edu } else { 2687162Sgblack@eecs.umich.edu return new Smmla(machInst, rd, rn, rm, ra); 2697161Sgblack@eecs.umich.edu } 2707161Sgblack@eecs.umich.edu } 2717161Sgblack@eecs.umich.edu case 0x6: 2727161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2737162Sgblack@eecs.umich.edu return new Smmlsr(machInst, rd, rn, rm, ra); 2747161Sgblack@eecs.umich.edu } else { 2757162Sgblack@eecs.umich.edu return new Smmls(machInst, rd, rn, rm, ra); 2767161Sgblack@eecs.umich.edu } 2777161Sgblack@eecs.umich.edu case 0x7: 2787161Sgblack@eecs.umich.edu if (op2 != 0x0) { 2797161Sgblack@eecs.umich.edu return new Unknown(machInst); 2807161Sgblack@eecs.umich.edu } else if (ra == 0xf) { 2817243Sgblack@eecs.umich.edu return new Usad8(machInst, rd, rn, rm); 2827161Sgblack@eecs.umich.edu } else { 2837243Sgblack@eecs.umich.edu return new Usada8(machInst, rd, rn, rm, ra); 2847161Sgblack@eecs.umich.edu } 28512595Ssiddhesh.poyarekar@gmail.com default: 28612595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 2877161Sgblack@eecs.umich.edu } 2887161Sgblack@eecs.umich.edu } 2897161Sgblack@eecs.umich.edu ''' 2907161Sgblack@eecs.umich.edu}}; 2917161Sgblack@eecs.umich.edu 2927161Sgblack@eecs.umich.edudef format Thumb32LongMulMulAccAndDiv() {{ 2937161Sgblack@eecs.umich.edu decode_block = ''' 2947161Sgblack@eecs.umich.edu { 2957161Sgblack@eecs.umich.edu const uint32_t op1 = bits(machInst, 22, 20); 2967161Sgblack@eecs.umich.edu const uint32_t op2 = bits(machInst, 7, 4); 2977161Sgblack@eecs.umich.edu const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 2987161Sgblack@eecs.umich.edu const IntRegIndex rdlo = (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 2997161Sgblack@eecs.umich.edu const IntRegIndex rdhi = (IntRegIndex)(uint32_t)bits(machInst, 11, 8); 3007161Sgblack@eecs.umich.edu const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 3, 0); 3017161Sgblack@eecs.umich.edu switch (op1) { 3027161Sgblack@eecs.umich.edu case 0x0: 3037161Sgblack@eecs.umich.edu if (op2 == 0x0) { 3047162Sgblack@eecs.umich.edu return new Smull(machInst, rdlo, rdhi, rn, rm); 3057161Sgblack@eecs.umich.edu } 3067161Sgblack@eecs.umich.edu break; 3077161Sgblack@eecs.umich.edu case 0x1: 3087161Sgblack@eecs.umich.edu if (op2 == 0xf) { 3097318Sgblack@eecs.umich.edu return new Sdiv(machInst, rdhi, rn, rm); 3107161Sgblack@eecs.umich.edu } 3117161Sgblack@eecs.umich.edu break; 3127161Sgblack@eecs.umich.edu case 0x2: 3137161Sgblack@eecs.umich.edu if (op2 == 0x0) { 3147162Sgblack@eecs.umich.edu return new Umull(machInst, rdlo, rdhi, rn, rm); 3157161Sgblack@eecs.umich.edu } 3167161Sgblack@eecs.umich.edu break; 3177161Sgblack@eecs.umich.edu case 0x3: 3187161Sgblack@eecs.umich.edu if (op2 == 0xf) { 3197319Sgblack@eecs.umich.edu return new Udiv(machInst, rdhi, rn, rm); 3207161Sgblack@eecs.umich.edu } 3217161Sgblack@eecs.umich.edu break; 3227161Sgblack@eecs.umich.edu case 0x4: 3237161Sgblack@eecs.umich.edu if (op2 == 0) { 3247162Sgblack@eecs.umich.edu return new Smlal(machInst, rdlo, rdhi, rn, rm); 3257161Sgblack@eecs.umich.edu } else if (bits(op2, 3, 2) == 0x2) { 3267161Sgblack@eecs.umich.edu switch (bits(machInst, 5, 4)) { 3277161Sgblack@eecs.umich.edu case 0x0: 3287162Sgblack@eecs.umich.edu return new Smlalbb(machInst, rdlo, rdhi, rn, rm); 3297161Sgblack@eecs.umich.edu case 0x1: 3307162Sgblack@eecs.umich.edu return new Smlalbt(machInst, rdlo, rdhi, rn, rm); 3317161Sgblack@eecs.umich.edu case 0x2: 3327162Sgblack@eecs.umich.edu return new Smlaltb(machInst, rdlo, rdhi, rn, rm); 3337161Sgblack@eecs.umich.edu case 0x3: 3347162Sgblack@eecs.umich.edu return new Smlaltt(machInst, rdlo, rdhi, rn, rm); 3357161Sgblack@eecs.umich.edu } 3367161Sgblack@eecs.umich.edu } else if (bits(op2, 3, 1) == 0x6) { 3377161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 3387162Sgblack@eecs.umich.edu return new Smlaldx(machInst, rdlo, rdhi, rn, rm); 3397161Sgblack@eecs.umich.edu } else { 3407162Sgblack@eecs.umich.edu return new Smlald(machInst, rdlo, rdhi, rn, rm); 3417161Sgblack@eecs.umich.edu } 3427161Sgblack@eecs.umich.edu } 3437161Sgblack@eecs.umich.edu break; 3447161Sgblack@eecs.umich.edu case 0x5: 3457161Sgblack@eecs.umich.edu if (bits(op2, 3, 1) == 0x6) { 3467161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 3477162Sgblack@eecs.umich.edu return new Smlsldx(machInst, rdlo, rdhi, rn, rm); 3487161Sgblack@eecs.umich.edu } else { 3497162Sgblack@eecs.umich.edu return new Smlsld(machInst, rdlo, rdhi, rn, rm); 3507161Sgblack@eecs.umich.edu } 3517161Sgblack@eecs.umich.edu } 3527290Sgblack@eecs.umich.edu break; 3537161Sgblack@eecs.umich.edu case 0x6: 3547161Sgblack@eecs.umich.edu if (op2 == 0) { 3557162Sgblack@eecs.umich.edu return new Umlal(machInst, rdlo, rdhi, rn, rm); 3567161Sgblack@eecs.umich.edu } else if (op2 == 0x6) { 3577162Sgblack@eecs.umich.edu return new Umaal(machInst, rdlo, rdhi, rn, rm); 3587161Sgblack@eecs.umich.edu } 3597161Sgblack@eecs.umich.edu break; 3607161Sgblack@eecs.umich.edu } 3617161Sgblack@eecs.umich.edu return new Unknown(machInst); 3627161Sgblack@eecs.umich.edu } 3637161Sgblack@eecs.umich.edu ''' 3647161Sgblack@eecs.umich.edu}}; 3657161Sgblack@eecs.umich.edu 3667161Sgblack@eecs.umich.edudef format ArmSignedMultiplies() {{ 3677161Sgblack@eecs.umich.edu decode_block = ''' 3687161Sgblack@eecs.umich.edu { 3697161Sgblack@eecs.umich.edu const uint32_t op1 = bits(machInst, 22, 20); 3707161Sgblack@eecs.umich.edu // This is 7-5 in the manual, but bit 5 is always ignored. 3717161Sgblack@eecs.umich.edu const uint32_t op2 = bits(machInst, 7, 6); 3727161Sgblack@eecs.umich.edu const bool aIsF = (bits(machInst, 15, 12) == 0xf); 3737161Sgblack@eecs.umich.edu const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 3747161Sgblack@eecs.umich.edu const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 3, 0); 3757161Sgblack@eecs.umich.edu const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 11, 8); 3767161Sgblack@eecs.umich.edu const IntRegIndex ra = (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 3777161Sgblack@eecs.umich.edu const bool m = bits(machInst, 5); 3787161Sgblack@eecs.umich.edu switch (op1) { 3797161Sgblack@eecs.umich.edu case 0x0: 3807161Sgblack@eecs.umich.edu if (op2 == 0) { 3817161Sgblack@eecs.umich.edu if (aIsF) { 3827161Sgblack@eecs.umich.edu if (m) { 3837162Sgblack@eecs.umich.edu return new SmuadxCc(machInst, rd, rn, rm); 3847161Sgblack@eecs.umich.edu } else { 3857162Sgblack@eecs.umich.edu return new SmuadCc(machInst, rd, rn, rm); 3867161Sgblack@eecs.umich.edu } 3877161Sgblack@eecs.umich.edu } else { 3887161Sgblack@eecs.umich.edu if (m) { 3897162Sgblack@eecs.umich.edu return new SmladxCc(machInst, rd, rn, rm, ra); 3907161Sgblack@eecs.umich.edu } else { 3917162Sgblack@eecs.umich.edu return new SmladCc(machInst, rd, rn, rm, ra); 3927161Sgblack@eecs.umich.edu } 3937161Sgblack@eecs.umich.edu } 3947161Sgblack@eecs.umich.edu } else if (op2 == 1) { 3957161Sgblack@eecs.umich.edu if (aIsF) { 3967161Sgblack@eecs.umich.edu if (m) { 3977162Sgblack@eecs.umich.edu return new Smusdx(machInst, rd, rn, rm); 3987161Sgblack@eecs.umich.edu } else { 3997162Sgblack@eecs.umich.edu return new Smusd(machInst, rd, rn, rm); 4007161Sgblack@eecs.umich.edu } 4017161Sgblack@eecs.umich.edu } else { 4027161Sgblack@eecs.umich.edu if (m) { 4037162Sgblack@eecs.umich.edu return new SmlsdxCc(machInst, rd, rn, rm, ra); 4047161Sgblack@eecs.umich.edu } else { 4057162Sgblack@eecs.umich.edu return new SmlsdCc(machInst, rd, rn, rm, ra); 4067161Sgblack@eecs.umich.edu } 4077161Sgblack@eecs.umich.edu } 4087161Sgblack@eecs.umich.edu } 4097161Sgblack@eecs.umich.edu break; 4108520SAli.Saidi@ARM.com case 0x1: 4118520SAli.Saidi@ARM.com if (op2 == 0 && m == 0 && ra == 0xf) { 4128520SAli.Saidi@ARM.com return new Sdiv(machInst, rd, rn, rm); 4138520SAli.Saidi@ARM.com } 4148520SAli.Saidi@ARM.com break; 4158520SAli.Saidi@ARM.com case 0x3: 4168520SAli.Saidi@ARM.com if (op2 == 0 && m == 0 && ra == 0xf) { 4178520SAli.Saidi@ARM.com return new Udiv(machInst, rd, rn, rm); 4188520SAli.Saidi@ARM.com } 4198520SAli.Saidi@ARM.com break; 4207161Sgblack@eecs.umich.edu case 0x4: 4217161Sgblack@eecs.umich.edu if (op2 == 0) { 4227161Sgblack@eecs.umich.edu if (m) { 4237162Sgblack@eecs.umich.edu return new Smlaldx(machInst, ra, rd, rn, rm); 4247161Sgblack@eecs.umich.edu } else { 4257162Sgblack@eecs.umich.edu return new Smlald(machInst, ra, rd, rn, rm); 4267161Sgblack@eecs.umich.edu } 4277161Sgblack@eecs.umich.edu } else if (op2 == 1) { 4287161Sgblack@eecs.umich.edu if (m) { 4297162Sgblack@eecs.umich.edu return new Smlsldx(machInst, ra, rd, rn, rm); 4307161Sgblack@eecs.umich.edu } else { 4317162Sgblack@eecs.umich.edu return new Smlsld(machInst, ra, rd, rn, rm); 4327161Sgblack@eecs.umich.edu } 4337161Sgblack@eecs.umich.edu } 4347161Sgblack@eecs.umich.edu break; 4357161Sgblack@eecs.umich.edu case 0x5: 4367161Sgblack@eecs.umich.edu if (op2 == 0) { 4377161Sgblack@eecs.umich.edu if (aIsF) { 4387161Sgblack@eecs.umich.edu if (m) { 4397162Sgblack@eecs.umich.edu return new Smmulr(machInst, rd, rn, rm); 4407161Sgblack@eecs.umich.edu } else { 4417162Sgblack@eecs.umich.edu return new Smmul(machInst, rd, rn, rm); 4427161Sgblack@eecs.umich.edu } 4437161Sgblack@eecs.umich.edu } else { 4447161Sgblack@eecs.umich.edu if (m) { 4457162Sgblack@eecs.umich.edu return new Smmlar(machInst, rd, rn, rm, ra); 4467161Sgblack@eecs.umich.edu } else { 4477162Sgblack@eecs.umich.edu return new Smmla(machInst, rd, rn, rm, ra); 4487161Sgblack@eecs.umich.edu } 4497161Sgblack@eecs.umich.edu } 4507161Sgblack@eecs.umich.edu } else if (op2 == 0x3) { 4517161Sgblack@eecs.umich.edu if (m) { 4527162Sgblack@eecs.umich.edu return new Smmlsr(machInst, rd, rn, rm, ra); 4537161Sgblack@eecs.umich.edu } else { 4547162Sgblack@eecs.umich.edu return new Smmls(machInst, rd, rn, rm, ra); 4557161Sgblack@eecs.umich.edu } 4567161Sgblack@eecs.umich.edu } 4577161Sgblack@eecs.umich.edu break; 4587161Sgblack@eecs.umich.edu default: 4597161Sgblack@eecs.umich.edu break; 4607161Sgblack@eecs.umich.edu } 4617161Sgblack@eecs.umich.edu return new Unknown(machInst); 4627161Sgblack@eecs.umich.edu } 4637161Sgblack@eecs.umich.edu ''' 4647161Sgblack@eecs.umich.edu}}; 465