fp.isa revision 12595
16019Shines@cs.fsu.edu// -*- mode:c++ -*- 26019Shines@cs.fsu.edu 311671Smitch.hayenga@arm.com// Copyright (c) 2010-2011,2016 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 } 60910037SARM gem5 Developers } 6107435Sgblack@eecs.umich.edu return new Unknown(machInst); 6117435Sgblack@eecs.umich.edu case 0xd: 6127435Sgblack@eecs.umich.edu if (b) { 6137435Sgblack@eecs.umich.edu if (u) { 6147435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 6157639Sgblack@eecs.umich.edu if (q) { 6167639Sgblack@eecs.umich.edu return new NVmulQFp<float>(machInst, vd, vn, vm); 6177639Sgblack@eecs.umich.edu } else { 6187639Sgblack@eecs.umich.edu return new NVmulDFp<float>(machInst, vd, vn, vm); 6197639Sgblack@eecs.umich.edu } 6207435Sgblack@eecs.umich.edu } else { 6217435Sgblack@eecs.umich.edu return new Unknown(machInst); 6227435Sgblack@eecs.umich.edu } 6237435Sgblack@eecs.umich.edu } else { 6247435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 6257639Sgblack@eecs.umich.edu if (q) { 6267639Sgblack@eecs.umich.edu return new NVmlaQFp<float>(machInst, vd, vn, vm); 6277639Sgblack@eecs.umich.edu } else { 6287639Sgblack@eecs.umich.edu return new NVmlaDFp<float>(machInst, vd, vn, vm); 6297639Sgblack@eecs.umich.edu } 6307435Sgblack@eecs.umich.edu } else { 6317639Sgblack@eecs.umich.edu if (q) { 6327639Sgblack@eecs.umich.edu return new NVmlsQFp<float>(machInst, vd, vn, vm); 6337639Sgblack@eecs.umich.edu } else { 6347639Sgblack@eecs.umich.edu return new NVmlsDFp<float>(machInst, vd, vn, vm); 6357639Sgblack@eecs.umich.edu } 6367435Sgblack@eecs.umich.edu } 6377435Sgblack@eecs.umich.edu } 6387435Sgblack@eecs.umich.edu } else { 6397435Sgblack@eecs.umich.edu if (u) { 6407435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 6417639Sgblack@eecs.umich.edu if (q) { 6427639Sgblack@eecs.umich.edu return new VpaddQFp<float>(machInst, vd, vn, vm); 6437639Sgblack@eecs.umich.edu } else { 6447639Sgblack@eecs.umich.edu return new VpaddDFp<float>(machInst, vd, vn, vm); 6457639Sgblack@eecs.umich.edu } 6467435Sgblack@eecs.umich.edu } else { 6477639Sgblack@eecs.umich.edu if (q) { 6487639Sgblack@eecs.umich.edu return new VabdQFp<float>(machInst, vd, vn, vm); 6497639Sgblack@eecs.umich.edu } else { 6507639Sgblack@eecs.umich.edu return new VabdDFp<float>(machInst, vd, vn, vm); 6517639Sgblack@eecs.umich.edu } 6527435Sgblack@eecs.umich.edu } 6537435Sgblack@eecs.umich.edu } else { 6547435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 6557639Sgblack@eecs.umich.edu if (q) { 6567639Sgblack@eecs.umich.edu return new VaddQFp<float>(machInst, vd, vn, vm); 6577639Sgblack@eecs.umich.edu } else { 6587639Sgblack@eecs.umich.edu return new VaddDFp<float>(machInst, vd, vn, vm); 6597639Sgblack@eecs.umich.edu } 6607435Sgblack@eecs.umich.edu } else { 6617639Sgblack@eecs.umich.edu if (q) { 6627639Sgblack@eecs.umich.edu return new VsubQFp<float>(machInst, vd, vn, vm); 6637639Sgblack@eecs.umich.edu } else { 6647639Sgblack@eecs.umich.edu return new VsubDFp<float>(machInst, vd, vn, vm); 6657639Sgblack@eecs.umich.edu } 6667435Sgblack@eecs.umich.edu } 6677435Sgblack@eecs.umich.edu } 6687435Sgblack@eecs.umich.edu } 6697435Sgblack@eecs.umich.edu case 0xe: 6707435Sgblack@eecs.umich.edu if (b) { 6717435Sgblack@eecs.umich.edu if (u) { 6727435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 6737639Sgblack@eecs.umich.edu if (q) { 6747639Sgblack@eecs.umich.edu return new VacgeQFp<float>(machInst, vd, vn, vm); 6757639Sgblack@eecs.umich.edu } else { 6767639Sgblack@eecs.umich.edu return new VacgeDFp<float>(machInst, vd, vn, vm); 6777639Sgblack@eecs.umich.edu } 6787435Sgblack@eecs.umich.edu } else { 6797639Sgblack@eecs.umich.edu if (q) { 6807639Sgblack@eecs.umich.edu return new VacgtQFp<float>(machInst, vd, vn, vm); 6817639Sgblack@eecs.umich.edu } else { 6827639Sgblack@eecs.umich.edu return new VacgtDFp<float>(machInst, vd, vn, vm); 6837639Sgblack@eecs.umich.edu } 6847435Sgblack@eecs.umich.edu } 6857435Sgblack@eecs.umich.edu } else { 6867435Sgblack@eecs.umich.edu return new Unknown(machInst); 6877435Sgblack@eecs.umich.edu } 6887435Sgblack@eecs.umich.edu } else { 6897435Sgblack@eecs.umich.edu if (u) { 6907435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 6917639Sgblack@eecs.umich.edu if (q) { 6927639Sgblack@eecs.umich.edu return new VcgeQFp<float>(machInst, vd, vn, vm); 6937639Sgblack@eecs.umich.edu } else { 6947639Sgblack@eecs.umich.edu return new VcgeDFp<float>(machInst, vd, vn, vm); 6957639Sgblack@eecs.umich.edu } 6967435Sgblack@eecs.umich.edu } else { 6977639Sgblack@eecs.umich.edu if (q) { 6987639Sgblack@eecs.umich.edu return new VcgtQFp<float>(machInst, vd, vn, vm); 6997639Sgblack@eecs.umich.edu } else { 7007639Sgblack@eecs.umich.edu return new VcgtDFp<float>(machInst, vd, vn, vm); 7017639Sgblack@eecs.umich.edu } 7027435Sgblack@eecs.umich.edu } 7037435Sgblack@eecs.umich.edu } else { 7047435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 7057639Sgblack@eecs.umich.edu if (q) { 7067639Sgblack@eecs.umich.edu return new VceqQFp<float>(machInst, vd, vn, vm); 7077639Sgblack@eecs.umich.edu } else { 7087639Sgblack@eecs.umich.edu return new VceqDFp<float>(machInst, vd, vn, vm); 7097639Sgblack@eecs.umich.edu } 7107435Sgblack@eecs.umich.edu } else { 7117435Sgblack@eecs.umich.edu return new Unknown(machInst); 7127435Sgblack@eecs.umich.edu } 7137435Sgblack@eecs.umich.edu } 7147435Sgblack@eecs.umich.edu } 7157435Sgblack@eecs.umich.edu case 0xf: 7167435Sgblack@eecs.umich.edu if (b) { 7177435Sgblack@eecs.umich.edu if (u) { 7187435Sgblack@eecs.umich.edu return new Unknown(machInst); 7197435Sgblack@eecs.umich.edu } else { 7207435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 7217639Sgblack@eecs.umich.edu if (q) { 7227639Sgblack@eecs.umich.edu return new VrecpsQFp<float>(machInst, vd, vn, vm); 7237639Sgblack@eecs.umich.edu } else { 7247639Sgblack@eecs.umich.edu return new VrecpsDFp<float>(machInst, vd, vn, vm); 7257639Sgblack@eecs.umich.edu } 7267435Sgblack@eecs.umich.edu } else { 7277639Sgblack@eecs.umich.edu if (q) { 7287639Sgblack@eecs.umich.edu return new VrsqrtsQFp<float>(machInst, vd, vn, vm); 7297639Sgblack@eecs.umich.edu } else { 7307639Sgblack@eecs.umich.edu return new VrsqrtsDFp<float>(machInst, vd, vn, vm); 7317639Sgblack@eecs.umich.edu } 7327435Sgblack@eecs.umich.edu } 7337435Sgblack@eecs.umich.edu } 7347435Sgblack@eecs.umich.edu } else { 7357435Sgblack@eecs.umich.edu if (u) { 7367435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 7377639Sgblack@eecs.umich.edu if (q) { 7387639Sgblack@eecs.umich.edu return new VpmaxQFp<float>(machInst, vd, vn, vm); 7397639Sgblack@eecs.umich.edu } else { 7407639Sgblack@eecs.umich.edu return new VpmaxDFp<float>(machInst, vd, vn, vm); 7417639Sgblack@eecs.umich.edu } 7427435Sgblack@eecs.umich.edu } else { 7437639Sgblack@eecs.umich.edu if (q) { 7447639Sgblack@eecs.umich.edu return new VpminQFp<float>(machInst, vd, vn, vm); 7457639Sgblack@eecs.umich.edu } else { 7467639Sgblack@eecs.umich.edu return new VpminDFp<float>(machInst, vd, vn, vm); 7477639Sgblack@eecs.umich.edu } 7487435Sgblack@eecs.umich.edu } 7497435Sgblack@eecs.umich.edu } else { 7507435Sgblack@eecs.umich.edu if (bits(c, 1) == 0) { 7517639Sgblack@eecs.umich.edu if (q) { 7527639Sgblack@eecs.umich.edu return new VmaxQFp<float>(machInst, vd, vn, vm); 7537639Sgblack@eecs.umich.edu } else { 7547639Sgblack@eecs.umich.edu return new VmaxDFp<float>(machInst, vd, vn, vm); 7557639Sgblack@eecs.umich.edu } 7567435Sgblack@eecs.umich.edu } else { 7577639Sgblack@eecs.umich.edu if (q) { 7587639Sgblack@eecs.umich.edu return new VminQFp<float>(machInst, vd, vn, vm); 7597639Sgblack@eecs.umich.edu } else { 7607639Sgblack@eecs.umich.edu return new VminDFp<float>(machInst, vd, vn, vm); 7617639Sgblack@eecs.umich.edu } 7627435Sgblack@eecs.umich.edu } 7637435Sgblack@eecs.umich.edu } 7647435Sgblack@eecs.umich.edu } 7657435Sgblack@eecs.umich.edu } 7667435Sgblack@eecs.umich.edu return new Unknown(machInst); 7677435Sgblack@eecs.umich.edu } 7687435Sgblack@eecs.umich.edu 7697435Sgblack@eecs.umich.edu static StaticInstPtr 7707435Sgblack@eecs.umich.edu decodeNeonOneRegModImm(ExtMachInst machInst) 7717435Sgblack@eecs.umich.edu { 7727639Sgblack@eecs.umich.edu const IntRegIndex vd = 7737639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 15, 12) | 7747639Sgblack@eecs.umich.edu (bits(machInst, 22) << 4))); 7757639Sgblack@eecs.umich.edu const bool q = bits(machInst, 6); 7767435Sgblack@eecs.umich.edu const bool op = bits(machInst, 5); 7777639Sgblack@eecs.umich.edu const uint8_t cmode = bits(machInst, 11, 8); 7787639Sgblack@eecs.umich.edu const uint8_t imm = ((THUMB ? bits(machInst, 28) : 7797639Sgblack@eecs.umich.edu bits(machInst, 24)) << 7) | 7807639Sgblack@eecs.umich.edu (bits(machInst, 18, 16) << 4) | 7817639Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 0); 7827853SMatt.Horsnell@ARM.com 7837853SMatt.Horsnell@ARM.com // Check for invalid immediate encodings and return an unknown op 7847853SMatt.Horsnell@ARM.com // if it happens 7857853SMatt.Horsnell@ARM.com bool immValid = true; 7867853SMatt.Horsnell@ARM.com const uint64_t bigImm = simd_modified_imm(op, cmode, imm, immValid); 7877853SMatt.Horsnell@ARM.com if (!immValid) { 7887853SMatt.Horsnell@ARM.com return new Unknown(machInst); 7897853SMatt.Horsnell@ARM.com } 7907853SMatt.Horsnell@ARM.com 7917435Sgblack@eecs.umich.edu if (op) { 7927435Sgblack@eecs.umich.edu if (bits(cmode, 3) == 0) { 7937435Sgblack@eecs.umich.edu if (bits(cmode, 0) == 0) { 7947639Sgblack@eecs.umich.edu if (q) 7957639Sgblack@eecs.umich.edu return new NVmvniQ<uint64_t>(machInst, vd, bigImm); 7967639Sgblack@eecs.umich.edu else 7977639Sgblack@eecs.umich.edu return new NVmvniD<uint64_t>(machInst, vd, bigImm); 7987435Sgblack@eecs.umich.edu } else { 7997639Sgblack@eecs.umich.edu if (q) 8007639Sgblack@eecs.umich.edu return new NVbiciQ<uint64_t>(machInst, vd, bigImm); 8017639Sgblack@eecs.umich.edu else 8027639Sgblack@eecs.umich.edu return new NVbiciD<uint64_t>(machInst, vd, bigImm); 8037435Sgblack@eecs.umich.edu } 8047435Sgblack@eecs.umich.edu } else { 8057435Sgblack@eecs.umich.edu if (bits(cmode, 2) == 1) { 8067639Sgblack@eecs.umich.edu switch (bits(cmode, 1, 0)) { 8077639Sgblack@eecs.umich.edu case 0: 8087639Sgblack@eecs.umich.edu case 1: 8097639Sgblack@eecs.umich.edu if (q) 8107639Sgblack@eecs.umich.edu return new NVmvniQ<uint64_t>(machInst, vd, bigImm); 8117639Sgblack@eecs.umich.edu else 8127639Sgblack@eecs.umich.edu return new NVmvniD<uint64_t>(machInst, vd, bigImm); 8137639Sgblack@eecs.umich.edu case 2: 8147639Sgblack@eecs.umich.edu if (q) 8157639Sgblack@eecs.umich.edu return new NVmoviQ<uint64_t>(machInst, vd, bigImm); 8167639Sgblack@eecs.umich.edu else 8177639Sgblack@eecs.umich.edu return new NVmoviD<uint64_t>(machInst, vd, bigImm); 8187639Sgblack@eecs.umich.edu case 3: 8197639Sgblack@eecs.umich.edu if (q) 8207639Sgblack@eecs.umich.edu return new Unknown(machInst); 8217639Sgblack@eecs.umich.edu else 8227639Sgblack@eecs.umich.edu return new Unknown(machInst); 8237639Sgblack@eecs.umich.edu } 8247435Sgblack@eecs.umich.edu } else { 8257435Sgblack@eecs.umich.edu if (bits(cmode, 0) == 0) { 8267639Sgblack@eecs.umich.edu if (q) 8277639Sgblack@eecs.umich.edu return new NVmvniQ<uint64_t>(machInst, vd, bigImm); 8287639Sgblack@eecs.umich.edu else 8297639Sgblack@eecs.umich.edu return new NVmvniD<uint64_t>(machInst, vd, bigImm); 8307435Sgblack@eecs.umich.edu } else { 8317639Sgblack@eecs.umich.edu if (q) 8327639Sgblack@eecs.umich.edu return new NVbiciQ<uint64_t>(machInst, vd, bigImm); 8337639Sgblack@eecs.umich.edu else 8347639Sgblack@eecs.umich.edu return new NVbiciD<uint64_t>(machInst, vd, bigImm); 8357435Sgblack@eecs.umich.edu } 8367435Sgblack@eecs.umich.edu } 8377435Sgblack@eecs.umich.edu } 8387435Sgblack@eecs.umich.edu } else { 8397435Sgblack@eecs.umich.edu if (bits(cmode, 3) == 0) { 8407435Sgblack@eecs.umich.edu if (bits(cmode, 0) == 0) { 8417639Sgblack@eecs.umich.edu if (q) 8427639Sgblack@eecs.umich.edu return new NVmoviQ<uint64_t>(machInst, vd, bigImm); 8437639Sgblack@eecs.umich.edu else 8447639Sgblack@eecs.umich.edu return new NVmoviD<uint64_t>(machInst, vd, bigImm); 8457435Sgblack@eecs.umich.edu } else { 8467639Sgblack@eecs.umich.edu if (q) 8477639Sgblack@eecs.umich.edu return new NVorriQ<uint64_t>(machInst, vd, bigImm); 8487639Sgblack@eecs.umich.edu else 8497639Sgblack@eecs.umich.edu return new NVorriD<uint64_t>(machInst, vd, bigImm); 8507435Sgblack@eecs.umich.edu } 8517435Sgblack@eecs.umich.edu } else { 8527435Sgblack@eecs.umich.edu if (bits(cmode, 2) == 1) { 8537639Sgblack@eecs.umich.edu if (q) 8547639Sgblack@eecs.umich.edu return new NVmoviQ<uint64_t>(machInst, vd, bigImm); 8557639Sgblack@eecs.umich.edu else 8567639Sgblack@eecs.umich.edu return new NVmoviD<uint64_t>(machInst, vd, bigImm); 8577435Sgblack@eecs.umich.edu } else { 8587435Sgblack@eecs.umich.edu if (bits(cmode, 0) == 0) { 8597639Sgblack@eecs.umich.edu if (q) 8607639Sgblack@eecs.umich.edu return new NVmoviQ<uint64_t>(machInst, vd, bigImm); 8617639Sgblack@eecs.umich.edu else 8627639Sgblack@eecs.umich.edu return new NVmoviD<uint64_t>(machInst, vd, bigImm); 8637435Sgblack@eecs.umich.edu } else { 8647639Sgblack@eecs.umich.edu if (q) 8657639Sgblack@eecs.umich.edu return new NVorriQ<uint64_t>(machInst, vd, bigImm); 8667639Sgblack@eecs.umich.edu else 8677639Sgblack@eecs.umich.edu return new NVorriD<uint64_t>(machInst, vd, bigImm); 8687435Sgblack@eecs.umich.edu } 8697435Sgblack@eecs.umich.edu } 8707435Sgblack@eecs.umich.edu } 8717435Sgblack@eecs.umich.edu } 8727435Sgblack@eecs.umich.edu return new Unknown(machInst); 8737435Sgblack@eecs.umich.edu } 8747435Sgblack@eecs.umich.edu 8757435Sgblack@eecs.umich.edu static StaticInstPtr 8767435Sgblack@eecs.umich.edu decodeNeonTwoRegAndShift(ExtMachInst machInst) 8777435Sgblack@eecs.umich.edu { 8787435Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 11, 8); 8797435Sgblack@eecs.umich.edu const bool u = THUMB ? bits(machInst, 28) : bits(machInst, 24); 8807435Sgblack@eecs.umich.edu const bool b = bits(machInst, 6); 8817435Sgblack@eecs.umich.edu const bool l = bits(machInst, 7); 8827639Sgblack@eecs.umich.edu const IntRegIndex vd = 8837639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 15, 12) | 8847639Sgblack@eecs.umich.edu (bits(machInst, 22) << 4))); 8857639Sgblack@eecs.umich.edu const IntRegIndex vm = 8867639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 3, 0) | 8877639Sgblack@eecs.umich.edu (bits(machInst, 5) << 4))); 8887639Sgblack@eecs.umich.edu unsigned imm6 = bits(machInst, 21, 16); 8897639Sgblack@eecs.umich.edu unsigned imm = ((l ? 1 : 0) << 6) | imm6; 8907639Sgblack@eecs.umich.edu unsigned size = 3; 8917639Sgblack@eecs.umich.edu unsigned lShiftAmt = 0; 8927639Sgblack@eecs.umich.edu unsigned bitSel; 8937639Sgblack@eecs.umich.edu for (bitSel = 1 << 6; true; bitSel >>= 1) { 8947639Sgblack@eecs.umich.edu if (bitSel & imm) 8957639Sgblack@eecs.umich.edu break; 8967639Sgblack@eecs.umich.edu else if (!size) 8977639Sgblack@eecs.umich.edu return new Unknown(machInst); 8987639Sgblack@eecs.umich.edu size--; 8997639Sgblack@eecs.umich.edu } 9007639Sgblack@eecs.umich.edu lShiftAmt = imm6 & ~bitSel; 9017639Sgblack@eecs.umich.edu unsigned rShiftAmt = 0; 9027639Sgblack@eecs.umich.edu if (a != 0xe && a != 0xf) { 9037639Sgblack@eecs.umich.edu if (size > 2) 9047639Sgblack@eecs.umich.edu rShiftAmt = 64 - imm6; 9057639Sgblack@eecs.umich.edu else 9067639Sgblack@eecs.umich.edu rShiftAmt = 2 * (8 << size) - imm6; 9077639Sgblack@eecs.umich.edu } 9087435Sgblack@eecs.umich.edu 9097435Sgblack@eecs.umich.edu switch (a) { 9107435Sgblack@eecs.umich.edu case 0x0: 9117639Sgblack@eecs.umich.edu return decodeNeonUSTwoShiftReg<NVshrD, NVshrQ>( 9127639Sgblack@eecs.umich.edu b, u, size, machInst, vd, vm, rShiftAmt); 9137435Sgblack@eecs.umich.edu case 0x1: 9147639Sgblack@eecs.umich.edu return decodeNeonUSTwoShiftReg<NVsraD, NVsraQ>( 9157639Sgblack@eecs.umich.edu b, u, size, machInst, vd, vm, rShiftAmt); 9167435Sgblack@eecs.umich.edu case 0x2: 9177639Sgblack@eecs.umich.edu return decodeNeonUSTwoShiftReg<NVrshrD, NVrshrQ>( 9187639Sgblack@eecs.umich.edu b, u, size, machInst, vd, vm, rShiftAmt); 9197435Sgblack@eecs.umich.edu case 0x3: 9207639Sgblack@eecs.umich.edu return decodeNeonUSTwoShiftReg<NVrsraD, NVrsraQ>( 9217639Sgblack@eecs.umich.edu b, u, size, machInst, vd, vm, rShiftAmt); 9227435Sgblack@eecs.umich.edu case 0x4: 9237435Sgblack@eecs.umich.edu if (u) { 9247639Sgblack@eecs.umich.edu return decodeNeonUTwoShiftReg<NVsriD, NVsriQ>( 9257639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, rShiftAmt); 9267435Sgblack@eecs.umich.edu } else { 9277435Sgblack@eecs.umich.edu return new Unknown(machInst); 9287435Sgblack@eecs.umich.edu } 9297435Sgblack@eecs.umich.edu case 0x5: 9307435Sgblack@eecs.umich.edu if (u) { 9317639Sgblack@eecs.umich.edu return decodeNeonUTwoShiftReg<NVsliD, NVsliQ>( 9327639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, lShiftAmt); 9337435Sgblack@eecs.umich.edu } else { 9347639Sgblack@eecs.umich.edu return decodeNeonUTwoShiftReg<NVshlD, NVshlQ>( 9357639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, lShiftAmt); 9367435Sgblack@eecs.umich.edu } 9377435Sgblack@eecs.umich.edu case 0x6: 9387435Sgblack@eecs.umich.edu case 0x7: 9397639Sgblack@eecs.umich.edu if (u) { 9407639Sgblack@eecs.umich.edu if (a == 0x6) { 9417639Sgblack@eecs.umich.edu return decodeNeonSTwoShiftReg<NVqshlusD, NVqshlusQ>( 9427639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, lShiftAmt); 9437639Sgblack@eecs.umich.edu } else { 9447639Sgblack@eecs.umich.edu return decodeNeonUTwoShiftReg<NVqshluD, NVqshluQ>( 9457639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, lShiftAmt); 9467639Sgblack@eecs.umich.edu } 9477639Sgblack@eecs.umich.edu } else { 9487639Sgblack@eecs.umich.edu return decodeNeonSTwoShiftReg<NVqshlD, NVqshlQ>( 9497639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, lShiftAmt); 9507639Sgblack@eecs.umich.edu } 9517435Sgblack@eecs.umich.edu case 0x8: 9527435Sgblack@eecs.umich.edu if (l) { 9537435Sgblack@eecs.umich.edu return new Unknown(machInst); 9547435Sgblack@eecs.umich.edu } else if (u) { 9557639Sgblack@eecs.umich.edu return decodeNeonSTwoShiftSReg<NVqshruns, NVqrshruns>( 9567639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, rShiftAmt); 9577435Sgblack@eecs.umich.edu } else { 9587639Sgblack@eecs.umich.edu return decodeNeonUTwoShiftSReg<NVshrn, NVrshrn>( 9597639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, rShiftAmt); 9607435Sgblack@eecs.umich.edu } 9617435Sgblack@eecs.umich.edu case 0x9: 9627435Sgblack@eecs.umich.edu if (l) { 9637435Sgblack@eecs.umich.edu return new Unknown(machInst); 9647639Sgblack@eecs.umich.edu } else if (u) { 9657639Sgblack@eecs.umich.edu return decodeNeonUTwoShiftSReg<NVqshrun, NVqrshrun>( 9667639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, rShiftAmt); 9677435Sgblack@eecs.umich.edu } else { 9687639Sgblack@eecs.umich.edu return decodeNeonSTwoShiftSReg<NVqshrn, NVqrshrn>( 9697639Sgblack@eecs.umich.edu b, size, machInst, vd, vm, rShiftAmt); 9707435Sgblack@eecs.umich.edu } 9717435Sgblack@eecs.umich.edu case 0xa: 9727435Sgblack@eecs.umich.edu if (l || b) { 9737435Sgblack@eecs.umich.edu return new Unknown(machInst); 9747435Sgblack@eecs.umich.edu } else { 9757639Sgblack@eecs.umich.edu return decodeNeonUSTwoShiftSReg<NVmovl, NVshll>( 9767639Sgblack@eecs.umich.edu lShiftAmt, u, size, machInst, vd, vm, lShiftAmt); 9777435Sgblack@eecs.umich.edu } 9787435Sgblack@eecs.umich.edu case 0xe: 9797639Sgblack@eecs.umich.edu if (l) { 9807639Sgblack@eecs.umich.edu return new Unknown(machInst); 9817639Sgblack@eecs.umich.edu } else { 9827639Sgblack@eecs.umich.edu if (bits(imm6, 5) == 0) 9837639Sgblack@eecs.umich.edu return new Unknown(machInst); 9847639Sgblack@eecs.umich.edu if (u) { 9857639Sgblack@eecs.umich.edu if (b) { 9867639Sgblack@eecs.umich.edu return new NVcvtu2fpQ<float>( 9877639Sgblack@eecs.umich.edu machInst, vd, vm, 64 - imm6); 9887639Sgblack@eecs.umich.edu } else { 9897639Sgblack@eecs.umich.edu return new NVcvtu2fpD<float>( 9907639Sgblack@eecs.umich.edu machInst, vd, vm, 64 - imm6); 9917639Sgblack@eecs.umich.edu } 9927639Sgblack@eecs.umich.edu } else { 9937639Sgblack@eecs.umich.edu if (b) { 9947639Sgblack@eecs.umich.edu return new NVcvts2fpQ<float>( 9957639Sgblack@eecs.umich.edu machInst, vd, vm, 64 - imm6); 9967639Sgblack@eecs.umich.edu } else { 9977639Sgblack@eecs.umich.edu return new NVcvts2fpD<float>( 9987639Sgblack@eecs.umich.edu machInst, vd, vm, 64 - imm6); 9997639Sgblack@eecs.umich.edu } 10007639Sgblack@eecs.umich.edu } 10017639Sgblack@eecs.umich.edu } 10027435Sgblack@eecs.umich.edu case 0xf: 10037435Sgblack@eecs.umich.edu if (l) { 10047435Sgblack@eecs.umich.edu return new Unknown(machInst); 10057639Sgblack@eecs.umich.edu } else { 10067639Sgblack@eecs.umich.edu if (bits(imm6, 5) == 0) 10077639Sgblack@eecs.umich.edu return new Unknown(machInst); 10087639Sgblack@eecs.umich.edu if (u) { 10097639Sgblack@eecs.umich.edu if (b) { 10107639Sgblack@eecs.umich.edu return new NVcvt2ufxQ<float>( 10117639Sgblack@eecs.umich.edu machInst, vd, vm, 64 - imm6); 10127639Sgblack@eecs.umich.edu } else { 10137639Sgblack@eecs.umich.edu return new NVcvt2ufxD<float>( 10147639Sgblack@eecs.umich.edu machInst, vd, vm, 64 - imm6); 10157639Sgblack@eecs.umich.edu } 10167639Sgblack@eecs.umich.edu } else { 10177639Sgblack@eecs.umich.edu if (b) { 10187639Sgblack@eecs.umich.edu return new NVcvt2sfxQ<float>( 10197639Sgblack@eecs.umich.edu machInst, vd, vm, 64 - imm6); 10207639Sgblack@eecs.umich.edu } else { 10217639Sgblack@eecs.umich.edu return new NVcvt2sfxD<float>( 10227639Sgblack@eecs.umich.edu machInst, vd, vm, 64 - imm6); 10237639Sgblack@eecs.umich.edu } 10247639Sgblack@eecs.umich.edu } 10257435Sgblack@eecs.umich.edu } 10267435Sgblack@eecs.umich.edu } 10277435Sgblack@eecs.umich.edu return new Unknown(machInst); 10287435Sgblack@eecs.umich.edu } 10297435Sgblack@eecs.umich.edu 10307435Sgblack@eecs.umich.edu static StaticInstPtr 10317435Sgblack@eecs.umich.edu decodeNeonThreeRegDiffLengths(ExtMachInst machInst) 10327435Sgblack@eecs.umich.edu { 10337435Sgblack@eecs.umich.edu const bool u = THUMB ? bits(machInst, 28) : bits(machInst, 24); 10347435Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 11, 8); 10357639Sgblack@eecs.umich.edu const IntRegIndex vd = 10367639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 15, 12) | 10377639Sgblack@eecs.umich.edu (bits(machInst, 22) << 4))); 10387639Sgblack@eecs.umich.edu const IntRegIndex vn = 10397639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 19, 16) | 10407639Sgblack@eecs.umich.edu (bits(machInst, 7) << 4))); 10417639Sgblack@eecs.umich.edu const IntRegIndex vm = 10427639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 3, 0) | 10437639Sgblack@eecs.umich.edu (bits(machInst, 5) << 4))); 10447639Sgblack@eecs.umich.edu const unsigned size = bits(machInst, 21, 20); 10457435Sgblack@eecs.umich.edu switch (a) { 10467435Sgblack@eecs.umich.edu case 0x0: 10477639Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<Vaddl>( 10487639Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 10497435Sgblack@eecs.umich.edu case 0x1: 10507639Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<Vaddw>( 10517639Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 10527435Sgblack@eecs.umich.edu case 0x2: 10537639Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<Vsubl>( 10547639Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 10557435Sgblack@eecs.umich.edu case 0x3: 10567639Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<Vsubw>( 10577639Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 10587435Sgblack@eecs.umich.edu case 0x4: 10597435Sgblack@eecs.umich.edu if (u) { 10607639Sgblack@eecs.umich.edu return decodeNeonUThreeUSReg<Vraddhn>( 10617639Sgblack@eecs.umich.edu size, machInst, vd, vn, vm); 10627435Sgblack@eecs.umich.edu } else { 10637639Sgblack@eecs.umich.edu return decodeNeonUThreeUSReg<Vaddhn>( 10647639Sgblack@eecs.umich.edu size, machInst, vd, vn, vm); 10657435Sgblack@eecs.umich.edu } 10667435Sgblack@eecs.umich.edu case 0x5: 10677639Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<Vabal>( 10687639Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 10697435Sgblack@eecs.umich.edu case 0x6: 10707435Sgblack@eecs.umich.edu if (u) { 10717639Sgblack@eecs.umich.edu return decodeNeonUThreeUSReg<Vrsubhn>( 10727639Sgblack@eecs.umich.edu size, machInst, vd, vn, vm); 10737435Sgblack@eecs.umich.edu } else { 10747639Sgblack@eecs.umich.edu return decodeNeonUThreeUSReg<Vsubhn>( 10757639Sgblack@eecs.umich.edu size, machInst, vd, vn, vm); 10767435Sgblack@eecs.umich.edu } 10777435Sgblack@eecs.umich.edu case 0x7: 10787435Sgblack@eecs.umich.edu if (bits(machInst, 23)) { 10797639Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<Vabdl>( 10807639Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 10817435Sgblack@eecs.umich.edu } else { 10827639Sgblack@eecs.umich.edu return decodeNeonUSThreeReg<VabdD, VabdQ>( 10837639Sgblack@eecs.umich.edu bits(machInst, 6), u, size, machInst, vd, vn, vm); 10847435Sgblack@eecs.umich.edu } 10857435Sgblack@eecs.umich.edu case 0x8: 10867639Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<Vmlal>( 10877639Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 10887435Sgblack@eecs.umich.edu case 0xa: 10897639Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<Vmlsl>( 10907639Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 10917435Sgblack@eecs.umich.edu case 0x9: 10927639Sgblack@eecs.umich.edu if (u) { 10937639Sgblack@eecs.umich.edu return new Unknown(machInst); 10947435Sgblack@eecs.umich.edu } else { 10957639Sgblack@eecs.umich.edu return decodeNeonSThreeUSReg<Vqdmlal>( 10967639Sgblack@eecs.umich.edu size, machInst, vd, vn, vm); 10977435Sgblack@eecs.umich.edu } 10987435Sgblack@eecs.umich.edu case 0xb: 10997639Sgblack@eecs.umich.edu if (u) { 11007435Sgblack@eecs.umich.edu return new Unknown(machInst); 11017435Sgblack@eecs.umich.edu } else { 11027639Sgblack@eecs.umich.edu return decodeNeonSThreeUSReg<Vqdmlsl>( 11037639Sgblack@eecs.umich.edu size, machInst, vd, vn, vm); 11047435Sgblack@eecs.umich.edu } 11057435Sgblack@eecs.umich.edu case 0xc: 11067639Sgblack@eecs.umich.edu return decodeNeonUSThreeUSReg<Vmull>( 11077639Sgblack@eecs.umich.edu u, size, machInst, vd, vn, vm); 11087435Sgblack@eecs.umich.edu case 0xd: 11097639Sgblack@eecs.umich.edu if (u) { 11107435Sgblack@eecs.umich.edu return new Unknown(machInst); 11117435Sgblack@eecs.umich.edu } else { 11127639Sgblack@eecs.umich.edu return decodeNeonSThreeUSReg<Vqdmull>( 11137639Sgblack@eecs.umich.edu size, machInst, vd, vn, vm); 11147435Sgblack@eecs.umich.edu } 11157435Sgblack@eecs.umich.edu case 0xe: 11167639Sgblack@eecs.umich.edu return decodeNeonUThreeUSReg<Vmullp>( 11177639Sgblack@eecs.umich.edu size, machInst, vd, vn, vm); 11187435Sgblack@eecs.umich.edu } 11197435Sgblack@eecs.umich.edu return new Unknown(machInst); 11207435Sgblack@eecs.umich.edu } 11217435Sgblack@eecs.umich.edu 11227435Sgblack@eecs.umich.edu static StaticInstPtr 11237435Sgblack@eecs.umich.edu decodeNeonTwoRegScalar(ExtMachInst machInst) 11247435Sgblack@eecs.umich.edu { 11257435Sgblack@eecs.umich.edu const bool u = THUMB ? bits(machInst, 28) : bits(machInst, 24); 11267435Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 11, 8); 11277639Sgblack@eecs.umich.edu const unsigned size = bits(machInst, 21, 20); 11287639Sgblack@eecs.umich.edu const IntRegIndex vd = 11297639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 15, 12) | 11307639Sgblack@eecs.umich.edu (bits(machInst, 22) << 4))); 11317639Sgblack@eecs.umich.edu const IntRegIndex vn = 11327639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 19, 16) | 11337639Sgblack@eecs.umich.edu (bits(machInst, 7) << 4))); 11347639Sgblack@eecs.umich.edu const IntRegIndex vm = (size == 2) ? 11357639Sgblack@eecs.umich.edu (IntRegIndex)(2 * bits(machInst, 3, 0)) : 11367639Sgblack@eecs.umich.edu (IntRegIndex)(2 * bits(machInst, 2, 0)); 11377639Sgblack@eecs.umich.edu const unsigned index = (size == 2) ? (unsigned)bits(machInst, 5) : 11387639Sgblack@eecs.umich.edu (bits(machInst, 3) | (bits(machInst, 5) << 1)); 11397435Sgblack@eecs.umich.edu switch (a) { 11407435Sgblack@eecs.umich.edu case 0x0: 11417639Sgblack@eecs.umich.edu if (u) { 11427639Sgblack@eecs.umich.edu switch (size) { 11437639Sgblack@eecs.umich.edu case 1: 11447639Sgblack@eecs.umich.edu return new VmlasQ<uint16_t>(machInst, vd, vn, vm, index); 11457639Sgblack@eecs.umich.edu case 2: 11467639Sgblack@eecs.umich.edu return new VmlasQ<uint32_t>(machInst, vd, vn, vm, index); 11477639Sgblack@eecs.umich.edu default: 11487639Sgblack@eecs.umich.edu return new Unknown(machInst); 11497639Sgblack@eecs.umich.edu } 11507639Sgblack@eecs.umich.edu } else { 11517639Sgblack@eecs.umich.edu switch (size) { 11527639Sgblack@eecs.umich.edu case 1: 11537639Sgblack@eecs.umich.edu return new VmlasD<uint16_t>(machInst, vd, vn, vm, index); 11547639Sgblack@eecs.umich.edu case 2: 11557639Sgblack@eecs.umich.edu return new VmlasD<uint32_t>(machInst, vd, vn, vm, index); 11567639Sgblack@eecs.umich.edu default: 11577639Sgblack@eecs.umich.edu return new Unknown(machInst); 11587639Sgblack@eecs.umich.edu } 11597639Sgblack@eecs.umich.edu } 11607435Sgblack@eecs.umich.edu case 0x1: 11617639Sgblack@eecs.umich.edu if (u) 11627639Sgblack@eecs.umich.edu return new VmlasQFp<float>(machInst, vd, vn, vm, index); 11637639Sgblack@eecs.umich.edu else 11647639Sgblack@eecs.umich.edu return new VmlasDFp<float>(machInst, vd, vn, vm, index); 11657435Sgblack@eecs.umich.edu case 0x4: 11667639Sgblack@eecs.umich.edu if (u) { 11677639Sgblack@eecs.umich.edu switch (size) { 11687639Sgblack@eecs.umich.edu case 1: 11697639Sgblack@eecs.umich.edu return new VmlssQ<uint16_t>(machInst, vd, vn, vm, index); 11707639Sgblack@eecs.umich.edu case 2: 11717639Sgblack@eecs.umich.edu return new VmlssQ<uint32_t>(machInst, vd, vn, vm, index); 11727639Sgblack@eecs.umich.edu default: 11737639Sgblack@eecs.umich.edu return new Unknown(machInst); 11747639Sgblack@eecs.umich.edu } 11757639Sgblack@eecs.umich.edu } else { 11767639Sgblack@eecs.umich.edu switch (size) { 11777639Sgblack@eecs.umich.edu case 1: 11787639Sgblack@eecs.umich.edu return new VmlssD<uint16_t>(machInst, vd, vn, vm, index); 11797639Sgblack@eecs.umich.edu case 2: 11807639Sgblack@eecs.umich.edu return new VmlssD<uint32_t>(machInst, vd, vn, vm, index); 11817639Sgblack@eecs.umich.edu default: 11827639Sgblack@eecs.umich.edu return new Unknown(machInst); 11837639Sgblack@eecs.umich.edu } 11847639Sgblack@eecs.umich.edu } 11857435Sgblack@eecs.umich.edu case 0x5: 11867639Sgblack@eecs.umich.edu if (u) 11877639Sgblack@eecs.umich.edu return new VmlssQFp<float>(machInst, vd, vn, vm, index); 11887639Sgblack@eecs.umich.edu else 11897639Sgblack@eecs.umich.edu return new VmlssDFp<float>(machInst, vd, vn, vm, index); 11907435Sgblack@eecs.umich.edu case 0x2: 11917639Sgblack@eecs.umich.edu if (u) { 11927639Sgblack@eecs.umich.edu switch (size) { 11937639Sgblack@eecs.umich.edu case 1: 11947639Sgblack@eecs.umich.edu return new Vmlals<uint16_t>(machInst, vd, vn, vm, index); 11957639Sgblack@eecs.umich.edu case 2: 11967639Sgblack@eecs.umich.edu return new Vmlals<uint32_t>(machInst, vd, vn, vm, index); 11977639Sgblack@eecs.umich.edu default: 11987639Sgblack@eecs.umich.edu return new Unknown(machInst); 11997639Sgblack@eecs.umich.edu } 12007639Sgblack@eecs.umich.edu } else { 12017639Sgblack@eecs.umich.edu switch (size) { 12027639Sgblack@eecs.umich.edu case 1: 12037639Sgblack@eecs.umich.edu return new Vmlals<int16_t>(machInst, vd, vn, vm, index); 12047639Sgblack@eecs.umich.edu case 2: 12057639Sgblack@eecs.umich.edu return new Vmlals<int32_t>(machInst, vd, vn, vm, index); 12067639Sgblack@eecs.umich.edu default: 12077639Sgblack@eecs.umich.edu return new Unknown(machInst); 12087639Sgblack@eecs.umich.edu } 12097639Sgblack@eecs.umich.edu } 12107435Sgblack@eecs.umich.edu case 0x6: 12117639Sgblack@eecs.umich.edu if (u) { 12127639Sgblack@eecs.umich.edu switch (size) { 12137639Sgblack@eecs.umich.edu case 1: 12147639Sgblack@eecs.umich.edu return new Vmlsls<uint16_t>(machInst, vd, vn, vm, index); 12157639Sgblack@eecs.umich.edu case 2: 12167639Sgblack@eecs.umich.edu return new Vmlsls<uint32_t>(machInst, vd, vn, vm, index); 12177639Sgblack@eecs.umich.edu default: 12187639Sgblack@eecs.umich.edu return new Unknown(machInst); 12197639Sgblack@eecs.umich.edu } 12207639Sgblack@eecs.umich.edu } else { 12217639Sgblack@eecs.umich.edu switch (size) { 12227639Sgblack@eecs.umich.edu case 1: 12237639Sgblack@eecs.umich.edu return new Vmlsls<int16_t>(machInst, vd, vn, vm, index); 12247639Sgblack@eecs.umich.edu case 2: 12257639Sgblack@eecs.umich.edu return new Vmlsls<int32_t>(machInst, vd, vn, vm, index); 12267639Sgblack@eecs.umich.edu default: 12277639Sgblack@eecs.umich.edu return new Unknown(machInst); 12287639Sgblack@eecs.umich.edu } 12297639Sgblack@eecs.umich.edu } 12307435Sgblack@eecs.umich.edu case 0x3: 12317435Sgblack@eecs.umich.edu if (u) { 12327435Sgblack@eecs.umich.edu return new Unknown(machInst); 12337435Sgblack@eecs.umich.edu } else { 12347639Sgblack@eecs.umich.edu switch (size) { 12357639Sgblack@eecs.umich.edu case 1: 12367639Sgblack@eecs.umich.edu return new Vqdmlals<int16_t>(machInst, vd, vn, vm, index); 12377639Sgblack@eecs.umich.edu case 2: 12387639Sgblack@eecs.umich.edu return new Vqdmlals<int32_t>(machInst, vd, vn, vm, index); 12397639Sgblack@eecs.umich.edu default: 12407639Sgblack@eecs.umich.edu return new Unknown(machInst); 12417639Sgblack@eecs.umich.edu } 12427435Sgblack@eecs.umich.edu } 12437435Sgblack@eecs.umich.edu case 0x7: 12447435Sgblack@eecs.umich.edu if (u) { 12457435Sgblack@eecs.umich.edu return new Unknown(machInst); 12467435Sgblack@eecs.umich.edu } else { 12477639Sgblack@eecs.umich.edu switch (size) { 12487639Sgblack@eecs.umich.edu case 1: 12497639Sgblack@eecs.umich.edu return new Vqdmlsls<int16_t>(machInst, vd, vn, vm, index); 12507639Sgblack@eecs.umich.edu case 2: 12517639Sgblack@eecs.umich.edu return new Vqdmlsls<int32_t>(machInst, vd, vn, vm, index); 12527639Sgblack@eecs.umich.edu default: 12537639Sgblack@eecs.umich.edu return new Unknown(machInst); 12547639Sgblack@eecs.umich.edu } 12557435Sgblack@eecs.umich.edu } 12567435Sgblack@eecs.umich.edu case 0x8: 12577639Sgblack@eecs.umich.edu if (u) { 12587639Sgblack@eecs.umich.edu switch (size) { 12597639Sgblack@eecs.umich.edu case 1: 12607639Sgblack@eecs.umich.edu return new VmulsQ<uint16_t>(machInst, vd, vn, vm, index); 12617639Sgblack@eecs.umich.edu case 2: 12627639Sgblack@eecs.umich.edu return new VmulsQ<uint32_t>(machInst, vd, vn, vm, index); 12637639Sgblack@eecs.umich.edu default: 12647639Sgblack@eecs.umich.edu return new Unknown(machInst); 12657639Sgblack@eecs.umich.edu } 12667639Sgblack@eecs.umich.edu } else { 12677639Sgblack@eecs.umich.edu switch (size) { 12687639Sgblack@eecs.umich.edu case 1: 12697639Sgblack@eecs.umich.edu return new VmulsD<uint16_t>(machInst, vd, vn, vm, index); 12707639Sgblack@eecs.umich.edu case 2: 12717639Sgblack@eecs.umich.edu return new VmulsD<uint32_t>(machInst, vd, vn, vm, index); 12727639Sgblack@eecs.umich.edu default: 12737639Sgblack@eecs.umich.edu return new Unknown(machInst); 12747639Sgblack@eecs.umich.edu } 12757639Sgblack@eecs.umich.edu } 12767435Sgblack@eecs.umich.edu case 0x9: 12777639Sgblack@eecs.umich.edu if (u) 12787639Sgblack@eecs.umich.edu return new VmulsQFp<float>(machInst, vd, vn, vm, index); 12797639Sgblack@eecs.umich.edu else 12807639Sgblack@eecs.umich.edu return new VmulsDFp<float>(machInst, vd, vn, vm, index); 12817435Sgblack@eecs.umich.edu case 0xa: 12827639Sgblack@eecs.umich.edu if (u) { 12837639Sgblack@eecs.umich.edu switch (size) { 12847639Sgblack@eecs.umich.edu case 1: 12857639Sgblack@eecs.umich.edu return new Vmulls<uint16_t>(machInst, vd, vn, vm, index); 12867639Sgblack@eecs.umich.edu case 2: 12877639Sgblack@eecs.umich.edu return new Vmulls<uint32_t>(machInst, vd, vn, vm, index); 12887639Sgblack@eecs.umich.edu default: 12897639Sgblack@eecs.umich.edu return new Unknown(machInst); 12907639Sgblack@eecs.umich.edu } 12917639Sgblack@eecs.umich.edu } else { 12927639Sgblack@eecs.umich.edu switch (size) { 12937639Sgblack@eecs.umich.edu case 1: 12947639Sgblack@eecs.umich.edu return new Vmulls<int16_t>(machInst, vd, vn, vm, index); 12957639Sgblack@eecs.umich.edu case 2: 12967639Sgblack@eecs.umich.edu return new Vmulls<int32_t>(machInst, vd, vn, vm, index); 12977639Sgblack@eecs.umich.edu default: 12987639Sgblack@eecs.umich.edu return new Unknown(machInst); 12997639Sgblack@eecs.umich.edu } 13007639Sgblack@eecs.umich.edu } 13017435Sgblack@eecs.umich.edu case 0xb: 13027435Sgblack@eecs.umich.edu if (u) { 13037435Sgblack@eecs.umich.edu return new Unknown(machInst); 13047435Sgblack@eecs.umich.edu } else { 13057639Sgblack@eecs.umich.edu if (u) { 13067639Sgblack@eecs.umich.edu switch (size) { 13077639Sgblack@eecs.umich.edu case 1: 13087639Sgblack@eecs.umich.edu return new Vqdmulls<uint16_t>( 13097639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13107639Sgblack@eecs.umich.edu case 2: 13117639Sgblack@eecs.umich.edu return new Vqdmulls<uint32_t>( 13127639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13137639Sgblack@eecs.umich.edu default: 13147639Sgblack@eecs.umich.edu return new Unknown(machInst); 13157639Sgblack@eecs.umich.edu } 13167639Sgblack@eecs.umich.edu } else { 13177639Sgblack@eecs.umich.edu switch (size) { 13187639Sgblack@eecs.umich.edu case 1: 13197639Sgblack@eecs.umich.edu return new Vqdmulls<int16_t>( 13207639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13217639Sgblack@eecs.umich.edu case 2: 13227639Sgblack@eecs.umich.edu return new Vqdmulls<int32_t>( 13237639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13247639Sgblack@eecs.umich.edu default: 13257639Sgblack@eecs.umich.edu return new Unknown(machInst); 13267639Sgblack@eecs.umich.edu } 13277639Sgblack@eecs.umich.edu } 13287435Sgblack@eecs.umich.edu } 13297435Sgblack@eecs.umich.edu case 0xc: 13307639Sgblack@eecs.umich.edu if (u) { 13317639Sgblack@eecs.umich.edu switch (size) { 13327639Sgblack@eecs.umich.edu case 1: 13337639Sgblack@eecs.umich.edu return new VqdmulhsQ<int16_t>( 13347639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13357639Sgblack@eecs.umich.edu case 2: 13367639Sgblack@eecs.umich.edu return new VqdmulhsQ<int32_t>( 13377639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13387639Sgblack@eecs.umich.edu default: 13397639Sgblack@eecs.umich.edu return new Unknown(machInst); 13407639Sgblack@eecs.umich.edu } 13417639Sgblack@eecs.umich.edu } else { 13427639Sgblack@eecs.umich.edu switch (size) { 13437639Sgblack@eecs.umich.edu case 1: 13447639Sgblack@eecs.umich.edu return new VqdmulhsD<int16_t>( 13457639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13467639Sgblack@eecs.umich.edu case 2: 13477639Sgblack@eecs.umich.edu return new VqdmulhsD<int32_t>( 13487639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13497639Sgblack@eecs.umich.edu default: 13507639Sgblack@eecs.umich.edu return new Unknown(machInst); 13517639Sgblack@eecs.umich.edu } 13527639Sgblack@eecs.umich.edu } 13537435Sgblack@eecs.umich.edu case 0xd: 13547639Sgblack@eecs.umich.edu if (u) { 13557639Sgblack@eecs.umich.edu switch (size) { 13567639Sgblack@eecs.umich.edu case 1: 13577639Sgblack@eecs.umich.edu return new VqrdmulhsQ<int16_t>( 13587639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13597639Sgblack@eecs.umich.edu case 2: 13607639Sgblack@eecs.umich.edu return new VqrdmulhsQ<int32_t>( 13617639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13627639Sgblack@eecs.umich.edu default: 13637639Sgblack@eecs.umich.edu return new Unknown(machInst); 13647639Sgblack@eecs.umich.edu } 13657639Sgblack@eecs.umich.edu } else { 13667639Sgblack@eecs.umich.edu switch (size) { 13677639Sgblack@eecs.umich.edu case 1: 13687639Sgblack@eecs.umich.edu return new VqrdmulhsD<int16_t>( 13697639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13707639Sgblack@eecs.umich.edu case 2: 13717639Sgblack@eecs.umich.edu return new VqrdmulhsD<int32_t>( 13727639Sgblack@eecs.umich.edu machInst, vd, vn, vm, index); 13737639Sgblack@eecs.umich.edu default: 13747639Sgblack@eecs.umich.edu return new Unknown(machInst); 13757639Sgblack@eecs.umich.edu } 13767639Sgblack@eecs.umich.edu } 13777435Sgblack@eecs.umich.edu } 13787435Sgblack@eecs.umich.edu return new Unknown(machInst); 13797435Sgblack@eecs.umich.edu } 13807435Sgblack@eecs.umich.edu 13817435Sgblack@eecs.umich.edu static StaticInstPtr 13827435Sgblack@eecs.umich.edu decodeNeonTwoRegMisc(ExtMachInst machInst) 13837435Sgblack@eecs.umich.edu { 13847435Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 17, 16); 13857435Sgblack@eecs.umich.edu const uint32_t b = bits(machInst, 10, 6); 13867639Sgblack@eecs.umich.edu const bool q = bits(machInst, 6); 13877639Sgblack@eecs.umich.edu const IntRegIndex vd = 13887639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 15, 12) | 13897639Sgblack@eecs.umich.edu (bits(machInst, 22) << 4))); 13907639Sgblack@eecs.umich.edu const IntRegIndex vm = 13917639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 3, 0) | 13927639Sgblack@eecs.umich.edu (bits(machInst, 5) << 4))); 13937639Sgblack@eecs.umich.edu const unsigned size = bits(machInst, 19, 18); 13947435Sgblack@eecs.umich.edu switch (a) { 13957435Sgblack@eecs.umich.edu case 0x0: 13967435Sgblack@eecs.umich.edu switch (bits(b, 4, 1)) { 13977435Sgblack@eecs.umich.edu case 0x0: 13987639Sgblack@eecs.umich.edu switch (size) { 13997639Sgblack@eecs.umich.edu case 0: 14007639Sgblack@eecs.umich.edu if (q) { 14017639Sgblack@eecs.umich.edu return new NVrev64Q<uint8_t>(machInst, vd, vm); 14027639Sgblack@eecs.umich.edu } else { 14037639Sgblack@eecs.umich.edu return new NVrev64D<uint8_t>(machInst, vd, vm); 14047639Sgblack@eecs.umich.edu } 14057639Sgblack@eecs.umich.edu case 1: 14067639Sgblack@eecs.umich.edu if (q) { 14077639Sgblack@eecs.umich.edu return new NVrev64Q<uint16_t>(machInst, vd, vm); 14087639Sgblack@eecs.umich.edu } else { 14097639Sgblack@eecs.umich.edu return new NVrev64D<uint16_t>(machInst, vd, vm); 14107639Sgblack@eecs.umich.edu } 14117639Sgblack@eecs.umich.edu case 2: 14127639Sgblack@eecs.umich.edu if (q) { 14137639Sgblack@eecs.umich.edu return new NVrev64Q<uint32_t>(machInst, vd, vm); 14147639Sgblack@eecs.umich.edu } else { 14157639Sgblack@eecs.umich.edu return new NVrev64D<uint32_t>(machInst, vd, vm); 14167639Sgblack@eecs.umich.edu } 14177639Sgblack@eecs.umich.edu default: 14187639Sgblack@eecs.umich.edu return new Unknown(machInst); 14197639Sgblack@eecs.umich.edu } 14207435Sgblack@eecs.umich.edu case 0x1: 14217639Sgblack@eecs.umich.edu switch (size) { 14227639Sgblack@eecs.umich.edu case 0: 14237639Sgblack@eecs.umich.edu if (q) { 14247639Sgblack@eecs.umich.edu return new NVrev32Q<uint8_t>(machInst, vd, vm); 14257639Sgblack@eecs.umich.edu } else { 14267639Sgblack@eecs.umich.edu return new NVrev32D<uint8_t>(machInst, vd, vm); 14277639Sgblack@eecs.umich.edu } 14287639Sgblack@eecs.umich.edu case 1: 14297639Sgblack@eecs.umich.edu if (q) { 14307639Sgblack@eecs.umich.edu return new NVrev32Q<uint16_t>(machInst, vd, vm); 14317639Sgblack@eecs.umich.edu } else { 14327639Sgblack@eecs.umich.edu return new NVrev32D<uint16_t>(machInst, vd, vm); 14337639Sgblack@eecs.umich.edu } 14347639Sgblack@eecs.umich.edu default: 14357639Sgblack@eecs.umich.edu return new Unknown(machInst); 14367639Sgblack@eecs.umich.edu } 14377435Sgblack@eecs.umich.edu case 0x2: 14387639Sgblack@eecs.umich.edu if (size != 0) { 14397639Sgblack@eecs.umich.edu return new Unknown(machInst); 14407639Sgblack@eecs.umich.edu } else if (q) { 14417639Sgblack@eecs.umich.edu return new NVrev16Q<uint8_t>(machInst, vd, vm); 14427639Sgblack@eecs.umich.edu } else { 14437639Sgblack@eecs.umich.edu return new NVrev16D<uint8_t>(machInst, vd, vm); 14447639Sgblack@eecs.umich.edu } 14457435Sgblack@eecs.umich.edu case 0x4: 14467639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscSReg<NVpaddlD, NVpaddlQ>( 14477639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 14487435Sgblack@eecs.umich.edu case 0x5: 14497639Sgblack@eecs.umich.edu return decodeNeonUTwoMiscSReg<NVpaddlD, NVpaddlQ>( 14507639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 14517435Sgblack@eecs.umich.edu case 0x8: 14527639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVclsD, NVclsQ>( 14537639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 14547435Sgblack@eecs.umich.edu case 0x9: 14557639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVclzD, NVclzQ>( 14567639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 14577435Sgblack@eecs.umich.edu case 0xa: 14587639Sgblack@eecs.umich.edu return decodeNeonUTwoMiscReg<NVcntD, NVcntQ>( 14597639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 14607435Sgblack@eecs.umich.edu case 0xb: 14617639Sgblack@eecs.umich.edu if (q) 14627639Sgblack@eecs.umich.edu return new NVmvnQ<uint64_t>(machInst, vd, vm); 14637639Sgblack@eecs.umich.edu else 14647639Sgblack@eecs.umich.edu return new NVmvnD<uint64_t>(machInst, vd, vm); 14657435Sgblack@eecs.umich.edu case 0xc: 14667639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscSReg<NVpadalD, NVpadalQ>( 14677639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 14687435Sgblack@eecs.umich.edu case 0xd: 14697639Sgblack@eecs.umich.edu return decodeNeonUTwoMiscSReg<NVpadalD, NVpadalQ>( 14707639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 14717435Sgblack@eecs.umich.edu case 0xe: 14727639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVqabsD, NVqabsQ>( 14737639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 14747435Sgblack@eecs.umich.edu case 0xf: 14757639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVqnegD, NVqnegQ>( 14767639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 14777435Sgblack@eecs.umich.edu default: 14787435Sgblack@eecs.umich.edu return new Unknown(machInst); 14797435Sgblack@eecs.umich.edu } 14807435Sgblack@eecs.umich.edu case 0x1: 14817435Sgblack@eecs.umich.edu switch (bits(b, 3, 1)) { 14827435Sgblack@eecs.umich.edu case 0x0: 14837639Sgblack@eecs.umich.edu if (bits(b, 4)) { 14847639Sgblack@eecs.umich.edu if (q) { 14857639Sgblack@eecs.umich.edu return new NVcgtQFp<float>(machInst, vd, vm); 14867639Sgblack@eecs.umich.edu } else { 14877639Sgblack@eecs.umich.edu return new NVcgtDFp<float>(machInst, vd, vm); 14887639Sgblack@eecs.umich.edu } 14897639Sgblack@eecs.umich.edu } else { 14907639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVcgtD, NVcgtQ>( 14917639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 14927639Sgblack@eecs.umich.edu } 14937435Sgblack@eecs.umich.edu case 0x1: 14947639Sgblack@eecs.umich.edu if (bits(b, 4)) { 14957639Sgblack@eecs.umich.edu if (q) { 14967639Sgblack@eecs.umich.edu return new NVcgeQFp<float>(machInst, vd, vm); 14977639Sgblack@eecs.umich.edu } else { 14987639Sgblack@eecs.umich.edu return new NVcgeDFp<float>(machInst, vd, vm); 14997639Sgblack@eecs.umich.edu } 15007639Sgblack@eecs.umich.edu } else { 15017639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVcgeD, NVcgeQ>( 15027639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15037639Sgblack@eecs.umich.edu } 15047435Sgblack@eecs.umich.edu case 0x2: 15057639Sgblack@eecs.umich.edu if (bits(b, 4)) { 15067639Sgblack@eecs.umich.edu if (q) { 15077639Sgblack@eecs.umich.edu return new NVceqQFp<float>(machInst, vd, vm); 15087639Sgblack@eecs.umich.edu } else { 15097639Sgblack@eecs.umich.edu return new NVceqDFp<float>(machInst, vd, vm); 15107639Sgblack@eecs.umich.edu } 15117639Sgblack@eecs.umich.edu } else { 15127639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVceqD, NVceqQ>( 15137639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15147639Sgblack@eecs.umich.edu } 15157435Sgblack@eecs.umich.edu case 0x3: 15167639Sgblack@eecs.umich.edu if (bits(b, 4)) { 15177639Sgblack@eecs.umich.edu if (q) { 15187639Sgblack@eecs.umich.edu return new NVcleQFp<float>(machInst, vd, vm); 15197639Sgblack@eecs.umich.edu } else { 15207639Sgblack@eecs.umich.edu return new NVcleDFp<float>(machInst, vd, vm); 15217639Sgblack@eecs.umich.edu } 15227639Sgblack@eecs.umich.edu } else { 15237639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVcleD, NVcleQ>( 15247639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15257639Sgblack@eecs.umich.edu } 15267435Sgblack@eecs.umich.edu case 0x4: 15277639Sgblack@eecs.umich.edu if (bits(b, 4)) { 15287639Sgblack@eecs.umich.edu if (q) { 15297639Sgblack@eecs.umich.edu return new NVcltQFp<float>(machInst, vd, vm); 15307639Sgblack@eecs.umich.edu } else { 15317639Sgblack@eecs.umich.edu return new NVcltDFp<float>(machInst, vd, vm); 15327639Sgblack@eecs.umich.edu } 15337639Sgblack@eecs.umich.edu } else { 15347639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVcltD, NVcltQ>( 15357639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15367639Sgblack@eecs.umich.edu } 15377435Sgblack@eecs.umich.edu case 0x6: 15387639Sgblack@eecs.umich.edu if (bits(machInst, 10)) { 15397639Sgblack@eecs.umich.edu if (q) 15407639Sgblack@eecs.umich.edu return new NVabsQFp<float>(machInst, vd, vm); 15417639Sgblack@eecs.umich.edu else 15427639Sgblack@eecs.umich.edu return new NVabsDFp<float>(machInst, vd, vm); 15437639Sgblack@eecs.umich.edu } else { 15447639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVabsD, NVabsQ>( 15457639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15467639Sgblack@eecs.umich.edu } 15477435Sgblack@eecs.umich.edu case 0x7: 15487639Sgblack@eecs.umich.edu if (bits(machInst, 10)) { 15497639Sgblack@eecs.umich.edu if (q) 15507639Sgblack@eecs.umich.edu return new NVnegQFp<float>(machInst, vd, vm); 15517639Sgblack@eecs.umich.edu else 15527639Sgblack@eecs.umich.edu return new NVnegDFp<float>(machInst, vd, vm); 15537639Sgblack@eecs.umich.edu } else { 15547639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscReg<NVnegD, NVnegQ>( 15557639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15567639Sgblack@eecs.umich.edu } 155712595Ssiddhesh.poyarekar@gmail.com default: 155812595Ssiddhesh.poyarekar@gmail.com return new Unknown64(machInst); 15597435Sgblack@eecs.umich.edu } 15607435Sgblack@eecs.umich.edu case 0x2: 15617435Sgblack@eecs.umich.edu switch (bits(b, 4, 1)) { 15627435Sgblack@eecs.umich.edu case 0x0: 15637639Sgblack@eecs.umich.edu if (q) 15647639Sgblack@eecs.umich.edu return new NVswpQ<uint64_t>(machInst, vd, vm); 15657639Sgblack@eecs.umich.edu else 15667639Sgblack@eecs.umich.edu return new NVswpD<uint64_t>(machInst, vd, vm); 15677435Sgblack@eecs.umich.edu case 0x1: 15688607Sgblack@eecs.umich.edu return decodeNeonUTwoMiscSReg<NVtrnD, NVtrnQ>( 15697639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15707435Sgblack@eecs.umich.edu case 0x2: 15717639Sgblack@eecs.umich.edu return decodeNeonUTwoMiscReg<NVuzpD, NVuzpQ>( 15727639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15737435Sgblack@eecs.umich.edu case 0x3: 15747639Sgblack@eecs.umich.edu return decodeNeonUTwoMiscReg<NVzipD, NVzipQ>( 15757639Sgblack@eecs.umich.edu q, size, machInst, vd, vm); 15767435Sgblack@eecs.umich.edu case 0x4: 15777435Sgblack@eecs.umich.edu if (b == 0x8) { 15787639Sgblack@eecs.umich.edu return decodeNeonUTwoMiscUSReg<NVmovn>( 15797639Sgblack@eecs.umich.edu size, machInst, vd, vm); 15807435Sgblack@eecs.umich.edu } else { 15817639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscUSReg<NVqmovuns>( 15827639Sgblack@eecs.umich.edu size, machInst, vd, vm); 15837435Sgblack@eecs.umich.edu } 15847435Sgblack@eecs.umich.edu case 0x5: 15857639Sgblack@eecs.umich.edu if (q) { 15867639Sgblack@eecs.umich.edu return decodeNeonUTwoMiscUSReg<NVqmovun>( 15877639Sgblack@eecs.umich.edu size, machInst, vd, vm); 15887639Sgblack@eecs.umich.edu } else { 15897639Sgblack@eecs.umich.edu return decodeNeonSTwoMiscUSReg<NVqmovn>( 15907639Sgblack@eecs.umich.edu size, machInst, vd, vm); 15917639Sgblack@eecs.umich.edu } 15927435Sgblack@eecs.umich.edu case 0x6: 15937435Sgblack@eecs.umich.edu if (b == 0xc) { 15947639Sgblack@eecs.umich.edu return decodeNeonSTwoShiftUSReg<NVshll>( 15957639Sgblack@eecs.umich.edu size, machInst, vd, vm, 8 << size); 15967435Sgblack@eecs.umich.edu } else { 15977435Sgblack@eecs.umich.edu return new Unknown(machInst); 15987435Sgblack@eecs.umich.edu } 15997435Sgblack@eecs.umich.edu case 0xc: 16007435Sgblack@eecs.umich.edu case 0xe: 16017435Sgblack@eecs.umich.edu if (b == 0x18) { 16027639Sgblack@eecs.umich.edu if (size != 1 || (vm % 2)) 16037639Sgblack@eecs.umich.edu return new Unknown(machInst); 16047639Sgblack@eecs.umich.edu return new NVcvts2h<uint16_t>(machInst, vd, vm); 16057435Sgblack@eecs.umich.edu } else if (b == 0x1c) { 16067639Sgblack@eecs.umich.edu if (size != 1 || (vd % 2)) 16077639Sgblack@eecs.umich.edu return new Unknown(machInst); 16087639Sgblack@eecs.umich.edu return new NVcvth2s<uint16_t>(machInst, vd, vm); 16097435Sgblack@eecs.umich.edu } else { 16107435Sgblack@eecs.umich.edu return new Unknown(machInst); 16117435Sgblack@eecs.umich.edu } 16127435Sgblack@eecs.umich.edu default: 16137435Sgblack@eecs.umich.edu return new Unknown(machInst); 16147435Sgblack@eecs.umich.edu } 16157435Sgblack@eecs.umich.edu case 0x3: 16167435Sgblack@eecs.umich.edu if (bits(b, 4, 3) == 0x3) { 16177639Sgblack@eecs.umich.edu if ((q && (vd % 2 || vm % 2)) || size != 2) { 16187639Sgblack@eecs.umich.edu return new Unknown(machInst); 16197639Sgblack@eecs.umich.edu } else { 16207639Sgblack@eecs.umich.edu if (bits(b, 2)) { 16217639Sgblack@eecs.umich.edu if (bits(b, 1)) { 16227639Sgblack@eecs.umich.edu if (q) { 16237639Sgblack@eecs.umich.edu return new NVcvt2ufxQ<float>( 16247639Sgblack@eecs.umich.edu machInst, vd, vm, 0); 16257639Sgblack@eecs.umich.edu } else { 16267639Sgblack@eecs.umich.edu return new NVcvt2ufxD<float>( 16277639Sgblack@eecs.umich.edu machInst, vd, vm, 0); 16287639Sgblack@eecs.umich.edu } 16297639Sgblack@eecs.umich.edu } else { 16307639Sgblack@eecs.umich.edu if (q) { 16317639Sgblack@eecs.umich.edu return new NVcvt2sfxQ<float>( 16327639Sgblack@eecs.umich.edu machInst, vd, vm, 0); 16337639Sgblack@eecs.umich.edu } else { 16347639Sgblack@eecs.umich.edu return new NVcvt2sfxD<float>( 16357639Sgblack@eecs.umich.edu machInst, vd, vm, 0); 16367639Sgblack@eecs.umich.edu } 16377639Sgblack@eecs.umich.edu } 16387639Sgblack@eecs.umich.edu } else { 16397639Sgblack@eecs.umich.edu if (bits(b, 1)) { 16407639Sgblack@eecs.umich.edu if (q) { 16417639Sgblack@eecs.umich.edu return new NVcvtu2fpQ<float>( 16427639Sgblack@eecs.umich.edu machInst, vd, vm, 0); 16437639Sgblack@eecs.umich.edu } else { 16447639Sgblack@eecs.umich.edu return new NVcvtu2fpD<float>( 16457639Sgblack@eecs.umich.edu machInst, vd, vm, 0); 16467639Sgblack@eecs.umich.edu } 16477639Sgblack@eecs.umich.edu } else { 16487639Sgblack@eecs.umich.edu if (q) { 16497639Sgblack@eecs.umich.edu return new NVcvts2fpQ<float>( 16507639Sgblack@eecs.umich.edu machInst, vd, vm, 0); 16517639Sgblack@eecs.umich.edu } else { 16527639Sgblack@eecs.umich.edu return new NVcvts2fpD<float>( 16537639Sgblack@eecs.umich.edu machInst, vd, vm, 0); 16547639Sgblack@eecs.umich.edu } 16557639Sgblack@eecs.umich.edu } 16567639Sgblack@eecs.umich.edu } 16577639Sgblack@eecs.umich.edu } 16587435Sgblack@eecs.umich.edu } else if ((b & 0x1a) == 0x10) { 16597639Sgblack@eecs.umich.edu if (bits(b, 2)) { 16607639Sgblack@eecs.umich.edu if (q) { 16617639Sgblack@eecs.umich.edu return new NVrecpeQFp<float>(machInst, vd, vm); 16627639Sgblack@eecs.umich.edu } else { 16637639Sgblack@eecs.umich.edu return new NVrecpeDFp<float>(machInst, vd, vm); 16647639Sgblack@eecs.umich.edu } 16657639Sgblack@eecs.umich.edu } else { 16667639Sgblack@eecs.umich.edu if (q) { 16677639Sgblack@eecs.umich.edu return new NVrecpeQ<uint32_t>(machInst, vd, vm); 16687639Sgblack@eecs.umich.edu } else { 16697639Sgblack@eecs.umich.edu return new NVrecpeD<uint32_t>(machInst, vd, vm); 16707639Sgblack@eecs.umich.edu } 16717639Sgblack@eecs.umich.edu } 16727435Sgblack@eecs.umich.edu } else if ((b & 0x1a) == 0x12) { 16737639Sgblack@eecs.umich.edu if (bits(b, 2)) { 16747639Sgblack@eecs.umich.edu if (q) { 16757639Sgblack@eecs.umich.edu return new NVrsqrteQFp<float>(machInst, vd, vm); 16767639Sgblack@eecs.umich.edu } else { 16777639Sgblack@eecs.umich.edu return new NVrsqrteDFp<float>(machInst, vd, vm); 16787639Sgblack@eecs.umich.edu } 16797639Sgblack@eecs.umich.edu } else { 16807639Sgblack@eecs.umich.edu if (q) { 16817639Sgblack@eecs.umich.edu return new NVrsqrteQ<uint32_t>(machInst, vd, vm); 16827639Sgblack@eecs.umich.edu } else { 16837639Sgblack@eecs.umich.edu return new NVrsqrteD<uint32_t>(machInst, vd, vm); 16847639Sgblack@eecs.umich.edu } 16857639Sgblack@eecs.umich.edu } 16867435Sgblack@eecs.umich.edu } else { 16877435Sgblack@eecs.umich.edu return new Unknown(machInst); 16887435Sgblack@eecs.umich.edu } 16897435Sgblack@eecs.umich.edu } 16907435Sgblack@eecs.umich.edu return new Unknown(machInst); 16917435Sgblack@eecs.umich.edu } 16927435Sgblack@eecs.umich.edu 16937435Sgblack@eecs.umich.edu StaticInstPtr 16947435Sgblack@eecs.umich.edu decodeNeonData(ExtMachInst machInst) 16957435Sgblack@eecs.umich.edu { 16967435Sgblack@eecs.umich.edu const bool u = THUMB ? bits(machInst, 28) : bits(machInst, 24); 16977435Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 23, 19); 16987435Sgblack@eecs.umich.edu const uint32_t b = bits(machInst, 11, 8); 16997435Sgblack@eecs.umich.edu const uint32_t c = bits(machInst, 7, 4); 17007435Sgblack@eecs.umich.edu if (bits(a, 4) == 0) { 17017435Sgblack@eecs.umich.edu return decodeNeonThreeRegistersSameLength(machInst); 17027435Sgblack@eecs.umich.edu } else if ((c & 0x9) == 1) { 17037435Sgblack@eecs.umich.edu if ((a & 0x7) == 0) { 17047435Sgblack@eecs.umich.edu return decodeNeonOneRegModImm(machInst); 17057435Sgblack@eecs.umich.edu } else { 17067435Sgblack@eecs.umich.edu return decodeNeonTwoRegAndShift(machInst); 17077435Sgblack@eecs.umich.edu } 17087435Sgblack@eecs.umich.edu } else if ((c & 0x9) == 9) { 17097435Sgblack@eecs.umich.edu return decodeNeonTwoRegAndShift(machInst); 17107639Sgblack@eecs.umich.edu } else if (bits(a, 2, 1) != 0x3) { 17117639Sgblack@eecs.umich.edu if ((c & 0x5) == 0) { 17127435Sgblack@eecs.umich.edu return decodeNeonThreeRegDiffLengths(machInst); 17137639Sgblack@eecs.umich.edu } else if ((c & 0x5) == 4) { 17147435Sgblack@eecs.umich.edu return decodeNeonTwoRegScalar(machInst); 17157435Sgblack@eecs.umich.edu } 17167435Sgblack@eecs.umich.edu } else if ((a & 0x16) == 0x16) { 17177639Sgblack@eecs.umich.edu const IntRegIndex vd = 17187639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 15, 12) | 17197639Sgblack@eecs.umich.edu (bits(machInst, 22) << 4))); 17207639Sgblack@eecs.umich.edu const IntRegIndex vn = 17217639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 19, 16) | 17227639Sgblack@eecs.umich.edu (bits(machInst, 7) << 4))); 17237639Sgblack@eecs.umich.edu const IntRegIndex vm = 17247639Sgblack@eecs.umich.edu (IntRegIndex)(2 * (bits(machInst, 3, 0) | 17257639Sgblack@eecs.umich.edu (bits(machInst, 5) << 4))); 17267435Sgblack@eecs.umich.edu if (!u) { 17277435Sgblack@eecs.umich.edu if (bits(c, 0) == 0) { 17287639Sgblack@eecs.umich.edu unsigned imm4 = bits(machInst, 11, 8); 17297639Sgblack@eecs.umich.edu bool q = bits(machInst, 6); 17307639Sgblack@eecs.umich.edu if (imm4 >= 16 && !q) 17317639Sgblack@eecs.umich.edu return new Unknown(machInst); 17327639Sgblack@eecs.umich.edu if (q) { 17337639Sgblack@eecs.umich.edu return new NVextQ<uint8_t>(machInst, vd, vn, vm, imm4); 17347639Sgblack@eecs.umich.edu } else { 17357639Sgblack@eecs.umich.edu return new NVextD<uint8_t>(machInst, vd, vn, vm, imm4); 17367639Sgblack@eecs.umich.edu } 17377435Sgblack@eecs.umich.edu } 17387435Sgblack@eecs.umich.edu } else if (bits(b, 3) == 0 && bits(c, 0) == 0) { 17397435Sgblack@eecs.umich.edu return decodeNeonTwoRegMisc(machInst); 17407435Sgblack@eecs.umich.edu } else if (bits(b, 3, 2) == 0x2 && bits(c, 0) == 0) { 17417639Sgblack@eecs.umich.edu unsigned length = bits(machInst, 9, 8) + 1; 17427639Sgblack@eecs.umich.edu if ((uint32_t)vn / 2 + length > 32) 17437639Sgblack@eecs.umich.edu return new Unknown(machInst); 17447435Sgblack@eecs.umich.edu if (bits(machInst, 6) == 0) { 17457639Sgblack@eecs.umich.edu switch (length) { 17467639Sgblack@eecs.umich.edu case 1: 17477639Sgblack@eecs.umich.edu return new NVtbl1(machInst, vd, vn, vm); 17487639Sgblack@eecs.umich.edu case 2: 17497639Sgblack@eecs.umich.edu return new NVtbl2(machInst, vd, vn, vm); 17507639Sgblack@eecs.umich.edu case 3: 17517639Sgblack@eecs.umich.edu return new NVtbl3(machInst, vd, vn, vm); 17527639Sgblack@eecs.umich.edu case 4: 17537639Sgblack@eecs.umich.edu return new NVtbl4(machInst, vd, vn, vm); 17547639Sgblack@eecs.umich.edu } 17557435Sgblack@eecs.umich.edu } else { 17567639Sgblack@eecs.umich.edu switch (length) { 17577639Sgblack@eecs.umich.edu case 1: 17587639Sgblack@eecs.umich.edu return new NVtbx1(machInst, vd, vn, vm); 17597639Sgblack@eecs.umich.edu case 2: 17607639Sgblack@eecs.umich.edu return new NVtbx2(machInst, vd, vn, vm); 17617639Sgblack@eecs.umich.edu case 3: 17627639Sgblack@eecs.umich.edu return new NVtbx3(machInst, vd, vn, vm); 17637639Sgblack@eecs.umich.edu case 4: 17647639Sgblack@eecs.umich.edu return new NVtbx4(machInst, vd, vn, vm); 17657639Sgblack@eecs.umich.edu } 17667435Sgblack@eecs.umich.edu } 17677435Sgblack@eecs.umich.edu } else if (b == 0xc && (c & 0x9) == 0) { 17687639Sgblack@eecs.umich.edu unsigned imm4 = bits(machInst, 19, 16); 17697639Sgblack@eecs.umich.edu if (bits(imm4, 2, 0) == 0) 17707639Sgblack@eecs.umich.edu return new Unknown(machInst); 17717639Sgblack@eecs.umich.edu unsigned size = 0; 17727639Sgblack@eecs.umich.edu while ((imm4 & 0x1) == 0) { 17737639Sgblack@eecs.umich.edu size++; 17747639Sgblack@eecs.umich.edu imm4 >>= 1; 17757639Sgblack@eecs.umich.edu } 17767639Sgblack@eecs.umich.edu unsigned index = imm4 >> 1; 17777639Sgblack@eecs.umich.edu const bool q = bits(machInst, 6); 17787639Sgblack@eecs.umich.edu return decodeNeonUTwoShiftSReg<NVdupD, NVdupQ>( 17797639Sgblack@eecs.umich.edu q, size, machInst, vd, vm, index); 17807435Sgblack@eecs.umich.edu } 17817435Sgblack@eecs.umich.edu } 17827435Sgblack@eecs.umich.edu return new Unknown(machInst); 17837435Sgblack@eecs.umich.edu } 17847435Sgblack@eecs.umich.edu ''' 17857435Sgblack@eecs.umich.edu}}; 17867435Sgblack@eecs.umich.edu 17877435Sgblack@eecs.umich.edudef format ThumbNeonMem() {{ 17887435Sgblack@eecs.umich.edu decode_block = ''' 17897435Sgblack@eecs.umich.edu return decodeNeonMem(machInst); 17907435Sgblack@eecs.umich.edu ''' 17917435Sgblack@eecs.umich.edu}}; 17927435Sgblack@eecs.umich.edu 17937435Sgblack@eecs.umich.edudef format ThumbNeonData() {{ 17947435Sgblack@eecs.umich.edu decode_block = ''' 17957639Sgblack@eecs.umich.edu return decodeNeonData(machInst); 17967435Sgblack@eecs.umich.edu ''' 17977435Sgblack@eecs.umich.edu}}; 17987435Sgblack@eecs.umich.edu 17997435Sgblack@eecs.umich.edulet {{ 18007435Sgblack@eecs.umich.edu header_output = ''' 18017435Sgblack@eecs.umich.edu StaticInstPtr 18027356Sgblack@eecs.umich.edu decodeExtensionRegLoadStore(ExtMachInst machInst); 18037356Sgblack@eecs.umich.edu ''' 18047356Sgblack@eecs.umich.edu decoder_output = ''' 18057356Sgblack@eecs.umich.edu StaticInstPtr 18067356Sgblack@eecs.umich.edu decodeExtensionRegLoadStore(ExtMachInst machInst) 18077178Sgblack@eecs.umich.edu { 18087178Sgblack@eecs.umich.edu const uint32_t opcode = bits(machInst, 24, 20); 18097178Sgblack@eecs.umich.edu const uint32_t offset = bits(machInst, 7, 0); 18107337Sgblack@eecs.umich.edu const bool single = (bits(machInst, 8) == 0); 18117178Sgblack@eecs.umich.edu const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 18127178Sgblack@eecs.umich.edu RegIndex vd; 18137178Sgblack@eecs.umich.edu if (single) { 18147178Sgblack@eecs.umich.edu vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) | 18157178Sgblack@eecs.umich.edu bits(machInst, 22)); 18167178Sgblack@eecs.umich.edu } else { 18177178Sgblack@eecs.umich.edu vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) | 18187178Sgblack@eecs.umich.edu (bits(machInst, 22) << 5)); 18197178Sgblack@eecs.umich.edu } 18207178Sgblack@eecs.umich.edu switch (bits(opcode, 4, 3)) { 18217178Sgblack@eecs.umich.edu case 0x0: 18227335Sgblack@eecs.umich.edu if (bits(opcode, 4, 1) == 0x2 && 18237335Sgblack@eecs.umich.edu !(machInst.thumb == 1 && bits(machInst, 28) == 1) && 18247335Sgblack@eecs.umich.edu !(machInst.thumb == 0 && machInst.condCode == 0xf)) { 18257335Sgblack@eecs.umich.edu if ((bits(machInst, 7, 4) & 0xd) != 1) { 18267335Sgblack@eecs.umich.edu break; 18277335Sgblack@eecs.umich.edu } 18287335Sgblack@eecs.umich.edu const IntRegIndex rt = 18297335Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 18307335Sgblack@eecs.umich.edu const IntRegIndex rt2 = 18317335Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 18327335Sgblack@eecs.umich.edu const bool op = bits(machInst, 20); 18337335Sgblack@eecs.umich.edu uint32_t vm; 18347337Sgblack@eecs.umich.edu if (single) { 18357335Sgblack@eecs.umich.edu vm = (bits(machInst, 3, 0) << 1) | bits(machInst, 5); 18367335Sgblack@eecs.umich.edu } else { 18377335Sgblack@eecs.umich.edu vm = (bits(machInst, 3, 0) << 1) | 18387335Sgblack@eecs.umich.edu (bits(machInst, 5) << 5); 18397335Sgblack@eecs.umich.edu } 18407335Sgblack@eecs.umich.edu if (op) { 18417335Sgblack@eecs.umich.edu return new Vmov2Core2Reg(machInst, rt, rt2, 18427335Sgblack@eecs.umich.edu (IntRegIndex)vm); 18437335Sgblack@eecs.umich.edu } else { 18447335Sgblack@eecs.umich.edu return new Vmov2Reg2Core(machInst, (IntRegIndex)vm, 18457335Sgblack@eecs.umich.edu rt, rt2); 18467335Sgblack@eecs.umich.edu } 18477178Sgblack@eecs.umich.edu } 18487178Sgblack@eecs.umich.edu break; 18497178Sgblack@eecs.umich.edu case 0x1: 18507413Sgblack@eecs.umich.edu { 185110037SARM gem5 Developers if (offset == 0 || vd + offset/2 > NumFloatV7ArchRegs) { 18527413Sgblack@eecs.umich.edu break; 18537413Sgblack@eecs.umich.edu } 18547413Sgblack@eecs.umich.edu switch (bits(opcode, 1, 0)) { 18557413Sgblack@eecs.umich.edu case 0x0: 18567413Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 18577413Sgblack@eecs.umich.edu true, false, false, offset); 18587413Sgblack@eecs.umich.edu case 0x1: 18597413Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 18607413Sgblack@eecs.umich.edu true, false, true, offset); 18617413Sgblack@eecs.umich.edu case 0x2: 18627413Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 18637413Sgblack@eecs.umich.edu true, true, false, offset); 18647413Sgblack@eecs.umich.edu case 0x3: 18657413Sgblack@eecs.umich.edu // If rn == sp, then this is called vpop. 18667413Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 18677413Sgblack@eecs.umich.edu true, true, true, offset); 186812595Ssiddhesh.poyarekar@gmail.com default: 186912595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 18707413Sgblack@eecs.umich.edu } 18717178Sgblack@eecs.umich.edu } 18727178Sgblack@eecs.umich.edu case 0x2: 18737178Sgblack@eecs.umich.edu if (bits(opcode, 1, 0) == 0x2) { 18747178Sgblack@eecs.umich.edu // If rn == sp, then this is called vpush. 18757178Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 18767178Sgblack@eecs.umich.edu false, true, false, offset); 18777178Sgblack@eecs.umich.edu } else if (bits(opcode, 1, 0) == 0x3) { 18787178Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 18797178Sgblack@eecs.umich.edu false, true, true, offset); 18807178Sgblack@eecs.umich.edu } 188112595Ssiddhesh.poyarekar@gmail.com M5_FALLTHROUGH; 18827178Sgblack@eecs.umich.edu case 0x3: 18837346Sgblack@eecs.umich.edu const bool up = (bits(machInst, 23) == 1); 18847346Sgblack@eecs.umich.edu const uint32_t imm = bits(machInst, 7, 0) << 2; 18857346Sgblack@eecs.umich.edu if (single) { 18867346Sgblack@eecs.umich.edu vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) | 18877346Sgblack@eecs.umich.edu (bits(machInst, 22))); 18887346Sgblack@eecs.umich.edu } else { 18897346Sgblack@eecs.umich.edu vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) | 18907346Sgblack@eecs.umich.edu (bits(machInst, 22) << 5)); 18917346Sgblack@eecs.umich.edu } 18927178Sgblack@eecs.umich.edu if (bits(opcode, 1, 0) == 0x0) { 18937346Sgblack@eecs.umich.edu if (single) { 18947346Sgblack@eecs.umich.edu if (up) { 18957346Sgblack@eecs.umich.edu return new %(vstr_us)s(machInst, vd, rn, up, imm); 18967346Sgblack@eecs.umich.edu } else { 18977346Sgblack@eecs.umich.edu return new %(vstr_s)s(machInst, vd, rn, up, imm); 18987346Sgblack@eecs.umich.edu } 18997346Sgblack@eecs.umich.edu } else { 19007346Sgblack@eecs.umich.edu if (up) { 19017346Sgblack@eecs.umich.edu return new %(vstr_ud)s(machInst, vd, vd + 1, 19027346Sgblack@eecs.umich.edu rn, up, imm); 19037346Sgblack@eecs.umich.edu } else { 19047346Sgblack@eecs.umich.edu return new %(vstr_d)s(machInst, vd, vd + 1, 19057346Sgblack@eecs.umich.edu rn, up, imm); 19067346Sgblack@eecs.umich.edu } 19077346Sgblack@eecs.umich.edu } 19087178Sgblack@eecs.umich.edu } else if (bits(opcode, 1, 0) == 0x1) { 19097337Sgblack@eecs.umich.edu if (single) { 19107337Sgblack@eecs.umich.edu if (up) { 19117337Sgblack@eecs.umich.edu return new %(vldr_us)s(machInst, vd, rn, up, imm); 19127337Sgblack@eecs.umich.edu } else { 19137337Sgblack@eecs.umich.edu return new %(vldr_s)s(machInst, vd, rn, up, imm); 19147337Sgblack@eecs.umich.edu } 19157337Sgblack@eecs.umich.edu } else { 19167337Sgblack@eecs.umich.edu if (up) { 19177337Sgblack@eecs.umich.edu return new %(vldr_ud)s(machInst, vd, vd + 1, 19187337Sgblack@eecs.umich.edu rn, up, imm); 19197337Sgblack@eecs.umich.edu } else { 19207337Sgblack@eecs.umich.edu return new %(vldr_d)s(machInst, vd, vd + 1, 19217337Sgblack@eecs.umich.edu rn, up, imm); 19227337Sgblack@eecs.umich.edu } 19237337Sgblack@eecs.umich.edu } 19247178Sgblack@eecs.umich.edu } 19257178Sgblack@eecs.umich.edu } 19267178Sgblack@eecs.umich.edu return new Unknown(machInst); 19277178Sgblack@eecs.umich.edu } 19287337Sgblack@eecs.umich.edu ''' % { 19297337Sgblack@eecs.umich.edu "vldr_us" : "VLDR_" + loadImmClassName(False, True, False), 19307337Sgblack@eecs.umich.edu "vldr_s" : "VLDR_" + loadImmClassName(False, False, False), 19317337Sgblack@eecs.umich.edu "vldr_ud" : "VLDR_" + loadDoubleImmClassName(False, True, False), 19327346Sgblack@eecs.umich.edu "vldr_d" : "VLDR_" + loadDoubleImmClassName(False, False, False), 19337346Sgblack@eecs.umich.edu "vstr_us" : "VSTR_" + storeImmClassName(False, True, False), 19347346Sgblack@eecs.umich.edu "vstr_s" : "VSTR_" + storeImmClassName(False, False, False), 19357346Sgblack@eecs.umich.edu "vstr_ud" : "VSTR_" + storeDoubleImmClassName(False, True, False), 19367346Sgblack@eecs.umich.edu "vstr_d" : "VSTR_" + storeDoubleImmClassName(False, False, False) 19377337Sgblack@eecs.umich.edu } 19387178Sgblack@eecs.umich.edu}}; 19397321Sgblack@eecs.umich.edu 19407356Sgblack@eecs.umich.edudef format ExtensionRegLoadStore() {{ 19417321Sgblack@eecs.umich.edu decode_block = ''' 19427356Sgblack@eecs.umich.edu return decodeExtensionRegLoadStore(machInst); 19437356Sgblack@eecs.umich.edu ''' 19447356Sgblack@eecs.umich.edu}}; 19457356Sgblack@eecs.umich.edu 19467356Sgblack@eecs.umich.edulet {{ 19477356Sgblack@eecs.umich.edu header_output = ''' 19487356Sgblack@eecs.umich.edu StaticInstPtr 19497356Sgblack@eecs.umich.edu decodeShortFpTransfer(ExtMachInst machInst); 19507356Sgblack@eecs.umich.edu ''' 19517356Sgblack@eecs.umich.edu decoder_output = ''' 19527356Sgblack@eecs.umich.edu StaticInstPtr 19537356Sgblack@eecs.umich.edu decodeShortFpTransfer(ExtMachInst machInst) 19547321Sgblack@eecs.umich.edu { 19557321Sgblack@eecs.umich.edu const uint32_t l = bits(machInst, 20); 19567321Sgblack@eecs.umich.edu const uint32_t c = bits(machInst, 8); 19577321Sgblack@eecs.umich.edu const uint32_t a = bits(machInst, 23, 21); 19587321Sgblack@eecs.umich.edu const uint32_t b = bits(machInst, 6, 5); 19597321Sgblack@eecs.umich.edu if ((machInst.thumb == 1 && bits(machInst, 28) == 1) || 19607321Sgblack@eecs.umich.edu (machInst.thumb == 0 && machInst.condCode == 0xf)) { 196111671Smitch.hayenga@arm.com // Determine if this is backported aarch64 FP instruction 196211671Smitch.hayenga@arm.com const bool b31_b24 = bits(machInst, 31, 24) == 0xFE; 196311671Smitch.hayenga@arm.com const bool b23 = bits(machInst, 23); 196411671Smitch.hayenga@arm.com const bool b21_b18 = bits(machInst, 21, 18) == 0xE; 196511671Smitch.hayenga@arm.com const bool b11_b9 = bits(machInst, 11, 9) == 0x5; 196611671Smitch.hayenga@arm.com const bool sz = bits(machInst, 8); 196711671Smitch.hayenga@arm.com const bool b7_b6 = bits(machInst, 7, 6) == 0x1; 196811671Smitch.hayenga@arm.com const bool b6 = bits(machInst, 6) == 0x0; 196911671Smitch.hayenga@arm.com const bool b4 = bits(machInst, 4) == 0x0; 197011671Smitch.hayenga@arm.com if (b31_b24 && b23 && b21_b18 && b11_b9 && b7_b6 && b4) { 197111671Smitch.hayenga@arm.com // VINT* Integer Rounding Instructon 197211671Smitch.hayenga@arm.com const uint32_t rm = bits(machInst, 17, 16); 197311671Smitch.hayenga@arm.com 197411671Smitch.hayenga@arm.com if (sz) { 197511671Smitch.hayenga@arm.com const IntRegIndex vd = 197611671Smitch.hayenga@arm.com (IntRegIndex)((bits(machInst, 22) << 5) | 197711671Smitch.hayenga@arm.com (bits(machInst, 15, 12) << 1)); 197811671Smitch.hayenga@arm.com const IntRegIndex vm = 197911671Smitch.hayenga@arm.com (IntRegIndex)((bits(machInst, 5) << 5) | 198011671Smitch.hayenga@arm.com (bits(machInst, 3, 0) << 1)); 198111671Smitch.hayenga@arm.com switch(rm) { 198211671Smitch.hayenga@arm.com case 0x0: 198311671Smitch.hayenga@arm.com return decodeVfpRegRegOp<VRIntAD>(machInst, vd, vm, 198411671Smitch.hayenga@arm.com true); 198511671Smitch.hayenga@arm.com case 0x1: 198611671Smitch.hayenga@arm.com return decodeVfpRegRegOp<VRIntND>(machInst, vd, vm, 198711671Smitch.hayenga@arm.com true); 198811671Smitch.hayenga@arm.com case 0x2: 198911671Smitch.hayenga@arm.com return decodeVfpRegRegOp<VRIntPD>(machInst, vd, vm, 199011671Smitch.hayenga@arm.com true); 199111671Smitch.hayenga@arm.com case 0x3: 199211671Smitch.hayenga@arm.com return decodeVfpRegRegOp<VRIntMD>(machInst, vd, vm, 199311671Smitch.hayenga@arm.com true); 199411671Smitch.hayenga@arm.com default: return new Unknown(machInst); 199511671Smitch.hayenga@arm.com } 199611671Smitch.hayenga@arm.com } else { 199711671Smitch.hayenga@arm.com const IntRegIndex vd = 199811671Smitch.hayenga@arm.com (IntRegIndex)(bits(machInst, 22) | 199911671Smitch.hayenga@arm.com (bits(machInst, 15, 12) << 1)); 200011671Smitch.hayenga@arm.com const IntRegIndex vm = 200111671Smitch.hayenga@arm.com (IntRegIndex)(bits(machInst, 5) | 200211671Smitch.hayenga@arm.com (bits(machInst, 3, 0) << 1)); 200311671Smitch.hayenga@arm.com switch(rm) { 200411671Smitch.hayenga@arm.com case 0x0: 200511671Smitch.hayenga@arm.com return decodeVfpRegRegOp<VRIntAS>(machInst, vd, vm, 200611671Smitch.hayenga@arm.com false); 200711671Smitch.hayenga@arm.com case 0x1: 200811671Smitch.hayenga@arm.com return decodeVfpRegRegOp<VRIntNS>(machInst, vd, vm, 200911671Smitch.hayenga@arm.com false); 201011671Smitch.hayenga@arm.com case 0x2: 201111671Smitch.hayenga@arm.com return decodeVfpRegRegOp<VRIntPS>(machInst, vd, vm, 201211671Smitch.hayenga@arm.com false); 201311671Smitch.hayenga@arm.com case 0x3: 201411671Smitch.hayenga@arm.com return decodeVfpRegRegOp<VRIntMS>(machInst, vd, vm, 201511671Smitch.hayenga@arm.com false); 201611671Smitch.hayenga@arm.com default: return new Unknown(machInst); 201711671Smitch.hayenga@arm.com } 201811671Smitch.hayenga@arm.com } 201911671Smitch.hayenga@arm.com } else if (b31_b24 && !b23 && b11_b9 && b6 && b4){ 202011671Smitch.hayenga@arm.com // VSEL* floating point conditional select 202111671Smitch.hayenga@arm.com 202211671Smitch.hayenga@arm.com ConditionCode cond; 202311671Smitch.hayenga@arm.com switch(bits(machInst, 21, 20)) { 202411671Smitch.hayenga@arm.com case 0x0: cond = COND_EQ; break; 202511671Smitch.hayenga@arm.com case 0x1: cond = COND_VS; break; 202611671Smitch.hayenga@arm.com case 0x2: cond = COND_GE; break; 202711671Smitch.hayenga@arm.com case 0x3: cond = COND_GT; break; 202811671Smitch.hayenga@arm.com } 202911671Smitch.hayenga@arm.com 203011671Smitch.hayenga@arm.com if (sz) { 203111671Smitch.hayenga@arm.com const IntRegIndex vd = 203211671Smitch.hayenga@arm.com (IntRegIndex)((bits(machInst, 22) << 5) | 203311671Smitch.hayenga@arm.com (bits(machInst, 15, 12) << 1)); 203411671Smitch.hayenga@arm.com const IntRegIndex vm = 203511671Smitch.hayenga@arm.com (IntRegIndex)((bits(machInst, 5) << 5) | 203611671Smitch.hayenga@arm.com (bits(machInst, 3, 0) << 1)); 203711671Smitch.hayenga@arm.com const IntRegIndex vn = 203811671Smitch.hayenga@arm.com (IntRegIndex)((bits(machInst, 7) << 5) | 203911671Smitch.hayenga@arm.com (bits(machInst, 19, 16) << 1)); 204011671Smitch.hayenga@arm.com return new VselD(machInst, vd, vn, vm, cond); 204111671Smitch.hayenga@arm.com } else { 204211671Smitch.hayenga@arm.com const IntRegIndex vd = 204311671Smitch.hayenga@arm.com (IntRegIndex)(bits(machInst, 22) | 204411671Smitch.hayenga@arm.com (bits(machInst, 15, 12) << 1)); 204511671Smitch.hayenga@arm.com const IntRegIndex vm = 204611671Smitch.hayenga@arm.com (IntRegIndex)(bits(machInst, 5) | 204711671Smitch.hayenga@arm.com (bits(machInst, 3, 0) << 1)); 204811671Smitch.hayenga@arm.com const IntRegIndex vn = 204911671Smitch.hayenga@arm.com (IntRegIndex)((bits(machInst, 19, 16) << 1) | 205011671Smitch.hayenga@arm.com bits(machInst, 7)); 205111671Smitch.hayenga@arm.com return new VselS(machInst, vd, vn, vm, cond); 205211671Smitch.hayenga@arm.com } 205311671Smitch.hayenga@arm.com } else { 205411671Smitch.hayenga@arm.com return new Unknown(machInst); 205511671Smitch.hayenga@arm.com } 20567321Sgblack@eecs.umich.edu } 20577321Sgblack@eecs.umich.edu if (l == 0 && c == 0) { 20587321Sgblack@eecs.umich.edu if (a == 0) { 20597335Sgblack@eecs.umich.edu const uint32_t vn = (bits(machInst, 19, 16) << 1) | 20607335Sgblack@eecs.umich.edu bits(machInst, 7); 20617335Sgblack@eecs.umich.edu const IntRegIndex rt = 20627335Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 20637335Sgblack@eecs.umich.edu if (bits(machInst, 20) == 1) { 20647335Sgblack@eecs.umich.edu return new VmovRegCoreW(machInst, rt, (IntRegIndex)vn); 20657335Sgblack@eecs.umich.edu } else { 20667335Sgblack@eecs.umich.edu return new VmovCoreRegW(machInst, (IntRegIndex)vn, rt); 20677335Sgblack@eecs.umich.edu } 20687321Sgblack@eecs.umich.edu } else if (a == 0x7) { 20697323Sgblack@eecs.umich.edu const IntRegIndex rt = 20707323Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 207110037SARM gem5 Developers uint32_t reg = bits(machInst, 19, 16); 207210037SARM gem5 Developers uint32_t specReg; 207310037SARM gem5 Developers switch (reg) { 20747323Sgblack@eecs.umich.edu case 0: 20757323Sgblack@eecs.umich.edu specReg = MISCREG_FPSID; 20767323Sgblack@eecs.umich.edu break; 20777323Sgblack@eecs.umich.edu case 1: 20787323Sgblack@eecs.umich.edu specReg = MISCREG_FPSCR; 20797323Sgblack@eecs.umich.edu break; 20807394Sgblack@eecs.umich.edu case 6: 20817394Sgblack@eecs.umich.edu specReg = MISCREG_MVFR1; 20827394Sgblack@eecs.umich.edu break; 20837394Sgblack@eecs.umich.edu case 7: 20847394Sgblack@eecs.umich.edu specReg = MISCREG_MVFR0; 20857394Sgblack@eecs.umich.edu break; 20867323Sgblack@eecs.umich.edu case 8: 20877323Sgblack@eecs.umich.edu specReg = MISCREG_FPEXC; 20887323Sgblack@eecs.umich.edu break; 20897323Sgblack@eecs.umich.edu default: 20907323Sgblack@eecs.umich.edu return new Unknown(machInst); 20917323Sgblack@eecs.umich.edu } 20927643Sgblack@eecs.umich.edu if (specReg == MISCREG_FPSCR) { 20937643Sgblack@eecs.umich.edu return new VmsrFpscr(machInst, (IntRegIndex)specReg, rt); 20947643Sgblack@eecs.umich.edu } else { 209510037SARM gem5 Developers uint32_t iss = mcrMrcIssBuild(0, bits(machInst, 3, 0), rt, 209610037SARM gem5 Developers reg, a, bits(machInst, 7, 5)); 209710037SARM gem5 Developers return new Vmsr(machInst, (IntRegIndex)specReg, rt, iss); 20987643Sgblack@eecs.umich.edu } 20997321Sgblack@eecs.umich.edu } 21007321Sgblack@eecs.umich.edu } else if (l == 0 && c == 1) { 21017321Sgblack@eecs.umich.edu if (bits(a, 2) == 0) { 21027335Sgblack@eecs.umich.edu uint32_t vd = (bits(machInst, 7) << 5) | 21037335Sgblack@eecs.umich.edu (bits(machInst, 19, 16) << 1); 21047639Sgblack@eecs.umich.edu // Handle accessing each single precision half of the vector. 21057639Sgblack@eecs.umich.edu vd += bits(machInst, 21); 21067335Sgblack@eecs.umich.edu const IntRegIndex rt = 21077335Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 21087335Sgblack@eecs.umich.edu if (bits(machInst, 22) == 1) { 21097639Sgblack@eecs.umich.edu return new VmovCoreRegB(machInst, (IntRegIndex)vd, 21107639Sgblack@eecs.umich.edu rt, bits(machInst, 6, 5)); 21117335Sgblack@eecs.umich.edu } else if (bits(machInst, 5) == 1) { 21127639Sgblack@eecs.umich.edu return new VmovCoreRegH(machInst, (IntRegIndex)vd, 21137639Sgblack@eecs.umich.edu rt, bits(machInst, 6)); 21147335Sgblack@eecs.umich.edu } else if (bits(machInst, 6) == 0) { 21157639Sgblack@eecs.umich.edu return new VmovCoreRegW(machInst, (IntRegIndex)vd, rt); 21167335Sgblack@eecs.umich.edu } else { 21177335Sgblack@eecs.umich.edu return new Unknown(machInst); 21187335Sgblack@eecs.umich.edu } 21197639Sgblack@eecs.umich.edu } else if (bits(b, 1) == 0) { 21207639Sgblack@eecs.umich.edu bool q = bits(machInst, 21); 21217639Sgblack@eecs.umich.edu unsigned be = (bits(machInst, 22) << 1) | (bits(machInst, 5)); 21227639Sgblack@eecs.umich.edu IntRegIndex vd = (IntRegIndex)(2 * (uint32_t) 21237639Sgblack@eecs.umich.edu (bits(machInst, 19, 16) | (bits(machInst, 7) << 4))); 21247639Sgblack@eecs.umich.edu IntRegIndex rt = (IntRegIndex)(uint32_t) 21257639Sgblack@eecs.umich.edu bits(machInst, 15, 12); 21267639Sgblack@eecs.umich.edu if (q) { 21277639Sgblack@eecs.umich.edu switch (be) { 21287639Sgblack@eecs.umich.edu case 0: 21297639Sgblack@eecs.umich.edu return new NVdupQGpr<uint32_t>(machInst, vd, rt); 21307639Sgblack@eecs.umich.edu case 1: 21317639Sgblack@eecs.umich.edu return new NVdupQGpr<uint16_t>(machInst, vd, rt); 21327639Sgblack@eecs.umich.edu case 2: 21337639Sgblack@eecs.umich.edu return new NVdupQGpr<uint8_t>(machInst, vd, rt); 21347639Sgblack@eecs.umich.edu case 3: 21357639Sgblack@eecs.umich.edu return new Unknown(machInst); 21367639Sgblack@eecs.umich.edu } 21377639Sgblack@eecs.umich.edu } else { 21387639Sgblack@eecs.umich.edu switch (be) { 21397639Sgblack@eecs.umich.edu case 0: 21407639Sgblack@eecs.umich.edu return new NVdupDGpr<uint32_t>(machInst, vd, rt); 21417639Sgblack@eecs.umich.edu case 1: 21427639Sgblack@eecs.umich.edu return new NVdupDGpr<uint16_t>(machInst, vd, rt); 21437639Sgblack@eecs.umich.edu case 2: 21447639Sgblack@eecs.umich.edu return new NVdupDGpr<uint8_t>(machInst, vd, rt); 21457639Sgblack@eecs.umich.edu case 3: 21467639Sgblack@eecs.umich.edu return new Unknown(machInst); 21477639Sgblack@eecs.umich.edu } 21487335Sgblack@eecs.umich.edu } 21497321Sgblack@eecs.umich.edu } 21507321Sgblack@eecs.umich.edu } else if (l == 1 && c == 0) { 21517321Sgblack@eecs.umich.edu if (a == 0) { 21527335Sgblack@eecs.umich.edu const uint32_t vn = (bits(machInst, 19, 16) << 1) | 21537335Sgblack@eecs.umich.edu bits(machInst, 7); 21547335Sgblack@eecs.umich.edu const IntRegIndex rt = 21557335Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 21567335Sgblack@eecs.umich.edu if (bits(machInst, 20) == 1) { 21577335Sgblack@eecs.umich.edu return new VmovRegCoreW(machInst, rt, (IntRegIndex)vn); 21587335Sgblack@eecs.umich.edu } else { 21597335Sgblack@eecs.umich.edu return new VmovCoreRegW(machInst, (IntRegIndex)vn, rt); 21607335Sgblack@eecs.umich.edu } 21617321Sgblack@eecs.umich.edu } else if (a == 7) { 21627326Sgblack@eecs.umich.edu const IntRegIndex rt = 21637326Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 216410037SARM gem5 Developers uint32_t reg = bits(machInst, 19, 16); 216510037SARM gem5 Developers uint32_t specReg; 216610037SARM gem5 Developers switch (reg) { 21677326Sgblack@eecs.umich.edu case 0: 21687326Sgblack@eecs.umich.edu specReg = MISCREG_FPSID; 21697326Sgblack@eecs.umich.edu break; 21707326Sgblack@eecs.umich.edu case 1: 21717326Sgblack@eecs.umich.edu specReg = MISCREG_FPSCR; 21727326Sgblack@eecs.umich.edu break; 21737326Sgblack@eecs.umich.edu case 6: 21747326Sgblack@eecs.umich.edu specReg = MISCREG_MVFR1; 21757326Sgblack@eecs.umich.edu break; 21767326Sgblack@eecs.umich.edu case 7: 21777326Sgblack@eecs.umich.edu specReg = MISCREG_MVFR0; 21787326Sgblack@eecs.umich.edu break; 21797326Sgblack@eecs.umich.edu case 8: 21807326Sgblack@eecs.umich.edu specReg = MISCREG_FPEXC; 21817326Sgblack@eecs.umich.edu break; 21827326Sgblack@eecs.umich.edu default: 21837326Sgblack@eecs.umich.edu return new Unknown(machInst); 21847326Sgblack@eecs.umich.edu } 21857392Sgblack@eecs.umich.edu if (rt == 0xf) { 21867643Sgblack@eecs.umich.edu if (specReg == MISCREG_FPSCR) { 21878303SAli.Saidi@ARM.com return new VmrsApsrFpscr(machInst); 21887643Sgblack@eecs.umich.edu } else { 21898301SAli.Saidi@ARM.com return new Unknown(machInst); 21907643Sgblack@eecs.umich.edu } 21917643Sgblack@eecs.umich.edu } else if (specReg == MISCREG_FPSCR) { 21927643Sgblack@eecs.umich.edu return new VmrsFpscr(machInst, rt, (IntRegIndex)specReg); 21937392Sgblack@eecs.umich.edu } else { 219410037SARM gem5 Developers uint32_t iss = mcrMrcIssBuild(l, bits(machInst, 3, 0), rt, 219510037SARM gem5 Developers reg, a, bits(machInst, 7, 5)); 219610037SARM gem5 Developers return new Vmrs(machInst, rt, (IntRegIndex)specReg, iss); 21977392Sgblack@eecs.umich.edu } 21987321Sgblack@eecs.umich.edu } 21997321Sgblack@eecs.umich.edu } else { 22007335Sgblack@eecs.umich.edu uint32_t vd = (bits(machInst, 7) << 5) | 22017335Sgblack@eecs.umich.edu (bits(machInst, 19, 16) << 1); 22027639Sgblack@eecs.umich.edu // Handle indexing into each single precision half of the vector. 22037639Sgblack@eecs.umich.edu vd += bits(machInst, 21); 22047639Sgblack@eecs.umich.edu uint32_t index; 22057335Sgblack@eecs.umich.edu const IntRegIndex rt = 22067335Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 22077335Sgblack@eecs.umich.edu const bool u = (bits(machInst, 23) == 1); 22087335Sgblack@eecs.umich.edu if (bits(machInst, 22) == 1) { 22097639Sgblack@eecs.umich.edu index = bits(machInst, 6, 5); 22107335Sgblack@eecs.umich.edu if (u) { 22117335Sgblack@eecs.umich.edu return new VmovRegCoreUB(machInst, rt, 22127335Sgblack@eecs.umich.edu (IntRegIndex)vd, index); 22137335Sgblack@eecs.umich.edu } else { 22147335Sgblack@eecs.umich.edu return new VmovRegCoreSB(machInst, rt, 22157335Sgblack@eecs.umich.edu (IntRegIndex)vd, index); 22167335Sgblack@eecs.umich.edu } 22177639Sgblack@eecs.umich.edu } else if (bits(machInst, 5) == 1) { 22187639Sgblack@eecs.umich.edu index = bits(machInst, 6); 22197335Sgblack@eecs.umich.edu if (u) { 22207335Sgblack@eecs.umich.edu return new VmovRegCoreUH(machInst, rt, 22217335Sgblack@eecs.umich.edu (IntRegIndex)vd, index); 22227335Sgblack@eecs.umich.edu } else { 22237335Sgblack@eecs.umich.edu return new VmovRegCoreSH(machInst, rt, 22247335Sgblack@eecs.umich.edu (IntRegIndex)vd, index); 22257335Sgblack@eecs.umich.edu } 22267639Sgblack@eecs.umich.edu } else if (bits(machInst, 6) == 0 && !u) { 22277335Sgblack@eecs.umich.edu return new VmovRegCoreW(machInst, rt, (IntRegIndex)vd); 22287639Sgblack@eecs.umich.edu } else { 22297639Sgblack@eecs.umich.edu return new Unknown(machInst); 22307335Sgblack@eecs.umich.edu } 22317321Sgblack@eecs.umich.edu } 22327321Sgblack@eecs.umich.edu return new Unknown(machInst); 22337321Sgblack@eecs.umich.edu } 22347321Sgblack@eecs.umich.edu ''' 22357321Sgblack@eecs.umich.edu}}; 22367356Sgblack@eecs.umich.edu 22377356Sgblack@eecs.umich.edudef format ShortFpTransfer() {{ 22387356Sgblack@eecs.umich.edu decode_block = ''' 22397356Sgblack@eecs.umich.edu return decodeShortFpTransfer(machInst); 22407356Sgblack@eecs.umich.edu ''' 22417356Sgblack@eecs.umich.edu}}; 22427363Sgblack@eecs.umich.edu 22437363Sgblack@eecs.umich.edulet {{ 22447363Sgblack@eecs.umich.edu header_output = ''' 22457363Sgblack@eecs.umich.edu StaticInstPtr 22467363Sgblack@eecs.umich.edu decodeVfpData(ExtMachInst machInst); 22477363Sgblack@eecs.umich.edu ''' 22487363Sgblack@eecs.umich.edu decoder_output = ''' 22497363Sgblack@eecs.umich.edu StaticInstPtr 22507363Sgblack@eecs.umich.edu decodeVfpData(ExtMachInst machInst) 22517363Sgblack@eecs.umich.edu { 22527363Sgblack@eecs.umich.edu const uint32_t opc1 = bits(machInst, 23, 20); 22537363Sgblack@eecs.umich.edu const uint32_t opc2 = bits(machInst, 19, 16); 22547363Sgblack@eecs.umich.edu const uint32_t opc3 = bits(machInst, 7, 6); 22557363Sgblack@eecs.umich.edu //const uint32_t opc4 = bits(machInst, 3, 0); 22567372Sgblack@eecs.umich.edu const bool single = (bits(machInst, 8) == 0); 22577389Sgblack@eecs.umich.edu // Used to select between vcmp and vcmpe. 22587389Sgblack@eecs.umich.edu const bool e = (bits(machInst, 7) == 1); 22597372Sgblack@eecs.umich.edu IntRegIndex vd; 22607372Sgblack@eecs.umich.edu IntRegIndex vm; 22617372Sgblack@eecs.umich.edu IntRegIndex vn; 22627372Sgblack@eecs.umich.edu if (single) { 22637372Sgblack@eecs.umich.edu vd = (IntRegIndex)(bits(machInst, 22) | 22647372Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 22657372Sgblack@eecs.umich.edu vm = (IntRegIndex)(bits(machInst, 5) | 22667372Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1)); 22677372Sgblack@eecs.umich.edu vn = (IntRegIndex)(bits(machInst, 7) | 22687372Sgblack@eecs.umich.edu (bits(machInst, 19, 16) << 1)); 22697372Sgblack@eecs.umich.edu } else { 22707372Sgblack@eecs.umich.edu vd = (IntRegIndex)((bits(machInst, 22) << 5) | 22717372Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 22727372Sgblack@eecs.umich.edu vm = (IntRegIndex)((bits(machInst, 5) << 5) | 22737372Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1)); 22747372Sgblack@eecs.umich.edu vn = (IntRegIndex)((bits(machInst, 7) << 5) | 22757372Sgblack@eecs.umich.edu (bits(machInst, 19, 16) << 1)); 22767372Sgblack@eecs.umich.edu } 22777363Sgblack@eecs.umich.edu switch (opc1 & 0xb /* 1011 */) { 22787363Sgblack@eecs.umich.edu case 0x0: 22797370Sgblack@eecs.umich.edu if (bits(machInst, 6) == 0) { 22807372Sgblack@eecs.umich.edu if (single) { 22817376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VmlaS>( 22827376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 22837370Sgblack@eecs.umich.edu } else { 22847376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VmlaD>( 22857376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 22867370Sgblack@eecs.umich.edu } 22877370Sgblack@eecs.umich.edu } else { 22887372Sgblack@eecs.umich.edu if (single) { 22897376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VmlsS>( 22907376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 22917370Sgblack@eecs.umich.edu } else { 22927376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VmlsD>( 22937376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 22947370Sgblack@eecs.umich.edu } 22957370Sgblack@eecs.umich.edu } 22967371Sgblack@eecs.umich.edu case 0x1: 22977371Sgblack@eecs.umich.edu if (bits(machInst, 6) == 1) { 22987372Sgblack@eecs.umich.edu if (single) { 22997376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VnmlaS>( 23007376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 23017371Sgblack@eecs.umich.edu } else { 23027376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VnmlaD>( 23037376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 23047371Sgblack@eecs.umich.edu } 23057371Sgblack@eecs.umich.edu } else { 23067372Sgblack@eecs.umich.edu if (single) { 23077376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VnmlsS>( 23087376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 23097371Sgblack@eecs.umich.edu } else { 23107376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VnmlsD>( 23117376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 23127371Sgblack@eecs.umich.edu } 23137371Sgblack@eecs.umich.edu } 23147363Sgblack@eecs.umich.edu case 0x2: 23157363Sgblack@eecs.umich.edu if ((opc3 & 0x1) == 0) { 23167372Sgblack@eecs.umich.edu if (single) { 23177376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VmulS>( 23187376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 23197364Sgblack@eecs.umich.edu } else { 23207376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VmulD>( 23217376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 23227364Sgblack@eecs.umich.edu } 23237371Sgblack@eecs.umich.edu } else { 23247372Sgblack@eecs.umich.edu if (single) { 23257376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VnmulS>( 23267376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 23277371Sgblack@eecs.umich.edu } else { 23287376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VnmulD>( 23297376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 23307371Sgblack@eecs.umich.edu } 23317363Sgblack@eecs.umich.edu } 23327363Sgblack@eecs.umich.edu case 0x3: 23337363Sgblack@eecs.umich.edu if ((opc3 & 0x1) == 0) { 23347372Sgblack@eecs.umich.edu if (single) { 23357376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VaddS>( 23367376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 23377367Sgblack@eecs.umich.edu } else { 23387376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VaddD>( 23397376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 23407367Sgblack@eecs.umich.edu } 23417363Sgblack@eecs.umich.edu } else { 23427372Sgblack@eecs.umich.edu if (single) { 23437376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VsubS>( 23447376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 23457368Sgblack@eecs.umich.edu } else { 23467376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VsubD>( 23477376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 23487368Sgblack@eecs.umich.edu } 23497363Sgblack@eecs.umich.edu } 23507363Sgblack@eecs.umich.edu case 0x8: 23517363Sgblack@eecs.umich.edu if ((opc3 & 0x1) == 0) { 23527372Sgblack@eecs.umich.edu if (single) { 23537376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VdivS>( 23547376Sgblack@eecs.umich.edu machInst, vd, vn, vm, false); 23557369Sgblack@eecs.umich.edu } else { 23567376Sgblack@eecs.umich.edu return decodeVfpRegRegRegOp<VdivD>( 23577376Sgblack@eecs.umich.edu machInst, vd, vn, vm, true); 23587369Sgblack@eecs.umich.edu } 23597363Sgblack@eecs.umich.edu } 23607363Sgblack@eecs.umich.edu break; 236110037SARM gem5 Developers case 0x9: 236210037SARM gem5 Developers if ((opc3 & 0x1) == 0) { 236310037SARM gem5 Developers if (single) { 236410037SARM gem5 Developers return decodeVfpRegRegRegOp<VfnmaS>( 236510037SARM gem5 Developers machInst, vd, vn, vm, false); 236610037SARM gem5 Developers } else { 236710037SARM gem5 Developers return decodeVfpRegRegRegOp<VfnmaD>( 236810037SARM gem5 Developers machInst, vd, vn, vm, true); 236910037SARM gem5 Developers } 237010037SARM gem5 Developers } else { 237110037SARM gem5 Developers if (single) { 237210037SARM gem5 Developers return decodeVfpRegRegRegOp<VfnmsS>( 237310037SARM gem5 Developers machInst, vd, vn, vm, false); 237410037SARM gem5 Developers } else { 237510037SARM gem5 Developers return decodeVfpRegRegRegOp<VfnmsD>( 237610037SARM gem5 Developers machInst, vd, vn, vm, true); 237710037SARM gem5 Developers } 237810037SARM gem5 Developers } 237910037SARM gem5 Developers break; 238010037SARM gem5 Developers case 0xa: 238110037SARM gem5 Developers if ((opc3 & 0x1) == 0) { 238210037SARM gem5 Developers if (single) { 238310037SARM gem5 Developers return decodeVfpRegRegRegOp<VfmaS>( 238410037SARM gem5 Developers machInst, vd, vn, vm, false); 238510037SARM gem5 Developers } else { 238610037SARM gem5 Developers return decodeVfpRegRegRegOp<VfmaD>( 238710037SARM gem5 Developers machInst, vd, vn, vm, true); 238810037SARM gem5 Developers } 238910037SARM gem5 Developers } else { 239010037SARM gem5 Developers if (single) { 239110037SARM gem5 Developers return decodeVfpRegRegRegOp<VfmsS>( 239210037SARM gem5 Developers machInst, vd, vn, vm, false); 239310037SARM gem5 Developers } else { 239410037SARM gem5 Developers return decodeVfpRegRegRegOp<VfmsD>( 239510037SARM gem5 Developers machInst, vd, vn, vm, true); 239610037SARM gem5 Developers } 239710037SARM gem5 Developers } 239810037SARM gem5 Developers break; 23997363Sgblack@eecs.umich.edu case 0xb: 24007363Sgblack@eecs.umich.edu if ((opc3 & 0x1) == 0) { 24017363Sgblack@eecs.umich.edu const uint32_t baseImm = 24027363Sgblack@eecs.umich.edu bits(machInst, 3, 0) | (bits(machInst, 19, 16) << 4); 24037372Sgblack@eecs.umich.edu if (single) { 24047363Sgblack@eecs.umich.edu uint32_t imm = vfp_modified_imm(baseImm, false); 24057376Sgblack@eecs.umich.edu return decodeVfpRegImmOp<VmovImmS>( 24067376Sgblack@eecs.umich.edu machInst, vd, imm, false); 24077363Sgblack@eecs.umich.edu } else { 24087363Sgblack@eecs.umich.edu uint64_t imm = vfp_modified_imm(baseImm, true); 24097376Sgblack@eecs.umich.edu return decodeVfpRegImmOp<VmovImmD>( 24107376Sgblack@eecs.umich.edu machInst, vd, imm, true); 24117363Sgblack@eecs.umich.edu } 24127363Sgblack@eecs.umich.edu } 24137363Sgblack@eecs.umich.edu switch (opc2) { 24147363Sgblack@eecs.umich.edu case 0x0: 24157363Sgblack@eecs.umich.edu if (opc3 == 1) { 24167372Sgblack@eecs.umich.edu if (single) { 24177376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VmovRegS>( 24187376Sgblack@eecs.umich.edu machInst, vd, vm, false); 24197363Sgblack@eecs.umich.edu } else { 24207376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VmovRegD>( 24217376Sgblack@eecs.umich.edu machInst, vd, vm, true); 24227363Sgblack@eecs.umich.edu } 24237363Sgblack@eecs.umich.edu } else { 24247372Sgblack@eecs.umich.edu if (single) { 24257376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VabsS>( 24267376Sgblack@eecs.umich.edu machInst, vd, vm, false); 24277366Sgblack@eecs.umich.edu } else { 24287376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VabsD>( 24297376Sgblack@eecs.umich.edu machInst, vd, vm, true); 24307366Sgblack@eecs.umich.edu } 24317363Sgblack@eecs.umich.edu } 24327363Sgblack@eecs.umich.edu case 0x1: 24337363Sgblack@eecs.umich.edu if (opc3 == 1) { 24347372Sgblack@eecs.umich.edu if (single) { 24357376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VnegS>( 24367376Sgblack@eecs.umich.edu machInst, vd, vm, false); 24377365Sgblack@eecs.umich.edu } else { 24387376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VnegD>( 24397376Sgblack@eecs.umich.edu machInst, vd, vm, true); 24407365Sgblack@eecs.umich.edu } 24417363Sgblack@eecs.umich.edu } else { 24427372Sgblack@eecs.umich.edu if (single) { 24437376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VsqrtS>( 24447376Sgblack@eecs.umich.edu machInst, vd, vm, false); 24457369Sgblack@eecs.umich.edu } else { 24467376Sgblack@eecs.umich.edu return decodeVfpRegRegOp<VsqrtD>( 24477376Sgblack@eecs.umich.edu machInst, vd, vm, true); 24487369Sgblack@eecs.umich.edu } 24497363Sgblack@eecs.umich.edu } 24507363Sgblack@eecs.umich.edu case 0x2: 24517363Sgblack@eecs.umich.edu case 0x3: 24527398Sgblack@eecs.umich.edu { 24537398Sgblack@eecs.umich.edu const bool toHalf = bits(machInst, 16); 24547398Sgblack@eecs.umich.edu const bool top = bits(machInst, 7); 24557398Sgblack@eecs.umich.edu if (top) { 24567398Sgblack@eecs.umich.edu if (toHalf) { 24577398Sgblack@eecs.umich.edu return new VcvtFpSFpHT(machInst, vd, vm); 24587398Sgblack@eecs.umich.edu } else { 24597398Sgblack@eecs.umich.edu return new VcvtFpHTFpS(machInst, vd, vm); 24607398Sgblack@eecs.umich.edu } 24617398Sgblack@eecs.umich.edu } else { 24627398Sgblack@eecs.umich.edu if (toHalf) { 24637398Sgblack@eecs.umich.edu return new VcvtFpSFpHB(machInst, vd, vm); 24647398Sgblack@eecs.umich.edu } else { 24657398Sgblack@eecs.umich.edu return new VcvtFpHBFpS(machInst, vd, vm); 24667398Sgblack@eecs.umich.edu } 24677398Sgblack@eecs.umich.edu } 24687398Sgblack@eecs.umich.edu } 24697363Sgblack@eecs.umich.edu case 0x4: 24707377Sgblack@eecs.umich.edu if (single) { 24717389Sgblack@eecs.umich.edu if (e) { 24727389Sgblack@eecs.umich.edu return new VcmpeS(machInst, vd, vm); 24737389Sgblack@eecs.umich.edu } else { 24747389Sgblack@eecs.umich.edu return new VcmpS(machInst, vd, vm); 24757389Sgblack@eecs.umich.edu } 24767377Sgblack@eecs.umich.edu } else { 24777389Sgblack@eecs.umich.edu if (e) { 24787389Sgblack@eecs.umich.edu return new VcmpeD(machInst, vd, vm); 24797389Sgblack@eecs.umich.edu } else { 24807389Sgblack@eecs.umich.edu return new VcmpD(machInst, vd, vm); 24817389Sgblack@eecs.umich.edu } 24827377Sgblack@eecs.umich.edu } 24837363Sgblack@eecs.umich.edu case 0x5: 24847377Sgblack@eecs.umich.edu if (single) { 24857389Sgblack@eecs.umich.edu if (e) { 24867389Sgblack@eecs.umich.edu return new VcmpeZeroS(machInst, vd, 0); 24877389Sgblack@eecs.umich.edu } else { 24887389Sgblack@eecs.umich.edu return new VcmpZeroS(machInst, vd, 0); 24897389Sgblack@eecs.umich.edu } 24907377Sgblack@eecs.umich.edu } else { 24917389Sgblack@eecs.umich.edu if (e) { 24927389Sgblack@eecs.umich.edu return new VcmpeZeroD(machInst, vd, 0); 24937389Sgblack@eecs.umich.edu } else { 24947389Sgblack@eecs.umich.edu return new VcmpZeroD(machInst, vd, 0); 24957389Sgblack@eecs.umich.edu } 24967377Sgblack@eecs.umich.edu } 24977363Sgblack@eecs.umich.edu case 0x7: 24987363Sgblack@eecs.umich.edu if (opc3 == 0x3) { 24997374Sgblack@eecs.umich.edu if (single) { 25008270SAli.Saidi@ARM.com vd = (IntRegIndex)((bits(machInst, 22) << 5) | 25018270SAli.Saidi@ARM.com (bits(machInst, 15, 12) << 1)); 25027374Sgblack@eecs.umich.edu return new VcvtFpSFpD(machInst, vd, vm); 25037374Sgblack@eecs.umich.edu } else { 25047374Sgblack@eecs.umich.edu vd = (IntRegIndex)(bits(machInst, 22) | 25057374Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 25067374Sgblack@eecs.umich.edu return new VcvtFpDFpS(machInst, vd, vm); 25077374Sgblack@eecs.umich.edu } 25087363Sgblack@eecs.umich.edu } 25097363Sgblack@eecs.umich.edu break; 25107363Sgblack@eecs.umich.edu case 0x8: 25117373Sgblack@eecs.umich.edu if (bits(machInst, 7) == 0) { 25127373Sgblack@eecs.umich.edu if (single) { 25137373Sgblack@eecs.umich.edu return new VcvtUIntFpS(machInst, vd, vm); 25147373Sgblack@eecs.umich.edu } else { 25157373Sgblack@eecs.umich.edu vm = (IntRegIndex)(bits(machInst, 5) | 25167373Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1)); 25177373Sgblack@eecs.umich.edu return new VcvtUIntFpD(machInst, vd, vm); 25187373Sgblack@eecs.umich.edu } 25197373Sgblack@eecs.umich.edu } else { 25207373Sgblack@eecs.umich.edu if (single) { 25217373Sgblack@eecs.umich.edu return new VcvtSIntFpS(machInst, vd, vm); 25227373Sgblack@eecs.umich.edu } else { 25237373Sgblack@eecs.umich.edu vm = (IntRegIndex)(bits(machInst, 5) | 25247373Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1)); 25257373Sgblack@eecs.umich.edu return new VcvtSIntFpD(machInst, vd, vm); 25267373Sgblack@eecs.umich.edu } 25277373Sgblack@eecs.umich.edu } 25287363Sgblack@eecs.umich.edu case 0xa: 25297379Sgblack@eecs.umich.edu { 25307379Sgblack@eecs.umich.edu const bool half = (bits(machInst, 7) == 0); 25317379Sgblack@eecs.umich.edu const uint32_t imm = bits(machInst, 5) | 25327379Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1); 25337379Sgblack@eecs.umich.edu const uint32_t size = 25347379Sgblack@eecs.umich.edu (bits(machInst, 7) == 0 ? 16 : 32) - imm; 25357379Sgblack@eecs.umich.edu if (single) { 25367379Sgblack@eecs.umich.edu if (half) { 25377379Sgblack@eecs.umich.edu return new VcvtSHFixedFpS(machInst, vd, vd, size); 25387379Sgblack@eecs.umich.edu } else { 25397379Sgblack@eecs.umich.edu return new VcvtSFixedFpS(machInst, vd, vd, size); 25407379Sgblack@eecs.umich.edu } 25417379Sgblack@eecs.umich.edu } else { 25427379Sgblack@eecs.umich.edu if (half) { 25437379Sgblack@eecs.umich.edu return new VcvtSHFixedFpD(machInst, vd, vd, size); 25447379Sgblack@eecs.umich.edu } else { 25457379Sgblack@eecs.umich.edu return new VcvtSFixedFpD(machInst, vd, vd, size); 25467379Sgblack@eecs.umich.edu } 25477379Sgblack@eecs.umich.edu } 25487379Sgblack@eecs.umich.edu } 25497363Sgblack@eecs.umich.edu case 0xb: 25507379Sgblack@eecs.umich.edu { 25517379Sgblack@eecs.umich.edu const bool half = (bits(machInst, 7) == 0); 25527379Sgblack@eecs.umich.edu const uint32_t imm = bits(machInst, 5) | 25537379Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1); 25547379Sgblack@eecs.umich.edu const uint32_t size = 25557379Sgblack@eecs.umich.edu (bits(machInst, 7) == 0 ? 16 : 32) - imm; 25567379Sgblack@eecs.umich.edu if (single) { 25577379Sgblack@eecs.umich.edu if (half) { 25587379Sgblack@eecs.umich.edu return new VcvtUHFixedFpS(machInst, vd, vd, size); 25597379Sgblack@eecs.umich.edu } else { 25607379Sgblack@eecs.umich.edu return new VcvtUFixedFpS(machInst, vd, vd, size); 25617379Sgblack@eecs.umich.edu } 25627379Sgblack@eecs.umich.edu } else { 25637379Sgblack@eecs.umich.edu if (half) { 25647379Sgblack@eecs.umich.edu return new VcvtUHFixedFpD(machInst, vd, vd, size); 25657379Sgblack@eecs.umich.edu } else { 25667379Sgblack@eecs.umich.edu return new VcvtUFixedFpD(machInst, vd, vd, size); 25677379Sgblack@eecs.umich.edu } 25687379Sgblack@eecs.umich.edu } 25697379Sgblack@eecs.umich.edu } 25707363Sgblack@eecs.umich.edu case 0xc: 25717380Sgblack@eecs.umich.edu if (bits(machInst, 7) == 0) { 25727380Sgblack@eecs.umich.edu if (single) { 25737380Sgblack@eecs.umich.edu return new VcvtFpUIntSR(machInst, vd, vm); 25747380Sgblack@eecs.umich.edu } else { 25757380Sgblack@eecs.umich.edu vd = (IntRegIndex)(bits(machInst, 22) | 25767380Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 25777380Sgblack@eecs.umich.edu return new VcvtFpUIntDR(machInst, vd, vm); 25787380Sgblack@eecs.umich.edu } 25797373Sgblack@eecs.umich.edu } else { 25807380Sgblack@eecs.umich.edu if (single) { 25817380Sgblack@eecs.umich.edu return new VcvtFpUIntS(machInst, vd, vm); 25827380Sgblack@eecs.umich.edu } else { 25837380Sgblack@eecs.umich.edu vd = (IntRegIndex)(bits(machInst, 22) | 25847380Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 25857380Sgblack@eecs.umich.edu return new VcvtFpUIntD(machInst, vd, vm); 25867380Sgblack@eecs.umich.edu } 25877373Sgblack@eecs.umich.edu } 25887363Sgblack@eecs.umich.edu case 0xd: 25897380Sgblack@eecs.umich.edu if (bits(machInst, 7) == 0) { 25907380Sgblack@eecs.umich.edu if (single) { 25917380Sgblack@eecs.umich.edu return new VcvtFpSIntSR(machInst, vd, vm); 25927380Sgblack@eecs.umich.edu } else { 25937380Sgblack@eecs.umich.edu vd = (IntRegIndex)(bits(machInst, 22) | 25947380Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 25957380Sgblack@eecs.umich.edu return new VcvtFpSIntDR(machInst, vd, vm); 25967380Sgblack@eecs.umich.edu } 25977373Sgblack@eecs.umich.edu } else { 25987380Sgblack@eecs.umich.edu if (single) { 25997380Sgblack@eecs.umich.edu return new VcvtFpSIntS(machInst, vd, vm); 26007380Sgblack@eecs.umich.edu } else { 26017380Sgblack@eecs.umich.edu vd = (IntRegIndex)(bits(machInst, 22) | 26027380Sgblack@eecs.umich.edu (bits(machInst, 15, 12) << 1)); 26037380Sgblack@eecs.umich.edu return new VcvtFpSIntD(machInst, vd, vm); 26047380Sgblack@eecs.umich.edu } 26057373Sgblack@eecs.umich.edu } 26067363Sgblack@eecs.umich.edu case 0xe: 26077379Sgblack@eecs.umich.edu { 26087379Sgblack@eecs.umich.edu const bool half = (bits(machInst, 7) == 0); 26097379Sgblack@eecs.umich.edu const uint32_t imm = bits(machInst, 5) | 26107379Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1); 26117379Sgblack@eecs.umich.edu const uint32_t size = 26127379Sgblack@eecs.umich.edu (bits(machInst, 7) == 0 ? 16 : 32) - imm; 26137379Sgblack@eecs.umich.edu if (single) { 26147379Sgblack@eecs.umich.edu if (half) { 26157379Sgblack@eecs.umich.edu return new VcvtFpSHFixedS(machInst, vd, vd, size); 26167379Sgblack@eecs.umich.edu } else { 26177379Sgblack@eecs.umich.edu return new VcvtFpSFixedS(machInst, vd, vd, size); 26187379Sgblack@eecs.umich.edu } 26197379Sgblack@eecs.umich.edu } else { 26207379Sgblack@eecs.umich.edu if (half) { 26217379Sgblack@eecs.umich.edu return new VcvtFpSHFixedD(machInst, vd, vd, size); 26227379Sgblack@eecs.umich.edu } else { 26237379Sgblack@eecs.umich.edu return new VcvtFpSFixedD(machInst, vd, vd, size); 26247379Sgblack@eecs.umich.edu } 26257379Sgblack@eecs.umich.edu } 26267379Sgblack@eecs.umich.edu } 26277363Sgblack@eecs.umich.edu case 0xf: 26287379Sgblack@eecs.umich.edu { 26297379Sgblack@eecs.umich.edu const bool half = (bits(machInst, 7) == 0); 26307379Sgblack@eecs.umich.edu const uint32_t imm = bits(machInst, 5) | 26317379Sgblack@eecs.umich.edu (bits(machInst, 3, 0) << 1); 26327379Sgblack@eecs.umich.edu const uint32_t size = 26337379Sgblack@eecs.umich.edu (bits(machInst, 7) == 0 ? 16 : 32) - imm; 26347379Sgblack@eecs.umich.edu if (single) { 26357379Sgblack@eecs.umich.edu if (half) { 26367379Sgblack@eecs.umich.edu return new VcvtFpUHFixedS(machInst, vd, vd, size); 26377379Sgblack@eecs.umich.edu } else { 26387379Sgblack@eecs.umich.edu return new VcvtFpUFixedS(machInst, vd, vd, size); 26397379Sgblack@eecs.umich.edu } 26407379Sgblack@eecs.umich.edu } else { 26417379Sgblack@eecs.umich.edu if (half) { 26427379Sgblack@eecs.umich.edu return new VcvtFpUHFixedD(machInst, vd, vd, size); 26437379Sgblack@eecs.umich.edu } else { 26447379Sgblack@eecs.umich.edu return new VcvtFpUFixedD(machInst, vd, vd, size); 26457379Sgblack@eecs.umich.edu } 26467379Sgblack@eecs.umich.edu } 26477379Sgblack@eecs.umich.edu } 26487363Sgblack@eecs.umich.edu } 26497363Sgblack@eecs.umich.edu break; 26507363Sgblack@eecs.umich.edu } 26517363Sgblack@eecs.umich.edu return new Unknown(machInst); 26527363Sgblack@eecs.umich.edu } 26537363Sgblack@eecs.umich.edu ''' 26547363Sgblack@eecs.umich.edu}}; 26557363Sgblack@eecs.umich.edu 26567363Sgblack@eecs.umich.edudef format VfpData() {{ 26577363Sgblack@eecs.umich.edu decode_block = ''' 26587363Sgblack@eecs.umich.edu return decodeVfpData(machInst); 26597363Sgblack@eecs.umich.edu ''' 26607363Sgblack@eecs.umich.edu}}; 2661