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