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