fp.isa revision 7591
16019Shines@cs.fsu.edu// -*- mode:c++ -*- 26019Shines@cs.fsu.edu 37178Sgblack@eecs.umich.edu// Copyright (c) 2010 ARM Limited 47178Sgblack@eecs.umich.edu// All rights reserved 57178Sgblack@eecs.umich.edu// 67178Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall 77178Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual 87178Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating 97178Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software 107178Sgblack@eecs.umich.edu// licensed hereunder. You may use the software subject to the license 117178Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated 127178Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software, 137178Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form. 147178Sgblack@eecs.umich.edu// 156019Shines@cs.fsu.edu// Copyright (c) 2007-2008 The Florida State University 166019Shines@cs.fsu.edu// All rights reserved. 176019Shines@cs.fsu.edu// 186019Shines@cs.fsu.edu// Redistribution and use in source and binary forms, with or without 196019Shines@cs.fsu.edu// modification, are permitted provided that the following conditions are 206019Shines@cs.fsu.edu// met: redistributions of source code must retain the above copyright 216019Shines@cs.fsu.edu// notice, this list of conditions and the following disclaimer; 226019Shines@cs.fsu.edu// redistributions in binary form must reproduce the above copyright 236019Shines@cs.fsu.edu// notice, this list of conditions and the following disclaimer in the 246019Shines@cs.fsu.edu// documentation and/or other materials provided with the distribution; 256019Shines@cs.fsu.edu// neither the name of the copyright holders nor the names of its 266019Shines@cs.fsu.edu// contributors may be used to endorse or promote products derived from 276019Shines@cs.fsu.edu// this software without specific prior written permission. 286019Shines@cs.fsu.edu// 296019Shines@cs.fsu.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 306019Shines@cs.fsu.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 316019Shines@cs.fsu.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 326019Shines@cs.fsu.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 336019Shines@cs.fsu.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 346019Shines@cs.fsu.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 356019Shines@cs.fsu.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 366019Shines@cs.fsu.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 376019Shines@cs.fsu.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 386019Shines@cs.fsu.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 396019Shines@cs.fsu.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 406019Shines@cs.fsu.edu// 416019Shines@cs.fsu.edu// Authors: Stephen Hines 426019Shines@cs.fsu.edu 436019Shines@cs.fsu.edu//////////////////////////////////////////////////////////////////// 446019Shines@cs.fsu.edu// 456019Shines@cs.fsu.edu// Floating Point operate instructions 466019Shines@cs.fsu.edu// 476019Shines@cs.fsu.edu 487356Sgblack@eecs.umich.edulet {{ 497356Sgblack@eecs.umich.edu header_output = ''' 507356Sgblack@eecs.umich.edu StaticInstPtr 517435Sgblack@eecs.umich.edu decodeNeonMem(ExtMachInst machInst); 527435Sgblack@eecs.umich.edu 537435Sgblack@eecs.umich.edu StaticInstPtr 547435Sgblack@eecs.umich.edu decodeNeonData(ExtMachInst machInst); 557435Sgblack@eecs.umich.edu ''' 567435Sgblack@eecs.umich.edu 577435Sgblack@eecs.umich.edu decoder_output = ''' 587435Sgblack@eecs.umich.edu StaticInstPtr 597435Sgblack@eecs.umich.edu decodeNeonMem(ExtMachInst machInst) 607435Sgblack@eecs.umich.edu { 617435Sgblack@eecs.umich.edu const uint32_t b = bits(machInst, 11, 8); 627435Sgblack@eecs.umich.edu const bool a = bits(machInst, 23); 637435Sgblack@eecs.umich.edu const bool l = bits(machInst, 21); 647435Sgblack@eecs.umich.edu 657435Sgblack@eecs.umich.edu if (l) { 667435Sgblack@eecs.umich.edu // Load instructions. 677435Sgblack@eecs.umich.edu if (a) { 687591SAli.Saidi@ARM.com if (bits(b, 3, 2) != 3) { 697591SAli.Saidi@ARM.com switch (bits(b, 1, 0)) { 707591SAli.Saidi@ARM.com case 0x0: 717591SAli.Saidi@ARM.com return new WarnUnimplemented("vld1 single", machInst); 727591SAli.Saidi@ARM.com case 0x1: 737591SAli.Saidi@ARM.com return new WarnUnimplemented("vld2 single", machInst); 747591SAli.Saidi@ARM.com case 0x2: 757591SAli.Saidi@ARM.com return new WarnUnimplemented("vld3 single", machInst); 767591SAli.Saidi@ARM.com case 0x3: 777591SAli.Saidi@ARM.com return new WarnUnimplemented("vld4 single", machInst); 787591SAli.Saidi@ARM.com } 797591SAli.Saidi@ARM.com } else { 807591SAli.Saidi@ARM.com switch (bits(b, 1, 0)) { 817591SAli.Saidi@ARM.com case 0x0: 827591SAli.Saidi@ARM.com return new WarnUnimplemented("vld1 single all", 837591SAli.Saidi@ARM.com machInst); 847591SAli.Saidi@ARM.com case 0x1: 857591SAli.Saidi@ARM.com return new WarnUnimplemented("vld2 single all", 867591SAli.Saidi@ARM.com machInst); 877591SAli.Saidi@ARM.com case 0x2: 887591SAli.Saidi@ARM.com return new WarnUnimplemented("vld3 single all", 897591SAli.Saidi@ARM.com machInst); 907591SAli.Saidi@ARM.com case 0x3: 917591SAli.Saidi@ARM.com return new WarnUnimplemented("vld4 single all", 927591SAli.Saidi@ARM.com machInst); 937591SAli.Saidi@ARM.com } 947435Sgblack@eecs.umich.edu } 957435Sgblack@eecs.umich.edu } else { 967591SAli.Saidi@ARM.com switch (bits(b, 3, 1)) { 977591SAli.Saidi@ARM.com case 0x0: 987591SAli.Saidi@ARM.com return new WarnUnimplemented("vld4 multiple", machInst); 997591SAli.Saidi@ARM.com case 0x2: 1007591SAli.Saidi@ARM.com return new WarnUnimplemented("vld3 multiple", machInst); 1017591SAli.Saidi@ARM.com case 0x3: 1027591SAli.Saidi@ARM.com return new WarnUnimplemented("vld1 multiple", machInst); 1037591SAli.Saidi@ARM.com case 0x4: 1047591SAli.Saidi@ARM.com return new WarnUnimplemented("vld2 multiple", machInst); 1057591SAli.Saidi@ARM.com case 0x1: 1067591SAli.Saidi@ARM.com if (b & 0x1) { 1077591SAli.Saidi@ARM.com return new WarnUnimplemented("vld2 multiple", machInst); 1087591SAli.Saidi@ARM.com } else { 1097591SAli.Saidi@ARM.com return new WarnUnimplemented("vld1 multiple", machInst); 1107591SAli.Saidi@ARM.com } 1117591SAli.Saidi@ARM.com case 0x5: 1127591SAli.Saidi@ARM.com if ((b & 0x1) == 0) { 1137591SAli.Saidi@ARM.com return new WarnUnimplemented("vld1 multiple", machInst); 1147591SAli.Saidi@ARM.com } else { 1157591SAli.Saidi@ARM.com break; 1167591SAli.Saidi@ARM.com } 1177435Sgblack@eecs.umich.edu } 1187435Sgblack@eecs.umich.edu } 1197435Sgblack@eecs.umich.edu } else { 1207435Sgblack@eecs.umich.edu // Store instructions. 1217435Sgblack@eecs.umich.edu if (a) { 1227591SAli.Saidi@ARM.com if (bits(b, 3, 2) != 3) { 1237591SAli.Saidi@ARM.com switch (bits(b, 1, 0)) { 1247591SAli.Saidi@ARM.com case 0x0: 1257591SAli.Saidi@ARM.com return new WarnUnimplemented("vst1 single", machInst); 1267591SAli.Saidi@ARM.com case 0x1: 1277591SAli.Saidi@ARM.com return new WarnUnimplemented("vst2 single", machInst); 1287591SAli.Saidi@ARM.com case 0x2: 1297591SAli.Saidi@ARM.com return new WarnUnimplemented("vst3 single", machInst); 1307591SAli.Saidi@ARM.com case 0x3: 1317591SAli.Saidi@ARM.com return new WarnUnimplemented("vst4 single", machInst); 1327591SAli.Saidi@ARM.com } 1337591SAli.Saidi@ARM.com } else { 1347591SAli.Saidi@ARM.com switch (bits(b, 1, 0)) { 1357591SAli.Saidi@ARM.com case 0x0: 1367591SAli.Saidi@ARM.com return new WarnUnimplemented("vst1 single all", 1377591SAli.Saidi@ARM.com machInst); 1387591SAli.Saidi@ARM.com case 0x1: 1397591SAli.Saidi@ARM.com return new WarnUnimplemented("vst2 single all", 1407591SAli.Saidi@ARM.com machInst); 1417591SAli.Saidi@ARM.com case 0x2: 1427591SAli.Saidi@ARM.com return new WarnUnimplemented("vst3 single all", 1437591SAli.Saidi@ARM.com machInst); 1447591SAli.Saidi@ARM.com case 0x3: 1457591SAli.Saidi@ARM.com return new WarnUnimplemented("vst4 single all", 1467591SAli.Saidi@ARM.com machInst); 1477591SAli.Saidi@ARM.com } 1487435Sgblack@eecs.umich.edu } 1497435Sgblack@eecs.umich.edu } else { 1507591SAli.Saidi@ARM.com switch (bits(b, 3, 1)) { 1517591SAli.Saidi@ARM.com case 0x0: 1527591SAli.Saidi@ARM.com return new WarnUnimplemented("vst4 multiple", machInst); 1537591SAli.Saidi@ARM.com case 0x2: 1547591SAli.Saidi@ARM.com return new WarnUnimplemented("vst3 multiple", machInst); 1557591SAli.Saidi@ARM.com case 0x3: 1567591SAli.Saidi@ARM.com return new WarnUnimplemented("vst1 multiple", machInst); 1577591SAli.Saidi@ARM.com case 0x4: 1587591SAli.Saidi@ARM.com return new WarnUnimplemented("vst2 multiple", machInst); 1597591SAli.Saidi@ARM.com case 0x1: 1607591SAli.Saidi@ARM.com if (b & 0x1) { 1617591SAli.Saidi@ARM.com return new WarnUnimplemented("vst2 multiple", machInst); 1627591SAli.Saidi@ARM.com } else { 1637591SAli.Saidi@ARM.com return new WarnUnimplemented("vst1 multiple", machInst); 1647591SAli.Saidi@ARM.com } 1657591SAli.Saidi@ARM.com case 0x5: 1667591SAli.Saidi@ARM.com if ((b & 0x1) == 0) { 1677591SAli.Saidi@ARM.com return new WarnUnimplemented("vst1 multiple", machInst); 1687591SAli.Saidi@ARM.com } else { 1697591SAli.Saidi@ARM.com break; 1707591SAli.Saidi@ARM.com } 1717435Sgblack@eecs.umich.edu } 1727435Sgblack@eecs.umich.edu } 1737435Sgblack@eecs.umich.edu } 1747591SAli.Saidi@ARM.com return new Unknown(machInst); 1757435Sgblack@eecs.umich.edu } 1767435Sgblack@eecs.umich.edu ''' 1777435Sgblack@eecs.umich.edu 1787435Sgblack@eecs.umich.edu decoder_output += ''' 1797435Sgblack@eecs.umich.edu static StaticInstPtr 1807435Sgblack@eecs.umich.edu decodeNeonThreeRegistersSameLength(ExtMachInst machInst) 1817435Sgblack@eecs.umich.edu { 1827435Sgblack@eecs.umich.edu const bool u = THUMB ? bits(machInst, 28) : bits(machInst, 24); 1837435Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 11, 8); 1847435Sgblack@eecs.umich.edu const bool b = bits(machInst, 4); 1857435Sgblack@eecs.umich.edu const uint32_t c = bits(machInst, 21, 20); 1867435Sgblack@eecs.umich.edu switch (a) { 1877435Sgblack@eecs.umich.edu case 0x0: 1887435Sgblack@eecs.umich.edu if (b) { 1897435Sgblack@eecs.umich.edu if (bits(machInst, 9) == 0) { 1907435Sgblack@eecs.umich.edu return new WarnUnimplemented("vhadd", machInst); 1917435Sgblack@eecs.umich.edu } else { 1927435Sgblack@eecs.umich.edu return new WarnUnimplemented("vhsub", machInst); 1937435Sgblack@eecs.umich.edu } 1947435Sgblack@eecs.umich.edu } else { 1957435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqadd", machInst); 1967435Sgblack@eecs.umich.edu } 1977435Sgblack@eecs.umich.edu case 0x1: 1987435Sgblack@eecs.umich.edu if (!b) { 1997435Sgblack@eecs.umich.edu return new WarnUnimplemented("vrhadd", machInst); 2007435Sgblack@eecs.umich.edu } else { 2017435Sgblack@eecs.umich.edu if (u) { 2027435Sgblack@eecs.umich.edu switch (c) { 2037435Sgblack@eecs.umich.edu case 0: 2047435Sgblack@eecs.umich.edu return new WarnUnimplemented("veor", machInst); 2057435Sgblack@eecs.umich.edu case 1: 2067435Sgblack@eecs.umich.edu return new WarnUnimplemented("vbsl", machInst); 2077435Sgblack@eecs.umich.edu case 2: 2087435Sgblack@eecs.umich.edu return new WarnUnimplemented("vbit", machInst); 2097435Sgblack@eecs.umich.edu case 3: 2107435Sgblack@eecs.umich.edu return new WarnUnimplemented("vbif", machInst); 2117435Sgblack@eecs.umich.edu } 2127435Sgblack@eecs.umich.edu } else { 2137435Sgblack@eecs.umich.edu switch (c) { 2147435Sgblack@eecs.umich.edu case 0: 2157435Sgblack@eecs.umich.edu return new WarnUnimplemented("vand (reg)", machInst); 2167435Sgblack@eecs.umich.edu case 1: 2177435Sgblack@eecs.umich.edu return new WarnUnimplemented("vbic (reg)", machInst); 2187435Sgblack@eecs.umich.edu case 2: 2197435Sgblack@eecs.umich.edu { 2207435Sgblack@eecs.umich.edu const IntRegIndex n = (IntRegIndex)( 2217435Sgblack@eecs.umich.edu (uint32_t)bits(machInst, 19, 16) | 2227435Sgblack@eecs.umich.edu (uint32_t)(bits(machInst, 7) << 4)); 2237435Sgblack@eecs.umich.edu const IntRegIndex m = (IntRegIndex)( 2247435Sgblack@eecs.umich.edu (uint32_t)bits(machInst, 3, 0) | 2257435Sgblack@eecs.umich.edu (uint32_t)(bits(machInst, 5) << 4)); 2267435Sgblack@eecs.umich.edu if (n == m) { 2277435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmov (reg)", 2287435Sgblack@eecs.umich.edu machInst); 2297435Sgblack@eecs.umich.edu } else { 2307435Sgblack@eecs.umich.edu return new WarnUnimplemented("vorr (reg)", 2317435Sgblack@eecs.umich.edu machInst); 2327435Sgblack@eecs.umich.edu } 2337435Sgblack@eecs.umich.edu } 2347435Sgblack@eecs.umich.edu case 3: 2357435Sgblack@eecs.umich.edu return new WarnUnimplemented("vorn (reg)", machInst); 2367435Sgblack@eecs.umich.edu } 2377435Sgblack@eecs.umich.edu } 2387435Sgblack@eecs.umich.edu } 2397435Sgblack@eecs.umich.edu case 0x2: 2407435Sgblack@eecs.umich.edu if (b) { 2417435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqsub", machInst); 2427435Sgblack@eecs.umich.edu } else { 2437435Sgblack@eecs.umich.edu if (bits(machInst, 9) == 0) { 2447435Sgblack@eecs.umich.edu return new WarnUnimplemented("vhadd", machInst); 2457435Sgblack@eecs.umich.edu } else { 2467435Sgblack@eecs.umich.edu return new WarnUnimplemented("vhsub", machInst); 2477435Sgblack@eecs.umich.edu } 2487435Sgblack@eecs.umich.edu } 2497435Sgblack@eecs.umich.edu case 0x3: 2507435Sgblack@eecs.umich.edu if (b) { 2517435Sgblack@eecs.umich.edu return new WarnUnimplemented("vcge (reg)", machInst); 2527435Sgblack@eecs.umich.edu } else { 2537435Sgblack@eecs.umich.edu return new WarnUnimplemented("vcgt (reg)", machInst); 2547435Sgblack@eecs.umich.edu } 2557435Sgblack@eecs.umich.edu case 0x4: 2567435Sgblack@eecs.umich.edu if (b) { 2577435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqshl (reg)", machInst); 2587435Sgblack@eecs.umich.edu } else { 2597435Sgblack@eecs.umich.edu return new WarnUnimplemented("vshl (reg)", machInst); 2607435Sgblack@eecs.umich.edu } 2617435Sgblack@eecs.umich.edu case 0x5: 2627435Sgblack@eecs.umich.edu if (b) { 2637435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqrshl", machInst); 2647435Sgblack@eecs.umich.edu } else { 2657435Sgblack@eecs.umich.edu return new WarnUnimplemented("vrshl", machInst); 2667435Sgblack@eecs.umich.edu } 2677435Sgblack@eecs.umich.edu case 0x6: 2687435Sgblack@eecs.umich.edu if (b) { 2697435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmin (int)", machInst); 2707435Sgblack@eecs.umich.edu } else { 2717435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmax (int)", machInst); 2727435Sgblack@eecs.umich.edu } 2737435Sgblack@eecs.umich.edu case 0x7: 2747435Sgblack@eecs.umich.edu if (b) { 2757435Sgblack@eecs.umich.edu return new WarnUnimplemented("vaba", machInst); 2767435Sgblack@eecs.umich.edu } else { 2777435Sgblack@eecs.umich.edu if (bits(machInst, 23) == 1) { 2787435Sgblack@eecs.umich.edu if (bits(machInst, 6) == 1) { 2797435Sgblack@eecs.umich.edu return new Unknown(machInst); 2807435Sgblack@eecs.umich.edu } else { 2817435Sgblack@eecs.umich.edu return new WarnUnimplemented("vabdl (int)", machInst); 2827435Sgblack@eecs.umich.edu } 2837435Sgblack@eecs.umich.edu } else { 2847435Sgblack@eecs.umich.edu return new WarnUnimplemented("vabd (int)", machInst); 2857435Sgblack@eecs.umich.edu } 2867435Sgblack@eecs.umich.edu } 2877435Sgblack@eecs.umich.edu case 0x8: 2887435Sgblack@eecs.umich.edu if (b) { 2897435Sgblack@eecs.umich.edu if (u) { 2907435Sgblack@eecs.umich.edu return new WarnUnimplemented("vceq (reg)", machInst); 2917435Sgblack@eecs.umich.edu } else { 2927435Sgblack@eecs.umich.edu return new WarnUnimplemented("vtst", machInst); 2937435Sgblack@eecs.umich.edu } 2947435Sgblack@eecs.umich.edu } else { 2957435Sgblack@eecs.umich.edu if (u) { 2967435Sgblack@eecs.umich.edu return new WarnUnimplemented("vsub (int)", machInst); 2977435Sgblack@eecs.umich.edu } else { 2987435Sgblack@eecs.umich.edu return new WarnUnimplemented("vadd (int)", machInst); 2997435Sgblack@eecs.umich.edu } 3007435Sgblack@eecs.umich.edu } 3017435Sgblack@eecs.umich.edu case 0x9: 3027435Sgblack@eecs.umich.edu if (b) { 3037435Sgblack@eecs.umich.edu if (u) { 3047435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmul (poly)", machInst); 3057435Sgblack@eecs.umich.edu } else { 3067435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmul (int)", machInst); 3077435Sgblack@eecs.umich.edu } 3087435Sgblack@eecs.umich.edu } else { 3097435Sgblack@eecs.umich.edu if (u) { 3107435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmls (int)", machInst); 3117435Sgblack@eecs.umich.edu } else { 3127435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmla (int)", machInst); 3137435Sgblack@eecs.umich.edu } 3147435Sgblack@eecs.umich.edu } 3157435Sgblack@eecs.umich.edu case 0xa: 3167435Sgblack@eecs.umich.edu if (b) { 3177435Sgblack@eecs.umich.edu return new WarnUnimplemented("vpmin (int)", machInst); 3187435Sgblack@eecs.umich.edu } else { 3197435Sgblack@eecs.umich.edu return new WarnUnimplemented("vpmax (int)", machInst); 3207435Sgblack@eecs.umich.edu } 3217435Sgblack@eecs.umich.edu case 0xb: 3227435Sgblack@eecs.umich.edu if (b) { 3237435Sgblack@eecs.umich.edu if (u) { 3247435Sgblack@eecs.umich.edu return new Unknown(machInst); 3257435Sgblack@eecs.umich.edu } else { 3267435Sgblack@eecs.umich.edu return new WarnUnimplemented("vpadd (int)", machInst); 3277435Sgblack@eecs.umich.edu } 3287435Sgblack@eecs.umich.edu } else { 3297435Sgblack@eecs.umich.edu if (u) { 3307435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqrdmulh", machInst); 3317435Sgblack@eecs.umich.edu } else { 3327435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqdmulh", machInst); 3337435Sgblack@eecs.umich.edu } 3347435Sgblack@eecs.umich.edu } 3357435Sgblack@eecs.umich.edu case 0xc: 3367435Sgblack@eecs.umich.edu return new Unknown(machInst); 3377435Sgblack@eecs.umich.edu case 0xd: 3387435Sgblack@eecs.umich.edu if (b) { 3397435Sgblack@eecs.umich.edu if (u) { 3407435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 3417435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmul (fp)", machInst); 3427435Sgblack@eecs.umich.edu } else { 3437435Sgblack@eecs.umich.edu return new Unknown(machInst); 3447435Sgblack@eecs.umich.edu } 3457435Sgblack@eecs.umich.edu } else { 3467435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 3477435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmla (fp)", machInst); 3487435Sgblack@eecs.umich.edu } else { 3497435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmls (fp)", machInst); 3507435Sgblack@eecs.umich.edu } 3517435Sgblack@eecs.umich.edu } 3527435Sgblack@eecs.umich.edu } else { 3537435Sgblack@eecs.umich.edu if (u) { 3547435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 3557435Sgblack@eecs.umich.edu return new WarnUnimplemented("vpadd (fp)", machInst); 3567435Sgblack@eecs.umich.edu } else { 3577435Sgblack@eecs.umich.edu return new WarnUnimplemented("vabd (fp)", machInst); 3587435Sgblack@eecs.umich.edu } 3597435Sgblack@eecs.umich.edu } else { 3607435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 3617435Sgblack@eecs.umich.edu return new WarnUnimplemented("vadd (fp)", machInst); 3627435Sgblack@eecs.umich.edu } else { 3637435Sgblack@eecs.umich.edu return new WarnUnimplemented("vsub (fp)", machInst); 3647435Sgblack@eecs.umich.edu } 3657435Sgblack@eecs.umich.edu } 3667435Sgblack@eecs.umich.edu } 3677435Sgblack@eecs.umich.edu case 0xe: 3687435Sgblack@eecs.umich.edu if (b) { 3697435Sgblack@eecs.umich.edu if (u) { 3707435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 3717435Sgblack@eecs.umich.edu return new WarnUnimplemented("vacge", machInst); 3727435Sgblack@eecs.umich.edu } else { 3737435Sgblack@eecs.umich.edu return new WarnUnimplemented("vacgt", machInst); 3747435Sgblack@eecs.umich.edu } 3757435Sgblack@eecs.umich.edu } else { 3767435Sgblack@eecs.umich.edu return new Unknown(machInst); 3777435Sgblack@eecs.umich.edu } 3787435Sgblack@eecs.umich.edu } else { 3797435Sgblack@eecs.umich.edu if (u) { 3807435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 3817435Sgblack@eecs.umich.edu return new WarnUnimplemented("vcge (reg)", machInst); 3827435Sgblack@eecs.umich.edu } else { 3837435Sgblack@eecs.umich.edu return new WarnUnimplemented("vcgt (reg)", machInst); 3847435Sgblack@eecs.umich.edu } 3857435Sgblack@eecs.umich.edu } else { 3867435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 3877435Sgblack@eecs.umich.edu return new WarnUnimplemented("vceq (reg)", machInst); 3887435Sgblack@eecs.umich.edu } else { 3897435Sgblack@eecs.umich.edu return new Unknown(machInst); 3907435Sgblack@eecs.umich.edu } 3917435Sgblack@eecs.umich.edu } 3927435Sgblack@eecs.umich.edu } 3937435Sgblack@eecs.umich.edu case 0xf: 3947435Sgblack@eecs.umich.edu if (b) { 3957435Sgblack@eecs.umich.edu if (u) { 3967435Sgblack@eecs.umich.edu return new Unknown(machInst); 3977435Sgblack@eecs.umich.edu } else { 3987435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 3997435Sgblack@eecs.umich.edu return new WarnUnimplemented("vrecps", machInst); 4007435Sgblack@eecs.umich.edu } else { 4017435Sgblack@eecs.umich.edu return new WarnUnimplemented("vrsqrts", machInst); 4027435Sgblack@eecs.umich.edu } 4037435Sgblack@eecs.umich.edu } 4047435Sgblack@eecs.umich.edu } else { 4057435Sgblack@eecs.umich.edu if (u) { 4067435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 4077435Sgblack@eecs.umich.edu return new WarnUnimplemented("vpmax (fp)", machInst); 4087435Sgblack@eecs.umich.edu } else { 4097435Sgblack@eecs.umich.edu return new WarnUnimplemented("vpmin (fp)", machInst); 4107435Sgblack@eecs.umich.edu } 4117435Sgblack@eecs.umich.edu } else { 4127435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 4137435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmax (fp)", machInst); 4147435Sgblack@eecs.umich.edu } else { 4157435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmin (fp)", machInst); 4167435Sgblack@eecs.umich.edu } 4177435Sgblack@eecs.umich.edu } 4187435Sgblack@eecs.umich.edu } 4197435Sgblack@eecs.umich.edu } 4207435Sgblack@eecs.umich.edu return new Unknown(machInst); 4217435Sgblack@eecs.umich.edu } 4227435Sgblack@eecs.umich.edu 4237435Sgblack@eecs.umich.edu static StaticInstPtr 4247435Sgblack@eecs.umich.edu decodeNeonOneRegModImm(ExtMachInst machInst) 4257435Sgblack@eecs.umich.edu { 4267435Sgblack@eecs.umich.edu const bool op = bits(machInst, 5); 4277435Sgblack@eecs.umich.edu const uint32_t cmode = bits(machInst, 11, 8); 4287435Sgblack@eecs.umich.edu if (op) { 4297435Sgblack@eecs.umich.edu if (bits(cmode, 3) == 0) { 4307435Sgblack@eecs.umich.edu if (bits(cmode, 0) == 0) { 4317435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmov (imm)", machInst); 4327435Sgblack@eecs.umich.edu } else { 4337435Sgblack@eecs.umich.edu return new WarnUnimplemented("vorr (imm)", machInst); 4347435Sgblack@eecs.umich.edu } 4357435Sgblack@eecs.umich.edu } else { 4367435Sgblack@eecs.umich.edu if (bits(cmode, 2) == 1) { 4377435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmov (imm)", machInst); 4387435Sgblack@eecs.umich.edu } else { 4397435Sgblack@eecs.umich.edu if (bits(cmode, 0) == 0) { 4407435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmov (imm)", machInst); 4417435Sgblack@eecs.umich.edu } else { 4427435Sgblack@eecs.umich.edu return new WarnUnimplemented("vorr (imm)", machInst); 4437435Sgblack@eecs.umich.edu } 4447435Sgblack@eecs.umich.edu } 4457435Sgblack@eecs.umich.edu } 4467435Sgblack@eecs.umich.edu } else { 4477435Sgblack@eecs.umich.edu if (bits(cmode, 3) == 0) { 4487435Sgblack@eecs.umich.edu if (bits(cmode, 0) == 0) { 4497435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmvn (imm)", machInst); 4507435Sgblack@eecs.umich.edu } else { 4517435Sgblack@eecs.umich.edu return new WarnUnimplemented("vbic (imm)", machInst); 4527435Sgblack@eecs.umich.edu } 4537435Sgblack@eecs.umich.edu } else { 4547435Sgblack@eecs.umich.edu if (bits(cmode, 2) == 1) { 4557435Sgblack@eecs.umich.edu switch (bits(cmode, 1, 0)) { 4567435Sgblack@eecs.umich.edu case 0: 4577435Sgblack@eecs.umich.edu case 1: 4587435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmvn (imm)", machInst); 4597435Sgblack@eecs.umich.edu case 2: 4607435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmov (imm)", machInst); 4617435Sgblack@eecs.umich.edu case 3: 4627435Sgblack@eecs.umich.edu return new Unknown(machInst); 4637435Sgblack@eecs.umich.edu } 4647435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmov (imm)", machInst); 4657435Sgblack@eecs.umich.edu } else { 4667435Sgblack@eecs.umich.edu if (bits(cmode, 0) == 0) { 4677435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmvn (imm)", machInst); 4687435Sgblack@eecs.umich.edu } else { 4697435Sgblack@eecs.umich.edu return new WarnUnimplemented("vbic (imm)", machInst); 4707435Sgblack@eecs.umich.edu } 4717435Sgblack@eecs.umich.edu } 4727435Sgblack@eecs.umich.edu } 4737435Sgblack@eecs.umich.edu } 4747435Sgblack@eecs.umich.edu return new Unknown(machInst); 4757435Sgblack@eecs.umich.edu } 4767435Sgblack@eecs.umich.edu 4777435Sgblack@eecs.umich.edu static StaticInstPtr 4787435Sgblack@eecs.umich.edu decodeNeonTwoRegAndShift(ExtMachInst machInst) 4797435Sgblack@eecs.umich.edu { 4807435Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 11, 8); 4817435Sgblack@eecs.umich.edu const bool u = THUMB ? bits(machInst, 28) : bits(machInst, 24); 4827435Sgblack@eecs.umich.edu const bool b = bits(machInst, 6); 4837435Sgblack@eecs.umich.edu const bool l = bits(machInst, 7); 4847435Sgblack@eecs.umich.edu 4857435Sgblack@eecs.umich.edu switch (a) { 4867435Sgblack@eecs.umich.edu case 0x0: 4877435Sgblack@eecs.umich.edu return new WarnUnimplemented("vshr", machInst); 4887435Sgblack@eecs.umich.edu case 0x1: 4897435Sgblack@eecs.umich.edu return new WarnUnimplemented("vsra", machInst); 4907435Sgblack@eecs.umich.edu case 0x2: 4917435Sgblack@eecs.umich.edu return new WarnUnimplemented("vrshr", machInst); 4927435Sgblack@eecs.umich.edu case 0x3: 4937435Sgblack@eecs.umich.edu return new WarnUnimplemented("vrsra", machInst); 4947435Sgblack@eecs.umich.edu case 0x4: 4957435Sgblack@eecs.umich.edu if (u) { 4967435Sgblack@eecs.umich.edu return new WarnUnimplemented("vsri", machInst); 4977435Sgblack@eecs.umich.edu } else { 4987435Sgblack@eecs.umich.edu return new Unknown(machInst); 4997435Sgblack@eecs.umich.edu } 5007435Sgblack@eecs.umich.edu case 0x5: 5017435Sgblack@eecs.umich.edu if (u) { 5027435Sgblack@eecs.umich.edu return new WarnUnimplemented("vsli", machInst); 5037435Sgblack@eecs.umich.edu } else { 5047435Sgblack@eecs.umich.edu return new WarnUnimplemented("vshl (imm)", machInst); 5057435Sgblack@eecs.umich.edu } 5067435Sgblack@eecs.umich.edu case 0x6: 5077435Sgblack@eecs.umich.edu case 0x7: 5087435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqshl, vqshlu (imm)", machInst); 5097435Sgblack@eecs.umich.edu case 0x8: 5107435Sgblack@eecs.umich.edu if (l) { 5117435Sgblack@eecs.umich.edu return new Unknown(machInst); 5127435Sgblack@eecs.umich.edu } else if (u) { 5137435Sgblack@eecs.umich.edu if (b) { 5147435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqrshrn, vqrshrun", machInst); 5157435Sgblack@eecs.umich.edu } else { 5167435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqshrn, vqshrun", machInst); 5177435Sgblack@eecs.umich.edu } 5187435Sgblack@eecs.umich.edu } else { 5197435Sgblack@eecs.umich.edu if (b) { 5207435Sgblack@eecs.umich.edu return new WarnUnimplemented("vrshrn", machInst); 5217435Sgblack@eecs.umich.edu } else { 5227435Sgblack@eecs.umich.edu return new WarnUnimplemented("vshrn", machInst); 5237435Sgblack@eecs.umich.edu } 5247435Sgblack@eecs.umich.edu } 5257435Sgblack@eecs.umich.edu case 0x9: 5267435Sgblack@eecs.umich.edu if (l) { 5277435Sgblack@eecs.umich.edu return new Unknown(machInst); 5287435Sgblack@eecs.umich.edu } else if (b) { 5297435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqrshrn, vqrshrun", machInst); 5307435Sgblack@eecs.umich.edu } else { 5317435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqshrn, vqshrun", machInst); 5327435Sgblack@eecs.umich.edu } 5337435Sgblack@eecs.umich.edu case 0xa: 5347435Sgblack@eecs.umich.edu if (l || b) { 5357435Sgblack@eecs.umich.edu return new Unknown(machInst); 5367435Sgblack@eecs.umich.edu } else { 5377435Sgblack@eecs.umich.edu // If the shift amount is zero, it's vmovl. 5387435Sgblack@eecs.umich.edu return new WarnUnimplemented("vshll, vmovl", machInst); 5397435Sgblack@eecs.umich.edu } 5407435Sgblack@eecs.umich.edu case 0xe: 5417435Sgblack@eecs.umich.edu case 0xf: 5427435Sgblack@eecs.umich.edu if (l) { 5437435Sgblack@eecs.umich.edu return new Unknown(machInst); 5447435Sgblack@eecs.umich.edu } else if (a == 0xe) { 5457435Sgblack@eecs.umich.edu return new WarnUnimplemented("vcvt (fixed to fp)", machInst); 5467435Sgblack@eecs.umich.edu } else if (a == 0xf) { 5477435Sgblack@eecs.umich.edu return new WarnUnimplemented("vcvt (fp to fixed)", machInst); 5487435Sgblack@eecs.umich.edu } 5497435Sgblack@eecs.umich.edu } 5507435Sgblack@eecs.umich.edu return new Unknown(machInst); 5517435Sgblack@eecs.umich.edu } 5527435Sgblack@eecs.umich.edu 5537435Sgblack@eecs.umich.edu static StaticInstPtr 5547435Sgblack@eecs.umich.edu decodeNeonThreeRegDiffLengths(ExtMachInst machInst) 5557435Sgblack@eecs.umich.edu { 5567435Sgblack@eecs.umich.edu const bool u = THUMB ? bits(machInst, 28) : bits(machInst, 24); 5577435Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 11, 8); 5587435Sgblack@eecs.umich.edu 5597435Sgblack@eecs.umich.edu switch (a) { 5607435Sgblack@eecs.umich.edu case 0x0: 5617435Sgblack@eecs.umich.edu return new WarnUnimplemented("vaddl", machInst); 5627435Sgblack@eecs.umich.edu case 0x1: 5637435Sgblack@eecs.umich.edu return new WarnUnimplemented("vaddw", machInst); 5647435Sgblack@eecs.umich.edu case 0x2: 5657435Sgblack@eecs.umich.edu return new WarnUnimplemented("vsubl", machInst); 5667435Sgblack@eecs.umich.edu case 0x3: 5677435Sgblack@eecs.umich.edu return new WarnUnimplemented("vsubw", machInst); 5687435Sgblack@eecs.umich.edu case 0x4: 5697435Sgblack@eecs.umich.edu if (u) { 5707435Sgblack@eecs.umich.edu return new WarnUnimplemented("vraddhn", machInst); 5717435Sgblack@eecs.umich.edu } else { 5727435Sgblack@eecs.umich.edu return new WarnUnimplemented("vaddhn", machInst); 5737435Sgblack@eecs.umich.edu } 5747435Sgblack@eecs.umich.edu case 0x5: 5757435Sgblack@eecs.umich.edu return new WarnUnimplemented("vabal", machInst); 5767435Sgblack@eecs.umich.edu case 0x6: 5777435Sgblack@eecs.umich.edu if (u) { 5787435Sgblack@eecs.umich.edu return new WarnUnimplemented("vrsubhn", machInst); 5797435Sgblack@eecs.umich.edu } else { 5807435Sgblack@eecs.umich.edu return new WarnUnimplemented("vsubhn", machInst); 5817435Sgblack@eecs.umich.edu } 5827435Sgblack@eecs.umich.edu case 0x7: 5837435Sgblack@eecs.umich.edu if (bits(machInst, 23)) { 5847435Sgblack@eecs.umich.edu return new WarnUnimplemented("vabdl (int)", machInst); 5857435Sgblack@eecs.umich.edu } else { 5867435Sgblack@eecs.umich.edu return new WarnUnimplemented("vabd (int)", machInst); 5877435Sgblack@eecs.umich.edu } 5887435Sgblack@eecs.umich.edu case 0x8: 5897435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmlal (int)", machInst); 5907435Sgblack@eecs.umich.edu case 0xa: 5917435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmlsl (int)", machInst); 5927435Sgblack@eecs.umich.edu case 0x9: 5937435Sgblack@eecs.umich.edu if (bits(machInst, 23) == 0) { 5947435Sgblack@eecs.umich.edu if (bits(machInst, 4) == 0) { 5957435Sgblack@eecs.umich.edu if (u) { 5967435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmls (int)", machInst); 5977435Sgblack@eecs.umich.edu } else { 5987435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmla (int)", machInst); 5997435Sgblack@eecs.umich.edu } 6007435Sgblack@eecs.umich.edu } else { 6017435Sgblack@eecs.umich.edu if (u) { 6027435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmul (poly)", machInst); 6037435Sgblack@eecs.umich.edu } else { 6047435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmul (int)", machInst); 6057435Sgblack@eecs.umich.edu } 6067435Sgblack@eecs.umich.edu } 6077435Sgblack@eecs.umich.edu } else { 6087435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqdmlal", machInst); 6097435Sgblack@eecs.umich.edu } 6107435Sgblack@eecs.umich.edu case 0xb: 6117435Sgblack@eecs.umich.edu if (!u) { 6127435Sgblack@eecs.umich.edu return new Unknown(machInst); 6137435Sgblack@eecs.umich.edu } else { 6147435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqdmlsl", machInst); 6157435Sgblack@eecs.umich.edu } 6167435Sgblack@eecs.umich.edu case 0xc: 6177435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmull (int)", machInst); 6187435Sgblack@eecs.umich.edu case 0xd: 6197435Sgblack@eecs.umich.edu if (!u) { 6207435Sgblack@eecs.umich.edu return new Unknown(machInst); 6217435Sgblack@eecs.umich.edu } else { 6227435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqdmull", machInst); 6237435Sgblack@eecs.umich.edu } 6247435Sgblack@eecs.umich.edu case 0xe: 6257435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmull (poly)", machInst); 6267435Sgblack@eecs.umich.edu } 6277435Sgblack@eecs.umich.edu return new Unknown(machInst); 6287435Sgblack@eecs.umich.edu } 6297435Sgblack@eecs.umich.edu 6307435Sgblack@eecs.umich.edu static StaticInstPtr 6317435Sgblack@eecs.umich.edu decodeNeonTwoRegScalar(ExtMachInst machInst) 6327435Sgblack@eecs.umich.edu { 6337435Sgblack@eecs.umich.edu const bool u = THUMB ? bits(machInst, 28) : bits(machInst, 24); 6347435Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 11, 8); 6357435Sgblack@eecs.umich.edu 6367435Sgblack@eecs.umich.edu switch (a) { 6377435Sgblack@eecs.umich.edu case 0x0: 6387435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmla (int scalar)", machInst); 6397435Sgblack@eecs.umich.edu case 0x1: 6407435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmla (fp scalar)", machInst); 6417435Sgblack@eecs.umich.edu case 0x4: 6427435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmls (int scalar)", machInst); 6437435Sgblack@eecs.umich.edu case 0x5: 6447435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmls (fp scalar)", machInst); 6457435Sgblack@eecs.umich.edu case 0x2: 6467435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmlal (scalar)", machInst); 6477435Sgblack@eecs.umich.edu case 0x6: 6487435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmlsl (scalar)", machInst); 6497435Sgblack@eecs.umich.edu case 0x3: 6507435Sgblack@eecs.umich.edu if (u) { 6517435Sgblack@eecs.umich.edu return new Unknown(machInst); 6527435Sgblack@eecs.umich.edu } else { 6537435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqdmlal", machInst); 6547435Sgblack@eecs.umich.edu } 6557435Sgblack@eecs.umich.edu case 0x7: 6567435Sgblack@eecs.umich.edu if (u) { 6577435Sgblack@eecs.umich.edu return new Unknown(machInst); 6587435Sgblack@eecs.umich.edu } else { 6597435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqdmlsl", machInst); 6607435Sgblack@eecs.umich.edu } 6617435Sgblack@eecs.umich.edu case 0x8: 6627435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmul (int scalar)", machInst); 6637435Sgblack@eecs.umich.edu case 0x9: 6647435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmul (fp scalar)", machInst); 6657435Sgblack@eecs.umich.edu case 0xa: 6667435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmull (scalar)", machInst); 6677435Sgblack@eecs.umich.edu case 0xb: 6687435Sgblack@eecs.umich.edu if (u) { 6697435Sgblack@eecs.umich.edu return new Unknown(machInst); 6707435Sgblack@eecs.umich.edu } else { 6717435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqdmull", machInst); 6727435Sgblack@eecs.umich.edu } 6737435Sgblack@eecs.umich.edu case 0xc: 6747435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqdmulh", machInst); 6757435Sgblack@eecs.umich.edu case 0xd: 6767435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqrdmulh", machInst); 6777435Sgblack@eecs.umich.edu } 6787435Sgblack@eecs.umich.edu return new Unknown(machInst); 6797435Sgblack@eecs.umich.edu } 6807435Sgblack@eecs.umich.edu 6817435Sgblack@eecs.umich.edu static StaticInstPtr 6827435Sgblack@eecs.umich.edu decodeNeonTwoRegMisc(ExtMachInst machInst) 6837435Sgblack@eecs.umich.edu { 6847435Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 17, 16); 6857435Sgblack@eecs.umich.edu const uint32_t b = bits(machInst, 10, 6); 6867435Sgblack@eecs.umich.edu switch (a) { 6877435Sgblack@eecs.umich.edu case 0x0: 6887435Sgblack@eecs.umich.edu switch (bits(b, 4, 1)) { 6897435Sgblack@eecs.umich.edu case 0x0: 6907435Sgblack@eecs.umich.edu return new WarnUnimplemented("vrev64", machInst); 6917435Sgblack@eecs.umich.edu case 0x1: 6927435Sgblack@eecs.umich.edu return new WarnUnimplemented("vrev32", machInst); 6937435Sgblack@eecs.umich.edu case 0x2: 6947435Sgblack@eecs.umich.edu return new WarnUnimplemented("vrev16", machInst); 6957435Sgblack@eecs.umich.edu case 0x4: 6967435Sgblack@eecs.umich.edu case 0x5: 6977435Sgblack@eecs.umich.edu return new WarnUnimplemented("vpaddl", machInst); 6987435Sgblack@eecs.umich.edu case 0x8: 6997435Sgblack@eecs.umich.edu return new WarnUnimplemented("vcls", machInst); 7007435Sgblack@eecs.umich.edu case 0x9: 7017435Sgblack@eecs.umich.edu return new WarnUnimplemented("vclz", machInst); 7027435Sgblack@eecs.umich.edu case 0xa: 7037435Sgblack@eecs.umich.edu return new WarnUnimplemented("vcnt", machInst); 7047435Sgblack@eecs.umich.edu case 0xb: 7057435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmvn (reg)", machInst); 7067435Sgblack@eecs.umich.edu case 0xc: 7077435Sgblack@eecs.umich.edu case 0xd: 7087435Sgblack@eecs.umich.edu return new WarnUnimplemented("vpadal", machInst); 7097435Sgblack@eecs.umich.edu case 0xe: 7107435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqabs", machInst); 7117435Sgblack@eecs.umich.edu case 0xf: 7127435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqneg", machInst); 7137435Sgblack@eecs.umich.edu default: 7147435Sgblack@eecs.umich.edu return new Unknown(machInst); 7157435Sgblack@eecs.umich.edu } 7167435Sgblack@eecs.umich.edu case 0x1: 7177435Sgblack@eecs.umich.edu switch (bits(b, 3, 1)) { 7187435Sgblack@eecs.umich.edu case 0x0: 7197435Sgblack@eecs.umich.edu return new WarnUnimplemented("vcgt (imm #0)", machInst); 7207435Sgblack@eecs.umich.edu case 0x1: 7217435Sgblack@eecs.umich.edu return new WarnUnimplemented("vcge (imm #0)", machInst); 7227435Sgblack@eecs.umich.edu case 0x2: 7237435Sgblack@eecs.umich.edu return new WarnUnimplemented("vceq (imm #0)", machInst); 7247435Sgblack@eecs.umich.edu case 0x3: 7257435Sgblack@eecs.umich.edu return new WarnUnimplemented("vcle (imm #0)", machInst); 7267435Sgblack@eecs.umich.edu case 0x4: 7277435Sgblack@eecs.umich.edu return new WarnUnimplemented("vclt (imm #0)", machInst); 7287435Sgblack@eecs.umich.edu case 0x6: 7297435Sgblack@eecs.umich.edu return new WarnUnimplemented("vabs (imm #0)", machInst); 7307435Sgblack@eecs.umich.edu case 0x7: 7317435Sgblack@eecs.umich.edu return new WarnUnimplemented("vneg (imm #0)", machInst); 7327435Sgblack@eecs.umich.edu } 7337435Sgblack@eecs.umich.edu case 0x2: 7347435Sgblack@eecs.umich.edu switch (bits(b, 4, 1)) { 7357435Sgblack@eecs.umich.edu case 0x0: 7367435Sgblack@eecs.umich.edu return new WarnUnimplemented("vswp", machInst); 7377435Sgblack@eecs.umich.edu case 0x1: 7387435Sgblack@eecs.umich.edu return new WarnUnimplemented("vtrn", machInst); 7397435Sgblack@eecs.umich.edu case 0x2: 7407435Sgblack@eecs.umich.edu return new WarnUnimplemented("vuzp", machInst); 7417435Sgblack@eecs.umich.edu case 0x3: 7427435Sgblack@eecs.umich.edu return new WarnUnimplemented("vzip", machInst); 7437435Sgblack@eecs.umich.edu case 0x4: 7447435Sgblack@eecs.umich.edu if (b == 0x8) { 7457435Sgblack@eecs.umich.edu return new WarnUnimplemented("vmovn", machInst); 7467435Sgblack@eecs.umich.edu } else { 7477435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqmovun", machInst); 7487435Sgblack@eecs.umich.edu } 7497435Sgblack@eecs.umich.edu case 0x5: 7507435Sgblack@eecs.umich.edu return new WarnUnimplemented("vqmovn", machInst); 7517435Sgblack@eecs.umich.edu case 0x6: 7527435Sgblack@eecs.umich.edu if (b == 0xc) { 7537435Sgblack@eecs.umich.edu return new WarnUnimplemented("vshll", machInst); 7547435Sgblack@eecs.umich.edu } else { 7557435Sgblack@eecs.umich.edu return new Unknown(machInst); 7567435Sgblack@eecs.umich.edu } 7577435Sgblack@eecs.umich.edu case 0xc: 7587435Sgblack@eecs.umich.edu case 0xe: 7597435Sgblack@eecs.umich.edu if (b == 0x18) { 7607435Sgblack@eecs.umich.edu return new WarnUnimplemented("vcvt (single to half)", 7617435Sgblack@eecs.umich.edu machInst); 7627435Sgblack@eecs.umich.edu } else if (b == 0x1c) { 7637435Sgblack@eecs.umich.edu return new WarnUnimplemented("vcvt (half to single)", 7647435Sgblack@eecs.umich.edu machInst); 7657435Sgblack@eecs.umich.edu } else { 7667435Sgblack@eecs.umich.edu return new Unknown(machInst); 7677435Sgblack@eecs.umich.edu } 7687435Sgblack@eecs.umich.edu default: 7697435Sgblack@eecs.umich.edu return new Unknown(machInst); 7707435Sgblack@eecs.umich.edu } 7717435Sgblack@eecs.umich.edu case 0x3: 7727435Sgblack@eecs.umich.edu if (bits(b, 4, 3) == 0x3) { 7737435Sgblack@eecs.umich.edu return new WarnUnimplemented("vcvt (fp and int)", machInst); 7747435Sgblack@eecs.umich.edu } else if ((b & 0x1a) == 0x10) { 7757435Sgblack@eecs.umich.edu return new WarnUnimplemented("vrecpe", machInst); 7767435Sgblack@eecs.umich.edu } else if ((b & 0x1a) == 0x12) { 7777435Sgblack@eecs.umich.edu return new WarnUnimplemented("vrsqrte", machInst); 7787435Sgblack@eecs.umich.edu } else { 7797435Sgblack@eecs.umich.edu return new Unknown(machInst); 7807435Sgblack@eecs.umich.edu } 7817435Sgblack@eecs.umich.edu } 7827435Sgblack@eecs.umich.edu return new Unknown(machInst); 7837435Sgblack@eecs.umich.edu } 7847435Sgblack@eecs.umich.edu 7857435Sgblack@eecs.umich.edu StaticInstPtr 7867435Sgblack@eecs.umich.edu decodeNeonData(ExtMachInst machInst) 7877435Sgblack@eecs.umich.edu { 7887435Sgblack@eecs.umich.edu const bool u = THUMB ? bits(machInst, 28) : bits(machInst, 24); 7897435Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 23, 19); 7907435Sgblack@eecs.umich.edu const uint32_t b = bits(machInst, 11, 8); 7917435Sgblack@eecs.umich.edu const uint32_t c = bits(machInst, 7, 4); 7927435Sgblack@eecs.umich.edu if (bits(a, 4) == 0) { 7937435Sgblack@eecs.umich.edu return decodeNeonThreeRegistersSameLength(machInst); 7947435Sgblack@eecs.umich.edu } else if ((c & 0x9) == 1) { 7957435Sgblack@eecs.umich.edu if ((a & 0x7) == 0) { 7967435Sgblack@eecs.umich.edu return decodeNeonOneRegModImm(machInst); 7977435Sgblack@eecs.umich.edu } else { 7987435Sgblack@eecs.umich.edu return decodeNeonTwoRegAndShift(machInst); 7997435Sgblack@eecs.umich.edu } 8007435Sgblack@eecs.umich.edu } else if ((c & 0x9) == 9) { 8017435Sgblack@eecs.umich.edu return decodeNeonTwoRegAndShift(machInst); 8027435Sgblack@eecs.umich.edu } else if ((c & 0x5) == 0) { 8037435Sgblack@eecs.umich.edu if (bits(a, 3, 2) != 0x3) { 8047435Sgblack@eecs.umich.edu return decodeNeonThreeRegDiffLengths(machInst); 8057435Sgblack@eecs.umich.edu } 8067435Sgblack@eecs.umich.edu } else if ((c & 0x5) == 4) { 8077435Sgblack@eecs.umich.edu if (bits(a, 3, 2) != 0x3) { 8087435Sgblack@eecs.umich.edu return decodeNeonTwoRegScalar(machInst); 8097435Sgblack@eecs.umich.edu } 8107435Sgblack@eecs.umich.edu } else if ((a & 0x16) == 0x16) { 8117435Sgblack@eecs.umich.edu if (!u) { 8127435Sgblack@eecs.umich.edu if (bits(c, 0) == 0) { 8137435Sgblack@eecs.umich.edu return new WarnUnimplemented("vext", machInst); 8147435Sgblack@eecs.umich.edu } 8157435Sgblack@eecs.umich.edu } else if (bits(b, 3) == 0 && bits(c, 0) == 0) { 8167435Sgblack@eecs.umich.edu return decodeNeonTwoRegMisc(machInst); 8177435Sgblack@eecs.umich.edu } else if (bits(b, 3, 2) == 0x2 && bits(c, 0) == 0) { 8187435Sgblack@eecs.umich.edu if (bits(machInst, 6) == 0) { 8197435Sgblack@eecs.umich.edu return new WarnUnimplemented("vtbl", machInst); 8207435Sgblack@eecs.umich.edu } else { 8217435Sgblack@eecs.umich.edu return new WarnUnimplemented("vtbx", machInst); 8227435Sgblack@eecs.umich.edu } 8237435Sgblack@eecs.umich.edu } else if (b == 0xc && (c & 0x9) == 0) { 8247435Sgblack@eecs.umich.edu return new WarnUnimplemented("vdup (scalar)", machInst); 8257435Sgblack@eecs.umich.edu } 8267435Sgblack@eecs.umich.edu } 8277435Sgblack@eecs.umich.edu return new Unknown(machInst); 8287435Sgblack@eecs.umich.edu } 8297435Sgblack@eecs.umich.edu ''' 8307435Sgblack@eecs.umich.edu}}; 8317435Sgblack@eecs.umich.edu 8327435Sgblack@eecs.umich.edudef format ThumbNeonMem() {{ 8337435Sgblack@eecs.umich.edu decode_block = ''' 8347435Sgblack@eecs.umich.edu return decodeNeonMem(machInst); 8357435Sgblack@eecs.umich.edu ''' 8367435Sgblack@eecs.umich.edu}}; 8377435Sgblack@eecs.umich.edu 8387435Sgblack@eecs.umich.edudef format ThumbNeonData() {{ 8397435Sgblack@eecs.umich.edu decode_block = ''' 8407435Sgblack@eecs.umich.edu return decodeNeonMem(machInst); 8417435Sgblack@eecs.umich.edu ''' 8427435Sgblack@eecs.umich.edu}}; 8437435Sgblack@eecs.umich.edu 8447435Sgblack@eecs.umich.edulet {{ 8457435Sgblack@eecs.umich.edu header_output = ''' 8467435Sgblack@eecs.umich.edu StaticInstPtr 8477356Sgblack@eecs.umich.edu decodeExtensionRegLoadStore(ExtMachInst machInst); 8487356Sgblack@eecs.umich.edu ''' 8497356Sgblack@eecs.umich.edu decoder_output = ''' 8507356Sgblack@eecs.umich.edu StaticInstPtr 8517356Sgblack@eecs.umich.edu decodeExtensionRegLoadStore(ExtMachInst machInst) 8527178Sgblack@eecs.umich.edu { 8537178Sgblack@eecs.umich.edu const uint32_t opcode = bits(machInst, 24, 20); 8547178Sgblack@eecs.umich.edu const uint32_t offset = bits(machInst, 7, 0); 8557337Sgblack@eecs.umich.edu const bool single = (bits(machInst, 8) == 0); 8567178Sgblack@eecs.umich.edu const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 8577178Sgblack@eecs.umich.edu RegIndex vd; 8587178Sgblack@eecs.umich.edu if (single) { 8597178Sgblack@eecs.umich.edu vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) | 8607178Sgblack@eecs.umich.edu bits(machInst, 22)); 8617178Sgblack@eecs.umich.edu } else { 8627178Sgblack@eecs.umich.edu vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) | 8637178Sgblack@eecs.umich.edu (bits(machInst, 22) << 5)); 8647178Sgblack@eecs.umich.edu } 8657178Sgblack@eecs.umich.edu switch (bits(opcode, 4, 3)) { 8667178Sgblack@eecs.umich.edu case 0x0: 8677335Sgblack@eecs.umich.edu if (bits(opcode, 4, 1) == 0x2 && 8687335Sgblack@eecs.umich.edu !(machInst.thumb == 1 && bits(machInst, 28) == 1) && 8697335Sgblack@eecs.umich.edu !(machInst.thumb == 0 && machInst.condCode == 0xf)) { 8707335Sgblack@eecs.umich.edu if ((bits(machInst, 7, 4) & 0xd) != 1) { 8717335Sgblack@eecs.umich.edu break; 8727335Sgblack@eecs.umich.edu } 8737335Sgblack@eecs.umich.edu const IntRegIndex rt = 8747335Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 8757335Sgblack@eecs.umich.edu const IntRegIndex rt2 = 8767335Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 8777335Sgblack@eecs.umich.edu const bool op = bits(machInst, 20); 8787335Sgblack@eecs.umich.edu uint32_t vm; 8797337Sgblack@eecs.umich.edu if (single) { 8807335Sgblack@eecs.umich.edu vm = (bits(machInst, 3, 0) << 1) | bits(machInst, 5); 8817335Sgblack@eecs.umich.edu } else { 8827335Sgblack@eecs.umich.edu vm = (bits(machInst, 3, 0) << 1) | 8837335Sgblack@eecs.umich.edu (bits(machInst, 5) << 5); 8847335Sgblack@eecs.umich.edu } 8857335Sgblack@eecs.umich.edu if (op) { 8867335Sgblack@eecs.umich.edu return new Vmov2Core2Reg(machInst, rt, rt2, 8877335Sgblack@eecs.umich.edu (IntRegIndex)vm); 8887335Sgblack@eecs.umich.edu } else { 8897335Sgblack@eecs.umich.edu return new Vmov2Reg2Core(machInst, (IntRegIndex)vm, 8907335Sgblack@eecs.umich.edu rt, rt2); 8917335Sgblack@eecs.umich.edu } 8927178Sgblack@eecs.umich.edu } 8937178Sgblack@eecs.umich.edu break; 8947178Sgblack@eecs.umich.edu case 0x1: 8957413Sgblack@eecs.umich.edu { 8967413Sgblack@eecs.umich.edu if (offset == 0 || vd + offset > NumFloatArchRegs) { 8977413Sgblack@eecs.umich.edu break; 8987413Sgblack@eecs.umich.edu } 8997413Sgblack@eecs.umich.edu switch (bits(opcode, 1, 0)) { 9007413Sgblack@eecs.umich.edu case 0x0: 9017413Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 9027413Sgblack@eecs.umich.edu true, false, false, offset); 9037413Sgblack@eecs.umich.edu case 0x1: 9047413Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 9057413Sgblack@eecs.umich.edu true, false, true, offset); 9067413Sgblack@eecs.umich.edu case 0x2: 9077413Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 9087413Sgblack@eecs.umich.edu true, true, false, offset); 9097413Sgblack@eecs.umich.edu case 0x3: 9107413Sgblack@eecs.umich.edu // If rn == sp, then this is called vpop. 9117413Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 9127413Sgblack@eecs.umich.edu true, true, true, offset); 9137413Sgblack@eecs.umich.edu } 9147178Sgblack@eecs.umich.edu } 9157178Sgblack@eecs.umich.edu case 0x2: 9167178Sgblack@eecs.umich.edu if (bits(opcode, 1, 0) == 0x2) { 9177178Sgblack@eecs.umich.edu // If rn == sp, then this is called vpush. 9187178Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 9197178Sgblack@eecs.umich.edu false, true, false, offset); 9207178Sgblack@eecs.umich.edu } else if (bits(opcode, 1, 0) == 0x3) { 9217178Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 9227178Sgblack@eecs.umich.edu false, true, true, offset); 9237178Sgblack@eecs.umich.edu } 9247178Sgblack@eecs.umich.edu // Fall through on purpose 9257178Sgblack@eecs.umich.edu case 0x3: 9267346Sgblack@eecs.umich.edu const bool up = (bits(machInst, 23) == 1); 9277346Sgblack@eecs.umich.edu const uint32_t imm = bits(machInst, 7, 0) << 2; 9287346Sgblack@eecs.umich.edu RegIndex vd; 9297346Sgblack@eecs.umich.edu if (single) { 9307346Sgblack@eecs.umich.edu vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) | 9317346Sgblack@eecs.umich.edu (bits(machInst, 22))); 9327346Sgblack@eecs.umich.edu } else { 9337346Sgblack@eecs.umich.edu vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) | 9347346Sgblack@eecs.umich.edu (bits(machInst, 22) << 5)); 9357346Sgblack@eecs.umich.edu } 9367178Sgblack@eecs.umich.edu if (bits(opcode, 1, 0) == 0x0) { 9377346Sgblack@eecs.umich.edu if (single) { 9387346Sgblack@eecs.umich.edu if (up) { 9397346Sgblack@eecs.umich.edu return new %(vstr_us)s(machInst, vd, rn, up, imm); 9407346Sgblack@eecs.umich.edu } else { 9417346Sgblack@eecs.umich.edu return new %(vstr_s)s(machInst, vd, rn, up, imm); 9427346Sgblack@eecs.umich.edu } 9437346Sgblack@eecs.umich.edu } else { 9447346Sgblack@eecs.umich.edu if (up) { 9457346Sgblack@eecs.umich.edu return new %(vstr_ud)s(machInst, vd, vd + 1, 9467346Sgblack@eecs.umich.edu rn, up, imm); 9477346Sgblack@eecs.umich.edu } else { 9487346Sgblack@eecs.umich.edu return new %(vstr_d)s(machInst, vd, vd + 1, 9497346Sgblack@eecs.umich.edu rn, up, imm); 9507346Sgblack@eecs.umich.edu } 9517346Sgblack@eecs.umich.edu } 9527178Sgblack@eecs.umich.edu } else if (bits(opcode, 1, 0) == 0x1) { 9537337Sgblack@eecs.umich.edu if (single) { 9547337Sgblack@eecs.umich.edu if (up) { 9557337Sgblack@eecs.umich.edu return new %(vldr_us)s(machInst, vd, rn, up, imm); 9567337Sgblack@eecs.umich.edu } else { 9577337Sgblack@eecs.umich.edu return new %(vldr_s)s(machInst, vd, rn, up, imm); 9587337Sgblack@eecs.umich.edu } 9597337Sgblack@eecs.umich.edu } else { 9607337Sgblack@eecs.umich.edu if (up) { 9617337Sgblack@eecs.umich.edu return new %(vldr_ud)s(machInst, vd, vd + 1, 9627337Sgblack@eecs.umich.edu rn, up, imm); 9637337Sgblack@eecs.umich.edu } else { 9647337Sgblack@eecs.umich.edu return new %(vldr_d)s(machInst, vd, vd + 1, 9657337Sgblack@eecs.umich.edu rn, up, imm); 9667337Sgblack@eecs.umich.edu } 9677337Sgblack@eecs.umich.edu } 9687178Sgblack@eecs.umich.edu } 9697178Sgblack@eecs.umich.edu } 9707178Sgblack@eecs.umich.edu return new Unknown(machInst); 9717178Sgblack@eecs.umich.edu } 9727337Sgblack@eecs.umich.edu ''' % { 9737337Sgblack@eecs.umich.edu "vldr_us" : "VLDR_" + loadImmClassName(False, True, False), 9747337Sgblack@eecs.umich.edu "vldr_s" : "VLDR_" + loadImmClassName(False, False, False), 9757337Sgblack@eecs.umich.edu "vldr_ud" : "VLDR_" + loadDoubleImmClassName(False, True, False), 9767346Sgblack@eecs.umich.edu "vldr_d" : "VLDR_" + loadDoubleImmClassName(False, False, False), 9777346Sgblack@eecs.umich.edu "vstr_us" : "VSTR_" + storeImmClassName(False, True, False), 9787346Sgblack@eecs.umich.edu "vstr_s" : "VSTR_" + storeImmClassName(False, False, False), 9797346Sgblack@eecs.umich.edu "vstr_ud" : "VSTR_" + storeDoubleImmClassName(False, True, False), 9807346Sgblack@eecs.umich.edu "vstr_d" : "VSTR_" + storeDoubleImmClassName(False, False, False) 9817337Sgblack@eecs.umich.edu } 9827178Sgblack@eecs.umich.edu}}; 9837321Sgblack@eecs.umich.edu 9847356Sgblack@eecs.umich.edudef format ExtensionRegLoadStore() {{ 9857321Sgblack@eecs.umich.edu decode_block = ''' 9867356Sgblack@eecs.umich.edu return decodeExtensionRegLoadStore(machInst); 9877356Sgblack@eecs.umich.edu ''' 9887356Sgblack@eecs.umich.edu}}; 9897356Sgblack@eecs.umich.edu 9907356Sgblack@eecs.umich.edulet {{ 9917356Sgblack@eecs.umich.edu header_output = ''' 9927356Sgblack@eecs.umich.edu StaticInstPtr 9937356Sgblack@eecs.umich.edu decodeShortFpTransfer(ExtMachInst machInst); 9947356Sgblack@eecs.umich.edu ''' 9957356Sgblack@eecs.umich.edu decoder_output = ''' 9967356Sgblack@eecs.umich.edu StaticInstPtr 9977356Sgblack@eecs.umich.edu decodeShortFpTransfer(ExtMachInst machInst) 9987321Sgblack@eecs.umich.edu { 9997321Sgblack@eecs.umich.edu const uint32_t l = bits(machInst, 20); 10007321Sgblack@eecs.umich.edu const uint32_t c = bits(machInst, 8); 10017321Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 23, 21); 10027321Sgblack@eecs.umich.edu const uint32_t b = bits(machInst, 6, 5); 10037321Sgblack@eecs.umich.edu if ((machInst.thumb == 1 && bits(machInst, 28) == 1) || 10047321Sgblack@eecs.umich.edu (machInst.thumb == 0 && machInst.condCode == 0xf)) { 10057321Sgblack@eecs.umich.edu return new Unknown(machInst); 10067321Sgblack@eecs.umich.edu } 10077321Sgblack@eecs.umich.edu if (l == 0 && c == 0) { 10087321Sgblack@eecs.umich.edu if (a == 0) { 10097335Sgblack@eecs.umich.edu const uint32_t vn = (bits(machInst, 19, 16) << 1) | 10107335Sgblack@eecs.umich.edu bits(machInst, 7); 10117335Sgblack@eecs.umich.edu const IntRegIndex rt = 10127335Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 10137335Sgblack@eecs.umich.edu if (bits(machInst, 20) == 1) { 10147335Sgblack@eecs.umich.edu return new VmovRegCoreW(machInst, rt, (IntRegIndex)vn); 10157335Sgblack@eecs.umich.edu } else { 10167335Sgblack@eecs.umich.edu return new VmovCoreRegW(machInst, (IntRegIndex)vn, rt); 10177335Sgblack@eecs.umich.edu } 10187321Sgblack@eecs.umich.edu } else if (a == 0x7) { 10197323Sgblack@eecs.umich.edu const IntRegIndex rt = 10207323Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 10217323Sgblack@eecs.umich.edu uint32_t specReg = bits(machInst, 19, 16); 10227323Sgblack@eecs.umich.edu switch (specReg) { 10237323Sgblack@eecs.umich.edu case 0: 10247323Sgblack@eecs.umich.edu specReg = MISCREG_FPSID; 10257323Sgblack@eecs.umich.edu break; 10267323Sgblack@eecs.umich.edu case 1: 10277323Sgblack@eecs.umich.edu specReg = MISCREG_FPSCR; 10287323Sgblack@eecs.umich.edu break; 10297394Sgblack@eecs.umich.edu case 6: 10307394Sgblack@eecs.umich.edu specReg = MISCREG_MVFR1; 10317394Sgblack@eecs.umich.edu break; 10327394Sgblack@eecs.umich.edu case 7: 10337394Sgblack@eecs.umich.edu specReg = MISCREG_MVFR0; 10347394Sgblack@eecs.umich.edu break; 10357323Sgblack@eecs.umich.edu case 8: 10367323Sgblack@eecs.umich.edu specReg = MISCREG_FPEXC; 10377323Sgblack@eecs.umich.edu break; 10387323Sgblack@eecs.umich.edu default: 10397323Sgblack@eecs.umich.edu return new Unknown(machInst); 10407323Sgblack@eecs.umich.edu } 10417323Sgblack@eecs.umich.edu return new Vmsr(machInst, (IntRegIndex)specReg, rt); 10427321Sgblack@eecs.umich.edu } 10437321Sgblack@eecs.umich.edu } else if (l == 0 && c == 1) { 10447321Sgblack@eecs.umich.edu if (bits(a, 2) == 0) { 10457335Sgblack@eecs.umich.edu uint32_t vd = (bits(machInst, 7) << 5) | 10467335Sgblack@eecs.umich.edu (bits(machInst, 19, 16) << 1); 10477335Sgblack@eecs.umich.edu uint32_t index, size; 10487335Sgblack@eecs.umich.edu const IntRegIndex rt = 10497335Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 10507335Sgblack@eecs.umich.edu if (bits(machInst, 22) == 1) { 10517335Sgblack@eecs.umich.edu size = 8; 10527335Sgblack@eecs.umich.edu index = (bits(machInst, 21) << 2) | 10537335Sgblack@eecs.umich.edu bits(machInst, 6, 5); 10547335Sgblack@eecs.umich.edu } else if (bits(machInst, 5) == 1) { 10557335Sgblack@eecs.umich.edu size = 16; 10567335Sgblack@eecs.umich.edu index = (bits(machInst, 21) << 1) | 10577335Sgblack@eecs.umich.edu bits(machInst, 6); 10587335Sgblack@eecs.umich.edu } else if (bits(machInst, 6) == 0) { 10597335Sgblack@eecs.umich.edu size = 32; 10607335Sgblack@eecs.umich.edu index = bits(machInst, 21); 10617335Sgblack@eecs.umich.edu } else { 10627335Sgblack@eecs.umich.edu return new Unknown(machInst); 10637335Sgblack@eecs.umich.edu } 10647335Sgblack@eecs.umich.edu if (index >= (32 / size)) { 10657335Sgblack@eecs.umich.edu index -= (32 / size); 10667335Sgblack@eecs.umich.edu vd++; 10677335Sgblack@eecs.umich.edu } 10687335Sgblack@eecs.umich.edu switch (size) { 10697335Sgblack@eecs.umich.edu case 8: 10707335Sgblack@eecs.umich.edu return new VmovCoreRegB(machInst, (IntRegIndex)vd, 10717335Sgblack@eecs.umich.edu rt, index); 10727335Sgblack@eecs.umich.edu case 16: 10737335Sgblack@eecs.umich.edu return new VmovCoreRegH(machInst, (IntRegIndex)vd, 10747335Sgblack@eecs.umich.edu rt, index); 10757335Sgblack@eecs.umich.edu case 32: 10767335Sgblack@eecs.umich.edu return new VmovCoreRegW(machInst, (IntRegIndex)vd, rt); 10777335Sgblack@eecs.umich.edu } 10787321Sgblack@eecs.umich.edu } else if (bits(b, 1) == 0) { 10797321Sgblack@eecs.umich.edu // A8-594 10807321Sgblack@eecs.umich.edu return new WarnUnimplemented("vdup", machInst); 10817321Sgblack@eecs.umich.edu } 10827321Sgblack@eecs.umich.edu } else if (l == 1 && c == 0) { 10837321Sgblack@eecs.umich.edu if (a == 0) { 10847335Sgblack@eecs.umich.edu const uint32_t vn = (bits(machInst, 19, 16) << 1) | 10857335Sgblack@eecs.umich.edu bits(machInst, 7); 10867335Sgblack@eecs.umich.edu const IntRegIndex rt = 10877335Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 10887335Sgblack@eecs.umich.edu if (bits(machInst, 20) == 1) { 10897335Sgblack@eecs.umich.edu return new VmovRegCoreW(machInst, rt, (IntRegIndex)vn); 10907335Sgblack@eecs.umich.edu } else { 10917335Sgblack@eecs.umich.edu return new VmovCoreRegW(machInst, (IntRegIndex)vn, rt); 10927335Sgblack@eecs.umich.edu } 10937321Sgblack@eecs.umich.edu } else if (a == 7) { 10947326Sgblack@eecs.umich.edu const IntRegIndex rt = 10957326Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 10967326Sgblack@eecs.umich.edu uint32_t specReg = bits(machInst, 19, 16); 10977326Sgblack@eecs.umich.edu switch (specReg) { 10987326Sgblack@eecs.umich.edu case 0: 10997326Sgblack@eecs.umich.edu specReg = MISCREG_FPSID; 11007326Sgblack@eecs.umich.edu break; 11017326Sgblack@eecs.umich.edu case 1: 11027326Sgblack@eecs.umich.edu specReg = MISCREG_FPSCR; 11037326Sgblack@eecs.umich.edu break; 11047326Sgblack@eecs.umich.edu case 6: 11057326Sgblack@eecs.umich.edu specReg = MISCREG_MVFR1; 11067326Sgblack@eecs.umich.edu break; 11077326Sgblack@eecs.umich.edu case 7: 11087326Sgblack@eecs.umich.edu specReg = MISCREG_MVFR0; 11097326Sgblack@eecs.umich.edu break; 11107326Sgblack@eecs.umich.edu case 8: 11117326Sgblack@eecs.umich.edu specReg = MISCREG_FPEXC; 11127326Sgblack@eecs.umich.edu break; 11137326Sgblack@eecs.umich.edu default: 11147326Sgblack@eecs.umich.edu return new Unknown(machInst); 11157326Sgblack@eecs.umich.edu } 11167392Sgblack@eecs.umich.edu if (rt == 0xf) { 11177392Sgblack@eecs.umich.edu CPSR cpsrMask = 0; 11187392Sgblack@eecs.umich.edu cpsrMask.n = 1; 11197392Sgblack@eecs.umich.edu cpsrMask.z = 1; 11207392Sgblack@eecs.umich.edu cpsrMask.c = 1; 11217392Sgblack@eecs.umich.edu cpsrMask.v = 1; 11227392Sgblack@eecs.umich.edu return new VmrsApsr(machInst, INTREG_CONDCODES, 11237392Sgblack@eecs.umich.edu (IntRegIndex)specReg, (uint32_t)cpsrMask); 11247392Sgblack@eecs.umich.edu } else { 11257392Sgblack@eecs.umich.edu return new Vmrs(machInst, rt, (IntRegIndex)specReg); 11267392Sgblack@eecs.umich.edu } 11277321Sgblack@eecs.umich.edu } 11287321Sgblack@eecs.umich.edu } else { 11297335Sgblack@eecs.umich.edu uint32_t vd = (bits(machInst, 7) << 5) | 11307335Sgblack@eecs.umich.edu (bits(machInst, 19, 16) << 1); 11317335Sgblack@eecs.umich.edu uint32_t index, size; 11327335Sgblack@eecs.umich.edu const IntRegIndex rt = 11337335Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 11347335Sgblack@eecs.umich.edu const bool u = (bits(machInst, 23) == 1); 11357335Sgblack@eecs.umich.edu if (bits(machInst, 22) == 1) { 11367335Sgblack@eecs.umich.edu size = 8; 11377335Sgblack@eecs.umich.edu index = (bits(machInst, 21) << 2) | 11387335Sgblack@eecs.umich.edu bits(machInst, 6, 5); 11397335Sgblack@eecs.umich.edu } else if (bits(machInst, 5) == 1) { 11407335Sgblack@eecs.umich.edu size = 16; 11417335Sgblack@eecs.umich.edu index = (bits(machInst, 21) << 1) | 11427335Sgblack@eecs.umich.edu bits(machInst, 6); 11437335Sgblack@eecs.umich.edu } else if (bits(machInst, 6) == 0 && !u) { 11447335Sgblack@eecs.umich.edu size = 32; 11457335Sgblack@eecs.umich.edu index = bits(machInst, 21); 11467335Sgblack@eecs.umich.edu } else { 11477335Sgblack@eecs.umich.edu return new Unknown(machInst); 11487335Sgblack@eecs.umich.edu } 11497335Sgblack@eecs.umich.edu if (index >= (32 / size)) { 11507335Sgblack@eecs.umich.edu index -= (32 / size); 11517335Sgblack@eecs.umich.edu vd++; 11527335Sgblack@eecs.umich.edu } 11537335Sgblack@eecs.umich.edu switch (size) { 11547335Sgblack@eecs.umich.edu case 8: 11557335Sgblack@eecs.umich.edu if (u) { 11567335Sgblack@eecs.umich.edu return new VmovRegCoreUB(machInst, rt, 11577335Sgblack@eecs.umich.edu (IntRegIndex)vd, index); 11587335Sgblack@eecs.umich.edu } else { 11597335Sgblack@eecs.umich.edu return new VmovRegCoreSB(machInst, rt, 11607335Sgblack@eecs.umich.edu (IntRegIndex)vd, index); 11617335Sgblack@eecs.umich.edu } 11627335Sgblack@eecs.umich.edu case 16: 11637335Sgblack@eecs.umich.edu if (u) { 11647335Sgblack@eecs.umich.edu return new VmovRegCoreUH(machInst, rt, 11657335Sgblack@eecs.umich.edu (IntRegIndex)vd, index); 11667335Sgblack@eecs.umich.edu } else { 11677335Sgblack@eecs.umich.edu return new VmovRegCoreSH(machInst, rt, 11687335Sgblack@eecs.umich.edu (IntRegIndex)vd, index); 11697335Sgblack@eecs.umich.edu } 11707335Sgblack@eecs.umich.edu case 32: 11717335Sgblack@eecs.umich.edu return new VmovRegCoreW(machInst, rt, (IntRegIndex)vd); 11727335Sgblack@eecs.umich.edu } 11737321Sgblack@eecs.umich.edu } 11747321Sgblack@eecs.umich.edu return new Unknown(machInst); 11757321Sgblack@eecs.umich.edu } 11767321Sgblack@eecs.umich.edu ''' 11777321Sgblack@eecs.umich.edu}}; 11787356Sgblack@eecs.umich.edu 11797356Sgblack@eecs.umich.edudef format ShortFpTransfer() {{ 11807356Sgblack@eecs.umich.edu decode_block = ''' 11817356Sgblack@eecs.umich.edu return decodeShortFpTransfer(machInst); 11827356Sgblack@eecs.umich.edu ''' 11837356Sgblack@eecs.umich.edu}}; 11847363Sgblack@eecs.umich.edu 11857363Sgblack@eecs.umich.edulet {{ 11867363Sgblack@eecs.umich.edu header_output = ''' 11877363Sgblack@eecs.umich.edu StaticInstPtr 11887363Sgblack@eecs.umich.edu decodeVfpData(ExtMachInst machInst); 11897363Sgblack@eecs.umich.edu ''' 11907363Sgblack@eecs.umich.edu decoder_output = ''' 11917363Sgblack@eecs.umich.edu StaticInstPtr 11927363Sgblack@eecs.umich.edu decodeVfpData(ExtMachInst machInst) 11937363Sgblack@eecs.umich.edu { 11947363Sgblack@eecs.umich.edu const uint32_t opc1 = bits(machInst, 23, 20); 11957363Sgblack@eecs.umich.edu const uint32_t opc2 = bits(machInst, 19, 16); 11967363Sgblack@eecs.umich.edu const uint32_t opc3 = bits(machInst, 7, 6); 11977363Sgblack@eecs.umich.edu //const uint32_t opc4 = bits(machInst, 3, 0); 11987372Sgblack@eecs.umich.edu const bool single = (bits(machInst, 8) == 0); 11997389Sgblack@eecs.umich.edu // Used to select between vcmp and vcmpe. 12007389Sgblack@eecs.umich.edu const bool e = (bits(machInst, 7) == 1); 12017372Sgblack@eecs.umich.edu IntRegIndex vd; 12027372Sgblack@eecs.umich.edu IntRegIndex vm; 12037372Sgblack@eecs.umich.edu IntRegIndex vn; 12047372Sgblack@eecs.umich.edu if (single) { 12057372Sgblack@eecs.umich.edu vd = (IntRegIndex)(bits(machInst, 22) | 12067372Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 12077372Sgblack@eecs.umich.edu vm = (IntRegIndex)(bits(machInst, 5) | 12087372Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1)); 12097372Sgblack@eecs.umich.edu vn = (IntRegIndex)(bits(machInst, 7) | 12107372Sgblack@eecs.umich.edu (bits(machInst, 19, 16) << 1)); 12117372Sgblack@eecs.umich.edu } else { 12127372Sgblack@eecs.umich.edu vd = (IntRegIndex)((bits(machInst, 22) << 5) | 12137372Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 12147372Sgblack@eecs.umich.edu vm = (IntRegIndex)((bits(machInst, 5) << 5) | 12157372Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1)); 12167372Sgblack@eecs.umich.edu vn = (IntRegIndex)((bits(machInst, 7) << 5) | 12177372Sgblack@eecs.umich.edu (bits(machInst, 19, 16) << 1)); 12187372Sgblack@eecs.umich.edu } 12197363Sgblack@eecs.umich.edu switch (opc1 & 0xb /* 1011 */) { 12207363Sgblack@eecs.umich.edu case 0x0: 12217370Sgblack@eecs.umich.edu if (bits(machInst, 6) == 0) { 12227372Sgblack@eecs.umich.edu if (single) { 12237376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VmlaS>( 12247376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 12257370Sgblack@eecs.umich.edu } else { 12267376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VmlaD>( 12277376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 12287370Sgblack@eecs.umich.edu } 12297370Sgblack@eecs.umich.edu } else { 12307372Sgblack@eecs.umich.edu if (single) { 12317376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VmlsS>( 12327376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 12337370Sgblack@eecs.umich.edu } else { 12347376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VmlsD>( 12357376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 12367370Sgblack@eecs.umich.edu } 12377370Sgblack@eecs.umich.edu } 12387371Sgblack@eecs.umich.edu case 0x1: 12397371Sgblack@eecs.umich.edu if (bits(machInst, 6) == 1) { 12407372Sgblack@eecs.umich.edu if (single) { 12417376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VnmlaS>( 12427376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 12437371Sgblack@eecs.umich.edu } else { 12447376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VnmlaD>( 12457376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 12467371Sgblack@eecs.umich.edu } 12477371Sgblack@eecs.umich.edu } else { 12487372Sgblack@eecs.umich.edu if (single) { 12497376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VnmlsS>( 12507376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 12517371Sgblack@eecs.umich.edu } else { 12527376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VnmlsD>( 12537376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 12547371Sgblack@eecs.umich.edu } 12557371Sgblack@eecs.umich.edu } 12567363Sgblack@eecs.umich.edu case 0x2: 12577363Sgblack@eecs.umich.edu if ((opc3 & 0x1) == 0) { 12587372Sgblack@eecs.umich.edu if (single) { 12597376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VmulS>( 12607376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 12617364Sgblack@eecs.umich.edu } else { 12627376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VmulD>( 12637376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 12647364Sgblack@eecs.umich.edu } 12657371Sgblack@eecs.umich.edu } else { 12667372Sgblack@eecs.umich.edu if (single) { 12677376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VnmulS>( 12687376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 12697371Sgblack@eecs.umich.edu } else { 12707376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VnmulD>( 12717376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 12727371Sgblack@eecs.umich.edu } 12737363Sgblack@eecs.umich.edu } 12747363Sgblack@eecs.umich.edu case 0x3: 12757363Sgblack@eecs.umich.edu if ((opc3 & 0x1) == 0) { 12767372Sgblack@eecs.umich.edu if (single) { 12777376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VaddS>( 12787376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 12797367Sgblack@eecs.umich.edu } else { 12807376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VaddD>( 12817376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 12827367Sgblack@eecs.umich.edu } 12837363Sgblack@eecs.umich.edu } else { 12847372Sgblack@eecs.umich.edu if (single) { 12857376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VsubS>( 12867376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 12877368Sgblack@eecs.umich.edu } else { 12887376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VsubD>( 12897376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 12907368Sgblack@eecs.umich.edu } 12917363Sgblack@eecs.umich.edu } 12927363Sgblack@eecs.umich.edu case 0x8: 12937363Sgblack@eecs.umich.edu if ((opc3 & 0x1) == 0) { 12947372Sgblack@eecs.umich.edu if (single) { 12957376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VdivS>( 12967376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 12977369Sgblack@eecs.umich.edu } else { 12987376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VdivD>( 12997376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 13007369Sgblack@eecs.umich.edu } 13017363Sgblack@eecs.umich.edu } 13027363Sgblack@eecs.umich.edu break; 13037363Sgblack@eecs.umich.edu case 0xb: 13047363Sgblack@eecs.umich.edu if ((opc3 & 0x1) == 0) { 13057363Sgblack@eecs.umich.edu const uint32_t baseImm = 13067363Sgblack@eecs.umich.edu bits(machInst, 3, 0) | (bits(machInst, 19, 16) << 4); 13077372Sgblack@eecs.umich.edu if (single) { 13087363Sgblack@eecs.umich.edu uint32_t imm = vfp_modified_imm(baseImm, false); 13097376Sgblack@eecs.umich.edu return decodeVfpRegImmOp<VmovImmS>( 13107376Sgblack@eecs.umich.edu machInst, vd, imm, false); 13117363Sgblack@eecs.umich.edu } else { 13127363Sgblack@eecs.umich.edu uint64_t imm = vfp_modified_imm(baseImm, true); 13137376Sgblack@eecs.umich.edu return decodeVfpRegImmOp<VmovImmD>( 13147376Sgblack@eecs.umich.edu machInst, vd, imm, true); 13157363Sgblack@eecs.umich.edu } 13167363Sgblack@eecs.umich.edu } 13177363Sgblack@eecs.umich.edu switch (opc2) { 13187363Sgblack@eecs.umich.edu case 0x0: 13197363Sgblack@eecs.umich.edu if (opc3 == 1) { 13207372Sgblack@eecs.umich.edu if (single) { 13217376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VmovRegS>( 13227376Sgblack@eecs.umich.edu machInst, vd, vm, false); 13237363Sgblack@eecs.umich.edu } else { 13247376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VmovRegD>( 13257376Sgblack@eecs.umich.edu machInst, vd, vm, true); 13267363Sgblack@eecs.umich.edu } 13277363Sgblack@eecs.umich.edu } else { 13287372Sgblack@eecs.umich.edu if (single) { 13297376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VabsS>( 13307376Sgblack@eecs.umich.edu machInst, vd, vm, false); 13317366Sgblack@eecs.umich.edu } else { 13327376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VabsD>( 13337376Sgblack@eecs.umich.edu machInst, vd, vm, true); 13347366Sgblack@eecs.umich.edu } 13357363Sgblack@eecs.umich.edu } 13367363Sgblack@eecs.umich.edu case 0x1: 13377363Sgblack@eecs.umich.edu if (opc3 == 1) { 13387372Sgblack@eecs.umich.edu if (single) { 13397376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VnegS>( 13407376Sgblack@eecs.umich.edu machInst, vd, vm, false); 13417365Sgblack@eecs.umich.edu } else { 13427376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VnegD>( 13437376Sgblack@eecs.umich.edu machInst, vd, vm, true); 13447365Sgblack@eecs.umich.edu } 13457363Sgblack@eecs.umich.edu } else { 13467372Sgblack@eecs.umich.edu if (single) { 13477376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VsqrtS>( 13487376Sgblack@eecs.umich.edu machInst, vd, vm, false); 13497369Sgblack@eecs.umich.edu } else { 13507376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VsqrtD>( 13517376Sgblack@eecs.umich.edu machInst, vd, vm, true); 13527369Sgblack@eecs.umich.edu } 13537363Sgblack@eecs.umich.edu } 13547363Sgblack@eecs.umich.edu case 0x2: 13557363Sgblack@eecs.umich.edu case 0x3: 13567398Sgblack@eecs.umich.edu { 13577398Sgblack@eecs.umich.edu const bool toHalf = bits(machInst, 16); 13587398Sgblack@eecs.umich.edu const bool top = bits(machInst, 7); 13597398Sgblack@eecs.umich.edu if (top) { 13607398Sgblack@eecs.umich.edu if (toHalf) { 13617398Sgblack@eecs.umich.edu return new VcvtFpSFpHT(machInst, vd, vm); 13627398Sgblack@eecs.umich.edu } else { 13637398Sgblack@eecs.umich.edu return new VcvtFpHTFpS(machInst, vd, vm); 13647398Sgblack@eecs.umich.edu } 13657398Sgblack@eecs.umich.edu } else { 13667398Sgblack@eecs.umich.edu if (toHalf) { 13677398Sgblack@eecs.umich.edu return new VcvtFpSFpHB(machInst, vd, vm); 13687398Sgblack@eecs.umich.edu } else { 13697398Sgblack@eecs.umich.edu return new VcvtFpHBFpS(machInst, vd, vm); 13707398Sgblack@eecs.umich.edu } 13717398Sgblack@eecs.umich.edu } 13727398Sgblack@eecs.umich.edu } 13737363Sgblack@eecs.umich.edu case 0x4: 13747377Sgblack@eecs.umich.edu if (single) { 13757389Sgblack@eecs.umich.edu if (e) { 13767389Sgblack@eecs.umich.edu return new VcmpeS(machInst, vd, vm); 13777389Sgblack@eecs.umich.edu } else { 13787389Sgblack@eecs.umich.edu return new VcmpS(machInst, vd, vm); 13797389Sgblack@eecs.umich.edu } 13807377Sgblack@eecs.umich.edu } else { 13817389Sgblack@eecs.umich.edu if (e) { 13827389Sgblack@eecs.umich.edu return new VcmpeD(machInst, vd, vm); 13837389Sgblack@eecs.umich.edu } else { 13847389Sgblack@eecs.umich.edu return new VcmpD(machInst, vd, vm); 13857389Sgblack@eecs.umich.edu } 13867377Sgblack@eecs.umich.edu } 13877363Sgblack@eecs.umich.edu case 0x5: 13887377Sgblack@eecs.umich.edu if (single) { 13897389Sgblack@eecs.umich.edu if (e) { 13907389Sgblack@eecs.umich.edu return new VcmpeZeroS(machInst, vd, 0); 13917389Sgblack@eecs.umich.edu } else { 13927389Sgblack@eecs.umich.edu return new VcmpZeroS(machInst, vd, 0); 13937389Sgblack@eecs.umich.edu } 13947377Sgblack@eecs.umich.edu } else { 13957389Sgblack@eecs.umich.edu if (e) { 13967389Sgblack@eecs.umich.edu return new VcmpeZeroD(machInst, vd, 0); 13977389Sgblack@eecs.umich.edu } else { 13987389Sgblack@eecs.umich.edu return new VcmpZeroD(machInst, vd, 0); 13997389Sgblack@eecs.umich.edu } 14007377Sgblack@eecs.umich.edu } 14017363Sgblack@eecs.umich.edu case 0x7: 14027363Sgblack@eecs.umich.edu if (opc3 == 0x3) { 14037374Sgblack@eecs.umich.edu if (single) { 14047374Sgblack@eecs.umich.edu vm = (IntRegIndex)(bits(machInst, 5) | 14057374Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1)); 14067374Sgblack@eecs.umich.edu return new VcvtFpSFpD(machInst, vd, vm); 14077374Sgblack@eecs.umich.edu } else { 14087374Sgblack@eecs.umich.edu vd = (IntRegIndex)(bits(machInst, 22) | 14097374Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 14107374Sgblack@eecs.umich.edu return new VcvtFpDFpS(machInst, vd, vm); 14117374Sgblack@eecs.umich.edu } 14127363Sgblack@eecs.umich.edu } 14137363Sgblack@eecs.umich.edu break; 14147363Sgblack@eecs.umich.edu case 0x8: 14157373Sgblack@eecs.umich.edu if (bits(machInst, 7) == 0) { 14167373Sgblack@eecs.umich.edu if (single) { 14177373Sgblack@eecs.umich.edu return new VcvtUIntFpS(machInst, vd, vm); 14187373Sgblack@eecs.umich.edu } else { 14197373Sgblack@eecs.umich.edu vm = (IntRegIndex)(bits(machInst, 5) | 14207373Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1)); 14217373Sgblack@eecs.umich.edu return new VcvtUIntFpD(machInst, vd, vm); 14227373Sgblack@eecs.umich.edu } 14237373Sgblack@eecs.umich.edu } else { 14247373Sgblack@eecs.umich.edu if (single) { 14257373Sgblack@eecs.umich.edu return new VcvtSIntFpS(machInst, vd, vm); 14267373Sgblack@eecs.umich.edu } else { 14277373Sgblack@eecs.umich.edu vm = (IntRegIndex)(bits(machInst, 5) | 14287373Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1)); 14297373Sgblack@eecs.umich.edu return new VcvtSIntFpD(machInst, vd, vm); 14307373Sgblack@eecs.umich.edu } 14317373Sgblack@eecs.umich.edu } 14327363Sgblack@eecs.umich.edu case 0xa: 14337379Sgblack@eecs.umich.edu { 14347379Sgblack@eecs.umich.edu const bool half = (bits(machInst, 7) == 0); 14357379Sgblack@eecs.umich.edu const uint32_t imm = bits(machInst, 5) | 14367379Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1); 14377379Sgblack@eecs.umich.edu const uint32_t size = 14387379Sgblack@eecs.umich.edu (bits(machInst, 7) == 0 ? 16 : 32) - imm; 14397379Sgblack@eecs.umich.edu if (single) { 14407379Sgblack@eecs.umich.edu if (half) { 14417379Sgblack@eecs.umich.edu return new VcvtSHFixedFpS(machInst, vd, vd, size); 14427379Sgblack@eecs.umich.edu } else { 14437379Sgblack@eecs.umich.edu return new VcvtSFixedFpS(machInst, vd, vd, size); 14447379Sgblack@eecs.umich.edu } 14457379Sgblack@eecs.umich.edu } else { 14467379Sgblack@eecs.umich.edu if (half) { 14477379Sgblack@eecs.umich.edu return new VcvtSHFixedFpD(machInst, vd, vd, size); 14487379Sgblack@eecs.umich.edu } else { 14497379Sgblack@eecs.umich.edu return new VcvtSFixedFpD(machInst, vd, vd, size); 14507379Sgblack@eecs.umich.edu } 14517379Sgblack@eecs.umich.edu } 14527379Sgblack@eecs.umich.edu } 14537363Sgblack@eecs.umich.edu case 0xb: 14547379Sgblack@eecs.umich.edu { 14557379Sgblack@eecs.umich.edu const bool half = (bits(machInst, 7) == 0); 14567379Sgblack@eecs.umich.edu const uint32_t imm = bits(machInst, 5) | 14577379Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1); 14587379Sgblack@eecs.umich.edu const uint32_t size = 14597379Sgblack@eecs.umich.edu (bits(machInst, 7) == 0 ? 16 : 32) - imm; 14607379Sgblack@eecs.umich.edu if (single) { 14617379Sgblack@eecs.umich.edu if (half) { 14627379Sgblack@eecs.umich.edu return new VcvtUHFixedFpS(machInst, vd, vd, size); 14637379Sgblack@eecs.umich.edu } else { 14647379Sgblack@eecs.umich.edu return new VcvtUFixedFpS(machInst, vd, vd, size); 14657379Sgblack@eecs.umich.edu } 14667379Sgblack@eecs.umich.edu } else { 14677379Sgblack@eecs.umich.edu if (half) { 14687379Sgblack@eecs.umich.edu return new VcvtUHFixedFpD(machInst, vd, vd, size); 14697379Sgblack@eecs.umich.edu } else { 14707379Sgblack@eecs.umich.edu return new VcvtUFixedFpD(machInst, vd, vd, size); 14717379Sgblack@eecs.umich.edu } 14727379Sgblack@eecs.umich.edu } 14737379Sgblack@eecs.umich.edu } 14747363Sgblack@eecs.umich.edu case 0xc: 14757380Sgblack@eecs.umich.edu if (bits(machInst, 7) == 0) { 14767380Sgblack@eecs.umich.edu if (single) { 14777380Sgblack@eecs.umich.edu return new VcvtFpUIntSR(machInst, vd, vm); 14787380Sgblack@eecs.umich.edu } else { 14797380Sgblack@eecs.umich.edu vd = (IntRegIndex)(bits(machInst, 22) | 14807380Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 14817380Sgblack@eecs.umich.edu return new VcvtFpUIntDR(machInst, vd, vm); 14827380Sgblack@eecs.umich.edu } 14837373Sgblack@eecs.umich.edu } else { 14847380Sgblack@eecs.umich.edu if (single) { 14857380Sgblack@eecs.umich.edu return new VcvtFpUIntS(machInst, vd, vm); 14867380Sgblack@eecs.umich.edu } else { 14877380Sgblack@eecs.umich.edu vd = (IntRegIndex)(bits(machInst, 22) | 14887380Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 14897380Sgblack@eecs.umich.edu return new VcvtFpUIntD(machInst, vd, vm); 14907380Sgblack@eecs.umich.edu } 14917373Sgblack@eecs.umich.edu } 14927363Sgblack@eecs.umich.edu case 0xd: 14937380Sgblack@eecs.umich.edu if (bits(machInst, 7) == 0) { 14947380Sgblack@eecs.umich.edu if (single) { 14957380Sgblack@eecs.umich.edu return new VcvtFpSIntSR(machInst, vd, vm); 14967380Sgblack@eecs.umich.edu } else { 14977380Sgblack@eecs.umich.edu vd = (IntRegIndex)(bits(machInst, 22) | 14987380Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 14997380Sgblack@eecs.umich.edu return new VcvtFpSIntDR(machInst, vd, vm); 15007380Sgblack@eecs.umich.edu } 15017373Sgblack@eecs.umich.edu } else { 15027380Sgblack@eecs.umich.edu if (single) { 15037380Sgblack@eecs.umich.edu return new VcvtFpSIntS(machInst, vd, vm); 15047380Sgblack@eecs.umich.edu } else { 15057380Sgblack@eecs.umich.edu vd = (IntRegIndex)(bits(machInst, 22) | 15067380Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 15077380Sgblack@eecs.umich.edu return new VcvtFpSIntD(machInst, vd, vm); 15087380Sgblack@eecs.umich.edu } 15097373Sgblack@eecs.umich.edu } 15107363Sgblack@eecs.umich.edu case 0xe: 15117379Sgblack@eecs.umich.edu { 15127379Sgblack@eecs.umich.edu const bool half = (bits(machInst, 7) == 0); 15137379Sgblack@eecs.umich.edu const uint32_t imm = bits(machInst, 5) | 15147379Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1); 15157379Sgblack@eecs.umich.edu const uint32_t size = 15167379Sgblack@eecs.umich.edu (bits(machInst, 7) == 0 ? 16 : 32) - imm; 15177379Sgblack@eecs.umich.edu if (single) { 15187379Sgblack@eecs.umich.edu if (half) { 15197379Sgblack@eecs.umich.edu return new VcvtFpSHFixedS(machInst, vd, vd, size); 15207379Sgblack@eecs.umich.edu } else { 15217379Sgblack@eecs.umich.edu return new VcvtFpSFixedS(machInst, vd, vd, size); 15227379Sgblack@eecs.umich.edu } 15237379Sgblack@eecs.umich.edu } else { 15247379Sgblack@eecs.umich.edu if (half) { 15257379Sgblack@eecs.umich.edu return new VcvtFpSHFixedD(machInst, vd, vd, size); 15267379Sgblack@eecs.umich.edu } else { 15277379Sgblack@eecs.umich.edu return new VcvtFpSFixedD(machInst, vd, vd, size); 15287379Sgblack@eecs.umich.edu } 15297379Sgblack@eecs.umich.edu } 15307379Sgblack@eecs.umich.edu } 15317363Sgblack@eecs.umich.edu case 0xf: 15327379Sgblack@eecs.umich.edu { 15337379Sgblack@eecs.umich.edu const bool half = (bits(machInst, 7) == 0); 15347379Sgblack@eecs.umich.edu const uint32_t imm = bits(machInst, 5) | 15357379Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1); 15367379Sgblack@eecs.umich.edu const uint32_t size = 15377379Sgblack@eecs.umich.edu (bits(machInst, 7) == 0 ? 16 : 32) - imm; 15387379Sgblack@eecs.umich.edu if (single) { 15397379Sgblack@eecs.umich.edu if (half) { 15407379Sgblack@eecs.umich.edu return new VcvtFpUHFixedS(machInst, vd, vd, size); 15417379Sgblack@eecs.umich.edu } else { 15427379Sgblack@eecs.umich.edu return new VcvtFpUFixedS(machInst, vd, vd, size); 15437379Sgblack@eecs.umich.edu } 15447379Sgblack@eecs.umich.edu } else { 15457379Sgblack@eecs.umich.edu if (half) { 15467379Sgblack@eecs.umich.edu return new VcvtFpUHFixedD(machInst, vd, vd, size); 15477379Sgblack@eecs.umich.edu } else { 15487379Sgblack@eecs.umich.edu return new VcvtFpUFixedD(machInst, vd, vd, size); 15497379Sgblack@eecs.umich.edu } 15507379Sgblack@eecs.umich.edu } 15517379Sgblack@eecs.umich.edu } 15527363Sgblack@eecs.umich.edu } 15537363Sgblack@eecs.umich.edu break; 15547363Sgblack@eecs.umich.edu } 15557363Sgblack@eecs.umich.edu return new Unknown(machInst); 15567363Sgblack@eecs.umich.edu } 15577363Sgblack@eecs.umich.edu ''' 15587363Sgblack@eecs.umich.edu}}; 15597363Sgblack@eecs.umich.edu 15607363Sgblack@eecs.umich.edudef format VfpData() {{ 15617363Sgblack@eecs.umich.edu decode_block = ''' 15627363Sgblack@eecs.umich.edu return decodeVfpData(machInst); 15637363Sgblack@eecs.umich.edu ''' 15647363Sgblack@eecs.umich.edu}}; 1565