fp.isa revision 11671
16019Shines@cs.fsu.edu// -*- mode:c++ -*-
26019Shines@cs.fsu.edu
311671Smitch.hayenga@arm.com// Copyright (c) 2010-2011,2016 ARM Limited
47178Sgblack@eecs.umich.edu// All rights reserved
57178Sgblack@eecs.umich.edu//
67178Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall
77178Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual
87178Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating
97178Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software
107178Sgblack@eecs.umich.edu// licensed hereunder.  You may use the software subject to the license
117178Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated
127178Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software,
137178Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form.
147178Sgblack@eecs.umich.edu//
156019Shines@cs.fsu.edu// Copyright (c) 2007-2008 The Florida State University
166019Shines@cs.fsu.edu// All rights reserved.
176019Shines@cs.fsu.edu//
186019Shines@cs.fsu.edu// Redistribution and use in source and binary forms, with or without
196019Shines@cs.fsu.edu// modification, are permitted provided that the following conditions are
206019Shines@cs.fsu.edu// met: redistributions of source code must retain the above copyright
216019Shines@cs.fsu.edu// notice, this list of conditions and the following disclaimer;
226019Shines@cs.fsu.edu// redistributions in binary form must reproduce the above copyright
236019Shines@cs.fsu.edu// notice, this list of conditions and the following disclaimer in the
246019Shines@cs.fsu.edu// documentation and/or other materials provided with the distribution;
256019Shines@cs.fsu.edu// neither the name of the copyright holders nor the names of its
266019Shines@cs.fsu.edu// contributors may be used to endorse or promote products derived from
276019Shines@cs.fsu.edu// this software without specific prior written permission.
286019Shines@cs.fsu.edu//
296019Shines@cs.fsu.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
306019Shines@cs.fsu.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
316019Shines@cs.fsu.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
326019Shines@cs.fsu.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
336019Shines@cs.fsu.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
346019Shines@cs.fsu.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
356019Shines@cs.fsu.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
366019Shines@cs.fsu.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
376019Shines@cs.fsu.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
386019Shines@cs.fsu.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
396019Shines@cs.fsu.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
406019Shines@cs.fsu.edu//
416019Shines@cs.fsu.edu// Authors: Stephen Hines
426019Shines@cs.fsu.edu
436019Shines@cs.fsu.edu////////////////////////////////////////////////////////////////////
446019Shines@cs.fsu.edu//
456019Shines@cs.fsu.edu// Floating Point operate instructions
466019Shines@cs.fsu.edu//
476019Shines@cs.fsu.edu
487639Sgblack@eecs.umich.eduoutput header {{
497639Sgblack@eecs.umich.edu
507639Sgblack@eecs.umich.edu    template<template <typename T> class Base>
517639Sgblack@eecs.umich.edu    StaticInstPtr
527639Sgblack@eecs.umich.edu    newNeonMemInst(const unsigned size,
537639Sgblack@eecs.umich.edu                   const ExtMachInst &machInst,
547639Sgblack@eecs.umich.edu                   const RegIndex dest, const RegIndex ra,
557639Sgblack@eecs.umich.edu                   const uint32_t imm, const unsigned extraMemFlags)
567639Sgblack@eecs.umich.edu    {
577639Sgblack@eecs.umich.edu        switch (size) {
587639Sgblack@eecs.umich.edu          case 0:
597639Sgblack@eecs.umich.edu            return new Base<uint8_t>(machInst, dest, ra, imm, extraMemFlags);
607639Sgblack@eecs.umich.edu          case 1:
617639Sgblack@eecs.umich.edu            return new Base<uint16_t>(machInst, dest, ra, imm, extraMemFlags);
627639Sgblack@eecs.umich.edu          case 2:
637639Sgblack@eecs.umich.edu            return new Base<uint32_t>(machInst, dest, ra, imm, extraMemFlags);
647639Sgblack@eecs.umich.edu          case 3:
657639Sgblack@eecs.umich.edu            return new Base<uint64_t>(machInst, dest, ra, imm, extraMemFlags);
667639Sgblack@eecs.umich.edu          default:
677639Sgblack@eecs.umich.edu            panic("Unrecognized width %d for Neon mem inst.\n", (1 << size));
687639Sgblack@eecs.umich.edu        }
697639Sgblack@eecs.umich.edu    }
707639Sgblack@eecs.umich.edu
717639Sgblack@eecs.umich.edu    template<template <typename T> class Base>
727639Sgblack@eecs.umich.edu    StaticInstPtr
737639Sgblack@eecs.umich.edu    newNeonMixInst(const unsigned size,
747639Sgblack@eecs.umich.edu                   const ExtMachInst &machInst,
757639Sgblack@eecs.umich.edu                   const RegIndex dest, const RegIndex op1,
767639Sgblack@eecs.umich.edu                   const uint32_t step)
777639Sgblack@eecs.umich.edu    {
787639Sgblack@eecs.umich.edu        switch (size) {
797639Sgblack@eecs.umich.edu          case 0:
807639Sgblack@eecs.umich.edu            return new Base<uint8_t>(machInst, dest, op1, step);
817639Sgblack@eecs.umich.edu          case 1:
827639Sgblack@eecs.umich.edu            return new Base<uint16_t>(machInst, dest, op1, step);
837639Sgblack@eecs.umich.edu          case 2:
847639Sgblack@eecs.umich.edu            return new Base<uint32_t>(machInst, dest, op1, step);
857639Sgblack@eecs.umich.edu          case 3:
867639Sgblack@eecs.umich.edu            return new Base<uint64_t>(machInst, dest, op1, step);
877639Sgblack@eecs.umich.edu          default:
887639Sgblack@eecs.umich.edu            panic("Unrecognized width %d for Neon mem inst.\n", (1 << size));
897639Sgblack@eecs.umich.edu        }
907639Sgblack@eecs.umich.edu    }
917639Sgblack@eecs.umich.edu
927639Sgblack@eecs.umich.edu}};
937639Sgblack@eecs.umich.edu
947356Sgblack@eecs.umich.edulet {{
957356Sgblack@eecs.umich.edu    header_output = '''
967356Sgblack@eecs.umich.edu    StaticInstPtr
977435Sgblack@eecs.umich.edu    decodeNeonMem(ExtMachInst machInst);
987435Sgblack@eecs.umich.edu
997435Sgblack@eecs.umich.edu    StaticInstPtr
1007435Sgblack@eecs.umich.edu    decodeNeonData(ExtMachInst machInst);
1017435Sgblack@eecs.umich.edu    '''
1027435Sgblack@eecs.umich.edu
1037435Sgblack@eecs.umich.edu    decoder_output = '''
1047435Sgblack@eecs.umich.edu    StaticInstPtr
1057435Sgblack@eecs.umich.edu    decodeNeonMem(ExtMachInst machInst)
1067435Sgblack@eecs.umich.edu    {
1077435Sgblack@eecs.umich.edu        const uint32_t b = bits(machInst, 11, 8);
1087639Sgblack@eecs.umich.edu        const bool single = bits(machInst, 23);
1097639Sgblack@eecs.umich.edu        const bool singleAll = single && (bits(b, 3, 2) == 3);
1107639Sgblack@eecs.umich.edu        const bool load = bits(machInst, 21);
1117435Sgblack@eecs.umich.edu
1127639Sgblack@eecs.umich.edu        unsigned width = 0;
1137639Sgblack@eecs.umich.edu
1147639Sgblack@eecs.umich.edu        if (single) {
1157639Sgblack@eecs.umich.edu            width = bits(b, 1, 0) + 1;
1167639Sgblack@eecs.umich.edu        } else {
1177639Sgblack@eecs.umich.edu            switch (bits(b, 3, 1)) {
1187639Sgblack@eecs.umich.edu              case 0x0: width = 4;
1197639Sgblack@eecs.umich.edu                break;
1207639Sgblack@eecs.umich.edu              case 0x1: width = (b & 0x1) ? 2 : 1;
1217639Sgblack@eecs.umich.edu                break;
1227639Sgblack@eecs.umich.edu              case 0x2: width = 3;
1237639Sgblack@eecs.umich.edu                break;
1247639Sgblack@eecs.umich.edu              case 0x3: width = 1;
1257639Sgblack@eecs.umich.edu                break;
1267639Sgblack@eecs.umich.edu              case 0x4: width = 2;
1277639Sgblack@eecs.umich.edu                break;
1287639Sgblack@eecs.umich.edu              case 0x5:
1297639Sgblack@eecs.umich.edu                if ((b & 0x1) == 0) {
1307639Sgblack@eecs.umich.edu                    width = 1;
1317639Sgblack@eecs.umich.edu                    break;
1327639Sgblack@eecs.umich.edu                }
1337639Sgblack@eecs.umich.edu                // Fall through on purpose.
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                        }
4077435Sgblack@eecs.umich.edu                    }
4087435Sgblack@eecs.umich.edu                } else {
4097435Sgblack@eecs.umich.edu                    switch (c) {
4107435Sgblack@eecs.umich.edu                      case 0:
4117639Sgblack@eecs.umich.edu                        if (q) {
4127639Sgblack@eecs.umich.edu                            return new VandQ<uint64_t>(machInst, vd, vn, vm);
4137639Sgblack@eecs.umich.edu                        } else {
4147639Sgblack@eecs.umich.edu                            return new VandD<uint64_t>(machInst, vd, vn, vm);
4157639Sgblack@eecs.umich.edu                        }
4167435Sgblack@eecs.umich.edu                      case 1:
4177639Sgblack@eecs.umich.edu                        if (q) {
4187639Sgblack@eecs.umich.edu                            return new VbicQ<uint64_t>(machInst, vd, vn, vm);
4197639Sgblack@eecs.umich.edu                        } else {
4207639Sgblack@eecs.umich.edu                            return new VbicD<uint64_t>(machInst, vd, vn, vm);
4217639Sgblack@eecs.umich.edu                        }
4227435Sgblack@eecs.umich.edu                      case 2:
4237639Sgblack@eecs.umich.edu                        if (vn == vm) {
4247639Sgblack@eecs.umich.edu                            if (q) {
4257639Sgblack@eecs.umich.edu                                return new VmovQ<uint64_t>(
4267639Sgblack@eecs.umich.edu                                        machInst, vd, vn, vm);
4277435Sgblack@eecs.umich.edu                            } else {
4287639Sgblack@eecs.umich.edu                                return new VmovD<uint64_t>(
4297639Sgblack@eecs.umich.edu                                        machInst, vd, vn, vm);
4307639Sgblack@eecs.umich.edu                            }
4317639Sgblack@eecs.umich.edu                        } else {
4327639Sgblack@eecs.umich.edu                            if (q) {
4337639Sgblack@eecs.umich.edu                                return new VorrQ<uint64_t>(
4347639Sgblack@eecs.umich.edu                                        machInst, vd, vn, vm);
4357639Sgblack@eecs.umich.edu                            } else {
4367639Sgblack@eecs.umich.edu                                return new VorrD<uint64_t>(
4377639Sgblack@eecs.umich.edu                                        machInst, vd, vn, vm);
4387435Sgblack@eecs.umich.edu                            }
4397435Sgblack@eecs.umich.edu                        }
4407435Sgblack@eecs.umich.edu                      case 3:
4417639Sgblack@eecs.umich.edu                        if (q) {
4427639Sgblack@eecs.umich.edu                            return new VornQ<uint64_t>(
4437639Sgblack@eecs.umich.edu                                    machInst, vd, vn, vm);
4447639Sgblack@eecs.umich.edu                        } else {
4457639Sgblack@eecs.umich.edu                            return new VornD<uint64_t>(
4467639Sgblack@eecs.umich.edu                                    machInst, vd, vn, vm);
4477639Sgblack@eecs.umich.edu                        }
4487435Sgblack@eecs.umich.edu                    }
4497435Sgblack@eecs.umich.edu                }
4507435Sgblack@eecs.umich.edu            }
4517435Sgblack@eecs.umich.edu          case 0x2:
4527435Sgblack@eecs.umich.edu            if (b) {
4537639Sgblack@eecs.umich.edu                if (u) {
4547639Sgblack@eecs.umich.edu                    return decodeNeonUThreeReg<VqsubUD, VqsubUQ>(
4557639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vn, vm);
4567639Sgblack@eecs.umich.edu                } else {
4577639Sgblack@eecs.umich.edu                    return decodeNeonSThreeReg<VqsubSD, VqsubSQ>(
4587639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vn, vm);
4597639Sgblack@eecs.umich.edu                }
4607435Sgblack@eecs.umich.edu            } else {
4617639Sgblack@eecs.umich.edu                if (size == 3)
4627639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
4637639Sgblack@eecs.umich.edu                return decodeNeonUSThreeReg<VhsubD, VhsubQ>(
4647639Sgblack@eecs.umich.edu                        q, u, size, machInst, vd, vn, vm);
4657435Sgblack@eecs.umich.edu            }
4667435Sgblack@eecs.umich.edu          case 0x3:
4677435Sgblack@eecs.umich.edu            if (b) {
4687639Sgblack@eecs.umich.edu                return decodeNeonUSThreeReg<VcgeD, VcgeQ>(
4697639Sgblack@eecs.umich.edu                        q, u, size, machInst, vd, vn, vm);
4707435Sgblack@eecs.umich.edu            } else {
4717639Sgblack@eecs.umich.edu                return decodeNeonUSThreeReg<VcgtD, VcgtQ>(
4727639Sgblack@eecs.umich.edu                        q, u, size, machInst, vd, vn, vm);
4737435Sgblack@eecs.umich.edu            }
4747435Sgblack@eecs.umich.edu          case 0x4:
4757435Sgblack@eecs.umich.edu            if (b) {
4767639Sgblack@eecs.umich.edu                if (u) {
4777639Sgblack@eecs.umich.edu                    return decodeNeonUThreeReg<VqshlUD, VqshlUQ>(
4787639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vm, vn);
4797639Sgblack@eecs.umich.edu                } else {
4807639Sgblack@eecs.umich.edu                    return decodeNeonSThreeReg<VqshlSD, VqshlSQ>(
4817639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vm, vn);
4827639Sgblack@eecs.umich.edu                }
4837435Sgblack@eecs.umich.edu            } else {
4847639Sgblack@eecs.umich.edu                return decodeNeonUSThreeReg<VshlD, VshlQ>(
4857639Sgblack@eecs.umich.edu                        q, u, size, machInst, vd, vm, vn);
4867435Sgblack@eecs.umich.edu            }
4877435Sgblack@eecs.umich.edu          case 0x5:
4887435Sgblack@eecs.umich.edu            if (b) {
4897639Sgblack@eecs.umich.edu                if (u) {
4907639Sgblack@eecs.umich.edu                    return decodeNeonUThreeReg<VqrshlUD, VqrshlUQ>(
4917639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vm, vn);
4927639Sgblack@eecs.umich.edu                } else {
4937639Sgblack@eecs.umich.edu                    return decodeNeonSThreeReg<VqrshlSD, VqrshlSQ>(
4947639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vm, vn);
4957639Sgblack@eecs.umich.edu                }
4967435Sgblack@eecs.umich.edu            } else {
4977639Sgblack@eecs.umich.edu                return decodeNeonUSThreeReg<VrshlD, VrshlQ>(
4987639Sgblack@eecs.umich.edu                        q, u, size, machInst, vd, vm, vn);
4997435Sgblack@eecs.umich.edu            }
5007435Sgblack@eecs.umich.edu          case 0x6:
5017435Sgblack@eecs.umich.edu            if (b) {
5027639Sgblack@eecs.umich.edu                return decodeNeonUSThreeReg<VminD, VminQ>(
5037639Sgblack@eecs.umich.edu                        q, u, size, machInst, vd, vn, vm);
5047435Sgblack@eecs.umich.edu            } else {
5057639Sgblack@eecs.umich.edu                return decodeNeonUSThreeReg<VmaxD, VmaxQ>(
5067639Sgblack@eecs.umich.edu                        q, u, size, machInst, vd, vn, vm);
5077435Sgblack@eecs.umich.edu            }
5087435Sgblack@eecs.umich.edu          case 0x7:
5097435Sgblack@eecs.umich.edu            if (b) {
5107639Sgblack@eecs.umich.edu                return decodeNeonUSThreeReg<VabaD, VabaQ>(
5117639Sgblack@eecs.umich.edu                        q, u, size, machInst, vd, vn, vm);
5127435Sgblack@eecs.umich.edu            } else {
5137435Sgblack@eecs.umich.edu                if (bits(machInst, 23) == 1) {
5147639Sgblack@eecs.umich.edu                    if (q) {
5157435Sgblack@eecs.umich.edu                        return new Unknown(machInst);
5167435Sgblack@eecs.umich.edu                    } else {
5177639Sgblack@eecs.umich.edu                        return decodeNeonUSThreeUSReg<Vabdl>(
5187639Sgblack@eecs.umich.edu                                u, size, machInst, vd, vn, vm);
5197435Sgblack@eecs.umich.edu                    }
5207435Sgblack@eecs.umich.edu                } else {
5217639Sgblack@eecs.umich.edu                    return decodeNeonUSThreeReg<VabdD, VabdQ>(
5227639Sgblack@eecs.umich.edu                            q, u, size, machInst, vd, vn, vm);
5237435Sgblack@eecs.umich.edu                }
5247435Sgblack@eecs.umich.edu            }
5257435Sgblack@eecs.umich.edu          case 0x8:
5267435Sgblack@eecs.umich.edu            if (b) {
5277435Sgblack@eecs.umich.edu                if (u) {
5287639Sgblack@eecs.umich.edu                    return decodeNeonUThreeReg<VceqD, VceqQ>(
5297639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vn, vm);
5307435Sgblack@eecs.umich.edu                } else {
5317639Sgblack@eecs.umich.edu                    return decodeNeonUThreeReg<VtstD, VtstQ>(
5327639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vn, vm);
5337435Sgblack@eecs.umich.edu                }
5347435Sgblack@eecs.umich.edu            } else {
5357435Sgblack@eecs.umich.edu                if (u) {
5367639Sgblack@eecs.umich.edu                    return decodeNeonUThreeReg<NVsubD, NVsubQ>(
5377639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vn, vm);
5387435Sgblack@eecs.umich.edu                } else {
5397639Sgblack@eecs.umich.edu                    return decodeNeonUThreeReg<NVaddD, NVaddQ>(
5407639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vn, vm);
5417435Sgblack@eecs.umich.edu                }
5427435Sgblack@eecs.umich.edu            }
5437435Sgblack@eecs.umich.edu          case 0x9:
5447435Sgblack@eecs.umich.edu            if (b) {
5457435Sgblack@eecs.umich.edu                if (u) {
5467639Sgblack@eecs.umich.edu                    return decodeNeonUThreeReg<NVmulpD, NVmulpQ>(
5477639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vn, vm);
5487435Sgblack@eecs.umich.edu                } else {
5497639Sgblack@eecs.umich.edu                    return decodeNeonSThreeReg<NVmulD, NVmulQ>(
5507639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vn, vm);
5517435Sgblack@eecs.umich.edu                }
5527435Sgblack@eecs.umich.edu            } else {
5537435Sgblack@eecs.umich.edu                if (u) {
5547639Sgblack@eecs.umich.edu                    return decodeNeonUSThreeReg<NVmlsD, NVmlsQ>(
5557639Sgblack@eecs.umich.edu                            q, u, size, machInst, vd, vn, vm);
5567435Sgblack@eecs.umich.edu                } else {
5577639Sgblack@eecs.umich.edu                    return decodeNeonUSThreeReg<NVmlaD, NVmlaQ>(
5587639Sgblack@eecs.umich.edu                            q, u, size, machInst, vd, vn, vm);
5597435Sgblack@eecs.umich.edu                }
5607435Sgblack@eecs.umich.edu            }
5617435Sgblack@eecs.umich.edu          case 0xa:
5628607Sgblack@eecs.umich.edu            if (q)
5638607Sgblack@eecs.umich.edu                return new Unknown(machInst);
5647435Sgblack@eecs.umich.edu            if (b) {
5658607Sgblack@eecs.umich.edu                return decodeNeonUSThreeUSReg<VpminD>(
5668607Sgblack@eecs.umich.edu                        u, size, machInst, vd, vn, vm);
5677435Sgblack@eecs.umich.edu            } else {
5688607Sgblack@eecs.umich.edu                return decodeNeonUSThreeUSReg<VpmaxD>(
5698607Sgblack@eecs.umich.edu                        u, size, machInst, vd, vn, vm);
5707435Sgblack@eecs.umich.edu            }
5717435Sgblack@eecs.umich.edu          case 0xb:
5727435Sgblack@eecs.umich.edu            if (b) {
5738607Sgblack@eecs.umich.edu                if (u || q) {
5747435Sgblack@eecs.umich.edu                    return new Unknown(machInst);
5757435Sgblack@eecs.umich.edu                } else {
5768607Sgblack@eecs.umich.edu                    return decodeNeonUThreeUSReg<NVpaddD>(
5778607Sgblack@eecs.umich.edu                            size, machInst, vd, vn, vm);
5787435Sgblack@eecs.umich.edu                }
5797435Sgblack@eecs.umich.edu            } else {
5807435Sgblack@eecs.umich.edu                if (u) {
5817639Sgblack@eecs.umich.edu                    return decodeNeonSThreeSReg<VqrdmulhD, VqrdmulhQ>(
5827639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vn, vm);
5837435Sgblack@eecs.umich.edu                } else {
5847639Sgblack@eecs.umich.edu                    return decodeNeonSThreeSReg<VqdmulhD, VqdmulhQ>(
5857639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vn, vm);
5867435Sgblack@eecs.umich.edu                }
5877435Sgblack@eecs.umich.edu            }
5887435Sgblack@eecs.umich.edu          case 0xc:
58910037SARM gem5 Developers            if (b) {
59010037SARM gem5 Developers                if (!u) {
59110037SARM gem5 Developers                    if (bits(c, 1) == 0) {
59210037SARM gem5 Developers                        if (q) {
59310037SARM gem5 Developers                            return new NVfmaQFp<float>(machInst, vd, vn, vm);
59410037SARM gem5 Developers                        } else {
59510037SARM gem5 Developers                            return new NVfmaDFp<float>(machInst, vd, vn, vm);
59610037SARM gem5 Developers                        }
59710037SARM gem5 Developers                    } else {
59810037SARM gem5 Developers                        if (q) {
59910037SARM gem5 Developers                            return new NVfmsQFp<float>(machInst, vd, vn, vm);
60010037SARM gem5 Developers                        } else {
60110037SARM gem5 Developers                            return new NVfmsDFp<float>(machInst, vd, vn, vm);
60210037SARM gem5 Developers                        }
60310037SARM gem5 Developers                    }
60410037SARM gem5 Developers                }
60510037SARM gem5 Developers            }
6067435Sgblack@eecs.umich.edu            return new Unknown(machInst);
6077435Sgblack@eecs.umich.edu          case 0xd:
6087435Sgblack@eecs.umich.edu            if (b) {
6097435Sgblack@eecs.umich.edu                if (u) {
6107435Sgblack@eecs.umich.edu                    if (bits(c, 1) == 0) {
6117639Sgblack@eecs.umich.edu                        if (q) {
6127639Sgblack@eecs.umich.edu                            return new NVmulQFp<float>(machInst, vd, vn, vm);
6137639Sgblack@eecs.umich.edu                        } else {
6147639Sgblack@eecs.umich.edu                            return new NVmulDFp<float>(machInst, vd, vn, vm);
6157639Sgblack@eecs.umich.edu                        }
6167435Sgblack@eecs.umich.edu                    } else {
6177435Sgblack@eecs.umich.edu                        return new Unknown(machInst);
6187435Sgblack@eecs.umich.edu                    }
6197435Sgblack@eecs.umich.edu                } else {
6207435Sgblack@eecs.umich.edu                    if (bits(c, 1) == 0) {
6217639Sgblack@eecs.umich.edu                        if (q) {
6227639Sgblack@eecs.umich.edu                            return new NVmlaQFp<float>(machInst, vd, vn, vm);
6237639Sgblack@eecs.umich.edu                        } else {
6247639Sgblack@eecs.umich.edu                            return new NVmlaDFp<float>(machInst, vd, vn, vm);
6257639Sgblack@eecs.umich.edu                        }
6267435Sgblack@eecs.umich.edu                    } else {
6277639Sgblack@eecs.umich.edu                        if (q) {
6287639Sgblack@eecs.umich.edu                            return new NVmlsQFp<float>(machInst, vd, vn, vm);
6297639Sgblack@eecs.umich.edu                        } else {
6307639Sgblack@eecs.umich.edu                            return new NVmlsDFp<float>(machInst, vd, vn, vm);
6317639Sgblack@eecs.umich.edu                        }
6327435Sgblack@eecs.umich.edu                    }
6337435Sgblack@eecs.umich.edu                }
6347435Sgblack@eecs.umich.edu            } else {
6357435Sgblack@eecs.umich.edu                if (u) {
6367435Sgblack@eecs.umich.edu                    if (bits(c, 1) == 0) {
6377639Sgblack@eecs.umich.edu                        if (q) {
6387639Sgblack@eecs.umich.edu                            return new VpaddQFp<float>(machInst, vd, vn, vm);
6397639Sgblack@eecs.umich.edu                        } else {
6407639Sgblack@eecs.umich.edu                            return new VpaddDFp<float>(machInst, vd, vn, vm);
6417639Sgblack@eecs.umich.edu                        }
6427435Sgblack@eecs.umich.edu                    } else {
6437639Sgblack@eecs.umich.edu                        if (q) {
6447639Sgblack@eecs.umich.edu                            return new VabdQFp<float>(machInst, vd, vn, vm);
6457639Sgblack@eecs.umich.edu                        } else {
6467639Sgblack@eecs.umich.edu                            return new VabdDFp<float>(machInst, vd, vn, vm);
6477639Sgblack@eecs.umich.edu                        }
6487435Sgblack@eecs.umich.edu                    }
6497435Sgblack@eecs.umich.edu                } else {
6507435Sgblack@eecs.umich.edu                    if (bits(c, 1) == 0) {
6517639Sgblack@eecs.umich.edu                        if (q) {
6527639Sgblack@eecs.umich.edu                            return new VaddQFp<float>(machInst, vd, vn, vm);
6537639Sgblack@eecs.umich.edu                        } else {
6547639Sgblack@eecs.umich.edu                            return new VaddDFp<float>(machInst, vd, vn, vm);
6557639Sgblack@eecs.umich.edu                        }
6567435Sgblack@eecs.umich.edu                    } else {
6577639Sgblack@eecs.umich.edu                        if (q) {
6587639Sgblack@eecs.umich.edu                            return new VsubQFp<float>(machInst, vd, vn, vm);
6597639Sgblack@eecs.umich.edu                        } else {
6607639Sgblack@eecs.umich.edu                            return new VsubDFp<float>(machInst, vd, vn, vm);
6617639Sgblack@eecs.umich.edu                        }
6627435Sgblack@eecs.umich.edu                    }
6637435Sgblack@eecs.umich.edu                }
6647435Sgblack@eecs.umich.edu            }
6657435Sgblack@eecs.umich.edu          case 0xe:
6667435Sgblack@eecs.umich.edu            if (b) {
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 VacgeQFp<float>(machInst, vd, vn, vm);
6717639Sgblack@eecs.umich.edu                        } else {
6727639Sgblack@eecs.umich.edu                            return new VacgeDFp<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 VacgtQFp<float>(machInst, vd, vn, vm);
6777639Sgblack@eecs.umich.edu                        } else {
6787639Sgblack@eecs.umich.edu                            return new VacgtDFp<float>(machInst, vd, vn, vm);
6797639Sgblack@eecs.umich.edu                        }
6807435Sgblack@eecs.umich.edu                    }
6817435Sgblack@eecs.umich.edu                } else {
6827435Sgblack@eecs.umich.edu                    return new Unknown(machInst);
6837435Sgblack@eecs.umich.edu                }
6847435Sgblack@eecs.umich.edu            } else {
6857435Sgblack@eecs.umich.edu                if (u) {
6867435Sgblack@eecs.umich.edu                    if (bits(c, 1) == 0) {
6877639Sgblack@eecs.umich.edu                        if (q) {
6887639Sgblack@eecs.umich.edu                            return new VcgeQFp<float>(machInst, vd, vn, vm);
6897639Sgblack@eecs.umich.edu                        } else {
6907639Sgblack@eecs.umich.edu                            return new VcgeDFp<float>(machInst, vd, vn, vm);
6917639Sgblack@eecs.umich.edu                        }
6927435Sgblack@eecs.umich.edu                    } else {
6937639Sgblack@eecs.umich.edu                        if (q) {
6947639Sgblack@eecs.umich.edu                            return new VcgtQFp<float>(machInst, vd, vn, vm);
6957639Sgblack@eecs.umich.edu                        } else {
6967639Sgblack@eecs.umich.edu                            return new VcgtDFp<float>(machInst, vd, vn, vm);
6977639Sgblack@eecs.umich.edu                        }
6987435Sgblack@eecs.umich.edu                    }
6997435Sgblack@eecs.umich.edu                } else {
7007435Sgblack@eecs.umich.edu                    if (bits(c, 1) == 0) {
7017639Sgblack@eecs.umich.edu                        if (q) {
7027639Sgblack@eecs.umich.edu                            return new VceqQFp<float>(machInst, vd, vn, vm);
7037639Sgblack@eecs.umich.edu                        } else {
7047639Sgblack@eecs.umich.edu                            return new VceqDFp<float>(machInst, vd, vn, vm);
7057639Sgblack@eecs.umich.edu                        }
7067435Sgblack@eecs.umich.edu                    } else {
7077435Sgblack@eecs.umich.edu                        return new Unknown(machInst);
7087435Sgblack@eecs.umich.edu                    }
7097435Sgblack@eecs.umich.edu                }
7107435Sgblack@eecs.umich.edu            }
7117435Sgblack@eecs.umich.edu          case 0xf:
7127435Sgblack@eecs.umich.edu            if (b) {
7137435Sgblack@eecs.umich.edu                if (u) {
7147435Sgblack@eecs.umich.edu                    return new Unknown(machInst);
7157435Sgblack@eecs.umich.edu                } else {
7167435Sgblack@eecs.umich.edu                    if (bits(c, 1) == 0) {
7177639Sgblack@eecs.umich.edu                        if (q) {
7187639Sgblack@eecs.umich.edu                            return new VrecpsQFp<float>(machInst, vd, vn, vm);
7197639Sgblack@eecs.umich.edu                        } else {
7207639Sgblack@eecs.umich.edu                            return new VrecpsDFp<float>(machInst, vd, vn, vm);
7217639Sgblack@eecs.umich.edu                        }
7227435Sgblack@eecs.umich.edu                    } else {
7237639Sgblack@eecs.umich.edu                        if (q) {
7247639Sgblack@eecs.umich.edu                            return new VrsqrtsQFp<float>(machInst, vd, vn, vm);
7257639Sgblack@eecs.umich.edu                        } else {
7267639Sgblack@eecs.umich.edu                            return new VrsqrtsDFp<float>(machInst, vd, vn, vm);
7277639Sgblack@eecs.umich.edu                        }
7287435Sgblack@eecs.umich.edu                    }
7297435Sgblack@eecs.umich.edu                }
7307435Sgblack@eecs.umich.edu            } else {
7317435Sgblack@eecs.umich.edu                if (u) {
7327435Sgblack@eecs.umich.edu                    if (bits(c, 1) == 0) {
7337639Sgblack@eecs.umich.edu                        if (q) {
7347639Sgblack@eecs.umich.edu                            return new VpmaxQFp<float>(machInst, vd, vn, vm);
7357639Sgblack@eecs.umich.edu                        } else {
7367639Sgblack@eecs.umich.edu                            return new VpmaxDFp<float>(machInst, vd, vn, vm);
7377639Sgblack@eecs.umich.edu                        }
7387435Sgblack@eecs.umich.edu                    } else {
7397639Sgblack@eecs.umich.edu                        if (q) {
7407639Sgblack@eecs.umich.edu                            return new VpminQFp<float>(machInst, vd, vn, vm);
7417639Sgblack@eecs.umich.edu                        } else {
7427639Sgblack@eecs.umich.edu                            return new VpminDFp<float>(machInst, vd, vn, vm);
7437639Sgblack@eecs.umich.edu                        }
7447435Sgblack@eecs.umich.edu                    }
7457435Sgblack@eecs.umich.edu                } else {
7467435Sgblack@eecs.umich.edu                    if (bits(c, 1) == 0) {
7477639Sgblack@eecs.umich.edu                        if (q) {
7487639Sgblack@eecs.umich.edu                            return new VmaxQFp<float>(machInst, vd, vn, vm);
7497639Sgblack@eecs.umich.edu                        } else {
7507639Sgblack@eecs.umich.edu                            return new VmaxDFp<float>(machInst, vd, vn, vm);
7517639Sgblack@eecs.umich.edu                        }
7527435Sgblack@eecs.umich.edu                    } else {
7537639Sgblack@eecs.umich.edu                        if (q) {
7547639Sgblack@eecs.umich.edu                            return new VminQFp<float>(machInst, vd, vn, vm);
7557639Sgblack@eecs.umich.edu                        } else {
7567639Sgblack@eecs.umich.edu                            return new VminDFp<float>(machInst, vd, vn, vm);
7577639Sgblack@eecs.umich.edu                        }
7587435Sgblack@eecs.umich.edu                    }
7597435Sgblack@eecs.umich.edu                }
7607435Sgblack@eecs.umich.edu            }
7617435Sgblack@eecs.umich.edu        }
7627435Sgblack@eecs.umich.edu        return new Unknown(machInst);
7637435Sgblack@eecs.umich.edu    }
7647435Sgblack@eecs.umich.edu
7657435Sgblack@eecs.umich.edu    static StaticInstPtr
7667435Sgblack@eecs.umich.edu    decodeNeonOneRegModImm(ExtMachInst machInst)
7677435Sgblack@eecs.umich.edu    {
7687639Sgblack@eecs.umich.edu        const IntRegIndex vd =
7697639Sgblack@eecs.umich.edu            (IntRegIndex)(2 * (bits(machInst, 15, 12) |
7707639Sgblack@eecs.umich.edu                               (bits(machInst, 22) << 4)));
7717639Sgblack@eecs.umich.edu        const bool q = bits(machInst, 6);
7727435Sgblack@eecs.umich.edu        const bool op = bits(machInst, 5);
7737639Sgblack@eecs.umich.edu        const uint8_t cmode = bits(machInst, 11, 8);
7747639Sgblack@eecs.umich.edu        const uint8_t imm = ((THUMB ? bits(machInst, 28) :
7757639Sgblack@eecs.umich.edu                                      bits(machInst, 24)) << 7) |
7767639Sgblack@eecs.umich.edu                            (bits(machInst, 18, 16) << 4) |
7777639Sgblack@eecs.umich.edu                            (bits(machInst, 3, 0) << 0);
7787853SMatt.Horsnell@ARM.com
7797853SMatt.Horsnell@ARM.com        // Check for invalid immediate encodings and return an unknown op
7807853SMatt.Horsnell@ARM.com        // if it happens
7817853SMatt.Horsnell@ARM.com        bool immValid = true;
7827853SMatt.Horsnell@ARM.com        const uint64_t bigImm = simd_modified_imm(op, cmode, imm, immValid);
7837853SMatt.Horsnell@ARM.com        if (!immValid) {
7847853SMatt.Horsnell@ARM.com            return new Unknown(machInst);
7857853SMatt.Horsnell@ARM.com        }
7867853SMatt.Horsnell@ARM.com
7877435Sgblack@eecs.umich.edu        if (op) {
7887435Sgblack@eecs.umich.edu            if (bits(cmode, 3) == 0) {
7897435Sgblack@eecs.umich.edu                if (bits(cmode, 0) == 0) {
7907639Sgblack@eecs.umich.edu                    if (q)
7917639Sgblack@eecs.umich.edu                        return new NVmvniQ<uint64_t>(machInst, vd, bigImm);
7927639Sgblack@eecs.umich.edu                    else
7937639Sgblack@eecs.umich.edu                        return new NVmvniD<uint64_t>(machInst, vd, bigImm);
7947435Sgblack@eecs.umich.edu                } else {
7957639Sgblack@eecs.umich.edu                    if (q)
7967639Sgblack@eecs.umich.edu                        return new NVbiciQ<uint64_t>(machInst, vd, bigImm);
7977639Sgblack@eecs.umich.edu                    else
7987639Sgblack@eecs.umich.edu                        return new NVbiciD<uint64_t>(machInst, vd, bigImm);
7997435Sgblack@eecs.umich.edu                }
8007435Sgblack@eecs.umich.edu            } else {
8017435Sgblack@eecs.umich.edu                if (bits(cmode, 2) == 1) {
8027639Sgblack@eecs.umich.edu                    switch (bits(cmode, 1, 0)) {
8037639Sgblack@eecs.umich.edu                      case 0:
8047639Sgblack@eecs.umich.edu                      case 1:
8057639Sgblack@eecs.umich.edu                        if (q)
8067639Sgblack@eecs.umich.edu                            return new NVmvniQ<uint64_t>(machInst, vd, bigImm);
8077639Sgblack@eecs.umich.edu                        else
8087639Sgblack@eecs.umich.edu                            return new NVmvniD<uint64_t>(machInst, vd, bigImm);
8097639Sgblack@eecs.umich.edu                      case 2:
8107639Sgblack@eecs.umich.edu                        if (q)
8117639Sgblack@eecs.umich.edu                            return new NVmoviQ<uint64_t>(machInst, vd, bigImm);
8127639Sgblack@eecs.umich.edu                        else
8137639Sgblack@eecs.umich.edu                            return new NVmoviD<uint64_t>(machInst, vd, bigImm);
8147639Sgblack@eecs.umich.edu                      case 3:
8157639Sgblack@eecs.umich.edu                        if (q)
8167639Sgblack@eecs.umich.edu                            return new Unknown(machInst);
8177639Sgblack@eecs.umich.edu                        else
8187639Sgblack@eecs.umich.edu                            return new Unknown(machInst);
8197639Sgblack@eecs.umich.edu                    }
8207435Sgblack@eecs.umich.edu                } else {
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                }
8337435Sgblack@eecs.umich.edu            }
8347435Sgblack@eecs.umich.edu        } else {
8357435Sgblack@eecs.umich.edu            if (bits(cmode, 3) == 0) {
8367435Sgblack@eecs.umich.edu                if (bits(cmode, 0) == 0) {
8377639Sgblack@eecs.umich.edu                    if (q)
8387639Sgblack@eecs.umich.edu                        return new NVmoviQ<uint64_t>(machInst, vd, bigImm);
8397639Sgblack@eecs.umich.edu                    else
8407639Sgblack@eecs.umich.edu                        return new NVmoviD<uint64_t>(machInst, vd, bigImm);
8417435Sgblack@eecs.umich.edu                } else {
8427639Sgblack@eecs.umich.edu                    if (q)
8437639Sgblack@eecs.umich.edu                        return new NVorriQ<uint64_t>(machInst, vd, bigImm);
8447639Sgblack@eecs.umich.edu                    else
8457639Sgblack@eecs.umich.edu                        return new NVorriD<uint64_t>(machInst, vd, bigImm);
8467435Sgblack@eecs.umich.edu                }
8477435Sgblack@eecs.umich.edu            } else {
8487435Sgblack@eecs.umich.edu                if (bits(cmode, 2) == 1) {
8497639Sgblack@eecs.umich.edu                    if (q)
8507639Sgblack@eecs.umich.edu                        return new NVmoviQ<uint64_t>(machInst, vd, bigImm);
8517639Sgblack@eecs.umich.edu                    else
8527639Sgblack@eecs.umich.edu                        return new NVmoviD<uint64_t>(machInst, vd, bigImm);
8537435Sgblack@eecs.umich.edu                } else {
8547435Sgblack@eecs.umich.edu                    if (bits(cmode, 0) == 0) {
8557639Sgblack@eecs.umich.edu                        if (q)
8567639Sgblack@eecs.umich.edu                            return new NVmoviQ<uint64_t>(machInst, vd, bigImm);
8577639Sgblack@eecs.umich.edu                        else
8587639Sgblack@eecs.umich.edu                            return new NVmoviD<uint64_t>(machInst, vd, bigImm);
8597435Sgblack@eecs.umich.edu                    } else {
8607639Sgblack@eecs.umich.edu                        if (q)
8617639Sgblack@eecs.umich.edu                            return new NVorriQ<uint64_t>(machInst, vd, bigImm);
8627639Sgblack@eecs.umich.edu                        else
8637639Sgblack@eecs.umich.edu                            return new NVorriD<uint64_t>(machInst, vd, bigImm);
8647435Sgblack@eecs.umich.edu                    }
8657435Sgblack@eecs.umich.edu                }
8667435Sgblack@eecs.umich.edu            }
8677435Sgblack@eecs.umich.edu        }
8687435Sgblack@eecs.umich.edu        return new Unknown(machInst);
8697435Sgblack@eecs.umich.edu    }
8707435Sgblack@eecs.umich.edu
8717435Sgblack@eecs.umich.edu    static StaticInstPtr
8727435Sgblack@eecs.umich.edu    decodeNeonTwoRegAndShift(ExtMachInst machInst)
8737435Sgblack@eecs.umich.edu    {
8747435Sgblack@eecs.umich.edu        const uint32_t a = bits(machInst, 11, 8);
8757435Sgblack@eecs.umich.edu        const bool u = THUMB ? bits(machInst, 28) : bits(machInst, 24);
8767435Sgblack@eecs.umich.edu        const bool b = bits(machInst, 6);
8777435Sgblack@eecs.umich.edu        const bool l = bits(machInst, 7);
8787639Sgblack@eecs.umich.edu        const IntRegIndex vd =
8797639Sgblack@eecs.umich.edu            (IntRegIndex)(2 * (bits(machInst, 15, 12) |
8807639Sgblack@eecs.umich.edu                               (bits(machInst, 22) << 4)));
8817639Sgblack@eecs.umich.edu        const IntRegIndex vm =
8827639Sgblack@eecs.umich.edu            (IntRegIndex)(2 * (bits(machInst, 3, 0) |
8837639Sgblack@eecs.umich.edu                               (bits(machInst, 5) << 4)));
8847639Sgblack@eecs.umich.edu        unsigned imm6 = bits(machInst, 21, 16);
8857639Sgblack@eecs.umich.edu        unsigned imm = ((l ? 1 : 0) << 6) | imm6;
8867639Sgblack@eecs.umich.edu        unsigned size = 3;
8877639Sgblack@eecs.umich.edu        unsigned lShiftAmt = 0;
8887639Sgblack@eecs.umich.edu        unsigned bitSel;
8897639Sgblack@eecs.umich.edu        for (bitSel = 1 << 6; true; bitSel >>= 1) {
8907639Sgblack@eecs.umich.edu            if (bitSel & imm)
8917639Sgblack@eecs.umich.edu                break;
8927639Sgblack@eecs.umich.edu            else if (!size)
8937639Sgblack@eecs.umich.edu                return new Unknown(machInst);
8947639Sgblack@eecs.umich.edu            size--;
8957639Sgblack@eecs.umich.edu        }
8967639Sgblack@eecs.umich.edu        lShiftAmt = imm6 & ~bitSel;
8977639Sgblack@eecs.umich.edu        unsigned rShiftAmt = 0;
8987639Sgblack@eecs.umich.edu        if (a != 0xe && a != 0xf) {
8997639Sgblack@eecs.umich.edu            if (size > 2)
9007639Sgblack@eecs.umich.edu                rShiftAmt = 64 - imm6;
9017639Sgblack@eecs.umich.edu            else
9027639Sgblack@eecs.umich.edu                rShiftAmt = 2 * (8 << size) - imm6;
9037639Sgblack@eecs.umich.edu        }
9047435Sgblack@eecs.umich.edu
9057435Sgblack@eecs.umich.edu        switch (a) {
9067435Sgblack@eecs.umich.edu          case 0x0:
9077639Sgblack@eecs.umich.edu            return decodeNeonUSTwoShiftReg<NVshrD, NVshrQ>(
9087639Sgblack@eecs.umich.edu                    b, u, size, machInst, vd, vm, rShiftAmt);
9097435Sgblack@eecs.umich.edu          case 0x1:
9107639Sgblack@eecs.umich.edu            return decodeNeonUSTwoShiftReg<NVsraD, NVsraQ>(
9117639Sgblack@eecs.umich.edu                    b, u, size, machInst, vd, vm, rShiftAmt);
9127435Sgblack@eecs.umich.edu          case 0x2:
9137639Sgblack@eecs.umich.edu            return decodeNeonUSTwoShiftReg<NVrshrD, NVrshrQ>(
9147639Sgblack@eecs.umich.edu                    b, u, size, machInst, vd, vm, rShiftAmt);
9157435Sgblack@eecs.umich.edu          case 0x3:
9167639Sgblack@eecs.umich.edu            return decodeNeonUSTwoShiftReg<NVrsraD, NVrsraQ>(
9177639Sgblack@eecs.umich.edu                    b, u, size, machInst, vd, vm, rShiftAmt);
9187435Sgblack@eecs.umich.edu          case 0x4:
9197435Sgblack@eecs.umich.edu            if (u) {
9207639Sgblack@eecs.umich.edu                return decodeNeonUTwoShiftReg<NVsriD, NVsriQ>(
9217639Sgblack@eecs.umich.edu                        b, size, machInst, vd, vm, rShiftAmt);
9227435Sgblack@eecs.umich.edu            } else {
9237435Sgblack@eecs.umich.edu                return new Unknown(machInst);
9247435Sgblack@eecs.umich.edu            }
9257435Sgblack@eecs.umich.edu          case 0x5:
9267435Sgblack@eecs.umich.edu            if (u) {
9277639Sgblack@eecs.umich.edu                return decodeNeonUTwoShiftReg<NVsliD, NVsliQ>(
9287639Sgblack@eecs.umich.edu                        b, size, machInst, vd, vm, lShiftAmt);
9297435Sgblack@eecs.umich.edu            } else {
9307639Sgblack@eecs.umich.edu                return decodeNeonUTwoShiftReg<NVshlD, NVshlQ>(
9317639Sgblack@eecs.umich.edu                        b, size, machInst, vd, vm, lShiftAmt);
9327435Sgblack@eecs.umich.edu            }
9337435Sgblack@eecs.umich.edu          case 0x6:
9347435Sgblack@eecs.umich.edu          case 0x7:
9357639Sgblack@eecs.umich.edu            if (u) {
9367639Sgblack@eecs.umich.edu                if (a == 0x6) {
9377639Sgblack@eecs.umich.edu                    return decodeNeonSTwoShiftReg<NVqshlusD, NVqshlusQ>(
9387639Sgblack@eecs.umich.edu                            b, size, machInst, vd, vm, lShiftAmt);
9397639Sgblack@eecs.umich.edu                } else {
9407639Sgblack@eecs.umich.edu                    return decodeNeonUTwoShiftReg<NVqshluD, NVqshluQ>(
9417639Sgblack@eecs.umich.edu                            b, size, machInst, vd, vm, lShiftAmt);
9427639Sgblack@eecs.umich.edu                }
9437639Sgblack@eecs.umich.edu            } else {
9447639Sgblack@eecs.umich.edu                return decodeNeonSTwoShiftReg<NVqshlD, NVqshlQ>(
9457639Sgblack@eecs.umich.edu                        b, size, machInst, vd, vm, lShiftAmt);
9467639Sgblack@eecs.umich.edu            }
9477435Sgblack@eecs.umich.edu          case 0x8:
9487435Sgblack@eecs.umich.edu            if (l) {
9497435Sgblack@eecs.umich.edu                return new Unknown(machInst);
9507435Sgblack@eecs.umich.edu            } else if (u) {
9517639Sgblack@eecs.umich.edu                return decodeNeonSTwoShiftSReg<NVqshruns, NVqrshruns>(
9527639Sgblack@eecs.umich.edu                        b, size, machInst, vd, vm, rShiftAmt);
9537435Sgblack@eecs.umich.edu            } else {
9547639Sgblack@eecs.umich.edu                return decodeNeonUTwoShiftSReg<NVshrn, NVrshrn>(
9557639Sgblack@eecs.umich.edu                        b, size, machInst, vd, vm, rShiftAmt);
9567435Sgblack@eecs.umich.edu            }
9577435Sgblack@eecs.umich.edu          case 0x9:
9587435Sgblack@eecs.umich.edu            if (l) {
9597435Sgblack@eecs.umich.edu                return new Unknown(machInst);
9607639Sgblack@eecs.umich.edu            } else if (u) {
9617639Sgblack@eecs.umich.edu                return decodeNeonUTwoShiftSReg<NVqshrun, NVqrshrun>(
9627639Sgblack@eecs.umich.edu                        b, size, machInst, vd, vm, rShiftAmt);
9637435Sgblack@eecs.umich.edu            } else {
9647639Sgblack@eecs.umich.edu                return decodeNeonSTwoShiftSReg<NVqshrn, NVqrshrn>(
9657639Sgblack@eecs.umich.edu                        b, size, machInst, vd, vm, rShiftAmt);
9667435Sgblack@eecs.umich.edu            }
9677435Sgblack@eecs.umich.edu          case 0xa:
9687435Sgblack@eecs.umich.edu            if (l || b) {
9697435Sgblack@eecs.umich.edu                return new Unknown(machInst);
9707435Sgblack@eecs.umich.edu            } else {
9717639Sgblack@eecs.umich.edu                return decodeNeonUSTwoShiftSReg<NVmovl, NVshll>(
9727639Sgblack@eecs.umich.edu                        lShiftAmt, u, size, machInst, vd, vm, lShiftAmt);
9737435Sgblack@eecs.umich.edu            }
9747435Sgblack@eecs.umich.edu          case 0xe:
9757639Sgblack@eecs.umich.edu            if (l) {
9767639Sgblack@eecs.umich.edu                return new Unknown(machInst);
9777639Sgblack@eecs.umich.edu            } else {
9787639Sgblack@eecs.umich.edu                if (bits(imm6, 5) == 0)
9797639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
9807639Sgblack@eecs.umich.edu                if (u) {
9817639Sgblack@eecs.umich.edu                    if (b) {
9827639Sgblack@eecs.umich.edu                        return new NVcvtu2fpQ<float>(
9837639Sgblack@eecs.umich.edu                                machInst, vd, vm, 64 - imm6);
9847639Sgblack@eecs.umich.edu                    } else {
9857639Sgblack@eecs.umich.edu                        return new NVcvtu2fpD<float>(
9867639Sgblack@eecs.umich.edu                                machInst, vd, vm, 64 - imm6);
9877639Sgblack@eecs.umich.edu                    }
9887639Sgblack@eecs.umich.edu                } else {
9897639Sgblack@eecs.umich.edu                    if (b) {
9907639Sgblack@eecs.umich.edu                        return new NVcvts2fpQ<float>(
9917639Sgblack@eecs.umich.edu                                machInst, vd, vm, 64 - imm6);
9927639Sgblack@eecs.umich.edu                    } else {
9937639Sgblack@eecs.umich.edu                        return new NVcvts2fpD<float>(
9947639Sgblack@eecs.umich.edu                                machInst, vd, vm, 64 - imm6);
9957639Sgblack@eecs.umich.edu                    }
9967639Sgblack@eecs.umich.edu                }
9977639Sgblack@eecs.umich.edu            }
9987435Sgblack@eecs.umich.edu          case 0xf:
9997435Sgblack@eecs.umich.edu            if (l) {
10007435Sgblack@eecs.umich.edu                return new Unknown(machInst);
10017639Sgblack@eecs.umich.edu            } else {
10027639Sgblack@eecs.umich.edu                if (bits(imm6, 5) == 0)
10037639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
10047639Sgblack@eecs.umich.edu                if (u) {
10057639Sgblack@eecs.umich.edu                    if (b) {
10067639Sgblack@eecs.umich.edu                        return new NVcvt2ufxQ<float>(
10077639Sgblack@eecs.umich.edu                                machInst, vd, vm, 64 - imm6);
10087639Sgblack@eecs.umich.edu                    } else {
10097639Sgblack@eecs.umich.edu                        return new NVcvt2ufxD<float>(
10107639Sgblack@eecs.umich.edu                                machInst, vd, vm, 64 - imm6);
10117639Sgblack@eecs.umich.edu                    }
10127639Sgblack@eecs.umich.edu                } else {
10137639Sgblack@eecs.umich.edu                    if (b) {
10147639Sgblack@eecs.umich.edu                        return new NVcvt2sfxQ<float>(
10157639Sgblack@eecs.umich.edu                                machInst, vd, vm, 64 - imm6);
10167639Sgblack@eecs.umich.edu                    } else {
10177639Sgblack@eecs.umich.edu                        return new NVcvt2sfxD<float>(
10187639Sgblack@eecs.umich.edu                                machInst, vd, vm, 64 - imm6);
10197639Sgblack@eecs.umich.edu                    }
10207639Sgblack@eecs.umich.edu                }
10217435Sgblack@eecs.umich.edu            }
10227435Sgblack@eecs.umich.edu        }
10237435Sgblack@eecs.umich.edu        return new Unknown(machInst);
10247435Sgblack@eecs.umich.edu    }
10257435Sgblack@eecs.umich.edu
10267435Sgblack@eecs.umich.edu    static StaticInstPtr
10277435Sgblack@eecs.umich.edu    decodeNeonThreeRegDiffLengths(ExtMachInst machInst)
10287435Sgblack@eecs.umich.edu    {
10297435Sgblack@eecs.umich.edu        const bool u = THUMB ? bits(machInst, 28) : bits(machInst, 24);
10307435Sgblack@eecs.umich.edu        const uint32_t a = bits(machInst, 11, 8);
10317639Sgblack@eecs.umich.edu        const IntRegIndex vd =
10327639Sgblack@eecs.umich.edu            (IntRegIndex)(2 * (bits(machInst, 15, 12) |
10337639Sgblack@eecs.umich.edu                               (bits(machInst, 22) << 4)));
10347639Sgblack@eecs.umich.edu        const IntRegIndex vn =
10357639Sgblack@eecs.umich.edu            (IntRegIndex)(2 * (bits(machInst, 19, 16) |
10367639Sgblack@eecs.umich.edu                               (bits(machInst, 7) << 4)));
10377639Sgblack@eecs.umich.edu        const IntRegIndex vm =
10387639Sgblack@eecs.umich.edu            (IntRegIndex)(2 * (bits(machInst, 3, 0) |
10397639Sgblack@eecs.umich.edu                               (bits(machInst, 5) << 4)));
10407639Sgblack@eecs.umich.edu        const unsigned size = bits(machInst, 21, 20);
10417435Sgblack@eecs.umich.edu        switch (a) {
10427435Sgblack@eecs.umich.edu          case 0x0:
10437639Sgblack@eecs.umich.edu            return decodeNeonUSThreeUSReg<Vaddl>(
10447639Sgblack@eecs.umich.edu                    u, size, machInst, vd, vn, vm);
10457435Sgblack@eecs.umich.edu          case 0x1:
10467639Sgblack@eecs.umich.edu            return decodeNeonUSThreeUSReg<Vaddw>(
10477639Sgblack@eecs.umich.edu                    u, size, machInst, vd, vn, vm);
10487435Sgblack@eecs.umich.edu          case 0x2:
10497639Sgblack@eecs.umich.edu            return decodeNeonUSThreeUSReg<Vsubl>(
10507639Sgblack@eecs.umich.edu                    u, size, machInst, vd, vn, vm);
10517435Sgblack@eecs.umich.edu          case 0x3:
10527639Sgblack@eecs.umich.edu            return decodeNeonUSThreeUSReg<Vsubw>(
10537639Sgblack@eecs.umich.edu                    u, size, machInst, vd, vn, vm);
10547435Sgblack@eecs.umich.edu          case 0x4:
10557435Sgblack@eecs.umich.edu            if (u) {
10567639Sgblack@eecs.umich.edu                return decodeNeonUThreeUSReg<Vraddhn>(
10577639Sgblack@eecs.umich.edu                        size, machInst, vd, vn, vm);
10587435Sgblack@eecs.umich.edu            } else {
10597639Sgblack@eecs.umich.edu                return decodeNeonUThreeUSReg<Vaddhn>(
10607639Sgblack@eecs.umich.edu                        size, machInst, vd, vn, vm);
10617435Sgblack@eecs.umich.edu            }
10627435Sgblack@eecs.umich.edu          case 0x5:
10637639Sgblack@eecs.umich.edu            return decodeNeonUSThreeUSReg<Vabal>(
10647639Sgblack@eecs.umich.edu                    u, size, machInst, vd, vn, vm);
10657435Sgblack@eecs.umich.edu          case 0x6:
10667435Sgblack@eecs.umich.edu            if (u) {
10677639Sgblack@eecs.umich.edu                return decodeNeonUThreeUSReg<Vrsubhn>(
10687639Sgblack@eecs.umich.edu                        size, machInst, vd, vn, vm);
10697435Sgblack@eecs.umich.edu            } else {
10707639Sgblack@eecs.umich.edu                return decodeNeonUThreeUSReg<Vsubhn>(
10717639Sgblack@eecs.umich.edu                        size, machInst, vd, vn, vm);
10727435Sgblack@eecs.umich.edu            }
10737435Sgblack@eecs.umich.edu          case 0x7:
10747435Sgblack@eecs.umich.edu            if (bits(machInst, 23)) {
10757639Sgblack@eecs.umich.edu                return decodeNeonUSThreeUSReg<Vabdl>(
10767639Sgblack@eecs.umich.edu                        u, size, machInst, vd, vn, vm);
10777435Sgblack@eecs.umich.edu            } else {
10787639Sgblack@eecs.umich.edu                return decodeNeonUSThreeReg<VabdD, VabdQ>(
10797639Sgblack@eecs.umich.edu                        bits(machInst, 6), u, size, machInst, vd, vn, vm);
10807435Sgblack@eecs.umich.edu            }
10817435Sgblack@eecs.umich.edu          case 0x8:
10827639Sgblack@eecs.umich.edu            return decodeNeonUSThreeUSReg<Vmlal>(
10837639Sgblack@eecs.umich.edu                    u, size, machInst, vd, vn, vm);
10847435Sgblack@eecs.umich.edu          case 0xa:
10857639Sgblack@eecs.umich.edu            return decodeNeonUSThreeUSReg<Vmlsl>(
10867639Sgblack@eecs.umich.edu                    u, size, machInst, vd, vn, vm);
10877435Sgblack@eecs.umich.edu          case 0x9:
10887639Sgblack@eecs.umich.edu            if (u) {
10897639Sgblack@eecs.umich.edu                return new Unknown(machInst);
10907435Sgblack@eecs.umich.edu            } else {
10917639Sgblack@eecs.umich.edu                return decodeNeonSThreeUSReg<Vqdmlal>(
10927639Sgblack@eecs.umich.edu                        size, machInst, vd, vn, vm);
10937435Sgblack@eecs.umich.edu            }
10947435Sgblack@eecs.umich.edu          case 0xb:
10957639Sgblack@eecs.umich.edu            if (u) {
10967435Sgblack@eecs.umich.edu                return new Unknown(machInst);
10977435Sgblack@eecs.umich.edu            } else {
10987639Sgblack@eecs.umich.edu                return decodeNeonSThreeUSReg<Vqdmlsl>(
10997639Sgblack@eecs.umich.edu                        size, machInst, vd, vn, vm);
11007435Sgblack@eecs.umich.edu            }
11017435Sgblack@eecs.umich.edu          case 0xc:
11027639Sgblack@eecs.umich.edu            return decodeNeonUSThreeUSReg<Vmull>(
11037639Sgblack@eecs.umich.edu                    u, size, machInst, vd, vn, vm);
11047435Sgblack@eecs.umich.edu          case 0xd:
11057639Sgblack@eecs.umich.edu            if (u) {
11067435Sgblack@eecs.umich.edu                return new Unknown(machInst);
11077435Sgblack@eecs.umich.edu            } else {
11087639Sgblack@eecs.umich.edu                return decodeNeonSThreeUSReg<Vqdmull>(
11097639Sgblack@eecs.umich.edu                        size, machInst, vd, vn, vm);
11107435Sgblack@eecs.umich.edu            }
11117435Sgblack@eecs.umich.edu          case 0xe:
11127639Sgblack@eecs.umich.edu            return decodeNeonUThreeUSReg<Vmullp>(
11137639Sgblack@eecs.umich.edu                    size, machInst, vd, vn, vm);
11147435Sgblack@eecs.umich.edu        }
11157435Sgblack@eecs.umich.edu        return new Unknown(machInst);
11167435Sgblack@eecs.umich.edu    }
11177435Sgblack@eecs.umich.edu
11187435Sgblack@eecs.umich.edu    static StaticInstPtr
11197435Sgblack@eecs.umich.edu    decodeNeonTwoRegScalar(ExtMachInst machInst)
11207435Sgblack@eecs.umich.edu    {
11217435Sgblack@eecs.umich.edu        const bool u = THUMB ? bits(machInst, 28) : bits(machInst, 24);
11227435Sgblack@eecs.umich.edu        const uint32_t a = bits(machInst, 11, 8);
11237639Sgblack@eecs.umich.edu        const unsigned size = bits(machInst, 21, 20);
11247639Sgblack@eecs.umich.edu        const IntRegIndex vd =
11257639Sgblack@eecs.umich.edu            (IntRegIndex)(2 * (bits(machInst, 15, 12) |
11267639Sgblack@eecs.umich.edu                               (bits(machInst, 22) << 4)));
11277639Sgblack@eecs.umich.edu        const IntRegIndex vn =
11287639Sgblack@eecs.umich.edu            (IntRegIndex)(2 * (bits(machInst, 19, 16) |
11297639Sgblack@eecs.umich.edu                               (bits(machInst, 7) << 4)));
11307639Sgblack@eecs.umich.edu        const IntRegIndex vm = (size == 2) ?
11317639Sgblack@eecs.umich.edu            (IntRegIndex)(2 * bits(machInst, 3, 0)) :
11327639Sgblack@eecs.umich.edu            (IntRegIndex)(2 * bits(machInst, 2, 0));
11337639Sgblack@eecs.umich.edu        const unsigned index = (size == 2) ? (unsigned)bits(machInst, 5) :
11347639Sgblack@eecs.umich.edu            (bits(machInst, 3) | (bits(machInst, 5) << 1));
11357435Sgblack@eecs.umich.edu        switch (a) {
11367435Sgblack@eecs.umich.edu          case 0x0:
11377639Sgblack@eecs.umich.edu            if (u) {
11387639Sgblack@eecs.umich.edu                switch (size) {
11397639Sgblack@eecs.umich.edu                  case 1:
11407639Sgblack@eecs.umich.edu                    return new VmlasQ<uint16_t>(machInst, vd, vn, vm, index);
11417639Sgblack@eecs.umich.edu                  case 2:
11427639Sgblack@eecs.umich.edu                    return new VmlasQ<uint32_t>(machInst, vd, vn, vm, index);
11437639Sgblack@eecs.umich.edu                  default:
11447639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
11457639Sgblack@eecs.umich.edu                }
11467639Sgblack@eecs.umich.edu            } else {
11477639Sgblack@eecs.umich.edu                switch (size) {
11487639Sgblack@eecs.umich.edu                  case 1:
11497639Sgblack@eecs.umich.edu                    return new VmlasD<uint16_t>(machInst, vd, vn, vm, index);
11507639Sgblack@eecs.umich.edu                  case 2:
11517639Sgblack@eecs.umich.edu                    return new VmlasD<uint32_t>(machInst, vd, vn, vm, index);
11527639Sgblack@eecs.umich.edu                  default:
11537639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
11547639Sgblack@eecs.umich.edu                }
11557639Sgblack@eecs.umich.edu            }
11567435Sgblack@eecs.umich.edu          case 0x1:
11577639Sgblack@eecs.umich.edu            if (u)
11587639Sgblack@eecs.umich.edu                return new VmlasQFp<float>(machInst, vd, vn, vm, index);
11597639Sgblack@eecs.umich.edu            else
11607639Sgblack@eecs.umich.edu                return new VmlasDFp<float>(machInst, vd, vn, vm, index);
11617435Sgblack@eecs.umich.edu          case 0x4:
11627639Sgblack@eecs.umich.edu            if (u) {
11637639Sgblack@eecs.umich.edu                switch (size) {
11647639Sgblack@eecs.umich.edu                  case 1:
11657639Sgblack@eecs.umich.edu                    return new VmlssQ<uint16_t>(machInst, vd, vn, vm, index);
11667639Sgblack@eecs.umich.edu                  case 2:
11677639Sgblack@eecs.umich.edu                    return new VmlssQ<uint32_t>(machInst, vd, vn, vm, index);
11687639Sgblack@eecs.umich.edu                  default:
11697639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
11707639Sgblack@eecs.umich.edu                }
11717639Sgblack@eecs.umich.edu            } else {
11727639Sgblack@eecs.umich.edu                switch (size) {
11737639Sgblack@eecs.umich.edu                  case 1:
11747639Sgblack@eecs.umich.edu                    return new VmlssD<uint16_t>(machInst, vd, vn, vm, index);
11757639Sgblack@eecs.umich.edu                  case 2:
11767639Sgblack@eecs.umich.edu                    return new VmlssD<uint32_t>(machInst, vd, vn, vm, index);
11777639Sgblack@eecs.umich.edu                  default:
11787639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
11797639Sgblack@eecs.umich.edu                }
11807639Sgblack@eecs.umich.edu            }
11817435Sgblack@eecs.umich.edu          case 0x5:
11827639Sgblack@eecs.umich.edu            if (u)
11837639Sgblack@eecs.umich.edu                return new VmlssQFp<float>(machInst, vd, vn, vm, index);
11847639Sgblack@eecs.umich.edu            else
11857639Sgblack@eecs.umich.edu                return new VmlssDFp<float>(machInst, vd, vn, vm, index);
11867435Sgblack@eecs.umich.edu          case 0x2:
11877639Sgblack@eecs.umich.edu            if (u) {
11887639Sgblack@eecs.umich.edu                switch (size) {
11897639Sgblack@eecs.umich.edu                  case 1:
11907639Sgblack@eecs.umich.edu                    return new Vmlals<uint16_t>(machInst, vd, vn, vm, index);
11917639Sgblack@eecs.umich.edu                  case 2:
11927639Sgblack@eecs.umich.edu                    return new Vmlals<uint32_t>(machInst, vd, vn, vm, index);
11937639Sgblack@eecs.umich.edu                  default:
11947639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
11957639Sgblack@eecs.umich.edu                }
11967639Sgblack@eecs.umich.edu            } else {
11977639Sgblack@eecs.umich.edu                switch (size) {
11987639Sgblack@eecs.umich.edu                  case 1:
11997639Sgblack@eecs.umich.edu                    return new Vmlals<int16_t>(machInst, vd, vn, vm, index);
12007639Sgblack@eecs.umich.edu                  case 2:
12017639Sgblack@eecs.umich.edu                    return new Vmlals<int32_t>(machInst, vd, vn, vm, index);
12027639Sgblack@eecs.umich.edu                  default:
12037639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
12047639Sgblack@eecs.umich.edu                }
12057639Sgblack@eecs.umich.edu            }
12067435Sgblack@eecs.umich.edu          case 0x6:
12077639Sgblack@eecs.umich.edu            if (u) {
12087639Sgblack@eecs.umich.edu                switch (size) {
12097639Sgblack@eecs.umich.edu                  case 1:
12107639Sgblack@eecs.umich.edu                    return new Vmlsls<uint16_t>(machInst, vd, vn, vm, index);
12117639Sgblack@eecs.umich.edu                  case 2:
12127639Sgblack@eecs.umich.edu                    return new Vmlsls<uint32_t>(machInst, vd, vn, vm, index);
12137639Sgblack@eecs.umich.edu                  default:
12147639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
12157639Sgblack@eecs.umich.edu                }
12167639Sgblack@eecs.umich.edu            } else {
12177639Sgblack@eecs.umich.edu                switch (size) {
12187639Sgblack@eecs.umich.edu                  case 1:
12197639Sgblack@eecs.umich.edu                    return new Vmlsls<int16_t>(machInst, vd, vn, vm, index);
12207639Sgblack@eecs.umich.edu                  case 2:
12217639Sgblack@eecs.umich.edu                    return new Vmlsls<int32_t>(machInst, vd, vn, vm, index);
12227639Sgblack@eecs.umich.edu                  default:
12237639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
12247639Sgblack@eecs.umich.edu                }
12257639Sgblack@eecs.umich.edu            }
12267435Sgblack@eecs.umich.edu          case 0x3:
12277435Sgblack@eecs.umich.edu            if (u) {
12287435Sgblack@eecs.umich.edu                return new Unknown(machInst);
12297435Sgblack@eecs.umich.edu            } else {
12307639Sgblack@eecs.umich.edu                switch (size) {
12317639Sgblack@eecs.umich.edu                  case 1:
12327639Sgblack@eecs.umich.edu                    return new Vqdmlals<int16_t>(machInst, vd, vn, vm, index);
12337639Sgblack@eecs.umich.edu                  case 2:
12347639Sgblack@eecs.umich.edu                    return new Vqdmlals<int32_t>(machInst, vd, vn, vm, index);
12357639Sgblack@eecs.umich.edu                  default:
12367639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
12377639Sgblack@eecs.umich.edu                }
12387435Sgblack@eecs.umich.edu            }
12397435Sgblack@eecs.umich.edu          case 0x7:
12407435Sgblack@eecs.umich.edu            if (u) {
12417435Sgblack@eecs.umich.edu                return new Unknown(machInst);
12427435Sgblack@eecs.umich.edu            } else {
12437639Sgblack@eecs.umich.edu                switch (size) {
12447639Sgblack@eecs.umich.edu                  case 1:
12457639Sgblack@eecs.umich.edu                    return new Vqdmlsls<int16_t>(machInst, vd, vn, vm, index);
12467639Sgblack@eecs.umich.edu                  case 2:
12477639Sgblack@eecs.umich.edu                    return new Vqdmlsls<int32_t>(machInst, vd, vn, vm, index);
12487639Sgblack@eecs.umich.edu                  default:
12497639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
12507639Sgblack@eecs.umich.edu                }
12517435Sgblack@eecs.umich.edu            }
12527435Sgblack@eecs.umich.edu          case 0x8:
12537639Sgblack@eecs.umich.edu            if (u) {
12547639Sgblack@eecs.umich.edu                switch (size) {
12557639Sgblack@eecs.umich.edu                  case 1:
12567639Sgblack@eecs.umich.edu                    return new VmulsQ<uint16_t>(machInst, vd, vn, vm, index);
12577639Sgblack@eecs.umich.edu                  case 2:
12587639Sgblack@eecs.umich.edu                    return new VmulsQ<uint32_t>(machInst, vd, vn, vm, index);
12597639Sgblack@eecs.umich.edu                  default:
12607639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
12617639Sgblack@eecs.umich.edu                }
12627639Sgblack@eecs.umich.edu            } else {
12637639Sgblack@eecs.umich.edu                switch (size) {
12647639Sgblack@eecs.umich.edu                  case 1:
12657639Sgblack@eecs.umich.edu                    return new VmulsD<uint16_t>(machInst, vd, vn, vm, index);
12667639Sgblack@eecs.umich.edu                  case 2:
12677639Sgblack@eecs.umich.edu                    return new VmulsD<uint32_t>(machInst, vd, vn, vm, index);
12687639Sgblack@eecs.umich.edu                  default:
12697639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
12707639Sgblack@eecs.umich.edu                }
12717639Sgblack@eecs.umich.edu            }
12727435Sgblack@eecs.umich.edu          case 0x9:
12737639Sgblack@eecs.umich.edu            if (u)
12747639Sgblack@eecs.umich.edu                return new VmulsQFp<float>(machInst, vd, vn, vm, index);
12757639Sgblack@eecs.umich.edu            else
12767639Sgblack@eecs.umich.edu                return new VmulsDFp<float>(machInst, vd, vn, vm, index);
12777435Sgblack@eecs.umich.edu          case 0xa:
12787639Sgblack@eecs.umich.edu            if (u) {
12797639Sgblack@eecs.umich.edu                switch (size) {
12807639Sgblack@eecs.umich.edu                  case 1:
12817639Sgblack@eecs.umich.edu                    return new Vmulls<uint16_t>(machInst, vd, vn, vm, index);
12827639Sgblack@eecs.umich.edu                  case 2:
12837639Sgblack@eecs.umich.edu                    return new Vmulls<uint32_t>(machInst, vd, vn, vm, index);
12847639Sgblack@eecs.umich.edu                  default:
12857639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
12867639Sgblack@eecs.umich.edu                }
12877639Sgblack@eecs.umich.edu            } else {
12887639Sgblack@eecs.umich.edu                switch (size) {
12897639Sgblack@eecs.umich.edu                  case 1:
12907639Sgblack@eecs.umich.edu                    return new Vmulls<int16_t>(machInst, vd, vn, vm, index);
12917639Sgblack@eecs.umich.edu                  case 2:
12927639Sgblack@eecs.umich.edu                    return new Vmulls<int32_t>(machInst, vd, vn, vm, index);
12937639Sgblack@eecs.umich.edu                  default:
12947639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
12957639Sgblack@eecs.umich.edu                }
12967639Sgblack@eecs.umich.edu            }
12977435Sgblack@eecs.umich.edu          case 0xb:
12987435Sgblack@eecs.umich.edu            if (u) {
12997435Sgblack@eecs.umich.edu                return new Unknown(machInst);
13007435Sgblack@eecs.umich.edu            } else {
13017639Sgblack@eecs.umich.edu                if (u) {
13027639Sgblack@eecs.umich.edu                    switch (size) {
13037639Sgblack@eecs.umich.edu                      case 1:
13047639Sgblack@eecs.umich.edu                        return new Vqdmulls<uint16_t>(
13057639Sgblack@eecs.umich.edu                                machInst, vd, vn, vm, index);
13067639Sgblack@eecs.umich.edu                      case 2:
13077639Sgblack@eecs.umich.edu                        return new Vqdmulls<uint32_t>(
13087639Sgblack@eecs.umich.edu                                machInst, vd, vn, vm, index);
13097639Sgblack@eecs.umich.edu                      default:
13107639Sgblack@eecs.umich.edu                        return new Unknown(machInst);
13117639Sgblack@eecs.umich.edu                    }
13127639Sgblack@eecs.umich.edu                } else {
13137639Sgblack@eecs.umich.edu                    switch (size) {
13147639Sgblack@eecs.umich.edu                      case 1:
13157639Sgblack@eecs.umich.edu                        return new Vqdmulls<int16_t>(
13167639Sgblack@eecs.umich.edu                                machInst, vd, vn, vm, index);
13177639Sgblack@eecs.umich.edu                      case 2:
13187639Sgblack@eecs.umich.edu                        return new Vqdmulls<int32_t>(
13197639Sgblack@eecs.umich.edu                                machInst, vd, vn, vm, index);
13207639Sgblack@eecs.umich.edu                      default:
13217639Sgblack@eecs.umich.edu                        return new Unknown(machInst);
13227639Sgblack@eecs.umich.edu                    }
13237639Sgblack@eecs.umich.edu                }
13247435Sgblack@eecs.umich.edu            }
13257435Sgblack@eecs.umich.edu          case 0xc:
13267639Sgblack@eecs.umich.edu            if (u) {
13277639Sgblack@eecs.umich.edu                switch (size) {
13287639Sgblack@eecs.umich.edu                  case 1:
13297639Sgblack@eecs.umich.edu                    return new VqdmulhsQ<int16_t>(
13307639Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, index);
13317639Sgblack@eecs.umich.edu                  case 2:
13327639Sgblack@eecs.umich.edu                    return new VqdmulhsQ<int32_t>(
13337639Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, index);
13347639Sgblack@eecs.umich.edu                  default:
13357639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
13367639Sgblack@eecs.umich.edu                }
13377639Sgblack@eecs.umich.edu            } else {
13387639Sgblack@eecs.umich.edu                switch (size) {
13397639Sgblack@eecs.umich.edu                  case 1:
13407639Sgblack@eecs.umich.edu                    return new VqdmulhsD<int16_t>(
13417639Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, index);
13427639Sgblack@eecs.umich.edu                  case 2:
13437639Sgblack@eecs.umich.edu                    return new VqdmulhsD<int32_t>(
13447639Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, index);
13457639Sgblack@eecs.umich.edu                  default:
13467639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
13477639Sgblack@eecs.umich.edu                }
13487639Sgblack@eecs.umich.edu            }
13497435Sgblack@eecs.umich.edu          case 0xd:
13507639Sgblack@eecs.umich.edu            if (u) {
13517639Sgblack@eecs.umich.edu                switch (size) {
13527639Sgblack@eecs.umich.edu                  case 1:
13537639Sgblack@eecs.umich.edu                    return new VqrdmulhsQ<int16_t>(
13547639Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, index);
13557639Sgblack@eecs.umich.edu                  case 2:
13567639Sgblack@eecs.umich.edu                    return new VqrdmulhsQ<int32_t>(
13577639Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, index);
13587639Sgblack@eecs.umich.edu                  default:
13597639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
13607639Sgblack@eecs.umich.edu                }
13617639Sgblack@eecs.umich.edu            } else {
13627639Sgblack@eecs.umich.edu                switch (size) {
13637639Sgblack@eecs.umich.edu                  case 1:
13647639Sgblack@eecs.umich.edu                    return new VqrdmulhsD<int16_t>(
13657639Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, index);
13667639Sgblack@eecs.umich.edu                  case 2:
13677639Sgblack@eecs.umich.edu                    return new VqrdmulhsD<int32_t>(
13687639Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, index);
13697639Sgblack@eecs.umich.edu                  default:
13707639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
13717639Sgblack@eecs.umich.edu                }
13727639Sgblack@eecs.umich.edu            }
13737435Sgblack@eecs.umich.edu        }
13747435Sgblack@eecs.umich.edu        return new Unknown(machInst);
13757435Sgblack@eecs.umich.edu    }
13767435Sgblack@eecs.umich.edu
13777435Sgblack@eecs.umich.edu    static StaticInstPtr
13787435Sgblack@eecs.umich.edu    decodeNeonTwoRegMisc(ExtMachInst machInst)
13797435Sgblack@eecs.umich.edu    {
13807435Sgblack@eecs.umich.edu        const uint32_t a = bits(machInst, 17, 16);
13817435Sgblack@eecs.umich.edu        const uint32_t b = bits(machInst, 10, 6);
13827639Sgblack@eecs.umich.edu        const bool q = bits(machInst, 6);
13837639Sgblack@eecs.umich.edu        const IntRegIndex vd =
13847639Sgblack@eecs.umich.edu            (IntRegIndex)(2 * (bits(machInst, 15, 12) |
13857639Sgblack@eecs.umich.edu                               (bits(machInst, 22) << 4)));
13867639Sgblack@eecs.umich.edu        const IntRegIndex vm =
13877639Sgblack@eecs.umich.edu            (IntRegIndex)(2 * (bits(machInst, 3, 0) |
13887639Sgblack@eecs.umich.edu                               (bits(machInst, 5) << 4)));
13897639Sgblack@eecs.umich.edu        const unsigned size = bits(machInst, 19, 18);
13907435Sgblack@eecs.umich.edu        switch (a) {
13917435Sgblack@eecs.umich.edu          case 0x0:
13927435Sgblack@eecs.umich.edu            switch (bits(b, 4, 1)) {
13937435Sgblack@eecs.umich.edu              case 0x0:
13947639Sgblack@eecs.umich.edu                switch (size) {
13957639Sgblack@eecs.umich.edu                  case 0:
13967639Sgblack@eecs.umich.edu                    if (q) {
13977639Sgblack@eecs.umich.edu                        return new NVrev64Q<uint8_t>(machInst, vd, vm);
13987639Sgblack@eecs.umich.edu                    } else {
13997639Sgblack@eecs.umich.edu                        return new NVrev64D<uint8_t>(machInst, vd, vm);
14007639Sgblack@eecs.umich.edu                    }
14017639Sgblack@eecs.umich.edu                  case 1:
14027639Sgblack@eecs.umich.edu                    if (q) {
14037639Sgblack@eecs.umich.edu                        return new NVrev64Q<uint16_t>(machInst, vd, vm);
14047639Sgblack@eecs.umich.edu                    } else {
14057639Sgblack@eecs.umich.edu                        return new NVrev64D<uint16_t>(machInst, vd, vm);
14067639Sgblack@eecs.umich.edu                    }
14077639Sgblack@eecs.umich.edu                  case 2:
14087639Sgblack@eecs.umich.edu                    if (q) {
14097639Sgblack@eecs.umich.edu                        return new NVrev64Q<uint32_t>(machInst, vd, vm);
14107639Sgblack@eecs.umich.edu                    } else {
14117639Sgblack@eecs.umich.edu                        return new NVrev64D<uint32_t>(machInst, vd, vm);
14127639Sgblack@eecs.umich.edu                    }
14137639Sgblack@eecs.umich.edu                  default:
14147639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
14157639Sgblack@eecs.umich.edu                }
14167435Sgblack@eecs.umich.edu              case 0x1:
14177639Sgblack@eecs.umich.edu                switch (size) {
14187639Sgblack@eecs.umich.edu                  case 0:
14197639Sgblack@eecs.umich.edu                    if (q) {
14207639Sgblack@eecs.umich.edu                        return new NVrev32Q<uint8_t>(machInst, vd, vm);
14217639Sgblack@eecs.umich.edu                    } else {
14227639Sgblack@eecs.umich.edu                        return new NVrev32D<uint8_t>(machInst, vd, vm);
14237639Sgblack@eecs.umich.edu                    }
14247639Sgblack@eecs.umich.edu                  case 1:
14257639Sgblack@eecs.umich.edu                    if (q) {
14267639Sgblack@eecs.umich.edu                        return new NVrev32Q<uint16_t>(machInst, vd, vm);
14277639Sgblack@eecs.umich.edu                    } else {
14287639Sgblack@eecs.umich.edu                        return new NVrev32D<uint16_t>(machInst, vd, vm);
14297639Sgblack@eecs.umich.edu                    }
14307639Sgblack@eecs.umich.edu                  default:
14317639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
14327639Sgblack@eecs.umich.edu                }
14337435Sgblack@eecs.umich.edu              case 0x2:
14347639Sgblack@eecs.umich.edu                if (size != 0) {
14357639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
14367639Sgblack@eecs.umich.edu                } else if (q) {
14377639Sgblack@eecs.umich.edu                    return new NVrev16Q<uint8_t>(machInst, vd, vm);
14387639Sgblack@eecs.umich.edu                } else {
14397639Sgblack@eecs.umich.edu                    return new NVrev16D<uint8_t>(machInst, vd, vm);
14407639Sgblack@eecs.umich.edu                }
14417435Sgblack@eecs.umich.edu              case 0x4:
14427639Sgblack@eecs.umich.edu                return decodeNeonSTwoMiscSReg<NVpaddlD, NVpaddlQ>(
14437639Sgblack@eecs.umich.edu                        q, size, machInst, vd, vm);
14447435Sgblack@eecs.umich.edu              case 0x5:
14457639Sgblack@eecs.umich.edu                return decodeNeonUTwoMiscSReg<NVpaddlD, NVpaddlQ>(
14467639Sgblack@eecs.umich.edu                        q, size, machInst, vd, vm);
14477435Sgblack@eecs.umich.edu              case 0x8:
14487639Sgblack@eecs.umich.edu                return decodeNeonSTwoMiscReg<NVclsD, NVclsQ>(
14497639Sgblack@eecs.umich.edu                        q, size, machInst, vd, vm);
14507435Sgblack@eecs.umich.edu              case 0x9:
14517639Sgblack@eecs.umich.edu                return decodeNeonSTwoMiscReg<NVclzD, NVclzQ>(
14527639Sgblack@eecs.umich.edu                        q, size, machInst, vd, vm);
14537435Sgblack@eecs.umich.edu              case 0xa:
14547639Sgblack@eecs.umich.edu                return decodeNeonUTwoMiscReg<NVcntD, NVcntQ>(
14557639Sgblack@eecs.umich.edu                        q, size, machInst, vd, vm);
14567435Sgblack@eecs.umich.edu              case 0xb:
14577639Sgblack@eecs.umich.edu                if (q)
14587639Sgblack@eecs.umich.edu                    return new NVmvnQ<uint64_t>(machInst, vd, vm);
14597639Sgblack@eecs.umich.edu                else
14607639Sgblack@eecs.umich.edu                    return new NVmvnD<uint64_t>(machInst, vd, vm);
14617435Sgblack@eecs.umich.edu              case 0xc:
14627639Sgblack@eecs.umich.edu                return decodeNeonSTwoMiscSReg<NVpadalD, NVpadalQ>(
14637639Sgblack@eecs.umich.edu                        q, size, machInst, vd, vm);
14647435Sgblack@eecs.umich.edu              case 0xd:
14657639Sgblack@eecs.umich.edu                return decodeNeonUTwoMiscSReg<NVpadalD, NVpadalQ>(
14667639Sgblack@eecs.umich.edu                        q, size, machInst, vd, vm);
14677435Sgblack@eecs.umich.edu              case 0xe:
14687639Sgblack@eecs.umich.edu                return decodeNeonSTwoMiscReg<NVqabsD, NVqabsQ>(
14697639Sgblack@eecs.umich.edu                        q, size, machInst, vd, vm);
14707435Sgblack@eecs.umich.edu              case 0xf:
14717639Sgblack@eecs.umich.edu                return decodeNeonSTwoMiscReg<NVqnegD, NVqnegQ>(
14727639Sgblack@eecs.umich.edu                        q, size, machInst, vd, vm);
14737435Sgblack@eecs.umich.edu              default:
14747435Sgblack@eecs.umich.edu                return new Unknown(machInst);
14757435Sgblack@eecs.umich.edu            }
14767435Sgblack@eecs.umich.edu          case 0x1:
14777435Sgblack@eecs.umich.edu            switch (bits(b, 3, 1)) {
14787435Sgblack@eecs.umich.edu              case 0x0:
14797639Sgblack@eecs.umich.edu                if (bits(b, 4)) {
14807639Sgblack@eecs.umich.edu                    if (q) {
14817639Sgblack@eecs.umich.edu                        return new NVcgtQFp<float>(machInst, vd, vm);
14827639Sgblack@eecs.umich.edu                    } else {
14837639Sgblack@eecs.umich.edu                        return new NVcgtDFp<float>(machInst, vd, vm);
14847639Sgblack@eecs.umich.edu                    }
14857639Sgblack@eecs.umich.edu                } else {
14867639Sgblack@eecs.umich.edu                    return decodeNeonSTwoMiscReg<NVcgtD, NVcgtQ>(
14877639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vm);
14887639Sgblack@eecs.umich.edu                }
14897435Sgblack@eecs.umich.edu              case 0x1:
14907639Sgblack@eecs.umich.edu                if (bits(b, 4)) {
14917639Sgblack@eecs.umich.edu                    if (q) {
14927639Sgblack@eecs.umich.edu                        return new NVcgeQFp<float>(machInst, vd, vm);
14937639Sgblack@eecs.umich.edu                    } else {
14947639Sgblack@eecs.umich.edu                        return new NVcgeDFp<float>(machInst, vd, vm);
14957639Sgblack@eecs.umich.edu                    }
14967639Sgblack@eecs.umich.edu                } else {
14977639Sgblack@eecs.umich.edu                    return decodeNeonSTwoMiscReg<NVcgeD, NVcgeQ>(
14987639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vm);
14997639Sgblack@eecs.umich.edu                }
15007435Sgblack@eecs.umich.edu              case 0x2:
15017639Sgblack@eecs.umich.edu                if (bits(b, 4)) {
15027639Sgblack@eecs.umich.edu                    if (q) {
15037639Sgblack@eecs.umich.edu                        return new NVceqQFp<float>(machInst, vd, vm);
15047639Sgblack@eecs.umich.edu                    } else {
15057639Sgblack@eecs.umich.edu                        return new NVceqDFp<float>(machInst, vd, vm);
15067639Sgblack@eecs.umich.edu                    }
15077639Sgblack@eecs.umich.edu                } else {
15087639Sgblack@eecs.umich.edu                    return decodeNeonSTwoMiscReg<NVceqD, NVceqQ>(
15097639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vm);
15107639Sgblack@eecs.umich.edu                }
15117435Sgblack@eecs.umich.edu              case 0x3:
15127639Sgblack@eecs.umich.edu                if (bits(b, 4)) {
15137639Sgblack@eecs.umich.edu                    if (q) {
15147639Sgblack@eecs.umich.edu                        return new NVcleQFp<float>(machInst, vd, vm);
15157639Sgblack@eecs.umich.edu                    } else {
15167639Sgblack@eecs.umich.edu                        return new NVcleDFp<float>(machInst, vd, vm);
15177639Sgblack@eecs.umich.edu                    }
15187639Sgblack@eecs.umich.edu                } else {
15197639Sgblack@eecs.umich.edu                    return decodeNeonSTwoMiscReg<NVcleD, NVcleQ>(
15207639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vm);
15217639Sgblack@eecs.umich.edu                }
15227435Sgblack@eecs.umich.edu              case 0x4:
15237639Sgblack@eecs.umich.edu                if (bits(b, 4)) {
15247639Sgblack@eecs.umich.edu                    if (q) {
15257639Sgblack@eecs.umich.edu                        return new NVcltQFp<float>(machInst, vd, vm);
15267639Sgblack@eecs.umich.edu                    } else {
15277639Sgblack@eecs.umich.edu                        return new NVcltDFp<float>(machInst, vd, vm);
15287639Sgblack@eecs.umich.edu                    }
15297639Sgblack@eecs.umich.edu                } else {
15307639Sgblack@eecs.umich.edu                    return decodeNeonSTwoMiscReg<NVcltD, NVcltQ>(
15317639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vm);
15327639Sgblack@eecs.umich.edu                }
15337435Sgblack@eecs.umich.edu              case 0x6:
15347639Sgblack@eecs.umich.edu                if (bits(machInst, 10)) {
15357639Sgblack@eecs.umich.edu                    if (q)
15367639Sgblack@eecs.umich.edu                        return new NVabsQFp<float>(machInst, vd, vm);
15377639Sgblack@eecs.umich.edu                    else
15387639Sgblack@eecs.umich.edu                        return new NVabsDFp<float>(machInst, vd, vm);
15397639Sgblack@eecs.umich.edu                } else {
15407639Sgblack@eecs.umich.edu                    return decodeNeonSTwoMiscReg<NVabsD, NVabsQ>(
15417639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vm);
15427639Sgblack@eecs.umich.edu                }
15437435Sgblack@eecs.umich.edu              case 0x7:
15447639Sgblack@eecs.umich.edu                if (bits(machInst, 10)) {
15457639Sgblack@eecs.umich.edu                    if (q)
15467639Sgblack@eecs.umich.edu                        return new NVnegQFp<float>(machInst, vd, vm);
15477639Sgblack@eecs.umich.edu                    else
15487639Sgblack@eecs.umich.edu                        return new NVnegDFp<float>(machInst, vd, vm);
15497639Sgblack@eecs.umich.edu                } else {
15507639Sgblack@eecs.umich.edu                    return decodeNeonSTwoMiscReg<NVnegD, NVnegQ>(
15517639Sgblack@eecs.umich.edu                            q, size, machInst, vd, vm);
15527639Sgblack@eecs.umich.edu                }
15537435Sgblack@eecs.umich.edu            }
15547435Sgblack@eecs.umich.edu          case 0x2:
15557435Sgblack@eecs.umich.edu            switch (bits(b, 4, 1)) {
15567435Sgblack@eecs.umich.edu              case 0x0:
15577639Sgblack@eecs.umich.edu                if (q)
15587639Sgblack@eecs.umich.edu                    return new NVswpQ<uint64_t>(machInst, vd, vm);
15597639Sgblack@eecs.umich.edu                else
15607639Sgblack@eecs.umich.edu                    return new NVswpD<uint64_t>(machInst, vd, vm);
15617435Sgblack@eecs.umich.edu              case 0x1:
15628607Sgblack@eecs.umich.edu                return decodeNeonUTwoMiscSReg<NVtrnD, NVtrnQ>(
15637639Sgblack@eecs.umich.edu                        q, size, machInst, vd, vm);
15647435Sgblack@eecs.umich.edu              case 0x2:
15657639Sgblack@eecs.umich.edu                return decodeNeonUTwoMiscReg<NVuzpD, NVuzpQ>(
15667639Sgblack@eecs.umich.edu                        q, size, machInst, vd, vm);
15677435Sgblack@eecs.umich.edu              case 0x3:
15687639Sgblack@eecs.umich.edu                return decodeNeonUTwoMiscReg<NVzipD, NVzipQ>(
15697639Sgblack@eecs.umich.edu                        q, size, machInst, vd, vm);
15707435Sgblack@eecs.umich.edu              case 0x4:
15717435Sgblack@eecs.umich.edu                if (b == 0x8) {
15727639Sgblack@eecs.umich.edu                    return decodeNeonUTwoMiscUSReg<NVmovn>(
15737639Sgblack@eecs.umich.edu                            size, machInst, vd, vm);
15747435Sgblack@eecs.umich.edu                } else {
15757639Sgblack@eecs.umich.edu                    return decodeNeonSTwoMiscUSReg<NVqmovuns>(
15767639Sgblack@eecs.umich.edu                            size, machInst, vd, vm);
15777435Sgblack@eecs.umich.edu                }
15787435Sgblack@eecs.umich.edu              case 0x5:
15797639Sgblack@eecs.umich.edu                if (q) {
15807639Sgblack@eecs.umich.edu                    return decodeNeonUTwoMiscUSReg<NVqmovun>(
15817639Sgblack@eecs.umich.edu                            size, machInst, vd, vm);
15827639Sgblack@eecs.umich.edu                } else {
15837639Sgblack@eecs.umich.edu                    return decodeNeonSTwoMiscUSReg<NVqmovn>(
15847639Sgblack@eecs.umich.edu                            size, machInst, vd, vm);
15857639Sgblack@eecs.umich.edu                }
15867435Sgblack@eecs.umich.edu              case 0x6:
15877435Sgblack@eecs.umich.edu                if (b == 0xc) {
15887639Sgblack@eecs.umich.edu                    return decodeNeonSTwoShiftUSReg<NVshll>(
15897639Sgblack@eecs.umich.edu                            size, machInst, vd, vm, 8 << size);
15907435Sgblack@eecs.umich.edu                } else {
15917435Sgblack@eecs.umich.edu                    return new Unknown(machInst);
15927435Sgblack@eecs.umich.edu                }
15937435Sgblack@eecs.umich.edu              case 0xc:
15947435Sgblack@eecs.umich.edu              case 0xe:
15957435Sgblack@eecs.umich.edu                if (b == 0x18) {
15967639Sgblack@eecs.umich.edu                    if (size != 1 || (vm % 2))
15977639Sgblack@eecs.umich.edu                        return new Unknown(machInst);
15987639Sgblack@eecs.umich.edu                    return new NVcvts2h<uint16_t>(machInst, vd, vm);
15997435Sgblack@eecs.umich.edu                } else if (b == 0x1c) {
16007639Sgblack@eecs.umich.edu                    if (size != 1 || (vd % 2))
16017639Sgblack@eecs.umich.edu                        return new Unknown(machInst);
16027639Sgblack@eecs.umich.edu                    return new NVcvth2s<uint16_t>(machInst, vd, vm);
16037435Sgblack@eecs.umich.edu                } else {
16047435Sgblack@eecs.umich.edu                    return new Unknown(machInst);
16057435Sgblack@eecs.umich.edu                }
16067435Sgblack@eecs.umich.edu              default:
16077435Sgblack@eecs.umich.edu                return new Unknown(machInst);
16087435Sgblack@eecs.umich.edu            }
16097435Sgblack@eecs.umich.edu          case 0x3:
16107435Sgblack@eecs.umich.edu            if (bits(b, 4, 3) == 0x3) {
16117639Sgblack@eecs.umich.edu                if ((q && (vd % 2 || vm % 2)) || size != 2) {
16127639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
16137639Sgblack@eecs.umich.edu                } else {
16147639Sgblack@eecs.umich.edu                    if (bits(b, 2)) {
16157639Sgblack@eecs.umich.edu                        if (bits(b, 1)) {
16167639Sgblack@eecs.umich.edu                            if (q) {
16177639Sgblack@eecs.umich.edu                                return new NVcvt2ufxQ<float>(
16187639Sgblack@eecs.umich.edu                                        machInst, vd, vm, 0);
16197639Sgblack@eecs.umich.edu                            } else {
16207639Sgblack@eecs.umich.edu                                return new NVcvt2ufxD<float>(
16217639Sgblack@eecs.umich.edu                                        machInst, vd, vm, 0);
16227639Sgblack@eecs.umich.edu                            }
16237639Sgblack@eecs.umich.edu                        } else {
16247639Sgblack@eecs.umich.edu                            if (q) {
16257639Sgblack@eecs.umich.edu                                return new NVcvt2sfxQ<float>(
16267639Sgblack@eecs.umich.edu                                        machInst, vd, vm, 0);
16277639Sgblack@eecs.umich.edu                            } else {
16287639Sgblack@eecs.umich.edu                                return new NVcvt2sfxD<float>(
16297639Sgblack@eecs.umich.edu                                        machInst, vd, vm, 0);
16307639Sgblack@eecs.umich.edu                            }
16317639Sgblack@eecs.umich.edu                        }
16327639Sgblack@eecs.umich.edu                    } else {
16337639Sgblack@eecs.umich.edu                        if (bits(b, 1)) {
16347639Sgblack@eecs.umich.edu                            if (q) {
16357639Sgblack@eecs.umich.edu                                return new NVcvtu2fpQ<float>(
16367639Sgblack@eecs.umich.edu                                        machInst, vd, vm, 0);
16377639Sgblack@eecs.umich.edu                            } else {
16387639Sgblack@eecs.umich.edu                                return new NVcvtu2fpD<float>(
16397639Sgblack@eecs.umich.edu                                        machInst, vd, vm, 0);
16407639Sgblack@eecs.umich.edu                            }
16417639Sgblack@eecs.umich.edu                        } else {
16427639Sgblack@eecs.umich.edu                            if (q) {
16437639Sgblack@eecs.umich.edu                                return new NVcvts2fpQ<float>(
16447639Sgblack@eecs.umich.edu                                        machInst, vd, vm, 0);
16457639Sgblack@eecs.umich.edu                            } else {
16467639Sgblack@eecs.umich.edu                                return new NVcvts2fpD<float>(
16477639Sgblack@eecs.umich.edu                                        machInst, vd, vm, 0);
16487639Sgblack@eecs.umich.edu                            }
16497639Sgblack@eecs.umich.edu                        }
16507639Sgblack@eecs.umich.edu                    }
16517639Sgblack@eecs.umich.edu                }
16527435Sgblack@eecs.umich.edu            } else if ((b & 0x1a) == 0x10) {
16537639Sgblack@eecs.umich.edu                if (bits(b, 2)) {
16547639Sgblack@eecs.umich.edu                    if (q) {
16557639Sgblack@eecs.umich.edu                        return new NVrecpeQFp<float>(machInst, vd, vm);
16567639Sgblack@eecs.umich.edu                    } else {
16577639Sgblack@eecs.umich.edu                        return new NVrecpeDFp<float>(machInst, vd, vm);
16587639Sgblack@eecs.umich.edu                    }
16597639Sgblack@eecs.umich.edu                } else {
16607639Sgblack@eecs.umich.edu                    if (q) {
16617639Sgblack@eecs.umich.edu                        return new NVrecpeQ<uint32_t>(machInst, vd, vm);
16627639Sgblack@eecs.umich.edu                    } else {
16637639Sgblack@eecs.umich.edu                        return new NVrecpeD<uint32_t>(machInst, vd, vm);
16647639Sgblack@eecs.umich.edu                    }
16657639Sgblack@eecs.umich.edu                }
16667435Sgblack@eecs.umich.edu            } else if ((b & 0x1a) == 0x12) {
16677639Sgblack@eecs.umich.edu                if (bits(b, 2)) {
16687639Sgblack@eecs.umich.edu                    if (q) {
16697639Sgblack@eecs.umich.edu                        return new NVrsqrteQFp<float>(machInst, vd, vm);
16707639Sgblack@eecs.umich.edu                    } else {
16717639Sgblack@eecs.umich.edu                        return new NVrsqrteDFp<float>(machInst, vd, vm);
16727639Sgblack@eecs.umich.edu                    }
16737639Sgblack@eecs.umich.edu                } else {
16747639Sgblack@eecs.umich.edu                    if (q) {
16757639Sgblack@eecs.umich.edu                        return new NVrsqrteQ<uint32_t>(machInst, vd, vm);
16767639Sgblack@eecs.umich.edu                    } else {
16777639Sgblack@eecs.umich.edu                        return new NVrsqrteD<uint32_t>(machInst, vd, vm);
16787639Sgblack@eecs.umich.edu                    }
16797639Sgblack@eecs.umich.edu                }
16807435Sgblack@eecs.umich.edu            } else {
16817435Sgblack@eecs.umich.edu                return new Unknown(machInst);
16827435Sgblack@eecs.umich.edu            }
16837435Sgblack@eecs.umich.edu        }
16847435Sgblack@eecs.umich.edu        return new Unknown(machInst);
16857435Sgblack@eecs.umich.edu    }
16867435Sgblack@eecs.umich.edu
16877435Sgblack@eecs.umich.edu    StaticInstPtr
16887435Sgblack@eecs.umich.edu    decodeNeonData(ExtMachInst machInst)
16897435Sgblack@eecs.umich.edu    {
16907435Sgblack@eecs.umich.edu        const bool u = THUMB ? bits(machInst, 28) : bits(machInst, 24);
16917435Sgblack@eecs.umich.edu        const uint32_t a = bits(machInst, 23, 19);
16927435Sgblack@eecs.umich.edu        const uint32_t b = bits(machInst, 11, 8);
16937435Sgblack@eecs.umich.edu        const uint32_t c = bits(machInst, 7, 4);
16947435Sgblack@eecs.umich.edu        if (bits(a, 4) == 0) {
16957435Sgblack@eecs.umich.edu            return decodeNeonThreeRegistersSameLength(machInst);
16967435Sgblack@eecs.umich.edu        } else if ((c & 0x9) == 1) {
16977435Sgblack@eecs.umich.edu            if ((a & 0x7) == 0) {
16987435Sgblack@eecs.umich.edu                return decodeNeonOneRegModImm(machInst);
16997435Sgblack@eecs.umich.edu            } else {
17007435Sgblack@eecs.umich.edu                return decodeNeonTwoRegAndShift(machInst);
17017435Sgblack@eecs.umich.edu            }
17027435Sgblack@eecs.umich.edu        } else if ((c & 0x9) == 9) {
17037435Sgblack@eecs.umich.edu            return decodeNeonTwoRegAndShift(machInst);
17047639Sgblack@eecs.umich.edu        } else if (bits(a, 2, 1) != 0x3) {
17057639Sgblack@eecs.umich.edu            if ((c & 0x5) == 0) {
17067435Sgblack@eecs.umich.edu                return decodeNeonThreeRegDiffLengths(machInst);
17077639Sgblack@eecs.umich.edu            } else if ((c & 0x5) == 4) {
17087435Sgblack@eecs.umich.edu                return decodeNeonTwoRegScalar(machInst);
17097435Sgblack@eecs.umich.edu            }
17107435Sgblack@eecs.umich.edu        } else if ((a & 0x16) == 0x16) {
17117639Sgblack@eecs.umich.edu            const IntRegIndex vd =
17127639Sgblack@eecs.umich.edu                (IntRegIndex)(2 * (bits(machInst, 15, 12) |
17137639Sgblack@eecs.umich.edu                                   (bits(machInst, 22) << 4)));
17147639Sgblack@eecs.umich.edu            const IntRegIndex vn =
17157639Sgblack@eecs.umich.edu                (IntRegIndex)(2 * (bits(machInst, 19, 16) |
17167639Sgblack@eecs.umich.edu                                   (bits(machInst, 7) << 4)));
17177639Sgblack@eecs.umich.edu            const IntRegIndex vm =
17187639Sgblack@eecs.umich.edu                (IntRegIndex)(2 * (bits(machInst, 3, 0) |
17197639Sgblack@eecs.umich.edu                                   (bits(machInst, 5) << 4)));
17207435Sgblack@eecs.umich.edu            if (!u) {
17217435Sgblack@eecs.umich.edu                if (bits(c, 0) == 0) {
17227639Sgblack@eecs.umich.edu                    unsigned imm4 = bits(machInst, 11, 8);
17237639Sgblack@eecs.umich.edu                    bool q = bits(machInst, 6);
17247639Sgblack@eecs.umich.edu                    if (imm4 >= 16 && !q)
17257639Sgblack@eecs.umich.edu                        return new Unknown(machInst);
17267639Sgblack@eecs.umich.edu                    if (q) {
17277639Sgblack@eecs.umich.edu                        return new NVextQ<uint8_t>(machInst, vd, vn, vm, imm4);
17287639Sgblack@eecs.umich.edu                    } else {
17297639Sgblack@eecs.umich.edu                        return new NVextD<uint8_t>(machInst, vd, vn, vm, imm4);
17307639Sgblack@eecs.umich.edu                    }
17317435Sgblack@eecs.umich.edu                }
17327435Sgblack@eecs.umich.edu            } else if (bits(b, 3) == 0 && bits(c, 0) == 0) {
17337435Sgblack@eecs.umich.edu                return decodeNeonTwoRegMisc(machInst);
17347435Sgblack@eecs.umich.edu            } else if (bits(b, 3, 2) == 0x2 && bits(c, 0) == 0) {
17357639Sgblack@eecs.umich.edu                unsigned length = bits(machInst, 9, 8) + 1;
17367639Sgblack@eecs.umich.edu                if ((uint32_t)vn / 2 + length > 32)
17377639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
17387435Sgblack@eecs.umich.edu                if (bits(machInst, 6) == 0) {
17397639Sgblack@eecs.umich.edu                    switch (length) {
17407639Sgblack@eecs.umich.edu                      case 1:
17417639Sgblack@eecs.umich.edu                        return new NVtbl1(machInst, vd, vn, vm);
17427639Sgblack@eecs.umich.edu                      case 2:
17437639Sgblack@eecs.umich.edu                        return new NVtbl2(machInst, vd, vn, vm);
17447639Sgblack@eecs.umich.edu                      case 3:
17457639Sgblack@eecs.umich.edu                        return new NVtbl3(machInst, vd, vn, vm);
17467639Sgblack@eecs.umich.edu                      case 4:
17477639Sgblack@eecs.umich.edu                        return new NVtbl4(machInst, vd, vn, vm);
17487639Sgblack@eecs.umich.edu                    }
17497435Sgblack@eecs.umich.edu                } else {
17507639Sgblack@eecs.umich.edu                    switch (length) {
17517639Sgblack@eecs.umich.edu                      case 1:
17527639Sgblack@eecs.umich.edu                        return new NVtbx1(machInst, vd, vn, vm);
17537639Sgblack@eecs.umich.edu                      case 2:
17547639Sgblack@eecs.umich.edu                        return new NVtbx2(machInst, vd, vn, vm);
17557639Sgblack@eecs.umich.edu                      case 3:
17567639Sgblack@eecs.umich.edu                        return new NVtbx3(machInst, vd, vn, vm);
17577639Sgblack@eecs.umich.edu                      case 4:
17587639Sgblack@eecs.umich.edu                        return new NVtbx4(machInst, vd, vn, vm);
17597639Sgblack@eecs.umich.edu                    }
17607435Sgblack@eecs.umich.edu                }
17617435Sgblack@eecs.umich.edu            } else if (b == 0xc && (c & 0x9) == 0) {
17627639Sgblack@eecs.umich.edu                unsigned imm4 = bits(machInst, 19, 16);
17637639Sgblack@eecs.umich.edu                if (bits(imm4, 2, 0) == 0)
17647639Sgblack@eecs.umich.edu                    return new Unknown(machInst);
17657639Sgblack@eecs.umich.edu                unsigned size = 0;
17667639Sgblack@eecs.umich.edu                while ((imm4 & 0x1) == 0) {
17677639Sgblack@eecs.umich.edu                    size++;
17687639Sgblack@eecs.umich.edu                    imm4 >>= 1;
17697639Sgblack@eecs.umich.edu                }
17707639Sgblack@eecs.umich.edu                unsigned index = imm4 >> 1;
17717639Sgblack@eecs.umich.edu                const bool q = bits(machInst, 6);
17727639Sgblack@eecs.umich.edu                return decodeNeonUTwoShiftSReg<NVdupD, NVdupQ>(
17737639Sgblack@eecs.umich.edu                        q, size, machInst, vd, vm, index);
17747435Sgblack@eecs.umich.edu            }
17757435Sgblack@eecs.umich.edu        }
17767435Sgblack@eecs.umich.edu        return new Unknown(machInst);
17777435Sgblack@eecs.umich.edu    }
17787435Sgblack@eecs.umich.edu    '''
17797435Sgblack@eecs.umich.edu}};
17807435Sgblack@eecs.umich.edu
17817435Sgblack@eecs.umich.edudef format ThumbNeonMem() {{
17827435Sgblack@eecs.umich.edu    decode_block = '''
17837435Sgblack@eecs.umich.edu    return decodeNeonMem(machInst);
17847435Sgblack@eecs.umich.edu    '''
17857435Sgblack@eecs.umich.edu}};
17867435Sgblack@eecs.umich.edu
17877435Sgblack@eecs.umich.edudef format ThumbNeonData() {{
17887435Sgblack@eecs.umich.edu    decode_block = '''
17897639Sgblack@eecs.umich.edu    return decodeNeonData(machInst);
17907435Sgblack@eecs.umich.edu    '''
17917435Sgblack@eecs.umich.edu}};
17927435Sgblack@eecs.umich.edu
17937435Sgblack@eecs.umich.edulet {{
17947435Sgblack@eecs.umich.edu    header_output = '''
17957435Sgblack@eecs.umich.edu    StaticInstPtr
17967356Sgblack@eecs.umich.edu    decodeExtensionRegLoadStore(ExtMachInst machInst);
17977356Sgblack@eecs.umich.edu    '''
17987356Sgblack@eecs.umich.edu    decoder_output = '''
17997356Sgblack@eecs.umich.edu    StaticInstPtr
18007356Sgblack@eecs.umich.edu    decodeExtensionRegLoadStore(ExtMachInst machInst)
18017178Sgblack@eecs.umich.edu    {
18027178Sgblack@eecs.umich.edu        const uint32_t opcode = bits(machInst, 24, 20);
18037178Sgblack@eecs.umich.edu        const uint32_t offset = bits(machInst, 7, 0);
18047337Sgblack@eecs.umich.edu        const bool single = (bits(machInst, 8) == 0);
18057178Sgblack@eecs.umich.edu        const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
18067178Sgblack@eecs.umich.edu        RegIndex vd;
18077178Sgblack@eecs.umich.edu        if (single) {
18087178Sgblack@eecs.umich.edu            vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) |
18097178Sgblack@eecs.umich.edu                                      bits(machInst, 22));
18107178Sgblack@eecs.umich.edu        } else {
18117178Sgblack@eecs.umich.edu            vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) |
18127178Sgblack@eecs.umich.edu                                      (bits(machInst, 22) << 5));
18137178Sgblack@eecs.umich.edu        }
18147178Sgblack@eecs.umich.edu        switch (bits(opcode, 4, 3)) {
18157178Sgblack@eecs.umich.edu          case 0x0:
18167335Sgblack@eecs.umich.edu            if (bits(opcode, 4, 1) == 0x2 &&
18177335Sgblack@eecs.umich.edu                    !(machInst.thumb == 1 && bits(machInst, 28) == 1) &&
18187335Sgblack@eecs.umich.edu                    !(machInst.thumb == 0 && machInst.condCode == 0xf)) {
18197335Sgblack@eecs.umich.edu                if ((bits(machInst, 7, 4) & 0xd) != 1) {
18207335Sgblack@eecs.umich.edu                    break;
18217335Sgblack@eecs.umich.edu                }
18227335Sgblack@eecs.umich.edu                const IntRegIndex rt =
18237335Sgblack@eecs.umich.edu                    (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
18247335Sgblack@eecs.umich.edu                const IntRegIndex rt2 =
18257335Sgblack@eecs.umich.edu                    (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
18267335Sgblack@eecs.umich.edu                const bool op = bits(machInst, 20);
18277335Sgblack@eecs.umich.edu                uint32_t vm;
18287337Sgblack@eecs.umich.edu                if (single) {
18297335Sgblack@eecs.umich.edu                    vm = (bits(machInst, 3, 0) << 1) | bits(machInst, 5);
18307335Sgblack@eecs.umich.edu                } else {
18317335Sgblack@eecs.umich.edu                    vm = (bits(machInst, 3, 0) << 1) |
18327335Sgblack@eecs.umich.edu                         (bits(machInst, 5) << 5);
18337335Sgblack@eecs.umich.edu                }
18347335Sgblack@eecs.umich.edu                if (op) {
18357335Sgblack@eecs.umich.edu                    return new Vmov2Core2Reg(machInst, rt, rt2,
18367335Sgblack@eecs.umich.edu                                             (IntRegIndex)vm);
18377335Sgblack@eecs.umich.edu                } else {
18387335Sgblack@eecs.umich.edu                    return new Vmov2Reg2Core(machInst, (IntRegIndex)vm,
18397335Sgblack@eecs.umich.edu                                             rt, rt2);
18407335Sgblack@eecs.umich.edu                }
18417178Sgblack@eecs.umich.edu            }
18427178Sgblack@eecs.umich.edu            break;
18437178Sgblack@eecs.umich.edu          case 0x1:
18447413Sgblack@eecs.umich.edu            {
184510037SARM gem5 Developers                if (offset == 0 || vd + offset/2 > NumFloatV7ArchRegs) {
18467413Sgblack@eecs.umich.edu                    break;
18477413Sgblack@eecs.umich.edu                }
18487413Sgblack@eecs.umich.edu                switch (bits(opcode, 1, 0)) {
18497413Sgblack@eecs.umich.edu                  case 0x0:
18507413Sgblack@eecs.umich.edu                    return new VLdmStm(machInst, rn, vd, single,
18517413Sgblack@eecs.umich.edu                                       true, false, false, offset);
18527413Sgblack@eecs.umich.edu                  case 0x1:
18537413Sgblack@eecs.umich.edu                    return new VLdmStm(machInst, rn, vd, single,
18547413Sgblack@eecs.umich.edu                                       true, false, true, offset);
18557413Sgblack@eecs.umich.edu                  case 0x2:
18567413Sgblack@eecs.umich.edu                    return new VLdmStm(machInst, rn, vd, single,
18577413Sgblack@eecs.umich.edu                                       true, true, false, offset);
18587413Sgblack@eecs.umich.edu                  case 0x3:
18597413Sgblack@eecs.umich.edu                    // If rn == sp, then this is called vpop.
18607413Sgblack@eecs.umich.edu                    return new VLdmStm(machInst, rn, vd, single,
18617413Sgblack@eecs.umich.edu                                       true, true, true, offset);
18627413Sgblack@eecs.umich.edu                }
18637178Sgblack@eecs.umich.edu            }
18647178Sgblack@eecs.umich.edu          case 0x2:
18657178Sgblack@eecs.umich.edu            if (bits(opcode, 1, 0) == 0x2) {
18667178Sgblack@eecs.umich.edu                // If rn == sp, then this is called vpush.
18677178Sgblack@eecs.umich.edu                return new VLdmStm(machInst, rn, vd, single,
18687178Sgblack@eecs.umich.edu                                   false, true, false, offset);
18697178Sgblack@eecs.umich.edu            } else if (bits(opcode, 1, 0) == 0x3) {
18707178Sgblack@eecs.umich.edu                return new VLdmStm(machInst, rn, vd, single,
18717178Sgblack@eecs.umich.edu                                   false, true, true, offset);
18727178Sgblack@eecs.umich.edu            }
18737178Sgblack@eecs.umich.edu            // Fall through on purpose
18747178Sgblack@eecs.umich.edu          case 0x3:
18757346Sgblack@eecs.umich.edu            const bool up = (bits(machInst, 23) == 1);
18767346Sgblack@eecs.umich.edu            const uint32_t imm = bits(machInst, 7, 0) << 2;
18777346Sgblack@eecs.umich.edu            if (single) {
18787346Sgblack@eecs.umich.edu                vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) |
18797346Sgblack@eecs.umich.edu                                          (bits(machInst, 22)));
18807346Sgblack@eecs.umich.edu            } else {
18817346Sgblack@eecs.umich.edu                vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) |
18827346Sgblack@eecs.umich.edu                                          (bits(machInst, 22) << 5));
18837346Sgblack@eecs.umich.edu            }
18847178Sgblack@eecs.umich.edu            if (bits(opcode, 1, 0) == 0x0) {
18857346Sgblack@eecs.umich.edu                if (single) {
18867346Sgblack@eecs.umich.edu                    if (up) {
18877346Sgblack@eecs.umich.edu                        return new %(vstr_us)s(machInst, vd, rn, up, imm);
18887346Sgblack@eecs.umich.edu                    } else {
18897346Sgblack@eecs.umich.edu                        return new %(vstr_s)s(machInst, vd, rn, up, imm);
18907346Sgblack@eecs.umich.edu                    }
18917346Sgblack@eecs.umich.edu                } else {
18927346Sgblack@eecs.umich.edu                    if (up) {
18937346Sgblack@eecs.umich.edu                        return new %(vstr_ud)s(machInst, vd, vd + 1,
18947346Sgblack@eecs.umich.edu                                               rn, up, imm);
18957346Sgblack@eecs.umich.edu                    } else {
18967346Sgblack@eecs.umich.edu                        return new %(vstr_d)s(machInst, vd, vd + 1,
18977346Sgblack@eecs.umich.edu                                              rn, up, imm);
18987346Sgblack@eecs.umich.edu                    }
18997346Sgblack@eecs.umich.edu                }
19007178Sgblack@eecs.umich.edu            } else if (bits(opcode, 1, 0) == 0x1) {
19017337Sgblack@eecs.umich.edu                if (single) {
19027337Sgblack@eecs.umich.edu                    if (up) {
19037337Sgblack@eecs.umich.edu                        return new %(vldr_us)s(machInst, vd, rn, up, imm);
19047337Sgblack@eecs.umich.edu                    } else {
19057337Sgblack@eecs.umich.edu                        return new %(vldr_s)s(machInst, vd, rn, up, imm);
19067337Sgblack@eecs.umich.edu                    }
19077337Sgblack@eecs.umich.edu                } else {
19087337Sgblack@eecs.umich.edu                    if (up) {
19097337Sgblack@eecs.umich.edu                        return new %(vldr_ud)s(machInst, vd, vd + 1,
19107337Sgblack@eecs.umich.edu                                               rn, up, imm);
19117337Sgblack@eecs.umich.edu                    } else {
19127337Sgblack@eecs.umich.edu                        return new %(vldr_d)s(machInst, vd, vd + 1,
19137337Sgblack@eecs.umich.edu                                              rn, up, imm);
19147337Sgblack@eecs.umich.edu                    }
19157337Sgblack@eecs.umich.edu                }
19167178Sgblack@eecs.umich.edu            }
19177178Sgblack@eecs.umich.edu        }
19187178Sgblack@eecs.umich.edu        return new Unknown(machInst);
19197178Sgblack@eecs.umich.edu    }
19207337Sgblack@eecs.umich.edu    ''' % {
19217337Sgblack@eecs.umich.edu        "vldr_us" : "VLDR_" + loadImmClassName(False, True, False),
19227337Sgblack@eecs.umich.edu        "vldr_s" : "VLDR_" + loadImmClassName(False, False, False),
19237337Sgblack@eecs.umich.edu        "vldr_ud" : "VLDR_" + loadDoubleImmClassName(False, True, False),
19247346Sgblack@eecs.umich.edu        "vldr_d" : "VLDR_" + loadDoubleImmClassName(False, False, False),
19257346Sgblack@eecs.umich.edu        "vstr_us" : "VSTR_" + storeImmClassName(False, True, False),
19267346Sgblack@eecs.umich.edu        "vstr_s" : "VSTR_" + storeImmClassName(False, False, False),
19277346Sgblack@eecs.umich.edu        "vstr_ud" : "VSTR_" + storeDoubleImmClassName(False, True, False),
19287346Sgblack@eecs.umich.edu        "vstr_d" : "VSTR_" + storeDoubleImmClassName(False, False, False)
19297337Sgblack@eecs.umich.edu    }
19307178Sgblack@eecs.umich.edu}};
19317321Sgblack@eecs.umich.edu
19327356Sgblack@eecs.umich.edudef format ExtensionRegLoadStore() {{
19337321Sgblack@eecs.umich.edu    decode_block = '''
19347356Sgblack@eecs.umich.edu    return decodeExtensionRegLoadStore(machInst);
19357356Sgblack@eecs.umich.edu    '''
19367356Sgblack@eecs.umich.edu}};
19377356Sgblack@eecs.umich.edu
19387356Sgblack@eecs.umich.edulet {{
19397356Sgblack@eecs.umich.edu    header_output = '''
19407356Sgblack@eecs.umich.edu    StaticInstPtr
19417356Sgblack@eecs.umich.edu    decodeShortFpTransfer(ExtMachInst machInst);
19427356Sgblack@eecs.umich.edu    '''
19437356Sgblack@eecs.umich.edu    decoder_output = '''
19447356Sgblack@eecs.umich.edu    StaticInstPtr
19457356Sgblack@eecs.umich.edu    decodeShortFpTransfer(ExtMachInst machInst)
19467321Sgblack@eecs.umich.edu    {
19477321Sgblack@eecs.umich.edu        const uint32_t l = bits(machInst, 20);
19487321Sgblack@eecs.umich.edu        const uint32_t c = bits(machInst, 8);
19497321Sgblack@eecs.umich.edu        const uint32_t a = bits(machInst, 23, 21);
19507321Sgblack@eecs.umich.edu        const uint32_t b = bits(machInst, 6, 5);
19517321Sgblack@eecs.umich.edu        if ((machInst.thumb == 1 && bits(machInst, 28) == 1) ||
19527321Sgblack@eecs.umich.edu            (machInst.thumb == 0 && machInst.condCode == 0xf)) {
195311671Smitch.hayenga@arm.com            // Determine if this is backported aarch64 FP instruction
195411671Smitch.hayenga@arm.com            const bool b31_b24 = bits(machInst, 31, 24) == 0xFE;
195511671Smitch.hayenga@arm.com            const bool b23 = bits(machInst, 23);
195611671Smitch.hayenga@arm.com            const bool b21_b18 = bits(machInst, 21, 18) == 0xE;
195711671Smitch.hayenga@arm.com            const bool b11_b9  = bits(machInst, 11, 9) == 0x5;
195811671Smitch.hayenga@arm.com            const bool sz = bits(machInst, 8);
195911671Smitch.hayenga@arm.com            const bool b7_b6   = bits(machInst, 7, 6) == 0x1;
196011671Smitch.hayenga@arm.com            const bool b6 = bits(machInst, 6) == 0x0;
196111671Smitch.hayenga@arm.com            const bool b4 = bits(machInst, 4) == 0x0;
196211671Smitch.hayenga@arm.com            if (b31_b24 && b23 && b21_b18 && b11_b9 && b7_b6 && b4) {
196311671Smitch.hayenga@arm.com                  // VINT* Integer Rounding Instructon
196411671Smitch.hayenga@arm.com                  const uint32_t rm = bits(machInst, 17, 16);
196511671Smitch.hayenga@arm.com
196611671Smitch.hayenga@arm.com                  if (sz) {
196711671Smitch.hayenga@arm.com                      const IntRegIndex vd =
196811671Smitch.hayenga@arm.com                          (IntRegIndex)((bits(machInst, 22) << 5) |
196911671Smitch.hayenga@arm.com                                        (bits(machInst, 15, 12) << 1));
197011671Smitch.hayenga@arm.com                      const IntRegIndex vm =
197111671Smitch.hayenga@arm.com                          (IntRegIndex)((bits(machInst, 5) << 5) |
197211671Smitch.hayenga@arm.com                                        (bits(machInst, 3, 0) << 1));
197311671Smitch.hayenga@arm.com                      switch(rm) {
197411671Smitch.hayenga@arm.com                        case 0x0:
197511671Smitch.hayenga@arm.com                          return decodeVfpRegRegOp<VRIntAD>(machInst, vd, vm,
197611671Smitch.hayenga@arm.com                                                            true);
197711671Smitch.hayenga@arm.com                        case 0x1:
197811671Smitch.hayenga@arm.com                          return decodeVfpRegRegOp<VRIntND>(machInst, vd, vm,
197911671Smitch.hayenga@arm.com                                                            true);
198011671Smitch.hayenga@arm.com                        case 0x2:
198111671Smitch.hayenga@arm.com                          return decodeVfpRegRegOp<VRIntPD>(machInst, vd, vm,
198211671Smitch.hayenga@arm.com                                                            true);
198311671Smitch.hayenga@arm.com                        case 0x3:
198411671Smitch.hayenga@arm.com                          return decodeVfpRegRegOp<VRIntMD>(machInst, vd, vm,
198511671Smitch.hayenga@arm.com                                                            true);
198611671Smitch.hayenga@arm.com                        default: return new Unknown(machInst);
198711671Smitch.hayenga@arm.com                      }
198811671Smitch.hayenga@arm.com                  } else {
198911671Smitch.hayenga@arm.com                      const IntRegIndex vd =
199011671Smitch.hayenga@arm.com                          (IntRegIndex)(bits(machInst, 22) |
199111671Smitch.hayenga@arm.com                                       (bits(machInst, 15, 12) << 1));
199211671Smitch.hayenga@arm.com                      const IntRegIndex vm =
199311671Smitch.hayenga@arm.com                          (IntRegIndex)(bits(machInst, 5) |
199411671Smitch.hayenga@arm.com                                        (bits(machInst, 3, 0) << 1));
199511671Smitch.hayenga@arm.com                      switch(rm) {
199611671Smitch.hayenga@arm.com                        case 0x0:
199711671Smitch.hayenga@arm.com                          return decodeVfpRegRegOp<VRIntAS>(machInst, vd, vm,
199811671Smitch.hayenga@arm.com                                                            false);
199911671Smitch.hayenga@arm.com                        case 0x1:
200011671Smitch.hayenga@arm.com                          return decodeVfpRegRegOp<VRIntNS>(machInst, vd, vm,
200111671Smitch.hayenga@arm.com                                                            false);
200211671Smitch.hayenga@arm.com                        case 0x2:
200311671Smitch.hayenga@arm.com                          return decodeVfpRegRegOp<VRIntPS>(machInst, vd, vm,
200411671Smitch.hayenga@arm.com                                                            false);
200511671Smitch.hayenga@arm.com                        case 0x3:
200611671Smitch.hayenga@arm.com                          return decodeVfpRegRegOp<VRIntMS>(machInst, vd, vm,
200711671Smitch.hayenga@arm.com                                                            false);
200811671Smitch.hayenga@arm.com                        default: return new Unknown(machInst);
200911671Smitch.hayenga@arm.com                      }
201011671Smitch.hayenga@arm.com                  }
201111671Smitch.hayenga@arm.com            } else if (b31_b24 && !b23 && b11_b9 && b6 && b4){
201211671Smitch.hayenga@arm.com                // VSEL* floating point conditional select
201311671Smitch.hayenga@arm.com
201411671Smitch.hayenga@arm.com                ConditionCode cond;
201511671Smitch.hayenga@arm.com                switch(bits(machInst, 21, 20)) {
201611671Smitch.hayenga@arm.com                  case 0x0: cond = COND_EQ; break;
201711671Smitch.hayenga@arm.com                  case 0x1: cond = COND_VS; break;
201811671Smitch.hayenga@arm.com                  case 0x2: cond = COND_GE; break;
201911671Smitch.hayenga@arm.com                  case 0x3: cond = COND_GT; break;
202011671Smitch.hayenga@arm.com                }
202111671Smitch.hayenga@arm.com
202211671Smitch.hayenga@arm.com                if (sz) {
202311671Smitch.hayenga@arm.com                      const IntRegIndex vd =
202411671Smitch.hayenga@arm.com                          (IntRegIndex)((bits(machInst, 22) << 5) |
202511671Smitch.hayenga@arm.com                                        (bits(machInst, 15, 12) << 1));
202611671Smitch.hayenga@arm.com                      const IntRegIndex vm =
202711671Smitch.hayenga@arm.com                          (IntRegIndex)((bits(machInst, 5) << 5) |
202811671Smitch.hayenga@arm.com                                        (bits(machInst, 3, 0) << 1));
202911671Smitch.hayenga@arm.com                      const IntRegIndex vn =
203011671Smitch.hayenga@arm.com                          (IntRegIndex)((bits(machInst, 7) << 5) |
203111671Smitch.hayenga@arm.com                                       (bits(machInst, 19, 16) << 1));
203211671Smitch.hayenga@arm.com                    return new VselD(machInst, vd, vn, vm, cond);
203311671Smitch.hayenga@arm.com                } else {
203411671Smitch.hayenga@arm.com                      const IntRegIndex vd =
203511671Smitch.hayenga@arm.com                          (IntRegIndex)(bits(machInst, 22) |
203611671Smitch.hayenga@arm.com                                       (bits(machInst, 15, 12) << 1));
203711671Smitch.hayenga@arm.com                      const IntRegIndex vm =
203811671Smitch.hayenga@arm.com                          (IntRegIndex)(bits(machInst, 5) |
203911671Smitch.hayenga@arm.com                                        (bits(machInst, 3, 0) << 1));
204011671Smitch.hayenga@arm.com                      const IntRegIndex vn =
204111671Smitch.hayenga@arm.com                          (IntRegIndex)((bits(machInst, 19, 16) << 1) |
204211671Smitch.hayenga@arm.com                                        bits(machInst, 7));
204311671Smitch.hayenga@arm.com                      return new VselS(machInst, vd, vn, vm, cond);
204411671Smitch.hayenga@arm.com                }
204511671Smitch.hayenga@arm.com            } else {
204611671Smitch.hayenga@arm.com                return new Unknown(machInst);
204711671Smitch.hayenga@arm.com            }
20487321Sgblack@eecs.umich.edu        }
20497321Sgblack@eecs.umich.edu        if (l == 0 && c == 0) {
20507321Sgblack@eecs.umich.edu            if (a == 0) {
20517335Sgblack@eecs.umich.edu                const uint32_t vn = (bits(machInst, 19, 16) << 1) |
20527335Sgblack@eecs.umich.edu                                    bits(machInst, 7);
20537335Sgblack@eecs.umich.edu                const IntRegIndex rt =
20547335Sgblack@eecs.umich.edu                    (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
20557335Sgblack@eecs.umich.edu                if (bits(machInst, 20) == 1) {
20567335Sgblack@eecs.umich.edu                    return new VmovRegCoreW(machInst, rt, (IntRegIndex)vn);
20577335Sgblack@eecs.umich.edu                } else {
20587335Sgblack@eecs.umich.edu                    return new VmovCoreRegW(machInst, (IntRegIndex)vn, rt);
20597335Sgblack@eecs.umich.edu                }
20607321Sgblack@eecs.umich.edu            } else if (a == 0x7) {
20617323Sgblack@eecs.umich.edu                const IntRegIndex rt =
20627323Sgblack@eecs.umich.edu                    (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
206310037SARM gem5 Developers                uint32_t reg = bits(machInst, 19, 16);
206410037SARM gem5 Developers                uint32_t specReg;
206510037SARM gem5 Developers                switch (reg) {
20667323Sgblack@eecs.umich.edu                  case 0:
20677323Sgblack@eecs.umich.edu                    specReg = MISCREG_FPSID;
20687323Sgblack@eecs.umich.edu                    break;
20697323Sgblack@eecs.umich.edu                  case 1:
20707323Sgblack@eecs.umich.edu                    specReg = MISCREG_FPSCR;
20717323Sgblack@eecs.umich.edu                    break;
20727394Sgblack@eecs.umich.edu                  case 6:
20737394Sgblack@eecs.umich.edu                    specReg = MISCREG_MVFR1;
20747394Sgblack@eecs.umich.edu                    break;
20757394Sgblack@eecs.umich.edu                  case 7:
20767394Sgblack@eecs.umich.edu                    specReg = MISCREG_MVFR0;
20777394Sgblack@eecs.umich.edu                    break;
20787323Sgblack@eecs.umich.edu                  case 8:
20797323Sgblack@eecs.umich.edu                    specReg = MISCREG_FPEXC;
20807323Sgblack@eecs.umich.edu                    break;
20817323Sgblack@eecs.umich.edu                  default:
20827323Sgblack@eecs.umich.edu                    return new Unknown(machInst);
20837323Sgblack@eecs.umich.edu                }
20847643Sgblack@eecs.umich.edu                if (specReg == MISCREG_FPSCR) {
20857643Sgblack@eecs.umich.edu                    return new VmsrFpscr(machInst, (IntRegIndex)specReg, rt);
20867643Sgblack@eecs.umich.edu                } else {
208710037SARM gem5 Developers                    uint32_t iss = mcrMrcIssBuild(0, bits(machInst, 3, 0), rt,
208810037SARM gem5 Developers                        reg, a, bits(machInst, 7, 5));
208910037SARM gem5 Developers                    return new Vmsr(machInst, (IntRegIndex)specReg, rt, iss);
20907643Sgblack@eecs.umich.edu                }
20917321Sgblack@eecs.umich.edu            }
20927321Sgblack@eecs.umich.edu        } else if (l == 0 && c == 1) {
20937321Sgblack@eecs.umich.edu            if (bits(a, 2) == 0) {
20947335Sgblack@eecs.umich.edu                uint32_t vd = (bits(machInst, 7) << 5) |
20957335Sgblack@eecs.umich.edu                              (bits(machInst, 19, 16) << 1);
20967639Sgblack@eecs.umich.edu                // Handle accessing each single precision half of the vector.
20977639Sgblack@eecs.umich.edu                vd += bits(machInst, 21);
20987335Sgblack@eecs.umich.edu                const IntRegIndex rt =
20997335Sgblack@eecs.umich.edu                    (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
21007335Sgblack@eecs.umich.edu                if (bits(machInst, 22) == 1) {
21017639Sgblack@eecs.umich.edu                    return new VmovCoreRegB(machInst, (IntRegIndex)vd,
21027639Sgblack@eecs.umich.edu                                            rt, bits(machInst, 6, 5));
21037335Sgblack@eecs.umich.edu                } else if (bits(machInst, 5) == 1) {
21047639Sgblack@eecs.umich.edu                    return new VmovCoreRegH(machInst, (IntRegIndex)vd,
21057639Sgblack@eecs.umich.edu                                            rt, bits(machInst, 6));
21067335Sgblack@eecs.umich.edu                } else if (bits(machInst, 6) == 0) {
21077639Sgblack@eecs.umich.edu                    return new VmovCoreRegW(machInst, (IntRegIndex)vd, rt);
21087335Sgblack@eecs.umich.edu                } else {
21097335Sgblack@eecs.umich.edu                    return new Unknown(machInst);
21107335Sgblack@eecs.umich.edu                }
21117639Sgblack@eecs.umich.edu            } else if (bits(b, 1) == 0) {
21127639Sgblack@eecs.umich.edu                bool q = bits(machInst, 21);
21137639Sgblack@eecs.umich.edu                unsigned be = (bits(machInst, 22) << 1) | (bits(machInst, 5));
21147639Sgblack@eecs.umich.edu                IntRegIndex vd = (IntRegIndex)(2 * (uint32_t)
21157639Sgblack@eecs.umich.edu                    (bits(machInst, 19, 16) | (bits(machInst, 7) << 4)));
21167639Sgblack@eecs.umich.edu                IntRegIndex rt = (IntRegIndex)(uint32_t)
21177639Sgblack@eecs.umich.edu                    bits(machInst, 15, 12);
21187639Sgblack@eecs.umich.edu                if (q) {
21197639Sgblack@eecs.umich.edu                    switch (be) {
21207639Sgblack@eecs.umich.edu                      case 0:
21217639Sgblack@eecs.umich.edu                        return new NVdupQGpr<uint32_t>(machInst, vd, rt);
21227639Sgblack@eecs.umich.edu                      case 1:
21237639Sgblack@eecs.umich.edu                        return new NVdupQGpr<uint16_t>(machInst, vd, rt);
21247639Sgblack@eecs.umich.edu                      case 2:
21257639Sgblack@eecs.umich.edu                        return new NVdupQGpr<uint8_t>(machInst, vd, rt);
21267639Sgblack@eecs.umich.edu                      case 3:
21277639Sgblack@eecs.umich.edu                        return new Unknown(machInst);
21287639Sgblack@eecs.umich.edu                    }
21297639Sgblack@eecs.umich.edu                } else {
21307639Sgblack@eecs.umich.edu                    switch (be) {
21317639Sgblack@eecs.umich.edu                      case 0:
21327639Sgblack@eecs.umich.edu                        return new NVdupDGpr<uint32_t>(machInst, vd, rt);
21337639Sgblack@eecs.umich.edu                      case 1:
21347639Sgblack@eecs.umich.edu                        return new NVdupDGpr<uint16_t>(machInst, vd, rt);
21357639Sgblack@eecs.umich.edu                      case 2:
21367639Sgblack@eecs.umich.edu                        return new NVdupDGpr<uint8_t>(machInst, vd, rt);
21377639Sgblack@eecs.umich.edu                      case 3:
21387639Sgblack@eecs.umich.edu                        return new Unknown(machInst);
21397639Sgblack@eecs.umich.edu                    }
21407335Sgblack@eecs.umich.edu                }
21417321Sgblack@eecs.umich.edu            }
21427321Sgblack@eecs.umich.edu        } else if (l == 1 && c == 0) {
21437321Sgblack@eecs.umich.edu            if (a == 0) {
21447335Sgblack@eecs.umich.edu                const uint32_t vn = (bits(machInst, 19, 16) << 1) |
21457335Sgblack@eecs.umich.edu                                    bits(machInst, 7);
21467335Sgblack@eecs.umich.edu                const IntRegIndex rt =
21477335Sgblack@eecs.umich.edu                    (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
21487335Sgblack@eecs.umich.edu                if (bits(machInst, 20) == 1) {
21497335Sgblack@eecs.umich.edu                    return new VmovRegCoreW(machInst, rt, (IntRegIndex)vn);
21507335Sgblack@eecs.umich.edu                } else {
21517335Sgblack@eecs.umich.edu                    return new VmovCoreRegW(machInst, (IntRegIndex)vn, rt);
21527335Sgblack@eecs.umich.edu                }
21537321Sgblack@eecs.umich.edu            } else if (a == 7) {
21547326Sgblack@eecs.umich.edu                const IntRegIndex rt =
21557326Sgblack@eecs.umich.edu                    (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
215610037SARM gem5 Developers                uint32_t reg = bits(machInst, 19, 16);
215710037SARM gem5 Developers                uint32_t specReg;
215810037SARM gem5 Developers                switch (reg) {
21597326Sgblack@eecs.umich.edu                  case 0:
21607326Sgblack@eecs.umich.edu                    specReg = MISCREG_FPSID;
21617326Sgblack@eecs.umich.edu                    break;
21627326Sgblack@eecs.umich.edu                  case 1:
21637326Sgblack@eecs.umich.edu                    specReg = MISCREG_FPSCR;
21647326Sgblack@eecs.umich.edu                    break;
21657326Sgblack@eecs.umich.edu                  case 6:
21667326Sgblack@eecs.umich.edu                    specReg = MISCREG_MVFR1;
21677326Sgblack@eecs.umich.edu                    break;
21687326Sgblack@eecs.umich.edu                  case 7:
21697326Sgblack@eecs.umich.edu                    specReg = MISCREG_MVFR0;
21707326Sgblack@eecs.umich.edu                    break;
21717326Sgblack@eecs.umich.edu                  case 8:
21727326Sgblack@eecs.umich.edu                    specReg = MISCREG_FPEXC;
21737326Sgblack@eecs.umich.edu                    break;
21747326Sgblack@eecs.umich.edu                  default:
21757326Sgblack@eecs.umich.edu                    return new Unknown(machInst);
21767326Sgblack@eecs.umich.edu                }
21777392Sgblack@eecs.umich.edu                if (rt == 0xf) {
21787643Sgblack@eecs.umich.edu                    if (specReg == MISCREG_FPSCR) {
21798303SAli.Saidi@ARM.com                        return new VmrsApsrFpscr(machInst);
21807643Sgblack@eecs.umich.edu                    } else {
21818301SAli.Saidi@ARM.com                        return new Unknown(machInst);
21827643Sgblack@eecs.umich.edu                    }
21837643Sgblack@eecs.umich.edu                } else if (specReg == MISCREG_FPSCR) {
21847643Sgblack@eecs.umich.edu                    return new VmrsFpscr(machInst, rt, (IntRegIndex)specReg);
21857392Sgblack@eecs.umich.edu                } else {
218610037SARM gem5 Developers                    uint32_t iss = mcrMrcIssBuild(l, bits(machInst, 3, 0), rt,
218710037SARM gem5 Developers                        reg, a, bits(machInst, 7, 5));
218810037SARM gem5 Developers                    return new Vmrs(machInst, rt, (IntRegIndex)specReg, iss);
21897392Sgblack@eecs.umich.edu                }
21907321Sgblack@eecs.umich.edu            }
21917321Sgblack@eecs.umich.edu        } else {
21927335Sgblack@eecs.umich.edu            uint32_t vd = (bits(machInst, 7) << 5) |
21937335Sgblack@eecs.umich.edu                          (bits(machInst, 19, 16) << 1);
21947639Sgblack@eecs.umich.edu            // Handle indexing into each single precision half of the vector.
21957639Sgblack@eecs.umich.edu            vd += bits(machInst, 21);
21967639Sgblack@eecs.umich.edu            uint32_t index;
21977335Sgblack@eecs.umich.edu            const IntRegIndex rt =
21987335Sgblack@eecs.umich.edu                (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
21997335Sgblack@eecs.umich.edu            const bool u = (bits(machInst, 23) == 1);
22007335Sgblack@eecs.umich.edu            if (bits(machInst, 22) == 1) {
22017639Sgblack@eecs.umich.edu                index = bits(machInst, 6, 5);
22027335Sgblack@eecs.umich.edu                if (u) {
22037335Sgblack@eecs.umich.edu                    return new VmovRegCoreUB(machInst, rt,
22047335Sgblack@eecs.umich.edu                                             (IntRegIndex)vd, index);
22057335Sgblack@eecs.umich.edu                } else {
22067335Sgblack@eecs.umich.edu                    return new VmovRegCoreSB(machInst, rt,
22077335Sgblack@eecs.umich.edu                                             (IntRegIndex)vd, index);
22087335Sgblack@eecs.umich.edu                }
22097639Sgblack@eecs.umich.edu            } else if (bits(machInst, 5) == 1) {
22107639Sgblack@eecs.umich.edu                index = bits(machInst, 6);
22117335Sgblack@eecs.umich.edu                if (u) {
22127335Sgblack@eecs.umich.edu                    return new VmovRegCoreUH(machInst, rt,
22137335Sgblack@eecs.umich.edu                                             (IntRegIndex)vd, index);
22147335Sgblack@eecs.umich.edu                } else {
22157335Sgblack@eecs.umich.edu                    return new VmovRegCoreSH(machInst, rt,
22167335Sgblack@eecs.umich.edu                                             (IntRegIndex)vd, index);
22177335Sgblack@eecs.umich.edu                }
22187639Sgblack@eecs.umich.edu            } else if (bits(machInst, 6) == 0 && !u) {
22197335Sgblack@eecs.umich.edu                return new VmovRegCoreW(machInst, rt, (IntRegIndex)vd);
22207639Sgblack@eecs.umich.edu            } else {
22217639Sgblack@eecs.umich.edu                return new Unknown(machInst);
22227335Sgblack@eecs.umich.edu            }
22237321Sgblack@eecs.umich.edu        }
22247321Sgblack@eecs.umich.edu        return new Unknown(machInst);
22257321Sgblack@eecs.umich.edu    }
22267321Sgblack@eecs.umich.edu    '''
22277321Sgblack@eecs.umich.edu}};
22287356Sgblack@eecs.umich.edu
22297356Sgblack@eecs.umich.edudef format ShortFpTransfer() {{
22307356Sgblack@eecs.umich.edu    decode_block = '''
22317356Sgblack@eecs.umich.edu    return decodeShortFpTransfer(machInst);
22327356Sgblack@eecs.umich.edu    '''
22337356Sgblack@eecs.umich.edu}};
22347363Sgblack@eecs.umich.edu
22357363Sgblack@eecs.umich.edulet {{
22367363Sgblack@eecs.umich.edu    header_output = '''
22377363Sgblack@eecs.umich.edu    StaticInstPtr
22387363Sgblack@eecs.umich.edu    decodeVfpData(ExtMachInst machInst);
22397363Sgblack@eecs.umich.edu    '''
22407363Sgblack@eecs.umich.edu    decoder_output = '''
22417363Sgblack@eecs.umich.edu    StaticInstPtr
22427363Sgblack@eecs.umich.edu    decodeVfpData(ExtMachInst machInst)
22437363Sgblack@eecs.umich.edu    {
22447363Sgblack@eecs.umich.edu        const uint32_t opc1 = bits(machInst, 23, 20);
22457363Sgblack@eecs.umich.edu        const uint32_t opc2 = bits(machInst, 19, 16);
22467363Sgblack@eecs.umich.edu        const uint32_t opc3 = bits(machInst, 7, 6);
22477363Sgblack@eecs.umich.edu        //const uint32_t opc4 = bits(machInst, 3, 0);
22487372Sgblack@eecs.umich.edu        const bool single = (bits(machInst, 8) == 0);
22497389Sgblack@eecs.umich.edu        // Used to select between vcmp and vcmpe.
22507389Sgblack@eecs.umich.edu        const bool e = (bits(machInst, 7) == 1);
22517372Sgblack@eecs.umich.edu        IntRegIndex vd;
22527372Sgblack@eecs.umich.edu        IntRegIndex vm;
22537372Sgblack@eecs.umich.edu        IntRegIndex vn;
22547372Sgblack@eecs.umich.edu        if (single) {
22557372Sgblack@eecs.umich.edu            vd = (IntRegIndex)(bits(machInst, 22) |
22567372Sgblack@eecs.umich.edu                    (bits(machInst, 15, 12) << 1));
22577372Sgblack@eecs.umich.edu            vm = (IntRegIndex)(bits(machInst, 5) |
22587372Sgblack@eecs.umich.edu                    (bits(machInst, 3, 0) << 1));
22597372Sgblack@eecs.umich.edu            vn = (IntRegIndex)(bits(machInst, 7) |
22607372Sgblack@eecs.umich.edu                    (bits(machInst, 19, 16) << 1));
22617372Sgblack@eecs.umich.edu        } else {
22627372Sgblack@eecs.umich.edu            vd = (IntRegIndex)((bits(machInst, 22) << 5) |
22637372Sgblack@eecs.umich.edu                    (bits(machInst, 15, 12) << 1));
22647372Sgblack@eecs.umich.edu            vm = (IntRegIndex)((bits(machInst, 5) << 5) |
22657372Sgblack@eecs.umich.edu                    (bits(machInst, 3, 0) << 1));
22667372Sgblack@eecs.umich.edu            vn = (IntRegIndex)((bits(machInst, 7) << 5) |
22677372Sgblack@eecs.umich.edu                    (bits(machInst, 19, 16) << 1));
22687372Sgblack@eecs.umich.edu        }
22697363Sgblack@eecs.umich.edu        switch (opc1 & 0xb /* 1011 */) {
22707363Sgblack@eecs.umich.edu          case 0x0:
22717370Sgblack@eecs.umich.edu            if (bits(machInst, 6) == 0) {
22727372Sgblack@eecs.umich.edu                if (single) {
22737376Sgblack@eecs.umich.edu                    return decodeVfpRegRegRegOp<VmlaS>(
22747376Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, false);
22757370Sgblack@eecs.umich.edu                } else {
22767376Sgblack@eecs.umich.edu                    return decodeVfpRegRegRegOp<VmlaD>(
22777376Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, true);
22787370Sgblack@eecs.umich.edu                }
22797370Sgblack@eecs.umich.edu            } else {
22807372Sgblack@eecs.umich.edu                if (single) {
22817376Sgblack@eecs.umich.edu                    return decodeVfpRegRegRegOp<VmlsS>(
22827376Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, false);
22837370Sgblack@eecs.umich.edu                } else {
22847376Sgblack@eecs.umich.edu                    return decodeVfpRegRegRegOp<VmlsD>(
22857376Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, true);
22867370Sgblack@eecs.umich.edu                }
22877370Sgblack@eecs.umich.edu            }
22887371Sgblack@eecs.umich.edu          case 0x1:
22897371Sgblack@eecs.umich.edu            if (bits(machInst, 6) == 1) {
22907372Sgblack@eecs.umich.edu                if (single) {
22917376Sgblack@eecs.umich.edu                    return decodeVfpRegRegRegOp<VnmlaS>(
22927376Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, false);
22937371Sgblack@eecs.umich.edu                } else {
22947376Sgblack@eecs.umich.edu                    return decodeVfpRegRegRegOp<VnmlaD>(
22957376Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, true);
22967371Sgblack@eecs.umich.edu                }
22977371Sgblack@eecs.umich.edu            } else {
22987372Sgblack@eecs.umich.edu                if (single) {
22997376Sgblack@eecs.umich.edu                    return decodeVfpRegRegRegOp<VnmlsS>(
23007376Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, false);
23017371Sgblack@eecs.umich.edu                } else {
23027376Sgblack@eecs.umich.edu                    return decodeVfpRegRegRegOp<VnmlsD>(
23037376Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, true);
23047371Sgblack@eecs.umich.edu                }
23057371Sgblack@eecs.umich.edu            }
23067363Sgblack@eecs.umich.edu          case 0x2:
23077363Sgblack@eecs.umich.edu            if ((opc3 & 0x1) == 0) {
23087372Sgblack@eecs.umich.edu                if (single) {
23097376Sgblack@eecs.umich.edu                    return decodeVfpRegRegRegOp<VmulS>(
23107376Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, false);
23117364Sgblack@eecs.umich.edu                } else {
23127376Sgblack@eecs.umich.edu                    return decodeVfpRegRegRegOp<VmulD>(
23137376Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, true);
23147364Sgblack@eecs.umich.edu                }
23157371Sgblack@eecs.umich.edu            } else {
23167372Sgblack@eecs.umich.edu                if (single) {
23177376Sgblack@eecs.umich.edu                    return decodeVfpRegRegRegOp<VnmulS>(
23187376Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, false);
23197371Sgblack@eecs.umich.edu                } else {
23207376Sgblack@eecs.umich.edu                    return decodeVfpRegRegRegOp<VnmulD>(
23217376Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, true);
23227371Sgblack@eecs.umich.edu                }
23237363Sgblack@eecs.umich.edu            }
23247363Sgblack@eecs.umich.edu          case 0x3:
23257363Sgblack@eecs.umich.edu            if ((opc3 & 0x1) == 0) {
23267372Sgblack@eecs.umich.edu                if (single) {
23277376Sgblack@eecs.umich.edu                    return decodeVfpRegRegRegOp<VaddS>(
23287376Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, false);
23297367Sgblack@eecs.umich.edu                } else {
23307376Sgblack@eecs.umich.edu                    return decodeVfpRegRegRegOp<VaddD>(
23317376Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, true);
23327367Sgblack@eecs.umich.edu                }
23337363Sgblack@eecs.umich.edu            } else {
23347372Sgblack@eecs.umich.edu                if (single) {
23357376Sgblack@eecs.umich.edu                    return decodeVfpRegRegRegOp<VsubS>(
23367376Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, false);
23377368Sgblack@eecs.umich.edu                } else {
23387376Sgblack@eecs.umich.edu                    return decodeVfpRegRegRegOp<VsubD>(
23397376Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, true);
23407368Sgblack@eecs.umich.edu                }
23417363Sgblack@eecs.umich.edu            }
23427363Sgblack@eecs.umich.edu          case 0x8:
23437363Sgblack@eecs.umich.edu            if ((opc3 & 0x1) == 0) {
23447372Sgblack@eecs.umich.edu                if (single) {
23457376Sgblack@eecs.umich.edu                    return decodeVfpRegRegRegOp<VdivS>(
23467376Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, false);
23477369Sgblack@eecs.umich.edu                } else {
23487376Sgblack@eecs.umich.edu                    return decodeVfpRegRegRegOp<VdivD>(
23497376Sgblack@eecs.umich.edu                            machInst, vd, vn, vm, true);
23507369Sgblack@eecs.umich.edu                }
23517363Sgblack@eecs.umich.edu            }
23527363Sgblack@eecs.umich.edu            break;
235310037SARM gem5 Developers          case 0x9:
235410037SARM gem5 Developers            if ((opc3 & 0x1) == 0) {
235510037SARM gem5 Developers                if (single) {
235610037SARM gem5 Developers                    return decodeVfpRegRegRegOp<VfnmaS>(
235710037SARM gem5 Developers                            machInst, vd, vn, vm, false);
235810037SARM gem5 Developers                } else {
235910037SARM gem5 Developers                    return decodeVfpRegRegRegOp<VfnmaD>(
236010037SARM gem5 Developers                            machInst, vd, vn, vm, true);
236110037SARM gem5 Developers                }
236210037SARM gem5 Developers            } else {
236310037SARM gem5 Developers                if (single) {
236410037SARM gem5 Developers                    return decodeVfpRegRegRegOp<VfnmsS>(
236510037SARM gem5 Developers                            machInst, vd, vn, vm, false);
236610037SARM gem5 Developers                } else {
236710037SARM gem5 Developers                    return decodeVfpRegRegRegOp<VfnmsD>(
236810037SARM gem5 Developers                            machInst, vd, vn, vm, true);
236910037SARM gem5 Developers                }
237010037SARM gem5 Developers            }
237110037SARM gem5 Developers            break;
237210037SARM gem5 Developers          case 0xa:
237310037SARM gem5 Developers            if ((opc3 & 0x1) == 0) {
237410037SARM gem5 Developers                if (single) {
237510037SARM gem5 Developers                    return decodeVfpRegRegRegOp<VfmaS>(
237610037SARM gem5 Developers                            machInst, vd, vn, vm, false);
237710037SARM gem5 Developers                } else {
237810037SARM gem5 Developers                    return decodeVfpRegRegRegOp<VfmaD>(
237910037SARM gem5 Developers                            machInst, vd, vn, vm, true);
238010037SARM gem5 Developers                }
238110037SARM gem5 Developers            } else {
238210037SARM gem5 Developers                if (single) {
238310037SARM gem5 Developers                    return decodeVfpRegRegRegOp<VfmsS>(
238410037SARM gem5 Developers                            machInst, vd, vn, vm, false);
238510037SARM gem5 Developers                } else {
238610037SARM gem5 Developers                    return decodeVfpRegRegRegOp<VfmsD>(
238710037SARM gem5 Developers                            machInst, vd, vn, vm, true);
238810037SARM gem5 Developers                }
238910037SARM gem5 Developers            }
239010037SARM gem5 Developers            break;
23917363Sgblack@eecs.umich.edu          case 0xb:
23927363Sgblack@eecs.umich.edu            if ((opc3 & 0x1) == 0) {
23937363Sgblack@eecs.umich.edu                const uint32_t baseImm =
23947363Sgblack@eecs.umich.edu                    bits(machInst, 3, 0) | (bits(machInst, 19, 16) << 4);
23957372Sgblack@eecs.umich.edu                if (single) {
23967363Sgblack@eecs.umich.edu                    uint32_t imm = vfp_modified_imm(baseImm, false);
23977376Sgblack@eecs.umich.edu                    return decodeVfpRegImmOp<VmovImmS>(
23987376Sgblack@eecs.umich.edu                            machInst, vd, imm, false);
23997363Sgblack@eecs.umich.edu                } else {
24007363Sgblack@eecs.umich.edu                    uint64_t imm = vfp_modified_imm(baseImm, true);
24017376Sgblack@eecs.umich.edu                    return decodeVfpRegImmOp<VmovImmD>(
24027376Sgblack@eecs.umich.edu                            machInst, vd, imm, true);
24037363Sgblack@eecs.umich.edu                }
24047363Sgblack@eecs.umich.edu            }
24057363Sgblack@eecs.umich.edu            switch (opc2) {
24067363Sgblack@eecs.umich.edu              case 0x0:
24077363Sgblack@eecs.umich.edu                if (opc3 == 1) {
24087372Sgblack@eecs.umich.edu                    if (single) {
24097376Sgblack@eecs.umich.edu                        return decodeVfpRegRegOp<VmovRegS>(
24107376Sgblack@eecs.umich.edu                                machInst, vd, vm, false);
24117363Sgblack@eecs.umich.edu                    } else {
24127376Sgblack@eecs.umich.edu                        return decodeVfpRegRegOp<VmovRegD>(
24137376Sgblack@eecs.umich.edu                                machInst, vd, vm, true);
24147363Sgblack@eecs.umich.edu                    }
24157363Sgblack@eecs.umich.edu                } else {
24167372Sgblack@eecs.umich.edu                    if (single) {
24177376Sgblack@eecs.umich.edu                        return decodeVfpRegRegOp<VabsS>(
24187376Sgblack@eecs.umich.edu                                machInst, vd, vm, false);
24197366Sgblack@eecs.umich.edu                    } else {
24207376Sgblack@eecs.umich.edu                        return decodeVfpRegRegOp<VabsD>(
24217376Sgblack@eecs.umich.edu                                machInst, vd, vm, true);
24227366Sgblack@eecs.umich.edu                    }
24237363Sgblack@eecs.umich.edu                }
24247363Sgblack@eecs.umich.edu              case 0x1:
24257363Sgblack@eecs.umich.edu                if (opc3 == 1) {
24267372Sgblack@eecs.umich.edu                    if (single) {
24277376Sgblack@eecs.umich.edu                        return decodeVfpRegRegOp<VnegS>(
24287376Sgblack@eecs.umich.edu                                machInst, vd, vm, false);
24297365Sgblack@eecs.umich.edu                    } else {
24307376Sgblack@eecs.umich.edu                        return decodeVfpRegRegOp<VnegD>(
24317376Sgblack@eecs.umich.edu                                machInst, vd, vm, true);
24327365Sgblack@eecs.umich.edu                    }
24337363Sgblack@eecs.umich.edu                } else {
24347372Sgblack@eecs.umich.edu                    if (single) {
24357376Sgblack@eecs.umich.edu                        return decodeVfpRegRegOp<VsqrtS>(
24367376Sgblack@eecs.umich.edu                                machInst, vd, vm, false);
24377369Sgblack@eecs.umich.edu                    } else {
24387376Sgblack@eecs.umich.edu                        return decodeVfpRegRegOp<VsqrtD>(
24397376Sgblack@eecs.umich.edu                                machInst, vd, vm, true);
24407369Sgblack@eecs.umich.edu                    }
24417363Sgblack@eecs.umich.edu                }
24427363Sgblack@eecs.umich.edu              case 0x2:
24437363Sgblack@eecs.umich.edu              case 0x3:
24447398Sgblack@eecs.umich.edu                {
24457398Sgblack@eecs.umich.edu                    const bool toHalf = bits(machInst, 16);
24467398Sgblack@eecs.umich.edu                    const bool top = bits(machInst, 7);
24477398Sgblack@eecs.umich.edu                    if (top) {
24487398Sgblack@eecs.umich.edu                        if (toHalf) {
24497398Sgblack@eecs.umich.edu                            return new VcvtFpSFpHT(machInst, vd, vm);
24507398Sgblack@eecs.umich.edu                        } else {
24517398Sgblack@eecs.umich.edu                            return new VcvtFpHTFpS(machInst, vd, vm);
24527398Sgblack@eecs.umich.edu                        }
24537398Sgblack@eecs.umich.edu                    } else {
24547398Sgblack@eecs.umich.edu                        if (toHalf) {
24557398Sgblack@eecs.umich.edu                            return new VcvtFpSFpHB(machInst, vd, vm);
24567398Sgblack@eecs.umich.edu                        } else {
24577398Sgblack@eecs.umich.edu                            return new VcvtFpHBFpS(machInst, vd, vm);
24587398Sgblack@eecs.umich.edu                        }
24597398Sgblack@eecs.umich.edu                    }
24607398Sgblack@eecs.umich.edu                }
24617363Sgblack@eecs.umich.edu              case 0x4:
24627377Sgblack@eecs.umich.edu                if (single) {
24637389Sgblack@eecs.umich.edu                    if (e) {
24647389Sgblack@eecs.umich.edu                        return new VcmpeS(machInst, vd, vm);
24657389Sgblack@eecs.umich.edu                    } else {
24667389Sgblack@eecs.umich.edu                        return new VcmpS(machInst, vd, vm);
24677389Sgblack@eecs.umich.edu                    }
24687377Sgblack@eecs.umich.edu                } else {
24697389Sgblack@eecs.umich.edu                    if (e) {
24707389Sgblack@eecs.umich.edu                        return new VcmpeD(machInst, vd, vm);
24717389Sgblack@eecs.umich.edu                    } else {
24727389Sgblack@eecs.umich.edu                        return new VcmpD(machInst, vd, vm);
24737389Sgblack@eecs.umich.edu                    }
24747377Sgblack@eecs.umich.edu                }
24757363Sgblack@eecs.umich.edu              case 0x5:
24767377Sgblack@eecs.umich.edu                if (single) {
24777389Sgblack@eecs.umich.edu                    if (e) {
24787389Sgblack@eecs.umich.edu                        return new VcmpeZeroS(machInst, vd, 0);
24797389Sgblack@eecs.umich.edu                    } else {
24807389Sgblack@eecs.umich.edu                        return new VcmpZeroS(machInst, vd, 0);
24817389Sgblack@eecs.umich.edu                    }
24827377Sgblack@eecs.umich.edu                } else {
24837389Sgblack@eecs.umich.edu                    if (e) {
24847389Sgblack@eecs.umich.edu                        return new VcmpeZeroD(machInst, vd, 0);
24857389Sgblack@eecs.umich.edu                    } else {
24867389Sgblack@eecs.umich.edu                        return new VcmpZeroD(machInst, vd, 0);
24877389Sgblack@eecs.umich.edu                    }
24887377Sgblack@eecs.umich.edu                }
24897363Sgblack@eecs.umich.edu              case 0x7:
24907363Sgblack@eecs.umich.edu                if (opc3 == 0x3) {
24917374Sgblack@eecs.umich.edu                    if (single) {
24928270SAli.Saidi@ARM.com                        vd = (IntRegIndex)((bits(machInst, 22) << 5) |
24938270SAli.Saidi@ARM.com                                (bits(machInst, 15, 12) << 1));
24947374Sgblack@eecs.umich.edu                        return new VcvtFpSFpD(machInst, vd, vm);
24957374Sgblack@eecs.umich.edu                    } else {
24967374Sgblack@eecs.umich.edu                        vd = (IntRegIndex)(bits(machInst, 22) |
24977374Sgblack@eecs.umich.edu                                (bits(machInst, 15, 12) << 1));
24987374Sgblack@eecs.umich.edu                        return new VcvtFpDFpS(machInst, vd, vm);
24997374Sgblack@eecs.umich.edu                    }
25007363Sgblack@eecs.umich.edu                }
25017363Sgblack@eecs.umich.edu                break;
25027363Sgblack@eecs.umich.edu              case 0x8:
25037373Sgblack@eecs.umich.edu                if (bits(machInst, 7) == 0) {
25047373Sgblack@eecs.umich.edu                    if (single) {
25057373Sgblack@eecs.umich.edu                        return new VcvtUIntFpS(machInst, vd, vm);
25067373Sgblack@eecs.umich.edu                    } else {
25077373Sgblack@eecs.umich.edu                        vm = (IntRegIndex)(bits(machInst, 5) |
25087373Sgblack@eecs.umich.edu                                (bits(machInst, 3, 0) << 1));
25097373Sgblack@eecs.umich.edu                        return new VcvtUIntFpD(machInst, vd, vm);
25107373Sgblack@eecs.umich.edu                    }
25117373Sgblack@eecs.umich.edu                } else {
25127373Sgblack@eecs.umich.edu                    if (single) {
25137373Sgblack@eecs.umich.edu                        return new VcvtSIntFpS(machInst, vd, vm);
25147373Sgblack@eecs.umich.edu                    } else {
25157373Sgblack@eecs.umich.edu                        vm = (IntRegIndex)(bits(machInst, 5) |
25167373Sgblack@eecs.umich.edu                                (bits(machInst, 3, 0) << 1));
25177373Sgblack@eecs.umich.edu                        return new VcvtSIntFpD(machInst, vd, vm);
25187373Sgblack@eecs.umich.edu                    }
25197373Sgblack@eecs.umich.edu                }
25207363Sgblack@eecs.umich.edu              case 0xa:
25217379Sgblack@eecs.umich.edu                {
25227379Sgblack@eecs.umich.edu                    const bool half = (bits(machInst, 7) == 0);
25237379Sgblack@eecs.umich.edu                    const uint32_t imm = bits(machInst, 5) |
25247379Sgblack@eecs.umich.edu                                         (bits(machInst, 3, 0) << 1);
25257379Sgblack@eecs.umich.edu                    const uint32_t size =
25267379Sgblack@eecs.umich.edu                        (bits(machInst, 7) == 0 ? 16 : 32) - imm;
25277379Sgblack@eecs.umich.edu                    if (single) {
25287379Sgblack@eecs.umich.edu                        if (half) {
25297379Sgblack@eecs.umich.edu                            return new VcvtSHFixedFpS(machInst, vd, vd, size);
25307379Sgblack@eecs.umich.edu                        } else {
25317379Sgblack@eecs.umich.edu                            return new VcvtSFixedFpS(machInst, vd, vd, size);
25327379Sgblack@eecs.umich.edu                        }
25337379Sgblack@eecs.umich.edu                    } else {
25347379Sgblack@eecs.umich.edu                        if (half) {
25357379Sgblack@eecs.umich.edu                            return new VcvtSHFixedFpD(machInst, vd, vd, size);
25367379Sgblack@eecs.umich.edu                        } else {
25377379Sgblack@eecs.umich.edu                            return new VcvtSFixedFpD(machInst, vd, vd, size);
25387379Sgblack@eecs.umich.edu                        }
25397379Sgblack@eecs.umich.edu                    }
25407379Sgblack@eecs.umich.edu                }
25417363Sgblack@eecs.umich.edu              case 0xb:
25427379Sgblack@eecs.umich.edu                {
25437379Sgblack@eecs.umich.edu                    const bool half = (bits(machInst, 7) == 0);
25447379Sgblack@eecs.umich.edu                    const uint32_t imm = bits(machInst, 5) |
25457379Sgblack@eecs.umich.edu                                         (bits(machInst, 3, 0) << 1);
25467379Sgblack@eecs.umich.edu                    const uint32_t size =
25477379Sgblack@eecs.umich.edu                        (bits(machInst, 7) == 0 ? 16 : 32) - imm;
25487379Sgblack@eecs.umich.edu                    if (single) {
25497379Sgblack@eecs.umich.edu                        if (half) {
25507379Sgblack@eecs.umich.edu                            return new VcvtUHFixedFpS(machInst, vd, vd, size);
25517379Sgblack@eecs.umich.edu                        } else {
25527379Sgblack@eecs.umich.edu                            return new VcvtUFixedFpS(machInst, vd, vd, size);
25537379Sgblack@eecs.umich.edu                        }
25547379Sgblack@eecs.umich.edu                    } else {
25557379Sgblack@eecs.umich.edu                        if (half) {
25567379Sgblack@eecs.umich.edu                            return new VcvtUHFixedFpD(machInst, vd, vd, size);
25577379Sgblack@eecs.umich.edu                        } else {
25587379Sgblack@eecs.umich.edu                            return new VcvtUFixedFpD(machInst, vd, vd, size);
25597379Sgblack@eecs.umich.edu                        }
25607379Sgblack@eecs.umich.edu                    }
25617379Sgblack@eecs.umich.edu                }
25627363Sgblack@eecs.umich.edu              case 0xc:
25637380Sgblack@eecs.umich.edu                if (bits(machInst, 7) == 0) {
25647380Sgblack@eecs.umich.edu                    if (single) {
25657380Sgblack@eecs.umich.edu                        return new VcvtFpUIntSR(machInst, vd, vm);
25667380Sgblack@eecs.umich.edu                    } else {
25677380Sgblack@eecs.umich.edu                        vd = (IntRegIndex)(bits(machInst, 22) |
25687380Sgblack@eecs.umich.edu                                (bits(machInst, 15, 12) << 1));
25697380Sgblack@eecs.umich.edu                        return new VcvtFpUIntDR(machInst, vd, vm);
25707380Sgblack@eecs.umich.edu                    }
25717373Sgblack@eecs.umich.edu                } else {
25727380Sgblack@eecs.umich.edu                    if (single) {
25737380Sgblack@eecs.umich.edu                        return new VcvtFpUIntS(machInst, vd, vm);
25747380Sgblack@eecs.umich.edu                    } else {
25757380Sgblack@eecs.umich.edu                        vd = (IntRegIndex)(bits(machInst, 22) |
25767380Sgblack@eecs.umich.edu                                (bits(machInst, 15, 12) << 1));
25777380Sgblack@eecs.umich.edu                        return new VcvtFpUIntD(machInst, vd, vm);
25787380Sgblack@eecs.umich.edu                    }
25797373Sgblack@eecs.umich.edu                }
25807363Sgblack@eecs.umich.edu              case 0xd:
25817380Sgblack@eecs.umich.edu                if (bits(machInst, 7) == 0) {
25827380Sgblack@eecs.umich.edu                    if (single) {
25837380Sgblack@eecs.umich.edu                        return new VcvtFpSIntSR(machInst, vd, vm);
25847380Sgblack@eecs.umich.edu                    } else {
25857380Sgblack@eecs.umich.edu                        vd = (IntRegIndex)(bits(machInst, 22) |
25867380Sgblack@eecs.umich.edu                                (bits(machInst, 15, 12) << 1));
25877380Sgblack@eecs.umich.edu                        return new VcvtFpSIntDR(machInst, vd, vm);
25887380Sgblack@eecs.umich.edu                    }
25897373Sgblack@eecs.umich.edu                } else {
25907380Sgblack@eecs.umich.edu                    if (single) {
25917380Sgblack@eecs.umich.edu                        return new VcvtFpSIntS(machInst, vd, vm);
25927380Sgblack@eecs.umich.edu                    } else {
25937380Sgblack@eecs.umich.edu                        vd = (IntRegIndex)(bits(machInst, 22) |
25947380Sgblack@eecs.umich.edu                                (bits(machInst, 15, 12) << 1));
25957380Sgblack@eecs.umich.edu                        return new VcvtFpSIntD(machInst, vd, vm);
25967380Sgblack@eecs.umich.edu                    }
25977373Sgblack@eecs.umich.edu                }
25987363Sgblack@eecs.umich.edu              case 0xe:
25997379Sgblack@eecs.umich.edu                {
26007379Sgblack@eecs.umich.edu                    const bool half = (bits(machInst, 7) == 0);
26017379Sgblack@eecs.umich.edu                    const uint32_t imm = bits(machInst, 5) |
26027379Sgblack@eecs.umich.edu                                         (bits(machInst, 3, 0) << 1);
26037379Sgblack@eecs.umich.edu                    const uint32_t size =
26047379Sgblack@eecs.umich.edu                        (bits(machInst, 7) == 0 ? 16 : 32) - imm;
26057379Sgblack@eecs.umich.edu                    if (single) {
26067379Sgblack@eecs.umich.edu                        if (half) {
26077379Sgblack@eecs.umich.edu                            return new VcvtFpSHFixedS(machInst, vd, vd, size);
26087379Sgblack@eecs.umich.edu                        } else {
26097379Sgblack@eecs.umich.edu                            return new VcvtFpSFixedS(machInst, vd, vd, size);
26107379Sgblack@eecs.umich.edu                        }
26117379Sgblack@eecs.umich.edu                    } else {
26127379Sgblack@eecs.umich.edu                        if (half) {
26137379Sgblack@eecs.umich.edu                            return new VcvtFpSHFixedD(machInst, vd, vd, size);
26147379Sgblack@eecs.umich.edu                        } else {
26157379Sgblack@eecs.umich.edu                            return new VcvtFpSFixedD(machInst, vd, vd, size);
26167379Sgblack@eecs.umich.edu                        }
26177379Sgblack@eecs.umich.edu                    }
26187379Sgblack@eecs.umich.edu                }
26197363Sgblack@eecs.umich.edu              case 0xf:
26207379Sgblack@eecs.umich.edu                {
26217379Sgblack@eecs.umich.edu                    const bool half = (bits(machInst, 7) == 0);
26227379Sgblack@eecs.umich.edu                    const uint32_t imm = bits(machInst, 5) |
26237379Sgblack@eecs.umich.edu                                         (bits(machInst, 3, 0) << 1);
26247379Sgblack@eecs.umich.edu                    const uint32_t size =
26257379Sgblack@eecs.umich.edu                        (bits(machInst, 7) == 0 ? 16 : 32) - imm;
26267379Sgblack@eecs.umich.edu                    if (single) {
26277379Sgblack@eecs.umich.edu                        if (half) {
26287379Sgblack@eecs.umich.edu                            return new VcvtFpUHFixedS(machInst, vd, vd, size);
26297379Sgblack@eecs.umich.edu                        } else {
26307379Sgblack@eecs.umich.edu                            return new VcvtFpUFixedS(machInst, vd, vd, size);
26317379Sgblack@eecs.umich.edu                        }
26327379Sgblack@eecs.umich.edu                    } else {
26337379Sgblack@eecs.umich.edu                        if (half) {
26347379Sgblack@eecs.umich.edu                            return new VcvtFpUHFixedD(machInst, vd, vd, size);
26357379Sgblack@eecs.umich.edu                        } else {
26367379Sgblack@eecs.umich.edu                            return new VcvtFpUFixedD(machInst, vd, vd, size);
26377379Sgblack@eecs.umich.edu                        }
26387379Sgblack@eecs.umich.edu                    }
26397379Sgblack@eecs.umich.edu                }
26407363Sgblack@eecs.umich.edu            }
26417363Sgblack@eecs.umich.edu            break;
26427363Sgblack@eecs.umich.edu        }
26437363Sgblack@eecs.umich.edu        return new Unknown(machInst);
26447363Sgblack@eecs.umich.edu    }
26457363Sgblack@eecs.umich.edu    '''
26467363Sgblack@eecs.umich.edu}};
26477363Sgblack@eecs.umich.edu
26487363Sgblack@eecs.umich.edudef format VfpData() {{
26497363Sgblack@eecs.umich.edu    decode_block = '''
26507363Sgblack@eecs.umich.edu    return decodeVfpData(machInst);
26517363Sgblack@eecs.umich.edu    '''
26527363Sgblack@eecs.umich.edu}};
2653