fp.isa revision 13738
16019Shines@cs.fsu.edu// -*- mode:c++ -*- 26019Shines@cs.fsu.edu 313738Sciro.santilli@arm.com// Copyright (c) 2010-2011, 2016-2019 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 487639Sgblack@eecs.umich.eduoutput header {{ 497639Sgblack@eecs.umich.edu 507639Sgblack@eecs.umich.edu template<template <typename T> class Base> 517639Sgblack@eecs.umich.edu StaticInstPtr 527639Sgblack@eecs.umich.edu newNeonMemInst(const unsigned size, 537639Sgblack@eecs.umich.edu const ExtMachInst &machInst, 547639Sgblack@eecs.umich.edu const RegIndex dest, const RegIndex ra, 557639Sgblack@eecs.umich.edu const uint32_t imm, const unsigned extraMemFlags) 567639Sgblack@eecs.umich.edu { 577639Sgblack@eecs.umich.edu switch (size) { 587639Sgblack@eecs.umich.edu case 0: 597639Sgblack@eecs.umich.edu return new Base<uint8_t>(machInst, dest, ra, imm, extraMemFlags); 607639Sgblack@eecs.umich.edu case 1: 617639Sgblack@eecs.umich.edu return new Base<uint16_t>(machInst, dest, ra, imm, extraMemFlags); 627639Sgblack@eecs.umich.edu case 2: 637639Sgblack@eecs.umich.edu return new Base<uint32_t>(machInst, dest, ra, imm, extraMemFlags); 647639Sgblack@eecs.umich.edu case 3: 657639Sgblack@eecs.umich.edu return new Base<uint64_t>(machInst, dest, ra, imm, extraMemFlags); 667639Sgblack@eecs.umich.edu default: 677639Sgblack@eecs.umich.edu panic("Unrecognized width %d for Neon mem inst.\n", (1 << size)); 687639Sgblack@eecs.umich.edu } 697639Sgblack@eecs.umich.edu } 707639Sgblack@eecs.umich.edu 717639Sgblack@eecs.umich.edu template<template <typename T> class Base> 727639Sgblack@eecs.umich.edu StaticInstPtr 737639Sgblack@eecs.umich.edu newNeonMixInst(const unsigned size, 747639Sgblack@eecs.umich.edu const ExtMachInst &machInst, 757639Sgblack@eecs.umich.edu const RegIndex dest, const RegIndex op1, 767639Sgblack@eecs.umich.edu const uint32_t step) 777639Sgblack@eecs.umich.edu { 787639Sgblack@eecs.umich.edu switch (size) { 797639Sgblack@eecs.umich.edu case 0: 807639Sgblack@eecs.umich.edu return new Base<uint8_t>(machInst, dest, op1, step); 817639Sgblack@eecs.umich.edu case 1: 827639Sgblack@eecs.umich.edu return new Base<uint16_t>(machInst, dest, op1, step); 837639Sgblack@eecs.umich.edu case 2: 847639Sgblack@eecs.umich.edu return new Base<uint32_t>(machInst, dest, op1, step); 857639Sgblack@eecs.umich.edu case 3: 867639Sgblack@eecs.umich.edu return new Base<uint64_t>(machInst, dest, op1, step); 877639Sgblack@eecs.umich.edu default: 887639Sgblack@eecs.umich.edu panic("Unrecognized width %d for Neon mem inst.\n", (1 << size)); 897639Sgblack@eecs.umich.edu } 907639Sgblack@eecs.umich.edu } 917639Sgblack@eecs.umich.edu 927639Sgblack@eecs.umich.edu}}; 937639Sgblack@eecs.umich.edu 947356Sgblack@eecs.umich.edulet {{ 957356Sgblack@eecs.umich.edu header_output = ''' 967356Sgblack@eecs.umich.edu StaticInstPtr 977435Sgblack@eecs.umich.edu decodeNeonMem(ExtMachInst machInst); 987435Sgblack@eecs.umich.edu 997435Sgblack@eecs.umich.edu StaticInstPtr 1007435Sgblack@eecs.umich.edu decodeNeonData(ExtMachInst machInst); 1017435Sgblack@eecs.umich.edu ''' 1027435Sgblack@eecs.umich.edu 1037435Sgblack@eecs.umich.edu decoder_output = ''' 1047435Sgblack@eecs.umich.edu StaticInstPtr 1057435Sgblack@eecs.umich.edu decodeNeonMem(ExtMachInst machInst) 1067435Sgblack@eecs.umich.edu { 1077435Sgblack@eecs.umich.edu const uint32_t b = bits(machInst, 11, 8); 1087639Sgblack@eecs.umich.edu const bool single = bits(machInst, 23); 1097639Sgblack@eecs.umich.edu const bool singleAll = single && (bits(b, 3, 2) == 3); 1107639Sgblack@eecs.umich.edu const bool load = bits(machInst, 21); 1117435Sgblack@eecs.umich.edu 1127639Sgblack@eecs.umich.edu unsigned width = 0; 1137639Sgblack@eecs.umich.edu 1147639Sgblack@eecs.umich.edu if (single) { 1157639Sgblack@eecs.umich.edu width = bits(b, 1, 0) + 1; 1167639Sgblack@eecs.umich.edu } else { 1177639Sgblack@eecs.umich.edu switch (bits(b, 3, 1)) { 1187639Sgblack@eecs.umich.edu case 0x0: width = 4; 1197639Sgblack@eecs.umich.edu break; 1207639Sgblack@eecs.umich.edu case 0x1: width = (b & 0x1) ? 2 : 1; 1217639Sgblack@eecs.umich.edu break; 1227639Sgblack@eecs.umich.edu case 0x2: width = 3; 1237639Sgblack@eecs.umich.edu break; 1247639Sgblack@eecs.umich.edu case 0x3: width = 1; 1257639Sgblack@eecs.umich.edu break; 1267639Sgblack@eecs.umich.edu case 0x4: width = 2; 1277639Sgblack@eecs.umich.edu break; 1287639Sgblack@eecs.umich.edu case 0x5: 1297639Sgblack@eecs.umich.edu if ((b & 0x1) == 0) { 1307639Sgblack@eecs.umich.edu width = 1; 1317639Sgblack@eecs.umich.edu break; 1327639Sgblack@eecs.umich.edu } 13312595Ssiddhesh.poyarekar@gmail.com M5_FALLTHROUGH; 1347639Sgblack@eecs.umich.edu default: 1357639Sgblack@eecs.umich.edu return new Unknown(machInst); 1367639Sgblack@eecs.umich.edu } 1377639Sgblack@eecs.umich.edu } 1387639Sgblack@eecs.umich.edu assert(width > 0 && width <= 4); 1397639Sgblack@eecs.umich.edu 1407639Sgblack@eecs.umich.edu const RegIndex rm = (RegIndex)(uint32_t)bits(machInst, 3, 0); 1417639Sgblack@eecs.umich.edu const RegIndex rn = (RegIndex)(uint32_t)bits(machInst, 19, 16); 1427639Sgblack@eecs.umich.edu const RegIndex vd = (RegIndex)(uint32_t)(bits(machInst, 15, 12) | 1437639Sgblack@eecs.umich.edu bits(machInst, 22) << 4); 1447639Sgblack@eecs.umich.edu const uint32_t type = bits(machInst, 11, 8); 1457639Sgblack@eecs.umich.edu uint32_t size = 0; 1468144SAli.Saidi@ARM.com uint32_t align = TLB::MustBeOne; 1477639Sgblack@eecs.umich.edu unsigned inc = 1; 1487639Sgblack@eecs.umich.edu unsigned regs = 1; 1497639Sgblack@eecs.umich.edu unsigned lane = 0; 1507639Sgblack@eecs.umich.edu if (single) { 1517639Sgblack@eecs.umich.edu if (singleAll) { 1527639Sgblack@eecs.umich.edu size = bits(machInst, 7, 6); 1537639Sgblack@eecs.umich.edu bool t = bits(machInst, 5); 15410037SARM gem5 Developers align = size | TLB::AllowUnaligned; 1557639Sgblack@eecs.umich.edu if (width == 1) { 1567639Sgblack@eecs.umich.edu regs = t ? 2 : 1; 1577639Sgblack@eecs.umich.edu inc = 1; 1587639Sgblack@eecs.umich.edu } else { 1597639Sgblack@eecs.umich.edu regs = width; 1607639Sgblack@eecs.umich.edu inc = t ? 2 : 1; 1617639Sgblack@eecs.umich.edu } 1627639Sgblack@eecs.umich.edu switch (width) { 1637639Sgblack@eecs.umich.edu case 1: 1647639Sgblack@eecs.umich.edu case 2: 1657639Sgblack@eecs.umich.edu if (bits(machInst, 4)) 16610037SARM gem5 Developers align = size + width - 1; 1677639Sgblack@eecs.umich.edu break; 1687639Sgblack@eecs.umich.edu case 3: 1697639Sgblack@eecs.umich.edu break; 1707639Sgblack@eecs.umich.edu case 4: 1717639Sgblack@eecs.umich.edu if (size == 3) { 1727639Sgblack@eecs.umich.edu if (bits(machInst, 4) == 0) 1737639Sgblack@eecs.umich.edu return new Unknown(machInst); 1747639Sgblack@eecs.umich.edu size = 2; 17510037SARM gem5 Developers align = 0x4; 1767639Sgblack@eecs.umich.edu } else if (size == 2) { 1777639Sgblack@eecs.umich.edu if (bits(machInst, 4)) 17810037SARM gem5 Developers align = 0x3; 1797639Sgblack@eecs.umich.edu } else { 1807639Sgblack@eecs.umich.edu if (bits(machInst, 4)) 18110037SARM gem5 Developers align = size + 2; 1827591SAli.Saidi@ARM.com } 1837639Sgblack@eecs.umich.edu break; 1847435Sgblack@eecs.umich.edu } 1857435Sgblack@eecs.umich.edu } else { 1867639Sgblack@eecs.umich.edu size = bits(machInst, 11, 10); 18710037SARM gem5 Developers align = size | TLB::AllowUnaligned; 1887639Sgblack@eecs.umich.edu regs = width; 1897639Sgblack@eecs.umich.edu unsigned indexAlign = bits(machInst, 7, 4); 1907639Sgblack@eecs.umich.edu // If width is 1, inc is always 1. That's overridden later. 1917639Sgblack@eecs.umich.edu switch (size) { 1927639Sgblack@eecs.umich.edu case 0: 1937639Sgblack@eecs.umich.edu inc = 1; 1947639Sgblack@eecs.umich.edu lane = bits(indexAlign, 3, 1); 1957639Sgblack@eecs.umich.edu break; 1967639Sgblack@eecs.umich.edu case 1: 1977639Sgblack@eecs.umich.edu inc = bits(indexAlign, 1) ? 2 : 1; 1987639Sgblack@eecs.umich.edu lane = bits(indexAlign, 3, 2); 1997639Sgblack@eecs.umich.edu break; 2007639Sgblack@eecs.umich.edu case 2: 2017639Sgblack@eecs.umich.edu inc = bits(indexAlign, 2) ? 2 : 1; 2027639Sgblack@eecs.umich.edu lane = bits(indexAlign, 3); 2037639Sgblack@eecs.umich.edu break; 2047639Sgblack@eecs.umich.edu } 2057639Sgblack@eecs.umich.edu // Override inc for width of 1. 2067639Sgblack@eecs.umich.edu if (width == 1) { 2077639Sgblack@eecs.umich.edu inc = 1; 2087639Sgblack@eecs.umich.edu } 2097639Sgblack@eecs.umich.edu switch (width) { 2107639Sgblack@eecs.umich.edu case 1: 2117639Sgblack@eecs.umich.edu switch (size) { 2127639Sgblack@eecs.umich.edu case 0: 2137639Sgblack@eecs.umich.edu break; 2147639Sgblack@eecs.umich.edu case 1: 2157639Sgblack@eecs.umich.edu if (bits(indexAlign, 0)) 2167639Sgblack@eecs.umich.edu align = 1; 2177639Sgblack@eecs.umich.edu break; 2187639Sgblack@eecs.umich.edu case 2: 2197639Sgblack@eecs.umich.edu if (bits(indexAlign, 1, 0)) 22010037SARM gem5 Developers align = 2; 2217591SAli.Saidi@ARM.com break; 2227591SAli.Saidi@ARM.com } 2237639Sgblack@eecs.umich.edu break; 2247639Sgblack@eecs.umich.edu case 2: 2257639Sgblack@eecs.umich.edu if (bits(indexAlign, 0)) 22610037SARM gem5 Developers align = size + 1; 2277639Sgblack@eecs.umich.edu break; 2287639Sgblack@eecs.umich.edu case 3: 2297639Sgblack@eecs.umich.edu break; 2307639Sgblack@eecs.umich.edu case 4: 2317639Sgblack@eecs.umich.edu switch (size) { 2327639Sgblack@eecs.umich.edu case 0: 2337639Sgblack@eecs.umich.edu case 1: 2347639Sgblack@eecs.umich.edu if (bits(indexAlign, 0)) 23510037SARM gem5 Developers align = size + 2; 2367639Sgblack@eecs.umich.edu break; 2377639Sgblack@eecs.umich.edu case 2: 2387639Sgblack@eecs.umich.edu if (bits(indexAlign, 0)) 23910037SARM gem5 Developers align = bits(indexAlign, 1, 0) + 2; 2407639Sgblack@eecs.umich.edu break; 2417639Sgblack@eecs.umich.edu } 2427639Sgblack@eecs.umich.edu break; 2437435Sgblack@eecs.umich.edu } 2447435Sgblack@eecs.umich.edu } 2457639Sgblack@eecs.umich.edu if (size == 0x3) { 2467639Sgblack@eecs.umich.edu return new Unknown(machInst); 2477639Sgblack@eecs.umich.edu } 2487639Sgblack@eecs.umich.edu } else { 2497639Sgblack@eecs.umich.edu size = bits(machInst, 7, 6); 2507639Sgblack@eecs.umich.edu align = bits(machInst, 5, 4); 2517639Sgblack@eecs.umich.edu if (align == 0) { 2527639Sgblack@eecs.umich.edu // @align wasn't specified, so alignment can be turned off. 25310037SARM gem5 Developers align = size | TLB::AllowUnaligned; 2547639Sgblack@eecs.umich.edu } else { 25510037SARM gem5 Developers align = align + 2; 2567639Sgblack@eecs.umich.edu } 2577639Sgblack@eecs.umich.edu switch (width) { 2587639Sgblack@eecs.umich.edu case 1: 2597639Sgblack@eecs.umich.edu switch (type) { 2607639Sgblack@eecs.umich.edu case 0x7: regs = 1; 2617639Sgblack@eecs.umich.edu break; 2627639Sgblack@eecs.umich.edu case 0xa: regs = 2; 2637639Sgblack@eecs.umich.edu break; 2647639Sgblack@eecs.umich.edu case 0x6: regs = 3; 2657639Sgblack@eecs.umich.edu break; 2667639Sgblack@eecs.umich.edu case 0x2: regs = 4; 2677639Sgblack@eecs.umich.edu break; 2687639Sgblack@eecs.umich.edu default: 2697639Sgblack@eecs.umich.edu return new Unknown(machInst); 2707639Sgblack@eecs.umich.edu } 2717639Sgblack@eecs.umich.edu break; 2727639Sgblack@eecs.umich.edu case 2: 2737639Sgblack@eecs.umich.edu // Regs doesn't behave exactly as it does in the manual 2747639Sgblack@eecs.umich.edu // because they loop over regs registers twice and we break 2757639Sgblack@eecs.umich.edu // it down in the macroop. 2767639Sgblack@eecs.umich.edu switch (type) { 2777639Sgblack@eecs.umich.edu case 0x8: regs = 2; inc = 1; 2787639Sgblack@eecs.umich.edu break; 2797639Sgblack@eecs.umich.edu case 0x9: regs = 2; inc = 2; 2807639Sgblack@eecs.umich.edu break; 2817639Sgblack@eecs.umich.edu case 0x3: regs = 4; inc = 2; 2827639Sgblack@eecs.umich.edu break; 2837639Sgblack@eecs.umich.edu default: 2847639Sgblack@eecs.umich.edu return new Unknown(machInst); 2857639Sgblack@eecs.umich.edu } 2867639Sgblack@eecs.umich.edu break; 2877639Sgblack@eecs.umich.edu case 3: 2887639Sgblack@eecs.umich.edu regs = 3; 2897639Sgblack@eecs.umich.edu switch (type) { 2907639Sgblack@eecs.umich.edu case 0x4: inc = 1; 2917639Sgblack@eecs.umich.edu break; 2927639Sgblack@eecs.umich.edu case 0x5: inc = 2;; 2937639Sgblack@eecs.umich.edu break; 2947639Sgblack@eecs.umich.edu default: 2957639Sgblack@eecs.umich.edu return new Unknown(machInst); 2967639Sgblack@eecs.umich.edu } 2977639Sgblack@eecs.umich.edu break; 2987639Sgblack@eecs.umich.edu case 4: 2997639Sgblack@eecs.umich.edu regs = 4; 3007639Sgblack@eecs.umich.edu switch (type) { 3017639Sgblack@eecs.umich.edu case 0: inc = 1; 3027639Sgblack@eecs.umich.edu break; 3037639Sgblack@eecs.umich.edu case 1: inc = 2; 3047639Sgblack@eecs.umich.edu break; 3057639Sgblack@eecs.umich.edu default: 3067639Sgblack@eecs.umich.edu return new Unknown(machInst); 3077639Sgblack@eecs.umich.edu } 3087639Sgblack@eecs.umich.edu break; 3097639Sgblack@eecs.umich.edu } 3107639Sgblack@eecs.umich.edu } 3117639Sgblack@eecs.umich.edu 3127639Sgblack@eecs.umich.edu if (load) { 3137639Sgblack@eecs.umich.edu // Load instructions. 3147639Sgblack@eecs.umich.edu if (single) { 3157639Sgblack@eecs.umich.edu return new VldSingle(machInst, singleAll, width, rn, vd, 3167639Sgblack@eecs.umich.edu regs, inc, size, align, rm, lane); 3177639Sgblack@eecs.umich.edu } else { 3187639Sgblack@eecs.umich.edu return new VldMult(machInst, width, rn, vd, 3197639Sgblack@eecs.umich.edu regs, inc, size, align, rm); 3207639Sgblack@eecs.umich.edu } 3217435Sgblack@eecs.umich.edu } else { 3227435Sgblack@eecs.umich.edu // Store instructions. 3237639Sgblack@eecs.umich.edu if (single) { 3247639Sgblack@eecs.umich.edu if (singleAll) { 3257639Sgblack@eecs.umich.edu return new Unknown(machInst); 3267591SAli.Saidi@ARM.com } else { 3277639Sgblack@eecs.umich.edu return new VstSingle(machInst, false, width, rn, vd, 3287639Sgblack@eecs.umich.edu regs, inc, size, align, rm, lane); 3297435Sgblack@eecs.umich.edu } 3307435Sgblack@eecs.umich.edu } else { 3317639Sgblack@eecs.umich.edu return new VstMult(machInst, width, rn, vd, 3327639Sgblack@eecs.umich.edu regs, inc, size, align, rm); 3337435Sgblack@eecs.umich.edu } 3347435Sgblack@eecs.umich.edu } 3357591SAli.Saidi@ARM.com return new Unknown(machInst); 3367435Sgblack@eecs.umich.edu } 3377435Sgblack@eecs.umich.edu ''' 3387435Sgblack@eecs.umich.edu 3397435Sgblack@eecs.umich.edu decoder_output += ''' 3407435Sgblack@eecs.umich.edu static StaticInstPtr 3417435Sgblack@eecs.umich.edu decodeNeonThreeRegistersSameLength(ExtMachInst machInst) 3427435Sgblack@eecs.umich.edu { 3437435Sgblack@eecs.umich.edu const bool u = THUMB ? bits(machInst, 28) : bits(machInst, 24); 3447435Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 11, 8); 3457435Sgblack@eecs.umich.edu const bool b = bits(machInst, 4); 3467435Sgblack@eecs.umich.edu const uint32_t c = bits(machInst, 21, 20); 3477639Sgblack@eecs.umich.edu const IntRegIndex vd = 3487639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 15, 12) | 3497639Sgblack@eecs.umich.edu (bits(machInst, 22) << 4))); 3507639Sgblack@eecs.umich.edu const IntRegIndex vn = 3517639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 19, 16) | 3527639Sgblack@eecs.umich.edu (bits(machInst, 7) << 4))); 3537639Sgblack@eecs.umich.edu const IntRegIndex vm = 3547639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 3, 0) | 3557639Sgblack@eecs.umich.edu (bits(machInst, 5) << 4))); 3567639Sgblack@eecs.umich.edu const unsigned size = bits(machInst, 21, 20); 3577639Sgblack@eecs.umich.edu const bool q = bits(machInst, 6); 3587639Sgblack@eecs.umich.edu if (q && ((vd & 0x1) || (vn & 0x1) || (vm & 0x1))) 3597639Sgblack@eecs.umich.edu return new Unknown(machInst); 3607435Sgblack@eecs.umich.edu switch (a) { 3617435Sgblack@eecs.umich.edu case 0x0: 3627435Sgblack@eecs.umich.edu if (b) { 3637639Sgblack@eecs.umich.edu if (u) { 3647639Sgblack@eecs.umich.edu return decodeNeonUThreeReg<VqaddUD, VqaddUQ>( 3657639Sgblack@eecs.umich.edu q, size, machInst, vd, vn, vm); 3667435Sgblack@eecs.umich.edu } else { 3677639Sgblack@eecs.umich.edu return decodeNeonSThreeReg<VqaddSD, VqaddSQ>( 3687639Sgblack@eecs.umich.edu q, size, machInst, vd, vn, vm); 3697435Sgblack@eecs.umich.edu } 3707435Sgblack@eecs.umich.edu } else { 3717639Sgblack@eecs.umich.edu if (size == 3) 3727639Sgblack@eecs.umich.edu return new Unknown(machInst); 3737639Sgblack@eecs.umich.edu return decodeNeonUSThreeReg<VhaddD, VhaddQ>( 3747639Sgblack@eecs.umich.edu q, u, size, machInst, vd, vn, vm); 3757435Sgblack@eecs.umich.edu } 3767435Sgblack@eecs.umich.edu case 0x1: 3777435Sgblack@eecs.umich.edu if (!b) { 3787639Sgblack@eecs.umich.edu return decodeNeonUSThreeReg<VrhaddD, VrhaddQ>( 3797639Sgblack@eecs.umich.edu q, u, size, machInst, vd, vn, vm); 3807435Sgblack@eecs.umich.edu } else { 3817435Sgblack@eecs.umich.edu if (u) { 3827435Sgblack@eecs.umich.edu switch (c) { 3837435Sgblack@eecs.umich.edu case 0: 3847639Sgblack@eecs.umich.edu if (q) { 3857639Sgblack@eecs.umich.edu return new VeorQ<uint64_t>(machInst, vd, vn, vm); 3867639Sgblack@eecs.umich.edu } else { 3877639Sgblack@eecs.umich.edu return new VeorD<uint64_t>(machInst, vd, vn, vm); 3887639Sgblack@eecs.umich.edu } 3897435Sgblack@eecs.umich.edu case 1: 3907639Sgblack@eecs.umich.edu if (q) { 3917639Sgblack@eecs.umich.edu return new VbslQ<uint64_t>(machInst, vd, vn, vm); 3927639Sgblack@eecs.umich.edu } else { 3937639Sgblack@eecs.umich.edu return new VbslD<uint64_t>(machInst, vd, vn, vm); 3947639Sgblack@eecs.umich.edu } 3957435Sgblack@eecs.umich.edu case 2: 3967639Sgblack@eecs.umich.edu if (q) { 3977639Sgblack@eecs.umich.edu return new VbitQ<uint64_t>(machInst, vd, vn, vm); 3987639Sgblack@eecs.umich.edu } else { 3997639Sgblack@eecs.umich.edu return new VbitD<uint64_t>(machInst, vd, vn, vm); 4007639Sgblack@eecs.umich.edu } 4017435Sgblack@eecs.umich.edu case 3: 4027639Sgblack@eecs.umich.edu if (q) { 4037639Sgblack@eecs.umich.edu return new VbifQ<uint64_t>(machInst, vd, vn, vm); 4047639Sgblack@eecs.umich.edu } else { 4057639Sgblack@eecs.umich.edu return new VbifD<uint64_t>(machInst, vd, vn, vm); 4067639Sgblack@eecs.umich.edu } 40712595Ssiddhesh.poyarekar@gmail.com default: 40812595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 4097435Sgblack@eecs.umich.edu } 4107435Sgblack@eecs.umich.edu } else { 4117435Sgblack@eecs.umich.edu switch (c) { 4127435Sgblack@eecs.umich.edu case 0: 4137639Sgblack@eecs.umich.edu if (q) { 4147639Sgblack@eecs.umich.edu return new VandQ<uint64_t>(machInst, vd, vn, vm); 4157639Sgblack@eecs.umich.edu } else { 4167639Sgblack@eecs.umich.edu return new VandD<uint64_t>(machInst, vd, vn, vm); 4177639Sgblack@eecs.umich.edu } 4187435Sgblack@eecs.umich.edu case 1: 4197639Sgblack@eecs.umich.edu if (q) { 4207639Sgblack@eecs.umich.edu return new VbicQ<uint64_t>(machInst, vd, vn, vm); 4217639Sgblack@eecs.umich.edu } else { 4227639Sgblack@eecs.umich.edu return new VbicD<uint64_t>(machInst, vd, vn, vm); 4237639Sgblack@eecs.umich.edu } 4247435Sgblack@eecs.umich.edu case 2: 4257639Sgblack@eecs.umich.edu if (vn == vm) { 4267639Sgblack@eecs.umich.edu if (q) { 4277639Sgblack@eecs.umich.edu return new VmovQ<uint64_t>( 4287639Sgblack@eecs.umich.edu machInst, vd, vn, vm); 4297435Sgblack@eecs.umich.edu } else { 4307639Sgblack@eecs.umich.edu return new VmovD<uint64_t>( 4317639Sgblack@eecs.umich.edu machInst, vd, vn, vm); 4327639Sgblack@eecs.umich.edu } 4337639Sgblack@eecs.umich.edu } else { 4347639Sgblack@eecs.umich.edu if (q) { 4357639Sgblack@eecs.umich.edu return new VorrQ<uint64_t>( 4367639Sgblack@eecs.umich.edu machInst, vd, vn, vm); 4377639Sgblack@eecs.umich.edu } else { 4387639Sgblack@eecs.umich.edu return new VorrD<uint64_t>( 4397639Sgblack@eecs.umich.edu machInst, vd, vn, vm); 4407435Sgblack@eecs.umich.edu } 4417435Sgblack@eecs.umich.edu } 4427435Sgblack@eecs.umich.edu case 3: 4437639Sgblack@eecs.umich.edu if (q) { 4447639Sgblack@eecs.umich.edu return new VornQ<uint64_t>( 4457639Sgblack@eecs.umich.edu machInst, vd, vn, vm); 4467639Sgblack@eecs.umich.edu } else { 4477639Sgblack@eecs.umich.edu return new VornD<uint64_t>( 4487639Sgblack@eecs.umich.edu machInst, vd, vn, vm); 4497639Sgblack@eecs.umich.edu } 45012595Ssiddhesh.poyarekar@gmail.com default: 45112595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 4527435Sgblack@eecs.umich.edu } 4537435Sgblack@eecs.umich.edu } 4547435Sgblack@eecs.umich.edu } 4557435Sgblack@eecs.umich.edu case 0x2: 4567435Sgblack@eecs.umich.edu if (b) { 4577639Sgblack@eecs.umich.edu if (u) { 4587639Sgblack@eecs.umich.edu return decodeNeonUThreeReg<VqsubUD, VqsubUQ>( 4597639Sgblack@eecs.umich.edu q, size, machInst, vd, vn, vm); 4607639Sgblack@eecs.umich.edu } else { 4617639Sgblack@eecs.umich.edu return decodeNeonSThreeReg<VqsubSD, VqsubSQ>( 4627639Sgblack@eecs.umich.edu q, size, machInst, vd, vn, vm); 4637639Sgblack@eecs.umich.edu } 4647435Sgblack@eecs.umich.edu } else { 4657639Sgblack@eecs.umich.edu if (size == 3) 4667639Sgblack@eecs.umich.edu return new Unknown(machInst); 4677639Sgblack@eecs.umich.edu return decodeNeonUSThreeReg<VhsubD, VhsubQ>( 4687639Sgblack@eecs.umich.edu q, u, size, machInst, vd, vn, vm); 4697435Sgblack@eecs.umich.edu } 4707435Sgblack@eecs.umich.edu case 0x3: 4717435Sgblack@eecs.umich.edu if (b) { 4727639Sgblack@eecs.umich.edu return decodeNeonUSThreeReg<VcgeD, VcgeQ>( 4737639Sgblack@eecs.umich.edu q, u, size, machInst, vd, vn, vm); 4747435Sgblack@eecs.umich.edu } else { 4757639Sgblack@eecs.umich.edu return decodeNeonUSThreeReg<VcgtD, VcgtQ>( 4767639Sgblack@eecs.umich.edu q, u, size, machInst, vd, vn, vm); 4777435Sgblack@eecs.umich.edu } 4787435Sgblack@eecs.umich.edu case 0x4: 4797435Sgblack@eecs.umich.edu if (b) { 4807639Sgblack@eecs.umich.edu if (u) { 4817639Sgblack@eecs.umich.edu return decodeNeonUThreeReg<VqshlUD, VqshlUQ>( 4827639Sgblack@eecs.umich.edu q, size, machInst, vd, vm, vn); 4837639Sgblack@eecs.umich.edu } else { 4847639Sgblack@eecs.umich.edu return decodeNeonSThreeReg<VqshlSD, VqshlSQ>( 4857639Sgblack@eecs.umich.edu q, size, machInst, vd, vm, vn); 4867639Sgblack@eecs.umich.edu } 4877435Sgblack@eecs.umich.edu } else { 4887639Sgblack@eecs.umich.edu return decodeNeonUSThreeReg<VshlD, VshlQ>( 4897639Sgblack@eecs.umich.edu q, u, size, machInst, vd, vm, vn); 4907435Sgblack@eecs.umich.edu } 4917435Sgblack@eecs.umich.edu case 0x5: 4927435Sgblack@eecs.umich.edu if (b) { 4937639Sgblack@eecs.umich.edu if (u) { 4947639Sgblack@eecs.umich.edu return decodeNeonUThreeReg<VqrshlUD, VqrshlUQ>( 4957639Sgblack@eecs.umich.edu q, size, machInst, vd, vm, vn); 4967639Sgblack@eecs.umich.edu } else { 4977639Sgblack@eecs.umich.edu return decodeNeonSThreeReg<VqrshlSD, VqrshlSQ>( 4987639Sgblack@eecs.umich.edu q, size, machInst, vd, vm, vn); 4997639Sgblack@eecs.umich.edu } 5007435Sgblack@eecs.umich.edu } else { 5017639Sgblack@eecs.umich.edu return decodeNeonUSThreeReg<VrshlD, VrshlQ>( 5027639Sgblack@eecs.umich.edu q, u, size, machInst, vd, vm, vn); 5037435Sgblack@eecs.umich.edu } 5047435Sgblack@eecs.umich.edu case 0x6: 5057435Sgblack@eecs.umich.edu if (b) { 5067639Sgblack@eecs.umich.edu return decodeNeonUSThreeReg<VminD, VminQ>( 5077639Sgblack@eecs.umich.edu q, u, size, machInst, vd, vn, vm); 5087435Sgblack@eecs.umich.edu } else { 5097639Sgblack@eecs.umich.edu return decodeNeonUSThreeReg<VmaxD, VmaxQ>( 5107639Sgblack@eecs.umich.edu q, u, size, machInst, vd, vn, vm); 5117435Sgblack@eecs.umich.edu } 5127435Sgblack@eecs.umich.edu case 0x7: 5137435Sgblack@eecs.umich.edu if (b) { 5147639Sgblack@eecs.umich.edu return decodeNeonUSThreeReg<VabaD, VabaQ>( 5157639Sgblack@eecs.umich.edu q, u, size, machInst, vd, vn, vm); 5167435Sgblack@eecs.umich.edu } else { 5177435Sgblack@eecs.umich.edu if (bits(machInst, 23) == 1) { 5187639Sgblack@eecs.umich.edu if (q) { 5197435Sgblack@eecs.umich.edu return new Unknown(machInst); 5207435Sgblack@eecs.umich.edu } else { 5217639Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<Vabdl>( 5227639Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 5237435Sgblack@eecs.umich.edu } 5247435Sgblack@eecs.umich.edu } else { 5257639Sgblack@eecs.umich.edu return decodeNeonUSThreeReg<VabdD, VabdQ>( 5267639Sgblack@eecs.umich.edu q, u, size, machInst, vd, vn, vm); 5277435Sgblack@eecs.umich.edu } 5287435Sgblack@eecs.umich.edu } 5297435Sgblack@eecs.umich.edu case 0x8: 5307435Sgblack@eecs.umich.edu if (b) { 5317435Sgblack@eecs.umich.edu if (u) { 5327639Sgblack@eecs.umich.edu return decodeNeonUThreeReg<VceqD, VceqQ>( 5337639Sgblack@eecs.umich.edu q, size, machInst, vd, vn, vm); 5347435Sgblack@eecs.umich.edu } else { 5357639Sgblack@eecs.umich.edu return decodeNeonUThreeReg<VtstD, VtstQ>( 5367639Sgblack@eecs.umich.edu q, size, machInst, vd, vn, vm); 5377435Sgblack@eecs.umich.edu } 5387435Sgblack@eecs.umich.edu } else { 5397435Sgblack@eecs.umich.edu if (u) { 5407639Sgblack@eecs.umich.edu return decodeNeonUThreeReg<NVsubD, NVsubQ>( 5417639Sgblack@eecs.umich.edu q, size, machInst, vd, vn, vm); 5427435Sgblack@eecs.umich.edu } else { 5437639Sgblack@eecs.umich.edu return decodeNeonUThreeReg<NVaddD, NVaddQ>( 5447639Sgblack@eecs.umich.edu q, size, machInst, vd, vn, vm); 5457435Sgblack@eecs.umich.edu } 5467435Sgblack@eecs.umich.edu } 5477435Sgblack@eecs.umich.edu case 0x9: 5487435Sgblack@eecs.umich.edu if (b) { 5497435Sgblack@eecs.umich.edu if (u) { 5507639Sgblack@eecs.umich.edu return decodeNeonUThreeReg<NVmulpD, NVmulpQ>( 5517639Sgblack@eecs.umich.edu q, size, machInst, vd, vn, vm); 5527435Sgblack@eecs.umich.edu } else { 5537639Sgblack@eecs.umich.edu return decodeNeonSThreeReg<NVmulD, NVmulQ>( 5547639Sgblack@eecs.umich.edu q, size, machInst, vd, vn, vm); 5557435Sgblack@eecs.umich.edu } 5567435Sgblack@eecs.umich.edu } else { 5577435Sgblack@eecs.umich.edu if (u) { 5587639Sgblack@eecs.umich.edu return decodeNeonUSThreeReg<NVmlsD, NVmlsQ>( 5597639Sgblack@eecs.umich.edu q, u, size, machInst, vd, vn, vm); 5607435Sgblack@eecs.umich.edu } else { 5617639Sgblack@eecs.umich.edu return decodeNeonUSThreeReg<NVmlaD, NVmlaQ>( 5627639Sgblack@eecs.umich.edu q, u, size, machInst, vd, vn, vm); 5637435Sgblack@eecs.umich.edu } 5647435Sgblack@eecs.umich.edu } 5657435Sgblack@eecs.umich.edu case 0xa: 5668607Sgblack@eecs.umich.edu if (q) 5678607Sgblack@eecs.umich.edu return new Unknown(machInst); 5687435Sgblack@eecs.umich.edu if (b) { 5698607Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<VpminD>( 5708607Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 5717435Sgblack@eecs.umich.edu } else { 5728607Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<VpmaxD>( 5738607Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 5747435Sgblack@eecs.umich.edu } 5757435Sgblack@eecs.umich.edu case 0xb: 5767435Sgblack@eecs.umich.edu if (b) { 5778607Sgblack@eecs.umich.edu if (u || q) { 5787435Sgblack@eecs.umich.edu return new Unknown(machInst); 5797435Sgblack@eecs.umich.edu } else { 5808607Sgblack@eecs.umich.edu return decodeNeonUThreeUSReg<NVpaddD>( 5818607Sgblack@eecs.umich.edu size, machInst, vd, vn, vm); 5827435Sgblack@eecs.umich.edu } 5837435Sgblack@eecs.umich.edu } else { 5847435Sgblack@eecs.umich.edu if (u) { 5857639Sgblack@eecs.umich.edu return decodeNeonSThreeSReg<VqrdmulhD, VqrdmulhQ>( 5867639Sgblack@eecs.umich.edu q, size, machInst, vd, vn, vm); 5877435Sgblack@eecs.umich.edu } else { 5887639Sgblack@eecs.umich.edu return decodeNeonSThreeSReg<VqdmulhD, VqdmulhQ>( 5897639Sgblack@eecs.umich.edu q, size, machInst, vd, vn, vm); 5907435Sgblack@eecs.umich.edu } 5917435Sgblack@eecs.umich.edu } 5927435Sgblack@eecs.umich.edu case 0xc: 59310037SARM gem5 Developers if (b) { 59410037SARM gem5 Developers if (!u) { 59510037SARM gem5 Developers if (bits(c, 1) == 0) { 59610037SARM gem5 Developers if (q) { 59710037SARM gem5 Developers return new NVfmaQFp<float>(machInst, vd, vn, vm); 59810037SARM gem5 Developers } else { 59910037SARM gem5 Developers return new NVfmaDFp<float>(machInst, vd, vn, vm); 60010037SARM gem5 Developers } 60110037SARM gem5 Developers } else { 60210037SARM gem5 Developers if (q) { 60310037SARM gem5 Developers return new NVfmsQFp<float>(machInst, vd, vn, vm); 60410037SARM gem5 Developers } else { 60510037SARM gem5 Developers return new NVfmsDFp<float>(machInst, vd, vn, vm); 60610037SARM gem5 Developers } 60710037SARM gem5 Developers } 60810037SARM gem5 Developers } 60913168Smatt.horsnell@arm.com } else { 61013168Smatt.horsnell@arm.com if (u) { 61113168Smatt.horsnell@arm.com switch (c) { 61213168Smatt.horsnell@arm.com case 0x0: 61313168Smatt.horsnell@arm.com return new SHA256H(machInst, vd, vn, vm); 61413168Smatt.horsnell@arm.com case 0x1: 61513168Smatt.horsnell@arm.com return new SHA256H2(machInst, vd, vn, vm); 61613168Smatt.horsnell@arm.com case 0x2: 61713168Smatt.horsnell@arm.com return new SHA256SU1(machInst, vd, vn, vm); 61813168Smatt.horsnell@arm.com case 0x3: 61913168Smatt.horsnell@arm.com return new Unknown(machInst); 62013168Smatt.horsnell@arm.com default: 62113168Smatt.horsnell@arm.com M5_UNREACHABLE; 62213168Smatt.horsnell@arm.com } 62313168Smatt.horsnell@arm.com } else { 62413168Smatt.horsnell@arm.com switch (c) { 62513168Smatt.horsnell@arm.com case 0x0: 62613168Smatt.horsnell@arm.com return new SHA1C(machInst, vd, vn, vm); 62713168Smatt.horsnell@arm.com case 0x1: 62813168Smatt.horsnell@arm.com return new SHA1P(machInst, vd, vn, vm); 62913168Smatt.horsnell@arm.com case 0x2: 63013168Smatt.horsnell@arm.com return new SHA1M(machInst, vd, vn, vm); 63113168Smatt.horsnell@arm.com case 0x3: 63213168Smatt.horsnell@arm.com return new SHA1SU0(machInst, vd, vn, vm); 63313168Smatt.horsnell@arm.com default: 63413168Smatt.horsnell@arm.com M5_UNREACHABLE; 63513168Smatt.horsnell@arm.com } 63613168Smatt.horsnell@arm.com } 63710037SARM gem5 Developers } 6387435Sgblack@eecs.umich.edu return new Unknown(machInst); 6397435Sgblack@eecs.umich.edu case 0xd: 6407435Sgblack@eecs.umich.edu if (b) { 6417435Sgblack@eecs.umich.edu if (u) { 6427435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 6437639Sgblack@eecs.umich.edu if (q) { 6447639Sgblack@eecs.umich.edu return new NVmulQFp<float>(machInst, vd, vn, vm); 6457639Sgblack@eecs.umich.edu } else { 6467639Sgblack@eecs.umich.edu return new NVmulDFp<float>(machInst, vd, vn, vm); 6477639Sgblack@eecs.umich.edu } 6487435Sgblack@eecs.umich.edu } else { 6497435Sgblack@eecs.umich.edu return new Unknown(machInst); 6507435Sgblack@eecs.umich.edu } 6517435Sgblack@eecs.umich.edu } else { 6527435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 6537639Sgblack@eecs.umich.edu if (q) { 6547639Sgblack@eecs.umich.edu return new NVmlaQFp<float>(machInst, vd, vn, vm); 6557639Sgblack@eecs.umich.edu } else { 6567639Sgblack@eecs.umich.edu return new NVmlaDFp<float>(machInst, vd, vn, vm); 6577639Sgblack@eecs.umich.edu } 6587435Sgblack@eecs.umich.edu } else { 6597639Sgblack@eecs.umich.edu if (q) { 6607639Sgblack@eecs.umich.edu return new NVmlsQFp<float>(machInst, vd, vn, vm); 6617639Sgblack@eecs.umich.edu } else { 6627639Sgblack@eecs.umich.edu return new NVmlsDFp<float>(machInst, vd, vn, vm); 6637639Sgblack@eecs.umich.edu } 6647435Sgblack@eecs.umich.edu } 6657435Sgblack@eecs.umich.edu } 6667435Sgblack@eecs.umich.edu } else { 6677435Sgblack@eecs.umich.edu if (u) { 6687435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 6697639Sgblack@eecs.umich.edu if (q) { 6707639Sgblack@eecs.umich.edu return new VpaddQFp<float>(machInst, vd, vn, vm); 6717639Sgblack@eecs.umich.edu } else { 6727639Sgblack@eecs.umich.edu return new VpaddDFp<float>(machInst, vd, vn, vm); 6737639Sgblack@eecs.umich.edu } 6747435Sgblack@eecs.umich.edu } else { 6757639Sgblack@eecs.umich.edu if (q) { 6767639Sgblack@eecs.umich.edu return new VabdQFp<float>(machInst, vd, vn, vm); 6777639Sgblack@eecs.umich.edu } else { 6787639Sgblack@eecs.umich.edu return new VabdDFp<float>(machInst, vd, vn, vm); 6797639Sgblack@eecs.umich.edu } 6807435Sgblack@eecs.umich.edu } 6817435Sgblack@eecs.umich.edu } else { 6827435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 6837639Sgblack@eecs.umich.edu if (q) { 6847639Sgblack@eecs.umich.edu return new VaddQFp<float>(machInst, vd, vn, vm); 6857639Sgblack@eecs.umich.edu } else { 6867639Sgblack@eecs.umich.edu return new VaddDFp<float>(machInst, vd, vn, vm); 6877639Sgblack@eecs.umich.edu } 6887435Sgblack@eecs.umich.edu } else { 6897639Sgblack@eecs.umich.edu if (q) { 6907639Sgblack@eecs.umich.edu return new VsubQFp<float>(machInst, vd, vn, vm); 6917639Sgblack@eecs.umich.edu } else { 6927639Sgblack@eecs.umich.edu return new VsubDFp<float>(machInst, vd, vn, vm); 6937639Sgblack@eecs.umich.edu } 6947435Sgblack@eecs.umich.edu } 6957435Sgblack@eecs.umich.edu } 6967435Sgblack@eecs.umich.edu } 6977435Sgblack@eecs.umich.edu case 0xe: 6987435Sgblack@eecs.umich.edu if (b) { 6997435Sgblack@eecs.umich.edu if (u) { 7007435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 7017639Sgblack@eecs.umich.edu if (q) { 7027639Sgblack@eecs.umich.edu return new VacgeQFp<float>(machInst, vd, vn, vm); 7037639Sgblack@eecs.umich.edu } else { 7047639Sgblack@eecs.umich.edu return new VacgeDFp<float>(machInst, vd, vn, vm); 7057639Sgblack@eecs.umich.edu } 7067435Sgblack@eecs.umich.edu } else { 7077639Sgblack@eecs.umich.edu if (q) { 7087639Sgblack@eecs.umich.edu return new VacgtQFp<float>(machInst, vd, vn, vm); 7097639Sgblack@eecs.umich.edu } else { 7107639Sgblack@eecs.umich.edu return new VacgtDFp<float>(machInst, vd, vn, vm); 7117639Sgblack@eecs.umich.edu } 7127435Sgblack@eecs.umich.edu } 7137435Sgblack@eecs.umich.edu } else { 7147435Sgblack@eecs.umich.edu return new Unknown(machInst); 7157435Sgblack@eecs.umich.edu } 7167435Sgblack@eecs.umich.edu } else { 7177435Sgblack@eecs.umich.edu if (u) { 7187435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 7197639Sgblack@eecs.umich.edu if (q) { 7207639Sgblack@eecs.umich.edu return new VcgeQFp<float>(machInst, vd, vn, vm); 7217639Sgblack@eecs.umich.edu } else { 7227639Sgblack@eecs.umich.edu return new VcgeDFp<float>(machInst, vd, vn, vm); 7237639Sgblack@eecs.umich.edu } 7247435Sgblack@eecs.umich.edu } else { 7257639Sgblack@eecs.umich.edu if (q) { 7267639Sgblack@eecs.umich.edu return new VcgtQFp<float>(machInst, vd, vn, vm); 7277639Sgblack@eecs.umich.edu } else { 7287639Sgblack@eecs.umich.edu return new VcgtDFp<float>(machInst, vd, vn, vm); 7297639Sgblack@eecs.umich.edu } 7307435Sgblack@eecs.umich.edu } 7317435Sgblack@eecs.umich.edu } else { 7327435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 7337639Sgblack@eecs.umich.edu if (q) { 7347639Sgblack@eecs.umich.edu return new VceqQFp<float>(machInst, vd, vn, vm); 7357639Sgblack@eecs.umich.edu } else { 7367639Sgblack@eecs.umich.edu return new VceqDFp<float>(machInst, vd, vn, vm); 7377639Sgblack@eecs.umich.edu } 7387435Sgblack@eecs.umich.edu } else { 7397435Sgblack@eecs.umich.edu return new Unknown(machInst); 7407435Sgblack@eecs.umich.edu } 7417435Sgblack@eecs.umich.edu } 7427435Sgblack@eecs.umich.edu } 7437435Sgblack@eecs.umich.edu case 0xf: 7447435Sgblack@eecs.umich.edu if (b) { 7457435Sgblack@eecs.umich.edu if (u) { 7467435Sgblack@eecs.umich.edu return new Unknown(machInst); 7477435Sgblack@eecs.umich.edu } else { 7487435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 7497639Sgblack@eecs.umich.edu if (q) { 7507639Sgblack@eecs.umich.edu return new VrecpsQFp<float>(machInst, vd, vn, vm); 7517639Sgblack@eecs.umich.edu } else { 7527639Sgblack@eecs.umich.edu return new VrecpsDFp<float>(machInst, vd, vn, vm); 7537639Sgblack@eecs.umich.edu } 7547435Sgblack@eecs.umich.edu } else { 7557639Sgblack@eecs.umich.edu if (q) { 7567639Sgblack@eecs.umich.edu return new VrsqrtsQFp<float>(machInst, vd, vn, vm); 7577639Sgblack@eecs.umich.edu } else { 7587639Sgblack@eecs.umich.edu return new VrsqrtsDFp<float>(machInst, vd, vn, vm); 7597639Sgblack@eecs.umich.edu } 7607435Sgblack@eecs.umich.edu } 7617435Sgblack@eecs.umich.edu } 7627435Sgblack@eecs.umich.edu } else { 7637435Sgblack@eecs.umich.edu if (u) { 7647435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 7657639Sgblack@eecs.umich.edu if (q) { 7667639Sgblack@eecs.umich.edu return new VpmaxQFp<float>(machInst, vd, vn, vm); 7677639Sgblack@eecs.umich.edu } else { 7687639Sgblack@eecs.umich.edu return new VpmaxDFp<float>(machInst, vd, vn, vm); 7697639Sgblack@eecs.umich.edu } 7707435Sgblack@eecs.umich.edu } else { 7717639Sgblack@eecs.umich.edu if (q) { 7727639Sgblack@eecs.umich.edu return new VpminQFp<float>(machInst, vd, vn, vm); 7737639Sgblack@eecs.umich.edu } else { 7747639Sgblack@eecs.umich.edu return new VpminDFp<float>(machInst, vd, vn, vm); 7757639Sgblack@eecs.umich.edu } 7767435Sgblack@eecs.umich.edu } 7777435Sgblack@eecs.umich.edu } else { 7787435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 7797639Sgblack@eecs.umich.edu if (q) { 7807639Sgblack@eecs.umich.edu return new VmaxQFp<float>(machInst, vd, vn, vm); 7817639Sgblack@eecs.umich.edu } else { 7827639Sgblack@eecs.umich.edu return new VmaxDFp<float>(machInst, vd, vn, vm); 7837639Sgblack@eecs.umich.edu } 7847435Sgblack@eecs.umich.edu } else { 7857639Sgblack@eecs.umich.edu if (q) { 7867639Sgblack@eecs.umich.edu return new VminQFp<float>(machInst, vd, vn, vm); 7877639Sgblack@eecs.umich.edu } else { 7887639Sgblack@eecs.umich.edu return new VminDFp<float>(machInst, vd, vn, vm); 7897639Sgblack@eecs.umich.edu } 7907435Sgblack@eecs.umich.edu } 7917435Sgblack@eecs.umich.edu } 7927435Sgblack@eecs.umich.edu } 7937435Sgblack@eecs.umich.edu } 7947435Sgblack@eecs.umich.edu return new Unknown(machInst); 7957435Sgblack@eecs.umich.edu } 7967435Sgblack@eecs.umich.edu 7977435Sgblack@eecs.umich.edu static StaticInstPtr 7987435Sgblack@eecs.umich.edu decodeNeonOneRegModImm(ExtMachInst machInst) 7997435Sgblack@eecs.umich.edu { 8007639Sgblack@eecs.umich.edu const IntRegIndex vd = 8017639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 15, 12) | 8027639Sgblack@eecs.umich.edu (bits(machInst, 22) << 4))); 8037639Sgblack@eecs.umich.edu const bool q = bits(machInst, 6); 8047435Sgblack@eecs.umich.edu const bool op = bits(machInst, 5); 8057639Sgblack@eecs.umich.edu const uint8_t cmode = bits(machInst, 11, 8); 8067639Sgblack@eecs.umich.edu const uint8_t imm = ((THUMB ? bits(machInst, 28) : 8077639Sgblack@eecs.umich.edu bits(machInst, 24)) << 7) | 8087639Sgblack@eecs.umich.edu (bits(machInst, 18, 16) << 4) | 8097639Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 0); 8107853SMatt.Horsnell@ARM.com 8117853SMatt.Horsnell@ARM.com // Check for invalid immediate encodings and return an unknown op 8127853SMatt.Horsnell@ARM.com // if it happens 8137853SMatt.Horsnell@ARM.com bool immValid = true; 8147853SMatt.Horsnell@ARM.com const uint64_t bigImm = simd_modified_imm(op, cmode, imm, immValid); 8157853SMatt.Horsnell@ARM.com if (!immValid) { 8167853SMatt.Horsnell@ARM.com return new Unknown(machInst); 8177853SMatt.Horsnell@ARM.com } 8187853SMatt.Horsnell@ARM.com 8197435Sgblack@eecs.umich.edu if (op) { 8207435Sgblack@eecs.umich.edu if (bits(cmode, 3) == 0) { 8217435Sgblack@eecs.umich.edu if (bits(cmode, 0) == 0) { 8227639Sgblack@eecs.umich.edu if (q) 8237639Sgblack@eecs.umich.edu return new NVmvniQ<uint64_t>(machInst, vd, bigImm); 8247639Sgblack@eecs.umich.edu else 8257639Sgblack@eecs.umich.edu return new NVmvniD<uint64_t>(machInst, vd, bigImm); 8267435Sgblack@eecs.umich.edu } else { 8277639Sgblack@eecs.umich.edu if (q) 8287639Sgblack@eecs.umich.edu return new NVbiciQ<uint64_t>(machInst, vd, bigImm); 8297639Sgblack@eecs.umich.edu else 8307639Sgblack@eecs.umich.edu return new NVbiciD<uint64_t>(machInst, vd, bigImm); 8317435Sgblack@eecs.umich.edu } 8327435Sgblack@eecs.umich.edu } else { 8337435Sgblack@eecs.umich.edu if (bits(cmode, 2) == 1) { 8347639Sgblack@eecs.umich.edu switch (bits(cmode, 1, 0)) { 8357639Sgblack@eecs.umich.edu case 0: 8367639Sgblack@eecs.umich.edu case 1: 8377639Sgblack@eecs.umich.edu if (q) 8387639Sgblack@eecs.umich.edu return new NVmvniQ<uint64_t>(machInst, vd, bigImm); 8397639Sgblack@eecs.umich.edu else 8407639Sgblack@eecs.umich.edu return new NVmvniD<uint64_t>(machInst, vd, bigImm); 8417639Sgblack@eecs.umich.edu case 2: 8427639Sgblack@eecs.umich.edu if (q) 8437639Sgblack@eecs.umich.edu return new NVmoviQ<uint64_t>(machInst, vd, bigImm); 8447639Sgblack@eecs.umich.edu else 8457639Sgblack@eecs.umich.edu return new NVmoviD<uint64_t>(machInst, vd, bigImm); 8467639Sgblack@eecs.umich.edu case 3: 8477639Sgblack@eecs.umich.edu if (q) 8487639Sgblack@eecs.umich.edu return new Unknown(machInst); 8497639Sgblack@eecs.umich.edu else 8507639Sgblack@eecs.umich.edu return new Unknown(machInst); 8517639Sgblack@eecs.umich.edu } 8527435Sgblack@eecs.umich.edu } else { 8537435Sgblack@eecs.umich.edu if (bits(cmode, 0) == 0) { 8547639Sgblack@eecs.umich.edu if (q) 8557639Sgblack@eecs.umich.edu return new NVmvniQ<uint64_t>(machInst, vd, bigImm); 8567639Sgblack@eecs.umich.edu else 8577639Sgblack@eecs.umich.edu return new NVmvniD<uint64_t>(machInst, vd, bigImm); 8587435Sgblack@eecs.umich.edu } else { 8597639Sgblack@eecs.umich.edu if (q) 8607639Sgblack@eecs.umich.edu return new NVbiciQ<uint64_t>(machInst, vd, bigImm); 8617639Sgblack@eecs.umich.edu else 8627639Sgblack@eecs.umich.edu return new NVbiciD<uint64_t>(machInst, vd, bigImm); 8637435Sgblack@eecs.umich.edu } 8647435Sgblack@eecs.umich.edu } 8657435Sgblack@eecs.umich.edu } 8667435Sgblack@eecs.umich.edu } else { 8677435Sgblack@eecs.umich.edu if (bits(cmode, 3) == 0) { 8687435Sgblack@eecs.umich.edu if (bits(cmode, 0) == 0) { 8697639Sgblack@eecs.umich.edu if (q) 8707639Sgblack@eecs.umich.edu return new NVmoviQ<uint64_t>(machInst, vd, bigImm); 8717639Sgblack@eecs.umich.edu else 8727639Sgblack@eecs.umich.edu return new NVmoviD<uint64_t>(machInst, vd, bigImm); 8737435Sgblack@eecs.umich.edu } else { 8747639Sgblack@eecs.umich.edu if (q) 8757639Sgblack@eecs.umich.edu return new NVorriQ<uint64_t>(machInst, vd, bigImm); 8767639Sgblack@eecs.umich.edu else 8777639Sgblack@eecs.umich.edu return new NVorriD<uint64_t>(machInst, vd, bigImm); 8787435Sgblack@eecs.umich.edu } 8797435Sgblack@eecs.umich.edu } else { 8807435Sgblack@eecs.umich.edu if (bits(cmode, 2) == 1) { 8817639Sgblack@eecs.umich.edu if (q) 8827639Sgblack@eecs.umich.edu return new NVmoviQ<uint64_t>(machInst, vd, bigImm); 8837639Sgblack@eecs.umich.edu else 8847639Sgblack@eecs.umich.edu return new NVmoviD<uint64_t>(machInst, vd, bigImm); 8857435Sgblack@eecs.umich.edu } else { 8867435Sgblack@eecs.umich.edu if (bits(cmode, 0) == 0) { 8877639Sgblack@eecs.umich.edu if (q) 8887639Sgblack@eecs.umich.edu return new NVmoviQ<uint64_t>(machInst, vd, bigImm); 8897639Sgblack@eecs.umich.edu else 8907639Sgblack@eecs.umich.edu return new NVmoviD<uint64_t>(machInst, vd, bigImm); 8917435Sgblack@eecs.umich.edu } else { 8927639Sgblack@eecs.umich.edu if (q) 8937639Sgblack@eecs.umich.edu return new NVorriQ<uint64_t>(machInst, vd, bigImm); 8947639Sgblack@eecs.umich.edu else 8957639Sgblack@eecs.umich.edu return new NVorriD<uint64_t>(machInst, vd, bigImm); 8967435Sgblack@eecs.umich.edu } 8977435Sgblack@eecs.umich.edu } 8987435Sgblack@eecs.umich.edu } 8997435Sgblack@eecs.umich.edu } 9007435Sgblack@eecs.umich.edu return new Unknown(machInst); 9017435Sgblack@eecs.umich.edu } 9027435Sgblack@eecs.umich.edu 9037435Sgblack@eecs.umich.edu static StaticInstPtr 9047435Sgblack@eecs.umich.edu decodeNeonTwoRegAndShift(ExtMachInst machInst) 9057435Sgblack@eecs.umich.edu { 9067435Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 11, 8); 9077435Sgblack@eecs.umich.edu const bool u = THUMB ? bits(machInst, 28) : bits(machInst, 24); 9087435Sgblack@eecs.umich.edu const bool b = bits(machInst, 6); 9097435Sgblack@eecs.umich.edu const bool l = bits(machInst, 7); 9107639Sgblack@eecs.umich.edu const IntRegIndex vd = 9117639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 15, 12) | 9127639Sgblack@eecs.umich.edu (bits(machInst, 22) << 4))); 9137639Sgblack@eecs.umich.edu const IntRegIndex vm = 9147639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 3, 0) | 9157639Sgblack@eecs.umich.edu (bits(machInst, 5) << 4))); 9167639Sgblack@eecs.umich.edu unsigned imm6 = bits(machInst, 21, 16); 9177639Sgblack@eecs.umich.edu unsigned imm = ((l ? 1 : 0) << 6) | imm6; 9187639Sgblack@eecs.umich.edu unsigned size = 3; 9197639Sgblack@eecs.umich.edu unsigned lShiftAmt = 0; 9207639Sgblack@eecs.umich.edu unsigned bitSel; 9217639Sgblack@eecs.umich.edu for (bitSel = 1 << 6; true; bitSel >>= 1) { 9227639Sgblack@eecs.umich.edu if (bitSel & imm) 9237639Sgblack@eecs.umich.edu break; 9247639Sgblack@eecs.umich.edu else if (!size) 9257639Sgblack@eecs.umich.edu return new Unknown(machInst); 9267639Sgblack@eecs.umich.edu size--; 9277639Sgblack@eecs.umich.edu } 9287639Sgblack@eecs.umich.edu lShiftAmt = imm6 & ~bitSel; 9297639Sgblack@eecs.umich.edu unsigned rShiftAmt = 0; 9307639Sgblack@eecs.umich.edu if (a != 0xe && a != 0xf) { 9317639Sgblack@eecs.umich.edu if (size > 2) 9327639Sgblack@eecs.umich.edu rShiftAmt = 64 - imm6; 9337639Sgblack@eecs.umich.edu else 9347639Sgblack@eecs.umich.edu rShiftAmt = 2 * (8 << size) - imm6; 9357639Sgblack@eecs.umich.edu } 9367435Sgblack@eecs.umich.edu 9377435Sgblack@eecs.umich.edu switch (a) { 9387435Sgblack@eecs.umich.edu case 0x0: 9397639Sgblack@eecs.umich.edu return decodeNeonUSTwoShiftReg<NVshrD, NVshrQ>( 9407639Sgblack@eecs.umich.edu b, u, size, machInst, vd, vm, rShiftAmt); 9417435Sgblack@eecs.umich.edu case 0x1: 9427639Sgblack@eecs.umich.edu return decodeNeonUSTwoShiftReg<NVsraD, NVsraQ>( 9437639Sgblack@eecs.umich.edu b, u, size, machInst, vd, vm, rShiftAmt); 9447435Sgblack@eecs.umich.edu case 0x2: 9457639Sgblack@eecs.umich.edu return decodeNeonUSTwoShiftReg<NVrshrD, NVrshrQ>( 9467639Sgblack@eecs.umich.edu b, u, size, machInst, vd, vm, rShiftAmt); 9477435Sgblack@eecs.umich.edu case 0x3: 9487639Sgblack@eecs.umich.edu return decodeNeonUSTwoShiftReg<NVrsraD, NVrsraQ>( 9497639Sgblack@eecs.umich.edu b, u, size, machInst, vd, vm, rShiftAmt); 9507435Sgblack@eecs.umich.edu case 0x4: 9517435Sgblack@eecs.umich.edu if (u) { 9527639Sgblack@eecs.umich.edu return decodeNeonUTwoShiftReg<NVsriD, NVsriQ>( 9537639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, rShiftAmt); 9547435Sgblack@eecs.umich.edu } else { 9557435Sgblack@eecs.umich.edu return new Unknown(machInst); 9567435Sgblack@eecs.umich.edu } 9577435Sgblack@eecs.umich.edu case 0x5: 9587435Sgblack@eecs.umich.edu if (u) { 9597639Sgblack@eecs.umich.edu return decodeNeonUTwoShiftReg<NVsliD, NVsliQ>( 9607639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, lShiftAmt); 9617435Sgblack@eecs.umich.edu } else { 9627639Sgblack@eecs.umich.edu return decodeNeonUTwoShiftReg<NVshlD, NVshlQ>( 9637639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, lShiftAmt); 9647435Sgblack@eecs.umich.edu } 9657435Sgblack@eecs.umich.edu case 0x6: 9667435Sgblack@eecs.umich.edu case 0x7: 9677639Sgblack@eecs.umich.edu if (u) { 9687639Sgblack@eecs.umich.edu if (a == 0x6) { 9697639Sgblack@eecs.umich.edu return decodeNeonSTwoShiftReg<NVqshlusD, NVqshlusQ>( 9707639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, lShiftAmt); 9717639Sgblack@eecs.umich.edu } else { 9727639Sgblack@eecs.umich.edu return decodeNeonUTwoShiftReg<NVqshluD, NVqshluQ>( 9737639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, lShiftAmt); 9747639Sgblack@eecs.umich.edu } 9757639Sgblack@eecs.umich.edu } else { 9767639Sgblack@eecs.umich.edu return decodeNeonSTwoShiftReg<NVqshlD, NVqshlQ>( 9777639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, lShiftAmt); 9787639Sgblack@eecs.umich.edu } 9797435Sgblack@eecs.umich.edu case 0x8: 9807435Sgblack@eecs.umich.edu if (l) { 9817435Sgblack@eecs.umich.edu return new Unknown(machInst); 9827435Sgblack@eecs.umich.edu } else if (u) { 9837639Sgblack@eecs.umich.edu return decodeNeonSTwoShiftSReg<NVqshruns, NVqrshruns>( 9847639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, rShiftAmt); 9857435Sgblack@eecs.umich.edu } else { 9867639Sgblack@eecs.umich.edu return decodeNeonUTwoShiftSReg<NVshrn, NVrshrn>( 9877639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, rShiftAmt); 9887435Sgblack@eecs.umich.edu } 9897435Sgblack@eecs.umich.edu case 0x9: 9907435Sgblack@eecs.umich.edu if (l) { 9917435Sgblack@eecs.umich.edu return new Unknown(machInst); 9927639Sgblack@eecs.umich.edu } else if (u) { 9937639Sgblack@eecs.umich.edu return decodeNeonUTwoShiftSReg<NVqshrun, NVqrshrun>( 9947639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, rShiftAmt); 9957435Sgblack@eecs.umich.edu } else { 9967639Sgblack@eecs.umich.edu return decodeNeonSTwoShiftSReg<NVqshrn, NVqrshrn>( 9977639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, rShiftAmt); 9987435Sgblack@eecs.umich.edu } 9997435Sgblack@eecs.umich.edu case 0xa: 10007435Sgblack@eecs.umich.edu if (l || b) { 10017435Sgblack@eecs.umich.edu return new Unknown(machInst); 10027435Sgblack@eecs.umich.edu } else { 10037639Sgblack@eecs.umich.edu return decodeNeonUSTwoShiftSReg<NVmovl, NVshll>( 10047639Sgblack@eecs.umich.edu lShiftAmt, u, size, machInst, vd, vm, lShiftAmt); 10057435Sgblack@eecs.umich.edu } 10067435Sgblack@eecs.umich.edu case 0xe: 10077639Sgblack@eecs.umich.edu if (l) { 10087639Sgblack@eecs.umich.edu return new Unknown(machInst); 10097639Sgblack@eecs.umich.edu } else { 10107639Sgblack@eecs.umich.edu if (bits(imm6, 5) == 0) 10117639Sgblack@eecs.umich.edu return new Unknown(machInst); 10127639Sgblack@eecs.umich.edu if (u) { 10137639Sgblack@eecs.umich.edu if (b) { 10147639Sgblack@eecs.umich.edu return new NVcvtu2fpQ<float>( 10157639Sgblack@eecs.umich.edu machInst, vd, vm, 64 - imm6); 10167639Sgblack@eecs.umich.edu } else { 10177639Sgblack@eecs.umich.edu return new NVcvtu2fpD<float>( 10187639Sgblack@eecs.umich.edu machInst, vd, vm, 64 - imm6); 10197639Sgblack@eecs.umich.edu } 10207639Sgblack@eecs.umich.edu } else { 10217639Sgblack@eecs.umich.edu if (b) { 10227639Sgblack@eecs.umich.edu return new NVcvts2fpQ<float>( 10237639Sgblack@eecs.umich.edu machInst, vd, vm, 64 - imm6); 10247639Sgblack@eecs.umich.edu } else { 10257639Sgblack@eecs.umich.edu return new NVcvts2fpD<float>( 10267639Sgblack@eecs.umich.edu machInst, vd, vm, 64 - imm6); 10277639Sgblack@eecs.umich.edu } 10287639Sgblack@eecs.umich.edu } 10297639Sgblack@eecs.umich.edu } 10307435Sgblack@eecs.umich.edu case 0xf: 10317435Sgblack@eecs.umich.edu if (l) { 10327435Sgblack@eecs.umich.edu return new Unknown(machInst); 10337639Sgblack@eecs.umich.edu } else { 10347639Sgblack@eecs.umich.edu if (bits(imm6, 5) == 0) 10357639Sgblack@eecs.umich.edu return new Unknown(machInst); 10367639Sgblack@eecs.umich.edu if (u) { 10377639Sgblack@eecs.umich.edu if (b) { 10387639Sgblack@eecs.umich.edu return new NVcvt2ufxQ<float>( 10397639Sgblack@eecs.umich.edu machInst, vd, vm, 64 - imm6); 10407639Sgblack@eecs.umich.edu } else { 10417639Sgblack@eecs.umich.edu return new NVcvt2ufxD<float>( 10427639Sgblack@eecs.umich.edu machInst, vd, vm, 64 - imm6); 10437639Sgblack@eecs.umich.edu } 10447639Sgblack@eecs.umich.edu } else { 10457639Sgblack@eecs.umich.edu if (b) { 10467639Sgblack@eecs.umich.edu return new NVcvt2sfxQ<float>( 10477639Sgblack@eecs.umich.edu machInst, vd, vm, 64 - imm6); 10487639Sgblack@eecs.umich.edu } else { 10497639Sgblack@eecs.umich.edu return new NVcvt2sfxD<float>( 10507639Sgblack@eecs.umich.edu machInst, vd, vm, 64 - imm6); 10517639Sgblack@eecs.umich.edu } 10527639Sgblack@eecs.umich.edu } 10537435Sgblack@eecs.umich.edu } 10547435Sgblack@eecs.umich.edu } 10557435Sgblack@eecs.umich.edu return new Unknown(machInst); 10567435Sgblack@eecs.umich.edu } 10577435Sgblack@eecs.umich.edu 10587435Sgblack@eecs.umich.edu static StaticInstPtr 10597435Sgblack@eecs.umich.edu decodeNeonThreeRegDiffLengths(ExtMachInst machInst) 10607435Sgblack@eecs.umich.edu { 10617435Sgblack@eecs.umich.edu const bool u = THUMB ? bits(machInst, 28) : bits(machInst, 24); 10627435Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 11, 8); 10637639Sgblack@eecs.umich.edu const IntRegIndex vd = 10647639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 15, 12) | 10657639Sgblack@eecs.umich.edu (bits(machInst, 22) << 4))); 10667639Sgblack@eecs.umich.edu const IntRegIndex vn = 10677639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 19, 16) | 10687639Sgblack@eecs.umich.edu (bits(machInst, 7) << 4))); 10697639Sgblack@eecs.umich.edu const IntRegIndex vm = 10707639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 3, 0) | 10717639Sgblack@eecs.umich.edu (bits(machInst, 5) << 4))); 10727639Sgblack@eecs.umich.edu const unsigned size = bits(machInst, 21, 20); 10737435Sgblack@eecs.umich.edu switch (a) { 10747435Sgblack@eecs.umich.edu case 0x0: 10757639Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<Vaddl>( 10767639Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 10777435Sgblack@eecs.umich.edu case 0x1: 10787639Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<Vaddw>( 10797639Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 10807435Sgblack@eecs.umich.edu case 0x2: 10817639Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<Vsubl>( 10827639Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 10837435Sgblack@eecs.umich.edu case 0x3: 10847639Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<Vsubw>( 10857639Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 10867435Sgblack@eecs.umich.edu case 0x4: 10877435Sgblack@eecs.umich.edu if (u) { 10887639Sgblack@eecs.umich.edu return decodeNeonUThreeUSReg<Vraddhn>( 10897639Sgblack@eecs.umich.edu size, machInst, vd, vn, vm); 10907435Sgblack@eecs.umich.edu } else { 10917639Sgblack@eecs.umich.edu return decodeNeonUThreeUSReg<Vaddhn>( 10927639Sgblack@eecs.umich.edu size, machInst, vd, vn, vm); 10937435Sgblack@eecs.umich.edu } 10947435Sgblack@eecs.umich.edu case 0x5: 10957639Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<Vabal>( 10967639Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 10977435Sgblack@eecs.umich.edu case 0x6: 10987435Sgblack@eecs.umich.edu if (u) { 10997639Sgblack@eecs.umich.edu return decodeNeonUThreeUSReg<Vrsubhn>( 11007639Sgblack@eecs.umich.edu size, machInst, vd, vn, vm); 11017435Sgblack@eecs.umich.edu } else { 11027639Sgblack@eecs.umich.edu return decodeNeonUThreeUSReg<Vsubhn>( 11037639Sgblack@eecs.umich.edu size, machInst, vd, vn, vm); 11047435Sgblack@eecs.umich.edu } 11057435Sgblack@eecs.umich.edu case 0x7: 11067435Sgblack@eecs.umich.edu if (bits(machInst, 23)) { 11077639Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<Vabdl>( 11087639Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 11097435Sgblack@eecs.umich.edu } else { 11107639Sgblack@eecs.umich.edu return decodeNeonUSThreeReg<VabdD, VabdQ>( 11117639Sgblack@eecs.umich.edu bits(machInst, 6), u, size, machInst, vd, vn, vm); 11127435Sgblack@eecs.umich.edu } 11137435Sgblack@eecs.umich.edu case 0x8: 11147639Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<Vmlal>( 11157639Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 11167435Sgblack@eecs.umich.edu case 0xa: 11177639Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<Vmlsl>( 11187639Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 11197435Sgblack@eecs.umich.edu case 0x9: 11207639Sgblack@eecs.umich.edu if (u) { 11217639Sgblack@eecs.umich.edu return new Unknown(machInst); 11227435Sgblack@eecs.umich.edu } else { 11237639Sgblack@eecs.umich.edu return decodeNeonSThreeUSReg<Vqdmlal>( 11247639Sgblack@eecs.umich.edu size, machInst, vd, vn, vm); 11257435Sgblack@eecs.umich.edu } 11267435Sgblack@eecs.umich.edu case 0xb: 11277639Sgblack@eecs.umich.edu if (u) { 11287435Sgblack@eecs.umich.edu return new Unknown(machInst); 11297435Sgblack@eecs.umich.edu } else { 11307639Sgblack@eecs.umich.edu return decodeNeonSThreeUSReg<Vqdmlsl>( 11317639Sgblack@eecs.umich.edu size, machInst, vd, vn, vm); 11327435Sgblack@eecs.umich.edu } 11337435Sgblack@eecs.umich.edu case 0xc: 11347639Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<Vmull>( 11357639Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 11367435Sgblack@eecs.umich.edu case 0xd: 11377639Sgblack@eecs.umich.edu if (u) { 11387435Sgblack@eecs.umich.edu return new Unknown(machInst); 11397435Sgblack@eecs.umich.edu } else { 11407639Sgblack@eecs.umich.edu return decodeNeonSThreeUSReg<Vqdmull>( 11417639Sgblack@eecs.umich.edu size, machInst, vd, vn, vm); 11427435Sgblack@eecs.umich.edu } 11437435Sgblack@eecs.umich.edu case 0xe: 11447639Sgblack@eecs.umich.edu return decodeNeonUThreeUSReg<Vmullp>( 11457639Sgblack@eecs.umich.edu size, machInst, vd, vn, vm); 11467435Sgblack@eecs.umich.edu } 11477435Sgblack@eecs.umich.edu return new Unknown(machInst); 11487435Sgblack@eecs.umich.edu } 11497435Sgblack@eecs.umich.edu 11507435Sgblack@eecs.umich.edu static StaticInstPtr 11517435Sgblack@eecs.umich.edu decodeNeonTwoRegScalar(ExtMachInst machInst) 11527435Sgblack@eecs.umich.edu { 11537435Sgblack@eecs.umich.edu const bool u = THUMB ? bits(machInst, 28) : bits(machInst, 24); 11547435Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 11, 8); 11557639Sgblack@eecs.umich.edu const unsigned size = bits(machInst, 21, 20); 11567639Sgblack@eecs.umich.edu const IntRegIndex vd = 11577639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 15, 12) | 11587639Sgblack@eecs.umich.edu (bits(machInst, 22) << 4))); 11597639Sgblack@eecs.umich.edu const IntRegIndex vn = 11607639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 19, 16) | 11617639Sgblack@eecs.umich.edu (bits(machInst, 7) << 4))); 11627639Sgblack@eecs.umich.edu const IntRegIndex vm = (size == 2) ? 11637639Sgblack@eecs.umich.edu (IntRegIndex)(2 * bits(machInst, 3, 0)) : 11647639Sgblack@eecs.umich.edu (IntRegIndex)(2 * bits(machInst, 2, 0)); 11657639Sgblack@eecs.umich.edu const unsigned index = (size == 2) ? (unsigned)bits(machInst, 5) : 11667639Sgblack@eecs.umich.edu (bits(machInst, 3) | (bits(machInst, 5) << 1)); 11677435Sgblack@eecs.umich.edu switch (a) { 11687435Sgblack@eecs.umich.edu case 0x0: 11697639Sgblack@eecs.umich.edu if (u) { 11707639Sgblack@eecs.umich.edu switch (size) { 11717639Sgblack@eecs.umich.edu case 1: 11727639Sgblack@eecs.umich.edu return new VmlasQ<uint16_t>(machInst, vd, vn, vm, index); 11737639Sgblack@eecs.umich.edu case 2: 11747639Sgblack@eecs.umich.edu return new VmlasQ<uint32_t>(machInst, vd, vn, vm, index); 11757639Sgblack@eecs.umich.edu default: 11767639Sgblack@eecs.umich.edu return new Unknown(machInst); 11777639Sgblack@eecs.umich.edu } 11787639Sgblack@eecs.umich.edu } else { 11797639Sgblack@eecs.umich.edu switch (size) { 11807639Sgblack@eecs.umich.edu case 1: 11817639Sgblack@eecs.umich.edu return new VmlasD<uint16_t>(machInst, vd, vn, vm, index); 11827639Sgblack@eecs.umich.edu case 2: 11837639Sgblack@eecs.umich.edu return new VmlasD<uint32_t>(machInst, vd, vn, vm, index); 11847639Sgblack@eecs.umich.edu default: 11857639Sgblack@eecs.umich.edu return new Unknown(machInst); 11867639Sgblack@eecs.umich.edu } 11877639Sgblack@eecs.umich.edu } 11887435Sgblack@eecs.umich.edu case 0x1: 11897639Sgblack@eecs.umich.edu if (u) 11907639Sgblack@eecs.umich.edu return new VmlasQFp<float>(machInst, vd, vn, vm, index); 11917639Sgblack@eecs.umich.edu else 11927639Sgblack@eecs.umich.edu return new VmlasDFp<float>(machInst, vd, vn, vm, index); 11937435Sgblack@eecs.umich.edu case 0x4: 11947639Sgblack@eecs.umich.edu if (u) { 11957639Sgblack@eecs.umich.edu switch (size) { 11967639Sgblack@eecs.umich.edu case 1: 11977639Sgblack@eecs.umich.edu return new VmlssQ<uint16_t>(machInst, vd, vn, vm, index); 11987639Sgblack@eecs.umich.edu case 2: 11997639Sgblack@eecs.umich.edu return new VmlssQ<uint32_t>(machInst, vd, vn, vm, index); 12007639Sgblack@eecs.umich.edu default: 12017639Sgblack@eecs.umich.edu return new Unknown(machInst); 12027639Sgblack@eecs.umich.edu } 12037639Sgblack@eecs.umich.edu } else { 12047639Sgblack@eecs.umich.edu switch (size) { 12057639Sgblack@eecs.umich.edu case 1: 12067639Sgblack@eecs.umich.edu return new VmlssD<uint16_t>(machInst, vd, vn, vm, index); 12077639Sgblack@eecs.umich.edu case 2: 12087639Sgblack@eecs.umich.edu return new VmlssD<uint32_t>(machInst, vd, vn, vm, index); 12097639Sgblack@eecs.umich.edu default: 12107639Sgblack@eecs.umich.edu return new Unknown(machInst); 12117639Sgblack@eecs.umich.edu } 12127639Sgblack@eecs.umich.edu } 12137435Sgblack@eecs.umich.edu case 0x5: 12147639Sgblack@eecs.umich.edu if (u) 12157639Sgblack@eecs.umich.edu return new VmlssQFp<float>(machInst, vd, vn, vm, index); 12167639Sgblack@eecs.umich.edu else 12177639Sgblack@eecs.umich.edu return new VmlssDFp<float>(machInst, vd, vn, vm, index); 12187435Sgblack@eecs.umich.edu case 0x2: 12197639Sgblack@eecs.umich.edu if (u) { 12207639Sgblack@eecs.umich.edu switch (size) { 12217639Sgblack@eecs.umich.edu case 1: 12227639Sgblack@eecs.umich.edu return new Vmlals<uint16_t>(machInst, vd, vn, vm, index); 12237639Sgblack@eecs.umich.edu case 2: 12247639Sgblack@eecs.umich.edu return new Vmlals<uint32_t>(machInst, vd, vn, vm, index); 12257639Sgblack@eecs.umich.edu default: 12267639Sgblack@eecs.umich.edu return new Unknown(machInst); 12277639Sgblack@eecs.umich.edu } 12287639Sgblack@eecs.umich.edu } else { 12297639Sgblack@eecs.umich.edu switch (size) { 12307639Sgblack@eecs.umich.edu case 1: 12317639Sgblack@eecs.umich.edu return new Vmlals<int16_t>(machInst, vd, vn, vm, index); 12327639Sgblack@eecs.umich.edu case 2: 12337639Sgblack@eecs.umich.edu return new Vmlals<int32_t>(machInst, vd, vn, vm, index); 12347639Sgblack@eecs.umich.edu default: 12357639Sgblack@eecs.umich.edu return new Unknown(machInst); 12367639Sgblack@eecs.umich.edu } 12377639Sgblack@eecs.umich.edu } 12387435Sgblack@eecs.umich.edu case 0x6: 12397639Sgblack@eecs.umich.edu if (u) { 12407639Sgblack@eecs.umich.edu switch (size) { 12417639Sgblack@eecs.umich.edu case 1: 12427639Sgblack@eecs.umich.edu return new Vmlsls<uint16_t>(machInst, vd, vn, vm, index); 12437639Sgblack@eecs.umich.edu case 2: 12447639Sgblack@eecs.umich.edu return new Vmlsls<uint32_t>(machInst, vd, vn, vm, index); 12457639Sgblack@eecs.umich.edu default: 12467639Sgblack@eecs.umich.edu return new Unknown(machInst); 12477639Sgblack@eecs.umich.edu } 12487639Sgblack@eecs.umich.edu } else { 12497639Sgblack@eecs.umich.edu switch (size) { 12507639Sgblack@eecs.umich.edu case 1: 12517639Sgblack@eecs.umich.edu return new Vmlsls<int16_t>(machInst, vd, vn, vm, index); 12527639Sgblack@eecs.umich.edu case 2: 12537639Sgblack@eecs.umich.edu return new Vmlsls<int32_t>(machInst, vd, vn, vm, index); 12547639Sgblack@eecs.umich.edu default: 12557639Sgblack@eecs.umich.edu return new Unknown(machInst); 12567639Sgblack@eecs.umich.edu } 12577639Sgblack@eecs.umich.edu } 12587435Sgblack@eecs.umich.edu case 0x3: 12597435Sgblack@eecs.umich.edu if (u) { 12607435Sgblack@eecs.umich.edu return new Unknown(machInst); 12617435Sgblack@eecs.umich.edu } else { 12627639Sgblack@eecs.umich.edu switch (size) { 12637639Sgblack@eecs.umich.edu case 1: 12647639Sgblack@eecs.umich.edu return new Vqdmlals<int16_t>(machInst, vd, vn, vm, index); 12657639Sgblack@eecs.umich.edu case 2: 12667639Sgblack@eecs.umich.edu return new Vqdmlals<int32_t>(machInst, vd, vn, vm, index); 12677639Sgblack@eecs.umich.edu default: 12687639Sgblack@eecs.umich.edu return new Unknown(machInst); 12697639Sgblack@eecs.umich.edu } 12707435Sgblack@eecs.umich.edu } 12717435Sgblack@eecs.umich.edu case 0x7: 12727435Sgblack@eecs.umich.edu if (u) { 12737435Sgblack@eecs.umich.edu return new Unknown(machInst); 12747435Sgblack@eecs.umich.edu } else { 12757639Sgblack@eecs.umich.edu switch (size) { 12767639Sgblack@eecs.umich.edu case 1: 12777639Sgblack@eecs.umich.edu return new Vqdmlsls<int16_t>(machInst, vd, vn, vm, index); 12787639Sgblack@eecs.umich.edu case 2: 12797639Sgblack@eecs.umich.edu return new Vqdmlsls<int32_t>(machInst, vd, vn, vm, index); 12807639Sgblack@eecs.umich.edu default: 12817639Sgblack@eecs.umich.edu return new Unknown(machInst); 12827639Sgblack@eecs.umich.edu } 12837435Sgblack@eecs.umich.edu } 12847435Sgblack@eecs.umich.edu case 0x8: 12857639Sgblack@eecs.umich.edu if (u) { 12867639Sgblack@eecs.umich.edu switch (size) { 12877639Sgblack@eecs.umich.edu case 1: 12887639Sgblack@eecs.umich.edu return new VmulsQ<uint16_t>(machInst, vd, vn, vm, index); 12897639Sgblack@eecs.umich.edu case 2: 12907639Sgblack@eecs.umich.edu return new VmulsQ<uint32_t>(machInst, vd, vn, vm, index); 12917639Sgblack@eecs.umich.edu default: 12927639Sgblack@eecs.umich.edu return new Unknown(machInst); 12937639Sgblack@eecs.umich.edu } 12947639Sgblack@eecs.umich.edu } else { 12957639Sgblack@eecs.umich.edu switch (size) { 12967639Sgblack@eecs.umich.edu case 1: 12977639Sgblack@eecs.umich.edu return new VmulsD<uint16_t>(machInst, vd, vn, vm, index); 12987639Sgblack@eecs.umich.edu case 2: 12997639Sgblack@eecs.umich.edu return new VmulsD<uint32_t>(machInst, vd, vn, vm, index); 13007639Sgblack@eecs.umich.edu default: 13017639Sgblack@eecs.umich.edu return new Unknown(machInst); 13027639Sgblack@eecs.umich.edu } 13037639Sgblack@eecs.umich.edu } 13047435Sgblack@eecs.umich.edu case 0x9: 13057639Sgblack@eecs.umich.edu if (u) 13067639Sgblack@eecs.umich.edu return new VmulsQFp<float>(machInst, vd, vn, vm, index); 13077639Sgblack@eecs.umich.edu else 13087639Sgblack@eecs.umich.edu return new VmulsDFp<float>(machInst, vd, vn, vm, index); 13097435Sgblack@eecs.umich.edu case 0xa: 13107639Sgblack@eecs.umich.edu if (u) { 13117639Sgblack@eecs.umich.edu switch (size) { 13127639Sgblack@eecs.umich.edu case 1: 13137639Sgblack@eecs.umich.edu return new Vmulls<uint16_t>(machInst, vd, vn, vm, index); 13147639Sgblack@eecs.umich.edu case 2: 13157639Sgblack@eecs.umich.edu return new Vmulls<uint32_t>(machInst, vd, vn, vm, index); 13167639Sgblack@eecs.umich.edu default: 13177639Sgblack@eecs.umich.edu return new Unknown(machInst); 13187639Sgblack@eecs.umich.edu } 13197639Sgblack@eecs.umich.edu } else { 13207639Sgblack@eecs.umich.edu switch (size) { 13217639Sgblack@eecs.umich.edu case 1: 13227639Sgblack@eecs.umich.edu return new Vmulls<int16_t>(machInst, vd, vn, vm, index); 13237639Sgblack@eecs.umich.edu case 2: 13247639Sgblack@eecs.umich.edu return new Vmulls<int32_t>(machInst, vd, vn, vm, index); 13257639Sgblack@eecs.umich.edu default: 13267639Sgblack@eecs.umich.edu return new Unknown(machInst); 13277639Sgblack@eecs.umich.edu } 13287639Sgblack@eecs.umich.edu } 13297435Sgblack@eecs.umich.edu case 0xb: 13307435Sgblack@eecs.umich.edu if (u) { 13317435Sgblack@eecs.umich.edu return new Unknown(machInst); 13327435Sgblack@eecs.umich.edu } else { 13337639Sgblack@eecs.umich.edu if (u) { 13347639Sgblack@eecs.umich.edu switch (size) { 13357639Sgblack@eecs.umich.edu case 1: 13367639Sgblack@eecs.umich.edu return new Vqdmulls<uint16_t>( 13377639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13387639Sgblack@eecs.umich.edu case 2: 13397639Sgblack@eecs.umich.edu return new Vqdmulls<uint32_t>( 13407639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13417639Sgblack@eecs.umich.edu default: 13427639Sgblack@eecs.umich.edu return new Unknown(machInst); 13437639Sgblack@eecs.umich.edu } 13447639Sgblack@eecs.umich.edu } else { 13457639Sgblack@eecs.umich.edu switch (size) { 13467639Sgblack@eecs.umich.edu case 1: 13477639Sgblack@eecs.umich.edu return new Vqdmulls<int16_t>( 13487639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13497639Sgblack@eecs.umich.edu case 2: 13507639Sgblack@eecs.umich.edu return new Vqdmulls<int32_t>( 13517639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13527639Sgblack@eecs.umich.edu default: 13537639Sgblack@eecs.umich.edu return new Unknown(machInst); 13547639Sgblack@eecs.umich.edu } 13557639Sgblack@eecs.umich.edu } 13567435Sgblack@eecs.umich.edu } 13577435Sgblack@eecs.umich.edu case 0xc: 13587639Sgblack@eecs.umich.edu if (u) { 13597639Sgblack@eecs.umich.edu switch (size) { 13607639Sgblack@eecs.umich.edu case 1: 13617639Sgblack@eecs.umich.edu return new VqdmulhsQ<int16_t>( 13627639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13637639Sgblack@eecs.umich.edu case 2: 13647639Sgblack@eecs.umich.edu return new VqdmulhsQ<int32_t>( 13657639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13667639Sgblack@eecs.umich.edu default: 13677639Sgblack@eecs.umich.edu return new Unknown(machInst); 13687639Sgblack@eecs.umich.edu } 13697639Sgblack@eecs.umich.edu } else { 13707639Sgblack@eecs.umich.edu switch (size) { 13717639Sgblack@eecs.umich.edu case 1: 13727639Sgblack@eecs.umich.edu return new VqdmulhsD<int16_t>( 13737639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13747639Sgblack@eecs.umich.edu case 2: 13757639Sgblack@eecs.umich.edu return new VqdmulhsD<int32_t>( 13767639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13777639Sgblack@eecs.umich.edu default: 13787639Sgblack@eecs.umich.edu return new Unknown(machInst); 13797639Sgblack@eecs.umich.edu } 13807639Sgblack@eecs.umich.edu } 13817435Sgblack@eecs.umich.edu case 0xd: 13827639Sgblack@eecs.umich.edu if (u) { 13837639Sgblack@eecs.umich.edu switch (size) { 13847639Sgblack@eecs.umich.edu case 1: 13857639Sgblack@eecs.umich.edu return new VqrdmulhsQ<int16_t>( 13867639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13877639Sgblack@eecs.umich.edu case 2: 13887639Sgblack@eecs.umich.edu return new VqrdmulhsQ<int32_t>( 13897639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13907639Sgblack@eecs.umich.edu default: 13917639Sgblack@eecs.umich.edu return new Unknown(machInst); 13927639Sgblack@eecs.umich.edu } 13937639Sgblack@eecs.umich.edu } else { 13947639Sgblack@eecs.umich.edu switch (size) { 13957639Sgblack@eecs.umich.edu case 1: 13967639Sgblack@eecs.umich.edu return new VqrdmulhsD<int16_t>( 13977639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13987639Sgblack@eecs.umich.edu case 2: 13997639Sgblack@eecs.umich.edu return new VqrdmulhsD<int32_t>( 14007639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 14017639Sgblack@eecs.umich.edu default: 14027639Sgblack@eecs.umich.edu return new Unknown(machInst); 14037639Sgblack@eecs.umich.edu } 14047639Sgblack@eecs.umich.edu } 14057435Sgblack@eecs.umich.edu } 14067435Sgblack@eecs.umich.edu return new Unknown(machInst); 14077435Sgblack@eecs.umich.edu } 14087435Sgblack@eecs.umich.edu 14097435Sgblack@eecs.umich.edu static StaticInstPtr 14107435Sgblack@eecs.umich.edu decodeNeonTwoRegMisc(ExtMachInst machInst) 14117435Sgblack@eecs.umich.edu { 14127435Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 17, 16); 14137435Sgblack@eecs.umich.edu const uint32_t b = bits(machInst, 10, 6); 14147639Sgblack@eecs.umich.edu const bool q = bits(machInst, 6); 14157639Sgblack@eecs.umich.edu const IntRegIndex vd = 14167639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 15, 12) | 14177639Sgblack@eecs.umich.edu (bits(machInst, 22) << 4))); 14187639Sgblack@eecs.umich.edu const IntRegIndex vm = 14197639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 3, 0) | 14207639Sgblack@eecs.umich.edu (bits(machInst, 5) << 4))); 14217639Sgblack@eecs.umich.edu const unsigned size = bits(machInst, 19, 18); 14227435Sgblack@eecs.umich.edu switch (a) { 14237435Sgblack@eecs.umich.edu case 0x0: 14247435Sgblack@eecs.umich.edu switch (bits(b, 4, 1)) { 14257435Sgblack@eecs.umich.edu case 0x0: 14267639Sgblack@eecs.umich.edu switch (size) { 14277639Sgblack@eecs.umich.edu case 0: 14287639Sgblack@eecs.umich.edu if (q) { 14297639Sgblack@eecs.umich.edu return new NVrev64Q<uint8_t>(machInst, vd, vm); 14307639Sgblack@eecs.umich.edu } else { 14317639Sgblack@eecs.umich.edu return new NVrev64D<uint8_t>(machInst, vd, vm); 14327639Sgblack@eecs.umich.edu } 14337639Sgblack@eecs.umich.edu case 1: 14347639Sgblack@eecs.umich.edu if (q) { 14357639Sgblack@eecs.umich.edu return new NVrev64Q<uint16_t>(machInst, vd, vm); 14367639Sgblack@eecs.umich.edu } else { 14377639Sgblack@eecs.umich.edu return new NVrev64D<uint16_t>(machInst, vd, vm); 14387639Sgblack@eecs.umich.edu } 14397639Sgblack@eecs.umich.edu case 2: 14407639Sgblack@eecs.umich.edu if (q) { 14417639Sgblack@eecs.umich.edu return new NVrev64Q<uint32_t>(machInst, vd, vm); 14427639Sgblack@eecs.umich.edu } else { 14437639Sgblack@eecs.umich.edu return new NVrev64D<uint32_t>(machInst, vd, vm); 14447639Sgblack@eecs.umich.edu } 14457639Sgblack@eecs.umich.edu default: 14467639Sgblack@eecs.umich.edu return new Unknown(machInst); 14477639Sgblack@eecs.umich.edu } 14487435Sgblack@eecs.umich.edu case 0x1: 14497639Sgblack@eecs.umich.edu switch (size) { 14507639Sgblack@eecs.umich.edu case 0: 14517639Sgblack@eecs.umich.edu if (q) { 14527639Sgblack@eecs.umich.edu return new NVrev32Q<uint8_t>(machInst, vd, vm); 14537639Sgblack@eecs.umich.edu } else { 14547639Sgblack@eecs.umich.edu return new NVrev32D<uint8_t>(machInst, vd, vm); 14557639Sgblack@eecs.umich.edu } 14567639Sgblack@eecs.umich.edu case 1: 14577639Sgblack@eecs.umich.edu if (q) { 14587639Sgblack@eecs.umich.edu return new NVrev32Q<uint16_t>(machInst, vd, vm); 14597639Sgblack@eecs.umich.edu } else { 14607639Sgblack@eecs.umich.edu return new NVrev32D<uint16_t>(machInst, vd, vm); 14617639Sgblack@eecs.umich.edu } 14627639Sgblack@eecs.umich.edu default: 14637639Sgblack@eecs.umich.edu return new Unknown(machInst); 14647639Sgblack@eecs.umich.edu } 14657435Sgblack@eecs.umich.edu case 0x2: 14667639Sgblack@eecs.umich.edu if (size != 0) { 14677639Sgblack@eecs.umich.edu return new Unknown(machInst); 14687639Sgblack@eecs.umich.edu } else if (q) { 14697639Sgblack@eecs.umich.edu return new NVrev16Q<uint8_t>(machInst, vd, vm); 14707639Sgblack@eecs.umich.edu } else { 14717639Sgblack@eecs.umich.edu return new NVrev16D<uint8_t>(machInst, vd, vm); 14727639Sgblack@eecs.umich.edu } 14737435Sgblack@eecs.umich.edu case 0x4: 14747639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscSReg<NVpaddlD, NVpaddlQ>( 14757639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 14767435Sgblack@eecs.umich.edu case 0x5: 14777639Sgblack@eecs.umich.edu return decodeNeonUTwoMiscSReg<NVpaddlD, NVpaddlQ>( 14787639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 147913169Smatt.horsnell@arm.com case 0x6: 148013169Smatt.horsnell@arm.com if (q == 0) { 148113169Smatt.horsnell@arm.com return new AESE(machInst, vd, vd, vm); 148213169Smatt.horsnell@arm.com } else { 148313169Smatt.horsnell@arm.com return new AESD(machInst, vd, vd, vm); 148413169Smatt.horsnell@arm.com } 148513169Smatt.horsnell@arm.com case 0x7: 148613169Smatt.horsnell@arm.com if (q == 0) { 148713169Smatt.horsnell@arm.com return new AESMC(machInst, vd, vm); 148813169Smatt.horsnell@arm.com } else { 148913169Smatt.horsnell@arm.com return new AESIMC(machInst, vd, vm); 149013169Smatt.horsnell@arm.com } 14917435Sgblack@eecs.umich.edu case 0x8: 14927639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVclsD, NVclsQ>( 14937639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 14947435Sgblack@eecs.umich.edu case 0x9: 14957639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVclzD, NVclzQ>( 14967639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 14977435Sgblack@eecs.umich.edu case 0xa: 14987639Sgblack@eecs.umich.edu return decodeNeonUTwoMiscReg<NVcntD, NVcntQ>( 14997639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15007435Sgblack@eecs.umich.edu case 0xb: 15017639Sgblack@eecs.umich.edu if (q) 15027639Sgblack@eecs.umich.edu return new NVmvnQ<uint64_t>(machInst, vd, vm); 15037639Sgblack@eecs.umich.edu else 15047639Sgblack@eecs.umich.edu return new NVmvnD<uint64_t>(machInst, vd, vm); 15057435Sgblack@eecs.umich.edu case 0xc: 15067639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscSReg<NVpadalD, NVpadalQ>( 15077639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15087435Sgblack@eecs.umich.edu case 0xd: 15097639Sgblack@eecs.umich.edu return decodeNeonUTwoMiscSReg<NVpadalD, NVpadalQ>( 15107639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15117435Sgblack@eecs.umich.edu case 0xe: 15127639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVqabsD, NVqabsQ>( 15137639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15147435Sgblack@eecs.umich.edu case 0xf: 15157639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVqnegD, NVqnegQ>( 15167639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15177435Sgblack@eecs.umich.edu default: 15187435Sgblack@eecs.umich.edu return new Unknown(machInst); 15197435Sgblack@eecs.umich.edu } 15207435Sgblack@eecs.umich.edu case 0x1: 15217435Sgblack@eecs.umich.edu switch (bits(b, 3, 1)) { 15227435Sgblack@eecs.umich.edu case 0x0: 15237639Sgblack@eecs.umich.edu if (bits(b, 4)) { 15247639Sgblack@eecs.umich.edu if (q) { 15257639Sgblack@eecs.umich.edu return new NVcgtQFp<float>(machInst, vd, vm); 15267639Sgblack@eecs.umich.edu } else { 15277639Sgblack@eecs.umich.edu return new NVcgtDFp<float>(machInst, vd, vm); 15287639Sgblack@eecs.umich.edu } 15297639Sgblack@eecs.umich.edu } else { 15307639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVcgtD, NVcgtQ>( 15317639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15327639Sgblack@eecs.umich.edu } 15337435Sgblack@eecs.umich.edu case 0x1: 15347639Sgblack@eecs.umich.edu if (bits(b, 4)) { 15357639Sgblack@eecs.umich.edu if (q) { 15367639Sgblack@eecs.umich.edu return new NVcgeQFp<float>(machInst, vd, vm); 15377639Sgblack@eecs.umich.edu } else { 15387639Sgblack@eecs.umich.edu return new NVcgeDFp<float>(machInst, vd, vm); 15397639Sgblack@eecs.umich.edu } 15407639Sgblack@eecs.umich.edu } else { 15417639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVcgeD, NVcgeQ>( 15427639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15437639Sgblack@eecs.umich.edu } 15447435Sgblack@eecs.umich.edu case 0x2: 15457639Sgblack@eecs.umich.edu if (bits(b, 4)) { 15467639Sgblack@eecs.umich.edu if (q) { 15477639Sgblack@eecs.umich.edu return new NVceqQFp<float>(machInst, vd, vm); 15487639Sgblack@eecs.umich.edu } else { 15497639Sgblack@eecs.umich.edu return new NVceqDFp<float>(machInst, vd, vm); 15507639Sgblack@eecs.umich.edu } 15517639Sgblack@eecs.umich.edu } else { 15527639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVceqD, NVceqQ>( 15537639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15547639Sgblack@eecs.umich.edu } 15557435Sgblack@eecs.umich.edu case 0x3: 15567639Sgblack@eecs.umich.edu if (bits(b, 4)) { 15577639Sgblack@eecs.umich.edu if (q) { 15587639Sgblack@eecs.umich.edu return new NVcleQFp<float>(machInst, vd, vm); 15597639Sgblack@eecs.umich.edu } else { 15607639Sgblack@eecs.umich.edu return new NVcleDFp<float>(machInst, vd, vm); 15617639Sgblack@eecs.umich.edu } 15627639Sgblack@eecs.umich.edu } else { 15637639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVcleD, NVcleQ>( 15647639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15657639Sgblack@eecs.umich.edu } 15667435Sgblack@eecs.umich.edu case 0x4: 15677639Sgblack@eecs.umich.edu if (bits(b, 4)) { 15687639Sgblack@eecs.umich.edu if (q) { 15697639Sgblack@eecs.umich.edu return new NVcltQFp<float>(machInst, vd, vm); 15707639Sgblack@eecs.umich.edu } else { 15717639Sgblack@eecs.umich.edu return new NVcltDFp<float>(machInst, vd, vm); 15727639Sgblack@eecs.umich.edu } 15737639Sgblack@eecs.umich.edu } else { 15747639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVcltD, NVcltQ>( 15757639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15767639Sgblack@eecs.umich.edu } 157713168Smatt.horsnell@arm.com case 0x5: 157813168Smatt.horsnell@arm.com if (q) { 157913168Smatt.horsnell@arm.com return new SHA1H(machInst, vd, vm); 158013168Smatt.horsnell@arm.com } else { 158113168Smatt.horsnell@arm.com return new Unknown(machInst); 158213168Smatt.horsnell@arm.com } 15837435Sgblack@eecs.umich.edu case 0x6: 15847639Sgblack@eecs.umich.edu if (bits(machInst, 10)) { 15857639Sgblack@eecs.umich.edu if (q) 15867639Sgblack@eecs.umich.edu return new NVabsQFp<float>(machInst, vd, vm); 15877639Sgblack@eecs.umich.edu else 15887639Sgblack@eecs.umich.edu return new NVabsDFp<float>(machInst, vd, vm); 15897639Sgblack@eecs.umich.edu } else { 15907639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVabsD, NVabsQ>( 15917639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15927639Sgblack@eecs.umich.edu } 15937435Sgblack@eecs.umich.edu case 0x7: 15947639Sgblack@eecs.umich.edu if (bits(machInst, 10)) { 15957639Sgblack@eecs.umich.edu if (q) 15967639Sgblack@eecs.umich.edu return new NVnegQFp<float>(machInst, vd, vm); 15977639Sgblack@eecs.umich.edu else 15987639Sgblack@eecs.umich.edu return new NVnegDFp<float>(machInst, vd, vm); 15997639Sgblack@eecs.umich.edu } else { 16007639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVnegD, NVnegQ>( 16017639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 16027639Sgblack@eecs.umich.edu } 160312595Ssiddhesh.poyarekar@gmail.com default: 160412595Ssiddhesh.poyarekar@gmail.com return new Unknown64(machInst); 16057435Sgblack@eecs.umich.edu } 16067435Sgblack@eecs.umich.edu case 0x2: 16077435Sgblack@eecs.umich.edu switch (bits(b, 4, 1)) { 16087435Sgblack@eecs.umich.edu case 0x0: 16097639Sgblack@eecs.umich.edu if (q) 16107639Sgblack@eecs.umich.edu return new NVswpQ<uint64_t>(machInst, vd, vm); 16117639Sgblack@eecs.umich.edu else 16127639Sgblack@eecs.umich.edu return new NVswpD<uint64_t>(machInst, vd, vm); 16137435Sgblack@eecs.umich.edu case 0x1: 16148607Sgblack@eecs.umich.edu return decodeNeonUTwoMiscSReg<NVtrnD, NVtrnQ>( 16157639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 16167435Sgblack@eecs.umich.edu case 0x2: 16177639Sgblack@eecs.umich.edu return decodeNeonUTwoMiscReg<NVuzpD, NVuzpQ>( 16187639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 16197435Sgblack@eecs.umich.edu case 0x3: 16207639Sgblack@eecs.umich.edu return decodeNeonUTwoMiscReg<NVzipD, NVzipQ>( 16217639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 16227435Sgblack@eecs.umich.edu case 0x4: 16237435Sgblack@eecs.umich.edu if (b == 0x8) { 16247639Sgblack@eecs.umich.edu return decodeNeonUTwoMiscUSReg<NVmovn>( 16257639Sgblack@eecs.umich.edu size, machInst, vd, vm); 16267435Sgblack@eecs.umich.edu } else { 16277639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscUSReg<NVqmovuns>( 16287639Sgblack@eecs.umich.edu size, machInst, vd, vm); 16297435Sgblack@eecs.umich.edu } 16307435Sgblack@eecs.umich.edu case 0x5: 16317639Sgblack@eecs.umich.edu if (q) { 16327639Sgblack@eecs.umich.edu return decodeNeonUTwoMiscUSReg<NVqmovun>( 16337639Sgblack@eecs.umich.edu size, machInst, vd, vm); 16347639Sgblack@eecs.umich.edu } else { 16357639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscUSReg<NVqmovn>( 16367639Sgblack@eecs.umich.edu size, machInst, vd, vm); 16377639Sgblack@eecs.umich.edu } 16387435Sgblack@eecs.umich.edu case 0x6: 16397435Sgblack@eecs.umich.edu if (b == 0xc) { 16407639Sgblack@eecs.umich.edu return decodeNeonSTwoShiftUSReg<NVshll>( 16417639Sgblack@eecs.umich.edu size, machInst, vd, vm, 8 << size); 16427435Sgblack@eecs.umich.edu } else { 16437435Sgblack@eecs.umich.edu return new Unknown(machInst); 16447435Sgblack@eecs.umich.edu } 164513168Smatt.horsnell@arm.com case 0x7: 164613168Smatt.horsnell@arm.com if (q) { 164713168Smatt.horsnell@arm.com return new SHA256SU0(machInst, vd, vm); 164813168Smatt.horsnell@arm.com } else { 164913168Smatt.horsnell@arm.com return new SHA1SU1(machInst, vd, vm); 165013168Smatt.horsnell@arm.com } 16517435Sgblack@eecs.umich.edu case 0xc: 16527435Sgblack@eecs.umich.edu case 0xe: 16537435Sgblack@eecs.umich.edu if (b == 0x18) { 16547639Sgblack@eecs.umich.edu if (size != 1 || (vm % 2)) 16557639Sgblack@eecs.umich.edu return new Unknown(machInst); 16567639Sgblack@eecs.umich.edu return new NVcvts2h<uint16_t>(machInst, vd, vm); 16577435Sgblack@eecs.umich.edu } else if (b == 0x1c) { 16587639Sgblack@eecs.umich.edu if (size != 1 || (vd % 2)) 16597639Sgblack@eecs.umich.edu return new Unknown(machInst); 16607639Sgblack@eecs.umich.edu return new NVcvth2s<uint16_t>(machInst, vd, vm); 16617435Sgblack@eecs.umich.edu } else { 16627435Sgblack@eecs.umich.edu return new Unknown(machInst); 16637435Sgblack@eecs.umich.edu } 16647435Sgblack@eecs.umich.edu default: 16657435Sgblack@eecs.umich.edu return new Unknown(machInst); 16667435Sgblack@eecs.umich.edu } 16677435Sgblack@eecs.umich.edu case 0x3: 16687435Sgblack@eecs.umich.edu if (bits(b, 4, 3) == 0x3) { 16697639Sgblack@eecs.umich.edu if ((q && (vd % 2 || vm % 2)) || size != 2) { 16707639Sgblack@eecs.umich.edu return new Unknown(machInst); 16717639Sgblack@eecs.umich.edu } else { 16727639Sgblack@eecs.umich.edu if (bits(b, 2)) { 16737639Sgblack@eecs.umich.edu if (bits(b, 1)) { 16747639Sgblack@eecs.umich.edu if (q) { 16757639Sgblack@eecs.umich.edu return new NVcvt2ufxQ<float>( 16767639Sgblack@eecs.umich.edu machInst, vd, vm, 0); 16777639Sgblack@eecs.umich.edu } else { 16787639Sgblack@eecs.umich.edu return new NVcvt2ufxD<float>( 16797639Sgblack@eecs.umich.edu machInst, vd, vm, 0); 16807639Sgblack@eecs.umich.edu } 16817639Sgblack@eecs.umich.edu } else { 16827639Sgblack@eecs.umich.edu if (q) { 16837639Sgblack@eecs.umich.edu return new NVcvt2sfxQ<float>( 16847639Sgblack@eecs.umich.edu machInst, vd, vm, 0); 16857639Sgblack@eecs.umich.edu } else { 16867639Sgblack@eecs.umich.edu return new NVcvt2sfxD<float>( 16877639Sgblack@eecs.umich.edu machInst, vd, vm, 0); 16887639Sgblack@eecs.umich.edu } 16897639Sgblack@eecs.umich.edu } 16907639Sgblack@eecs.umich.edu } else { 16917639Sgblack@eecs.umich.edu if (bits(b, 1)) { 16927639Sgblack@eecs.umich.edu if (q) { 16937639Sgblack@eecs.umich.edu return new NVcvtu2fpQ<float>( 16947639Sgblack@eecs.umich.edu machInst, vd, vm, 0); 16957639Sgblack@eecs.umich.edu } else { 16967639Sgblack@eecs.umich.edu return new NVcvtu2fpD<float>( 16977639Sgblack@eecs.umich.edu machInst, vd, vm, 0); 16987639Sgblack@eecs.umich.edu } 16997639Sgblack@eecs.umich.edu } else { 17007639Sgblack@eecs.umich.edu if (q) { 17017639Sgblack@eecs.umich.edu return new NVcvts2fpQ<float>( 17027639Sgblack@eecs.umich.edu machInst, vd, vm, 0); 17037639Sgblack@eecs.umich.edu } else { 17047639Sgblack@eecs.umich.edu return new NVcvts2fpD<float>( 17057639Sgblack@eecs.umich.edu machInst, vd, vm, 0); 17067639Sgblack@eecs.umich.edu } 17077639Sgblack@eecs.umich.edu } 17087639Sgblack@eecs.umich.edu } 17097639Sgblack@eecs.umich.edu } 17107435Sgblack@eecs.umich.edu } else if ((b & 0x1a) == 0x10) { 17117639Sgblack@eecs.umich.edu if (bits(b, 2)) { 17127639Sgblack@eecs.umich.edu if (q) { 17137639Sgblack@eecs.umich.edu return new NVrecpeQFp<float>(machInst, vd, vm); 17147639Sgblack@eecs.umich.edu } else { 17157639Sgblack@eecs.umich.edu return new NVrecpeDFp<float>(machInst, vd, vm); 17167639Sgblack@eecs.umich.edu } 17177639Sgblack@eecs.umich.edu } else { 17187639Sgblack@eecs.umich.edu if (q) { 17197639Sgblack@eecs.umich.edu return new NVrecpeQ<uint32_t>(machInst, vd, vm); 17207639Sgblack@eecs.umich.edu } else { 17217639Sgblack@eecs.umich.edu return new NVrecpeD<uint32_t>(machInst, vd, vm); 17227639Sgblack@eecs.umich.edu } 17237639Sgblack@eecs.umich.edu } 17247435Sgblack@eecs.umich.edu } else if ((b & 0x1a) == 0x12) { 17257639Sgblack@eecs.umich.edu if (bits(b, 2)) { 17267639Sgblack@eecs.umich.edu if (q) { 17277639Sgblack@eecs.umich.edu return new NVrsqrteQFp<float>(machInst, vd, vm); 17287639Sgblack@eecs.umich.edu } else { 17297639Sgblack@eecs.umich.edu return new NVrsqrteDFp<float>(machInst, vd, vm); 17307639Sgblack@eecs.umich.edu } 17317639Sgblack@eecs.umich.edu } else { 17327639Sgblack@eecs.umich.edu if (q) { 17337639Sgblack@eecs.umich.edu return new NVrsqrteQ<uint32_t>(machInst, vd, vm); 17347639Sgblack@eecs.umich.edu } else { 17357639Sgblack@eecs.umich.edu return new NVrsqrteD<uint32_t>(machInst, vd, vm); 17367639Sgblack@eecs.umich.edu } 17377639Sgblack@eecs.umich.edu } 17387435Sgblack@eecs.umich.edu } else { 17397435Sgblack@eecs.umich.edu return new Unknown(machInst); 17407435Sgblack@eecs.umich.edu } 17417435Sgblack@eecs.umich.edu } 17427435Sgblack@eecs.umich.edu return new Unknown(machInst); 17437435Sgblack@eecs.umich.edu } 17447435Sgblack@eecs.umich.edu 17457435Sgblack@eecs.umich.edu StaticInstPtr 17467435Sgblack@eecs.umich.edu decodeNeonData(ExtMachInst machInst) 17477435Sgblack@eecs.umich.edu { 17487435Sgblack@eecs.umich.edu const bool u = THUMB ? bits(machInst, 28) : bits(machInst, 24); 17497435Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 23, 19); 17507435Sgblack@eecs.umich.edu const uint32_t b = bits(machInst, 11, 8); 17517435Sgblack@eecs.umich.edu const uint32_t c = bits(machInst, 7, 4); 17527435Sgblack@eecs.umich.edu if (bits(a, 4) == 0) { 17537435Sgblack@eecs.umich.edu return decodeNeonThreeRegistersSameLength(machInst); 17547435Sgblack@eecs.umich.edu } else if ((c & 0x9) == 1) { 17557435Sgblack@eecs.umich.edu if ((a & 0x7) == 0) { 17567435Sgblack@eecs.umich.edu return decodeNeonOneRegModImm(machInst); 17577435Sgblack@eecs.umich.edu } else { 17587435Sgblack@eecs.umich.edu return decodeNeonTwoRegAndShift(machInst); 17597435Sgblack@eecs.umich.edu } 17607435Sgblack@eecs.umich.edu } else if ((c & 0x9) == 9) { 17617435Sgblack@eecs.umich.edu return decodeNeonTwoRegAndShift(machInst); 17627639Sgblack@eecs.umich.edu } else if (bits(a, 2, 1) != 0x3) { 17637639Sgblack@eecs.umich.edu if ((c & 0x5) == 0) { 17647435Sgblack@eecs.umich.edu return decodeNeonThreeRegDiffLengths(machInst); 17657639Sgblack@eecs.umich.edu } else if ((c & 0x5) == 4) { 17667435Sgblack@eecs.umich.edu return decodeNeonTwoRegScalar(machInst); 17677435Sgblack@eecs.umich.edu } 17687435Sgblack@eecs.umich.edu } else if ((a & 0x16) == 0x16) { 17697639Sgblack@eecs.umich.edu const IntRegIndex vd = 17707639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 15, 12) | 17717639Sgblack@eecs.umich.edu (bits(machInst, 22) << 4))); 17727639Sgblack@eecs.umich.edu const IntRegIndex vn = 17737639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 19, 16) | 17747639Sgblack@eecs.umich.edu (bits(machInst, 7) << 4))); 17757639Sgblack@eecs.umich.edu const IntRegIndex vm = 17767639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 3, 0) | 17777639Sgblack@eecs.umich.edu (bits(machInst, 5) << 4))); 17787435Sgblack@eecs.umich.edu if (!u) { 17797435Sgblack@eecs.umich.edu if (bits(c, 0) == 0) { 17807639Sgblack@eecs.umich.edu unsigned imm4 = bits(machInst, 11, 8); 17817639Sgblack@eecs.umich.edu bool q = bits(machInst, 6); 17827639Sgblack@eecs.umich.edu if (imm4 >= 16 && !q) 17837639Sgblack@eecs.umich.edu return new Unknown(machInst); 17847639Sgblack@eecs.umich.edu if (q) { 17857639Sgblack@eecs.umich.edu return new NVextQ<uint8_t>(machInst, vd, vn, vm, imm4); 17867639Sgblack@eecs.umich.edu } else { 17877639Sgblack@eecs.umich.edu return new NVextD<uint8_t>(machInst, vd, vn, vm, imm4); 17887639Sgblack@eecs.umich.edu } 17897435Sgblack@eecs.umich.edu } 17907435Sgblack@eecs.umich.edu } else if (bits(b, 3) == 0 && bits(c, 0) == 0) { 17917435Sgblack@eecs.umich.edu return decodeNeonTwoRegMisc(machInst); 17927435Sgblack@eecs.umich.edu } else if (bits(b, 3, 2) == 0x2 && bits(c, 0) == 0) { 17937639Sgblack@eecs.umich.edu unsigned length = bits(machInst, 9, 8) + 1; 17947639Sgblack@eecs.umich.edu if ((uint32_t)vn / 2 + length > 32) 17957639Sgblack@eecs.umich.edu return new Unknown(machInst); 17967435Sgblack@eecs.umich.edu if (bits(machInst, 6) == 0) { 17977639Sgblack@eecs.umich.edu switch (length) { 17987639Sgblack@eecs.umich.edu case 1: 17997639Sgblack@eecs.umich.edu return new NVtbl1(machInst, vd, vn, vm); 18007639Sgblack@eecs.umich.edu case 2: 18017639Sgblack@eecs.umich.edu return new NVtbl2(machInst, vd, vn, vm); 18027639Sgblack@eecs.umich.edu case 3: 18037639Sgblack@eecs.umich.edu return new NVtbl3(machInst, vd, vn, vm); 18047639Sgblack@eecs.umich.edu case 4: 18057639Sgblack@eecs.umich.edu return new NVtbl4(machInst, vd, vn, vm); 18067639Sgblack@eecs.umich.edu } 18077435Sgblack@eecs.umich.edu } else { 18087639Sgblack@eecs.umich.edu switch (length) { 18097639Sgblack@eecs.umich.edu case 1: 18107639Sgblack@eecs.umich.edu return new NVtbx1(machInst, vd, vn, vm); 18117639Sgblack@eecs.umich.edu case 2: 18127639Sgblack@eecs.umich.edu return new NVtbx2(machInst, vd, vn, vm); 18137639Sgblack@eecs.umich.edu case 3: 18147639Sgblack@eecs.umich.edu return new NVtbx3(machInst, vd, vn, vm); 18157639Sgblack@eecs.umich.edu case 4: 18167639Sgblack@eecs.umich.edu return new NVtbx4(machInst, vd, vn, vm); 18177639Sgblack@eecs.umich.edu } 18187435Sgblack@eecs.umich.edu } 18197435Sgblack@eecs.umich.edu } else if (b == 0xc && (c & 0x9) == 0) { 18207639Sgblack@eecs.umich.edu unsigned imm4 = bits(machInst, 19, 16); 18217639Sgblack@eecs.umich.edu if (bits(imm4, 2, 0) == 0) 18227639Sgblack@eecs.umich.edu return new Unknown(machInst); 18237639Sgblack@eecs.umich.edu unsigned size = 0; 18247639Sgblack@eecs.umich.edu while ((imm4 & 0x1) == 0) { 18257639Sgblack@eecs.umich.edu size++; 18267639Sgblack@eecs.umich.edu imm4 >>= 1; 18277639Sgblack@eecs.umich.edu } 18287639Sgblack@eecs.umich.edu unsigned index = imm4 >> 1; 18297639Sgblack@eecs.umich.edu const bool q = bits(machInst, 6); 18307639Sgblack@eecs.umich.edu return decodeNeonUTwoShiftSReg<NVdupD, NVdupQ>( 18317639Sgblack@eecs.umich.edu q, size, machInst, vd, vm, index); 18327435Sgblack@eecs.umich.edu } 18337435Sgblack@eecs.umich.edu } 18347435Sgblack@eecs.umich.edu return new Unknown(machInst); 18357435Sgblack@eecs.umich.edu } 18367435Sgblack@eecs.umich.edu ''' 18377435Sgblack@eecs.umich.edu}}; 18387435Sgblack@eecs.umich.edu 18397435Sgblack@eecs.umich.edudef format ThumbNeonMem() {{ 18407435Sgblack@eecs.umich.edu decode_block = ''' 18417435Sgblack@eecs.umich.edu return decodeNeonMem(machInst); 18427435Sgblack@eecs.umich.edu ''' 18437435Sgblack@eecs.umich.edu}}; 18447435Sgblack@eecs.umich.edu 18457435Sgblack@eecs.umich.edudef format ThumbNeonData() {{ 18467435Sgblack@eecs.umich.edu decode_block = ''' 18477639Sgblack@eecs.umich.edu return decodeNeonData(machInst); 18487435Sgblack@eecs.umich.edu ''' 18497435Sgblack@eecs.umich.edu}}; 18507435Sgblack@eecs.umich.edu 18517435Sgblack@eecs.umich.edulet {{ 18527435Sgblack@eecs.umich.edu header_output = ''' 18537435Sgblack@eecs.umich.edu StaticInstPtr 18547356Sgblack@eecs.umich.edu decodeExtensionRegLoadStore(ExtMachInst machInst); 18557356Sgblack@eecs.umich.edu ''' 18567356Sgblack@eecs.umich.edu decoder_output = ''' 18577356Sgblack@eecs.umich.edu StaticInstPtr 18587356Sgblack@eecs.umich.edu decodeExtensionRegLoadStore(ExtMachInst machInst) 18597178Sgblack@eecs.umich.edu { 18607178Sgblack@eecs.umich.edu const uint32_t opcode = bits(machInst, 24, 20); 18617178Sgblack@eecs.umich.edu const uint32_t offset = bits(machInst, 7, 0); 18627337Sgblack@eecs.umich.edu const bool single = (bits(machInst, 8) == 0); 18637178Sgblack@eecs.umich.edu const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 18647178Sgblack@eecs.umich.edu RegIndex vd; 18657178Sgblack@eecs.umich.edu if (single) { 18667178Sgblack@eecs.umich.edu vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) | 18677178Sgblack@eecs.umich.edu bits(machInst, 22)); 18687178Sgblack@eecs.umich.edu } else { 18697178Sgblack@eecs.umich.edu vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) | 18707178Sgblack@eecs.umich.edu (bits(machInst, 22) << 5)); 18717178Sgblack@eecs.umich.edu } 18727178Sgblack@eecs.umich.edu switch (bits(opcode, 4, 3)) { 18737178Sgblack@eecs.umich.edu case 0x0: 18747335Sgblack@eecs.umich.edu if (bits(opcode, 4, 1) == 0x2 && 18757335Sgblack@eecs.umich.edu !(machInst.thumb == 1 && bits(machInst, 28) == 1) && 18767335Sgblack@eecs.umich.edu !(machInst.thumb == 0 && machInst.condCode == 0xf)) { 18777335Sgblack@eecs.umich.edu if ((bits(machInst, 7, 4) & 0xd) != 1) { 18787335Sgblack@eecs.umich.edu break; 18797335Sgblack@eecs.umich.edu } 18807335Sgblack@eecs.umich.edu const IntRegIndex rt = 18817335Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 18827335Sgblack@eecs.umich.edu const IntRegIndex rt2 = 18837335Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 18847335Sgblack@eecs.umich.edu const bool op = bits(machInst, 20); 18857335Sgblack@eecs.umich.edu uint32_t vm; 18867337Sgblack@eecs.umich.edu if (single) { 18877335Sgblack@eecs.umich.edu vm = (bits(machInst, 3, 0) << 1) | bits(machInst, 5); 18887335Sgblack@eecs.umich.edu } else { 18897335Sgblack@eecs.umich.edu vm = (bits(machInst, 3, 0) << 1) | 18907335Sgblack@eecs.umich.edu (bits(machInst, 5) << 5); 18917335Sgblack@eecs.umich.edu } 18927335Sgblack@eecs.umich.edu if (op) { 18937335Sgblack@eecs.umich.edu return new Vmov2Core2Reg(machInst, rt, rt2, 18947335Sgblack@eecs.umich.edu (IntRegIndex)vm); 18957335Sgblack@eecs.umich.edu } else { 18967335Sgblack@eecs.umich.edu return new Vmov2Reg2Core(machInst, (IntRegIndex)vm, 18977335Sgblack@eecs.umich.edu rt, rt2); 18987335Sgblack@eecs.umich.edu } 18997178Sgblack@eecs.umich.edu } 19007178Sgblack@eecs.umich.edu break; 19017178Sgblack@eecs.umich.edu case 0x1: 19027413Sgblack@eecs.umich.edu { 190310037SARM gem5 Developers if (offset == 0 || vd + offset/2 > NumFloatV7ArchRegs) { 19047413Sgblack@eecs.umich.edu break; 19057413Sgblack@eecs.umich.edu } 19067413Sgblack@eecs.umich.edu switch (bits(opcode, 1, 0)) { 19077413Sgblack@eecs.umich.edu case 0x0: 19087413Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 19097413Sgblack@eecs.umich.edu true, false, false, offset); 19107413Sgblack@eecs.umich.edu case 0x1: 19117413Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 19127413Sgblack@eecs.umich.edu true, false, true, offset); 19137413Sgblack@eecs.umich.edu case 0x2: 19147413Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 19157413Sgblack@eecs.umich.edu true, true, false, offset); 19167413Sgblack@eecs.umich.edu case 0x3: 19177413Sgblack@eecs.umich.edu // If rn == sp, then this is called vpop. 19187413Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 19197413Sgblack@eecs.umich.edu true, true, true, offset); 192012595Ssiddhesh.poyarekar@gmail.com default: 192112595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 19227413Sgblack@eecs.umich.edu } 19237178Sgblack@eecs.umich.edu } 19247178Sgblack@eecs.umich.edu case 0x2: 19257178Sgblack@eecs.umich.edu if (bits(opcode, 1, 0) == 0x2) { 19267178Sgblack@eecs.umich.edu // If rn == sp, then this is called vpush. 19277178Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 19287178Sgblack@eecs.umich.edu false, true, false, offset); 19297178Sgblack@eecs.umich.edu } else if (bits(opcode, 1, 0) == 0x3) { 19307178Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 19317178Sgblack@eecs.umich.edu false, true, true, offset); 19327178Sgblack@eecs.umich.edu } 193312595Ssiddhesh.poyarekar@gmail.com M5_FALLTHROUGH; 19347178Sgblack@eecs.umich.edu case 0x3: 19357346Sgblack@eecs.umich.edu const bool up = (bits(machInst, 23) == 1); 19367346Sgblack@eecs.umich.edu const uint32_t imm = bits(machInst, 7, 0) << 2; 19377346Sgblack@eecs.umich.edu if (single) { 19387346Sgblack@eecs.umich.edu vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) | 19397346Sgblack@eecs.umich.edu (bits(machInst, 22))); 19407346Sgblack@eecs.umich.edu } else { 19417346Sgblack@eecs.umich.edu vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) | 19427346Sgblack@eecs.umich.edu (bits(machInst, 22) << 5)); 19437346Sgblack@eecs.umich.edu } 19447178Sgblack@eecs.umich.edu if (bits(opcode, 1, 0) == 0x0) { 19457346Sgblack@eecs.umich.edu if (single) { 19467346Sgblack@eecs.umich.edu if (up) { 19477346Sgblack@eecs.umich.edu return new %(vstr_us)s(machInst, vd, rn, up, imm); 19487346Sgblack@eecs.umich.edu } else { 19497346Sgblack@eecs.umich.edu return new %(vstr_s)s(machInst, vd, rn, up, imm); 19507346Sgblack@eecs.umich.edu } 19517346Sgblack@eecs.umich.edu } else { 19527346Sgblack@eecs.umich.edu if (up) { 19537346Sgblack@eecs.umich.edu return new %(vstr_ud)s(machInst, vd, vd + 1, 19547346Sgblack@eecs.umich.edu rn, up, imm); 19557346Sgblack@eecs.umich.edu } else { 19567346Sgblack@eecs.umich.edu return new %(vstr_d)s(machInst, vd, vd + 1, 19577346Sgblack@eecs.umich.edu rn, up, imm); 19587346Sgblack@eecs.umich.edu } 19597346Sgblack@eecs.umich.edu } 19607178Sgblack@eecs.umich.edu } else if (bits(opcode, 1, 0) == 0x1) { 19617337Sgblack@eecs.umich.edu if (single) { 19627337Sgblack@eecs.umich.edu if (up) { 19637337Sgblack@eecs.umich.edu return new %(vldr_us)s(machInst, vd, rn, up, imm); 19647337Sgblack@eecs.umich.edu } else { 19657337Sgblack@eecs.umich.edu return new %(vldr_s)s(machInst, vd, rn, up, imm); 19667337Sgblack@eecs.umich.edu } 19677337Sgblack@eecs.umich.edu } else { 19687337Sgblack@eecs.umich.edu if (up) { 19697337Sgblack@eecs.umich.edu return new %(vldr_ud)s(machInst, vd, vd + 1, 19707337Sgblack@eecs.umich.edu rn, up, imm); 19717337Sgblack@eecs.umich.edu } else { 19727337Sgblack@eecs.umich.edu return new %(vldr_d)s(machInst, vd, vd + 1, 19737337Sgblack@eecs.umich.edu rn, up, imm); 19747337Sgblack@eecs.umich.edu } 19757337Sgblack@eecs.umich.edu } 19767178Sgblack@eecs.umich.edu } 19777178Sgblack@eecs.umich.edu } 19787178Sgblack@eecs.umich.edu return new Unknown(machInst); 19797178Sgblack@eecs.umich.edu } 19807337Sgblack@eecs.umich.edu ''' % { 19817337Sgblack@eecs.umich.edu "vldr_us" : "VLDR_" + loadImmClassName(False, True, False), 19827337Sgblack@eecs.umich.edu "vldr_s" : "VLDR_" + loadImmClassName(False, False, False), 19837337Sgblack@eecs.umich.edu "vldr_ud" : "VLDR_" + loadDoubleImmClassName(False, True, False), 19847346Sgblack@eecs.umich.edu "vldr_d" : "VLDR_" + loadDoubleImmClassName(False, False, False), 19857346Sgblack@eecs.umich.edu "vstr_us" : "VSTR_" + storeImmClassName(False, True, False), 19867346Sgblack@eecs.umich.edu "vstr_s" : "VSTR_" + storeImmClassName(False, False, False), 19877346Sgblack@eecs.umich.edu "vstr_ud" : "VSTR_" + storeDoubleImmClassName(False, True, False), 19887346Sgblack@eecs.umich.edu "vstr_d" : "VSTR_" + storeDoubleImmClassName(False, False, False) 19897337Sgblack@eecs.umich.edu } 19907178Sgblack@eecs.umich.edu}}; 19917321Sgblack@eecs.umich.edu 19927356Sgblack@eecs.umich.edudef format ExtensionRegLoadStore() {{ 19937321Sgblack@eecs.umich.edu decode_block = ''' 19947356Sgblack@eecs.umich.edu return decodeExtensionRegLoadStore(machInst); 19957356Sgblack@eecs.umich.edu ''' 19967356Sgblack@eecs.umich.edu}}; 19977356Sgblack@eecs.umich.edu 19987356Sgblack@eecs.umich.edulet {{ 19997356Sgblack@eecs.umich.edu header_output = ''' 20007356Sgblack@eecs.umich.edu StaticInstPtr 20017356Sgblack@eecs.umich.edu decodeShortFpTransfer(ExtMachInst machInst); 20027356Sgblack@eecs.umich.edu ''' 20037356Sgblack@eecs.umich.edu decoder_output = ''' 200413738Sciro.santilli@arm.com IntRegIndex decodeFpVd(ExtMachInst machInst, uint32_t size, bool isInt) 200513738Sciro.santilli@arm.com { 200613738Sciro.santilli@arm.com if (!isInt and size == 3) { 200713738Sciro.santilli@arm.com return (IntRegIndex)((bits(machInst, 22) << 5) | 200813738Sciro.santilli@arm.com (bits(machInst, 15, 12) << 1)); 200913738Sciro.santilli@arm.com } else { 201013738Sciro.santilli@arm.com return (IntRegIndex)(bits(machInst, 22) | 201113738Sciro.santilli@arm.com (bits(machInst, 15, 12) << 1)); 201213738Sciro.santilli@arm.com } 201313738Sciro.santilli@arm.com } 201413738Sciro.santilli@arm.com IntRegIndex decodeFpVm(ExtMachInst machInst, uint32_t size, bool isInt) 201513738Sciro.santilli@arm.com { 201613738Sciro.santilli@arm.com if (!isInt and size == 3) { 201713738Sciro.santilli@arm.com return (IntRegIndex)((bits(machInst, 5) << 5) | 201813738Sciro.santilli@arm.com (bits(machInst, 3, 0) << 1)); 201913738Sciro.santilli@arm.com } else { 202013738Sciro.santilli@arm.com return (IntRegIndex)(bits(machInst, 5) | 202113738Sciro.santilli@arm.com (bits(machInst, 3, 0) << 1)); 202213738Sciro.santilli@arm.com } 202313738Sciro.santilli@arm.com } 20247356Sgblack@eecs.umich.edu StaticInstPtr 20257356Sgblack@eecs.umich.edu decodeShortFpTransfer(ExtMachInst machInst) 20267321Sgblack@eecs.umich.edu { 20277321Sgblack@eecs.umich.edu const uint32_t l = bits(machInst, 20); 20287321Sgblack@eecs.umich.edu const uint32_t c = bits(machInst, 8); 20297321Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 23, 21); 20307321Sgblack@eecs.umich.edu const uint32_t b = bits(machInst, 6, 5); 203113738Sciro.santilli@arm.com const uint32_t o1 = bits(machInst, 18); 20327321Sgblack@eecs.umich.edu if ((machInst.thumb == 1 && bits(machInst, 28) == 1) || 20337321Sgblack@eecs.umich.edu (machInst.thumb == 0 && machInst.condCode == 0xf)) { 203411671Smitch.hayenga@arm.com // Determine if this is backported aarch64 FP instruction 203511671Smitch.hayenga@arm.com const bool b31_b24 = bits(machInst, 31, 24) == 0xFE; 203611671Smitch.hayenga@arm.com const bool b23 = bits(machInst, 23); 203713738Sciro.santilli@arm.com const bool b21_b19 = bits(machInst, 21, 19) == 0x7; 203811671Smitch.hayenga@arm.com const bool b11_b9 = bits(machInst, 11, 9) == 0x5; 203913738Sciro.santilli@arm.com const uint32_t size = bits(machInst, 9, 8); 204013738Sciro.santilli@arm.com const bool op3 = bits(machInst, 6); 204111671Smitch.hayenga@arm.com const bool b4 = bits(machInst, 4) == 0x0; 204213738Sciro.santilli@arm.com const uint32_t rm = bits(machInst, 17, 16); 204313738Sciro.santilli@arm.com IntRegIndex vd = decodeFpVd(machInst, size, false); 204413738Sciro.santilli@arm.com IntRegIndex vm = decodeFpVm(machInst, size, false); 204513738Sciro.santilli@arm.com IntRegIndex vdInt = decodeFpVd(machInst, size, true); 204613738Sciro.santilli@arm.com if (b31_b24 && b23 && b21_b19 && b11_b9 && op3 && b4) { 204713738Sciro.santilli@arm.com if (o1 == 0) { 204813738Sciro.santilli@arm.com // VINT* Integer Rounding Instruction 204913738Sciro.santilli@arm.com if (size == 3) { 205013738Sciro.santilli@arm.com switch(rm) { 205113738Sciro.santilli@arm.com case 0x0: 205213738Sciro.santilli@arm.com return decodeVfpRegRegOp<VRIntAD>(machInst, vd, vm, 205313738Sciro.santilli@arm.com true); 205413738Sciro.santilli@arm.com case 0x1: 205513738Sciro.santilli@arm.com return decodeVfpRegRegOp<VRIntND>(machInst, vd, vm, 205613738Sciro.santilli@arm.com true); 205713738Sciro.santilli@arm.com case 0x2: 205813738Sciro.santilli@arm.com return decodeVfpRegRegOp<VRIntPD>(machInst, vd, vm, 205913738Sciro.santilli@arm.com true); 206013738Sciro.santilli@arm.com case 0x3: 206113738Sciro.santilli@arm.com return decodeVfpRegRegOp<VRIntMD>(machInst, vd, vm, 206213738Sciro.santilli@arm.com true); 206313738Sciro.santilli@arm.com default: return new Unknown(machInst); 206413738Sciro.santilli@arm.com } 206513738Sciro.santilli@arm.com } else { 206613738Sciro.santilli@arm.com switch(rm) { 206713738Sciro.santilli@arm.com case 0x0: 206813738Sciro.santilli@arm.com return decodeVfpRegRegOp<VRIntAS>(machInst, vd, vm, 206913738Sciro.santilli@arm.com false); 207013738Sciro.santilli@arm.com case 0x1: 207113738Sciro.santilli@arm.com return decodeVfpRegRegOp<VRIntNS>(machInst, vd, vm, 207213738Sciro.santilli@arm.com false); 207313738Sciro.santilli@arm.com case 0x2: 207413738Sciro.santilli@arm.com return decodeVfpRegRegOp<VRIntPS>(machInst, vd, vm, 207513738Sciro.santilli@arm.com false); 207613738Sciro.santilli@arm.com case 0x3: 207713738Sciro.santilli@arm.com return decodeVfpRegRegOp<VRIntMS>(machInst, vd, vm, 207813738Sciro.santilli@arm.com false); 207913738Sciro.santilli@arm.com default: return new Unknown(machInst); 208013738Sciro.santilli@arm.com } 208113738Sciro.santilli@arm.com } 208213738Sciro.santilli@arm.com } else { 208313738Sciro.santilli@arm.com const bool op = bits(machInst, 7); 208413738Sciro.santilli@arm.com switch(rm) { 208513738Sciro.santilli@arm.com case 0x0: 208613738Sciro.santilli@arm.com switch(size) { 208713738Sciro.santilli@arm.com case 0x0: 208813738Sciro.santilli@arm.com return new Unknown(machInst); 208913738Sciro.santilli@arm.com case 0x1: 209013738Sciro.santilli@arm.com return new FailUnimplemented( 209113738Sciro.santilli@arm.com "vcvta.u32.f16", machInst); 209213738Sciro.santilli@arm.com case 0x2: 209313738Sciro.santilli@arm.com if (op) { 209413738Sciro.santilli@arm.com return new VcvtaFpSIntS(machInst, vdInt, vm); 209513738Sciro.santilli@arm.com } else { 209613738Sciro.santilli@arm.com return new VcvtaFpUIntS(machInst, vdInt, vm); 209713738Sciro.santilli@arm.com } 209813738Sciro.santilli@arm.com case 0x3: 209913738Sciro.santilli@arm.com if (op) { 210013738Sciro.santilli@arm.com return new VcvtaFpSIntD(machInst, vdInt, vm); 210113738Sciro.santilli@arm.com } else { 210213738Sciro.santilli@arm.com return new VcvtaFpUIntD(machInst, vdInt, vm); 210313738Sciro.santilli@arm.com } 210413738Sciro.santilli@arm.com } 210513738Sciro.santilli@arm.com case 0x1: 210613738Sciro.santilli@arm.com switch(size) { 210713738Sciro.santilli@arm.com case 0x0: 210813738Sciro.santilli@arm.com return new Unknown(machInst); 210913738Sciro.santilli@arm.com case 0x1: 211013738Sciro.santilli@arm.com return new FailUnimplemented( 211113738Sciro.santilli@arm.com "vcvtn.u32.f16", machInst); 211213738Sciro.santilli@arm.com case 0x2: 211313738Sciro.santilli@arm.com if (op) { 211413738Sciro.santilli@arm.com return new VcvtnFpSIntS(machInst, vdInt, vm); 211513738Sciro.santilli@arm.com } else { 211613738Sciro.santilli@arm.com return new VcvtnFpUIntS(machInst, vdInt, vm); 211713738Sciro.santilli@arm.com } 211813738Sciro.santilli@arm.com case 0x3: 211913738Sciro.santilli@arm.com if (op) { 212013738Sciro.santilli@arm.com return new VcvtnFpSIntD(machInst, vdInt, vm); 212113738Sciro.santilli@arm.com } else { 212213738Sciro.santilli@arm.com return new VcvtnFpUIntD(machInst, vdInt, vm); 212313738Sciro.santilli@arm.com } 212413738Sciro.santilli@arm.com } 212513738Sciro.santilli@arm.com case 0x2: 212613738Sciro.santilli@arm.com switch(size) { 212713738Sciro.santilli@arm.com case 0x0: 212813738Sciro.santilli@arm.com return new Unknown(machInst); 212913738Sciro.santilli@arm.com case 0x1: 213013738Sciro.santilli@arm.com return new FailUnimplemented( 213113738Sciro.santilli@arm.com "vcvtp.u32.f16", machInst); 213213738Sciro.santilli@arm.com case 0x2: 213313738Sciro.santilli@arm.com if (op) { 213413738Sciro.santilli@arm.com return new VcvtpFpSIntS(machInst, vdInt, vm); 213513738Sciro.santilli@arm.com } else { 213613738Sciro.santilli@arm.com return new VcvtpFpUIntS(machInst, vdInt, vm); 213713738Sciro.santilli@arm.com } 213813738Sciro.santilli@arm.com case 0x3: 213913738Sciro.santilli@arm.com if (op) { 214013738Sciro.santilli@arm.com return new VcvtpFpSIntD(machInst, vdInt, vm); 214113738Sciro.santilli@arm.com } else { 214213738Sciro.santilli@arm.com return new VcvtpFpUIntD(machInst, vdInt, vm); 214313738Sciro.santilli@arm.com } 214413738Sciro.santilli@arm.com } 214513738Sciro.santilli@arm.com case 0x3: 214613738Sciro.santilli@arm.com switch(size) { 214713738Sciro.santilli@arm.com case 0x0: 214813738Sciro.santilli@arm.com return new Unknown(machInst); 214913738Sciro.santilli@arm.com case 0x1: 215013738Sciro.santilli@arm.com return new FailUnimplemented( 215113738Sciro.santilli@arm.com "vcvtm.u32.f16", machInst); 215213738Sciro.santilli@arm.com case 0x2: 215313738Sciro.santilli@arm.com if (op) { 215413738Sciro.santilli@arm.com return new VcvtmFpSIntS(machInst, vdInt, vm); 215513738Sciro.santilli@arm.com } else { 215613738Sciro.santilli@arm.com return new VcvtmFpUIntS(machInst, vdInt, vm); 215713738Sciro.santilli@arm.com } 215813738Sciro.santilli@arm.com case 0x3: 215913738Sciro.santilli@arm.com if (op) { 216013738Sciro.santilli@arm.com return new VcvtmFpSIntD(machInst, vdInt, vm); 216113738Sciro.santilli@arm.com } else { 216213738Sciro.santilli@arm.com return new VcvtmFpUIntD(machInst, vdInt, vm); 216313738Sciro.santilli@arm.com } 216413738Sciro.santilli@arm.com } 216513738Sciro.santilli@arm.com } 216613738Sciro.santilli@arm.com } 216713738Sciro.santilli@arm.com } else if (b31_b24 && !b23 && b11_b9 && !op3 && b4){ 216811671Smitch.hayenga@arm.com // VSEL* floating point conditional select 216911671Smitch.hayenga@arm.com 217011671Smitch.hayenga@arm.com ConditionCode cond; 217111671Smitch.hayenga@arm.com switch(bits(machInst, 21, 20)) { 217211671Smitch.hayenga@arm.com case 0x0: cond = COND_EQ; break; 217311671Smitch.hayenga@arm.com case 0x1: cond = COND_VS; break; 217411671Smitch.hayenga@arm.com case 0x2: cond = COND_GE; break; 217511671Smitch.hayenga@arm.com case 0x3: cond = COND_GT; break; 217611671Smitch.hayenga@arm.com } 217711671Smitch.hayenga@arm.com 217813738Sciro.santilli@arm.com if (size == 3) { 217911671Smitch.hayenga@arm.com const IntRegIndex vn = 218011671Smitch.hayenga@arm.com (IntRegIndex)((bits(machInst, 7) << 5) | 218111671Smitch.hayenga@arm.com (bits(machInst, 19, 16) << 1)); 218211671Smitch.hayenga@arm.com return new VselD(machInst, vd, vn, vm, cond); 218311671Smitch.hayenga@arm.com } else { 218411671Smitch.hayenga@arm.com const IntRegIndex vn = 218511671Smitch.hayenga@arm.com (IntRegIndex)((bits(machInst, 19, 16) << 1) | 218611671Smitch.hayenga@arm.com bits(machInst, 7)); 218711671Smitch.hayenga@arm.com return new VselS(machInst, vd, vn, vm, cond); 218811671Smitch.hayenga@arm.com } 218911671Smitch.hayenga@arm.com } else { 219011671Smitch.hayenga@arm.com return new Unknown(machInst); 219111671Smitch.hayenga@arm.com } 21927321Sgblack@eecs.umich.edu } 21937321Sgblack@eecs.umich.edu if (l == 0 && c == 0) { 21947321Sgblack@eecs.umich.edu if (a == 0) { 21957335Sgblack@eecs.umich.edu const uint32_t vn = (bits(machInst, 19, 16) << 1) | 21967335Sgblack@eecs.umich.edu bits(machInst, 7); 21977335Sgblack@eecs.umich.edu const IntRegIndex rt = 21987335Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 21997335Sgblack@eecs.umich.edu if (bits(machInst, 20) == 1) { 22007335Sgblack@eecs.umich.edu return new VmovRegCoreW(machInst, rt, (IntRegIndex)vn); 22017335Sgblack@eecs.umich.edu } else { 22027335Sgblack@eecs.umich.edu return new VmovCoreRegW(machInst, (IntRegIndex)vn, rt); 22037335Sgblack@eecs.umich.edu } 22047321Sgblack@eecs.umich.edu } else if (a == 0x7) { 22057323Sgblack@eecs.umich.edu const IntRegIndex rt = 22067323Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 220710037SARM gem5 Developers uint32_t reg = bits(machInst, 19, 16); 220810037SARM gem5 Developers uint32_t specReg; 220910037SARM gem5 Developers switch (reg) { 22107323Sgblack@eecs.umich.edu case 0: 22117323Sgblack@eecs.umich.edu specReg = MISCREG_FPSID; 22127323Sgblack@eecs.umich.edu break; 22137323Sgblack@eecs.umich.edu case 1: 22147323Sgblack@eecs.umich.edu specReg = MISCREG_FPSCR; 22157323Sgblack@eecs.umich.edu break; 22167394Sgblack@eecs.umich.edu case 6: 22177394Sgblack@eecs.umich.edu specReg = MISCREG_MVFR1; 22187394Sgblack@eecs.umich.edu break; 22197394Sgblack@eecs.umich.edu case 7: 22207394Sgblack@eecs.umich.edu specReg = MISCREG_MVFR0; 22217394Sgblack@eecs.umich.edu break; 22227323Sgblack@eecs.umich.edu case 8: 22237323Sgblack@eecs.umich.edu specReg = MISCREG_FPEXC; 22247323Sgblack@eecs.umich.edu break; 22257323Sgblack@eecs.umich.edu default: 22267323Sgblack@eecs.umich.edu return new Unknown(machInst); 22277323Sgblack@eecs.umich.edu } 22287643Sgblack@eecs.umich.edu if (specReg == MISCREG_FPSCR) { 22297643Sgblack@eecs.umich.edu return new VmsrFpscr(machInst, (IntRegIndex)specReg, rt); 22307643Sgblack@eecs.umich.edu } else { 223110037SARM gem5 Developers uint32_t iss = mcrMrcIssBuild(0, bits(machInst, 3, 0), rt, 223210037SARM gem5 Developers reg, a, bits(machInst, 7, 5)); 223310037SARM gem5 Developers return new Vmsr(machInst, (IntRegIndex)specReg, rt, iss); 22347643Sgblack@eecs.umich.edu } 22357321Sgblack@eecs.umich.edu } 22367321Sgblack@eecs.umich.edu } else if (l == 0 && c == 1) { 22377321Sgblack@eecs.umich.edu if (bits(a, 2) == 0) { 22387335Sgblack@eecs.umich.edu uint32_t vd = (bits(machInst, 7) << 5) | 22397335Sgblack@eecs.umich.edu (bits(machInst, 19, 16) << 1); 22407639Sgblack@eecs.umich.edu // Handle accessing each single precision half of the vector. 22417639Sgblack@eecs.umich.edu vd += bits(machInst, 21); 22427335Sgblack@eecs.umich.edu const IntRegIndex rt = 22437335Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 22447335Sgblack@eecs.umich.edu if (bits(machInst, 22) == 1) { 22457639Sgblack@eecs.umich.edu return new VmovCoreRegB(machInst, (IntRegIndex)vd, 22467639Sgblack@eecs.umich.edu rt, bits(machInst, 6, 5)); 22477335Sgblack@eecs.umich.edu } else if (bits(machInst, 5) == 1) { 22487639Sgblack@eecs.umich.edu return new VmovCoreRegH(machInst, (IntRegIndex)vd, 22497639Sgblack@eecs.umich.edu rt, bits(machInst, 6)); 22507335Sgblack@eecs.umich.edu } else if (bits(machInst, 6) == 0) { 22517639Sgblack@eecs.umich.edu return new VmovCoreRegW(machInst, (IntRegIndex)vd, rt); 22527335Sgblack@eecs.umich.edu } else { 22537335Sgblack@eecs.umich.edu return new Unknown(machInst); 22547335Sgblack@eecs.umich.edu } 22557639Sgblack@eecs.umich.edu } else if (bits(b, 1) == 0) { 22567639Sgblack@eecs.umich.edu bool q = bits(machInst, 21); 22577639Sgblack@eecs.umich.edu unsigned be = (bits(machInst, 22) << 1) | (bits(machInst, 5)); 22587639Sgblack@eecs.umich.edu IntRegIndex vd = (IntRegIndex)(2 * (uint32_t) 22597639Sgblack@eecs.umich.edu (bits(machInst, 19, 16) | (bits(machInst, 7) << 4))); 22607639Sgblack@eecs.umich.edu IntRegIndex rt = (IntRegIndex)(uint32_t) 22617639Sgblack@eecs.umich.edu bits(machInst, 15, 12); 22627639Sgblack@eecs.umich.edu if (q) { 22637639Sgblack@eecs.umich.edu switch (be) { 22647639Sgblack@eecs.umich.edu case 0: 22657639Sgblack@eecs.umich.edu return new NVdupQGpr<uint32_t>(machInst, vd, rt); 22667639Sgblack@eecs.umich.edu case 1: 22677639Sgblack@eecs.umich.edu return new NVdupQGpr<uint16_t>(machInst, vd, rt); 22687639Sgblack@eecs.umich.edu case 2: 22697639Sgblack@eecs.umich.edu return new NVdupQGpr<uint8_t>(machInst, vd, rt); 22707639Sgblack@eecs.umich.edu case 3: 22717639Sgblack@eecs.umich.edu return new Unknown(machInst); 22727639Sgblack@eecs.umich.edu } 22737639Sgblack@eecs.umich.edu } else { 22747639Sgblack@eecs.umich.edu switch (be) { 22757639Sgblack@eecs.umich.edu case 0: 22767639Sgblack@eecs.umich.edu return new NVdupDGpr<uint32_t>(machInst, vd, rt); 22777639Sgblack@eecs.umich.edu case 1: 22787639Sgblack@eecs.umich.edu return new NVdupDGpr<uint16_t>(machInst, vd, rt); 22797639Sgblack@eecs.umich.edu case 2: 22807639Sgblack@eecs.umich.edu return new NVdupDGpr<uint8_t>(machInst, vd, rt); 22817639Sgblack@eecs.umich.edu case 3: 22827639Sgblack@eecs.umich.edu return new Unknown(machInst); 22837639Sgblack@eecs.umich.edu } 22847335Sgblack@eecs.umich.edu } 22857321Sgblack@eecs.umich.edu } 22867321Sgblack@eecs.umich.edu } else if (l == 1 && c == 0) { 22877321Sgblack@eecs.umich.edu if (a == 0) { 22887335Sgblack@eecs.umich.edu const uint32_t vn = (bits(machInst, 19, 16) << 1) | 22897335Sgblack@eecs.umich.edu bits(machInst, 7); 22907335Sgblack@eecs.umich.edu const IntRegIndex rt = 22917335Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 22927335Sgblack@eecs.umich.edu if (bits(machInst, 20) == 1) { 22937335Sgblack@eecs.umich.edu return new VmovRegCoreW(machInst, rt, (IntRegIndex)vn); 22947335Sgblack@eecs.umich.edu } else { 22957335Sgblack@eecs.umich.edu return new VmovCoreRegW(machInst, (IntRegIndex)vn, rt); 22967335Sgblack@eecs.umich.edu } 22977321Sgblack@eecs.umich.edu } else if (a == 7) { 22987326Sgblack@eecs.umich.edu const IntRegIndex rt = 22997326Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 230010037SARM gem5 Developers uint32_t reg = bits(machInst, 19, 16); 230110037SARM gem5 Developers uint32_t specReg; 230210037SARM gem5 Developers switch (reg) { 23037326Sgblack@eecs.umich.edu case 0: 23047326Sgblack@eecs.umich.edu specReg = MISCREG_FPSID; 23057326Sgblack@eecs.umich.edu break; 23067326Sgblack@eecs.umich.edu case 1: 23077326Sgblack@eecs.umich.edu specReg = MISCREG_FPSCR; 23087326Sgblack@eecs.umich.edu break; 23097326Sgblack@eecs.umich.edu case 6: 23107326Sgblack@eecs.umich.edu specReg = MISCREG_MVFR1; 23117326Sgblack@eecs.umich.edu break; 23127326Sgblack@eecs.umich.edu case 7: 23137326Sgblack@eecs.umich.edu specReg = MISCREG_MVFR0; 23147326Sgblack@eecs.umich.edu break; 23157326Sgblack@eecs.umich.edu case 8: 23167326Sgblack@eecs.umich.edu specReg = MISCREG_FPEXC; 23177326Sgblack@eecs.umich.edu break; 23187326Sgblack@eecs.umich.edu default: 23197326Sgblack@eecs.umich.edu return new Unknown(machInst); 23207326Sgblack@eecs.umich.edu } 23217392Sgblack@eecs.umich.edu if (rt == 0xf) { 23227643Sgblack@eecs.umich.edu if (specReg == MISCREG_FPSCR) { 23238303SAli.Saidi@ARM.com return new VmrsApsrFpscr(machInst); 23247643Sgblack@eecs.umich.edu } else { 23258301SAli.Saidi@ARM.com return new Unknown(machInst); 23267643Sgblack@eecs.umich.edu } 23277643Sgblack@eecs.umich.edu } else if (specReg == MISCREG_FPSCR) { 23287643Sgblack@eecs.umich.edu return new VmrsFpscr(machInst, rt, (IntRegIndex)specReg); 23297392Sgblack@eecs.umich.edu } else { 233010037SARM gem5 Developers uint32_t iss = mcrMrcIssBuild(l, bits(machInst, 3, 0), rt, 233110037SARM gem5 Developers reg, a, bits(machInst, 7, 5)); 233210037SARM gem5 Developers return new Vmrs(machInst, rt, (IntRegIndex)specReg, iss); 23337392Sgblack@eecs.umich.edu } 23347321Sgblack@eecs.umich.edu } 23357321Sgblack@eecs.umich.edu } else { 23367335Sgblack@eecs.umich.edu uint32_t vd = (bits(machInst, 7) << 5) | 23377335Sgblack@eecs.umich.edu (bits(machInst, 19, 16) << 1); 23387639Sgblack@eecs.umich.edu // Handle indexing into each single precision half of the vector. 23397639Sgblack@eecs.umich.edu vd += bits(machInst, 21); 23407639Sgblack@eecs.umich.edu uint32_t index; 23417335Sgblack@eecs.umich.edu const IntRegIndex rt = 23427335Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 23437335Sgblack@eecs.umich.edu const bool u = (bits(machInst, 23) == 1); 23447335Sgblack@eecs.umich.edu if (bits(machInst, 22) == 1) { 23457639Sgblack@eecs.umich.edu index = bits(machInst, 6, 5); 23467335Sgblack@eecs.umich.edu if (u) { 23477335Sgblack@eecs.umich.edu return new VmovRegCoreUB(machInst, rt, 23487335Sgblack@eecs.umich.edu (IntRegIndex)vd, index); 23497335Sgblack@eecs.umich.edu } else { 23507335Sgblack@eecs.umich.edu return new VmovRegCoreSB(machInst, rt, 23517335Sgblack@eecs.umich.edu (IntRegIndex)vd, index); 23527335Sgblack@eecs.umich.edu } 23537639Sgblack@eecs.umich.edu } else if (bits(machInst, 5) == 1) { 23547639Sgblack@eecs.umich.edu index = bits(machInst, 6); 23557335Sgblack@eecs.umich.edu if (u) { 23567335Sgblack@eecs.umich.edu return new VmovRegCoreUH(machInst, rt, 23577335Sgblack@eecs.umich.edu (IntRegIndex)vd, index); 23587335Sgblack@eecs.umich.edu } else { 23597335Sgblack@eecs.umich.edu return new VmovRegCoreSH(machInst, rt, 23607335Sgblack@eecs.umich.edu (IntRegIndex)vd, index); 23617335Sgblack@eecs.umich.edu } 23627639Sgblack@eecs.umich.edu } else if (bits(machInst, 6) == 0 && !u) { 23637335Sgblack@eecs.umich.edu return new VmovRegCoreW(machInst, rt, (IntRegIndex)vd); 23647639Sgblack@eecs.umich.edu } else { 23657639Sgblack@eecs.umich.edu return new Unknown(machInst); 23667335Sgblack@eecs.umich.edu } 23677321Sgblack@eecs.umich.edu } 23687321Sgblack@eecs.umich.edu return new Unknown(machInst); 23697321Sgblack@eecs.umich.edu } 23707321Sgblack@eecs.umich.edu ''' 23717321Sgblack@eecs.umich.edu}}; 23727356Sgblack@eecs.umich.edu 23737356Sgblack@eecs.umich.edudef format ShortFpTransfer() {{ 23747356Sgblack@eecs.umich.edu decode_block = ''' 23757356Sgblack@eecs.umich.edu return decodeShortFpTransfer(machInst); 23767356Sgblack@eecs.umich.edu ''' 23777356Sgblack@eecs.umich.edu}}; 23787363Sgblack@eecs.umich.edu 23797363Sgblack@eecs.umich.edulet {{ 23807363Sgblack@eecs.umich.edu header_output = ''' 23817363Sgblack@eecs.umich.edu StaticInstPtr 23827363Sgblack@eecs.umich.edu decodeVfpData(ExtMachInst machInst); 23837363Sgblack@eecs.umich.edu ''' 23847363Sgblack@eecs.umich.edu decoder_output = ''' 23857363Sgblack@eecs.umich.edu StaticInstPtr 23867363Sgblack@eecs.umich.edu decodeVfpData(ExtMachInst machInst) 23877363Sgblack@eecs.umich.edu { 23887363Sgblack@eecs.umich.edu const uint32_t opc1 = bits(machInst, 23, 20); 23897363Sgblack@eecs.umich.edu const uint32_t opc2 = bits(machInst, 19, 16); 23907363Sgblack@eecs.umich.edu const uint32_t opc3 = bits(machInst, 7, 6); 23917363Sgblack@eecs.umich.edu //const uint32_t opc4 = bits(machInst, 3, 0); 23927372Sgblack@eecs.umich.edu const bool single = (bits(machInst, 8) == 0); 23937389Sgblack@eecs.umich.edu // Used to select between vcmp and vcmpe. 23947389Sgblack@eecs.umich.edu const bool e = (bits(machInst, 7) == 1); 23957372Sgblack@eecs.umich.edu IntRegIndex vd; 23967372Sgblack@eecs.umich.edu IntRegIndex vm; 23977372Sgblack@eecs.umich.edu IntRegIndex vn; 23987372Sgblack@eecs.umich.edu if (single) { 23997372Sgblack@eecs.umich.edu vd = (IntRegIndex)(bits(machInst, 22) | 24007372Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 24017372Sgblack@eecs.umich.edu vm = (IntRegIndex)(bits(machInst, 5) | 24027372Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1)); 24037372Sgblack@eecs.umich.edu vn = (IntRegIndex)(bits(machInst, 7) | 24047372Sgblack@eecs.umich.edu (bits(machInst, 19, 16) << 1)); 24057372Sgblack@eecs.umich.edu } else { 24067372Sgblack@eecs.umich.edu vd = (IntRegIndex)((bits(machInst, 22) << 5) | 24077372Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 24087372Sgblack@eecs.umich.edu vm = (IntRegIndex)((bits(machInst, 5) << 5) | 24097372Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1)); 24107372Sgblack@eecs.umich.edu vn = (IntRegIndex)((bits(machInst, 7) << 5) | 24117372Sgblack@eecs.umich.edu (bits(machInst, 19, 16) << 1)); 24127372Sgblack@eecs.umich.edu } 24137363Sgblack@eecs.umich.edu switch (opc1 & 0xb /* 1011 */) { 24147363Sgblack@eecs.umich.edu case 0x0: 24157370Sgblack@eecs.umich.edu if (bits(machInst, 6) == 0) { 24167372Sgblack@eecs.umich.edu if (single) { 24177376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VmlaS>( 24187376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 24197370Sgblack@eecs.umich.edu } else { 24207376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VmlaD>( 24217376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 24227370Sgblack@eecs.umich.edu } 24237370Sgblack@eecs.umich.edu } else { 24247372Sgblack@eecs.umich.edu if (single) { 24257376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VmlsS>( 24267376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 24277370Sgblack@eecs.umich.edu } else { 24287376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VmlsD>( 24297376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 24307370Sgblack@eecs.umich.edu } 24317370Sgblack@eecs.umich.edu } 24327371Sgblack@eecs.umich.edu case 0x1: 24337371Sgblack@eecs.umich.edu if (bits(machInst, 6) == 1) { 24347372Sgblack@eecs.umich.edu if (single) { 24357376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VnmlaS>( 24367376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 24377371Sgblack@eecs.umich.edu } else { 24387376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VnmlaD>( 24397376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 24407371Sgblack@eecs.umich.edu } 24417371Sgblack@eecs.umich.edu } else { 24427372Sgblack@eecs.umich.edu if (single) { 24437376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VnmlsS>( 24447376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 24457371Sgblack@eecs.umich.edu } else { 24467376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VnmlsD>( 24477376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 24487371Sgblack@eecs.umich.edu } 24497371Sgblack@eecs.umich.edu } 24507363Sgblack@eecs.umich.edu case 0x2: 24517363Sgblack@eecs.umich.edu if ((opc3 & 0x1) == 0) { 24527372Sgblack@eecs.umich.edu if (single) { 24537376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VmulS>( 24547376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 24557364Sgblack@eecs.umich.edu } else { 24567376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VmulD>( 24577376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 24587364Sgblack@eecs.umich.edu } 24597371Sgblack@eecs.umich.edu } else { 24607372Sgblack@eecs.umich.edu if (single) { 24617376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VnmulS>( 24627376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 24637371Sgblack@eecs.umich.edu } else { 24647376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VnmulD>( 24657376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 24667371Sgblack@eecs.umich.edu } 24677363Sgblack@eecs.umich.edu } 24687363Sgblack@eecs.umich.edu case 0x3: 24697363Sgblack@eecs.umich.edu if ((opc3 & 0x1) == 0) { 24707372Sgblack@eecs.umich.edu if (single) { 24717376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VaddS>( 24727376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 24737367Sgblack@eecs.umich.edu } else { 24747376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VaddD>( 24757376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 24767367Sgblack@eecs.umich.edu } 24777363Sgblack@eecs.umich.edu } else { 24787372Sgblack@eecs.umich.edu if (single) { 24797376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VsubS>( 24807376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 24817368Sgblack@eecs.umich.edu } else { 24827376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VsubD>( 24837376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 24847368Sgblack@eecs.umich.edu } 24857363Sgblack@eecs.umich.edu } 24867363Sgblack@eecs.umich.edu case 0x8: 24877363Sgblack@eecs.umich.edu if ((opc3 & 0x1) == 0) { 24887372Sgblack@eecs.umich.edu if (single) { 24897376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VdivS>( 24907376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 24917369Sgblack@eecs.umich.edu } else { 24927376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VdivD>( 24937376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 24947369Sgblack@eecs.umich.edu } 24957363Sgblack@eecs.umich.edu } 24967363Sgblack@eecs.umich.edu break; 249710037SARM gem5 Developers case 0x9: 249810037SARM gem5 Developers if ((opc3 & 0x1) == 0) { 249910037SARM gem5 Developers if (single) { 250010037SARM gem5 Developers return decodeVfpRegRegRegOp<VfnmaS>( 250110037SARM gem5 Developers machInst, vd, vn, vm, false); 250210037SARM gem5 Developers } else { 250310037SARM gem5 Developers return decodeVfpRegRegRegOp<VfnmaD>( 250410037SARM gem5 Developers machInst, vd, vn, vm, true); 250510037SARM gem5 Developers } 250610037SARM gem5 Developers } else { 250710037SARM gem5 Developers if (single) { 250810037SARM gem5 Developers return decodeVfpRegRegRegOp<VfnmsS>( 250910037SARM gem5 Developers machInst, vd, vn, vm, false); 251010037SARM gem5 Developers } else { 251110037SARM gem5 Developers return decodeVfpRegRegRegOp<VfnmsD>( 251210037SARM gem5 Developers machInst, vd, vn, vm, true); 251310037SARM gem5 Developers } 251410037SARM gem5 Developers } 251510037SARM gem5 Developers break; 251610037SARM gem5 Developers case 0xa: 251710037SARM gem5 Developers if ((opc3 & 0x1) == 0) { 251810037SARM gem5 Developers if (single) { 251910037SARM gem5 Developers return decodeVfpRegRegRegOp<VfmaS>( 252010037SARM gem5 Developers machInst, vd, vn, vm, false); 252110037SARM gem5 Developers } else { 252210037SARM gem5 Developers return decodeVfpRegRegRegOp<VfmaD>( 252310037SARM gem5 Developers machInst, vd, vn, vm, true); 252410037SARM gem5 Developers } 252510037SARM gem5 Developers } else { 252610037SARM gem5 Developers if (single) { 252710037SARM gem5 Developers return decodeVfpRegRegRegOp<VfmsS>( 252810037SARM gem5 Developers machInst, vd, vn, vm, false); 252910037SARM gem5 Developers } else { 253010037SARM gem5 Developers return decodeVfpRegRegRegOp<VfmsD>( 253110037SARM gem5 Developers machInst, vd, vn, vm, true); 253210037SARM gem5 Developers } 253310037SARM gem5 Developers } 253410037SARM gem5 Developers break; 25357363Sgblack@eecs.umich.edu case 0xb: 25367363Sgblack@eecs.umich.edu if ((opc3 & 0x1) == 0) { 25377363Sgblack@eecs.umich.edu const uint32_t baseImm = 25387363Sgblack@eecs.umich.edu bits(machInst, 3, 0) | (bits(machInst, 19, 16) << 4); 25397372Sgblack@eecs.umich.edu if (single) { 254013120SEdmund.Grimley-Evans@arm.com uint32_t imm = vfp_modified_imm(baseImm, FpDataType::Fp32); 25417376Sgblack@eecs.umich.edu return decodeVfpRegImmOp<VmovImmS>( 25427376Sgblack@eecs.umich.edu machInst, vd, imm, false); 25437363Sgblack@eecs.umich.edu } else { 254413120SEdmund.Grimley-Evans@arm.com uint64_t imm = vfp_modified_imm(baseImm, FpDataType::Fp64); 25457376Sgblack@eecs.umich.edu return decodeVfpRegImmOp<VmovImmD>( 25467376Sgblack@eecs.umich.edu machInst, vd, imm, true); 25477363Sgblack@eecs.umich.edu } 25487363Sgblack@eecs.umich.edu } 25497363Sgblack@eecs.umich.edu switch (opc2) { 25507363Sgblack@eecs.umich.edu case 0x0: 25517363Sgblack@eecs.umich.edu if (opc3 == 1) { 25527372Sgblack@eecs.umich.edu if (single) { 25537376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VmovRegS>( 25547376Sgblack@eecs.umich.edu machInst, vd, vm, false); 25557363Sgblack@eecs.umich.edu } else { 25567376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VmovRegD>( 25577376Sgblack@eecs.umich.edu machInst, vd, vm, true); 25587363Sgblack@eecs.umich.edu } 25597363Sgblack@eecs.umich.edu } else { 25607372Sgblack@eecs.umich.edu if (single) { 25617376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VabsS>( 25627376Sgblack@eecs.umich.edu machInst, vd, vm, false); 25637366Sgblack@eecs.umich.edu } else { 25647376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VabsD>( 25657376Sgblack@eecs.umich.edu machInst, vd, vm, true); 25667366Sgblack@eecs.umich.edu } 25677363Sgblack@eecs.umich.edu } 25687363Sgblack@eecs.umich.edu case 0x1: 25697363Sgblack@eecs.umich.edu if (opc3 == 1) { 25707372Sgblack@eecs.umich.edu if (single) { 25717376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VnegS>( 25727376Sgblack@eecs.umich.edu machInst, vd, vm, false); 25737365Sgblack@eecs.umich.edu } else { 25747376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VnegD>( 25757376Sgblack@eecs.umich.edu machInst, vd, vm, true); 25767365Sgblack@eecs.umich.edu } 25777363Sgblack@eecs.umich.edu } else { 25787372Sgblack@eecs.umich.edu if (single) { 25797376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VsqrtS>( 25807376Sgblack@eecs.umich.edu machInst, vd, vm, false); 25817369Sgblack@eecs.umich.edu } else { 25827376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VsqrtD>( 25837376Sgblack@eecs.umich.edu machInst, vd, vm, true); 25847369Sgblack@eecs.umich.edu } 25857363Sgblack@eecs.umich.edu } 25867363Sgblack@eecs.umich.edu case 0x2: 25877363Sgblack@eecs.umich.edu case 0x3: 25887398Sgblack@eecs.umich.edu { 25897398Sgblack@eecs.umich.edu const bool toHalf = bits(machInst, 16); 25907398Sgblack@eecs.umich.edu const bool top = bits(machInst, 7); 25917398Sgblack@eecs.umich.edu if (top) { 25927398Sgblack@eecs.umich.edu if (toHalf) { 25937398Sgblack@eecs.umich.edu return new VcvtFpSFpHT(machInst, vd, vm); 25947398Sgblack@eecs.umich.edu } else { 25957398Sgblack@eecs.umich.edu return new VcvtFpHTFpS(machInst, vd, vm); 25967398Sgblack@eecs.umich.edu } 25977398Sgblack@eecs.umich.edu } else { 25987398Sgblack@eecs.umich.edu if (toHalf) { 25997398Sgblack@eecs.umich.edu return new VcvtFpSFpHB(machInst, vd, vm); 26007398Sgblack@eecs.umich.edu } else { 26017398Sgblack@eecs.umich.edu return new VcvtFpHBFpS(machInst, vd, vm); 26027398Sgblack@eecs.umich.edu } 26037398Sgblack@eecs.umich.edu } 26047398Sgblack@eecs.umich.edu } 26057363Sgblack@eecs.umich.edu case 0x4: 26067377Sgblack@eecs.umich.edu if (single) { 26077389Sgblack@eecs.umich.edu if (e) { 26087389Sgblack@eecs.umich.edu return new VcmpeS(machInst, vd, vm); 26097389Sgblack@eecs.umich.edu } else { 26107389Sgblack@eecs.umich.edu return new VcmpS(machInst, vd, vm); 26117389Sgblack@eecs.umich.edu } 26127377Sgblack@eecs.umich.edu } else { 26137389Sgblack@eecs.umich.edu if (e) { 26147389Sgblack@eecs.umich.edu return new VcmpeD(machInst, vd, vm); 26157389Sgblack@eecs.umich.edu } else { 26167389Sgblack@eecs.umich.edu return new VcmpD(machInst, vd, vm); 26177389Sgblack@eecs.umich.edu } 26187377Sgblack@eecs.umich.edu } 26197363Sgblack@eecs.umich.edu case 0x5: 26207377Sgblack@eecs.umich.edu if (single) { 26217389Sgblack@eecs.umich.edu if (e) { 26227389Sgblack@eecs.umich.edu return new VcmpeZeroS(machInst, vd, 0); 26237389Sgblack@eecs.umich.edu } else { 26247389Sgblack@eecs.umich.edu return new VcmpZeroS(machInst, vd, 0); 26257389Sgblack@eecs.umich.edu } 26267377Sgblack@eecs.umich.edu } else { 26277389Sgblack@eecs.umich.edu if (e) { 26287389Sgblack@eecs.umich.edu return new VcmpeZeroD(machInst, vd, 0); 26297389Sgblack@eecs.umich.edu } else { 26307389Sgblack@eecs.umich.edu return new VcmpZeroD(machInst, vd, 0); 26317389Sgblack@eecs.umich.edu } 26327377Sgblack@eecs.umich.edu } 26337363Sgblack@eecs.umich.edu case 0x7: 26347363Sgblack@eecs.umich.edu if (opc3 == 0x3) { 26357374Sgblack@eecs.umich.edu if (single) { 26368270SAli.Saidi@ARM.com vd = (IntRegIndex)((bits(machInst, 22) << 5) | 26378270SAli.Saidi@ARM.com (bits(machInst, 15, 12) << 1)); 26387374Sgblack@eecs.umich.edu return new VcvtFpSFpD(machInst, vd, vm); 26397374Sgblack@eecs.umich.edu } else { 26407374Sgblack@eecs.umich.edu vd = (IntRegIndex)(bits(machInst, 22) | 26417374Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 26427374Sgblack@eecs.umich.edu return new VcvtFpDFpS(machInst, vd, vm); 26437374Sgblack@eecs.umich.edu } 26447363Sgblack@eecs.umich.edu } 26457363Sgblack@eecs.umich.edu break; 26467363Sgblack@eecs.umich.edu case 0x8: 26477373Sgblack@eecs.umich.edu if (bits(machInst, 7) == 0) { 26487373Sgblack@eecs.umich.edu if (single) { 26497373Sgblack@eecs.umich.edu return new VcvtUIntFpS(machInst, vd, vm); 26507373Sgblack@eecs.umich.edu } else { 26517373Sgblack@eecs.umich.edu vm = (IntRegIndex)(bits(machInst, 5) | 26527373Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1)); 26537373Sgblack@eecs.umich.edu return new VcvtUIntFpD(machInst, vd, vm); 26547373Sgblack@eecs.umich.edu } 26557373Sgblack@eecs.umich.edu } else { 26567373Sgblack@eecs.umich.edu if (single) { 26577373Sgblack@eecs.umich.edu return new VcvtSIntFpS(machInst, vd, vm); 26587373Sgblack@eecs.umich.edu } else { 26597373Sgblack@eecs.umich.edu vm = (IntRegIndex)(bits(machInst, 5) | 26607373Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1)); 26617373Sgblack@eecs.umich.edu return new VcvtSIntFpD(machInst, vd, vm); 26627373Sgblack@eecs.umich.edu } 26637373Sgblack@eecs.umich.edu } 26647363Sgblack@eecs.umich.edu case 0xa: 26657379Sgblack@eecs.umich.edu { 26667379Sgblack@eecs.umich.edu const bool half = (bits(machInst, 7) == 0); 26677379Sgblack@eecs.umich.edu const uint32_t imm = bits(machInst, 5) | 26687379Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1); 26697379Sgblack@eecs.umich.edu const uint32_t size = 26707379Sgblack@eecs.umich.edu (bits(machInst, 7) == 0 ? 16 : 32) - imm; 26717379Sgblack@eecs.umich.edu if (single) { 26727379Sgblack@eecs.umich.edu if (half) { 26737379Sgblack@eecs.umich.edu return new VcvtSHFixedFpS(machInst, vd, vd, size); 26747379Sgblack@eecs.umich.edu } else { 26757379Sgblack@eecs.umich.edu return new VcvtSFixedFpS(machInst, vd, vd, size); 26767379Sgblack@eecs.umich.edu } 26777379Sgblack@eecs.umich.edu } else { 26787379Sgblack@eecs.umich.edu if (half) { 26797379Sgblack@eecs.umich.edu return new VcvtSHFixedFpD(machInst, vd, vd, size); 26807379Sgblack@eecs.umich.edu } else { 26817379Sgblack@eecs.umich.edu return new VcvtSFixedFpD(machInst, vd, vd, size); 26827379Sgblack@eecs.umich.edu } 26837379Sgblack@eecs.umich.edu } 26847379Sgblack@eecs.umich.edu } 26857363Sgblack@eecs.umich.edu case 0xb: 26867379Sgblack@eecs.umich.edu { 26877379Sgblack@eecs.umich.edu const bool half = (bits(machInst, 7) == 0); 26887379Sgblack@eecs.umich.edu const uint32_t imm = bits(machInst, 5) | 26897379Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1); 26907379Sgblack@eecs.umich.edu const uint32_t size = 26917379Sgblack@eecs.umich.edu (bits(machInst, 7) == 0 ? 16 : 32) - imm; 26927379Sgblack@eecs.umich.edu if (single) { 26937379Sgblack@eecs.umich.edu if (half) { 26947379Sgblack@eecs.umich.edu return new VcvtUHFixedFpS(machInst, vd, vd, size); 26957379Sgblack@eecs.umich.edu } else { 26967379Sgblack@eecs.umich.edu return new VcvtUFixedFpS(machInst, vd, vd, size); 26977379Sgblack@eecs.umich.edu } 26987379Sgblack@eecs.umich.edu } else { 26997379Sgblack@eecs.umich.edu if (half) { 27007379Sgblack@eecs.umich.edu return new VcvtUHFixedFpD(machInst, vd, vd, size); 27017379Sgblack@eecs.umich.edu } else { 27027379Sgblack@eecs.umich.edu return new VcvtUFixedFpD(machInst, vd, vd, size); 27037379Sgblack@eecs.umich.edu } 27047379Sgblack@eecs.umich.edu } 27057379Sgblack@eecs.umich.edu } 27067363Sgblack@eecs.umich.edu case 0xc: 27077380Sgblack@eecs.umich.edu if (bits(machInst, 7) == 0) { 27087380Sgblack@eecs.umich.edu if (single) { 27097380Sgblack@eecs.umich.edu return new VcvtFpUIntSR(machInst, vd, vm); 27107380Sgblack@eecs.umich.edu } else { 27117380Sgblack@eecs.umich.edu vd = (IntRegIndex)(bits(machInst, 22) | 27127380Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 27137380Sgblack@eecs.umich.edu return new VcvtFpUIntDR(machInst, vd, vm); 27147380Sgblack@eecs.umich.edu } 27157373Sgblack@eecs.umich.edu } else { 27167380Sgblack@eecs.umich.edu if (single) { 27177380Sgblack@eecs.umich.edu return new VcvtFpUIntS(machInst, vd, vm); 27187380Sgblack@eecs.umich.edu } else { 27197380Sgblack@eecs.umich.edu vd = (IntRegIndex)(bits(machInst, 22) | 27207380Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 27217380Sgblack@eecs.umich.edu return new VcvtFpUIntD(machInst, vd, vm); 27227380Sgblack@eecs.umich.edu } 27237373Sgblack@eecs.umich.edu } 27247363Sgblack@eecs.umich.edu case 0xd: 27257380Sgblack@eecs.umich.edu if (bits(machInst, 7) == 0) { 27267380Sgblack@eecs.umich.edu if (single) { 27277380Sgblack@eecs.umich.edu return new VcvtFpSIntSR(machInst, vd, vm); 27287380Sgblack@eecs.umich.edu } else { 27297380Sgblack@eecs.umich.edu vd = (IntRegIndex)(bits(machInst, 22) | 27307380Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 27317380Sgblack@eecs.umich.edu return new VcvtFpSIntDR(machInst, vd, vm); 27327380Sgblack@eecs.umich.edu } 27337373Sgblack@eecs.umich.edu } else { 27347380Sgblack@eecs.umich.edu if (single) { 27357380Sgblack@eecs.umich.edu return new VcvtFpSIntS(machInst, vd, vm); 27367380Sgblack@eecs.umich.edu } else { 27377380Sgblack@eecs.umich.edu vd = (IntRegIndex)(bits(machInst, 22) | 27387380Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 27397380Sgblack@eecs.umich.edu return new VcvtFpSIntD(machInst, vd, vm); 27407380Sgblack@eecs.umich.edu } 27417373Sgblack@eecs.umich.edu } 27427363Sgblack@eecs.umich.edu case 0xe: 27437379Sgblack@eecs.umich.edu { 27447379Sgblack@eecs.umich.edu const bool half = (bits(machInst, 7) == 0); 27457379Sgblack@eecs.umich.edu const uint32_t imm = bits(machInst, 5) | 27467379Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1); 27477379Sgblack@eecs.umich.edu const uint32_t size = 27487379Sgblack@eecs.umich.edu (bits(machInst, 7) == 0 ? 16 : 32) - imm; 27497379Sgblack@eecs.umich.edu if (single) { 27507379Sgblack@eecs.umich.edu if (half) { 27517379Sgblack@eecs.umich.edu return new VcvtFpSHFixedS(machInst, vd, vd, size); 27527379Sgblack@eecs.umich.edu } else { 27537379Sgblack@eecs.umich.edu return new VcvtFpSFixedS(machInst, vd, vd, size); 27547379Sgblack@eecs.umich.edu } 27557379Sgblack@eecs.umich.edu } else { 27567379Sgblack@eecs.umich.edu if (half) { 27577379Sgblack@eecs.umich.edu return new VcvtFpSHFixedD(machInst, vd, vd, size); 27587379Sgblack@eecs.umich.edu } else { 27597379Sgblack@eecs.umich.edu return new VcvtFpSFixedD(machInst, vd, vd, size); 27607379Sgblack@eecs.umich.edu } 27617379Sgblack@eecs.umich.edu } 27627379Sgblack@eecs.umich.edu } 27637363Sgblack@eecs.umich.edu case 0xf: 27647379Sgblack@eecs.umich.edu { 27657379Sgblack@eecs.umich.edu const bool half = (bits(machInst, 7) == 0); 27667379Sgblack@eecs.umich.edu const uint32_t imm = bits(machInst, 5) | 27677379Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1); 27687379Sgblack@eecs.umich.edu const uint32_t size = 27697379Sgblack@eecs.umich.edu (bits(machInst, 7) == 0 ? 16 : 32) - imm; 27707379Sgblack@eecs.umich.edu if (single) { 27717379Sgblack@eecs.umich.edu if (half) { 27727379Sgblack@eecs.umich.edu return new VcvtFpUHFixedS(machInst, vd, vd, size); 27737379Sgblack@eecs.umich.edu } else { 27747379Sgblack@eecs.umich.edu return new VcvtFpUFixedS(machInst, vd, vd, size); 27757379Sgblack@eecs.umich.edu } 27767379Sgblack@eecs.umich.edu } else { 27777379Sgblack@eecs.umich.edu if (half) { 27787379Sgblack@eecs.umich.edu return new VcvtFpUHFixedD(machInst, vd, vd, size); 27797379Sgblack@eecs.umich.edu } else { 27807379Sgblack@eecs.umich.edu return new VcvtFpUFixedD(machInst, vd, vd, size); 27817379Sgblack@eecs.umich.edu } 27827379Sgblack@eecs.umich.edu } 27837379Sgblack@eecs.umich.edu } 27847363Sgblack@eecs.umich.edu } 27857363Sgblack@eecs.umich.edu break; 27867363Sgblack@eecs.umich.edu } 27877363Sgblack@eecs.umich.edu return new Unknown(machInst); 27887363Sgblack@eecs.umich.edu } 27897363Sgblack@eecs.umich.edu ''' 27907363Sgblack@eecs.umich.edu}}; 27917363Sgblack@eecs.umich.edu 27927363Sgblack@eecs.umich.edudef format VfpData() {{ 27937363Sgblack@eecs.umich.edu decode_block = ''' 27947363Sgblack@eecs.umich.edu return decodeVfpData(machInst); 27957363Sgblack@eecs.umich.edu ''' 27967363Sgblack@eecs.umich.edu}}; 2797