mult.isa revision 7319
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 } 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: 1087162Sgblack@eecs.umich.edu return new SmlabbCc(machInst, rd, rn, rm, ra); 1097161Sgblack@eecs.umich.edu case 0x1: 1107162Sgblack@eecs.umich.edu return new SmlatbCc(machInst, rd, rn, rm, ra); 1117161Sgblack@eecs.umich.edu case 0x2: 1127162Sgblack@eecs.umich.edu return new SmlabtCc(machInst, rd, rn, rm, ra); 1137161Sgblack@eecs.umich.edu case 0x3: 1147162Sgblack@eecs.umich.edu return new SmlattCc(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)) { 1197162Sgblack@eecs.umich.edu return new Smulwt(machInst, rd, rn, rm); 1207161Sgblack@eecs.umich.edu } else { 1217162Sgblack@eecs.umich.edu return new Smulwb(machInst, rd, rn, rm); 1227161Sgblack@eecs.umich.edu } 1237161Sgblack@eecs.umich.edu } else { 1247161Sgblack@eecs.umich.edu if (bits(machInst, 6)) { 1257162Sgblack@eecs.umich.edu return new SmlawtCc(machInst, rd, rn, rm, ra); 1267161Sgblack@eecs.umich.edu } else { 1277162Sgblack@eecs.umich.edu return new SmlawbCc(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: 1337162Sgblack@eecs.umich.edu return new Smlalbb(machInst, ra, rd, rn, rm); 1347161Sgblack@eecs.umich.edu case 0x1: 1357162Sgblack@eecs.umich.edu return new Smlaltb(machInst, ra, rd, rn, rm); 1367161Sgblack@eecs.umich.edu case 0x2: 1377162Sgblack@eecs.umich.edu return new Smlalbt(machInst, ra, rd, rn, rm); 1387161Sgblack@eecs.umich.edu case 0x3: 1397162Sgblack@eecs.umich.edu return new Smlaltt(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: 1447162Sgblack@eecs.umich.edu return new Smulbb(machInst, rd, rn, rm); 1457161Sgblack@eecs.umich.edu case 0x1: 1467162Sgblack@eecs.umich.edu return new Smultb(machInst, rd, rn, rm); 1477161Sgblack@eecs.umich.edu case 0x2: 1487162Sgblack@eecs.umich.edu return new Smulbt(machInst, rd, rn, rm); 1497161Sgblack@eecs.umich.edu case 0x3: 1507162Sgblack@eecs.umich.edu return new Smultt(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) { 1737162Sgblack@eecs.umich.edu return new Mul(machInst, rd, rn, rm); 1747161Sgblack@eecs.umich.edu } else { 1757162Sgblack@eecs.umich.edu return new Mla(machInst, rd, rn, rm, ra); 1767161Sgblack@eecs.umich.edu } 1777161Sgblack@eecs.umich.edu } else { 1787162Sgblack@eecs.umich.edu return new Mls(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: 1847162Sgblack@eecs.umich.edu return new Smulbb(machInst, rd, rn, rm); 1857161Sgblack@eecs.umich.edu case 0x1: 1867162Sgblack@eecs.umich.edu return new Smulbt(machInst, rd, rn, rm); 1877161Sgblack@eecs.umich.edu case 0x2: 1887162Sgblack@eecs.umich.edu return new Smultb(machInst, rd, rn, rm); 1897161Sgblack@eecs.umich.edu case 0x3: 1907162Sgblack@eecs.umich.edu return new Smultt(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: 1957162Sgblack@eecs.umich.edu return new SmlabbCc(machInst, rd, rn, rm, ra); 1967161Sgblack@eecs.umich.edu case 0x1: 1977162Sgblack@eecs.umich.edu return new SmlabtCc(machInst, rd, rn, rm, ra); 1987161Sgblack@eecs.umich.edu case 0x2: 1997162Sgblack@eecs.umich.edu return new SmlatbCc(machInst, rd, rn, rm, ra); 2007161Sgblack@eecs.umich.edu case 0x3: 2017162Sgblack@eecs.umich.edu return new SmlattCc(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)) { 2077162Sgblack@eecs.umich.edu return new SmuadxCc(machInst, rd, rn, rm); 2087161Sgblack@eecs.umich.edu } else { 2097162Sgblack@eecs.umich.edu return new SmuadCc(machInst, rd, rn, rm); 2107161Sgblack@eecs.umich.edu } 2117161Sgblack@eecs.umich.edu } else { 2127161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2137162Sgblack@eecs.umich.edu return new SmladxCc(machInst, rd, rn, rm, ra); 2147161Sgblack@eecs.umich.edu } else { 2157162Sgblack@eecs.umich.edu return new SmladCc(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)) { 2217162Sgblack@eecs.umich.edu return new Smulwt(machInst, rd, rn, rm); 2227161Sgblack@eecs.umich.edu } else { 2237162Sgblack@eecs.umich.edu return new Smulwb(machInst, rd, rn, rm); 2247161Sgblack@eecs.umich.edu } 2257161Sgblack@eecs.umich.edu } else { 2267161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2277162Sgblack@eecs.umich.edu return new SmlawtCc(machInst, rd, rn, rm, ra); 2287161Sgblack@eecs.umich.edu } else { 2297162Sgblack@eecs.umich.edu return new SmlawbCc(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)) { 2357162Sgblack@eecs.umich.edu return new Smusdx(machInst, rd, rn, rm); 2367161Sgblack@eecs.umich.edu } else { 2377162Sgblack@eecs.umich.edu return new Smusd(machInst, rd, rn, rm); 2387161Sgblack@eecs.umich.edu } 2397161Sgblack@eecs.umich.edu } else { 2407161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2417162Sgblack@eecs.umich.edu return new SmlsdxCc(machInst, rd, rn, rm, ra); 2427161Sgblack@eecs.umich.edu } else { 2437162Sgblack@eecs.umich.edu return new SmlsdCc(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)) { 2497162Sgblack@eecs.umich.edu return new Smmulr(machInst, rd, rn, rm); 2507161Sgblack@eecs.umich.edu } else { 2517162Sgblack@eecs.umich.edu return new Smmul(machInst, rd, rn, rm); 2527161Sgblack@eecs.umich.edu } 2537161Sgblack@eecs.umich.edu } else { 2547161Sgblack@eecs.umich.edu if (bits(machInst, 4)) { 2557162Sgblack@eecs.umich.edu return new Smmlar(machInst, rd, rn, rm, ra); 2567161Sgblack@eecs.umich.edu } else { 2577162Sgblack@eecs.umich.edu return new Smmla(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)) { 2627162Sgblack@eecs.umich.edu return new Smmlsr(machInst, rd, rn, rm, ra); 2637161Sgblack@eecs.umich.edu } else { 2647162Sgblack@eecs.umich.edu return new Smmls(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) { 2707243Sgblack@eecs.umich.edu return new Usad8(machInst, rd, rn, rm); 2717161Sgblack@eecs.umich.edu } else { 2727243Sgblack@eecs.umich.edu return new Usada8(machInst, rd, rn, rm, ra); 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) { 2917162Sgblack@eecs.umich.edu return new Smull(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) { 2967318Sgblack@eecs.umich.edu return new Sdiv(machInst, rdhi, rn, rm); 2977161Sgblack@eecs.umich.edu } 2987161Sgblack@eecs.umich.edu break; 2997161Sgblack@eecs.umich.edu case 0x2: 3007161Sgblack@eecs.umich.edu if (op2 == 0x0) { 3017162Sgblack@eecs.umich.edu return new Umull(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) { 3067319Sgblack@eecs.umich.edu return new Udiv(machInst, rdhi, rn, rm); 3077161Sgblack@eecs.umich.edu } 3087161Sgblack@eecs.umich.edu break; 3097161Sgblack@eecs.umich.edu case 0x4: 3107161Sgblack@eecs.umich.edu if (op2 == 0) { 3117162Sgblack@eecs.umich.edu return new Smlal(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: 3157162Sgblack@eecs.umich.edu return new Smlalbb(machInst, rdlo, rdhi, rn, rm); 3167161Sgblack@eecs.umich.edu case 0x1: 3177162Sgblack@eecs.umich.edu return new Smlalbt(machInst, rdlo, rdhi, rn, rm); 3187161Sgblack@eecs.umich.edu case 0x2: 3197162Sgblack@eecs.umich.edu return new Smlaltb(machInst, rdlo, rdhi, rn, rm); 3207161Sgblack@eecs.umich.edu case 0x3: 3217162Sgblack@eecs.umich.edu return new Smlaltt(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)) { 3257162Sgblack@eecs.umich.edu return new Smlaldx(machInst, rdlo, rdhi, rn, rm); 3267161Sgblack@eecs.umich.edu } else { 3277162Sgblack@eecs.umich.edu return new Smlald(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)) { 3347162Sgblack@eecs.umich.edu return new Smlsldx(machInst, rdlo, rdhi, rn, rm); 3357161Sgblack@eecs.umich.edu } else { 3367162Sgblack@eecs.umich.edu return new Smlsld(machInst, rdlo, rdhi, rn, rm); 3377161Sgblack@eecs.umich.edu } 3387161Sgblack@eecs.umich.edu } 3397290Sgblack@eecs.umich.edu break; 3407161Sgblack@eecs.umich.edu case 0x6: 3417161Sgblack@eecs.umich.edu if (op2 == 0) { 3427162Sgblack@eecs.umich.edu return new Umlal(machInst, rdlo, rdhi, rn, rm); 3437161Sgblack@eecs.umich.edu } else if (op2 == 0x6) { 3447162Sgblack@eecs.umich.edu return new Umaal(machInst, rdlo, rdhi, rn, rm); 3457161Sgblack@eecs.umich.edu } 3467161Sgblack@eecs.umich.edu break; 3477161Sgblack@eecs.umich.edu } 3487161Sgblack@eecs.umich.edu return new Unknown(machInst); 3497161Sgblack@eecs.umich.edu } 3507161Sgblack@eecs.umich.edu ''' 3517161Sgblack@eecs.umich.edu}}; 3527161Sgblack@eecs.umich.edu 3537161Sgblack@eecs.umich.edudef format ArmSignedMultiplies() {{ 3547161Sgblack@eecs.umich.edu decode_block = ''' 3557161Sgblack@eecs.umich.edu { 3567161Sgblack@eecs.umich.edu const uint32_t op1 = bits(machInst, 22, 20); 3577161Sgblack@eecs.umich.edu // This is 7-5 in the manual, but bit 5 is always ignored. 3587161Sgblack@eecs.umich.edu const uint32_t op2 = bits(machInst, 7, 6); 3597161Sgblack@eecs.umich.edu const bool aIsF = (bits(machInst, 15, 12) == 0xf); 3607161Sgblack@eecs.umich.edu const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 3617161Sgblack@eecs.umich.edu const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 3, 0); 3627161Sgblack@eecs.umich.edu const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 11, 8); 3637161Sgblack@eecs.umich.edu const IntRegIndex ra = (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 3647161Sgblack@eecs.umich.edu const bool m = bits(machInst, 5); 3657161Sgblack@eecs.umich.edu switch (op1) { 3667161Sgblack@eecs.umich.edu case 0x0: 3677161Sgblack@eecs.umich.edu if (op2 == 0) { 3687161Sgblack@eecs.umich.edu if (aIsF) { 3697161Sgblack@eecs.umich.edu if (m) { 3707162Sgblack@eecs.umich.edu return new SmuadxCc(machInst, rd, rn, rm); 3717161Sgblack@eecs.umich.edu } else { 3727162Sgblack@eecs.umich.edu return new SmuadCc(machInst, rd, rn, rm); 3737161Sgblack@eecs.umich.edu } 3747161Sgblack@eecs.umich.edu } else { 3757161Sgblack@eecs.umich.edu if (m) { 3767162Sgblack@eecs.umich.edu return new SmladxCc(machInst, rd, rn, rm, ra); 3777161Sgblack@eecs.umich.edu } else { 3787162Sgblack@eecs.umich.edu return new SmladCc(machInst, rd, rn, rm, ra); 3797161Sgblack@eecs.umich.edu } 3807161Sgblack@eecs.umich.edu } 3817161Sgblack@eecs.umich.edu } else if (op2 == 1) { 3827161Sgblack@eecs.umich.edu if (aIsF) { 3837161Sgblack@eecs.umich.edu if (m) { 3847162Sgblack@eecs.umich.edu return new Smusdx(machInst, rd, rn, rm); 3857161Sgblack@eecs.umich.edu } else { 3867162Sgblack@eecs.umich.edu return new Smusd(machInst, rd, rn, rm); 3877161Sgblack@eecs.umich.edu } 3887161Sgblack@eecs.umich.edu } else { 3897161Sgblack@eecs.umich.edu if (m) { 3907162Sgblack@eecs.umich.edu return new SmlsdxCc(machInst, rd, rn, rm, ra); 3917161Sgblack@eecs.umich.edu } else { 3927162Sgblack@eecs.umich.edu return new SmlsdCc(machInst, rd, rn, rm, ra); 3937161Sgblack@eecs.umich.edu } 3947161Sgblack@eecs.umich.edu } 3957161Sgblack@eecs.umich.edu } 3967161Sgblack@eecs.umich.edu break; 3977161Sgblack@eecs.umich.edu case 0x4: 3987161Sgblack@eecs.umich.edu if (op2 == 0) { 3997161Sgblack@eecs.umich.edu if (m) { 4007162Sgblack@eecs.umich.edu return new Smlaldx(machInst, ra, rd, rn, rm); 4017161Sgblack@eecs.umich.edu } else { 4027162Sgblack@eecs.umich.edu return new Smlald(machInst, ra, rd, rn, rm); 4037161Sgblack@eecs.umich.edu } 4047161Sgblack@eecs.umich.edu } else if (op2 == 1) { 4057161Sgblack@eecs.umich.edu if (m) { 4067162Sgblack@eecs.umich.edu return new Smlsldx(machInst, ra, rd, rn, rm); 4077161Sgblack@eecs.umich.edu } else { 4087162Sgblack@eecs.umich.edu return new Smlsld(machInst, ra, rd, rn, rm); 4097161Sgblack@eecs.umich.edu } 4107161Sgblack@eecs.umich.edu } 4117161Sgblack@eecs.umich.edu break; 4127161Sgblack@eecs.umich.edu case 0x5: 4137161Sgblack@eecs.umich.edu if (op2 == 0) { 4147161Sgblack@eecs.umich.edu if (aIsF) { 4157161Sgblack@eecs.umich.edu if (m) { 4167162Sgblack@eecs.umich.edu return new Smmulr(machInst, rd, rn, rm); 4177161Sgblack@eecs.umich.edu } else { 4187162Sgblack@eecs.umich.edu return new Smmul(machInst, rd, rn, rm); 4197161Sgblack@eecs.umich.edu } 4207161Sgblack@eecs.umich.edu } else { 4217161Sgblack@eecs.umich.edu if (m) { 4227162Sgblack@eecs.umich.edu return new Smmlar(machInst, rd, rn, rm, ra); 4237161Sgblack@eecs.umich.edu } else { 4247162Sgblack@eecs.umich.edu return new Smmla(machInst, rd, rn, rm, ra); 4257161Sgblack@eecs.umich.edu } 4267161Sgblack@eecs.umich.edu } 4277161Sgblack@eecs.umich.edu } else if (op2 == 0x3) { 4287161Sgblack@eecs.umich.edu if (m) { 4297162Sgblack@eecs.umich.edu return new Smmlsr(machInst, rd, rn, rm, ra); 4307161Sgblack@eecs.umich.edu } else { 4317162Sgblack@eecs.umich.edu return new Smmls(machInst, rd, rn, rm, ra); 4327161Sgblack@eecs.umich.edu } 4337161Sgblack@eecs.umich.edu } 4347161Sgblack@eecs.umich.edu break; 4357161Sgblack@eecs.umich.edu default: 4367161Sgblack@eecs.umich.edu break; 4377161Sgblack@eecs.umich.edu } 4387161Sgblack@eecs.umich.edu return new Unknown(machInst); 4397161Sgblack@eecs.umich.edu } 4407161Sgblack@eecs.umich.edu ''' 4417161Sgblack@eecs.umich.edu}}; 442