mult.isa revision 7161
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) { 527161Sgblack@eecs.umich.edu return new NewMulCc(machInst, rd, rm, rn); 537161Sgblack@eecs.umich.edu } else { 547161Sgblack@eecs.umich.edu return new NewMul(machInst, rd, rm, rn); 557161Sgblack@eecs.umich.edu } 567161Sgblack@eecs.umich.edu case 0x1: 577161Sgblack@eecs.umich.edu if (s) { 587161Sgblack@eecs.umich.edu return new NewMlaCc(machInst, rd, rn, rm, ra); 597161Sgblack@eecs.umich.edu } else { 607161Sgblack@eecs.umich.edu return new NewMla(machInst, rd, rn, rm, ra); 617161Sgblack@eecs.umich.edu } 627161Sgblack@eecs.umich.edu case 0x2: 637161Sgblack@eecs.umich.edu return new NewUmaal(machInst, ra, rd, rn, rm); 647161Sgblack@eecs.umich.edu case 0x3: 657161Sgblack@eecs.umich.edu return new NewMls(machInst, rd, rn, rm, ra); 667161Sgblack@eecs.umich.edu case 0x4: 677161Sgblack@eecs.umich.edu if (s) { 687161Sgblack@eecs.umich.edu return new NewUmullCc(machInst, ra, rd, rn, rm); 697161Sgblack@eecs.umich.edu } else { 707161Sgblack@eecs.umich.edu return new NewUmull(machInst, ra, rd, rn, rm); 717161Sgblack@eecs.umich.edu } 727161Sgblack@eecs.umich.edu case 0x5: 737161Sgblack@eecs.umich.edu if (s) { 747161Sgblack@eecs.umich.edu return new NewUmlalCc(machInst, ra, rd, rn, rm); 757161Sgblack@eecs.umich.edu } else { 767161Sgblack@eecs.umich.edu return new NewUmlal(machInst, ra, rd, rn, rm); 777161Sgblack@eecs.umich.edu } 787161Sgblack@eecs.umich.edu case 0x6: 797161Sgblack@eecs.umich.edu if (s) { 807161Sgblack@eecs.umich.edu return new NewSmullCc(machInst, ra, rd, rn, rm); 817161Sgblack@eecs.umich.edu } else { 827161Sgblack@eecs.umich.edu return new NewSmull(machInst, ra, rd, rn, rm); 837161Sgblack@eecs.umich.edu } 847161Sgblack@eecs.umich.edu case 0x7: 857161Sgblack@eecs.umich.edu if (s) { 867161Sgblack@eecs.umich.edu return new NewSmlalCc(machInst, ra, rd, rn, rm); 877161Sgblack@eecs.umich.edu } else { 887161Sgblack@eecs.umich.edu return new NewSmlal(machInst, ra, rd, rn, rm); 897161Sgblack@eecs.umich.edu } 907161Sgblack@eecs.umich.edu } 917161Sgblack@eecs.umich.edu } 927161Sgblack@eecs.umich.edu ''' 937161Sgblack@eecs.umich.edu}}; 947161Sgblack@eecs.umich.edu 957161Sgblack@eecs.umich.edudef format ArmHalfWordMultAndMultAcc() {{ 967161Sgblack@eecs.umich.edu decode_block = ''' 977161Sgblack@eecs.umich.edu { 987161Sgblack@eecs.umich.edu const uint32_t op1 = bits(machInst, 22, 21); 997161Sgblack@eecs.umich.edu const bool op = bits(machInst, 5); 1007161Sgblack@eecs.umich.edu const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 1017161Sgblack@eecs.umich.edu const IntRegIndex ra = (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 1027161Sgblack@eecs.umich.edu const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 11, 8); 1037161Sgblack@eecs.umich.edu const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 3, 0); 1047161Sgblack@eecs.umich.edu switch (op1) { 1057161Sgblack@eecs.umich.edu case 0x0: 1067161Sgblack@eecs.umich.edu switch (bits(machInst, 6, 5)) { 1077161Sgblack@eecs.umich.edu case 0x0: 1087161Sgblack@eecs.umich.edu return new NewSmlabbCc(machInst, rd, rn, rm, ra); 1097161Sgblack@eecs.umich.edu case 0x1: 1107161Sgblack@eecs.umich.edu return new NewSmlatbCc(machInst, rd, rn, rm, ra); 1117161Sgblack@eecs.umich.edu case 0x2: 1127161Sgblack@eecs.umich.edu return new NewSmlabtCc(machInst, rd, rn, rm, ra); 1137161Sgblack@eecs.umich.edu case 0x3: 1147161Sgblack@eecs.umich.edu return new NewSmlattCc(machInst, rd, rn, rm, ra); 1157161Sgblack@eecs.umich.edu } 1167161Sgblack@eecs.umich.edu case 0x1: 1177161Sgblack@eecs.umich.edu if (op) { 1187161Sgblack@eecs.umich.edu if (bits(machInst, 6)) { 1197161Sgblack@eecs.umich.edu return new NewSmulwt(machInst, rd, rn, rm); 1207161Sgblack@eecs.umich.edu } else { 1217161Sgblack@eecs.umich.edu return new NewSmulwb(machInst, rd, rn, rm); 1227161Sgblack@eecs.umich.edu } 1237161Sgblack@eecs.umich.edu } else { 1247161Sgblack@eecs.umich.edu if (bits(machInst, 6)) { 1257161Sgblack@eecs.umich.edu return new NewSmlawtCc(machInst, rd, rn, rm, ra); 1267161Sgblack@eecs.umich.edu } else { 1277161Sgblack@eecs.umich.edu return new NewSmlawbCc(machInst, rd, rn, rm, ra); 1287161Sgblack@eecs.umich.edu } 1297161Sgblack@eecs.umich.edu } 1307161Sgblack@eecs.umich.edu case 0x2: 1317161Sgblack@eecs.umich.edu switch (bits(machInst, 6, 5)) { 1327161Sgblack@eecs.umich.edu case 0x0: 1337161Sgblack@eecs.umich.edu return new NewSmlalbb(machInst, ra, rd, rn, rm); 1347161Sgblack@eecs.umich.edu case 0x1: 1357161Sgblack@eecs.umich.edu return new NewSmlaltb(machInst, ra, rd, rn, rm); 1367161Sgblack@eecs.umich.edu case 0x2: 1377161Sgblack@eecs.umich.edu return new NewSmlalbt(machInst, ra, rd, rn, rm); 1387161Sgblack@eecs.umich.edu case 0x3: 1397161Sgblack@eecs.umich.edu return new NewSmlaltt(machInst, ra, rd, rn, rm); 1407161Sgblack@eecs.umich.edu } 1417161Sgblack@eecs.umich.edu case 0x3: 1427161Sgblack@eecs.umich.edu switch (bits(machInst, 6, 5)) { 1437161Sgblack@eecs.umich.edu case 0x0: 1447161Sgblack@eecs.umich.edu return new NewSmulbb(machInst, rd, rn, rm); 1457161Sgblack@eecs.umich.edu case 0x1: 1467161Sgblack@eecs.umich.edu return new NewSmultb(machInst, rd, rn, rm); 1477161Sgblack@eecs.umich.edu case 0x2: 1487161Sgblack@eecs.umich.edu return new NewSmulbt(machInst, rd, rn, rm); 1497161Sgblack@eecs.umich.edu case 0x3: 1507161Sgblack@eecs.umich.edu return new NewSmultt(machInst, rd, rn, rm); 1517161Sgblack@eecs.umich.edu } 1527161Sgblack@eecs.umich.edu } 1537161Sgblack@eecs.umich.edu } 1547161Sgblack@eecs.umich.edu ''' 1557161Sgblack@eecs.umich.edu}}; 1567161Sgblack@eecs.umich.edu 1577161Sgblack@eecs.umich.edudef format Thumb32MulMulAccAndAbsDiff() {{ 1587161Sgblack@eecs.umich.edu decode_block = ''' 1597161Sgblack@eecs.umich.edu { 1607161Sgblack@eecs.umich.edu const uint32_t op1 = bits(machInst, 22, 20); 1617161Sgblack@eecs.umich.edu const uint32_t op2 = bits(machInst, 5, 4); 1627161Sgblack@eecs.umich.edu const IntRegIndex ra = (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 1637161Sgblack@eecs.umich.edu const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 1647161Sgblack@eecs.umich.edu const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 11, 8); 1657161Sgblack@eecs.umich.edu const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 3, 0); 1667161Sgblack@eecs.umich.edu if (op1 != 0x1 && bits(op2, 1) != 0) { 1677161Sgblack@eecs.umich.edu return new Unknown(machInst); 1687161Sgblack@eecs.umich.edu } 1697161Sgblack@eecs.umich.edu switch (op1) { 1707161Sgblack@eecs.umich.edu case 0x0: 1717161Sgblack@eecs.umich.edu if (op2 == 0) { 1727161Sgblack@eecs.umich.edu if (ra == 0xf) { 1737161Sgblack@eecs.umich.edu return new NewMul(machInst, rd, rn, rm); 1747161Sgblack@eecs.umich.edu } else { 1757161Sgblack@eecs.umich.edu return new NewMla(machInst, rd, rn, rm, ra); 1767161Sgblack@eecs.umich.edu } 1777161Sgblack@eecs.umich.edu } else { 1787161Sgblack@eecs.umich.edu return new NewMls(machInst, rd, rn, rm, ra); 1797161Sgblack@eecs.umich.edu } 1807161Sgblack@eecs.umich.edu case 0x1: 1817161Sgblack@eecs.umich.edu if (ra == 0xf) { 1827161Sgblack@eecs.umich.edu switch (bits(machInst, 5, 4)) { 1837161Sgblack@eecs.umich.edu case 0x0: 1847161Sgblack@eecs.umich.edu return new NewSmulbb(machInst, rd, rn, rm); 1857161Sgblack@eecs.umich.edu case 0x1: 1867161Sgblack@eecs.umich.edu return new NewSmulbt(machInst, rd, rn, rm); 1877161Sgblack@eecs.umich.edu case 0x2: 1887161Sgblack@eecs.umich.edu return new NewSmultb(machInst, rd, rn, rm); 1897161Sgblack@eecs.umich.edu case 0x3: 1907161Sgblack@eecs.umich.edu return new NewSmultt(machInst, rd, rn, rm); 1917161Sgblack@eecs.umich.edu } 1927161Sgblack@eecs.umich.edu } else { 1937161Sgblack@eecs.umich.edu switch (bits(machInst, 5, 4)) { 1947161Sgblack@eecs.umich.edu case 0x0: 1957161Sgblack@eecs.umich.edu return new NewSmlabbCc(machInst, rd, rn, rm, ra); 1967161Sgblack@eecs.umich.edu case 0x1: 1977161Sgblack@eecs.umich.edu return new NewSmlabtCc(machInst, rd, rn, rm, ra); 1987161Sgblack@eecs.umich.edu case 0x2: 1997161Sgblack@eecs.umich.edu return new NewSmlatbCc(machInst, rd, rn, rm, ra); 2007161Sgblack@eecs.umich.edu case 0x3: 2017161Sgblack@eecs.umich.edu return new NewSmlattCc(machInst, rd, rn, rm, ra); 2027161Sgblack@eecs.umich.edu } 2037161Sgblack@eecs.umich.edu } 2047161Sgblack@eecs.umich.edu case 0x2: 2057161Sgblack@eecs.umich.edu if (ra == 0xf) { 2067161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2077161Sgblack@eecs.umich.edu return new NewSmuadxCc(machInst, rd, rn, rm); 2087161Sgblack@eecs.umich.edu } else { 2097161Sgblack@eecs.umich.edu return new NewSmuadCc(machInst, rd, rn, rm); 2107161Sgblack@eecs.umich.edu } 2117161Sgblack@eecs.umich.edu } else { 2127161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2137161Sgblack@eecs.umich.edu return new NewSmladxCc(machInst, rd, rn, rm, ra); 2147161Sgblack@eecs.umich.edu } else { 2157161Sgblack@eecs.umich.edu return new NewSmladCc(machInst, rd, rn, rm, ra); 2167161Sgblack@eecs.umich.edu } 2177161Sgblack@eecs.umich.edu } 2187161Sgblack@eecs.umich.edu case 0x3: 2197161Sgblack@eecs.umich.edu if (ra == 0xf) { 2207161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2217161Sgblack@eecs.umich.edu return new NewSmulwt(machInst, rd, rn, rm); 2227161Sgblack@eecs.umich.edu } else { 2237161Sgblack@eecs.umich.edu return new NewSmulwb(machInst, rd, rn, rm); 2247161Sgblack@eecs.umich.edu } 2257161Sgblack@eecs.umich.edu } else { 2267161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2277161Sgblack@eecs.umich.edu return new NewSmlawtCc(machInst, rd, rn, rm, ra); 2287161Sgblack@eecs.umich.edu } else { 2297161Sgblack@eecs.umich.edu return new NewSmlawbCc(machInst, rd, rn, rm, ra); 2307161Sgblack@eecs.umich.edu } 2317161Sgblack@eecs.umich.edu } 2327161Sgblack@eecs.umich.edu case 0x4: 2337161Sgblack@eecs.umich.edu if (ra == 0xf) { 2347161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2357161Sgblack@eecs.umich.edu return new NewSmusdx(machInst, rd, rn, rm); 2367161Sgblack@eecs.umich.edu } else { 2377161Sgblack@eecs.umich.edu return new NewSmusd(machInst, rd, rn, rm); 2387161Sgblack@eecs.umich.edu } 2397161Sgblack@eecs.umich.edu } else { 2407161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2417161Sgblack@eecs.umich.edu return new NewSmlsdxCc(machInst, rd, rn, rm, ra); 2427161Sgblack@eecs.umich.edu } else { 2437161Sgblack@eecs.umich.edu return new NewSmlsdCc(machInst, rd, rn, rm, ra); 2447161Sgblack@eecs.umich.edu } 2457161Sgblack@eecs.umich.edu } 2467161Sgblack@eecs.umich.edu case 0x5: 2477161Sgblack@eecs.umich.edu if (ra == 0xf) { 2487161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2497161Sgblack@eecs.umich.edu return new NewSmmulr(machInst, rd, rn, rm); 2507161Sgblack@eecs.umich.edu } else { 2517161Sgblack@eecs.umich.edu return new NewSmmul(machInst, rd, rn, rm); 2527161Sgblack@eecs.umich.edu } 2537161Sgblack@eecs.umich.edu } else { 2547161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2557161Sgblack@eecs.umich.edu return new NewSmmlar(machInst, rd, rn, rm, ra); 2567161Sgblack@eecs.umich.edu } else { 2577161Sgblack@eecs.umich.edu return new NewSmmla(machInst, rd, rn, rm, ra); 2587161Sgblack@eecs.umich.edu } 2597161Sgblack@eecs.umich.edu } 2607161Sgblack@eecs.umich.edu case 0x6: 2617161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2627161Sgblack@eecs.umich.edu return new NewSmmlsr(machInst, rd, rn, rm, ra); 2637161Sgblack@eecs.umich.edu } else { 2647161Sgblack@eecs.umich.edu return new NewSmmls(machInst, rd, rn, rm, ra); 2657161Sgblack@eecs.umich.edu } 2667161Sgblack@eecs.umich.edu case 0x7: 2677161Sgblack@eecs.umich.edu if (op2 != 0x0) { 2687161Sgblack@eecs.umich.edu return new Unknown(machInst); 2697161Sgblack@eecs.umich.edu } else if (ra == 0xf) { 2707161Sgblack@eecs.umich.edu return new WarnUnimplemented("usada8", machInst); 2717161Sgblack@eecs.umich.edu } else { 2727161Sgblack@eecs.umich.edu return new WarnUnimplemented("usad8", machInst); 2737161Sgblack@eecs.umich.edu } 2747161Sgblack@eecs.umich.edu } 2757161Sgblack@eecs.umich.edu } 2767161Sgblack@eecs.umich.edu ''' 2777161Sgblack@eecs.umich.edu}}; 2787161Sgblack@eecs.umich.edu 2797161Sgblack@eecs.umich.edudef format Thumb32LongMulMulAccAndDiv() {{ 2807161Sgblack@eecs.umich.edu decode_block = ''' 2817161Sgblack@eecs.umich.edu { 2827161Sgblack@eecs.umich.edu const uint32_t op1 = bits(machInst, 22, 20); 2837161Sgblack@eecs.umich.edu const uint32_t op2 = bits(machInst, 7, 4); 2847161Sgblack@eecs.umich.edu const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 2857161Sgblack@eecs.umich.edu const IntRegIndex rdlo = (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 2867161Sgblack@eecs.umich.edu const IntRegIndex rdhi = (IntRegIndex)(uint32_t)bits(machInst, 11, 8); 2877161Sgblack@eecs.umich.edu const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 3, 0); 2887161Sgblack@eecs.umich.edu switch (op1) { 2897161Sgblack@eecs.umich.edu case 0x0: 2907161Sgblack@eecs.umich.edu if (op2 == 0x0) { 2917161Sgblack@eecs.umich.edu return new NewSmull(machInst, rdlo, rdhi, rn, rm); 2927161Sgblack@eecs.umich.edu } 2937161Sgblack@eecs.umich.edu break; 2947161Sgblack@eecs.umich.edu case 0x1: 2957161Sgblack@eecs.umich.edu if (op2 == 0xf) { 2967161Sgblack@eecs.umich.edu return new WarnUnimplemented("sdiv", machInst); 2977161Sgblack@eecs.umich.edu } 2987161Sgblack@eecs.umich.edu break; 2997161Sgblack@eecs.umich.edu case 0x2: 3007161Sgblack@eecs.umich.edu if (op2 == 0x0) { 3017161Sgblack@eecs.umich.edu return new NewUmull(machInst, rdlo, rdhi, rn, rm); 3027161Sgblack@eecs.umich.edu } 3037161Sgblack@eecs.umich.edu break; 3047161Sgblack@eecs.umich.edu case 0x3: 3057161Sgblack@eecs.umich.edu if (op2 == 0xf) { 3067161Sgblack@eecs.umich.edu return new WarnUnimplemented("udiv", machInst); 3077161Sgblack@eecs.umich.edu } 3087161Sgblack@eecs.umich.edu break; 3097161Sgblack@eecs.umich.edu case 0x4: 3107161Sgblack@eecs.umich.edu if (op2 == 0) { 3117161Sgblack@eecs.umich.edu return new NewSmlal(machInst, rdlo, rdhi, rn, rm); 3127161Sgblack@eecs.umich.edu } else if (bits(op2, 3, 2) == 0x2) { 3137161Sgblack@eecs.umich.edu switch (bits(machInst, 5, 4)) { 3147161Sgblack@eecs.umich.edu case 0x0: 3157161Sgblack@eecs.umich.edu return new NewSmlalbb(machInst, rdlo, rdhi, rn, rm); 3167161Sgblack@eecs.umich.edu case 0x1: 3177161Sgblack@eecs.umich.edu return new NewSmlalbt(machInst, rdlo, rdhi, rn, rm); 3187161Sgblack@eecs.umich.edu case 0x2: 3197161Sgblack@eecs.umich.edu return new NewSmlaltb(machInst, rdlo, rdhi, rn, rm); 3207161Sgblack@eecs.umich.edu case 0x3: 3217161Sgblack@eecs.umich.edu return new NewSmlaltt(machInst, rdlo, rdhi, rn, rm); 3227161Sgblack@eecs.umich.edu } 3237161Sgblack@eecs.umich.edu } else if (bits(op2, 3, 1) == 0x6) { 3247161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 3257161Sgblack@eecs.umich.edu return new NewSmlaldx(machInst, rdlo, rdhi, rn, rm); 3267161Sgblack@eecs.umich.edu } else { 3277161Sgblack@eecs.umich.edu return new NewSmlald(machInst, rdlo, rdhi, rn, rm); 3287161Sgblack@eecs.umich.edu } 3297161Sgblack@eecs.umich.edu } 3307161Sgblack@eecs.umich.edu break; 3317161Sgblack@eecs.umich.edu case 0x5: 3327161Sgblack@eecs.umich.edu if (bits(op2, 3, 1) == 0x6) { 3337161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 3347161Sgblack@eecs.umich.edu return new NewSmlsldx(machInst, rdlo, rdhi, rn, rm); 3357161Sgblack@eecs.umich.edu } else { 3367161Sgblack@eecs.umich.edu return new NewSmlsld(machInst, rdlo, rdhi, rn, rm); 3377161Sgblack@eecs.umich.edu } 3387161Sgblack@eecs.umich.edu } 3397161Sgblack@eecs.umich.edu case 0x6: 3407161Sgblack@eecs.umich.edu if (op2 == 0) { 3417161Sgblack@eecs.umich.edu return new NewUmlal(machInst, rdlo, rdhi, rn, rm); 3427161Sgblack@eecs.umich.edu } else if (op2 == 0x6) { 3437161Sgblack@eecs.umich.edu return new NewUmaal(machInst, rdlo, rdhi, rn, rm); 3447161Sgblack@eecs.umich.edu } 3457161Sgblack@eecs.umich.edu break; 3467161Sgblack@eecs.umich.edu } 3477161Sgblack@eecs.umich.edu return new Unknown(machInst); 3487161Sgblack@eecs.umich.edu } 3497161Sgblack@eecs.umich.edu ''' 3507161Sgblack@eecs.umich.edu}}; 3517161Sgblack@eecs.umich.edu 3527161Sgblack@eecs.umich.edudef format ArmSignedMultiplies() {{ 3537161Sgblack@eecs.umich.edu decode_block = ''' 3547161Sgblack@eecs.umich.edu { 3557161Sgblack@eecs.umich.edu const uint32_t op1 = bits(machInst, 22, 20); 3567161Sgblack@eecs.umich.edu // This is 7-5 in the manual, but bit 5 is always ignored. 3577161Sgblack@eecs.umich.edu const uint32_t op2 = bits(machInst, 7, 6); 3587161Sgblack@eecs.umich.edu const bool aIsF = (bits(machInst, 15, 12) == 0xf); 3597161Sgblack@eecs.umich.edu const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 3607161Sgblack@eecs.umich.edu const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 3, 0); 3617161Sgblack@eecs.umich.edu const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 11, 8); 3627161Sgblack@eecs.umich.edu const IntRegIndex ra = (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 3637161Sgblack@eecs.umich.edu const bool m = bits(machInst, 5); 3647161Sgblack@eecs.umich.edu switch (op1) { 3657161Sgblack@eecs.umich.edu case 0x0: 3667161Sgblack@eecs.umich.edu if (op2 == 0) { 3677161Sgblack@eecs.umich.edu if (aIsF) { 3687161Sgblack@eecs.umich.edu if (m) { 3697161Sgblack@eecs.umich.edu return new NewSmuadxCc(machInst, rd, rn, rm); 3707161Sgblack@eecs.umich.edu } else { 3717161Sgblack@eecs.umich.edu return new NewSmuadCc(machInst, rd, rn, rm); 3727161Sgblack@eecs.umich.edu } 3737161Sgblack@eecs.umich.edu } else { 3747161Sgblack@eecs.umich.edu if (m) { 3757161Sgblack@eecs.umich.edu return new NewSmladxCc(machInst, rd, rn, rm, ra); 3767161Sgblack@eecs.umich.edu } else { 3777161Sgblack@eecs.umich.edu return new NewSmladCc(machInst, rd, rn, rm, ra); 3787161Sgblack@eecs.umich.edu } 3797161Sgblack@eecs.umich.edu } 3807161Sgblack@eecs.umich.edu } else if (op2 == 1) { 3817161Sgblack@eecs.umich.edu if (aIsF) { 3827161Sgblack@eecs.umich.edu if (m) { 3837161Sgblack@eecs.umich.edu return new NewSmusdx(machInst, rd, rn, rm); 3847161Sgblack@eecs.umich.edu } else { 3857161Sgblack@eecs.umich.edu return new NewSmusd(machInst, rd, rn, rm); 3867161Sgblack@eecs.umich.edu } 3877161Sgblack@eecs.umich.edu } else { 3887161Sgblack@eecs.umich.edu if (m) { 3897161Sgblack@eecs.umich.edu return new NewSmlsdxCc(machInst, rd, rn, rm, ra); 3907161Sgblack@eecs.umich.edu } else { 3917161Sgblack@eecs.umich.edu return new NewSmlsdCc(machInst, rd, rn, rm, ra); 3927161Sgblack@eecs.umich.edu } 3937161Sgblack@eecs.umich.edu } 3947161Sgblack@eecs.umich.edu } 3957161Sgblack@eecs.umich.edu break; 3967161Sgblack@eecs.umich.edu case 0x4: 3977161Sgblack@eecs.umich.edu if (op2 == 0) { 3987161Sgblack@eecs.umich.edu if (m) { 3997161Sgblack@eecs.umich.edu return new NewSmlaldx(machInst, ra, rd, rn, rm); 4007161Sgblack@eecs.umich.edu } else { 4017161Sgblack@eecs.umich.edu return new NewSmlald(machInst, ra, rd, rn, rm); 4027161Sgblack@eecs.umich.edu } 4037161Sgblack@eecs.umich.edu } else if (op2 == 1) { 4047161Sgblack@eecs.umich.edu if (m) { 4057161Sgblack@eecs.umich.edu return new NewSmlsldx(machInst, ra, rd, rn, rm); 4067161Sgblack@eecs.umich.edu } else { 4077161Sgblack@eecs.umich.edu return new NewSmlsld(machInst, ra, rd, rn, rm); 4087161Sgblack@eecs.umich.edu } 4097161Sgblack@eecs.umich.edu } 4107161Sgblack@eecs.umich.edu break; 4117161Sgblack@eecs.umich.edu case 0x5: 4127161Sgblack@eecs.umich.edu if (op2 == 0) { 4137161Sgblack@eecs.umich.edu if (aIsF) { 4147161Sgblack@eecs.umich.edu if (m) { 4157161Sgblack@eecs.umich.edu return new NewSmmulr(machInst, rd, rn, rm); 4167161Sgblack@eecs.umich.edu } else { 4177161Sgblack@eecs.umich.edu return new NewSmmul(machInst, rd, rn, rm); 4187161Sgblack@eecs.umich.edu } 4197161Sgblack@eecs.umich.edu } else { 4207161Sgblack@eecs.umich.edu if (m) { 4217161Sgblack@eecs.umich.edu return new NewSmmlar(machInst, rd, rn, rm, ra); 4227161Sgblack@eecs.umich.edu } else { 4237161Sgblack@eecs.umich.edu return new NewSmmla(machInst, rd, rn, rm, ra); 4247161Sgblack@eecs.umich.edu } 4257161Sgblack@eecs.umich.edu } 4267161Sgblack@eecs.umich.edu } else if (op2 == 0x3) { 4277161Sgblack@eecs.umich.edu if (m) { 4287161Sgblack@eecs.umich.edu return new NewSmmlsr(machInst, rd, rn, rm, ra); 4297161Sgblack@eecs.umich.edu } else { 4307161Sgblack@eecs.umich.edu return new NewSmmls(machInst, rd, rn, rm, ra); 4317161Sgblack@eecs.umich.edu } 4327161Sgblack@eecs.umich.edu } 4337161Sgblack@eecs.umich.edu break; 4347161Sgblack@eecs.umich.edu default: 4357161Sgblack@eecs.umich.edu break; 4367161Sgblack@eecs.umich.edu } 4377161Sgblack@eecs.umich.edu return new Unknown(machInst); 4387161Sgblack@eecs.umich.edu } 4397161Sgblack@eecs.umich.edu ''' 4407161Sgblack@eecs.umich.edu}}; 441