neon.isa revision 8588
17639Sgblack@eecs.umich.edu// -*- mode:c++ -*-
27639Sgblack@eecs.umich.edu
37639Sgblack@eecs.umich.edu// Copyright (c) 2010 ARM Limited
47639Sgblack@eecs.umich.edu// All rights reserved
57639Sgblack@eecs.umich.edu//
67639Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall
77639Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual
87639Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating
97639Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software
107639Sgblack@eecs.umich.edu// licensed hereunder.  You may use the software subject to the license
117639Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated
127639Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software,
137639Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form.
147639Sgblack@eecs.umich.edu//
157639Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without
167639Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are
177639Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright
187639Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer;
197639Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright
207639Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the
217639Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution;
227639Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its
237639Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from
247639Sgblack@eecs.umich.edu// this software without specific prior written permission.
257639Sgblack@eecs.umich.edu//
267639Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
277639Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
287639Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
297639Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
307639Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
317639Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
327639Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
337639Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
347639Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
357639Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
367639Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
377639Sgblack@eecs.umich.edu//
387639Sgblack@eecs.umich.edu// Authors: Gabe Black
397639Sgblack@eecs.umich.edu
407639Sgblack@eecs.umich.eduoutput header {{
417639Sgblack@eecs.umich.edu    template <template <typename T> class Base>
427639Sgblack@eecs.umich.edu    StaticInstPtr
437639Sgblack@eecs.umich.edu    decodeNeonUThreeUReg(unsigned size,
447639Sgblack@eecs.umich.edu                         ExtMachInst machInst, IntRegIndex dest,
457639Sgblack@eecs.umich.edu                         IntRegIndex op1, IntRegIndex op2)
467639Sgblack@eecs.umich.edu    {
477639Sgblack@eecs.umich.edu        switch (size) {
487639Sgblack@eecs.umich.edu          case 0:
497639Sgblack@eecs.umich.edu            return new Base<uint8_t>(machInst, dest, op1, op2);
507639Sgblack@eecs.umich.edu          case 1:
517639Sgblack@eecs.umich.edu            return new Base<uint16_t>(machInst, dest, op1, op2);
527639Sgblack@eecs.umich.edu          case 2:
537639Sgblack@eecs.umich.edu            return new Base<uint32_t>(machInst, dest, op1, op2);
547639Sgblack@eecs.umich.edu          case 3:
557639Sgblack@eecs.umich.edu            return new Base<uint64_t>(machInst, dest, op1, op2);
567639Sgblack@eecs.umich.edu          default:
577639Sgblack@eecs.umich.edu            return new Unknown(machInst);
587639Sgblack@eecs.umich.edu        }
597639Sgblack@eecs.umich.edu    }
607639Sgblack@eecs.umich.edu
617639Sgblack@eecs.umich.edu    template <template <typename T> class Base>
627639Sgblack@eecs.umich.edu    StaticInstPtr
637639Sgblack@eecs.umich.edu    decodeNeonSThreeUReg(unsigned size,
647639Sgblack@eecs.umich.edu                         ExtMachInst machInst, IntRegIndex dest,
657639Sgblack@eecs.umich.edu                         IntRegIndex op1, IntRegIndex op2)
667639Sgblack@eecs.umich.edu    {
677639Sgblack@eecs.umich.edu        switch (size) {
687639Sgblack@eecs.umich.edu          case 0:
697639Sgblack@eecs.umich.edu            return new Base<int8_t>(machInst, dest, op1, op2);
707639Sgblack@eecs.umich.edu          case 1:
717639Sgblack@eecs.umich.edu            return new Base<int16_t>(machInst, dest, op1, op2);
727639Sgblack@eecs.umich.edu          case 2:
737639Sgblack@eecs.umich.edu            return new Base<int32_t>(machInst, dest, op1, op2);
747639Sgblack@eecs.umich.edu          case 3:
757639Sgblack@eecs.umich.edu            return new Base<int64_t>(machInst, dest, op1, op2);
767639Sgblack@eecs.umich.edu          default:
777639Sgblack@eecs.umich.edu            return new Unknown(machInst);
787639Sgblack@eecs.umich.edu        }
797639Sgblack@eecs.umich.edu    }
807639Sgblack@eecs.umich.edu
817639Sgblack@eecs.umich.edu    template <template <typename T> class Base>
827639Sgblack@eecs.umich.edu    StaticInstPtr
837639Sgblack@eecs.umich.edu    decodeNeonUSThreeUReg(bool notSigned, unsigned size,
847639Sgblack@eecs.umich.edu                          ExtMachInst machInst, IntRegIndex dest,
857639Sgblack@eecs.umich.edu                          IntRegIndex op1, IntRegIndex op2)
867639Sgblack@eecs.umich.edu    {
877639Sgblack@eecs.umich.edu        if (notSigned) {
887639Sgblack@eecs.umich.edu            return decodeNeonUThreeUReg<Base>(size, machInst, dest, op1, op2);
897639Sgblack@eecs.umich.edu        } else {
907639Sgblack@eecs.umich.edu            return decodeNeonSThreeUReg<Base>(size, machInst, dest, op1, op2);
917639Sgblack@eecs.umich.edu        }
927639Sgblack@eecs.umich.edu    }
937639Sgblack@eecs.umich.edu
947639Sgblack@eecs.umich.edu    template <template <typename T> class Base>
957639Sgblack@eecs.umich.edu    StaticInstPtr
967639Sgblack@eecs.umich.edu    decodeNeonUThreeUSReg(unsigned size,
977639Sgblack@eecs.umich.edu                         ExtMachInst machInst, IntRegIndex dest,
987639Sgblack@eecs.umich.edu                         IntRegIndex op1, IntRegIndex op2)
997639Sgblack@eecs.umich.edu    {
1007639Sgblack@eecs.umich.edu        switch (size) {
1017639Sgblack@eecs.umich.edu          case 0:
1027639Sgblack@eecs.umich.edu            return new Base<uint8_t>(machInst, dest, op1, op2);
1037639Sgblack@eecs.umich.edu          case 1:
1047639Sgblack@eecs.umich.edu            return new Base<uint16_t>(machInst, dest, op1, op2);
1057639Sgblack@eecs.umich.edu          case 2:
1067639Sgblack@eecs.umich.edu            return new Base<uint32_t>(machInst, dest, op1, op2);
1077639Sgblack@eecs.umich.edu          default:
1087639Sgblack@eecs.umich.edu            return new Unknown(machInst);
1097639Sgblack@eecs.umich.edu        }
1107639Sgblack@eecs.umich.edu    }
1117639Sgblack@eecs.umich.edu
1127639Sgblack@eecs.umich.edu    template <template <typename T> class Base>
1137639Sgblack@eecs.umich.edu    StaticInstPtr
1147639Sgblack@eecs.umich.edu    decodeNeonSThreeUSReg(unsigned size,
1157639Sgblack@eecs.umich.edu                         ExtMachInst machInst, IntRegIndex dest,
1167639Sgblack@eecs.umich.edu                         IntRegIndex op1, IntRegIndex op2)
1177639Sgblack@eecs.umich.edu    {
1187639Sgblack@eecs.umich.edu        switch (size) {
1197639Sgblack@eecs.umich.edu          case 0:
1207639Sgblack@eecs.umich.edu            return new Base<int8_t>(machInst, dest, op1, op2);
1217639Sgblack@eecs.umich.edu          case 1:
1227639Sgblack@eecs.umich.edu            return new Base<int16_t>(machInst, dest, op1, op2);
1237639Sgblack@eecs.umich.edu          case 2:
1247639Sgblack@eecs.umich.edu            return new Base<int32_t>(machInst, dest, op1, op2);
1257639Sgblack@eecs.umich.edu          default:
1267639Sgblack@eecs.umich.edu            return new Unknown(machInst);
1277639Sgblack@eecs.umich.edu        }
1287639Sgblack@eecs.umich.edu    }
1297639Sgblack@eecs.umich.edu
1307639Sgblack@eecs.umich.edu    template <template <typename T> class Base>
1317639Sgblack@eecs.umich.edu    StaticInstPtr
1327639Sgblack@eecs.umich.edu    decodeNeonUSThreeUSReg(bool notSigned, unsigned size,
1337639Sgblack@eecs.umich.edu                           ExtMachInst machInst, IntRegIndex dest,
1347639Sgblack@eecs.umich.edu                           IntRegIndex op1, IntRegIndex op2)
1357639Sgblack@eecs.umich.edu    {
1367639Sgblack@eecs.umich.edu        if (notSigned) {
1377639Sgblack@eecs.umich.edu            return decodeNeonUThreeUSReg<Base>(
1387639Sgblack@eecs.umich.edu                    size, machInst, dest, op1, op2);
1397639Sgblack@eecs.umich.edu        } else {
1407639Sgblack@eecs.umich.edu            return decodeNeonSThreeUSReg<Base>(
1417639Sgblack@eecs.umich.edu                    size, machInst, dest, op1, op2);
1427639Sgblack@eecs.umich.edu        }
1437639Sgblack@eecs.umich.edu    }
1447639Sgblack@eecs.umich.edu
1457639Sgblack@eecs.umich.edu    template <template <typename T> class BaseD,
1467639Sgblack@eecs.umich.edu              template <typename T> class BaseQ>
1477639Sgblack@eecs.umich.edu    StaticInstPtr
1487639Sgblack@eecs.umich.edu    decodeNeonUThreeSReg(bool q, unsigned size,
1497639Sgblack@eecs.umich.edu                         ExtMachInst machInst, IntRegIndex dest,
1507639Sgblack@eecs.umich.edu                         IntRegIndex op1, IntRegIndex op2)
1517639Sgblack@eecs.umich.edu    {
1527639Sgblack@eecs.umich.edu        if (q) {
1537639Sgblack@eecs.umich.edu            return decodeNeonUThreeUSReg<BaseQ>(
1547639Sgblack@eecs.umich.edu                    size, machInst, dest, op1, op2);
1557639Sgblack@eecs.umich.edu        } else {
1567639Sgblack@eecs.umich.edu            return decodeNeonUThreeUSReg<BaseD>(
1577639Sgblack@eecs.umich.edu                    size, machInst, dest, op1, op2);
1587639Sgblack@eecs.umich.edu        }
1597639Sgblack@eecs.umich.edu    }
1607639Sgblack@eecs.umich.edu
1617639Sgblack@eecs.umich.edu    template <template <typename T> class BaseD,
1627639Sgblack@eecs.umich.edu              template <typename T> class BaseQ>
1637639Sgblack@eecs.umich.edu    StaticInstPtr
1647639Sgblack@eecs.umich.edu    decodeNeonSThreeSReg(bool q, unsigned size,
1657639Sgblack@eecs.umich.edu                         ExtMachInst machInst, IntRegIndex dest,
1667639Sgblack@eecs.umich.edu                         IntRegIndex op1, IntRegIndex op2)
1677639Sgblack@eecs.umich.edu    {
1687639Sgblack@eecs.umich.edu        if (q) {
1697639Sgblack@eecs.umich.edu            return decodeNeonSThreeUSReg<BaseQ>(
1707639Sgblack@eecs.umich.edu                    size, machInst, dest, op1, op2);
1717639Sgblack@eecs.umich.edu        } else {
1727639Sgblack@eecs.umich.edu            return decodeNeonSThreeUSReg<BaseD>(
1737639Sgblack@eecs.umich.edu                    size, machInst, dest, op1, op2);
1747639Sgblack@eecs.umich.edu        }
1757639Sgblack@eecs.umich.edu    }
1767639Sgblack@eecs.umich.edu
1777639Sgblack@eecs.umich.edu    template <template <typename T> class BaseD,
1787639Sgblack@eecs.umich.edu              template <typename T> class BaseQ>
1797639Sgblack@eecs.umich.edu    StaticInstPtr
1807639Sgblack@eecs.umich.edu    decodeNeonUSThreeSReg(bool q, bool notSigned, unsigned size,
1817639Sgblack@eecs.umich.edu                          ExtMachInst machInst, IntRegIndex dest,
1827639Sgblack@eecs.umich.edu                          IntRegIndex op1, IntRegIndex op2)
1837639Sgblack@eecs.umich.edu    {
1847639Sgblack@eecs.umich.edu        if (notSigned) {
1857639Sgblack@eecs.umich.edu            return decodeNeonUThreeSReg<BaseD, BaseQ>(
1867639Sgblack@eecs.umich.edu                    q, size, machInst, dest, op1, op2);
1877639Sgblack@eecs.umich.edu        } else {
1887639Sgblack@eecs.umich.edu            return decodeNeonSThreeSReg<BaseD, BaseQ>(
1897639Sgblack@eecs.umich.edu                    q, size, machInst, dest, op1, op2);
1907639Sgblack@eecs.umich.edu        }
1917639Sgblack@eecs.umich.edu    }
1927639Sgblack@eecs.umich.edu
1937639Sgblack@eecs.umich.edu    template <template <typename T> class BaseD,
1947639Sgblack@eecs.umich.edu              template <typename T> class BaseQ>
1957639Sgblack@eecs.umich.edu    StaticInstPtr
1967639Sgblack@eecs.umich.edu    decodeNeonUThreeReg(bool q, unsigned size,
1977639Sgblack@eecs.umich.edu                        ExtMachInst machInst, IntRegIndex dest,
1987639Sgblack@eecs.umich.edu                        IntRegIndex op1, IntRegIndex op2)
1997639Sgblack@eecs.umich.edu    {
2007639Sgblack@eecs.umich.edu        if (q) {
2017639Sgblack@eecs.umich.edu            return decodeNeonUThreeUReg<BaseQ>(
2027639Sgblack@eecs.umich.edu                    size, machInst, dest, op1, op2);
2037639Sgblack@eecs.umich.edu        } else {
2047639Sgblack@eecs.umich.edu            return decodeNeonUThreeUReg<BaseD>(
2057639Sgblack@eecs.umich.edu                    size, machInst, dest, op1, op2);
2067639Sgblack@eecs.umich.edu        }
2077639Sgblack@eecs.umich.edu    }
2087639Sgblack@eecs.umich.edu
2097639Sgblack@eecs.umich.edu    template <template <typename T> class BaseD,
2107639Sgblack@eecs.umich.edu              template <typename T> class BaseQ>
2117639Sgblack@eecs.umich.edu    StaticInstPtr
2127639Sgblack@eecs.umich.edu    decodeNeonSThreeReg(bool q, unsigned size,
2137639Sgblack@eecs.umich.edu                        ExtMachInst machInst, IntRegIndex dest,
2147639Sgblack@eecs.umich.edu                        IntRegIndex op1, IntRegIndex op2)
2157639Sgblack@eecs.umich.edu    {
2167639Sgblack@eecs.umich.edu        if (q) {
2177639Sgblack@eecs.umich.edu            return decodeNeonSThreeUReg<BaseQ>(
2187639Sgblack@eecs.umich.edu                    size, machInst, dest, op1, op2);
2197639Sgblack@eecs.umich.edu        } else {
2207639Sgblack@eecs.umich.edu            return decodeNeonSThreeUReg<BaseD>(
2217639Sgblack@eecs.umich.edu                    size, machInst, dest, op1, op2);
2227639Sgblack@eecs.umich.edu        }
2237639Sgblack@eecs.umich.edu    }
2247639Sgblack@eecs.umich.edu
2257639Sgblack@eecs.umich.edu    template <template <typename T> class BaseD,
2267639Sgblack@eecs.umich.edu              template <typename T> class BaseQ>
2277639Sgblack@eecs.umich.edu    StaticInstPtr
2287639Sgblack@eecs.umich.edu    decodeNeonUSThreeReg(bool q, bool notSigned, unsigned size,
2297639Sgblack@eecs.umich.edu                         ExtMachInst machInst, IntRegIndex dest,
2307639Sgblack@eecs.umich.edu                         IntRegIndex op1, IntRegIndex op2)
2317639Sgblack@eecs.umich.edu    {
2327639Sgblack@eecs.umich.edu        if (notSigned) {
2337639Sgblack@eecs.umich.edu            return decodeNeonUThreeReg<BaseD, BaseQ>(
2347639Sgblack@eecs.umich.edu                    q, size, machInst, dest, op1, op2);
2357639Sgblack@eecs.umich.edu        } else {
2367639Sgblack@eecs.umich.edu            return decodeNeonSThreeReg<BaseD, BaseQ>(
2377639Sgblack@eecs.umich.edu                    q, size, machInst, dest, op1, op2);
2387639Sgblack@eecs.umich.edu        }
2397639Sgblack@eecs.umich.edu    }
2407639Sgblack@eecs.umich.edu
2417639Sgblack@eecs.umich.edu    template <template <typename T> class BaseD,
2427639Sgblack@eecs.umich.edu              template <typename T> class BaseQ>
2437639Sgblack@eecs.umich.edu    StaticInstPtr
2447639Sgblack@eecs.umich.edu    decodeNeonUTwoShiftReg(bool q, unsigned size,
2457639Sgblack@eecs.umich.edu                           ExtMachInst machInst, IntRegIndex dest,
2467639Sgblack@eecs.umich.edu                           IntRegIndex op1, uint64_t imm)
2477639Sgblack@eecs.umich.edu    {
2487639Sgblack@eecs.umich.edu        if (q) {
2497639Sgblack@eecs.umich.edu            switch (size) {
2507639Sgblack@eecs.umich.edu              case 0:
2517639Sgblack@eecs.umich.edu                return new BaseQ<uint8_t>(machInst, dest, op1, imm);
2527639Sgblack@eecs.umich.edu              case 1:
2537639Sgblack@eecs.umich.edu                return new BaseQ<uint16_t>(machInst, dest, op1, imm);
2547639Sgblack@eecs.umich.edu              case 2:
2557639Sgblack@eecs.umich.edu                return new BaseQ<uint32_t>(machInst, dest, op1, imm);
2567639Sgblack@eecs.umich.edu              case 3:
2577639Sgblack@eecs.umich.edu                return new BaseQ<uint64_t>(machInst, dest, op1, imm);
2587639Sgblack@eecs.umich.edu              default:
2597639Sgblack@eecs.umich.edu                return new Unknown(machInst);
2607639Sgblack@eecs.umich.edu            }
2617639Sgblack@eecs.umich.edu        } else {
2627639Sgblack@eecs.umich.edu            switch (size) {
2637639Sgblack@eecs.umich.edu              case 0:
2647639Sgblack@eecs.umich.edu                return new BaseD<uint8_t>(machInst, dest, op1, imm);
2657639Sgblack@eecs.umich.edu              case 1:
2667639Sgblack@eecs.umich.edu                return new BaseD<uint16_t>(machInst, dest, op1, imm);
2677639Sgblack@eecs.umich.edu              case 2:
2687639Sgblack@eecs.umich.edu                return new BaseD<uint32_t>(machInst, dest, op1, imm);
2697639Sgblack@eecs.umich.edu              case 3:
2707639Sgblack@eecs.umich.edu                return new BaseD<uint64_t>(machInst, dest, op1, imm);
2717639Sgblack@eecs.umich.edu              default:
2727639Sgblack@eecs.umich.edu                return new Unknown(machInst);
2737639Sgblack@eecs.umich.edu            }
2747639Sgblack@eecs.umich.edu        }
2757639Sgblack@eecs.umich.edu    }
2767639Sgblack@eecs.umich.edu
2777639Sgblack@eecs.umich.edu    template <template <typename T> class BaseD,
2787639Sgblack@eecs.umich.edu              template <typename T> class BaseQ>
2797639Sgblack@eecs.umich.edu    StaticInstPtr
2807639Sgblack@eecs.umich.edu    decodeNeonSTwoShiftReg(bool q, unsigned size,
2817639Sgblack@eecs.umich.edu                           ExtMachInst machInst, IntRegIndex dest,
2827639Sgblack@eecs.umich.edu                           IntRegIndex op1, uint64_t imm)
2837639Sgblack@eecs.umich.edu    {
2847639Sgblack@eecs.umich.edu        if (q) {
2857639Sgblack@eecs.umich.edu            switch (size) {
2867639Sgblack@eecs.umich.edu              case 0:
2877639Sgblack@eecs.umich.edu                return new BaseQ<int8_t>(machInst, dest, op1, imm);
2887639Sgblack@eecs.umich.edu              case 1:
2897639Sgblack@eecs.umich.edu                return new BaseQ<int16_t>(machInst, dest, op1, imm);
2907639Sgblack@eecs.umich.edu              case 2:
2917639Sgblack@eecs.umich.edu                return new BaseQ<int32_t>(machInst, dest, op1, imm);
2927639Sgblack@eecs.umich.edu              case 3:
2937639Sgblack@eecs.umich.edu                return new BaseQ<int64_t>(machInst, dest, op1, imm);
2947639Sgblack@eecs.umich.edu              default:
2957639Sgblack@eecs.umich.edu                return new Unknown(machInst);
2967639Sgblack@eecs.umich.edu            }
2977639Sgblack@eecs.umich.edu        } else {
2987639Sgblack@eecs.umich.edu            switch (size) {
2997639Sgblack@eecs.umich.edu              case 0:
3007639Sgblack@eecs.umich.edu                return new BaseD<int8_t>(machInst, dest, op1, imm);
3017639Sgblack@eecs.umich.edu              case 1:
3027639Sgblack@eecs.umich.edu                return new BaseD<int16_t>(machInst, dest, op1, imm);
3037639Sgblack@eecs.umich.edu              case 2:
3047639Sgblack@eecs.umich.edu                return new BaseD<int32_t>(machInst, dest, op1, imm);
3057639Sgblack@eecs.umich.edu              case 3:
3067639Sgblack@eecs.umich.edu                return new BaseD<int64_t>(machInst, dest, op1, imm);
3077639Sgblack@eecs.umich.edu              default:
3087639Sgblack@eecs.umich.edu                return new Unknown(machInst);
3097639Sgblack@eecs.umich.edu            }
3107639Sgblack@eecs.umich.edu        }
3117639Sgblack@eecs.umich.edu    }
3127639Sgblack@eecs.umich.edu
3137639Sgblack@eecs.umich.edu
3147639Sgblack@eecs.umich.edu    template <template <typename T> class BaseD,
3157639Sgblack@eecs.umich.edu              template <typename T> class BaseQ>
3167639Sgblack@eecs.umich.edu    StaticInstPtr
3177639Sgblack@eecs.umich.edu    decodeNeonUSTwoShiftReg(bool q, bool notSigned, unsigned size,
3187639Sgblack@eecs.umich.edu                            ExtMachInst machInst, IntRegIndex dest,
3197639Sgblack@eecs.umich.edu                            IntRegIndex op1, uint64_t imm)
3207639Sgblack@eecs.umich.edu    {
3217639Sgblack@eecs.umich.edu        if (notSigned) {
3227639Sgblack@eecs.umich.edu            return decodeNeonUTwoShiftReg<BaseD, BaseQ>(
3237639Sgblack@eecs.umich.edu                    q, size, machInst, dest, op1, imm);
3247639Sgblack@eecs.umich.edu        } else {
3257639Sgblack@eecs.umich.edu            return decodeNeonSTwoShiftReg<BaseD, BaseQ>(
3267639Sgblack@eecs.umich.edu                    q, size, machInst, dest, op1, imm);
3277639Sgblack@eecs.umich.edu        }
3287639Sgblack@eecs.umich.edu    }
3297639Sgblack@eecs.umich.edu
3307639Sgblack@eecs.umich.edu    template <template <typename T> class Base>
3317639Sgblack@eecs.umich.edu    StaticInstPtr
3327639Sgblack@eecs.umich.edu    decodeNeonUTwoShiftUSReg(unsigned size,
3337639Sgblack@eecs.umich.edu                             ExtMachInst machInst, IntRegIndex dest,
3347639Sgblack@eecs.umich.edu                             IntRegIndex op1, uint64_t imm)
3357639Sgblack@eecs.umich.edu    {
3367639Sgblack@eecs.umich.edu        switch (size) {
3377639Sgblack@eecs.umich.edu          case 0:
3387639Sgblack@eecs.umich.edu            return new Base<uint8_t>(machInst, dest, op1, imm);
3397639Sgblack@eecs.umich.edu          case 1:
3407639Sgblack@eecs.umich.edu            return new Base<uint16_t>(machInst, dest, op1, imm);
3417639Sgblack@eecs.umich.edu          case 2:
3427639Sgblack@eecs.umich.edu            return new Base<uint32_t>(machInst, dest, op1, imm);
3437639Sgblack@eecs.umich.edu          default:
3447639Sgblack@eecs.umich.edu            return new Unknown(machInst);
3457639Sgblack@eecs.umich.edu        }
3467639Sgblack@eecs.umich.edu    }
3477639Sgblack@eecs.umich.edu
3487639Sgblack@eecs.umich.edu    template <template <typename T> class BaseD,
3497639Sgblack@eecs.umich.edu              template <typename T> class BaseQ>
3507639Sgblack@eecs.umich.edu    StaticInstPtr
3517639Sgblack@eecs.umich.edu    decodeNeonUTwoShiftSReg(bool q, unsigned size,
3527639Sgblack@eecs.umich.edu                            ExtMachInst machInst, IntRegIndex dest,
3537639Sgblack@eecs.umich.edu                            IntRegIndex op1, uint64_t imm)
3547639Sgblack@eecs.umich.edu    {
3557639Sgblack@eecs.umich.edu        if (q) {
3567639Sgblack@eecs.umich.edu            return decodeNeonUTwoShiftUSReg<BaseQ>(
3577639Sgblack@eecs.umich.edu                    size, machInst, dest, op1, imm);
3587639Sgblack@eecs.umich.edu        } else {
3597639Sgblack@eecs.umich.edu            return decodeNeonUTwoShiftUSReg<BaseD>(
3607639Sgblack@eecs.umich.edu                    size, machInst, dest, op1, imm);
3617639Sgblack@eecs.umich.edu        }
3627639Sgblack@eecs.umich.edu    }
3637639Sgblack@eecs.umich.edu
3647639Sgblack@eecs.umich.edu    template <template <typename T> class Base>
3657639Sgblack@eecs.umich.edu    StaticInstPtr
3667639Sgblack@eecs.umich.edu    decodeNeonSTwoShiftUSReg(unsigned size,
3677639Sgblack@eecs.umich.edu                             ExtMachInst machInst, IntRegIndex dest,
3687639Sgblack@eecs.umich.edu                             IntRegIndex op1, uint64_t imm)
3697639Sgblack@eecs.umich.edu    {
3707639Sgblack@eecs.umich.edu        switch (size) {
3717639Sgblack@eecs.umich.edu          case 0:
3727639Sgblack@eecs.umich.edu            return new Base<int8_t>(machInst, dest, op1, imm);
3737639Sgblack@eecs.umich.edu          case 1:
3747639Sgblack@eecs.umich.edu            return new Base<int16_t>(machInst, dest, op1, imm);
3757639Sgblack@eecs.umich.edu          case 2:
3767639Sgblack@eecs.umich.edu            return new Base<int32_t>(machInst, dest, op1, imm);
3777639Sgblack@eecs.umich.edu          default:
3787639Sgblack@eecs.umich.edu            return new Unknown(machInst);
3797639Sgblack@eecs.umich.edu        }
3807639Sgblack@eecs.umich.edu    }
3817639Sgblack@eecs.umich.edu
3827639Sgblack@eecs.umich.edu    template <template <typename T> class BaseD,
3837639Sgblack@eecs.umich.edu              template <typename T> class BaseQ>
3847639Sgblack@eecs.umich.edu    StaticInstPtr
3857639Sgblack@eecs.umich.edu    decodeNeonSTwoShiftSReg(bool q, unsigned size,
3867639Sgblack@eecs.umich.edu                            ExtMachInst machInst, IntRegIndex dest,
3877639Sgblack@eecs.umich.edu                            IntRegIndex op1, uint64_t imm)
3887639Sgblack@eecs.umich.edu    {
3897639Sgblack@eecs.umich.edu        if (q) {
3907639Sgblack@eecs.umich.edu            return decodeNeonSTwoShiftUSReg<BaseQ>(
3917639Sgblack@eecs.umich.edu                    size, machInst, dest, op1, imm);
3927639Sgblack@eecs.umich.edu        } else {
3937639Sgblack@eecs.umich.edu            return decodeNeonSTwoShiftUSReg<BaseD>(
3947639Sgblack@eecs.umich.edu                    size, machInst, dest, op1, imm);
3957639Sgblack@eecs.umich.edu        }
3967639Sgblack@eecs.umich.edu    }
3977639Sgblack@eecs.umich.edu
3987639Sgblack@eecs.umich.edu    template <template <typename T> class BaseD,
3997639Sgblack@eecs.umich.edu              template <typename T> class BaseQ>
4007639Sgblack@eecs.umich.edu    StaticInstPtr
4017639Sgblack@eecs.umich.edu    decodeNeonUSTwoShiftSReg(bool q, bool notSigned, unsigned size,
4027639Sgblack@eecs.umich.edu                             ExtMachInst machInst, IntRegIndex dest,
4037639Sgblack@eecs.umich.edu                             IntRegIndex op1, uint64_t imm)
4047639Sgblack@eecs.umich.edu    {
4057639Sgblack@eecs.umich.edu        if (notSigned) {
4067639Sgblack@eecs.umich.edu            return decodeNeonUTwoShiftSReg<BaseD, BaseQ>(
4077639Sgblack@eecs.umich.edu                    q, size, machInst, dest, op1, imm);
4087639Sgblack@eecs.umich.edu        } else {
4097639Sgblack@eecs.umich.edu            return decodeNeonSTwoShiftSReg<BaseD, BaseQ>(
4107639Sgblack@eecs.umich.edu                    q, size, machInst, dest, op1, imm);
4117639Sgblack@eecs.umich.edu        }
4127639Sgblack@eecs.umich.edu    }
4137639Sgblack@eecs.umich.edu
4147639Sgblack@eecs.umich.edu    template <template <typename T> class Base>
4157639Sgblack@eecs.umich.edu    StaticInstPtr
4167639Sgblack@eecs.umich.edu    decodeNeonUTwoMiscUSReg(unsigned size,
4177639Sgblack@eecs.umich.edu                            ExtMachInst machInst, IntRegIndex dest,
4187639Sgblack@eecs.umich.edu                            IntRegIndex op1)
4197639Sgblack@eecs.umich.edu    {
4207639Sgblack@eecs.umich.edu        switch (size) {
4217639Sgblack@eecs.umich.edu          case 0:
4227639Sgblack@eecs.umich.edu            return new Base<uint8_t>(machInst, dest, op1);
4237639Sgblack@eecs.umich.edu          case 1:
4247639Sgblack@eecs.umich.edu            return new Base<uint16_t>(machInst, dest, op1);
4257639Sgblack@eecs.umich.edu          case 2:
4267639Sgblack@eecs.umich.edu            return new Base<uint32_t>(machInst, dest, op1);
4277639Sgblack@eecs.umich.edu          default:
4287639Sgblack@eecs.umich.edu            return new Unknown(machInst);
4297639Sgblack@eecs.umich.edu        }
4307639Sgblack@eecs.umich.edu    }
4317639Sgblack@eecs.umich.edu
4327639Sgblack@eecs.umich.edu    template <template <typename T> class Base>
4337639Sgblack@eecs.umich.edu    StaticInstPtr
4347639Sgblack@eecs.umich.edu    decodeNeonSTwoMiscUSReg(unsigned size,
4357639Sgblack@eecs.umich.edu                            ExtMachInst machInst, IntRegIndex dest,
4367639Sgblack@eecs.umich.edu                            IntRegIndex op1)
4377639Sgblack@eecs.umich.edu    {
4387639Sgblack@eecs.umich.edu        switch (size) {
4397639Sgblack@eecs.umich.edu          case 0:
4407639Sgblack@eecs.umich.edu            return new Base<int8_t>(machInst, dest, op1);
4417639Sgblack@eecs.umich.edu          case 1:
4427639Sgblack@eecs.umich.edu            return new Base<int16_t>(machInst, dest, op1);
4437639Sgblack@eecs.umich.edu          case 2:
4447639Sgblack@eecs.umich.edu            return new Base<int32_t>(machInst, dest, op1);
4457639Sgblack@eecs.umich.edu          default:
4467639Sgblack@eecs.umich.edu            return new Unknown(machInst);
4477639Sgblack@eecs.umich.edu        }
4487639Sgblack@eecs.umich.edu    }
4497639Sgblack@eecs.umich.edu
4507639Sgblack@eecs.umich.edu    template <template <typename T> class BaseD,
4517639Sgblack@eecs.umich.edu              template <typename T> class BaseQ>
4527639Sgblack@eecs.umich.edu    StaticInstPtr
4537639Sgblack@eecs.umich.edu    decodeNeonUTwoMiscSReg(bool q, unsigned size,
4547639Sgblack@eecs.umich.edu                          ExtMachInst machInst, IntRegIndex dest,
4557639Sgblack@eecs.umich.edu                          IntRegIndex op1)
4567639Sgblack@eecs.umich.edu    {
4577639Sgblack@eecs.umich.edu        if (q) {
4587639Sgblack@eecs.umich.edu            return decodeNeonUTwoMiscUSReg<BaseQ>(size, machInst, dest, op1);
4597639Sgblack@eecs.umich.edu        } else {
4607639Sgblack@eecs.umich.edu            return decodeNeonUTwoMiscUSReg<BaseD>(size, machInst, dest, op1);
4617639Sgblack@eecs.umich.edu        }
4627639Sgblack@eecs.umich.edu    }
4637639Sgblack@eecs.umich.edu
4647639Sgblack@eecs.umich.edu    template <template <typename T> class BaseD,
4657639Sgblack@eecs.umich.edu              template <typename T> class BaseQ>
4667639Sgblack@eecs.umich.edu    StaticInstPtr
4677639Sgblack@eecs.umich.edu    decodeNeonSTwoMiscSReg(bool q, unsigned size,
4687639Sgblack@eecs.umich.edu                          ExtMachInst machInst, IntRegIndex dest,
4697639Sgblack@eecs.umich.edu                          IntRegIndex op1)
4707639Sgblack@eecs.umich.edu    {
4717639Sgblack@eecs.umich.edu        if (q) {
4727639Sgblack@eecs.umich.edu            return decodeNeonSTwoMiscUSReg<BaseQ>(size, machInst, dest, op1);
4737639Sgblack@eecs.umich.edu        } else {
4747639Sgblack@eecs.umich.edu            return decodeNeonSTwoMiscUSReg<BaseD>(size, machInst, dest, op1);
4757639Sgblack@eecs.umich.edu        }
4767639Sgblack@eecs.umich.edu    }
4777639Sgblack@eecs.umich.edu
4787639Sgblack@eecs.umich.edu    template <template <typename T> class Base>
4797639Sgblack@eecs.umich.edu    StaticInstPtr
4807639Sgblack@eecs.umich.edu    decodeNeonUTwoMiscUReg(unsigned size,
4817639Sgblack@eecs.umich.edu                           ExtMachInst machInst, IntRegIndex dest,
4827639Sgblack@eecs.umich.edu                           IntRegIndex op1)
4837639Sgblack@eecs.umich.edu    {
4847639Sgblack@eecs.umich.edu        switch (size) {
4857639Sgblack@eecs.umich.edu          case 0:
4867639Sgblack@eecs.umich.edu            return new Base<uint8_t>(machInst, dest, op1);
4877639Sgblack@eecs.umich.edu          case 1:
4887639Sgblack@eecs.umich.edu            return new Base<uint16_t>(machInst, dest, op1);
4897639Sgblack@eecs.umich.edu          case 2:
4907639Sgblack@eecs.umich.edu            return new Base<uint32_t>(machInst, dest, op1);
4917639Sgblack@eecs.umich.edu          case 3:
4927639Sgblack@eecs.umich.edu            return new Base<uint64_t>(machInst, dest, op1);
4937639Sgblack@eecs.umich.edu          default:
4947639Sgblack@eecs.umich.edu            return new Unknown(machInst);
4957639Sgblack@eecs.umich.edu        }
4967639Sgblack@eecs.umich.edu    }
4977639Sgblack@eecs.umich.edu
4987639Sgblack@eecs.umich.edu    template <template <typename T> class Base>
4997639Sgblack@eecs.umich.edu    StaticInstPtr
5007639Sgblack@eecs.umich.edu    decodeNeonSTwoMiscUReg(unsigned size,
5017639Sgblack@eecs.umich.edu                            ExtMachInst machInst, IntRegIndex dest,
5027639Sgblack@eecs.umich.edu                            IntRegIndex op1)
5037639Sgblack@eecs.umich.edu    {
5047639Sgblack@eecs.umich.edu        switch (size) {
5057639Sgblack@eecs.umich.edu          case 0:
5067639Sgblack@eecs.umich.edu            return new Base<int8_t>(machInst, dest, op1);
5077639Sgblack@eecs.umich.edu          case 1:
5087639Sgblack@eecs.umich.edu            return new Base<int16_t>(machInst, dest, op1);
5097639Sgblack@eecs.umich.edu          case 2:
5107639Sgblack@eecs.umich.edu            return new Base<int32_t>(machInst, dest, op1);
5117639Sgblack@eecs.umich.edu          case 3:
5127639Sgblack@eecs.umich.edu            return new Base<int64_t>(machInst, dest, op1);
5137639Sgblack@eecs.umich.edu          default:
5147639Sgblack@eecs.umich.edu            return new Unknown(machInst);
5157639Sgblack@eecs.umich.edu        }
5167639Sgblack@eecs.umich.edu    }
5177639Sgblack@eecs.umich.edu
5187639Sgblack@eecs.umich.edu    template <template <typename T> class BaseD,
5197639Sgblack@eecs.umich.edu              template <typename T> class BaseQ>
5207639Sgblack@eecs.umich.edu    StaticInstPtr
5217639Sgblack@eecs.umich.edu    decodeNeonSTwoMiscReg(bool q, unsigned size,
5227639Sgblack@eecs.umich.edu                          ExtMachInst machInst, IntRegIndex dest,
5237639Sgblack@eecs.umich.edu                          IntRegIndex op1)
5247639Sgblack@eecs.umich.edu    {
5257639Sgblack@eecs.umich.edu        if (q) {
5267639Sgblack@eecs.umich.edu            return decodeNeonSTwoMiscUReg<BaseQ>(size, machInst, dest, op1);
5277639Sgblack@eecs.umich.edu        } else {
5287639Sgblack@eecs.umich.edu            return decodeNeonSTwoMiscUReg<BaseD>(size, machInst, dest, op1);
5297639Sgblack@eecs.umich.edu        }
5307639Sgblack@eecs.umich.edu    }
5317639Sgblack@eecs.umich.edu
5327639Sgblack@eecs.umich.edu    template <template <typename T> class BaseD,
5337639Sgblack@eecs.umich.edu              template <typename T> class BaseQ>
5347639Sgblack@eecs.umich.edu    StaticInstPtr
5357639Sgblack@eecs.umich.edu    decodeNeonUTwoMiscReg(bool q, unsigned size,
5367639Sgblack@eecs.umich.edu                          ExtMachInst machInst, IntRegIndex dest,
5377639Sgblack@eecs.umich.edu                          IntRegIndex op1)
5387639Sgblack@eecs.umich.edu    {
5397639Sgblack@eecs.umich.edu        if (q) {
5407639Sgblack@eecs.umich.edu            return decodeNeonUTwoMiscUReg<BaseQ>(size, machInst, dest, op1);
5417639Sgblack@eecs.umich.edu        } else {
5427639Sgblack@eecs.umich.edu            return decodeNeonUTwoMiscUReg<BaseD>(size, machInst, dest, op1);
5437639Sgblack@eecs.umich.edu        }
5447639Sgblack@eecs.umich.edu    }
5457639Sgblack@eecs.umich.edu
5467639Sgblack@eecs.umich.edu    template <template <typename T> class BaseD,
5477639Sgblack@eecs.umich.edu              template <typename T> class BaseQ>
5487639Sgblack@eecs.umich.edu    StaticInstPtr
5497639Sgblack@eecs.umich.edu    decodeNeonUSTwoMiscSReg(bool q, bool notSigned, unsigned size,
5507639Sgblack@eecs.umich.edu                            ExtMachInst machInst, IntRegIndex dest,
5517639Sgblack@eecs.umich.edu                            IntRegIndex op1)
5527639Sgblack@eecs.umich.edu    {
5537639Sgblack@eecs.umich.edu        if (notSigned) {
5547639Sgblack@eecs.umich.edu            return decodeNeonUTwoShiftSReg<BaseD, BaseQ>(
5557639Sgblack@eecs.umich.edu                    q, size, machInst, dest, op1);
5567639Sgblack@eecs.umich.edu        } else {
5577639Sgblack@eecs.umich.edu            return decodeNeonSTwoShiftSReg<BaseD, BaseQ>(
5587639Sgblack@eecs.umich.edu                    q, size, machInst, dest, op1);
5597639Sgblack@eecs.umich.edu        }
5607639Sgblack@eecs.umich.edu    }
5617639Sgblack@eecs.umich.edu
5627639Sgblack@eecs.umich.edu}};
5637639Sgblack@eecs.umich.edu
5647639Sgblack@eecs.umich.eduoutput exec {{
5657639Sgblack@eecs.umich.edu    static float
5667639Sgblack@eecs.umich.edu    vcgtFunc(float op1, float op2)
5677639Sgblack@eecs.umich.edu    {
5687639Sgblack@eecs.umich.edu        if (isSnan(op1) || isSnan(op2))
5697639Sgblack@eecs.umich.edu            return 2.0;
5707639Sgblack@eecs.umich.edu        return (op1 > op2) ? 0.0 : 1.0;
5717639Sgblack@eecs.umich.edu    }
5727639Sgblack@eecs.umich.edu
5737639Sgblack@eecs.umich.edu    static float
5747639Sgblack@eecs.umich.edu    vcgeFunc(float op1, float op2)
5757639Sgblack@eecs.umich.edu    {
5767639Sgblack@eecs.umich.edu        if (isSnan(op1) || isSnan(op2))
5777639Sgblack@eecs.umich.edu            return 2.0;
5787639Sgblack@eecs.umich.edu        return (op1 >= op2) ? 0.0 : 1.0;
5797639Sgblack@eecs.umich.edu    }
5807639Sgblack@eecs.umich.edu
5817639Sgblack@eecs.umich.edu    static float
5827639Sgblack@eecs.umich.edu    vceqFunc(float op1, float op2)
5837639Sgblack@eecs.umich.edu    {
5847639Sgblack@eecs.umich.edu        if (isSnan(op1) || isSnan(op2))
5857639Sgblack@eecs.umich.edu            return 2.0;
5867639Sgblack@eecs.umich.edu        return (op1 == op2) ? 0.0 : 1.0;
5877639Sgblack@eecs.umich.edu    }
5887639Sgblack@eecs.umich.edu
5897639Sgblack@eecs.umich.edu    static float
5907639Sgblack@eecs.umich.edu    vcleFunc(float op1, float op2)
5917639Sgblack@eecs.umich.edu    {
5927639Sgblack@eecs.umich.edu        if (isSnan(op1) || isSnan(op2))
5937639Sgblack@eecs.umich.edu            return 2.0;
5947639Sgblack@eecs.umich.edu        return (op1 <= op2) ? 0.0 : 1.0;
5957639Sgblack@eecs.umich.edu    }
5967639Sgblack@eecs.umich.edu
5977639Sgblack@eecs.umich.edu    static float
5987639Sgblack@eecs.umich.edu    vcltFunc(float op1, float op2)
5997639Sgblack@eecs.umich.edu    {
6007639Sgblack@eecs.umich.edu        if (isSnan(op1) || isSnan(op2))
6017639Sgblack@eecs.umich.edu            return 2.0;
6027639Sgblack@eecs.umich.edu        return (op1 < op2) ? 0.0 : 1.0;
6037639Sgblack@eecs.umich.edu    }
6047639Sgblack@eecs.umich.edu
6057639Sgblack@eecs.umich.edu    static float
6067639Sgblack@eecs.umich.edu    vacgtFunc(float op1, float op2)
6077639Sgblack@eecs.umich.edu    {
6087639Sgblack@eecs.umich.edu        if (isSnan(op1) || isSnan(op2))
6097639Sgblack@eecs.umich.edu            return 2.0;
6107639Sgblack@eecs.umich.edu        return (fabsf(op1) > fabsf(op2)) ? 0.0 : 1.0;
6117639Sgblack@eecs.umich.edu    }
6127639Sgblack@eecs.umich.edu
6137639Sgblack@eecs.umich.edu    static float
6147639Sgblack@eecs.umich.edu    vacgeFunc(float op1, float op2)
6157639Sgblack@eecs.umich.edu    {
6167639Sgblack@eecs.umich.edu        if (isSnan(op1) || isSnan(op2))
6177639Sgblack@eecs.umich.edu            return 2.0;
6187639Sgblack@eecs.umich.edu        return (fabsf(op1) >= fabsf(op2)) ? 0.0 : 1.0;
6197639Sgblack@eecs.umich.edu    }
6207639Sgblack@eecs.umich.edu}};
6217639Sgblack@eecs.umich.edu
6227639Sgblack@eecs.umich.edulet {{
6237639Sgblack@eecs.umich.edu
6247639Sgblack@eecs.umich.edu    header_output = ""
6257639Sgblack@eecs.umich.edu    exec_output = ""
6267639Sgblack@eecs.umich.edu
6277639Sgblack@eecs.umich.edu    smallUnsignedTypes = ("uint8_t", "uint16_t", "uint32_t")
6287639Sgblack@eecs.umich.edu    unsignedTypes = smallUnsignedTypes + ("uint64_t",)
6297639Sgblack@eecs.umich.edu    smallSignedTypes = ("int8_t", "int16_t", "int32_t")
6307639Sgblack@eecs.umich.edu    signedTypes = smallSignedTypes + ("int64_t",)
6317639Sgblack@eecs.umich.edu    smallTypes = smallUnsignedTypes + smallSignedTypes
6327639Sgblack@eecs.umich.edu    allTypes = unsignedTypes + signedTypes
6337639Sgblack@eecs.umich.edu
6347760SGiacomo.Gabrielli@arm.com    def threeEqualRegInst(name, Name, opClass, types, rCount, op,
6357639Sgblack@eecs.umich.edu                          readDest=False, pairwise=False):
6367639Sgblack@eecs.umich.edu        global header_output, exec_output
6377640Sgblack@eecs.umich.edu        eWalkCode = simdEnabledCheckCode + '''
6387639Sgblack@eecs.umich.edu        RegVect srcReg1, srcReg2, destReg;
6397639Sgblack@eecs.umich.edu        '''
6407639Sgblack@eecs.umich.edu        for reg in range(rCount):
6417639Sgblack@eecs.umich.edu            eWalkCode += '''
6428588Sgblack@eecs.umich.edu                srcReg1.regs[%(reg)d] = htog(FpOp1P%(reg)d_uw);
6438588Sgblack@eecs.umich.edu                srcReg2.regs[%(reg)d] = htog(FpOp2P%(reg)d_uw);
6447639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
6457639Sgblack@eecs.umich.edu            if readDest:
6467639Sgblack@eecs.umich.edu                eWalkCode += '''
6478588Sgblack@eecs.umich.edu                    destReg.regs[%(reg)d] = htog(FpDestP%(reg)d_uw);
6487639Sgblack@eecs.umich.edu                ''' % { "reg" : reg }
6497639Sgblack@eecs.umich.edu        readDestCode = ''
6507639Sgblack@eecs.umich.edu        if readDest:
6517639Sgblack@eecs.umich.edu            readDestCode = 'destElem = gtoh(destReg.elements[i]);'
6527639Sgblack@eecs.umich.edu        if pairwise:
6537639Sgblack@eecs.umich.edu            eWalkCode += '''
6547639Sgblack@eecs.umich.edu            for (unsigned i = 0; i < eCount; i++) {
6557639Sgblack@eecs.umich.edu                Element srcElem1 = gtoh(2 * i < eCount ?
6567639Sgblack@eecs.umich.edu                                        srcReg1.elements[2 * i] :
6577639Sgblack@eecs.umich.edu                                        srcReg2.elements[2 * i - eCount]);
6587639Sgblack@eecs.umich.edu                Element srcElem2 = gtoh(2 * i < eCount ?
6597639Sgblack@eecs.umich.edu                                        srcReg1.elements[2 * i + 1] :
6607639Sgblack@eecs.umich.edu                                        srcReg2.elements[2 * i + 1 - eCount]);
6617639Sgblack@eecs.umich.edu                Element destElem;
6627639Sgblack@eecs.umich.edu                %(readDest)s
6637639Sgblack@eecs.umich.edu                %(op)s
6647639Sgblack@eecs.umich.edu                destReg.elements[i] = htog(destElem);
6657639Sgblack@eecs.umich.edu            }
6667639Sgblack@eecs.umich.edu            ''' % { "op" : op, "readDest" : readDestCode }
6677639Sgblack@eecs.umich.edu        else:
6687639Sgblack@eecs.umich.edu            eWalkCode += '''
6697639Sgblack@eecs.umich.edu            for (unsigned i = 0; i < eCount; i++) {
6707639Sgblack@eecs.umich.edu                Element srcElem1 = gtoh(srcReg1.elements[i]);
6717639Sgblack@eecs.umich.edu                Element srcElem2 = gtoh(srcReg2.elements[i]);
6727639Sgblack@eecs.umich.edu                Element destElem;
6737639Sgblack@eecs.umich.edu                %(readDest)s
6747639Sgblack@eecs.umich.edu                %(op)s
6757639Sgblack@eecs.umich.edu                destReg.elements[i] = htog(destElem);
6767639Sgblack@eecs.umich.edu            }
6777639Sgblack@eecs.umich.edu            ''' % { "op" : op, "readDest" : readDestCode }
6787639Sgblack@eecs.umich.edu        for reg in range(rCount):
6797639Sgblack@eecs.umich.edu            eWalkCode += '''
6808588Sgblack@eecs.umich.edu            FpDestP%(reg)d_uw = gtoh(destReg.regs[%(reg)d]);
6817639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
6827639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
6837639Sgblack@eecs.umich.edu                            "RegRegRegOp",
6847639Sgblack@eecs.umich.edu                            { "code": eWalkCode,
6857639Sgblack@eecs.umich.edu                              "r_count": rCount,
6867760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
6877760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
6887639Sgblack@eecs.umich.edu        header_output += NeonRegRegRegOpDeclare.subst(iop)
6897639Sgblack@eecs.umich.edu        exec_output += NeonEqualRegExecute.subst(iop)
6907639Sgblack@eecs.umich.edu        for type in types:
6917639Sgblack@eecs.umich.edu            substDict = { "targs" : type,
6927639Sgblack@eecs.umich.edu                          "class_name" : Name }
6937639Sgblack@eecs.umich.edu            exec_output += NeonExecDeclare.subst(substDict)
6947639Sgblack@eecs.umich.edu
6957760SGiacomo.Gabrielli@arm.com    def threeEqualRegInstFp(name, Name, opClass, types, rCount, op,
6967639Sgblack@eecs.umich.edu                            readDest=False, pairwise=False, toInt=False):
6977639Sgblack@eecs.umich.edu        global header_output, exec_output
6987640Sgblack@eecs.umich.edu        eWalkCode = simdEnabledCheckCode + '''
6997639Sgblack@eecs.umich.edu        typedef FloatReg FloatVect[rCount];
7007639Sgblack@eecs.umich.edu        FloatVect srcRegs1, srcRegs2;
7017639Sgblack@eecs.umich.edu        '''
7027639Sgblack@eecs.umich.edu        if toInt:
7037639Sgblack@eecs.umich.edu            eWalkCode += 'RegVect destRegs;\n'
7047639Sgblack@eecs.umich.edu        else:
7057639Sgblack@eecs.umich.edu            eWalkCode += 'FloatVect destRegs;\n'
7067639Sgblack@eecs.umich.edu        for reg in range(rCount):
7077639Sgblack@eecs.umich.edu            eWalkCode += '''
7087639Sgblack@eecs.umich.edu                srcRegs1[%(reg)d] = FpOp1P%(reg)d;
7097639Sgblack@eecs.umich.edu                srcRegs2[%(reg)d] = FpOp2P%(reg)d;
7107639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
7117639Sgblack@eecs.umich.edu            if readDest:
7127639Sgblack@eecs.umich.edu                if toInt:
7137639Sgblack@eecs.umich.edu                    eWalkCode += '''
7147639Sgblack@eecs.umich.edu                        destRegs.regs[%(reg)d] = FpDestP%(reg)d.bits;
7157639Sgblack@eecs.umich.edu                    ''' % { "reg" : reg }
7167639Sgblack@eecs.umich.edu                else:
7177639Sgblack@eecs.umich.edu                    eWalkCode += '''
7187639Sgblack@eecs.umich.edu                        destRegs[%(reg)d] = FpDestP%(reg)d;
7197639Sgblack@eecs.umich.edu                    ''' % { "reg" : reg }
7207639Sgblack@eecs.umich.edu        readDestCode = ''
7217639Sgblack@eecs.umich.edu        if readDest:
7227639Sgblack@eecs.umich.edu            readDestCode = 'destReg = destRegs[r];'
7237639Sgblack@eecs.umich.edu        destType = 'FloatReg'
7247639Sgblack@eecs.umich.edu        writeDest = 'destRegs[r] = destReg;'
7257639Sgblack@eecs.umich.edu        if toInt:
7267639Sgblack@eecs.umich.edu            destType = 'FloatRegBits'
7277639Sgblack@eecs.umich.edu            writeDest = 'destRegs.regs[r] = destReg;'
7287639Sgblack@eecs.umich.edu        if pairwise:
7297639Sgblack@eecs.umich.edu            eWalkCode += '''
7307639Sgblack@eecs.umich.edu            for (unsigned r = 0; r < rCount; r++) {
7317639Sgblack@eecs.umich.edu                FloatReg srcReg1 = (2 * r < rCount) ?
7327639Sgblack@eecs.umich.edu                    srcRegs1[2 * r] : srcRegs2[2 * r - rCount];
7337639Sgblack@eecs.umich.edu                FloatReg srcReg2 = (2 * r < rCount) ?
7347639Sgblack@eecs.umich.edu                    srcRegs1[2 * r + 1] : srcRegs2[2 * r + 1 - rCount];
7357639Sgblack@eecs.umich.edu                %(destType)s destReg;
7367639Sgblack@eecs.umich.edu                %(readDest)s
7377639Sgblack@eecs.umich.edu                %(op)s
7387639Sgblack@eecs.umich.edu                %(writeDest)s
7397639Sgblack@eecs.umich.edu            }
7407639Sgblack@eecs.umich.edu            ''' % { "op" : op,
7417639Sgblack@eecs.umich.edu                    "readDest" : readDestCode,
7427639Sgblack@eecs.umich.edu                    "destType" : destType,
7437639Sgblack@eecs.umich.edu                    "writeDest" : writeDest }
7447639Sgblack@eecs.umich.edu        else:
7457639Sgblack@eecs.umich.edu            eWalkCode += '''
7467639Sgblack@eecs.umich.edu            for (unsigned r = 0; r < rCount; r++) {
7477639Sgblack@eecs.umich.edu                FloatReg srcReg1 = srcRegs1[r];
7487639Sgblack@eecs.umich.edu                FloatReg srcReg2 = srcRegs2[r];
7497639Sgblack@eecs.umich.edu                %(destType)s destReg;
7507639Sgblack@eecs.umich.edu                %(readDest)s
7517639Sgblack@eecs.umich.edu                %(op)s
7527639Sgblack@eecs.umich.edu                %(writeDest)s
7537639Sgblack@eecs.umich.edu            }
7547639Sgblack@eecs.umich.edu            ''' % { "op" : op,
7557639Sgblack@eecs.umich.edu                    "readDest" : readDestCode,
7567639Sgblack@eecs.umich.edu                    "destType" : destType,
7577639Sgblack@eecs.umich.edu                    "writeDest" : writeDest }
7587639Sgblack@eecs.umich.edu        for reg in range(rCount):
7597639Sgblack@eecs.umich.edu            if toInt:
7607639Sgblack@eecs.umich.edu                eWalkCode += '''
7618588Sgblack@eecs.umich.edu                FpDestP%(reg)d_uw = destRegs.regs[%(reg)d];
7627639Sgblack@eecs.umich.edu                ''' % { "reg" : reg }
7637639Sgblack@eecs.umich.edu            else:
7647639Sgblack@eecs.umich.edu                eWalkCode += '''
7657639Sgblack@eecs.umich.edu                FpDestP%(reg)d = destRegs[%(reg)d];
7667639Sgblack@eecs.umich.edu                ''' % { "reg" : reg }
7677639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
7687639Sgblack@eecs.umich.edu                            "FpRegRegRegOp",
7697639Sgblack@eecs.umich.edu                            { "code": eWalkCode,
7707639Sgblack@eecs.umich.edu                              "r_count": rCount,
7717760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
7727760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
7737639Sgblack@eecs.umich.edu        header_output += NeonRegRegRegOpDeclare.subst(iop)
7747639Sgblack@eecs.umich.edu        exec_output += NeonEqualRegExecute.subst(iop)
7757639Sgblack@eecs.umich.edu        for type in types:
7767639Sgblack@eecs.umich.edu            substDict = { "targs" : type,
7777639Sgblack@eecs.umich.edu                          "class_name" : Name }
7787639Sgblack@eecs.umich.edu            exec_output += NeonExecDeclare.subst(substDict)
7797639Sgblack@eecs.umich.edu
7807760SGiacomo.Gabrielli@arm.com    def threeUnequalRegInst(name, Name, opClass, types, op,
7817639Sgblack@eecs.umich.edu                            bigSrc1, bigSrc2, bigDest, readDest):
7827639Sgblack@eecs.umich.edu        global header_output, exec_output
7837639Sgblack@eecs.umich.edu        src1Cnt = src2Cnt = destCnt = 2
7847639Sgblack@eecs.umich.edu        src1Prefix = src2Prefix = destPrefix = ''
7857639Sgblack@eecs.umich.edu        if bigSrc1:
7867639Sgblack@eecs.umich.edu            src1Cnt = 4
7877639Sgblack@eecs.umich.edu            src1Prefix = 'Big'
7887639Sgblack@eecs.umich.edu        if bigSrc2:
7897639Sgblack@eecs.umich.edu            src2Cnt = 4
7907639Sgblack@eecs.umich.edu            src2Prefix = 'Big'
7917639Sgblack@eecs.umich.edu        if bigDest:
7927639Sgblack@eecs.umich.edu            destCnt = 4
7937639Sgblack@eecs.umich.edu            destPrefix = 'Big'
7947640Sgblack@eecs.umich.edu        eWalkCode = simdEnabledCheckCode + '''
7957639Sgblack@eecs.umich.edu            %sRegVect srcReg1;
7967639Sgblack@eecs.umich.edu            %sRegVect srcReg2;
7977639Sgblack@eecs.umich.edu            %sRegVect destReg;
7987639Sgblack@eecs.umich.edu        ''' % (src1Prefix, src2Prefix, destPrefix)
7997639Sgblack@eecs.umich.edu        for reg in range(src1Cnt):
8007639Sgblack@eecs.umich.edu            eWalkCode += '''
8018588Sgblack@eecs.umich.edu                srcReg1.regs[%(reg)d] = htog(FpOp1P%(reg)d_uw);
8027639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
8037639Sgblack@eecs.umich.edu        for reg in range(src2Cnt):
8047639Sgblack@eecs.umich.edu            eWalkCode += '''
8058588Sgblack@eecs.umich.edu                srcReg2.regs[%(reg)d] = htog(FpOp2P%(reg)d_uw);
8067639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
8077639Sgblack@eecs.umich.edu        if readDest:
8087639Sgblack@eecs.umich.edu            for reg in range(destCnt):
8097639Sgblack@eecs.umich.edu                eWalkCode += '''
8108588Sgblack@eecs.umich.edu                    destReg.regs[%(reg)d] = htog(FpDestP%(reg)d_uw);
8117639Sgblack@eecs.umich.edu                ''' % { "reg" : reg }
8127639Sgblack@eecs.umich.edu        readDestCode = ''
8137639Sgblack@eecs.umich.edu        if readDest:
8147639Sgblack@eecs.umich.edu            readDestCode = 'destElem = gtoh(destReg.elements[i]);'
8157639Sgblack@eecs.umich.edu        eWalkCode += '''
8167639Sgblack@eecs.umich.edu        for (unsigned i = 0; i < eCount; i++) {
8177639Sgblack@eecs.umich.edu            %(src1Prefix)sElement srcElem1 = gtoh(srcReg1.elements[i]);
8187639Sgblack@eecs.umich.edu            %(src1Prefix)sElement srcElem2 = gtoh(srcReg2.elements[i]);
8197639Sgblack@eecs.umich.edu            %(destPrefix)sElement destElem;
8207639Sgblack@eecs.umich.edu            %(readDest)s
8217639Sgblack@eecs.umich.edu            %(op)s
8227639Sgblack@eecs.umich.edu            destReg.elements[i] = htog(destElem);
8237639Sgblack@eecs.umich.edu        }
8247639Sgblack@eecs.umich.edu        ''' % { "op" : op, "readDest" : readDestCode,
8257639Sgblack@eecs.umich.edu                "src1Prefix" : src1Prefix, "src2Prefix" : src2Prefix,
8267639Sgblack@eecs.umich.edu                "destPrefix" : destPrefix }
8277639Sgblack@eecs.umich.edu        for reg in range(destCnt):
8287639Sgblack@eecs.umich.edu            eWalkCode += '''
8298588Sgblack@eecs.umich.edu            FpDestP%(reg)d_uw = gtoh(destReg.regs[%(reg)d]);
8307639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
8317639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
8327639Sgblack@eecs.umich.edu                            "RegRegRegOp",
8337639Sgblack@eecs.umich.edu                            { "code": eWalkCode,
8347639Sgblack@eecs.umich.edu                              "r_count": 2,
8357760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
8367760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
8377639Sgblack@eecs.umich.edu        header_output += NeonRegRegRegOpDeclare.subst(iop)
8387639Sgblack@eecs.umich.edu        exec_output += NeonUnequalRegExecute.subst(iop)
8397639Sgblack@eecs.umich.edu        for type in types:
8407639Sgblack@eecs.umich.edu            substDict = { "targs" : type,
8417639Sgblack@eecs.umich.edu                          "class_name" : Name }
8427639Sgblack@eecs.umich.edu            exec_output += NeonExecDeclare.subst(substDict)
8437639Sgblack@eecs.umich.edu
8447760SGiacomo.Gabrielli@arm.com    def threeRegNarrowInst(name, Name, opClass, types, op, readDest=False):
8457760SGiacomo.Gabrielli@arm.com        threeUnequalRegInst(name, Name, opClass, types, op,
8467639Sgblack@eecs.umich.edu                            True, True, False, readDest)
8477639Sgblack@eecs.umich.edu
8487760SGiacomo.Gabrielli@arm.com    def threeRegLongInst(name, Name, opClass, types, op, readDest=False):
8497760SGiacomo.Gabrielli@arm.com        threeUnequalRegInst(name, Name, opClass, types, op,
8507639Sgblack@eecs.umich.edu                            False, False, True, readDest)
8517639Sgblack@eecs.umich.edu
8527760SGiacomo.Gabrielli@arm.com    def threeRegWideInst(name, Name, opClass, types, op, readDest=False):
8537760SGiacomo.Gabrielli@arm.com        threeUnequalRegInst(name, Name, opClass, types, op,
8547639Sgblack@eecs.umich.edu                            True, False, True, readDest)
8557639Sgblack@eecs.umich.edu
8567760SGiacomo.Gabrielli@arm.com    def twoEqualRegInst(name, Name, opClass, types, rCount, op, readDest=False):
8577639Sgblack@eecs.umich.edu        global header_output, exec_output
8587640Sgblack@eecs.umich.edu        eWalkCode = simdEnabledCheckCode + '''
8597639Sgblack@eecs.umich.edu        RegVect srcReg1, srcReg2, destReg;
8607639Sgblack@eecs.umich.edu        '''
8617639Sgblack@eecs.umich.edu        for reg in range(rCount):
8627639Sgblack@eecs.umich.edu            eWalkCode += '''
8638588Sgblack@eecs.umich.edu                srcReg1.regs[%(reg)d] = htog(FpOp1P%(reg)d_uw);
8648588Sgblack@eecs.umich.edu                srcReg2.regs[%(reg)d] = htog(FpOp2P%(reg)d_uw);
8657639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
8667639Sgblack@eecs.umich.edu            if readDest:
8677639Sgblack@eecs.umich.edu                eWalkCode += '''
8688588Sgblack@eecs.umich.edu                    destReg.regs[%(reg)d] = htog(FpDestP%(reg)d_uw);
8697639Sgblack@eecs.umich.edu                ''' % { "reg" : reg }
8707639Sgblack@eecs.umich.edu        readDestCode = ''
8717639Sgblack@eecs.umich.edu        if readDest:
8727639Sgblack@eecs.umich.edu            readDestCode = 'destElem = gtoh(destReg.elements[i]);'
8737639Sgblack@eecs.umich.edu        eWalkCode += '''
8747853SMatt.Horsnell@ARM.com        if (imm < 0 && imm >= eCount) {
8757853SMatt.Horsnell@ARM.com#if FULL_SYSTEM
8767853SMatt.Horsnell@ARM.com            fault = new UndefinedInstruction;
8777853SMatt.Horsnell@ARM.com#else
8787853SMatt.Horsnell@ARM.com            fault = new UndefinedInstruction(false, mnemonic);
8797853SMatt.Horsnell@ARM.com#endif
8807853SMatt.Horsnell@ARM.com        } else {
8817853SMatt.Horsnell@ARM.com            for (unsigned i = 0; i < eCount; i++) {
8827853SMatt.Horsnell@ARM.com                Element srcElem1 = gtoh(srcReg1.elements[i]);
8837853SMatt.Horsnell@ARM.com                Element srcElem2 = gtoh(srcReg2.elements[imm]);
8847853SMatt.Horsnell@ARM.com                Element destElem;
8857853SMatt.Horsnell@ARM.com                %(readDest)s
8867853SMatt.Horsnell@ARM.com                %(op)s
8877853SMatt.Horsnell@ARM.com                destReg.elements[i] = htog(destElem);
8887853SMatt.Horsnell@ARM.com            }
8897639Sgblack@eecs.umich.edu        }
8907639Sgblack@eecs.umich.edu        ''' % { "op" : op, "readDest" : readDestCode }
8917639Sgblack@eecs.umich.edu        for reg in range(rCount):
8927639Sgblack@eecs.umich.edu            eWalkCode += '''
8938588Sgblack@eecs.umich.edu            FpDestP%(reg)d_uw = gtoh(destReg.regs[%(reg)d]);
8947639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
8957639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
8967639Sgblack@eecs.umich.edu                            "RegRegRegImmOp",
8977639Sgblack@eecs.umich.edu                            { "code": eWalkCode,
8987639Sgblack@eecs.umich.edu                              "r_count": rCount,
8997760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
9007760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
9017639Sgblack@eecs.umich.edu        header_output += NeonRegRegRegImmOpDeclare.subst(iop)
9027639Sgblack@eecs.umich.edu        exec_output += NeonEqualRegExecute.subst(iop)
9037639Sgblack@eecs.umich.edu        for type in types:
9047639Sgblack@eecs.umich.edu            substDict = { "targs" : type,
9057639Sgblack@eecs.umich.edu                          "class_name" : Name }
9067639Sgblack@eecs.umich.edu            exec_output += NeonExecDeclare.subst(substDict)
9077639Sgblack@eecs.umich.edu
9087760SGiacomo.Gabrielli@arm.com    def twoRegLongInst(name, Name, opClass, types, op, readDest=False):
9097639Sgblack@eecs.umich.edu        global header_output, exec_output
9107639Sgblack@eecs.umich.edu        rCount = 2
9117640Sgblack@eecs.umich.edu        eWalkCode = simdEnabledCheckCode + '''
9127639Sgblack@eecs.umich.edu        RegVect srcReg1, srcReg2;
9137639Sgblack@eecs.umich.edu        BigRegVect destReg;
9147639Sgblack@eecs.umich.edu        '''
9157639Sgblack@eecs.umich.edu        for reg in range(rCount):
9167639Sgblack@eecs.umich.edu            eWalkCode += '''
9178588Sgblack@eecs.umich.edu                srcReg1.regs[%(reg)d] = htog(FpOp1P%(reg)d_uw);
9188588Sgblack@eecs.umich.edu                srcReg2.regs[%(reg)d] = htog(FpOp2P%(reg)d_uw);;
9197639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
9207639Sgblack@eecs.umich.edu        if readDest:
9217639Sgblack@eecs.umich.edu            for reg in range(2 * rCount):
9227639Sgblack@eecs.umich.edu                eWalkCode += '''
9238588Sgblack@eecs.umich.edu                    destReg.regs[%(reg)d] = htog(FpDestP%(reg)d_uw);
9247639Sgblack@eecs.umich.edu                ''' % { "reg" : reg }
9257639Sgblack@eecs.umich.edu        readDestCode = ''
9267639Sgblack@eecs.umich.edu        if readDest:
9277639Sgblack@eecs.umich.edu            readDestCode = 'destElem = gtoh(destReg.elements[i]);'
9287639Sgblack@eecs.umich.edu        eWalkCode += '''
9297853SMatt.Horsnell@ARM.com        if (imm < 0 && imm >= eCount) {
9307853SMatt.Horsnell@ARM.com#if FULL_SYSTEM
9317853SMatt.Horsnell@ARM.com            fault = new UndefinedInstruction;
9327853SMatt.Horsnell@ARM.com#else
9337853SMatt.Horsnell@ARM.com            fault = new UndefinedInstruction(false, mnemonic);
9347853SMatt.Horsnell@ARM.com#endif
9357853SMatt.Horsnell@ARM.com        } else {
9367853SMatt.Horsnell@ARM.com            for (unsigned i = 0; i < eCount; i++) {
9377853SMatt.Horsnell@ARM.com                Element srcElem1 = gtoh(srcReg1.elements[i]);
9387853SMatt.Horsnell@ARM.com                Element srcElem2 = gtoh(srcReg2.elements[imm]);
9397853SMatt.Horsnell@ARM.com                BigElement destElem;
9407853SMatt.Horsnell@ARM.com                %(readDest)s
9417853SMatt.Horsnell@ARM.com                %(op)s
9427853SMatt.Horsnell@ARM.com                destReg.elements[i] = htog(destElem);
9437853SMatt.Horsnell@ARM.com            }
9447639Sgblack@eecs.umich.edu        }
9457639Sgblack@eecs.umich.edu        ''' % { "op" : op, "readDest" : readDestCode }
9467639Sgblack@eecs.umich.edu        for reg in range(2 * rCount):
9477639Sgblack@eecs.umich.edu            eWalkCode += '''
9488588Sgblack@eecs.umich.edu            FpDestP%(reg)d_uw = gtoh(destReg.regs[%(reg)d]);
9497639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
9507639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
9517639Sgblack@eecs.umich.edu                            "RegRegRegImmOp",
9527639Sgblack@eecs.umich.edu                            { "code": eWalkCode,
9537639Sgblack@eecs.umich.edu                              "r_count": rCount,
9547760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
9557760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
9567639Sgblack@eecs.umich.edu        header_output += NeonRegRegRegImmOpDeclare.subst(iop)
9577639Sgblack@eecs.umich.edu        exec_output += NeonUnequalRegExecute.subst(iop)
9587639Sgblack@eecs.umich.edu        for type in types:
9597639Sgblack@eecs.umich.edu            substDict = { "targs" : type,
9607639Sgblack@eecs.umich.edu                          "class_name" : Name }
9617639Sgblack@eecs.umich.edu            exec_output += NeonExecDeclare.subst(substDict)
9627639Sgblack@eecs.umich.edu
9637760SGiacomo.Gabrielli@arm.com    def twoEqualRegInstFp(name, Name, opClass, types, rCount, op, readDest=False):
9647639Sgblack@eecs.umich.edu        global header_output, exec_output
9657640Sgblack@eecs.umich.edu        eWalkCode = simdEnabledCheckCode + '''
9667639Sgblack@eecs.umich.edu        typedef FloatReg FloatVect[rCount];
9677639Sgblack@eecs.umich.edu        FloatVect srcRegs1, srcRegs2, destRegs;
9687639Sgblack@eecs.umich.edu        '''
9697639Sgblack@eecs.umich.edu        for reg in range(rCount):
9707639Sgblack@eecs.umich.edu            eWalkCode += '''
9717639Sgblack@eecs.umich.edu                srcRegs1[%(reg)d] = FpOp1P%(reg)d;
9727639Sgblack@eecs.umich.edu                srcRegs2[%(reg)d] = FpOp2P%(reg)d;
9737639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
9747639Sgblack@eecs.umich.edu            if readDest:
9757639Sgblack@eecs.umich.edu                eWalkCode += '''
9767639Sgblack@eecs.umich.edu                    destRegs[%(reg)d] = FpDestP%(reg)d;
9777639Sgblack@eecs.umich.edu                ''' % { "reg" : reg }
9787639Sgblack@eecs.umich.edu        readDestCode = ''
9797639Sgblack@eecs.umich.edu        if readDest:
9807639Sgblack@eecs.umich.edu            readDestCode = 'destReg = destRegs[i];'
9817639Sgblack@eecs.umich.edu        eWalkCode += '''
9827853SMatt.Horsnell@ARM.com        if (imm < 0 && imm >= eCount) {
9837853SMatt.Horsnell@ARM.com#if FULL_SYSTEM
9847853SMatt.Horsnell@ARM.com            fault = new UndefinedInstruction;
9857853SMatt.Horsnell@ARM.com#else
9867853SMatt.Horsnell@ARM.com            fault = new UndefinedInstruction(false, mnemonic);
9877853SMatt.Horsnell@ARM.com#endif
9887853SMatt.Horsnell@ARM.com        } else {
9897853SMatt.Horsnell@ARM.com            for (unsigned i = 0; i < rCount; i++) {
9907853SMatt.Horsnell@ARM.com                FloatReg srcReg1 = srcRegs1[i];
9917853SMatt.Horsnell@ARM.com                FloatReg srcReg2 = srcRegs2[imm];
9927853SMatt.Horsnell@ARM.com                FloatReg destReg;
9937853SMatt.Horsnell@ARM.com                %(readDest)s
9947853SMatt.Horsnell@ARM.com                %(op)s
9957853SMatt.Horsnell@ARM.com                destRegs[i] = destReg;
9967853SMatt.Horsnell@ARM.com            }
9977639Sgblack@eecs.umich.edu        }
9987639Sgblack@eecs.umich.edu        ''' % { "op" : op, "readDest" : readDestCode }
9997639Sgblack@eecs.umich.edu        for reg in range(rCount):
10007639Sgblack@eecs.umich.edu            eWalkCode += '''
10017639Sgblack@eecs.umich.edu            FpDestP%(reg)d = destRegs[%(reg)d];
10027639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
10037639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
10047639Sgblack@eecs.umich.edu                            "FpRegRegRegImmOp",
10057639Sgblack@eecs.umich.edu                            { "code": eWalkCode,
10067639Sgblack@eecs.umich.edu                              "r_count": rCount,
10077760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
10087760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
10097639Sgblack@eecs.umich.edu        header_output += NeonRegRegRegImmOpDeclare.subst(iop)
10107639Sgblack@eecs.umich.edu        exec_output += NeonEqualRegExecute.subst(iop)
10117639Sgblack@eecs.umich.edu        for type in types:
10127639Sgblack@eecs.umich.edu            substDict = { "targs" : type,
10137639Sgblack@eecs.umich.edu                          "class_name" : Name }
10147639Sgblack@eecs.umich.edu            exec_output += NeonExecDeclare.subst(substDict)
10157639Sgblack@eecs.umich.edu
10167760SGiacomo.Gabrielli@arm.com    def twoRegShiftInst(name, Name, opClass, types, rCount, op,
10177639Sgblack@eecs.umich.edu            readDest=False, toInt=False, fromInt=False):
10187639Sgblack@eecs.umich.edu        global header_output, exec_output
10197640Sgblack@eecs.umich.edu        eWalkCode = simdEnabledCheckCode + '''
10207639Sgblack@eecs.umich.edu        RegVect srcRegs1, destRegs;
10217639Sgblack@eecs.umich.edu        '''
10227639Sgblack@eecs.umich.edu        for reg in range(rCount):
10237639Sgblack@eecs.umich.edu            eWalkCode += '''
10248588Sgblack@eecs.umich.edu                srcRegs1.regs[%(reg)d] = htog(FpOp1P%(reg)d_uw);
10257639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
10267639Sgblack@eecs.umich.edu            if readDest:
10277639Sgblack@eecs.umich.edu                eWalkCode += '''
10288588Sgblack@eecs.umich.edu                    destRegs.regs[%(reg)d] = htog(FpDestP%(reg)d_uw);
10297639Sgblack@eecs.umich.edu                ''' % { "reg" : reg }
10307639Sgblack@eecs.umich.edu        readDestCode = ''
10317639Sgblack@eecs.umich.edu        if readDest:
10327639Sgblack@eecs.umich.edu            readDestCode = 'destElem = gtoh(destRegs.elements[i]);'
10337639Sgblack@eecs.umich.edu            if toInt:
10347639Sgblack@eecs.umich.edu                readDestCode = 'destReg = gtoh(destRegs.regs[i]);'
10357639Sgblack@eecs.umich.edu        readOpCode = 'Element srcElem1 = gtoh(srcRegs1.elements[i]);'
10367639Sgblack@eecs.umich.edu        if fromInt:
10377639Sgblack@eecs.umich.edu            readOpCode = 'FloatRegBits srcReg1 = gtoh(srcRegs1.regs[i]);'
10387639Sgblack@eecs.umich.edu        declDest = 'Element destElem;'
10397639Sgblack@eecs.umich.edu        writeDestCode = 'destRegs.elements[i] = htog(destElem);'
10407639Sgblack@eecs.umich.edu        if toInt:
10417639Sgblack@eecs.umich.edu            declDest = 'FloatRegBits destReg;'
10427639Sgblack@eecs.umich.edu            writeDestCode = 'destRegs.regs[i] = htog(destReg);'
10437639Sgblack@eecs.umich.edu        eWalkCode += '''
10447639Sgblack@eecs.umich.edu        for (unsigned i = 0; i < eCount; i++) {
10457639Sgblack@eecs.umich.edu            %(readOp)s
10467639Sgblack@eecs.umich.edu            %(declDest)s
10477639Sgblack@eecs.umich.edu            %(readDest)s
10487639Sgblack@eecs.umich.edu            %(op)s
10497639Sgblack@eecs.umich.edu            %(writeDest)s
10507639Sgblack@eecs.umich.edu        }
10517639Sgblack@eecs.umich.edu        ''' % { "readOp" : readOpCode,
10527639Sgblack@eecs.umich.edu                "declDest" : declDest,
10537639Sgblack@eecs.umich.edu                "readDest" : readDestCode,
10547639Sgblack@eecs.umich.edu                "op" : op,
10557639Sgblack@eecs.umich.edu                "writeDest" : writeDestCode }
10567639Sgblack@eecs.umich.edu        for reg in range(rCount):
10577639Sgblack@eecs.umich.edu            eWalkCode += '''
10588588Sgblack@eecs.umich.edu            FpDestP%(reg)d_uw = gtoh(destRegs.regs[%(reg)d]);
10597639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
10607639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
10617639Sgblack@eecs.umich.edu                            "RegRegImmOp",
10627639Sgblack@eecs.umich.edu                            { "code": eWalkCode,
10637639Sgblack@eecs.umich.edu                              "r_count": rCount,
10647760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
10657760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
10667639Sgblack@eecs.umich.edu        header_output += NeonRegRegImmOpDeclare.subst(iop)
10677639Sgblack@eecs.umich.edu        exec_output += NeonEqualRegExecute.subst(iop)
10687639Sgblack@eecs.umich.edu        for type in types:
10697639Sgblack@eecs.umich.edu            substDict = { "targs" : type,
10707639Sgblack@eecs.umich.edu                          "class_name" : Name }
10717639Sgblack@eecs.umich.edu            exec_output += NeonExecDeclare.subst(substDict)
10727639Sgblack@eecs.umich.edu
10737760SGiacomo.Gabrielli@arm.com    def twoRegNarrowShiftInst(name, Name, opClass, types, op, readDest=False):
10747639Sgblack@eecs.umich.edu        global header_output, exec_output
10757640Sgblack@eecs.umich.edu        eWalkCode = simdEnabledCheckCode + '''
10767639Sgblack@eecs.umich.edu        BigRegVect srcReg1;
10777639Sgblack@eecs.umich.edu        RegVect destReg;
10787639Sgblack@eecs.umich.edu        '''
10797639Sgblack@eecs.umich.edu        for reg in range(4):
10807639Sgblack@eecs.umich.edu            eWalkCode += '''
10818588Sgblack@eecs.umich.edu                srcReg1.regs[%(reg)d] = htog(FpOp1P%(reg)d_uw);
10827639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
10837639Sgblack@eecs.umich.edu        if readDest:
10847639Sgblack@eecs.umich.edu            for reg in range(2):
10857639Sgblack@eecs.umich.edu                eWalkCode += '''
10868588Sgblack@eecs.umich.edu                    destReg.regs[%(reg)d] = htog(FpDestP%(reg)d_uw);
10877639Sgblack@eecs.umich.edu                ''' % { "reg" : reg }
10887639Sgblack@eecs.umich.edu        readDestCode = ''
10897639Sgblack@eecs.umich.edu        if readDest:
10907639Sgblack@eecs.umich.edu            readDestCode = 'destElem = gtoh(destReg.elements[i]);'
10917639Sgblack@eecs.umich.edu        eWalkCode += '''
10927639Sgblack@eecs.umich.edu        for (unsigned i = 0; i < eCount; i++) {
10937639Sgblack@eecs.umich.edu            BigElement srcElem1 = gtoh(srcReg1.elements[i]);
10947639Sgblack@eecs.umich.edu            Element destElem;
10957639Sgblack@eecs.umich.edu            %(readDest)s
10967639Sgblack@eecs.umich.edu            %(op)s
10977639Sgblack@eecs.umich.edu            destReg.elements[i] = htog(destElem);
10987639Sgblack@eecs.umich.edu        }
10997639Sgblack@eecs.umich.edu        ''' % { "op" : op, "readDest" : readDestCode }
11007639Sgblack@eecs.umich.edu        for reg in range(2):
11017639Sgblack@eecs.umich.edu            eWalkCode += '''
11028588Sgblack@eecs.umich.edu            FpDestP%(reg)d_uw = gtoh(destReg.regs[%(reg)d]);
11037639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
11047639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
11057639Sgblack@eecs.umich.edu                            "RegRegImmOp",
11067639Sgblack@eecs.umich.edu                            { "code": eWalkCode,
11077639Sgblack@eecs.umich.edu                              "r_count": 2,
11087760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
11097760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
11107639Sgblack@eecs.umich.edu        header_output += NeonRegRegImmOpDeclare.subst(iop)
11117639Sgblack@eecs.umich.edu        exec_output += NeonUnequalRegExecute.subst(iop)
11127639Sgblack@eecs.umich.edu        for type in types:
11137639Sgblack@eecs.umich.edu            substDict = { "targs" : type,
11147639Sgblack@eecs.umich.edu                          "class_name" : Name }
11157639Sgblack@eecs.umich.edu            exec_output += NeonExecDeclare.subst(substDict)
11167639Sgblack@eecs.umich.edu
11177760SGiacomo.Gabrielli@arm.com    def twoRegLongShiftInst(name, Name, opClass, types, op, readDest=False):
11187639Sgblack@eecs.umich.edu        global header_output, exec_output
11197640Sgblack@eecs.umich.edu        eWalkCode = simdEnabledCheckCode + '''
11207639Sgblack@eecs.umich.edu        RegVect srcReg1;
11217639Sgblack@eecs.umich.edu        BigRegVect destReg;
11227639Sgblack@eecs.umich.edu        '''
11237639Sgblack@eecs.umich.edu        for reg in range(2):
11247639Sgblack@eecs.umich.edu            eWalkCode += '''
11258588Sgblack@eecs.umich.edu                srcReg1.regs[%(reg)d] = htog(FpOp1P%(reg)d_uw);
11267639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
11277639Sgblack@eecs.umich.edu        if readDest:
11287639Sgblack@eecs.umich.edu            for reg in range(4):
11297639Sgblack@eecs.umich.edu                eWalkCode += '''
11308588Sgblack@eecs.umich.edu                    destReg.regs[%(reg)d] = htog(FpDestP%(reg)d_uw);
11317639Sgblack@eecs.umich.edu                ''' % { "reg" : reg }
11327639Sgblack@eecs.umich.edu        readDestCode = ''
11337639Sgblack@eecs.umich.edu        if readDest:
11347639Sgblack@eecs.umich.edu            readDestCode = 'destReg = gtoh(destReg.elements[i]);'
11357639Sgblack@eecs.umich.edu        eWalkCode += '''
11367639Sgblack@eecs.umich.edu        for (unsigned i = 0; i < eCount; i++) {
11377639Sgblack@eecs.umich.edu            Element srcElem1 = gtoh(srcReg1.elements[i]);
11387639Sgblack@eecs.umich.edu            BigElement destElem;
11397639Sgblack@eecs.umich.edu            %(readDest)s
11407639Sgblack@eecs.umich.edu            %(op)s
11417639Sgblack@eecs.umich.edu            destReg.elements[i] = htog(destElem);
11427639Sgblack@eecs.umich.edu        }
11437639Sgblack@eecs.umich.edu        ''' % { "op" : op, "readDest" : readDestCode }
11447639Sgblack@eecs.umich.edu        for reg in range(4):
11457639Sgblack@eecs.umich.edu            eWalkCode += '''
11468588Sgblack@eecs.umich.edu            FpDestP%(reg)d_uw = gtoh(destReg.regs[%(reg)d]);
11477639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
11487639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
11497639Sgblack@eecs.umich.edu                            "RegRegImmOp",
11507639Sgblack@eecs.umich.edu                            { "code": eWalkCode,
11517639Sgblack@eecs.umich.edu                              "r_count": 2,
11527760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
11537760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
11547639Sgblack@eecs.umich.edu        header_output += NeonRegRegImmOpDeclare.subst(iop)
11557639Sgblack@eecs.umich.edu        exec_output += NeonUnequalRegExecute.subst(iop)
11567639Sgblack@eecs.umich.edu        for type in types:
11577639Sgblack@eecs.umich.edu            substDict = { "targs" : type,
11587639Sgblack@eecs.umich.edu                          "class_name" : Name }
11597639Sgblack@eecs.umich.edu            exec_output += NeonExecDeclare.subst(substDict)
11607639Sgblack@eecs.umich.edu
11617760SGiacomo.Gabrielli@arm.com    def twoRegMiscInst(name, Name, opClass, types, rCount, op, readDest=False):
11627639Sgblack@eecs.umich.edu        global header_output, exec_output
11637640Sgblack@eecs.umich.edu        eWalkCode = simdEnabledCheckCode + '''
11647639Sgblack@eecs.umich.edu        RegVect srcReg1, destReg;
11657639Sgblack@eecs.umich.edu        '''
11667639Sgblack@eecs.umich.edu        for reg in range(rCount):
11677639Sgblack@eecs.umich.edu            eWalkCode += '''
11688588Sgblack@eecs.umich.edu                srcReg1.regs[%(reg)d] = htog(FpOp1P%(reg)d_uw);
11697639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
11707639Sgblack@eecs.umich.edu            if readDest:
11717639Sgblack@eecs.umich.edu                eWalkCode += '''
11728588Sgblack@eecs.umich.edu                    destReg.regs[%(reg)d] = htog(FpDestP%(reg)d_uw);
11737639Sgblack@eecs.umich.edu                ''' % { "reg" : reg }
11747639Sgblack@eecs.umich.edu        readDestCode = ''
11757639Sgblack@eecs.umich.edu        if readDest:
11767639Sgblack@eecs.umich.edu            readDestCode = 'destElem = gtoh(destReg.elements[i]);'
11777639Sgblack@eecs.umich.edu        eWalkCode += '''
11787639Sgblack@eecs.umich.edu        for (unsigned i = 0; i < eCount; i++) {
11797639Sgblack@eecs.umich.edu            unsigned j = i;
11807639Sgblack@eecs.umich.edu            Element srcElem1 = gtoh(srcReg1.elements[i]);
11817639Sgblack@eecs.umich.edu            Element destElem;
11827639Sgblack@eecs.umich.edu            %(readDest)s
11837639Sgblack@eecs.umich.edu            %(op)s
11847639Sgblack@eecs.umich.edu            destReg.elements[j] = htog(destElem);
11857639Sgblack@eecs.umich.edu        }
11867639Sgblack@eecs.umich.edu        ''' % { "op" : op, "readDest" : readDestCode }
11877639Sgblack@eecs.umich.edu        for reg in range(rCount):
11887639Sgblack@eecs.umich.edu            eWalkCode += '''
11898588Sgblack@eecs.umich.edu            FpDestP%(reg)d_uw = gtoh(destReg.regs[%(reg)d]);
11907639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
11917639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
11927639Sgblack@eecs.umich.edu                            "RegRegOp",
11937639Sgblack@eecs.umich.edu                            { "code": eWalkCode,
11947639Sgblack@eecs.umich.edu                              "r_count": rCount,
11957760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
11967760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
11977639Sgblack@eecs.umich.edu        header_output += NeonRegRegOpDeclare.subst(iop)
11987639Sgblack@eecs.umich.edu        exec_output += NeonEqualRegExecute.subst(iop)
11997639Sgblack@eecs.umich.edu        for type in types:
12007639Sgblack@eecs.umich.edu            substDict = { "targs" : type,
12017639Sgblack@eecs.umich.edu                          "class_name" : Name }
12027639Sgblack@eecs.umich.edu            exec_output += NeonExecDeclare.subst(substDict)
12037639Sgblack@eecs.umich.edu
12047760SGiacomo.Gabrielli@arm.com    def twoRegMiscScInst(name, Name, opClass, types, rCount, op, readDest=False):
12057639Sgblack@eecs.umich.edu        global header_output, exec_output
12067640Sgblack@eecs.umich.edu        eWalkCode = simdEnabledCheckCode + '''
12077639Sgblack@eecs.umich.edu        RegVect srcReg1, destReg;
12087639Sgblack@eecs.umich.edu        '''
12097639Sgblack@eecs.umich.edu        for reg in range(rCount):
12107639Sgblack@eecs.umich.edu            eWalkCode += '''
12118588Sgblack@eecs.umich.edu                srcReg1.regs[%(reg)d] = htog(FpOp1P%(reg)d_uw);
12127639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
12137639Sgblack@eecs.umich.edu            if readDest:
12147639Sgblack@eecs.umich.edu                eWalkCode += '''
12158588Sgblack@eecs.umich.edu                    destReg.regs[%(reg)d] = htog(FpDestP%(reg)d_uw);
12167639Sgblack@eecs.umich.edu                ''' % { "reg" : reg }
12177639Sgblack@eecs.umich.edu        readDestCode = ''
12187639Sgblack@eecs.umich.edu        if readDest:
12197639Sgblack@eecs.umich.edu            readDestCode = 'destElem = gtoh(destReg.elements[i]);'
12207639Sgblack@eecs.umich.edu        eWalkCode += '''
12217639Sgblack@eecs.umich.edu        for (unsigned i = 0; i < eCount; i++) {
12227639Sgblack@eecs.umich.edu            Element srcElem1 = gtoh(srcReg1.elements[imm]);
12237639Sgblack@eecs.umich.edu            Element destElem;
12247639Sgblack@eecs.umich.edu            %(readDest)s
12257639Sgblack@eecs.umich.edu            %(op)s
12267639Sgblack@eecs.umich.edu            destReg.elements[i] = htog(destElem);
12277639Sgblack@eecs.umich.edu        }
12287639Sgblack@eecs.umich.edu        ''' % { "op" : op, "readDest" : readDestCode }
12297639Sgblack@eecs.umich.edu        for reg in range(rCount):
12307639Sgblack@eecs.umich.edu            eWalkCode += '''
12318588Sgblack@eecs.umich.edu            FpDestP%(reg)d_uw = gtoh(destReg.regs[%(reg)d]);
12327639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
12337639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
12347639Sgblack@eecs.umich.edu                            "RegRegImmOp",
12357639Sgblack@eecs.umich.edu                            { "code": eWalkCode,
12367639Sgblack@eecs.umich.edu                              "r_count": rCount,
12377760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
12387760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
12397639Sgblack@eecs.umich.edu        header_output += NeonRegRegImmOpDeclare.subst(iop)
12407639Sgblack@eecs.umich.edu        exec_output += NeonEqualRegExecute.subst(iop)
12417639Sgblack@eecs.umich.edu        for type in types:
12427639Sgblack@eecs.umich.edu            substDict = { "targs" : type,
12437639Sgblack@eecs.umich.edu                          "class_name" : Name }
12447639Sgblack@eecs.umich.edu            exec_output += NeonExecDeclare.subst(substDict)
12457639Sgblack@eecs.umich.edu
12467760SGiacomo.Gabrielli@arm.com    def twoRegMiscScramble(name, Name, opClass, types, rCount, op, readDest=False):
12477639Sgblack@eecs.umich.edu        global header_output, exec_output
12487640Sgblack@eecs.umich.edu        eWalkCode = simdEnabledCheckCode + '''
12497639Sgblack@eecs.umich.edu        RegVect srcReg1, destReg;
12507639Sgblack@eecs.umich.edu        '''
12517639Sgblack@eecs.umich.edu        for reg in range(rCount):
12527639Sgblack@eecs.umich.edu            eWalkCode += '''
12538588Sgblack@eecs.umich.edu                srcReg1.regs[%(reg)d] = htog(FpOp1P%(reg)d_uw);
12548588Sgblack@eecs.umich.edu                destReg.regs[%(reg)d] = htog(FpDestP%(reg)d_uw);
12557639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
12567639Sgblack@eecs.umich.edu            if readDest:
12577639Sgblack@eecs.umich.edu                eWalkCode += '''
12587639Sgblack@eecs.umich.edu                ''' % { "reg" : reg }
12597639Sgblack@eecs.umich.edu        readDestCode = ''
12607639Sgblack@eecs.umich.edu        if readDest:
12617639Sgblack@eecs.umich.edu            readDestCode = 'destElem = gtoh(destReg.elements[i]);'
12627639Sgblack@eecs.umich.edu        eWalkCode += op
12637639Sgblack@eecs.umich.edu        for reg in range(rCount):
12647639Sgblack@eecs.umich.edu            eWalkCode += '''
12658588Sgblack@eecs.umich.edu            FpDestP%(reg)d_uw = gtoh(destReg.regs[%(reg)d]);
12668588Sgblack@eecs.umich.edu            FpOp1P%(reg)d_uw = gtoh(srcReg1.regs[%(reg)d]);
12677639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
12687639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
12697639Sgblack@eecs.umich.edu                            "RegRegOp",
12707639Sgblack@eecs.umich.edu                            { "code": eWalkCode,
12717639Sgblack@eecs.umich.edu                              "r_count": rCount,
12727760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
12737760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
12747639Sgblack@eecs.umich.edu        header_output += NeonRegRegOpDeclare.subst(iop)
12757639Sgblack@eecs.umich.edu        exec_output += NeonEqualRegExecute.subst(iop)
12767639Sgblack@eecs.umich.edu        for type in types:
12777639Sgblack@eecs.umich.edu            substDict = { "targs" : type,
12787639Sgblack@eecs.umich.edu                          "class_name" : Name }
12797639Sgblack@eecs.umich.edu            exec_output += NeonExecDeclare.subst(substDict)
12807639Sgblack@eecs.umich.edu
12817760SGiacomo.Gabrielli@arm.com    def twoRegMiscInstFp(name, Name, opClass, types, rCount, op,
12827639Sgblack@eecs.umich.edu            readDest=False, toInt=False):
12837639Sgblack@eecs.umich.edu        global header_output, exec_output
12847640Sgblack@eecs.umich.edu        eWalkCode = simdEnabledCheckCode + '''
12857639Sgblack@eecs.umich.edu        typedef FloatReg FloatVect[rCount];
12867639Sgblack@eecs.umich.edu        FloatVect srcRegs1;
12877639Sgblack@eecs.umich.edu        '''
12887639Sgblack@eecs.umich.edu        if toInt:
12897639Sgblack@eecs.umich.edu            eWalkCode += 'RegVect destRegs;\n'
12907639Sgblack@eecs.umich.edu        else:
12917639Sgblack@eecs.umich.edu            eWalkCode += 'FloatVect destRegs;\n'
12927639Sgblack@eecs.umich.edu        for reg in range(rCount):
12937639Sgblack@eecs.umich.edu            eWalkCode += '''
12947639Sgblack@eecs.umich.edu                srcRegs1[%(reg)d] = FpOp1P%(reg)d;
12957639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
12967639Sgblack@eecs.umich.edu            if readDest:
12977639Sgblack@eecs.umich.edu                if toInt:
12987639Sgblack@eecs.umich.edu                    eWalkCode += '''
12997639Sgblack@eecs.umich.edu                        destRegs.regs[%(reg)d] = FpDestP%(reg)d.bits;
13007639Sgblack@eecs.umich.edu                    ''' % { "reg" : reg }
13017639Sgblack@eecs.umich.edu                else:
13027639Sgblack@eecs.umich.edu                    eWalkCode += '''
13037639Sgblack@eecs.umich.edu                        destRegs[%(reg)d] = FpDestP%(reg)d;
13047639Sgblack@eecs.umich.edu                    ''' % { "reg" : reg }
13057639Sgblack@eecs.umich.edu        readDestCode = ''
13067639Sgblack@eecs.umich.edu        if readDest:
13077639Sgblack@eecs.umich.edu            readDestCode = 'destReg = destRegs[i];'
13087639Sgblack@eecs.umich.edu        destType = 'FloatReg'
13097639Sgblack@eecs.umich.edu        writeDest = 'destRegs[r] = destReg;'
13107639Sgblack@eecs.umich.edu        if toInt:
13117639Sgblack@eecs.umich.edu            destType = 'FloatRegBits'
13127639Sgblack@eecs.umich.edu            writeDest = 'destRegs.regs[r] = destReg;'
13137639Sgblack@eecs.umich.edu        eWalkCode += '''
13147639Sgblack@eecs.umich.edu        for (unsigned r = 0; r < rCount; r++) {
13157639Sgblack@eecs.umich.edu            FloatReg srcReg1 = srcRegs1[r];
13167639Sgblack@eecs.umich.edu            %(destType)s destReg;
13177639Sgblack@eecs.umich.edu            %(readDest)s
13187639Sgblack@eecs.umich.edu            %(op)s
13197639Sgblack@eecs.umich.edu            %(writeDest)s
13207639Sgblack@eecs.umich.edu        }
13217639Sgblack@eecs.umich.edu        ''' % { "op" : op,
13227639Sgblack@eecs.umich.edu                "readDest" : readDestCode,
13237639Sgblack@eecs.umich.edu                "destType" : destType,
13247639Sgblack@eecs.umich.edu                "writeDest" : writeDest }
13257639Sgblack@eecs.umich.edu        for reg in range(rCount):
13267639Sgblack@eecs.umich.edu            if toInt:
13277639Sgblack@eecs.umich.edu                eWalkCode += '''
13288588Sgblack@eecs.umich.edu                FpDestP%(reg)d_uw = destRegs.regs[%(reg)d];
13297639Sgblack@eecs.umich.edu                ''' % { "reg" : reg }
13307639Sgblack@eecs.umich.edu            else:
13317639Sgblack@eecs.umich.edu                eWalkCode += '''
13327639Sgblack@eecs.umich.edu                FpDestP%(reg)d = destRegs[%(reg)d];
13337639Sgblack@eecs.umich.edu                ''' % { "reg" : reg }
13347639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
13357639Sgblack@eecs.umich.edu                            "FpRegRegOp",
13367639Sgblack@eecs.umich.edu                            { "code": eWalkCode,
13377639Sgblack@eecs.umich.edu                              "r_count": rCount,
13387760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
13397760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
13407639Sgblack@eecs.umich.edu        header_output += NeonRegRegOpDeclare.subst(iop)
13417639Sgblack@eecs.umich.edu        exec_output += NeonEqualRegExecute.subst(iop)
13427639Sgblack@eecs.umich.edu        for type in types:
13437639Sgblack@eecs.umich.edu            substDict = { "targs" : type,
13447639Sgblack@eecs.umich.edu                          "class_name" : Name }
13457639Sgblack@eecs.umich.edu            exec_output += NeonExecDeclare.subst(substDict)
13467639Sgblack@eecs.umich.edu
13477760SGiacomo.Gabrielli@arm.com    def twoRegCondenseInst(name, Name, opClass, types, rCount, op, readDest=False):
13487639Sgblack@eecs.umich.edu        global header_output, exec_output
13497640Sgblack@eecs.umich.edu        eWalkCode = simdEnabledCheckCode + '''
13507639Sgblack@eecs.umich.edu        RegVect srcRegs;
13517639Sgblack@eecs.umich.edu        BigRegVect destReg;
13527639Sgblack@eecs.umich.edu        '''
13537639Sgblack@eecs.umich.edu        for reg in range(rCount):
13547639Sgblack@eecs.umich.edu            eWalkCode += '''
13558588Sgblack@eecs.umich.edu                srcRegs.regs[%(reg)d] = htog(FpOp1P%(reg)d_uw);
13567639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
13577639Sgblack@eecs.umich.edu            if readDest:
13587639Sgblack@eecs.umich.edu                eWalkCode += '''
13598588Sgblack@eecs.umich.edu                    destReg.regs[%(reg)d] = htog(FpDestP%(reg)d_uw);
13607639Sgblack@eecs.umich.edu                ''' % { "reg" : reg }
13617639Sgblack@eecs.umich.edu        readDestCode = ''
13627639Sgblack@eecs.umich.edu        if readDest:
13637639Sgblack@eecs.umich.edu            readDestCode = 'destElem = gtoh(destReg.elements[i]);'
13647639Sgblack@eecs.umich.edu        eWalkCode += '''
13657639Sgblack@eecs.umich.edu        for (unsigned i = 0; i < eCount / 2; i++) {
13667639Sgblack@eecs.umich.edu            Element srcElem1 = gtoh(srcRegs.elements[2 * i]);
13677639Sgblack@eecs.umich.edu            Element srcElem2 = gtoh(srcRegs.elements[2 * i + 1]);
13687639Sgblack@eecs.umich.edu            BigElement destElem;
13697639Sgblack@eecs.umich.edu            %(readDest)s
13707639Sgblack@eecs.umich.edu            %(op)s
13717639Sgblack@eecs.umich.edu            destReg.elements[i] = htog(destElem);
13727639Sgblack@eecs.umich.edu        }
13737639Sgblack@eecs.umich.edu        ''' % { "op" : op, "readDest" : readDestCode }
13747639Sgblack@eecs.umich.edu        for reg in range(rCount):
13757639Sgblack@eecs.umich.edu            eWalkCode += '''
13768588Sgblack@eecs.umich.edu            FpDestP%(reg)d_uw = gtoh(destReg.regs[%(reg)d]);
13777639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
13787639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
13797639Sgblack@eecs.umich.edu                            "RegRegOp",
13807639Sgblack@eecs.umich.edu                            { "code": eWalkCode,
13817639Sgblack@eecs.umich.edu                              "r_count": rCount,
13827760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
13837760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
13847639Sgblack@eecs.umich.edu        header_output += NeonRegRegOpDeclare.subst(iop)
13857639Sgblack@eecs.umich.edu        exec_output += NeonUnequalRegExecute.subst(iop)
13867639Sgblack@eecs.umich.edu        for type in types:
13877639Sgblack@eecs.umich.edu            substDict = { "targs" : type,
13887639Sgblack@eecs.umich.edu                          "class_name" : Name }
13897639Sgblack@eecs.umich.edu            exec_output += NeonExecDeclare.subst(substDict)
13907639Sgblack@eecs.umich.edu
13917760SGiacomo.Gabrielli@arm.com    def twoRegNarrowMiscInst(name, Name, opClass, types, op, readDest=False):
13927639Sgblack@eecs.umich.edu        global header_output, exec_output
13937640Sgblack@eecs.umich.edu        eWalkCode = simdEnabledCheckCode + '''
13947639Sgblack@eecs.umich.edu        BigRegVect srcReg1;
13957639Sgblack@eecs.umich.edu        RegVect destReg;
13967639Sgblack@eecs.umich.edu        '''
13977639Sgblack@eecs.umich.edu        for reg in range(4):
13987639Sgblack@eecs.umich.edu            eWalkCode += '''
13998588Sgblack@eecs.umich.edu                srcReg1.regs[%(reg)d] = htog(FpOp1P%(reg)d_uw);
14007639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
14017639Sgblack@eecs.umich.edu        if readDest:
14027639Sgblack@eecs.umich.edu            for reg in range(2):
14037639Sgblack@eecs.umich.edu                eWalkCode += '''
14048588Sgblack@eecs.umich.edu                    destReg.regs[%(reg)d] = htog(FpDestP%(reg)d_uw);
14057639Sgblack@eecs.umich.edu                ''' % { "reg" : reg }
14067639Sgblack@eecs.umich.edu        readDestCode = ''
14077639Sgblack@eecs.umich.edu        if readDest:
14087639Sgblack@eecs.umich.edu            readDestCode = 'destElem = gtoh(destReg.elements[i]);'
14097639Sgblack@eecs.umich.edu        eWalkCode += '''
14107639Sgblack@eecs.umich.edu        for (unsigned i = 0; i < eCount; i++) {
14117639Sgblack@eecs.umich.edu            BigElement srcElem1 = gtoh(srcReg1.elements[i]);
14127639Sgblack@eecs.umich.edu            Element destElem;
14137639Sgblack@eecs.umich.edu            %(readDest)s
14147639Sgblack@eecs.umich.edu            %(op)s
14157639Sgblack@eecs.umich.edu            destReg.elements[i] = htog(destElem);
14167639Sgblack@eecs.umich.edu        }
14177639Sgblack@eecs.umich.edu        ''' % { "op" : op, "readDest" : readDestCode }
14187639Sgblack@eecs.umich.edu        for reg in range(2):
14197639Sgblack@eecs.umich.edu            eWalkCode += '''
14208588Sgblack@eecs.umich.edu            FpDestP%(reg)d_uw = gtoh(destReg.regs[%(reg)d]);
14217639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
14227639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
14237639Sgblack@eecs.umich.edu                            "RegRegOp",
14247639Sgblack@eecs.umich.edu                            { "code": eWalkCode,
14257639Sgblack@eecs.umich.edu                              "r_count": 2,
14267760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
14277760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
14287639Sgblack@eecs.umich.edu        header_output += NeonRegRegOpDeclare.subst(iop)
14297639Sgblack@eecs.umich.edu        exec_output += NeonUnequalRegExecute.subst(iop)
14307639Sgblack@eecs.umich.edu        for type in types:
14317639Sgblack@eecs.umich.edu            substDict = { "targs" : type,
14327639Sgblack@eecs.umich.edu                          "class_name" : Name }
14337639Sgblack@eecs.umich.edu            exec_output += NeonExecDeclare.subst(substDict)
14347639Sgblack@eecs.umich.edu
14357760SGiacomo.Gabrielli@arm.com    def oneRegImmInst(name, Name, opClass, types, rCount, op, readDest=False):
14367639Sgblack@eecs.umich.edu        global header_output, exec_output
14377640Sgblack@eecs.umich.edu        eWalkCode = simdEnabledCheckCode + '''
14387639Sgblack@eecs.umich.edu        RegVect destReg;
14397639Sgblack@eecs.umich.edu        '''
14407639Sgblack@eecs.umich.edu        if readDest:
14417639Sgblack@eecs.umich.edu            for reg in range(rCount):
14427639Sgblack@eecs.umich.edu                eWalkCode += '''
14438588Sgblack@eecs.umich.edu                    destReg.regs[%(reg)d] = htog(FpDestP%(reg)d_uw);
14447639Sgblack@eecs.umich.edu                ''' % { "reg" : reg }
14457639Sgblack@eecs.umich.edu        readDestCode = ''
14467639Sgblack@eecs.umich.edu        if readDest:
14477639Sgblack@eecs.umich.edu            readDestCode = 'destElem = gtoh(destReg.elements[i]);'
14487639Sgblack@eecs.umich.edu        eWalkCode += '''
14497639Sgblack@eecs.umich.edu        for (unsigned i = 0; i < eCount; i++) {
14507639Sgblack@eecs.umich.edu            Element destElem;
14517639Sgblack@eecs.umich.edu            %(readDest)s
14527639Sgblack@eecs.umich.edu            %(op)s
14537639Sgblack@eecs.umich.edu            destReg.elements[i] = htog(destElem);
14547639Sgblack@eecs.umich.edu        }
14557639Sgblack@eecs.umich.edu        ''' % { "op" : op, "readDest" : readDestCode }
14567639Sgblack@eecs.umich.edu        for reg in range(rCount):
14577639Sgblack@eecs.umich.edu            eWalkCode += '''
14588588Sgblack@eecs.umich.edu            FpDestP%(reg)d_uw = gtoh(destReg.regs[%(reg)d]);
14597639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
14607639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
14617639Sgblack@eecs.umich.edu                            "RegImmOp",
14627639Sgblack@eecs.umich.edu                            { "code": eWalkCode,
14637639Sgblack@eecs.umich.edu                              "r_count": rCount,
14647760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
14657760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
14667639Sgblack@eecs.umich.edu        header_output += NeonRegImmOpDeclare.subst(iop)
14677639Sgblack@eecs.umich.edu        exec_output += NeonEqualRegExecute.subst(iop)
14687639Sgblack@eecs.umich.edu        for type in types:
14697639Sgblack@eecs.umich.edu            substDict = { "targs" : type,
14707639Sgblack@eecs.umich.edu                          "class_name" : Name }
14717639Sgblack@eecs.umich.edu            exec_output += NeonExecDeclare.subst(substDict)
14727639Sgblack@eecs.umich.edu
14737760SGiacomo.Gabrielli@arm.com    def twoRegLongMiscInst(name, Name, opClass, types, op, readDest=False):
14747639Sgblack@eecs.umich.edu        global header_output, exec_output
14757640Sgblack@eecs.umich.edu        eWalkCode = simdEnabledCheckCode + '''
14767639Sgblack@eecs.umich.edu        RegVect srcReg1;
14777639Sgblack@eecs.umich.edu        BigRegVect destReg;
14787639Sgblack@eecs.umich.edu        '''
14797639Sgblack@eecs.umich.edu        for reg in range(2):
14807639Sgblack@eecs.umich.edu            eWalkCode += '''
14818588Sgblack@eecs.umich.edu                srcReg1.regs[%(reg)d] = htog(FpOp1P%(reg)d_uw);
14827639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
14837639Sgblack@eecs.umich.edu        if readDest:
14847639Sgblack@eecs.umich.edu            for reg in range(4):
14857639Sgblack@eecs.umich.edu                eWalkCode += '''
14868588Sgblack@eecs.umich.edu                    destReg.regs[%(reg)d] = htog(FpDestP%(reg)d_uw);
14877639Sgblack@eecs.umich.edu                ''' % { "reg" : reg }
14887639Sgblack@eecs.umich.edu        readDestCode = ''
14897639Sgblack@eecs.umich.edu        if readDest:
14907639Sgblack@eecs.umich.edu            readDestCode = 'destReg = gtoh(destReg.elements[i]);'
14917639Sgblack@eecs.umich.edu        eWalkCode += '''
14927639Sgblack@eecs.umich.edu        for (unsigned i = 0; i < eCount; i++) {
14937639Sgblack@eecs.umich.edu            Element srcElem1 = gtoh(srcReg1.elements[i]);
14947639Sgblack@eecs.umich.edu            BigElement destElem;
14957639Sgblack@eecs.umich.edu            %(readDest)s
14967639Sgblack@eecs.umich.edu            %(op)s
14977639Sgblack@eecs.umich.edu            destReg.elements[i] = htog(destElem);
14987639Sgblack@eecs.umich.edu        }
14997639Sgblack@eecs.umich.edu        ''' % { "op" : op, "readDest" : readDestCode }
15007639Sgblack@eecs.umich.edu        for reg in range(4):
15017639Sgblack@eecs.umich.edu            eWalkCode += '''
15028588Sgblack@eecs.umich.edu            FpDestP%(reg)d_uw = gtoh(destReg.regs[%(reg)d]);
15037639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
15047639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
15057639Sgblack@eecs.umich.edu                            "RegRegOp",
15067639Sgblack@eecs.umich.edu                            { "code": eWalkCode,
15077639Sgblack@eecs.umich.edu                              "r_count": 2,
15087760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
15097760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
15107639Sgblack@eecs.umich.edu        header_output += NeonRegRegOpDeclare.subst(iop)
15117639Sgblack@eecs.umich.edu        exec_output += NeonUnequalRegExecute.subst(iop)
15127639Sgblack@eecs.umich.edu        for type in types:
15137639Sgblack@eecs.umich.edu            substDict = { "targs" : type,
15147639Sgblack@eecs.umich.edu                          "class_name" : Name }
15157639Sgblack@eecs.umich.edu            exec_output += NeonExecDeclare.subst(substDict)
15167639Sgblack@eecs.umich.edu
15177639Sgblack@eecs.umich.edu    vhaddCode = '''
15187639Sgblack@eecs.umich.edu        Element carryBit =
15197639Sgblack@eecs.umich.edu            (((unsigned)srcElem1 & 0x1) +
15207639Sgblack@eecs.umich.edu             ((unsigned)srcElem2 & 0x1)) >> 1;
15217639Sgblack@eecs.umich.edu        // Use division instead of a shift to ensure the sign extension works
15227639Sgblack@eecs.umich.edu        // right. The compiler will figure out if it can be a shift. Mask the
15237639Sgblack@eecs.umich.edu        // inputs so they get truncated correctly.
15247639Sgblack@eecs.umich.edu        destElem = (((srcElem1 & ~(Element)1) / 2) +
15257639Sgblack@eecs.umich.edu                    ((srcElem2 & ~(Element)1) / 2)) + carryBit;
15267639Sgblack@eecs.umich.edu    '''
15277760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vhadd", "VhaddD", "SimdAddOp", allTypes, 2, vhaddCode)
15287760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vhadd", "VhaddQ", "SimdAddOp", allTypes, 4, vhaddCode)
15297639Sgblack@eecs.umich.edu
15307639Sgblack@eecs.umich.edu    vrhaddCode = '''
15317639Sgblack@eecs.umich.edu        Element carryBit =
15327639Sgblack@eecs.umich.edu            (((unsigned)srcElem1 & 0x1) +
15337639Sgblack@eecs.umich.edu             ((unsigned)srcElem2 & 0x1) + 1) >> 1;
15347639Sgblack@eecs.umich.edu        // Use division instead of a shift to ensure the sign extension works
15357639Sgblack@eecs.umich.edu        // right. The compiler will figure out if it can be a shift. Mask the
15367639Sgblack@eecs.umich.edu        // inputs so they get truncated correctly.
15377639Sgblack@eecs.umich.edu        destElem = (((srcElem1 & ~(Element)1) / 2) +
15387639Sgblack@eecs.umich.edu                    ((srcElem2 & ~(Element)1) / 2)) + carryBit;
15397639Sgblack@eecs.umich.edu    '''
15407760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vrhadd", "VrhaddD", "SimdAddOp", allTypes, 2, vrhaddCode)
15417760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vrhadd", "VrhaddQ", "SimdAddOp", allTypes, 4, vrhaddCode)
15427639Sgblack@eecs.umich.edu
15437639Sgblack@eecs.umich.edu    vhsubCode = '''
15447639Sgblack@eecs.umich.edu        Element barrowBit =
15457639Sgblack@eecs.umich.edu            (((srcElem1 & 0x1) - (srcElem2 & 0x1)) >> 1) & 0x1;
15467639Sgblack@eecs.umich.edu        // Use division instead of a shift to ensure the sign extension works
15477639Sgblack@eecs.umich.edu        // right. The compiler will figure out if it can be a shift. Mask the
15487639Sgblack@eecs.umich.edu        // inputs so they get truncated correctly.
15497639Sgblack@eecs.umich.edu        destElem = (((srcElem1 & ~(Element)1) / 2) -
15507639Sgblack@eecs.umich.edu                    ((srcElem2 & ~(Element)1) / 2)) - barrowBit;
15517639Sgblack@eecs.umich.edu    '''
15527760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vhsub", "VhsubD", "SimdAddOp", allTypes, 2, vhsubCode)
15537760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vhsub", "VhsubQ", "SimdAddOp", allTypes, 4, vhsubCode)
15547639Sgblack@eecs.umich.edu
15557639Sgblack@eecs.umich.edu    vandCode = '''
15567639Sgblack@eecs.umich.edu        destElem = srcElem1 & srcElem2;
15577639Sgblack@eecs.umich.edu    '''
15587760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vand", "VandD", "SimdAluOp", unsignedTypes, 2, vandCode)
15597760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vand", "VandQ", "SimdAluOp", unsignedTypes, 4, vandCode)
15607639Sgblack@eecs.umich.edu
15617639Sgblack@eecs.umich.edu    vbicCode = '''
15627639Sgblack@eecs.umich.edu        destElem = srcElem1 & ~srcElem2;
15637639Sgblack@eecs.umich.edu    '''
15647760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vbic", "VbicD", "SimdAluOp", unsignedTypes, 2, vbicCode)
15657760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vbic", "VbicQ", "SimdAluOp", unsignedTypes, 4, vbicCode)
15667639Sgblack@eecs.umich.edu
15677639Sgblack@eecs.umich.edu    vorrCode = '''
15687639Sgblack@eecs.umich.edu        destElem = srcElem1 | srcElem2;
15697639Sgblack@eecs.umich.edu    '''
15707760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vorr", "VorrD", "SimdAluOp", unsignedTypes, 2, vorrCode)
15717760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vorr", "VorrQ", "SimdAluOp", unsignedTypes, 4, vorrCode)
15727639Sgblack@eecs.umich.edu
15737760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vmov", "VmovD", "SimdMiscOp", unsignedTypes, 2, vorrCode)
15747760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vmov", "VmovQ", "SimdMiscOp", unsignedTypes, 4, vorrCode)
15757639Sgblack@eecs.umich.edu
15767639Sgblack@eecs.umich.edu    vornCode = '''
15777639Sgblack@eecs.umich.edu        destElem = srcElem1 | ~srcElem2;
15787639Sgblack@eecs.umich.edu    '''
15797760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vorn", "VornD", "SimdAluOp", unsignedTypes, 2, vornCode)
15807760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vorn", "VornQ", "SimdAluOp", unsignedTypes, 4, vornCode)
15817639Sgblack@eecs.umich.edu
15827639Sgblack@eecs.umich.edu    veorCode = '''
15837639Sgblack@eecs.umich.edu        destElem = srcElem1 ^ srcElem2;
15847639Sgblack@eecs.umich.edu    '''
15857760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("veor", "VeorD", "SimdAluOp", unsignedTypes, 2, veorCode)
15867760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("veor", "VeorQ", "SimdAluOp", unsignedTypes, 4, veorCode)
15877639Sgblack@eecs.umich.edu
15887639Sgblack@eecs.umich.edu    vbifCode = '''
15897639Sgblack@eecs.umich.edu        destElem = (destElem & srcElem2) | (srcElem1 & ~srcElem2);
15907639Sgblack@eecs.umich.edu    '''
15917760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vbif", "VbifD", "SimdAluOp", unsignedTypes, 2, vbifCode, True)
15927760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vbif", "VbifQ", "SimdAluOp", unsignedTypes, 4, vbifCode, True)
15937639Sgblack@eecs.umich.edu    vbitCode = '''
15947639Sgblack@eecs.umich.edu        destElem = (srcElem1 & srcElem2) | (destElem & ~srcElem2);
15957639Sgblack@eecs.umich.edu    '''
15967760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vbit", "VbitD", "SimdAluOp", unsignedTypes, 2, vbitCode, True)
15977760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vbit", "VbitQ", "SimdAluOp", unsignedTypes, 4, vbitCode, True)
15987639Sgblack@eecs.umich.edu    vbslCode = '''
15997639Sgblack@eecs.umich.edu        destElem = (srcElem1 & destElem) | (srcElem2 & ~destElem);
16007639Sgblack@eecs.umich.edu    '''
16017760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vbsl", "VbslD", "SimdAluOp", unsignedTypes, 2, vbslCode, True)
16027760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vbsl", "VbslQ", "SimdAluOp", unsignedTypes, 4, vbslCode, True)
16037639Sgblack@eecs.umich.edu
16047639Sgblack@eecs.umich.edu    vmaxCode = '''
16057639Sgblack@eecs.umich.edu        destElem = (srcElem1 > srcElem2) ? srcElem1 : srcElem2;
16067639Sgblack@eecs.umich.edu    '''
16077760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vmax", "VmaxD", "SimdCmpOp", allTypes, 2, vmaxCode)
16087760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vmax", "VmaxQ", "SimdCmpOp", allTypes, 4, vmaxCode)
16097639Sgblack@eecs.umich.edu
16107639Sgblack@eecs.umich.edu    vminCode = '''
16117639Sgblack@eecs.umich.edu        destElem = (srcElem1 < srcElem2) ? srcElem1 : srcElem2;
16127639Sgblack@eecs.umich.edu    '''
16137760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vmin", "VminD", "SimdCmpOp", allTypes, 2, vminCode)
16147760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vmin", "VminQ", "SimdCmpOp", allTypes, 4, vminCode)
16157639Sgblack@eecs.umich.edu
16167639Sgblack@eecs.umich.edu    vaddCode = '''
16177639Sgblack@eecs.umich.edu        destElem = srcElem1 + srcElem2;
16187639Sgblack@eecs.umich.edu    '''
16197760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vadd", "NVaddD", "SimdAddOp", unsignedTypes, 2, vaddCode)
16207760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vadd", "NVaddQ", "SimdAddOp", unsignedTypes, 4, vaddCode)
16217639Sgblack@eecs.umich.edu
16227760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vpadd", "NVpaddD", "SimdAddOp", unsignedTypes,
16237639Sgblack@eecs.umich.edu                      2, vaddCode, pairwise=True)
16247760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vpadd", "NVpaddQ", "SimdAddOp", unsignedTypes,
16257639Sgblack@eecs.umich.edu                      4, vaddCode, pairwise=True)
16267639Sgblack@eecs.umich.edu    vaddlwCode = '''
16277639Sgblack@eecs.umich.edu        destElem = (BigElement)srcElem1 + (BigElement)srcElem2;
16287639Sgblack@eecs.umich.edu    '''
16297760SGiacomo.Gabrielli@arm.com    threeRegLongInst("vaddl", "Vaddl", "SimdAddOp", smallTypes, vaddlwCode)
16307760SGiacomo.Gabrielli@arm.com    threeRegWideInst("vaddw", "Vaddw", "SimdAddOp", smallTypes, vaddlwCode)
16317639Sgblack@eecs.umich.edu    vaddhnCode = '''
16327639Sgblack@eecs.umich.edu        destElem = ((BigElement)srcElem1 + (BigElement)srcElem2) >>
16337639Sgblack@eecs.umich.edu                   (sizeof(Element) * 8);
16347639Sgblack@eecs.umich.edu    '''
16357760SGiacomo.Gabrielli@arm.com    threeRegNarrowInst("vaddhn", "Vaddhn", "SimdAddOp", smallTypes, vaddhnCode)
16367639Sgblack@eecs.umich.edu    vraddhnCode = '''
16377639Sgblack@eecs.umich.edu        destElem = ((BigElement)srcElem1 + (BigElement)srcElem2 +
16387639Sgblack@eecs.umich.edu                    ((BigElement)1 << (sizeof(Element) * 8 - 1))) >>
16397639Sgblack@eecs.umich.edu                   (sizeof(Element) * 8);
16407639Sgblack@eecs.umich.edu    '''
16417760SGiacomo.Gabrielli@arm.com    threeRegNarrowInst("vraddhn", "Vraddhn", "SimdAddOp", smallTypes, vraddhnCode)
16427639Sgblack@eecs.umich.edu
16437639Sgblack@eecs.umich.edu    vsubCode = '''
16447639Sgblack@eecs.umich.edu        destElem = srcElem1 - srcElem2;
16457639Sgblack@eecs.umich.edu    '''
16467760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vsub", "NVsubD", "SimdAddOp", unsignedTypes, 2, vsubCode)
16477760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vsub", "NVsubQ", "SimdAddOp", unsignedTypes, 4, vsubCode)
16487639Sgblack@eecs.umich.edu    vsublwCode = '''
16497639Sgblack@eecs.umich.edu        destElem = (BigElement)srcElem1 - (BigElement)srcElem2;
16507639Sgblack@eecs.umich.edu    '''
16517760SGiacomo.Gabrielli@arm.com    threeRegLongInst("vsubl", "Vsubl", "SimdAddOp", smallTypes, vsublwCode)
16527760SGiacomo.Gabrielli@arm.com    threeRegWideInst("vsubw", "Vsubw", "SimdAddOp", smallTypes, vsublwCode)
16537639Sgblack@eecs.umich.edu
16547639Sgblack@eecs.umich.edu    vqaddUCode = '''
16557639Sgblack@eecs.umich.edu        destElem = srcElem1 + srcElem2;
16567783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
16577639Sgblack@eecs.umich.edu        if (destElem < srcElem1 || destElem < srcElem2) {
16587639Sgblack@eecs.umich.edu            destElem = (Element)(-1);
16597639Sgblack@eecs.umich.edu            fpscr.qc = 1;
16607639Sgblack@eecs.umich.edu        }
16617783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
16627639Sgblack@eecs.umich.edu    '''
16637760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vqadd", "VqaddUD", "SimdAddOp", unsignedTypes, 2, vqaddUCode)
16647760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vqadd", "VqaddUQ", "SimdAddOp", unsignedTypes, 4, vqaddUCode)
16657639Sgblack@eecs.umich.edu    vsubhnCode = '''
16667639Sgblack@eecs.umich.edu        destElem = ((BigElement)srcElem1 - (BigElement)srcElem2) >>
16677639Sgblack@eecs.umich.edu                   (sizeof(Element) * 8);
16687639Sgblack@eecs.umich.edu    '''
16697760SGiacomo.Gabrielli@arm.com    threeRegNarrowInst("vsubhn", "Vsubhn", "SimdAddOp", smallTypes, vsubhnCode)
16707639Sgblack@eecs.umich.edu    vrsubhnCode = '''
16717639Sgblack@eecs.umich.edu        destElem = ((BigElement)srcElem1 - (BigElement)srcElem2 +
16727639Sgblack@eecs.umich.edu                    ((BigElement)1 << (sizeof(Element) * 8 - 1))) >>
16737639Sgblack@eecs.umich.edu                   (sizeof(Element) * 8);
16747639Sgblack@eecs.umich.edu    '''
16757760SGiacomo.Gabrielli@arm.com    threeRegNarrowInst("vrsubhn", "Vrsubhn", "SimdAddOp", smallTypes, vrsubhnCode)
16767639Sgblack@eecs.umich.edu
16777639Sgblack@eecs.umich.edu    vqaddSCode = '''
16787639Sgblack@eecs.umich.edu        destElem = srcElem1 + srcElem2;
16797783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
16807639Sgblack@eecs.umich.edu        bool negDest = (destElem < 0);
16817639Sgblack@eecs.umich.edu        bool negSrc1 = (srcElem1 < 0);
16827639Sgblack@eecs.umich.edu        bool negSrc2 = (srcElem2 < 0);
16837639Sgblack@eecs.umich.edu        if ((negDest != negSrc1) && (negSrc1 == negSrc2)) {
16847639Sgblack@eecs.umich.edu            destElem = (Element)1 << (sizeof(Element) * 8 - 1);
16857639Sgblack@eecs.umich.edu            if (negDest)
16867639Sgblack@eecs.umich.edu                destElem -= 1;
16877639Sgblack@eecs.umich.edu            fpscr.qc = 1;
16887639Sgblack@eecs.umich.edu        }
16897783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
16907639Sgblack@eecs.umich.edu    '''
16917760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vqadd", "VqaddSD", "SimdAddOp", signedTypes, 2, vqaddSCode)
16927760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vqadd", "VqaddSQ", "SimdAddOp", signedTypes, 4, vqaddSCode)
16937639Sgblack@eecs.umich.edu
16947639Sgblack@eecs.umich.edu    vqsubUCode = '''
16957639Sgblack@eecs.umich.edu        destElem = srcElem1 - srcElem2;
16967783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
16977639Sgblack@eecs.umich.edu        if (destElem > srcElem1) {
16987639Sgblack@eecs.umich.edu            destElem = 0;
16997639Sgblack@eecs.umich.edu            fpscr.qc = 1;
17007639Sgblack@eecs.umich.edu        }
17017783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
17027639Sgblack@eecs.umich.edu    '''
17037760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vqsub", "VqsubUD", "SimdAddOp", unsignedTypes, 2, vqsubUCode)
17047760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vqsub", "VqsubUQ", "SimdAddOp", unsignedTypes, 4, vqsubUCode)
17057639Sgblack@eecs.umich.edu
17067639Sgblack@eecs.umich.edu    vqsubSCode = '''
17077639Sgblack@eecs.umich.edu        destElem = srcElem1 - srcElem2;
17087783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
17097639Sgblack@eecs.umich.edu        bool negDest = (destElem < 0);
17107639Sgblack@eecs.umich.edu        bool negSrc1 = (srcElem1 < 0);
17117639Sgblack@eecs.umich.edu        bool posSrc2 = (srcElem2 >= 0);
17127639Sgblack@eecs.umich.edu        if ((negDest != negSrc1) && (negSrc1 == posSrc2)) {
17137639Sgblack@eecs.umich.edu            destElem = (Element)1 << (sizeof(Element) * 8 - 1);
17147639Sgblack@eecs.umich.edu            if (negDest)
17157639Sgblack@eecs.umich.edu                destElem -= 1;
17167639Sgblack@eecs.umich.edu            fpscr.qc = 1;
17177639Sgblack@eecs.umich.edu        }
17187783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
17197639Sgblack@eecs.umich.edu    '''
17207760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vqsub", "VqsubSD", "SimdAddOp", signedTypes, 2, vqsubSCode)
17217760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vqsub", "VqsubSQ", "SimdAddOp", signedTypes, 4, vqsubSCode)
17227639Sgblack@eecs.umich.edu
17237639Sgblack@eecs.umich.edu    vcgtCode = '''
17247639Sgblack@eecs.umich.edu        destElem =  (srcElem1 > srcElem2) ? (Element)(-1) : 0;
17257639Sgblack@eecs.umich.edu    '''
17267760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vcgt", "VcgtD", "SimdCmpOp", allTypes, 2, vcgtCode)
17277760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vcgt", "VcgtQ", "SimdCmpOp", allTypes, 4, vcgtCode)
17287639Sgblack@eecs.umich.edu
17297639Sgblack@eecs.umich.edu    vcgeCode = '''
17307639Sgblack@eecs.umich.edu        destElem =  (srcElem1 >= srcElem2) ? (Element)(-1) : 0;
17317639Sgblack@eecs.umich.edu    '''
17327760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vcge", "VcgeD", "SimdCmpOp", allTypes, 2, vcgeCode)
17337760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vcge", "VcgeQ", "SimdCmpOp", allTypes, 4, vcgeCode)
17347639Sgblack@eecs.umich.edu
17357639Sgblack@eecs.umich.edu    vceqCode = '''
17367639Sgblack@eecs.umich.edu        destElem =  (srcElem1 == srcElem2) ? (Element)(-1) : 0;
17377639Sgblack@eecs.umich.edu    '''
17387760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vceq", "VceqD", "SimdCmpOp", unsignedTypes, 2, vceqCode)
17397760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vceq", "VceqQ", "SimdCmpOp", unsignedTypes, 4, vceqCode)
17407639Sgblack@eecs.umich.edu
17417639Sgblack@eecs.umich.edu    vshlCode = '''
17427639Sgblack@eecs.umich.edu        int16_t shiftAmt = (int8_t)srcElem2;
17437639Sgblack@eecs.umich.edu        if (shiftAmt < 0) {
17447639Sgblack@eecs.umich.edu            shiftAmt = -shiftAmt;
17457639Sgblack@eecs.umich.edu            if (shiftAmt >= sizeof(Element) * 8) {
17467639Sgblack@eecs.umich.edu                shiftAmt = sizeof(Element) * 8 - 1;
17477639Sgblack@eecs.umich.edu                destElem = 0;
17487639Sgblack@eecs.umich.edu            } else {
17497639Sgblack@eecs.umich.edu                destElem = (srcElem1 >> shiftAmt);
17507639Sgblack@eecs.umich.edu            }
17517639Sgblack@eecs.umich.edu            // Make sure the right shift sign extended when it should.
17527641Sgblack@eecs.umich.edu            if (ltz(srcElem1) && !ltz(destElem)) {
17537639Sgblack@eecs.umich.edu                destElem |= -((Element)1 << (sizeof(Element) * 8 -
17547639Sgblack@eecs.umich.edu                                             1 - shiftAmt));
17557639Sgblack@eecs.umich.edu            }
17567639Sgblack@eecs.umich.edu        } else {
17577639Sgblack@eecs.umich.edu            if (shiftAmt >= sizeof(Element) * 8) {
17587639Sgblack@eecs.umich.edu                destElem = 0;
17597639Sgblack@eecs.umich.edu            } else {
17607639Sgblack@eecs.umich.edu                destElem = srcElem1 << shiftAmt;
17617639Sgblack@eecs.umich.edu            }
17627639Sgblack@eecs.umich.edu        }
17637639Sgblack@eecs.umich.edu    '''
17648206SWilliam.Wang@arm.com    threeEqualRegInst("vshl", "VshlD", "SimdShiftOp", allTypes, 2, vshlCode)
17658206SWilliam.Wang@arm.com    threeEqualRegInst("vshl", "VshlQ", "SimdShiftOp", allTypes, 4, vshlCode)
17667639Sgblack@eecs.umich.edu
17677639Sgblack@eecs.umich.edu    vrshlCode = '''
17687639Sgblack@eecs.umich.edu        int16_t shiftAmt = (int8_t)srcElem2;
17697639Sgblack@eecs.umich.edu        if (shiftAmt < 0) {
17707639Sgblack@eecs.umich.edu            shiftAmt = -shiftAmt;
17717639Sgblack@eecs.umich.edu            Element rBit = 0;
17727639Sgblack@eecs.umich.edu            if (shiftAmt <= sizeof(Element) * 8)
17737639Sgblack@eecs.umich.edu                rBit = bits(srcElem1, shiftAmt - 1);
17747641Sgblack@eecs.umich.edu            if (shiftAmt > sizeof(Element) * 8 && ltz(srcElem1))
17757639Sgblack@eecs.umich.edu                rBit = 1;
17767639Sgblack@eecs.umich.edu            if (shiftAmt >= sizeof(Element) * 8) {
17777639Sgblack@eecs.umich.edu                shiftAmt = sizeof(Element) * 8 - 1;
17787639Sgblack@eecs.umich.edu                destElem = 0;
17797639Sgblack@eecs.umich.edu            } else {
17807639Sgblack@eecs.umich.edu                destElem = (srcElem1 >> shiftAmt);
17817639Sgblack@eecs.umich.edu            }
17827639Sgblack@eecs.umich.edu            // Make sure the right shift sign extended when it should.
17837641Sgblack@eecs.umich.edu            if (ltz(srcElem1) && !ltz(destElem)) {
17847639Sgblack@eecs.umich.edu                destElem |= -((Element)1 << (sizeof(Element) * 8 -
17857639Sgblack@eecs.umich.edu                                             1 - shiftAmt));
17867639Sgblack@eecs.umich.edu            }
17877639Sgblack@eecs.umich.edu            destElem += rBit;
17887639Sgblack@eecs.umich.edu        } else if (shiftAmt > 0) {
17897639Sgblack@eecs.umich.edu            if (shiftAmt >= sizeof(Element) * 8) {
17907639Sgblack@eecs.umich.edu                destElem = 0;
17917639Sgblack@eecs.umich.edu            } else {
17927639Sgblack@eecs.umich.edu                destElem = srcElem1 << shiftAmt;
17937639Sgblack@eecs.umich.edu            }
17947639Sgblack@eecs.umich.edu        } else {
17957639Sgblack@eecs.umich.edu            destElem = srcElem1;
17967639Sgblack@eecs.umich.edu        }
17977639Sgblack@eecs.umich.edu    '''
17987760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vrshl", "VrshlD", "SimdAluOp", allTypes, 2, vrshlCode)
17997760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vrshl", "VrshlQ", "SimdAluOp", allTypes, 4, vrshlCode)
18007639Sgblack@eecs.umich.edu
18017639Sgblack@eecs.umich.edu    vqshlUCode = '''
18027639Sgblack@eecs.umich.edu        int16_t shiftAmt = (int8_t)srcElem2;
18037783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
18047639Sgblack@eecs.umich.edu        if (shiftAmt < 0) {
18057639Sgblack@eecs.umich.edu            shiftAmt = -shiftAmt;
18067639Sgblack@eecs.umich.edu            if (shiftAmt >= sizeof(Element) * 8) {
18077639Sgblack@eecs.umich.edu                shiftAmt = sizeof(Element) * 8 - 1;
18087639Sgblack@eecs.umich.edu                destElem = 0;
18097639Sgblack@eecs.umich.edu            } else {
18107639Sgblack@eecs.umich.edu                destElem = (srcElem1 >> shiftAmt);
18117639Sgblack@eecs.umich.edu            }
18127639Sgblack@eecs.umich.edu        } else if (shiftAmt > 0) {
18137639Sgblack@eecs.umich.edu            if (shiftAmt >= sizeof(Element) * 8) {
18147639Sgblack@eecs.umich.edu                if (srcElem1 != 0) {
18157639Sgblack@eecs.umich.edu                    destElem = mask(sizeof(Element) * 8);
18167639Sgblack@eecs.umich.edu                    fpscr.qc = 1;
18177639Sgblack@eecs.umich.edu                } else {
18187639Sgblack@eecs.umich.edu                    destElem = 0;
18197639Sgblack@eecs.umich.edu                }
18207639Sgblack@eecs.umich.edu            } else {
18217639Sgblack@eecs.umich.edu                if (bits(srcElem1, sizeof(Element) * 8 - 1,
18227639Sgblack@eecs.umich.edu                            sizeof(Element) * 8 - shiftAmt)) {
18237639Sgblack@eecs.umich.edu                    destElem = mask(sizeof(Element) * 8);
18247639Sgblack@eecs.umich.edu                    fpscr.qc = 1;
18257639Sgblack@eecs.umich.edu                } else {
18267639Sgblack@eecs.umich.edu                    destElem = srcElem1 << shiftAmt;
18277639Sgblack@eecs.umich.edu                }
18287639Sgblack@eecs.umich.edu            }
18297639Sgblack@eecs.umich.edu        } else {
18307639Sgblack@eecs.umich.edu            destElem = srcElem1;
18317639Sgblack@eecs.umich.edu        }
18327783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
18337639Sgblack@eecs.umich.edu    '''
18347760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vqshl", "VqshlUD", "SimdAluOp", unsignedTypes, 2, vqshlUCode)
18357760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vqshl", "VqshlUQ", "SimdAluOp", unsignedTypes, 4, vqshlUCode)
18367639Sgblack@eecs.umich.edu
18377639Sgblack@eecs.umich.edu    vqshlSCode = '''
18387639Sgblack@eecs.umich.edu        int16_t shiftAmt = (int8_t)srcElem2;
18397783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
18407639Sgblack@eecs.umich.edu        if (shiftAmt < 0) {
18417639Sgblack@eecs.umich.edu            shiftAmt = -shiftAmt;
18427639Sgblack@eecs.umich.edu            if (shiftAmt >= sizeof(Element) * 8) {
18437639Sgblack@eecs.umich.edu                shiftAmt = sizeof(Element) * 8 - 1;
18447639Sgblack@eecs.umich.edu                destElem = 0;
18457639Sgblack@eecs.umich.edu            } else {
18467639Sgblack@eecs.umich.edu                destElem = (srcElem1 >> shiftAmt);
18477639Sgblack@eecs.umich.edu            }
18487639Sgblack@eecs.umich.edu            // Make sure the right shift sign extended when it should.
18497639Sgblack@eecs.umich.edu            if (srcElem1 < 0 && destElem >= 0) {
18507639Sgblack@eecs.umich.edu                destElem |= -((Element)1 << (sizeof(Element) * 8 -
18517639Sgblack@eecs.umich.edu                                             1 - shiftAmt));
18527639Sgblack@eecs.umich.edu            }
18537639Sgblack@eecs.umich.edu        } else if (shiftAmt > 0) {
18547639Sgblack@eecs.umich.edu            bool sat = false;
18557639Sgblack@eecs.umich.edu            if (shiftAmt >= sizeof(Element) * 8) {
18567639Sgblack@eecs.umich.edu                if (srcElem1 != 0)
18577639Sgblack@eecs.umich.edu                    sat = true;
18587639Sgblack@eecs.umich.edu                else
18597639Sgblack@eecs.umich.edu                    destElem = 0;
18607639Sgblack@eecs.umich.edu            } else {
18617639Sgblack@eecs.umich.edu                if (bits(srcElem1, sizeof(Element) * 8 - 1,
18627639Sgblack@eecs.umich.edu                            sizeof(Element) * 8 - 1 - shiftAmt) !=
18637639Sgblack@eecs.umich.edu                        ((srcElem1 < 0) ? mask(shiftAmt + 1) : 0)) {
18647639Sgblack@eecs.umich.edu                    sat = true;
18657639Sgblack@eecs.umich.edu                } else {
18667639Sgblack@eecs.umich.edu                    destElem = srcElem1 << shiftAmt;
18677639Sgblack@eecs.umich.edu                }
18687639Sgblack@eecs.umich.edu            }
18697639Sgblack@eecs.umich.edu            if (sat) {
18707639Sgblack@eecs.umich.edu                fpscr.qc = 1;
18717639Sgblack@eecs.umich.edu                destElem = mask(sizeof(Element) * 8 - 1);
18727639Sgblack@eecs.umich.edu                if (srcElem1 < 0)
18737639Sgblack@eecs.umich.edu                    destElem = ~destElem;
18747639Sgblack@eecs.umich.edu            }
18757639Sgblack@eecs.umich.edu        } else {
18767639Sgblack@eecs.umich.edu            destElem = srcElem1;
18777639Sgblack@eecs.umich.edu        }
18787783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
18797639Sgblack@eecs.umich.edu    '''
18807760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vqshl", "VqshlSD", "SimdCmpOp", signedTypes, 2, vqshlSCode)
18817760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vqshl", "VqshlSQ", "SimdCmpOp", signedTypes, 4, vqshlSCode)
18827639Sgblack@eecs.umich.edu
18837639Sgblack@eecs.umich.edu    vqrshlUCode = '''
18847639Sgblack@eecs.umich.edu        int16_t shiftAmt = (int8_t)srcElem2;
18857783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
18867639Sgblack@eecs.umich.edu        if (shiftAmt < 0) {
18877639Sgblack@eecs.umich.edu            shiftAmt = -shiftAmt;
18887639Sgblack@eecs.umich.edu            Element rBit = 0;
18897639Sgblack@eecs.umich.edu            if (shiftAmt <= sizeof(Element) * 8)
18907639Sgblack@eecs.umich.edu                rBit = bits(srcElem1, shiftAmt - 1);
18917639Sgblack@eecs.umich.edu            if (shiftAmt >= sizeof(Element) * 8) {
18927639Sgblack@eecs.umich.edu                shiftAmt = sizeof(Element) * 8 - 1;
18937639Sgblack@eecs.umich.edu                destElem = 0;
18947639Sgblack@eecs.umich.edu            } else {
18957639Sgblack@eecs.umich.edu                destElem = (srcElem1 >> shiftAmt);
18967639Sgblack@eecs.umich.edu            }
18977639Sgblack@eecs.umich.edu            destElem += rBit;
18987639Sgblack@eecs.umich.edu        } else {
18997639Sgblack@eecs.umich.edu            if (shiftAmt >= sizeof(Element) * 8) {
19007639Sgblack@eecs.umich.edu                if (srcElem1 != 0) {
19017639Sgblack@eecs.umich.edu                    destElem = mask(sizeof(Element) * 8);
19027639Sgblack@eecs.umich.edu                    fpscr.qc = 1;
19037639Sgblack@eecs.umich.edu                } else {
19047639Sgblack@eecs.umich.edu                    destElem = 0;
19057639Sgblack@eecs.umich.edu                }
19067639Sgblack@eecs.umich.edu            } else {
19077639Sgblack@eecs.umich.edu                if (bits(srcElem1, sizeof(Element) * 8 - 1,
19087639Sgblack@eecs.umich.edu                            sizeof(Element) * 8 - shiftAmt)) {
19097639Sgblack@eecs.umich.edu                    destElem = mask(sizeof(Element) * 8);
19107639Sgblack@eecs.umich.edu                    fpscr.qc = 1;
19117639Sgblack@eecs.umich.edu                } else {
19127639Sgblack@eecs.umich.edu                    destElem = srcElem1 << shiftAmt;
19137639Sgblack@eecs.umich.edu                }
19147639Sgblack@eecs.umich.edu            }
19157639Sgblack@eecs.umich.edu        }
19167783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
19177639Sgblack@eecs.umich.edu    '''
19187760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vqrshl", "VqrshlUD", "SimdCmpOp", unsignedTypes, 2, vqrshlUCode)
19197760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vqrshl", "VqrshlUQ", "SimdCmpOp", unsignedTypes, 4, vqrshlUCode)
19207639Sgblack@eecs.umich.edu
19217639Sgblack@eecs.umich.edu    vqrshlSCode = '''
19227639Sgblack@eecs.umich.edu        int16_t shiftAmt = (int8_t)srcElem2;
19237783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
19247639Sgblack@eecs.umich.edu        if (shiftAmt < 0) {
19257639Sgblack@eecs.umich.edu            shiftAmt = -shiftAmt;
19267639Sgblack@eecs.umich.edu            Element rBit = 0;
19277639Sgblack@eecs.umich.edu            if (shiftAmt <= sizeof(Element) * 8)
19287639Sgblack@eecs.umich.edu                rBit = bits(srcElem1, shiftAmt - 1);
19297639Sgblack@eecs.umich.edu            if (shiftAmt > sizeof(Element) * 8 && srcElem1 < 0)
19307639Sgblack@eecs.umich.edu                rBit = 1;
19317639Sgblack@eecs.umich.edu            if (shiftAmt >= sizeof(Element) * 8) {
19327639Sgblack@eecs.umich.edu                shiftAmt = sizeof(Element) * 8 - 1;
19337639Sgblack@eecs.umich.edu                destElem = 0;
19347639Sgblack@eecs.umich.edu            } else {
19357639Sgblack@eecs.umich.edu                destElem = (srcElem1 >> shiftAmt);
19367639Sgblack@eecs.umich.edu            }
19377639Sgblack@eecs.umich.edu            // Make sure the right shift sign extended when it should.
19387639Sgblack@eecs.umich.edu            if (srcElem1 < 0 && destElem >= 0) {
19397639Sgblack@eecs.umich.edu                destElem |= -((Element)1 << (sizeof(Element) * 8 -
19407639Sgblack@eecs.umich.edu                                             1 - shiftAmt));
19417639Sgblack@eecs.umich.edu            }
19427639Sgblack@eecs.umich.edu            destElem += rBit;
19437639Sgblack@eecs.umich.edu        } else if (shiftAmt > 0) {
19447639Sgblack@eecs.umich.edu            bool sat = false;
19457639Sgblack@eecs.umich.edu            if (shiftAmt >= sizeof(Element) * 8) {
19467639Sgblack@eecs.umich.edu                if (srcElem1 != 0)
19477639Sgblack@eecs.umich.edu                    sat = true;
19487639Sgblack@eecs.umich.edu                else
19497639Sgblack@eecs.umich.edu                    destElem = 0;
19507639Sgblack@eecs.umich.edu            } else {
19517639Sgblack@eecs.umich.edu                if (bits(srcElem1, sizeof(Element) * 8 - 1,
19527639Sgblack@eecs.umich.edu                            sizeof(Element) * 8 - 1 - shiftAmt) !=
19537639Sgblack@eecs.umich.edu                        ((srcElem1 < 0) ? mask(shiftAmt + 1) : 0)) {
19547639Sgblack@eecs.umich.edu                    sat = true;
19557639Sgblack@eecs.umich.edu                } else {
19567639Sgblack@eecs.umich.edu                    destElem = srcElem1 << shiftAmt;
19577639Sgblack@eecs.umich.edu                }
19587639Sgblack@eecs.umich.edu            }
19597639Sgblack@eecs.umich.edu            if (sat) {
19607639Sgblack@eecs.umich.edu                fpscr.qc = 1;
19617639Sgblack@eecs.umich.edu                destElem = mask(sizeof(Element) * 8 - 1);
19627639Sgblack@eecs.umich.edu                if (srcElem1 < 0)
19637639Sgblack@eecs.umich.edu                    destElem = ~destElem;
19647639Sgblack@eecs.umich.edu            }
19657639Sgblack@eecs.umich.edu        } else {
19667639Sgblack@eecs.umich.edu            destElem = srcElem1;
19677639Sgblack@eecs.umich.edu        }
19687783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
19697639Sgblack@eecs.umich.edu    '''
19707760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vqrshl", "VqrshlSD", "SimdCmpOp", signedTypes, 2, vqrshlSCode)
19717760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vqrshl", "VqrshlSQ", "SimdCmpOp", signedTypes, 4, vqrshlSCode)
19727639Sgblack@eecs.umich.edu
19737639Sgblack@eecs.umich.edu    vabaCode = '''
19747639Sgblack@eecs.umich.edu        destElem += (srcElem1 > srcElem2) ? (srcElem1 - srcElem2) :
19757639Sgblack@eecs.umich.edu                                            (srcElem2 - srcElem1);
19767639Sgblack@eecs.umich.edu    '''
19777760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vaba", "VabaD", "SimdAddAccOp", allTypes, 2, vabaCode, True)
19787760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vaba", "VabaQ", "SimdAddAccOp", allTypes, 4, vabaCode, True)
19797639Sgblack@eecs.umich.edu    vabalCode = '''
19807639Sgblack@eecs.umich.edu        destElem += (srcElem1 > srcElem2) ?
19817639Sgblack@eecs.umich.edu            ((BigElement)srcElem1 - (BigElement)srcElem2) :
19827639Sgblack@eecs.umich.edu            ((BigElement)srcElem2 - (BigElement)srcElem1);
19837639Sgblack@eecs.umich.edu    '''
19847760SGiacomo.Gabrielli@arm.com    threeRegLongInst("vabal", "Vabal", "SimdAddAccOp", smallTypes, vabalCode, True)
19857639Sgblack@eecs.umich.edu
19867639Sgblack@eecs.umich.edu    vabdCode = '''
19877639Sgblack@eecs.umich.edu        destElem = (srcElem1 > srcElem2) ? (srcElem1 - srcElem2) :
19887639Sgblack@eecs.umich.edu                                           (srcElem2 - srcElem1);
19897639Sgblack@eecs.umich.edu    '''
19907760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vabd", "VabdD", "SimdAddOp", allTypes, 2, vabdCode)
19917760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vabd", "VabdQ", "SimdAddOp", allTypes, 4, vabdCode)
19927639Sgblack@eecs.umich.edu    vabdlCode = '''
19937639Sgblack@eecs.umich.edu        destElem = (srcElem1 > srcElem2) ?
19947639Sgblack@eecs.umich.edu            ((BigElement)srcElem1 - (BigElement)srcElem2) :
19957639Sgblack@eecs.umich.edu            ((BigElement)srcElem2 - (BigElement)srcElem1);
19967639Sgblack@eecs.umich.edu    '''
19977760SGiacomo.Gabrielli@arm.com    threeRegLongInst("vabdl", "Vabdl", "SimdAddOp", smallTypes, vabdlCode)
19987639Sgblack@eecs.umich.edu
19997639Sgblack@eecs.umich.edu    vtstCode = '''
20007639Sgblack@eecs.umich.edu        destElem = (srcElem1 & srcElem2) ? (Element)(-1) : 0;
20017639Sgblack@eecs.umich.edu    '''
20027760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vtst", "VtstD", "SimdAluOp", unsignedTypes, 2, vtstCode)
20037760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vtst", "VtstQ", "SimdAluOp", unsignedTypes, 4, vtstCode)
20047639Sgblack@eecs.umich.edu
20057639Sgblack@eecs.umich.edu    vmulCode = '''
20067639Sgblack@eecs.umich.edu        destElem = srcElem1 * srcElem2;
20077639Sgblack@eecs.umich.edu    '''
20087760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vmul", "NVmulD", "SimdMultOp", allTypes, 2, vmulCode)
20097760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vmul", "NVmulQ", "SimdMultOp", allTypes, 4, vmulCode)
20107639Sgblack@eecs.umich.edu    vmullCode = '''
20117639Sgblack@eecs.umich.edu        destElem = (BigElement)srcElem1 * (BigElement)srcElem2;
20127639Sgblack@eecs.umich.edu    '''
20137760SGiacomo.Gabrielli@arm.com    threeRegLongInst("vmull", "Vmull", "SimdMultOp", smallTypes, vmullCode)
20147639Sgblack@eecs.umich.edu
20157639Sgblack@eecs.umich.edu    vmlaCode = '''
20167639Sgblack@eecs.umich.edu        destElem = destElem + srcElem1 * srcElem2;
20177639Sgblack@eecs.umich.edu    '''
20187760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vmla", "NVmlaD", "SimdMultAccOp", allTypes, 2, vmlaCode, True)
20197760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vmla", "NVmlaQ", "SimdMultAccOp", allTypes, 4, vmlaCode, True)
20207639Sgblack@eecs.umich.edu    vmlalCode = '''
20217639Sgblack@eecs.umich.edu        destElem = destElem + (BigElement)srcElem1 * (BigElement)srcElem2;
20227639Sgblack@eecs.umich.edu    '''
20237760SGiacomo.Gabrielli@arm.com    threeRegLongInst("vmlal", "Vmlal", "SimdMultAccOp", smallTypes, vmlalCode, True)
20247639Sgblack@eecs.umich.edu
20257639Sgblack@eecs.umich.edu    vqdmlalCode = '''
20267783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
20277639Sgblack@eecs.umich.edu        BigElement midElem = (2 * (int64_t)srcElem1 * (int64_t)srcElem2);
20287639Sgblack@eecs.umich.edu        Element maxNeg = (Element)1 << (sizeof(Element) * 8 - 1);
20297639Sgblack@eecs.umich.edu        Element halfNeg = maxNeg / 2;
20307639Sgblack@eecs.umich.edu        if ((srcElem1 == maxNeg && srcElem2 == maxNeg) ||
20317639Sgblack@eecs.umich.edu            (srcElem1 == halfNeg && srcElem2 == maxNeg) ||
20327639Sgblack@eecs.umich.edu            (srcElem1 == maxNeg && srcElem2 == halfNeg)) {
20337639Sgblack@eecs.umich.edu            midElem = ~((BigElement)maxNeg << (sizeof(Element) * 8));
20347639Sgblack@eecs.umich.edu            fpscr.qc = 1;
20357639Sgblack@eecs.umich.edu        }
20367641Sgblack@eecs.umich.edu        bool negPreDest = ltz(destElem);
20377639Sgblack@eecs.umich.edu        destElem += midElem;
20387641Sgblack@eecs.umich.edu        bool negDest = ltz(destElem);
20397641Sgblack@eecs.umich.edu        bool negMid = ltz(midElem);
20407639Sgblack@eecs.umich.edu        if (negPreDest == negMid && negMid != negDest) {
20417639Sgblack@eecs.umich.edu            destElem = mask(sizeof(BigElement) * 8 - 1);
20427639Sgblack@eecs.umich.edu            if (negPreDest)
20437639Sgblack@eecs.umich.edu                destElem = ~destElem;
20447639Sgblack@eecs.umich.edu            fpscr.qc = 1;
20457639Sgblack@eecs.umich.edu        }
20467783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
20477639Sgblack@eecs.umich.edu    '''
20487760SGiacomo.Gabrielli@arm.com    threeRegLongInst("vqdmlal", "Vqdmlal", "SimdMultAccOp", smallTypes, vqdmlalCode, True)
20497639Sgblack@eecs.umich.edu
20507639Sgblack@eecs.umich.edu    vqdmlslCode = '''
20517783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
20527639Sgblack@eecs.umich.edu        BigElement midElem = (2 * (int64_t)srcElem1 * (int64_t)srcElem2);
20537639Sgblack@eecs.umich.edu        Element maxNeg = (Element)1 << (sizeof(Element) * 8 - 1);
20547639Sgblack@eecs.umich.edu        Element halfNeg = maxNeg / 2;
20557639Sgblack@eecs.umich.edu        if ((srcElem1 == maxNeg && srcElem2 == maxNeg) ||
20567639Sgblack@eecs.umich.edu            (srcElem1 == halfNeg && srcElem2 == maxNeg) ||
20577639Sgblack@eecs.umich.edu            (srcElem1 == maxNeg && srcElem2 == halfNeg)) {
20587639Sgblack@eecs.umich.edu            midElem = ~((BigElement)maxNeg << (sizeof(Element) * 8));
20597639Sgblack@eecs.umich.edu            fpscr.qc = 1;
20607639Sgblack@eecs.umich.edu        }
20617641Sgblack@eecs.umich.edu        bool negPreDest = ltz(destElem);
20627639Sgblack@eecs.umich.edu        destElem -= midElem;
20637641Sgblack@eecs.umich.edu        bool negDest = ltz(destElem);
20647641Sgblack@eecs.umich.edu        bool posMid = ltz((BigElement)-midElem);
20657639Sgblack@eecs.umich.edu        if (negPreDest == posMid && posMid != negDest) {
20667639Sgblack@eecs.umich.edu            destElem = mask(sizeof(BigElement) * 8 - 1);
20677639Sgblack@eecs.umich.edu            if (negPreDest)
20687639Sgblack@eecs.umich.edu                destElem = ~destElem;
20697639Sgblack@eecs.umich.edu            fpscr.qc = 1;
20707639Sgblack@eecs.umich.edu        }
20717783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
20727639Sgblack@eecs.umich.edu    '''
20737760SGiacomo.Gabrielli@arm.com    threeRegLongInst("vqdmlsl", "Vqdmlsl", "SimdMultAccOp", smallTypes, vqdmlslCode, True)
20747639Sgblack@eecs.umich.edu
20757639Sgblack@eecs.umich.edu    vqdmullCode = '''
20767783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
20777639Sgblack@eecs.umich.edu        destElem = (2 * (int64_t)srcElem1 * (int64_t)srcElem2);
20787639Sgblack@eecs.umich.edu        if (srcElem1 == srcElem2 &&
20797639Sgblack@eecs.umich.edu                srcElem1 == (Element)((Element)1 <<
20807639Sgblack@eecs.umich.edu                    (Element)(sizeof(Element) * 8 - 1))) {
20817639Sgblack@eecs.umich.edu            destElem = ~((BigElement)srcElem1 << (sizeof(Element) * 8));
20827639Sgblack@eecs.umich.edu            fpscr.qc = 1;
20837639Sgblack@eecs.umich.edu        }
20847783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
20857639Sgblack@eecs.umich.edu    '''
20867760SGiacomo.Gabrielli@arm.com    threeRegLongInst("vqdmull", "Vqdmull", "SimdMultAccOp", smallTypes, vqdmullCode)
20877639Sgblack@eecs.umich.edu
20887639Sgblack@eecs.umich.edu    vmlsCode = '''
20897639Sgblack@eecs.umich.edu        destElem = destElem - srcElem1 * srcElem2;
20907639Sgblack@eecs.umich.edu    '''
20917760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vmls", "NVmlsD", "SimdMultAccOp", allTypes, 2, vmlsCode, True)
20927760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vmls", "NVmlsQ", "SimdMultAccOp", allTypes, 4, vmlsCode, True)
20937639Sgblack@eecs.umich.edu    vmlslCode = '''
20947639Sgblack@eecs.umich.edu        destElem = destElem - (BigElement)srcElem1 * (BigElement)srcElem2;
20957639Sgblack@eecs.umich.edu    '''
20967760SGiacomo.Gabrielli@arm.com    threeRegLongInst("vmlsl", "Vmlsl", "SimdMultAccOp", smallTypes, vmlslCode, True)
20977639Sgblack@eecs.umich.edu
20987639Sgblack@eecs.umich.edu    vmulpCode = '''
20997639Sgblack@eecs.umich.edu        destElem = 0;
21007639Sgblack@eecs.umich.edu        for (unsigned j = 0; j < sizeof(Element) * 8; j++) {
21017639Sgblack@eecs.umich.edu            if (bits(srcElem2, j))
21027639Sgblack@eecs.umich.edu                destElem ^= srcElem1 << j;
21037639Sgblack@eecs.umich.edu        }
21047639Sgblack@eecs.umich.edu    '''
21057760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vmul", "NVmulpD", "SimdMultOp", unsignedTypes, 2, vmulpCode)
21067760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vmul", "NVmulpQ", "SimdMultOp", unsignedTypes, 4, vmulpCode)
21077639Sgblack@eecs.umich.edu    vmullpCode = '''
21087639Sgblack@eecs.umich.edu        destElem = 0;
21097639Sgblack@eecs.umich.edu        for (unsigned j = 0; j < sizeof(Element) * 8; j++) {
21107639Sgblack@eecs.umich.edu            if (bits(srcElem2, j))
21117639Sgblack@eecs.umich.edu                destElem ^= (BigElement)srcElem1 << j;
21127639Sgblack@eecs.umich.edu        }
21137639Sgblack@eecs.umich.edu    '''
21147760SGiacomo.Gabrielli@arm.com    threeRegLongInst("vmull", "Vmullp", "SimdMultOp", smallUnsignedTypes, vmullpCode)
21157639Sgblack@eecs.umich.edu
21167760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vpmax", "VpmaxD", "SimdCmpOp", allTypes, 2, vmaxCode, pairwise=True)
21177760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vpmax", "VpmaxQ", "SimdCmpOp", allTypes, 4, vmaxCode, pairwise=True)
21187639Sgblack@eecs.umich.edu
21197760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vpmin", "VpminD", "SimdCmpOp", allTypes, 2, vminCode, pairwise=True)
21207760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vpmin", "VpminQ", "SimdCmpOp", allTypes, 4, vminCode, pairwise=True)
21217639Sgblack@eecs.umich.edu
21227639Sgblack@eecs.umich.edu    vqdmulhCode = '''
21237783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
21247639Sgblack@eecs.umich.edu        destElem = (2 * (int64_t)srcElem1 * (int64_t)srcElem2) >>
21257639Sgblack@eecs.umich.edu                   (sizeof(Element) * 8);
21267639Sgblack@eecs.umich.edu        if (srcElem1 == srcElem2 &&
21277639Sgblack@eecs.umich.edu                srcElem1 == (Element)((Element)1 <<
21287639Sgblack@eecs.umich.edu                    (sizeof(Element) * 8 - 1))) {
21297639Sgblack@eecs.umich.edu            destElem = ~srcElem1;
21307639Sgblack@eecs.umich.edu            fpscr.qc = 1;
21317639Sgblack@eecs.umich.edu        }
21327783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
21337639Sgblack@eecs.umich.edu    '''
21347760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vqdmulh", "VqdmulhD", "SimdMultOp", smallSignedTypes, 2, vqdmulhCode)
21357760SGiacomo.Gabrielli@arm.com    threeEqualRegInst("vqdmulh", "VqdmulhQ", "SimdMultOp", smallSignedTypes, 4, vqdmulhCode)
21367639Sgblack@eecs.umich.edu
21377639Sgblack@eecs.umich.edu    vqrdmulhCode = '''
21387783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
21397639Sgblack@eecs.umich.edu        destElem = (2 * (int64_t)srcElem1 * (int64_t)srcElem2 +
21407639Sgblack@eecs.umich.edu                    ((int64_t)1 << (sizeof(Element) * 8 - 1))) >>
21417639Sgblack@eecs.umich.edu                   (sizeof(Element) * 8);
21427639Sgblack@eecs.umich.edu        Element maxNeg = (Element)1 << (sizeof(Element) * 8 - 1);
21437639Sgblack@eecs.umich.edu        Element halfNeg = maxNeg / 2;
21447639Sgblack@eecs.umich.edu        if ((srcElem1 == maxNeg && srcElem2 == maxNeg) ||
21457639Sgblack@eecs.umich.edu            (srcElem1 == halfNeg && srcElem2 == maxNeg) ||
21467639Sgblack@eecs.umich.edu            (srcElem1 == maxNeg && srcElem2 == halfNeg)) {
21477639Sgblack@eecs.umich.edu            if (destElem < 0) {
21487639Sgblack@eecs.umich.edu                destElem = mask(sizeof(Element) * 8 - 1);
21497639Sgblack@eecs.umich.edu            } else {
21507639Sgblack@eecs.umich.edu                destElem = (Element)1 << (sizeof(Element) * 8 - 1);
21517639Sgblack@eecs.umich.edu            }
21527639Sgblack@eecs.umich.edu            fpscr.qc = 1;
21537639Sgblack@eecs.umich.edu        }
21547783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
21557639Sgblack@eecs.umich.edu    '''
21567639Sgblack@eecs.umich.edu    threeEqualRegInst("vqrdmulh", "VqrdmulhD",
21577760SGiacomo.Gabrielli@arm.com            "SimdMultOp", smallSignedTypes, 2, vqrdmulhCode)
21587639Sgblack@eecs.umich.edu    threeEqualRegInst("vqrdmulh", "VqrdmulhQ",
21597760SGiacomo.Gabrielli@arm.com            "SimdMultOp", smallSignedTypes, 4, vqrdmulhCode)
21607639Sgblack@eecs.umich.edu
21617639Sgblack@eecs.umich.edu    vmaxfpCode = '''
21627783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
21637639Sgblack@eecs.umich.edu        bool done;
21647639Sgblack@eecs.umich.edu        destReg = processNans(fpscr, done, true, srcReg1, srcReg2);
21657639Sgblack@eecs.umich.edu        if (!done) {
21667639Sgblack@eecs.umich.edu            destReg = binaryOp(fpscr, srcReg1, srcReg2, fpMaxS,
21677639Sgblack@eecs.umich.edu                               true, true, VfpRoundNearest);
21687639Sgblack@eecs.umich.edu        } else if (flushToZero(srcReg1, srcReg2)) {
21697639Sgblack@eecs.umich.edu            fpscr.idc = 1;
21707639Sgblack@eecs.umich.edu        }
21717783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
21727639Sgblack@eecs.umich.edu    '''
21737760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vmax", "VmaxDFp", "SimdFloatCmpOp", ("float",), 2, vmaxfpCode)
21747760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vmax", "VmaxQFp", "SimdFloatCmpOp", ("float",), 4, vmaxfpCode)
21757639Sgblack@eecs.umich.edu
21767639Sgblack@eecs.umich.edu    vminfpCode = '''
21777783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
21787639Sgblack@eecs.umich.edu        bool done;
21797639Sgblack@eecs.umich.edu        destReg = processNans(fpscr, done, true, srcReg1, srcReg2);
21807639Sgblack@eecs.umich.edu        if (!done) {
21817639Sgblack@eecs.umich.edu            destReg = binaryOp(fpscr, srcReg1, srcReg2, fpMinS,
21827639Sgblack@eecs.umich.edu                               true, true, VfpRoundNearest);
21837639Sgblack@eecs.umich.edu        } else if (flushToZero(srcReg1, srcReg2)) {
21847639Sgblack@eecs.umich.edu            fpscr.idc = 1;
21857639Sgblack@eecs.umich.edu        }
21867783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
21877639Sgblack@eecs.umich.edu    '''
21887760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vmin", "VminDFp", "SimdFloatCmpOp", ("float",), 2, vminfpCode)
21897760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vmin", "VminQFp", "SimdFloatCmpOp", ("float",), 4, vminfpCode)
21907639Sgblack@eecs.umich.edu
21917760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vpmax", "VpmaxDFp", "SimdFloatCmpOp", ("float",),
21927639Sgblack@eecs.umich.edu                        2, vmaxfpCode, pairwise=True)
21937760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vpmax", "VpmaxQFp", "SimdFloatCmpOp", ("float",),
21947639Sgblack@eecs.umich.edu                        4, vmaxfpCode, pairwise=True)
21957639Sgblack@eecs.umich.edu
21967760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vpmin", "VpminDFp", "SimdFloatCmpOp", ("float",),
21977639Sgblack@eecs.umich.edu                        2, vminfpCode, pairwise=True)
21987760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vpmin", "VpminQFp", "SimdFloatCmpOp", ("float",),
21997639Sgblack@eecs.umich.edu                        4, vminfpCode, pairwise=True)
22007639Sgblack@eecs.umich.edu
22017639Sgblack@eecs.umich.edu    vaddfpCode = '''
22027783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
22037639Sgblack@eecs.umich.edu        destReg = binaryOp(fpscr, srcReg1, srcReg2, fpAddS,
22047639Sgblack@eecs.umich.edu                           true, true, VfpRoundNearest);
22057783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
22067639Sgblack@eecs.umich.edu    '''
22077760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vadd", "VaddDFp", "SimdFloatAddOp", ("float",), 2, vaddfpCode)
22087760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vadd", "VaddQFp", "SimdFloatAddOp", ("float",), 4, vaddfpCode)
22097639Sgblack@eecs.umich.edu
22107760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vpadd", "VpaddDFp", "SimdFloatAddOp", ("float",),
22117639Sgblack@eecs.umich.edu                        2, vaddfpCode, pairwise=True)
22127760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vpadd", "VpaddQFp", "SimdFloatAddOp", ("float",),
22137639Sgblack@eecs.umich.edu                        4, vaddfpCode, pairwise=True)
22147639Sgblack@eecs.umich.edu
22157639Sgblack@eecs.umich.edu    vsubfpCode = '''
22167783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
22177639Sgblack@eecs.umich.edu        destReg = binaryOp(fpscr, srcReg1, srcReg2, fpSubS,
22187639Sgblack@eecs.umich.edu                           true, true, VfpRoundNearest);
22197783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
22207639Sgblack@eecs.umich.edu    '''
22217760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vsub", "VsubDFp", "SimdFloatAddOp", ("float",), 2, vsubfpCode)
22227760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vsub", "VsubQFp", "SimdFloatAddOp", ("float",), 4, vsubfpCode)
22237639Sgblack@eecs.umich.edu
22247639Sgblack@eecs.umich.edu    vmulfpCode = '''
22257783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
22267639Sgblack@eecs.umich.edu        destReg = binaryOp(fpscr, srcReg1, srcReg2, fpMulS,
22277639Sgblack@eecs.umich.edu                           true, true, VfpRoundNearest);
22287783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
22297639Sgblack@eecs.umich.edu    '''
22307760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vmul", "NVmulDFp", "SimdFloatMultOp", ("float",), 2, vmulfpCode)
22317760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vmul", "NVmulQFp", "SimdFloatMultOp", ("float",), 4, vmulfpCode)
22327639Sgblack@eecs.umich.edu
22337639Sgblack@eecs.umich.edu    vmlafpCode = '''
22347783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
22357639Sgblack@eecs.umich.edu        float mid = binaryOp(fpscr, srcReg1, srcReg2, fpMulS,
22367639Sgblack@eecs.umich.edu                             true, true, VfpRoundNearest);
22377639Sgblack@eecs.umich.edu        destReg = binaryOp(fpscr, mid, destReg, fpAddS,
22387639Sgblack@eecs.umich.edu                           true, true, VfpRoundNearest);
22397783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
22407639Sgblack@eecs.umich.edu    '''
22417760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vmla", "NVmlaDFp", "SimdFloatMultAccOp", ("float",), 2, vmlafpCode, True)
22427760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vmla", "NVmlaQFp", "SimdFloatMultAccOp", ("float",), 4, vmlafpCode, True)
22437639Sgblack@eecs.umich.edu
22447639Sgblack@eecs.umich.edu    vmlsfpCode = '''
22457783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
22467639Sgblack@eecs.umich.edu        float mid = binaryOp(fpscr, srcReg1, srcReg2, fpMulS,
22477639Sgblack@eecs.umich.edu                             true, true, VfpRoundNearest);
22487639Sgblack@eecs.umich.edu        destReg = binaryOp(fpscr, destReg, mid, fpSubS,
22497639Sgblack@eecs.umich.edu                           true, true, VfpRoundNearest);
22507783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
22517639Sgblack@eecs.umich.edu    '''
22527760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vmls", "NVmlsDFp", "SimdFloatMultAccOp", ("float",), 2, vmlsfpCode, True)
22537760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vmls", "NVmlsQFp", "SimdFloatMultAccOp", ("float",), 4, vmlsfpCode, True)
22547639Sgblack@eecs.umich.edu
22557639Sgblack@eecs.umich.edu    vcgtfpCode = '''
22567783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
22577639Sgblack@eecs.umich.edu        float res = binaryOp(fpscr, srcReg1, srcReg2, vcgtFunc,
22587639Sgblack@eecs.umich.edu                             true, true, VfpRoundNearest);
22597639Sgblack@eecs.umich.edu        destReg = (res == 0) ? -1 : 0;
22607639Sgblack@eecs.umich.edu        if (res == 2.0)
22617639Sgblack@eecs.umich.edu            fpscr.ioc = 1;
22627783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
22637639Sgblack@eecs.umich.edu    '''
22647760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vcgt", "VcgtDFp", "SimdFloatCmpOp", ("float",),
22657639Sgblack@eecs.umich.edu            2, vcgtfpCode, toInt = True)
22667760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vcgt", "VcgtQFp", "SimdFloatCmpOp", ("float",),
22677639Sgblack@eecs.umich.edu            4, vcgtfpCode, toInt = True)
22687639Sgblack@eecs.umich.edu
22697639Sgblack@eecs.umich.edu    vcgefpCode = '''
22707783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
22717639Sgblack@eecs.umich.edu        float res = binaryOp(fpscr, srcReg1, srcReg2, vcgeFunc,
22727639Sgblack@eecs.umich.edu                             true, true, VfpRoundNearest);
22737639Sgblack@eecs.umich.edu        destReg = (res == 0) ? -1 : 0;
22747639Sgblack@eecs.umich.edu        if (res == 2.0)
22757639Sgblack@eecs.umich.edu            fpscr.ioc = 1;
22767783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
22777639Sgblack@eecs.umich.edu    '''
22787760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vcge", "VcgeDFp", "SimdFloatCmpOp", ("float",),
22797639Sgblack@eecs.umich.edu            2, vcgefpCode, toInt = True)
22807760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vcge", "VcgeQFp", "SimdFloatCmpOp", ("float",),
22817639Sgblack@eecs.umich.edu            4, vcgefpCode, toInt = True)
22827639Sgblack@eecs.umich.edu
22837639Sgblack@eecs.umich.edu    vacgtfpCode = '''
22847783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
22857639Sgblack@eecs.umich.edu        float res = binaryOp(fpscr, srcReg1, srcReg2, vacgtFunc,
22867639Sgblack@eecs.umich.edu                             true, true, VfpRoundNearest);
22877639Sgblack@eecs.umich.edu        destReg = (res == 0) ? -1 : 0;
22887639Sgblack@eecs.umich.edu        if (res == 2.0)
22897639Sgblack@eecs.umich.edu            fpscr.ioc = 1;
22907783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
22917639Sgblack@eecs.umich.edu    '''
22927760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vacgt", "VacgtDFp", "SimdFloatCmpOp", ("float",),
22937639Sgblack@eecs.umich.edu            2, vacgtfpCode, toInt = True)
22947760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vacgt", "VacgtQFp", "SimdFloatCmpOp", ("float",),
22957639Sgblack@eecs.umich.edu            4, vacgtfpCode, toInt = True)
22967639Sgblack@eecs.umich.edu
22977639Sgblack@eecs.umich.edu    vacgefpCode = '''
22987783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
22997639Sgblack@eecs.umich.edu        float res = binaryOp(fpscr, srcReg1, srcReg2, vacgeFunc,
23007639Sgblack@eecs.umich.edu                             true, true, VfpRoundNearest);
23017639Sgblack@eecs.umich.edu        destReg = (res == 0) ? -1 : 0;
23027639Sgblack@eecs.umich.edu        if (res == 2.0)
23037639Sgblack@eecs.umich.edu            fpscr.ioc = 1;
23047783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
23057639Sgblack@eecs.umich.edu    '''
23067760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vacge", "VacgeDFp", "SimdFloatCmpOp", ("float",),
23077639Sgblack@eecs.umich.edu            2, vacgefpCode, toInt = True)
23087760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vacge", "VacgeQFp", "SimdFloatCmpOp", ("float",),
23097639Sgblack@eecs.umich.edu            4, vacgefpCode, toInt = True)
23107639Sgblack@eecs.umich.edu
23117639Sgblack@eecs.umich.edu    vceqfpCode = '''
23127783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
23137639Sgblack@eecs.umich.edu        float res = binaryOp(fpscr, srcReg1, srcReg2, vceqFunc,
23147639Sgblack@eecs.umich.edu                             true, true, VfpRoundNearest);
23157639Sgblack@eecs.umich.edu        destReg = (res == 0) ? -1 : 0;
23167639Sgblack@eecs.umich.edu        if (res == 2.0)
23177639Sgblack@eecs.umich.edu            fpscr.ioc = 1;
23187783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
23197639Sgblack@eecs.umich.edu    '''
23207760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vceq", "VceqDFp", "SimdFloatCmpOp", ("float",),
23217639Sgblack@eecs.umich.edu            2, vceqfpCode, toInt = True)
23227760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vceq", "VceqQFp", "SimdFloatCmpOp", ("float",),
23237639Sgblack@eecs.umich.edu            4, vceqfpCode, toInt = True)
23247639Sgblack@eecs.umich.edu
23257639Sgblack@eecs.umich.edu    vrecpsCode = '''
23267783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
23277639Sgblack@eecs.umich.edu        destReg = binaryOp(fpscr, srcReg1, srcReg2, fpRecpsS,
23287639Sgblack@eecs.umich.edu                           true, true, VfpRoundNearest);
23297783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
23307639Sgblack@eecs.umich.edu    '''
23317760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vrecps", "VrecpsDFp", "SimdFloatMultAccOp", ("float",), 2, vrecpsCode)
23327760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vrecps", "VrecpsQFp", "SimdFloatMultAccOp", ("float",), 4, vrecpsCode)
23337639Sgblack@eecs.umich.edu
23347639Sgblack@eecs.umich.edu    vrsqrtsCode = '''
23357783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
23367639Sgblack@eecs.umich.edu        destReg = binaryOp(fpscr, srcReg1, srcReg2, fpRSqrtsS,
23377639Sgblack@eecs.umich.edu                           true, true, VfpRoundNearest);
23387783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
23397639Sgblack@eecs.umich.edu    '''
23407760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vrsqrts", "VrsqrtsDFp", "SimdFloatMiscOp", ("float",), 2, vrsqrtsCode)
23417760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vrsqrts", "VrsqrtsQFp", "SimdFloatMiscOp", ("float",), 4, vrsqrtsCode)
23427639Sgblack@eecs.umich.edu
23437639Sgblack@eecs.umich.edu    vabdfpCode = '''
23447783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
23457639Sgblack@eecs.umich.edu        float mid = binaryOp(fpscr, srcReg1, srcReg2, fpSubS,
23467639Sgblack@eecs.umich.edu                             true, true, VfpRoundNearest);
23477639Sgblack@eecs.umich.edu        destReg = fabs(mid);
23487783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
23497639Sgblack@eecs.umich.edu    '''
23507760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vabd", "VabdDFp", "SimdFloatAddOp", ("float",), 2, vabdfpCode)
23517760SGiacomo.Gabrielli@arm.com    threeEqualRegInstFp("vabd", "VabdQFp", "SimdFloatAddOp", ("float",), 4, vabdfpCode)
23527639Sgblack@eecs.umich.edu
23537760SGiacomo.Gabrielli@arm.com    twoEqualRegInst("vmla", "VmlasD", "SimdMultAccOp", unsignedTypes, 2, vmlaCode, True)
23547760SGiacomo.Gabrielli@arm.com    twoEqualRegInst("vmla", "VmlasQ", "SimdMultAccOp", unsignedTypes, 4, vmlaCode, True)
23557760SGiacomo.Gabrielli@arm.com    twoEqualRegInstFp("vmla", "VmlasDFp", "SimdFloatMultAccOp", ("float",), 2, vmlafpCode, True)
23567760SGiacomo.Gabrielli@arm.com    twoEqualRegInstFp("vmla", "VmlasQFp", "SimdFloatMultAccOp", ("float",), 4, vmlafpCode, True)
23577760SGiacomo.Gabrielli@arm.com    twoRegLongInst("vmlal", "Vmlals", "SimdMultAccOp", smallTypes, vmlalCode, True)
23587639Sgblack@eecs.umich.edu
23597760SGiacomo.Gabrielli@arm.com    twoEqualRegInst("vmls", "VmlssD", "SimdMultAccOp", allTypes, 2, vmlsCode, True)
23607760SGiacomo.Gabrielli@arm.com    twoEqualRegInst("vmls", "VmlssQ", "SimdMultAccOp", allTypes, 4, vmlsCode, True)
23617760SGiacomo.Gabrielli@arm.com    twoEqualRegInstFp("vmls", "VmlssDFp", "SimdFloatMultAccOp", ("float",), 2, vmlsfpCode, True)
23627760SGiacomo.Gabrielli@arm.com    twoEqualRegInstFp("vmls", "VmlssQFp", "SimdFloatMultAccOp", ("float",), 4, vmlsfpCode, True)
23637760SGiacomo.Gabrielli@arm.com    twoRegLongInst("vmlsl", "Vmlsls", "SimdMultAccOp", smallTypes, vmlslCode, True)
23647639Sgblack@eecs.umich.edu
23657760SGiacomo.Gabrielli@arm.com    twoEqualRegInst("vmul", "VmulsD", "SimdMultOp", allTypes, 2, vmulCode)
23667760SGiacomo.Gabrielli@arm.com    twoEqualRegInst("vmul", "VmulsQ", "SimdMultOp", allTypes, 4, vmulCode)
23677760SGiacomo.Gabrielli@arm.com    twoEqualRegInstFp("vmul", "VmulsDFp", "SimdFloatMultOp", ("float",), 2, vmulfpCode)
23687760SGiacomo.Gabrielli@arm.com    twoEqualRegInstFp("vmul", "VmulsQFp", "SimdFloatMultOp", ("float",), 4, vmulfpCode)
23697760SGiacomo.Gabrielli@arm.com    twoRegLongInst("vmull", "Vmulls", "SimdMultOp", smallTypes, vmullCode)
23707639Sgblack@eecs.umich.edu
23717760SGiacomo.Gabrielli@arm.com    twoRegLongInst("vqdmull", "Vqdmulls", "SimdMultOp", smallTypes, vqdmullCode)
23727760SGiacomo.Gabrielli@arm.com    twoRegLongInst("vqdmlal", "Vqdmlals", "SimdMultAccOp", smallTypes, vqdmlalCode, True)
23737760SGiacomo.Gabrielli@arm.com    twoRegLongInst("vqdmlsl", "Vqdmlsls", "SimdMultAccOp", smallTypes, vqdmlslCode, True)
23747760SGiacomo.Gabrielli@arm.com    twoEqualRegInst("vqdmulh", "VqdmulhsD", "SimdMultOp", smallSignedTypes, 2, vqdmulhCode)
23757760SGiacomo.Gabrielli@arm.com    twoEqualRegInst("vqdmulh", "VqdmulhsQ", "SimdMultOp", smallSignedTypes, 4, vqdmulhCode)
23767639Sgblack@eecs.umich.edu    twoEqualRegInst("vqrdmulh", "VqrdmulhsD",
23777760SGiacomo.Gabrielli@arm.com            "SimdMultOp", smallSignedTypes, 2, vqrdmulhCode)
23787639Sgblack@eecs.umich.edu    twoEqualRegInst("vqrdmulh", "VqrdmulhsQ",
23797760SGiacomo.Gabrielli@arm.com            "SimdMultOp", smallSignedTypes, 4, vqrdmulhCode)
23807639Sgblack@eecs.umich.edu
23817639Sgblack@eecs.umich.edu    vshrCode = '''
23827639Sgblack@eecs.umich.edu        if (imm >= sizeof(srcElem1) * 8) {
23837641Sgblack@eecs.umich.edu            if (ltz(srcElem1))
23847639Sgblack@eecs.umich.edu                destElem = -1;
23857639Sgblack@eecs.umich.edu            else
23867639Sgblack@eecs.umich.edu                destElem = 0;
23877639Sgblack@eecs.umich.edu        } else {
23887639Sgblack@eecs.umich.edu            destElem = srcElem1 >> imm;
23897639Sgblack@eecs.umich.edu        }
23907639Sgblack@eecs.umich.edu    '''
23917760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vshr", "NVshrD", "SimdShiftOp", allTypes, 2, vshrCode)
23927760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vshr", "NVshrQ", "SimdShiftOp", allTypes, 4, vshrCode)
23937639Sgblack@eecs.umich.edu
23947639Sgblack@eecs.umich.edu    vsraCode = '''
23957639Sgblack@eecs.umich.edu        Element mid;;
23967639Sgblack@eecs.umich.edu        if (imm >= sizeof(srcElem1) * 8) {
23977641Sgblack@eecs.umich.edu            mid = ltz(srcElem1) ? -1 : 0;
23987639Sgblack@eecs.umich.edu        } else {
23997639Sgblack@eecs.umich.edu            mid = srcElem1 >> imm;
24007641Sgblack@eecs.umich.edu            if (ltz(srcElem1) && !ltz(mid)) {
24017639Sgblack@eecs.umich.edu                mid |= -(mid & ((Element)1 <<
24027639Sgblack@eecs.umich.edu                            (sizeof(Element) * 8 - 1 - imm)));
24037639Sgblack@eecs.umich.edu            }
24047639Sgblack@eecs.umich.edu        }
24057639Sgblack@eecs.umich.edu        destElem += mid;
24067639Sgblack@eecs.umich.edu    '''
24077760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vsra", "NVsraD", "SimdShiftAccOp", allTypes, 2, vsraCode, True)
24087760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vsra", "NVsraQ", "SimdShiftAccOp", allTypes, 4, vsraCode, True)
24097639Sgblack@eecs.umich.edu
24107639Sgblack@eecs.umich.edu    vrshrCode = '''
24117639Sgblack@eecs.umich.edu        if (imm > sizeof(srcElem1) * 8) {
24127639Sgblack@eecs.umich.edu            destElem = 0;
24137639Sgblack@eecs.umich.edu        } else if (imm) {
24147639Sgblack@eecs.umich.edu            Element rBit = bits(srcElem1, imm - 1);
24157639Sgblack@eecs.umich.edu            destElem = ((srcElem1 >> (imm - 1)) >> 1) + rBit;
24167639Sgblack@eecs.umich.edu        } else {
24177639Sgblack@eecs.umich.edu            destElem = srcElem1;
24187639Sgblack@eecs.umich.edu        }
24197639Sgblack@eecs.umich.edu    '''
24207760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vrshr", "NVrshrD", "SimdShiftOp", allTypes, 2, vrshrCode)
24217760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vrshr", "NVrshrQ", "SimdShiftOp", allTypes, 4, vrshrCode)
24227639Sgblack@eecs.umich.edu
24237639Sgblack@eecs.umich.edu    vrsraCode = '''
24247639Sgblack@eecs.umich.edu        if (imm > sizeof(srcElem1) * 8) {
24257639Sgblack@eecs.umich.edu            destElem += 0;
24267639Sgblack@eecs.umich.edu        } else if (imm) {
24277639Sgblack@eecs.umich.edu            Element rBit = bits(srcElem1, imm - 1);
24287639Sgblack@eecs.umich.edu            destElem += ((srcElem1 >> (imm - 1)) >> 1) + rBit;
24297639Sgblack@eecs.umich.edu        } else {
24307639Sgblack@eecs.umich.edu            destElem += srcElem1;
24317639Sgblack@eecs.umich.edu        }
24327639Sgblack@eecs.umich.edu    '''
24337760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vrsra", "NVrsraD", "SimdShiftAccOp", allTypes, 2, vrsraCode, True)
24347760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vrsra", "NVrsraQ", "SimdShiftAccOp", allTypes, 4, vrsraCode, True)
24357639Sgblack@eecs.umich.edu
24367639Sgblack@eecs.umich.edu    vsriCode = '''
24377639Sgblack@eecs.umich.edu        if (imm >= sizeof(Element) * 8)
24387639Sgblack@eecs.umich.edu            destElem = destElem;
24397639Sgblack@eecs.umich.edu        else
24407639Sgblack@eecs.umich.edu            destElem = (srcElem1 >> imm) |
24417639Sgblack@eecs.umich.edu                (destElem & ~mask(sizeof(Element) * 8 - imm));
24427639Sgblack@eecs.umich.edu    '''
24437760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vsri", "NVsriD", "SimdShiftOp", unsignedTypes, 2, vsriCode, True)
24447760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vsri", "NVsriQ", "SimdShiftOp", unsignedTypes, 4, vsriCode, True)
24457639Sgblack@eecs.umich.edu
24467639Sgblack@eecs.umich.edu    vshlCode = '''
24477639Sgblack@eecs.umich.edu        if (imm >= sizeof(Element) * 8)
24487639Sgblack@eecs.umich.edu            destElem = (srcElem1 << (sizeof(Element) * 8 - 1)) << 1;
24497639Sgblack@eecs.umich.edu        else
24507639Sgblack@eecs.umich.edu            destElem = srcElem1 << imm;
24517639Sgblack@eecs.umich.edu    '''
24527760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vshl", "NVshlD", "SimdShiftOp", unsignedTypes, 2, vshlCode)
24537760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vshl", "NVshlQ", "SimdShiftOp", unsignedTypes, 4, vshlCode)
24547639Sgblack@eecs.umich.edu
24557639Sgblack@eecs.umich.edu    vsliCode = '''
24567639Sgblack@eecs.umich.edu        if (imm >= sizeof(Element) * 8)
24577639Sgblack@eecs.umich.edu            destElem = destElem;
24587639Sgblack@eecs.umich.edu        else
24597639Sgblack@eecs.umich.edu            destElem = (srcElem1 << imm) | (destElem & mask(imm));
24607639Sgblack@eecs.umich.edu    '''
24617760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vsli", "NVsliD", "SimdShiftOp", unsignedTypes, 2, vsliCode, True)
24627760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vsli", "NVsliQ", "SimdShiftOp", unsignedTypes, 4, vsliCode, True)
24637639Sgblack@eecs.umich.edu
24647639Sgblack@eecs.umich.edu    vqshlCode = '''
24657783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
24667639Sgblack@eecs.umich.edu        if (imm >= sizeof(Element) * 8) {
24677639Sgblack@eecs.umich.edu            if (srcElem1 != 0) {
24687639Sgblack@eecs.umich.edu                destElem = (Element)1 << (sizeof(Element) * 8 - 1);
24697639Sgblack@eecs.umich.edu                if (srcElem1 > 0)
24707639Sgblack@eecs.umich.edu                    destElem = ~destElem;
24717639Sgblack@eecs.umich.edu                fpscr.qc = 1;
24727639Sgblack@eecs.umich.edu            } else {
24737639Sgblack@eecs.umich.edu                destElem = 0;
24747639Sgblack@eecs.umich.edu            }
24757639Sgblack@eecs.umich.edu        } else if (imm) {
24767639Sgblack@eecs.umich.edu            destElem = (srcElem1 << imm);
24777639Sgblack@eecs.umich.edu            uint64_t topBits = bits((uint64_t)srcElem1,
24787639Sgblack@eecs.umich.edu                                    sizeof(Element) * 8 - 1,
24797639Sgblack@eecs.umich.edu                                    sizeof(Element) * 8 - 1 - imm);
24807639Sgblack@eecs.umich.edu            if (topBits != 0 && topBits != mask(imm + 1)) {
24817639Sgblack@eecs.umich.edu                destElem = (Element)1 << (sizeof(Element) * 8 - 1);
24827639Sgblack@eecs.umich.edu                if (srcElem1 > 0)
24837639Sgblack@eecs.umich.edu                    destElem = ~destElem;
24847639Sgblack@eecs.umich.edu                fpscr.qc = 1;
24857639Sgblack@eecs.umich.edu            }
24867639Sgblack@eecs.umich.edu        } else {
24877639Sgblack@eecs.umich.edu            destElem = srcElem1;
24887639Sgblack@eecs.umich.edu        }
24897783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
24907639Sgblack@eecs.umich.edu    '''
24917760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vqshl", "NVqshlD", "SimdShiftOp", signedTypes, 2, vqshlCode)
24927760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vqshl", "NVqshlQ", "SimdShiftOp", signedTypes, 4, vqshlCode)
24937639Sgblack@eecs.umich.edu
24947639Sgblack@eecs.umich.edu    vqshluCode = '''
24957783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
24967639Sgblack@eecs.umich.edu        if (imm >= sizeof(Element) * 8) {
24977639Sgblack@eecs.umich.edu            if (srcElem1 != 0) {
24987639Sgblack@eecs.umich.edu                destElem = mask(sizeof(Element) * 8);
24997639Sgblack@eecs.umich.edu                fpscr.qc = 1;
25007639Sgblack@eecs.umich.edu            } else {
25017639Sgblack@eecs.umich.edu                destElem = 0;
25027639Sgblack@eecs.umich.edu            }
25037639Sgblack@eecs.umich.edu        } else if (imm) {
25047639Sgblack@eecs.umich.edu            destElem = (srcElem1 << imm);
25057639Sgblack@eecs.umich.edu            uint64_t topBits = bits((uint64_t)srcElem1,
25067639Sgblack@eecs.umich.edu                                    sizeof(Element) * 8 - 1,
25077639Sgblack@eecs.umich.edu                                    sizeof(Element) * 8 - imm);
25087639Sgblack@eecs.umich.edu            if (topBits != 0) {
25097639Sgblack@eecs.umich.edu                destElem = mask(sizeof(Element) * 8);
25107639Sgblack@eecs.umich.edu                fpscr.qc = 1;
25117639Sgblack@eecs.umich.edu            }
25127639Sgblack@eecs.umich.edu        } else {
25137639Sgblack@eecs.umich.edu            destElem = srcElem1;
25147639Sgblack@eecs.umich.edu        }
25157783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
25167639Sgblack@eecs.umich.edu    '''
25177760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vqshlu", "NVqshluD", "SimdShiftOp", unsignedTypes, 2, vqshluCode)
25187760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vqshlu", "NVqshluQ", "SimdShiftOp", unsignedTypes, 4, vqshluCode)
25197639Sgblack@eecs.umich.edu
25207639Sgblack@eecs.umich.edu    vqshlusCode = '''
25217783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
25227639Sgblack@eecs.umich.edu        if (imm >= sizeof(Element) * 8) {
25237639Sgblack@eecs.umich.edu            if (srcElem1 < 0) {
25247639Sgblack@eecs.umich.edu                destElem = 0;
25257639Sgblack@eecs.umich.edu                fpscr.qc = 1;
25267639Sgblack@eecs.umich.edu            } else if (srcElem1 > 0) {
25277639Sgblack@eecs.umich.edu                destElem = mask(sizeof(Element) * 8);
25287639Sgblack@eecs.umich.edu                fpscr.qc = 1;
25297639Sgblack@eecs.umich.edu            } else {
25307639Sgblack@eecs.umich.edu                destElem = 0;
25317639Sgblack@eecs.umich.edu            }
25327639Sgblack@eecs.umich.edu        } else if (imm) {
25337639Sgblack@eecs.umich.edu            destElem = (srcElem1 << imm);
25347639Sgblack@eecs.umich.edu            uint64_t topBits = bits((uint64_t)srcElem1,
25357639Sgblack@eecs.umich.edu                                    sizeof(Element) * 8 - 1,
25367639Sgblack@eecs.umich.edu                                    sizeof(Element) * 8 - imm);
25377639Sgblack@eecs.umich.edu            if (srcElem1 < 0) {
25387639Sgblack@eecs.umich.edu                destElem = 0;
25397639Sgblack@eecs.umich.edu                fpscr.qc = 1;
25407639Sgblack@eecs.umich.edu            } else if (topBits != 0) {
25417639Sgblack@eecs.umich.edu                destElem = mask(sizeof(Element) * 8);
25427639Sgblack@eecs.umich.edu                fpscr.qc = 1;
25437639Sgblack@eecs.umich.edu            }
25447639Sgblack@eecs.umich.edu        } else {
25457639Sgblack@eecs.umich.edu            if (srcElem1 < 0) {
25467639Sgblack@eecs.umich.edu                fpscr.qc = 1;
25477639Sgblack@eecs.umich.edu                destElem = 0;
25487639Sgblack@eecs.umich.edu            } else {
25497639Sgblack@eecs.umich.edu                destElem = srcElem1;
25507639Sgblack@eecs.umich.edu            }
25517639Sgblack@eecs.umich.edu        }
25527783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
25537639Sgblack@eecs.umich.edu    '''
25547760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vqshlus", "NVqshlusD", "SimdShiftOp", signedTypes, 2, vqshlusCode)
25557760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vqshlus", "NVqshlusQ", "SimdShiftOp", signedTypes, 4, vqshlusCode)
25567639Sgblack@eecs.umich.edu
25577639Sgblack@eecs.umich.edu    vshrnCode = '''
25587639Sgblack@eecs.umich.edu        if (imm >= sizeof(srcElem1) * 8) {
25597639Sgblack@eecs.umich.edu            destElem = 0;
25607639Sgblack@eecs.umich.edu        } else {
25617639Sgblack@eecs.umich.edu            destElem = srcElem1 >> imm;
25627639Sgblack@eecs.umich.edu        }
25637639Sgblack@eecs.umich.edu    '''
25647760SGiacomo.Gabrielli@arm.com    twoRegNarrowShiftInst("vshrn", "NVshrn", "SimdShiftOp", smallUnsignedTypes, vshrnCode)
25657639Sgblack@eecs.umich.edu
25667639Sgblack@eecs.umich.edu    vrshrnCode = '''
25677639Sgblack@eecs.umich.edu        if (imm > sizeof(srcElem1) * 8) {
25687639Sgblack@eecs.umich.edu            destElem = 0;
25697639Sgblack@eecs.umich.edu        } else if (imm) {
25707639Sgblack@eecs.umich.edu            Element rBit = bits(srcElem1, imm - 1);
25717639Sgblack@eecs.umich.edu            destElem = ((srcElem1 >> (imm - 1)) >> 1) + rBit;
25727639Sgblack@eecs.umich.edu        } else {
25737639Sgblack@eecs.umich.edu            destElem = srcElem1;
25747639Sgblack@eecs.umich.edu        }
25757639Sgblack@eecs.umich.edu    '''
25767760SGiacomo.Gabrielli@arm.com    twoRegNarrowShiftInst("vrshrn", "NVrshrn", "SimdShiftOp", smallUnsignedTypes, vrshrnCode)
25777639Sgblack@eecs.umich.edu
25787639Sgblack@eecs.umich.edu    vqshrnCode = '''
25797783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
25807639Sgblack@eecs.umich.edu        if (imm > sizeof(srcElem1) * 8) {
25817639Sgblack@eecs.umich.edu            if (srcElem1 != 0 && srcElem1 != -1)
25827639Sgblack@eecs.umich.edu                fpscr.qc = 1;
25837639Sgblack@eecs.umich.edu            destElem = 0;
25847639Sgblack@eecs.umich.edu        } else if (imm) {
25857639Sgblack@eecs.umich.edu            BigElement mid = ((srcElem1 >> (imm - 1)) >> 1);
25867639Sgblack@eecs.umich.edu            mid |= -(mid & ((BigElement)1 <<
25877639Sgblack@eecs.umich.edu                        (sizeof(BigElement) * 8 - 1 - imm)));
25887639Sgblack@eecs.umich.edu            if (mid != (Element)mid) {
25897639Sgblack@eecs.umich.edu                destElem = mask(sizeof(Element) * 8 - 1);
25907639Sgblack@eecs.umich.edu                if (srcElem1 < 0)
25917639Sgblack@eecs.umich.edu                    destElem = ~destElem;
25927639Sgblack@eecs.umich.edu                fpscr.qc = 1;
25937639Sgblack@eecs.umich.edu            } else {
25947639Sgblack@eecs.umich.edu                destElem = mid;
25957639Sgblack@eecs.umich.edu            }
25967639Sgblack@eecs.umich.edu        } else {
25977639Sgblack@eecs.umich.edu            destElem = srcElem1;
25987639Sgblack@eecs.umich.edu        }
25997783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
26007639Sgblack@eecs.umich.edu    '''
26017760SGiacomo.Gabrielli@arm.com    twoRegNarrowShiftInst("vqshrn", "NVqshrn", "SimdShiftOp", smallSignedTypes, vqshrnCode)
26027639Sgblack@eecs.umich.edu
26037639Sgblack@eecs.umich.edu    vqshrunCode = '''
26047783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
26057639Sgblack@eecs.umich.edu        if (imm > sizeof(srcElem1) * 8) {
26067639Sgblack@eecs.umich.edu            if (srcElem1 != 0)
26077639Sgblack@eecs.umich.edu                fpscr.qc = 1;
26087639Sgblack@eecs.umich.edu            destElem = 0;
26097639Sgblack@eecs.umich.edu        } else if (imm) {
26107639Sgblack@eecs.umich.edu            BigElement mid = ((srcElem1 >> (imm - 1)) >> 1);
26117639Sgblack@eecs.umich.edu            if (mid != (Element)mid) {
26127639Sgblack@eecs.umich.edu                destElem = mask(sizeof(Element) * 8);
26137639Sgblack@eecs.umich.edu                fpscr.qc = 1;
26147639Sgblack@eecs.umich.edu            } else {
26157639Sgblack@eecs.umich.edu                destElem = mid;
26167639Sgblack@eecs.umich.edu            }
26177639Sgblack@eecs.umich.edu        } else {
26187639Sgblack@eecs.umich.edu            destElem = srcElem1;
26197639Sgblack@eecs.umich.edu        }
26207783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
26217639Sgblack@eecs.umich.edu    '''
26227639Sgblack@eecs.umich.edu    twoRegNarrowShiftInst("vqshrun", "NVqshrun",
26237760SGiacomo.Gabrielli@arm.com                          "SimdShiftOp", smallUnsignedTypes, vqshrunCode)
26247639Sgblack@eecs.umich.edu
26257639Sgblack@eecs.umich.edu    vqshrunsCode = '''
26267783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
26277639Sgblack@eecs.umich.edu        if (imm > sizeof(srcElem1) * 8) {
26287639Sgblack@eecs.umich.edu            if (srcElem1 != 0)
26297639Sgblack@eecs.umich.edu                fpscr.qc = 1;
26307639Sgblack@eecs.umich.edu            destElem = 0;
26317639Sgblack@eecs.umich.edu        } else if (imm) {
26327639Sgblack@eecs.umich.edu            BigElement mid = ((srcElem1 >> (imm - 1)) >> 1);
26337639Sgblack@eecs.umich.edu            if (bits(mid, sizeof(BigElement) * 8 - 1,
26347639Sgblack@eecs.umich.edu                          sizeof(Element) * 8) != 0) {
26357639Sgblack@eecs.umich.edu                if (srcElem1 < 0) {
26367639Sgblack@eecs.umich.edu                    destElem = 0;
26377639Sgblack@eecs.umich.edu                } else {
26387639Sgblack@eecs.umich.edu                    destElem = mask(sizeof(Element) * 8);
26397639Sgblack@eecs.umich.edu                }
26407639Sgblack@eecs.umich.edu                fpscr.qc = 1;
26417639Sgblack@eecs.umich.edu            } else {
26427639Sgblack@eecs.umich.edu                destElem = mid;
26437639Sgblack@eecs.umich.edu            }
26447639Sgblack@eecs.umich.edu        } else {
26457639Sgblack@eecs.umich.edu            destElem = srcElem1;
26467639Sgblack@eecs.umich.edu        }
26477783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
26487639Sgblack@eecs.umich.edu    '''
26497639Sgblack@eecs.umich.edu    twoRegNarrowShiftInst("vqshrun", "NVqshruns",
26507760SGiacomo.Gabrielli@arm.com                          "SimdShiftOp", smallSignedTypes, vqshrunsCode)
26517639Sgblack@eecs.umich.edu
26527639Sgblack@eecs.umich.edu    vqrshrnCode = '''
26537783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
26547639Sgblack@eecs.umich.edu        if (imm > sizeof(srcElem1) * 8) {
26557639Sgblack@eecs.umich.edu            if (srcElem1 != 0 && srcElem1 != -1)
26567639Sgblack@eecs.umich.edu                fpscr.qc = 1;
26577639Sgblack@eecs.umich.edu            destElem = 0;
26587639Sgblack@eecs.umich.edu        } else if (imm) {
26597639Sgblack@eecs.umich.edu            BigElement mid = (srcElem1 >> (imm - 1));
26607639Sgblack@eecs.umich.edu            uint64_t rBit = mid & 0x1;
26617639Sgblack@eecs.umich.edu            mid >>= 1;
26627639Sgblack@eecs.umich.edu            mid |= -(mid & ((BigElement)1 <<
26637639Sgblack@eecs.umich.edu                        (sizeof(BigElement) * 8 - 1 - imm)));
26647639Sgblack@eecs.umich.edu            mid += rBit;
26657639Sgblack@eecs.umich.edu            if (mid != (Element)mid) {
26667639Sgblack@eecs.umich.edu                destElem = mask(sizeof(Element) * 8 - 1);
26677639Sgblack@eecs.umich.edu                if (srcElem1 < 0)
26687639Sgblack@eecs.umich.edu                    destElem = ~destElem;
26697639Sgblack@eecs.umich.edu                fpscr.qc = 1;
26707639Sgblack@eecs.umich.edu            } else {
26717639Sgblack@eecs.umich.edu                destElem = mid;
26727639Sgblack@eecs.umich.edu            }
26737639Sgblack@eecs.umich.edu        } else {
26747639Sgblack@eecs.umich.edu            if (srcElem1 != (Element)srcElem1) {
26757639Sgblack@eecs.umich.edu                destElem = mask(sizeof(Element) * 8 - 1);
26767639Sgblack@eecs.umich.edu                if (srcElem1 < 0)
26777639Sgblack@eecs.umich.edu                    destElem = ~destElem;
26787639Sgblack@eecs.umich.edu                fpscr.qc = 1;
26797639Sgblack@eecs.umich.edu            } else {
26807639Sgblack@eecs.umich.edu                destElem = srcElem1;
26817639Sgblack@eecs.umich.edu            }
26827639Sgblack@eecs.umich.edu        }
26837783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
26847639Sgblack@eecs.umich.edu    '''
26857639Sgblack@eecs.umich.edu    twoRegNarrowShiftInst("vqrshrn", "NVqrshrn",
26867760SGiacomo.Gabrielli@arm.com                          "SimdShiftOp", smallSignedTypes, vqrshrnCode)
26877639Sgblack@eecs.umich.edu
26887639Sgblack@eecs.umich.edu    vqrshrunCode = '''
26897783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
26907639Sgblack@eecs.umich.edu        if (imm > sizeof(srcElem1) * 8) {
26917639Sgblack@eecs.umich.edu            if (srcElem1 != 0)
26927639Sgblack@eecs.umich.edu                fpscr.qc = 1;
26937639Sgblack@eecs.umich.edu            destElem = 0;
26947639Sgblack@eecs.umich.edu        } else if (imm) {
26957639Sgblack@eecs.umich.edu            BigElement mid = (srcElem1 >> (imm - 1));
26967639Sgblack@eecs.umich.edu            uint64_t rBit = mid & 0x1;
26977639Sgblack@eecs.umich.edu            mid >>= 1;
26987639Sgblack@eecs.umich.edu            mid += rBit;
26997639Sgblack@eecs.umich.edu            if (mid != (Element)mid) {
27007639Sgblack@eecs.umich.edu                destElem = mask(sizeof(Element) * 8);
27017639Sgblack@eecs.umich.edu                fpscr.qc = 1;
27027639Sgblack@eecs.umich.edu            } else {
27037639Sgblack@eecs.umich.edu                destElem = mid;
27047639Sgblack@eecs.umich.edu            }
27057639Sgblack@eecs.umich.edu        } else {
27067639Sgblack@eecs.umich.edu            if (srcElem1 != (Element)srcElem1) {
27077639Sgblack@eecs.umich.edu                destElem = mask(sizeof(Element) * 8 - 1);
27087639Sgblack@eecs.umich.edu                fpscr.qc = 1;
27097639Sgblack@eecs.umich.edu            } else {
27107639Sgblack@eecs.umich.edu                destElem = srcElem1;
27117639Sgblack@eecs.umich.edu            }
27127639Sgblack@eecs.umich.edu        }
27137783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
27147639Sgblack@eecs.umich.edu    '''
27157639Sgblack@eecs.umich.edu    twoRegNarrowShiftInst("vqrshrun", "NVqrshrun",
27167760SGiacomo.Gabrielli@arm.com                          "SimdShiftOp", smallUnsignedTypes, vqrshrunCode)
27177639Sgblack@eecs.umich.edu
27187639Sgblack@eecs.umich.edu    vqrshrunsCode = '''
27197783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
27207639Sgblack@eecs.umich.edu        if (imm > sizeof(srcElem1) * 8) {
27217639Sgblack@eecs.umich.edu            if (srcElem1 != 0)
27227639Sgblack@eecs.umich.edu                fpscr.qc = 1;
27237639Sgblack@eecs.umich.edu            destElem = 0;
27247639Sgblack@eecs.umich.edu        } else if (imm) {
27257639Sgblack@eecs.umich.edu            BigElement mid = (srcElem1 >> (imm - 1));
27267639Sgblack@eecs.umich.edu            uint64_t rBit = mid & 0x1;
27277639Sgblack@eecs.umich.edu            mid >>= 1;
27287639Sgblack@eecs.umich.edu            mid |= -(mid & ((BigElement)1 <<
27297639Sgblack@eecs.umich.edu                            (sizeof(BigElement) * 8 - 1 - imm)));
27307639Sgblack@eecs.umich.edu            mid += rBit;
27317639Sgblack@eecs.umich.edu            if (bits(mid, sizeof(BigElement) * 8 - 1,
27327639Sgblack@eecs.umich.edu                          sizeof(Element) * 8) != 0) {
27337639Sgblack@eecs.umich.edu                if (srcElem1 < 0) {
27347639Sgblack@eecs.umich.edu                    destElem = 0;
27357639Sgblack@eecs.umich.edu                } else {
27367639Sgblack@eecs.umich.edu                    destElem = mask(sizeof(Element) * 8);
27377639Sgblack@eecs.umich.edu                }
27387639Sgblack@eecs.umich.edu                fpscr.qc = 1;
27397639Sgblack@eecs.umich.edu            } else {
27407639Sgblack@eecs.umich.edu                destElem = mid;
27417639Sgblack@eecs.umich.edu            }
27427639Sgblack@eecs.umich.edu        } else {
27437639Sgblack@eecs.umich.edu            if (srcElem1 < 0) {
27447639Sgblack@eecs.umich.edu                fpscr.qc = 1;
27457639Sgblack@eecs.umich.edu                destElem = 0;
27467639Sgblack@eecs.umich.edu            } else {
27477639Sgblack@eecs.umich.edu                destElem = srcElem1;
27487639Sgblack@eecs.umich.edu            }
27497639Sgblack@eecs.umich.edu        }
27507783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
27517639Sgblack@eecs.umich.edu    '''
27527639Sgblack@eecs.umich.edu    twoRegNarrowShiftInst("vqrshrun", "NVqrshruns",
27537760SGiacomo.Gabrielli@arm.com                          "SimdShiftOp", smallSignedTypes, vqrshrunsCode)
27547639Sgblack@eecs.umich.edu
27557639Sgblack@eecs.umich.edu    vshllCode = '''
27567639Sgblack@eecs.umich.edu        if (imm >= sizeof(destElem) * 8) {
27577639Sgblack@eecs.umich.edu            destElem = 0;
27587639Sgblack@eecs.umich.edu        } else {
27597639Sgblack@eecs.umich.edu            destElem = (BigElement)srcElem1 << imm;
27607639Sgblack@eecs.umich.edu        }
27617639Sgblack@eecs.umich.edu    '''
27627760SGiacomo.Gabrielli@arm.com    twoRegLongShiftInst("vshll", "NVshll", "SimdShiftOp", smallTypes, vshllCode)
27637639Sgblack@eecs.umich.edu
27647639Sgblack@eecs.umich.edu    vmovlCode = '''
27657639Sgblack@eecs.umich.edu        destElem = srcElem1;
27667639Sgblack@eecs.umich.edu    '''
27677760SGiacomo.Gabrielli@arm.com    twoRegLongShiftInst("vmovl", "NVmovl", "SimdMiscOp", smallTypes, vmovlCode)
27687639Sgblack@eecs.umich.edu
27697639Sgblack@eecs.umich.edu    vcvt2ufxCode = '''
27707783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
27717639Sgblack@eecs.umich.edu        if (flushToZero(srcElem1))
27727639Sgblack@eecs.umich.edu            fpscr.idc = 1;
27737639Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(VfpRoundNearest);
27747639Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (srcElem1) : "m" (srcElem1));
27757639Sgblack@eecs.umich.edu        destReg = vfpFpSToFixed(srcElem1, false, false, imm);
27767639Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (destReg));
27777639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, true);
27787783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
27797639Sgblack@eecs.umich.edu    '''
27807760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vcvt", "NVcvt2ufxD", "SimdCvtOp", ("float",),
27817639Sgblack@eecs.umich.edu            2, vcvt2ufxCode, toInt = True)
27827760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vcvt", "NVcvt2ufxQ", "SimdCvtOp", ("float",),
27837639Sgblack@eecs.umich.edu            4, vcvt2ufxCode, toInt = True)
27847639Sgblack@eecs.umich.edu
27857639Sgblack@eecs.umich.edu    vcvt2sfxCode = '''
27867783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
27877639Sgblack@eecs.umich.edu        if (flushToZero(srcElem1))
27887639Sgblack@eecs.umich.edu            fpscr.idc = 1;
27897639Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(VfpRoundNearest);
27907639Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (srcElem1) : "m" (srcElem1));
27917639Sgblack@eecs.umich.edu        destReg = vfpFpSToFixed(srcElem1, true, false, imm);
27927639Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (destReg));
27937639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, true);
27947783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
27957639Sgblack@eecs.umich.edu    '''
27967760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vcvt", "NVcvt2sfxD", "SimdCvtOp", ("float",),
27977639Sgblack@eecs.umich.edu            2, vcvt2sfxCode, toInt = True)
27987760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vcvt", "NVcvt2sfxQ", "SimdCvtOp", ("float",),
27997639Sgblack@eecs.umich.edu            4, vcvt2sfxCode, toInt = True)
28007639Sgblack@eecs.umich.edu
28017639Sgblack@eecs.umich.edu    vcvtu2fpCode = '''
28027783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
28037639Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(VfpRoundNearest);
28047639Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (srcReg1) : "m" (srcReg1));
28057639Sgblack@eecs.umich.edu        destElem = vfpUFixedToFpS(true, true, srcReg1, false, imm);
28067639Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (destElem));
28077639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, true);
28087783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
28097639Sgblack@eecs.umich.edu    '''
28107760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vcvt", "NVcvtu2fpD", "SimdCvtOp", ("float",),
28117639Sgblack@eecs.umich.edu            2, vcvtu2fpCode, fromInt = True)
28127760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vcvt", "NVcvtu2fpQ", "SimdCvtOp", ("float",),
28137639Sgblack@eecs.umich.edu            4, vcvtu2fpCode, fromInt = True)
28147639Sgblack@eecs.umich.edu
28157639Sgblack@eecs.umich.edu    vcvts2fpCode = '''
28167783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
28177639Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(VfpRoundNearest);
28187639Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (srcReg1) : "m" (srcReg1));
28197639Sgblack@eecs.umich.edu        destElem = vfpSFixedToFpS(true, true, srcReg1, false, imm);
28207639Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (destElem));
28217639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, true);
28227783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
28237639Sgblack@eecs.umich.edu    '''
28247760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vcvt", "NVcvts2fpD", "SimdCvtOp", ("float",),
28257639Sgblack@eecs.umich.edu            2, vcvts2fpCode, fromInt = True)
28267760SGiacomo.Gabrielli@arm.com    twoRegShiftInst("vcvt", "NVcvts2fpQ", "SimdCvtOp", ("float",),
28277639Sgblack@eecs.umich.edu            4, vcvts2fpCode, fromInt = True)
28287639Sgblack@eecs.umich.edu
28297639Sgblack@eecs.umich.edu    vcvts2hCode = '''
28307783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
28317639Sgblack@eecs.umich.edu        float srcFp1 = bitsToFp(srcElem1, (float)0.0);
28327639Sgblack@eecs.umich.edu        if (flushToZero(srcFp1))
28337639Sgblack@eecs.umich.edu            fpscr.idc = 1;
28347639Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(VfpRoundNearest);
28357639Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (srcFp1), "=m" (destElem)
28367639Sgblack@eecs.umich.edu                                : "m" (srcFp1), "m" (destElem));
28377639Sgblack@eecs.umich.edu        destElem = vcvtFpSFpH(fpscr, true, true, VfpRoundNearest,
28387639Sgblack@eecs.umich.edu                              fpscr.ahp, srcFp1);
28397639Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (destElem));
28407639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, true);
28417783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
28427639Sgblack@eecs.umich.edu    '''
28437760SGiacomo.Gabrielli@arm.com    twoRegNarrowMiscInst("vcvt", "NVcvts2h", "SimdCvtOp", ("uint16_t",), vcvts2hCode)
28447639Sgblack@eecs.umich.edu
28457639Sgblack@eecs.umich.edu    vcvth2sCode = '''
28467783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
28477639Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(VfpRoundNearest);
28487639Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (srcElem1), "=m" (destElem)
28497639Sgblack@eecs.umich.edu                                : "m" (srcElem1), "m" (destElem));
28507639Sgblack@eecs.umich.edu        destElem = fpToBits(vcvtFpHFpS(fpscr, true, fpscr.ahp, srcElem1));
28517639Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (destElem));
28527639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, true);
28537783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
28547639Sgblack@eecs.umich.edu    '''
28557760SGiacomo.Gabrielli@arm.com    twoRegLongMiscInst("vcvt", "NVcvth2s", "SimdCvtOp", ("uint16_t",), vcvth2sCode)
28567639Sgblack@eecs.umich.edu
28577639Sgblack@eecs.umich.edu    vrsqrteCode = '''
28587639Sgblack@eecs.umich.edu        destElem = unsignedRSqrtEstimate(srcElem1);
28597639Sgblack@eecs.umich.edu    '''
28607760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vrsqrte", "NVrsqrteD", "SimdSqrtOp", ("uint32_t",), 2, vrsqrteCode)
28617760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vrsqrte", "NVrsqrteQ", "SimdSqrtOp", ("uint32_t",), 4, vrsqrteCode)
28627639Sgblack@eecs.umich.edu
28637639Sgblack@eecs.umich.edu    vrsqrtefpCode = '''
28647783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
28657639Sgblack@eecs.umich.edu        if (flushToZero(srcReg1))
28667639Sgblack@eecs.umich.edu            fpscr.idc = 1;
28677639Sgblack@eecs.umich.edu        destReg = fprSqrtEstimate(fpscr, srcReg1);
28687783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
28697639Sgblack@eecs.umich.edu    '''
28707760SGiacomo.Gabrielli@arm.com    twoRegMiscInstFp("vrsqrte", "NVrsqrteDFp", "SimdFloatSqrtOp", ("float",), 2, vrsqrtefpCode)
28717760SGiacomo.Gabrielli@arm.com    twoRegMiscInstFp("vrsqrte", "NVrsqrteQFp", "SimdFloatSqrtOp", ("float",), 4, vrsqrtefpCode)
28727639Sgblack@eecs.umich.edu
28737639Sgblack@eecs.umich.edu    vrecpeCode = '''
28747639Sgblack@eecs.umich.edu        destElem = unsignedRecipEstimate(srcElem1);
28757639Sgblack@eecs.umich.edu    '''
28767760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vrecpe", "NVrecpeD", "SimdMultAccOp", ("uint32_t",), 2, vrecpeCode)
28777760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vrecpe", "NVrecpeQ", "SimdMultAccOp", ("uint32_t",), 4, vrecpeCode)
28787639Sgblack@eecs.umich.edu
28797639Sgblack@eecs.umich.edu    vrecpefpCode = '''
28807783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
28817639Sgblack@eecs.umich.edu        if (flushToZero(srcReg1))
28827639Sgblack@eecs.umich.edu            fpscr.idc = 1;
28837639Sgblack@eecs.umich.edu        destReg = fpRecipEstimate(fpscr, srcReg1);
28847783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
28857639Sgblack@eecs.umich.edu    '''
28867760SGiacomo.Gabrielli@arm.com    twoRegMiscInstFp("vrecpe", "NVrecpeDFp", "SimdFloatMultAccOp", ("float",), 2, vrecpefpCode)
28877760SGiacomo.Gabrielli@arm.com    twoRegMiscInstFp("vrecpe", "NVrecpeQFp", "SimdFloatMultAccOp", ("float",), 4, vrecpefpCode)
28887639Sgblack@eecs.umich.edu
28897639Sgblack@eecs.umich.edu    vrev16Code = '''
28907639Sgblack@eecs.umich.edu        destElem = srcElem1;
28917639Sgblack@eecs.umich.edu        unsigned groupSize = ((1 << 1) / sizeof(Element));
28927639Sgblack@eecs.umich.edu        unsigned reverseMask = (groupSize - 1);
28937639Sgblack@eecs.umich.edu        j = i ^ reverseMask;
28947639Sgblack@eecs.umich.edu    '''
28957760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vrev16", "NVrev16D", "SimdAluOp", ("uint8_t",), 2, vrev16Code)
28967760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vrev16", "NVrev16Q", "SimdAluOp", ("uint8_t",), 4, vrev16Code)
28977639Sgblack@eecs.umich.edu    vrev32Code = '''
28987639Sgblack@eecs.umich.edu        destElem = srcElem1;
28997639Sgblack@eecs.umich.edu        unsigned groupSize = ((1 << 2) / sizeof(Element));
29007639Sgblack@eecs.umich.edu        unsigned reverseMask = (groupSize - 1);
29017639Sgblack@eecs.umich.edu        j = i ^ reverseMask;
29027639Sgblack@eecs.umich.edu    '''
29037639Sgblack@eecs.umich.edu    twoRegMiscInst("vrev32", "NVrev32D",
29047760SGiacomo.Gabrielli@arm.com            "SimdAluOp", ("uint8_t", "uint16_t"), 2, vrev32Code)
29057639Sgblack@eecs.umich.edu    twoRegMiscInst("vrev32", "NVrev32Q",
29067760SGiacomo.Gabrielli@arm.com            "SimdAluOp", ("uint8_t", "uint16_t"), 4, vrev32Code)
29077639Sgblack@eecs.umich.edu    vrev64Code = '''
29087639Sgblack@eecs.umich.edu        destElem = srcElem1;
29097639Sgblack@eecs.umich.edu        unsigned groupSize = ((1 << 3) / sizeof(Element));
29107639Sgblack@eecs.umich.edu        unsigned reverseMask = (groupSize - 1);
29117639Sgblack@eecs.umich.edu        j = i ^ reverseMask;
29127639Sgblack@eecs.umich.edu    '''
29137760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vrev64", "NVrev64D", "SimdAluOp", smallUnsignedTypes, 2, vrev64Code)
29147760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vrev64", "NVrev64Q", "SimdAluOp", smallUnsignedTypes, 4, vrev64Code)
29157639Sgblack@eecs.umich.edu
29167639Sgblack@eecs.umich.edu    vpaddlCode = '''
29177639Sgblack@eecs.umich.edu        destElem = (BigElement)srcElem1 + (BigElement)srcElem2;
29187639Sgblack@eecs.umich.edu    '''
29197760SGiacomo.Gabrielli@arm.com    twoRegCondenseInst("vpaddl", "NVpaddlD", "SimdAddOp", smallTypes, 2, vpaddlCode)
29207760SGiacomo.Gabrielli@arm.com    twoRegCondenseInst("vpaddl", "NVpaddlQ", "SimdAddOp", smallTypes, 4, vpaddlCode)
29217639Sgblack@eecs.umich.edu
29227639Sgblack@eecs.umich.edu    vpadalCode = '''
29237639Sgblack@eecs.umich.edu        destElem += (BigElement)srcElem1 + (BigElement)srcElem2;
29247639Sgblack@eecs.umich.edu    '''
29257760SGiacomo.Gabrielli@arm.com    twoRegCondenseInst("vpadal", "NVpadalD", "SimdAddAccOp", smallTypes, 2, vpadalCode, True)
29267760SGiacomo.Gabrielli@arm.com    twoRegCondenseInst("vpadal", "NVpadalQ", "SimdAddAccOp", smallTypes, 4, vpadalCode, True)
29277639Sgblack@eecs.umich.edu
29287639Sgblack@eecs.umich.edu    vclsCode = '''
29297639Sgblack@eecs.umich.edu        unsigned count = 0;
29307639Sgblack@eecs.umich.edu        if (srcElem1 < 0) {
29317639Sgblack@eecs.umich.edu            srcElem1 <<= 1;
29327639Sgblack@eecs.umich.edu            while (srcElem1 < 0 && count < sizeof(Element) * 8 - 1) {
29337639Sgblack@eecs.umich.edu                count++;
29347639Sgblack@eecs.umich.edu                srcElem1 <<= 1;
29357639Sgblack@eecs.umich.edu            }
29367639Sgblack@eecs.umich.edu        } else {
29377639Sgblack@eecs.umich.edu            srcElem1 <<= 1;
29387639Sgblack@eecs.umich.edu            while (srcElem1 >= 0 && count < sizeof(Element) * 8 - 1) {
29397639Sgblack@eecs.umich.edu                count++;
29407639Sgblack@eecs.umich.edu                srcElem1 <<= 1;
29417639Sgblack@eecs.umich.edu            }
29427639Sgblack@eecs.umich.edu        }
29437639Sgblack@eecs.umich.edu        destElem = count;
29447639Sgblack@eecs.umich.edu    '''
29457760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vcls", "NVclsD", "SimdAluOp", signedTypes, 2, vclsCode)
29467760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vcls", "NVclsQ", "SimdAluOp", signedTypes, 4, vclsCode)
29477639Sgblack@eecs.umich.edu
29487639Sgblack@eecs.umich.edu    vclzCode = '''
29497639Sgblack@eecs.umich.edu        unsigned count = 0;
29507639Sgblack@eecs.umich.edu        while (srcElem1 >= 0 && count < sizeof(Element) * 8) {
29517639Sgblack@eecs.umich.edu            count++;
29527639Sgblack@eecs.umich.edu            srcElem1 <<= 1;
29537639Sgblack@eecs.umich.edu        }
29547639Sgblack@eecs.umich.edu        destElem = count;
29557639Sgblack@eecs.umich.edu    '''
29567760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vclz", "NVclzD", "SimdAluOp", signedTypes, 2, vclzCode)
29577760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vclz", "NVclzQ", "SimdAluOp", signedTypes, 4, vclzCode)
29587639Sgblack@eecs.umich.edu
29597639Sgblack@eecs.umich.edu    vcntCode = '''
29607639Sgblack@eecs.umich.edu        unsigned count = 0;
29617639Sgblack@eecs.umich.edu        while (srcElem1 && count < sizeof(Element) * 8) {
29627639Sgblack@eecs.umich.edu            count += srcElem1 & 0x1;
29637639Sgblack@eecs.umich.edu            srcElem1 >>= 1;
29647639Sgblack@eecs.umich.edu        }
29657639Sgblack@eecs.umich.edu        destElem = count;
29667639Sgblack@eecs.umich.edu    '''
29677760SGiacomo.Gabrielli@arm.com
29687760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vcnt", "NVcntD", "SimdAluOp", unsignedTypes, 2, vcntCode)
29697760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vcnt", "NVcntQ", "SimdAluOp", unsignedTypes, 4, vcntCode)
29707639Sgblack@eecs.umich.edu
29717639Sgblack@eecs.umich.edu    vmvnCode = '''
29727639Sgblack@eecs.umich.edu        destElem = ~srcElem1;
29737639Sgblack@eecs.umich.edu    '''
29747760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vmvn", "NVmvnD", "SimdAluOp", ("uint64_t",), 2, vmvnCode)
29757760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vmvn", "NVmvnQ", "SimdAluOp", ("uint64_t",), 4, vmvnCode)
29767639Sgblack@eecs.umich.edu
29777639Sgblack@eecs.umich.edu    vqabsCode = '''
29787783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
29797639Sgblack@eecs.umich.edu        if (srcElem1 == (Element)((Element)1 << (sizeof(Element) * 8 - 1))) {
29807639Sgblack@eecs.umich.edu            fpscr.qc = 1;
29817639Sgblack@eecs.umich.edu            destElem = ~srcElem1;
29827639Sgblack@eecs.umich.edu        } else if (srcElem1 < 0) {
29837639Sgblack@eecs.umich.edu            destElem = -srcElem1;
29847639Sgblack@eecs.umich.edu        } else {
29857639Sgblack@eecs.umich.edu            destElem = srcElem1;
29867639Sgblack@eecs.umich.edu        }
29877783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
29887639Sgblack@eecs.umich.edu    '''
29897760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vqabs", "NVqabsD", "SimdAluOp", signedTypes, 2, vqabsCode)
29907760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vqabs", "NVqabsQ", "SimdAluOp", signedTypes, 4, vqabsCode)
29917639Sgblack@eecs.umich.edu
29927639Sgblack@eecs.umich.edu    vqnegCode = '''
29937783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrQc;
29947639Sgblack@eecs.umich.edu        if (srcElem1 == (Element)((Element)1 << (sizeof(Element) * 8 - 1))) {
29957639Sgblack@eecs.umich.edu            fpscr.qc = 1;
29967639Sgblack@eecs.umich.edu            destElem = ~srcElem1;
29977639Sgblack@eecs.umich.edu        } else {
29987639Sgblack@eecs.umich.edu            destElem = -srcElem1;
29997639Sgblack@eecs.umich.edu        }
30007783SGiacomo.Gabrielli@arm.com        FpscrQc = fpscr;
30017639Sgblack@eecs.umich.edu    '''
30027760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vqneg", "NVqnegD", "SimdAluOp", signedTypes, 2, vqnegCode)
30037760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vqneg", "NVqnegQ", "SimdAluOp", signedTypes, 4, vqnegCode)
30047639Sgblack@eecs.umich.edu
30057639Sgblack@eecs.umich.edu    vabsCode = '''
30067639Sgblack@eecs.umich.edu        if (srcElem1 < 0) {
30077639Sgblack@eecs.umich.edu            destElem = -srcElem1;
30087639Sgblack@eecs.umich.edu        } else {
30097639Sgblack@eecs.umich.edu            destElem = srcElem1;
30107639Sgblack@eecs.umich.edu        }
30117639Sgblack@eecs.umich.edu    '''
30127760SGiacomo.Gabrielli@arm.com
30137760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vabs", "NVabsD", "SimdAluOp", signedTypes, 2, vabsCode)
30147760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vabs", "NVabsQ", "SimdAluOp", signedTypes, 4, vabsCode)
30157639Sgblack@eecs.umich.edu    vabsfpCode = '''
30167639Sgblack@eecs.umich.edu        union
30177639Sgblack@eecs.umich.edu        {
30187639Sgblack@eecs.umich.edu            uint32_t i;
30197639Sgblack@eecs.umich.edu            float f;
30207639Sgblack@eecs.umich.edu        } cStruct;
30217639Sgblack@eecs.umich.edu        cStruct.f = srcReg1;
30227639Sgblack@eecs.umich.edu        cStruct.i &= mask(sizeof(Element) * 8 - 1);
30237639Sgblack@eecs.umich.edu        destReg = cStruct.f;
30247639Sgblack@eecs.umich.edu    '''
30257760SGiacomo.Gabrielli@arm.com    twoRegMiscInstFp("vabs", "NVabsDFp", "SimdFloatAluOp", ("float",), 2, vabsfpCode)
30267760SGiacomo.Gabrielli@arm.com    twoRegMiscInstFp("vabs", "NVabsQFp", "SimdFloatAluOp", ("float",), 4, vabsfpCode)
30277639Sgblack@eecs.umich.edu
30287639Sgblack@eecs.umich.edu    vnegCode = '''
30297639Sgblack@eecs.umich.edu        destElem = -srcElem1;
30307639Sgblack@eecs.umich.edu    '''
30317760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vneg", "NVnegD", "SimdAluOp", signedTypes, 2, vnegCode)
30327760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vneg", "NVnegQ", "SimdAluOp", signedTypes, 4, vnegCode)
30337639Sgblack@eecs.umich.edu    vnegfpCode = '''
30347639Sgblack@eecs.umich.edu        destReg = -srcReg1;
30357639Sgblack@eecs.umich.edu    '''
30367760SGiacomo.Gabrielli@arm.com    twoRegMiscInstFp("vneg", "NVnegDFp", "SimdFloatAluOp", ("float",), 2, vnegfpCode)
30377760SGiacomo.Gabrielli@arm.com    twoRegMiscInstFp("vneg", "NVnegQFp", "SimdFloatAluOp", ("float",), 4, vnegfpCode)
30387639Sgblack@eecs.umich.edu
30397639Sgblack@eecs.umich.edu    vcgtCode = 'destElem = (srcElem1 > 0) ? mask(sizeof(Element) * 8) : 0;'
30407760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vcgt", "NVcgtD", "SimdCmpOp", signedTypes, 2, vcgtCode)
30417760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vcgt", "NVcgtQ", "SimdCmpOp", signedTypes, 4, vcgtCode)
30427639Sgblack@eecs.umich.edu    vcgtfpCode = '''
30437783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
30447639Sgblack@eecs.umich.edu        float res = binaryOp(fpscr, srcReg1, (FloatReg)0.0, vcgtFunc,
30457639Sgblack@eecs.umich.edu                             true, true, VfpRoundNearest);
30467639Sgblack@eecs.umich.edu        destReg = (res == 0) ? -1 : 0;
30477639Sgblack@eecs.umich.edu        if (res == 2.0)
30487639Sgblack@eecs.umich.edu            fpscr.ioc = 1;
30497783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
30507639Sgblack@eecs.umich.edu    '''
30517760SGiacomo.Gabrielli@arm.com    twoRegMiscInstFp("vcgt", "NVcgtDFp", "SimdFloatCmpOp", ("float",),
30527639Sgblack@eecs.umich.edu            2, vcgtfpCode, toInt = True)
30537760SGiacomo.Gabrielli@arm.com    twoRegMiscInstFp("vcgt", "NVcgtQFp", "SimdFloatCmpOp", ("float",),
30547639Sgblack@eecs.umich.edu            4, vcgtfpCode, toInt = True)
30557639Sgblack@eecs.umich.edu
30567639Sgblack@eecs.umich.edu    vcgeCode = 'destElem = (srcElem1 >= 0) ? mask(sizeof(Element) * 8) : 0;'
30577760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vcge", "NVcgeD", "SimdCmpOp", signedTypes, 2, vcgeCode)
30587760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vcge", "NVcgeQ", "SimdCmpOp", signedTypes, 4, vcgeCode)
30597639Sgblack@eecs.umich.edu    vcgefpCode = '''
30607783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
30617639Sgblack@eecs.umich.edu        float res = binaryOp(fpscr, srcReg1, (FloatReg)0.0, vcgeFunc,
30627639Sgblack@eecs.umich.edu                             true, true, VfpRoundNearest);
30637639Sgblack@eecs.umich.edu        destReg = (res == 0) ? -1 : 0;
30647639Sgblack@eecs.umich.edu        if (res == 2.0)
30657639Sgblack@eecs.umich.edu            fpscr.ioc = 1;
30667783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
30677639Sgblack@eecs.umich.edu    '''
30687760SGiacomo.Gabrielli@arm.com    twoRegMiscInstFp("vcge", "NVcgeDFp", "SimdFloatCmpOp", ("float",),
30697639Sgblack@eecs.umich.edu            2, vcgefpCode, toInt = True)
30707760SGiacomo.Gabrielli@arm.com    twoRegMiscInstFp("vcge", "NVcgeQFp", "SimdFloatCmpOp", ("float",),
30717639Sgblack@eecs.umich.edu            4, vcgefpCode, toInt = True)
30727639Sgblack@eecs.umich.edu
30737639Sgblack@eecs.umich.edu    vceqCode = 'destElem = (srcElem1 == 0) ? mask(sizeof(Element) * 8) : 0;'
30747760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vceq", "NVceqD", "SimdCmpOp", signedTypes, 2, vceqCode)
30757760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vceq", "NVceqQ", "SimdCmpOp", signedTypes, 4, vceqCode)
30767639Sgblack@eecs.umich.edu    vceqfpCode = '''
30777783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
30787639Sgblack@eecs.umich.edu        float res = binaryOp(fpscr, srcReg1, (FloatReg)0.0, vceqFunc,
30797639Sgblack@eecs.umich.edu                             true, true, VfpRoundNearest);
30807639Sgblack@eecs.umich.edu        destReg = (res == 0) ? -1 : 0;
30817639Sgblack@eecs.umich.edu        if (res == 2.0)
30827639Sgblack@eecs.umich.edu            fpscr.ioc = 1;
30837783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
30847639Sgblack@eecs.umich.edu    '''
30857760SGiacomo.Gabrielli@arm.com    twoRegMiscInstFp("vceq", "NVceqDFp", "SimdFloatCmpOp", ("float",),
30867639Sgblack@eecs.umich.edu            2, vceqfpCode, toInt = True)
30877760SGiacomo.Gabrielli@arm.com    twoRegMiscInstFp("vceq", "NVceqQFp", "SimdFloatCmpOp", ("float",),
30887639Sgblack@eecs.umich.edu            4, vceqfpCode, toInt = True)
30897639Sgblack@eecs.umich.edu
30907639Sgblack@eecs.umich.edu    vcleCode = 'destElem = (srcElem1 <= 0) ? mask(sizeof(Element) * 8) : 0;'
30917760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vcle", "NVcleD", "SimdCmpOp", signedTypes, 2, vcleCode)
30927760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vcle", "NVcleQ", "SimdCmpOp", signedTypes, 4, vcleCode)
30937639Sgblack@eecs.umich.edu    vclefpCode = '''
30947783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
30957639Sgblack@eecs.umich.edu        float res = binaryOp(fpscr, srcReg1, (FloatReg)0.0, vcleFunc,
30967639Sgblack@eecs.umich.edu                             true, true, VfpRoundNearest);
30977639Sgblack@eecs.umich.edu        destReg = (res == 0) ? -1 : 0;
30987639Sgblack@eecs.umich.edu        if (res == 2.0)
30997639Sgblack@eecs.umich.edu            fpscr.ioc = 1;
31007783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
31017639Sgblack@eecs.umich.edu    '''
31027760SGiacomo.Gabrielli@arm.com    twoRegMiscInstFp("vcle", "NVcleDFp", "SimdFloatCmpOp", ("float",),
31037639Sgblack@eecs.umich.edu            2, vclefpCode, toInt = True)
31047760SGiacomo.Gabrielli@arm.com    twoRegMiscInstFp("vcle", "NVcleQFp", "SimdFloatCmpOp", ("float",),
31057639Sgblack@eecs.umich.edu            4, vclefpCode, toInt = True)
31067639Sgblack@eecs.umich.edu
31077639Sgblack@eecs.umich.edu    vcltCode = 'destElem = (srcElem1 < 0) ? mask(sizeof(Element) * 8) : 0;'
31087760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vclt", "NVcltD", "SimdCmpOp", signedTypes, 2, vcltCode)
31097760SGiacomo.Gabrielli@arm.com    twoRegMiscInst("vclt", "NVcltQ", "SimdCmpOp", signedTypes, 4, vcltCode)
31107639Sgblack@eecs.umich.edu    vcltfpCode = '''
31117783SGiacomo.Gabrielli@arm.com        FPSCR fpscr = (FPSCR) FpscrExc;
31127639Sgblack@eecs.umich.edu        float res = binaryOp(fpscr, srcReg1, (FloatReg)0.0, vcltFunc,
31137639Sgblack@eecs.umich.edu                             true, true, VfpRoundNearest);
31147639Sgblack@eecs.umich.edu        destReg = (res == 0) ? -1 : 0;
31157639Sgblack@eecs.umich.edu        if (res == 2.0)
31167639Sgblack@eecs.umich.edu            fpscr.ioc = 1;
31177783SGiacomo.Gabrielli@arm.com        FpscrExc = fpscr;
31187639Sgblack@eecs.umich.edu    '''
31197760SGiacomo.Gabrielli@arm.com    twoRegMiscInstFp("vclt", "NVcltDFp", "SimdFloatCmpOp", ("float",),
31207639Sgblack@eecs.umich.edu            2, vcltfpCode, toInt = True)
31217760SGiacomo.Gabrielli@arm.com    twoRegMiscInstFp("vclt", "NVcltQFp", "SimdFloatCmpOp", ("float",),
31227639Sgblack@eecs.umich.edu            4, vcltfpCode, toInt = True)
31237639Sgblack@eecs.umich.edu
31247639Sgblack@eecs.umich.edu    vswpCode = '''
31257639Sgblack@eecs.umich.edu        FloatRegBits mid;
31267639Sgblack@eecs.umich.edu        for (unsigned r = 0; r < rCount; r++) {
31277639Sgblack@eecs.umich.edu            mid = srcReg1.regs[r];
31287639Sgblack@eecs.umich.edu            srcReg1.regs[r] = destReg.regs[r];
31297639Sgblack@eecs.umich.edu            destReg.regs[r] = mid;
31307639Sgblack@eecs.umich.edu        }
31317639Sgblack@eecs.umich.edu    '''
31327760SGiacomo.Gabrielli@arm.com    twoRegMiscScramble("vswp", "NVswpD", "SimdAluOp", ("uint64_t",), 2, vswpCode)
31337760SGiacomo.Gabrielli@arm.com    twoRegMiscScramble("vswp", "NVswpQ", "SimdAluOp", ("uint64_t",), 4, vswpCode)
31347639Sgblack@eecs.umich.edu
31357639Sgblack@eecs.umich.edu    vtrnCode = '''
31367639Sgblack@eecs.umich.edu        Element mid;
31377639Sgblack@eecs.umich.edu        for (unsigned i = 0; i < eCount; i += 2) {
31387639Sgblack@eecs.umich.edu            mid = srcReg1.elements[i];
31397639Sgblack@eecs.umich.edu            srcReg1.elements[i] = destReg.elements[i + 1];
31407639Sgblack@eecs.umich.edu            destReg.elements[i + 1] = mid;
31417639Sgblack@eecs.umich.edu        }
31427639Sgblack@eecs.umich.edu    '''
31437760SGiacomo.Gabrielli@arm.com    twoRegMiscScramble("vtrn", "NVtrnD", "SimdAluOp", unsignedTypes, 2, vtrnCode)
31447760SGiacomo.Gabrielli@arm.com    twoRegMiscScramble("vtrn", "NVtrnQ", "SimdAluOp", unsignedTypes, 4, vtrnCode)
31457639Sgblack@eecs.umich.edu
31467639Sgblack@eecs.umich.edu    vuzpCode = '''
31477639Sgblack@eecs.umich.edu        Element mid[eCount];
31487639Sgblack@eecs.umich.edu        memcpy(&mid, &srcReg1, sizeof(srcReg1));
31497639Sgblack@eecs.umich.edu        for (unsigned i = 0; i < eCount / 2; i++) {
31507639Sgblack@eecs.umich.edu            srcReg1.elements[i] = destReg.elements[2 * i + 1];
31517639Sgblack@eecs.umich.edu            srcReg1.elements[eCount / 2 + i] = mid[2 * i + 1];
31527639Sgblack@eecs.umich.edu            destReg.elements[i] = destReg.elements[2 * i];
31537639Sgblack@eecs.umich.edu        }
31547639Sgblack@eecs.umich.edu        for (unsigned i = 0; i < eCount / 2; i++) {
31557639Sgblack@eecs.umich.edu            destReg.elements[eCount / 2 + i] = mid[2 * i];
31567639Sgblack@eecs.umich.edu        }
31577639Sgblack@eecs.umich.edu    '''
31587760SGiacomo.Gabrielli@arm.com    twoRegMiscScramble("vuzp", "NVuzpD", "SimdAluOp", unsignedTypes, 2, vuzpCode)
31597760SGiacomo.Gabrielli@arm.com    twoRegMiscScramble("vuzp", "NVuzpQ", "SimdAluOp", unsignedTypes, 4, vuzpCode)
31607639Sgblack@eecs.umich.edu
31617639Sgblack@eecs.umich.edu    vzipCode = '''
31627639Sgblack@eecs.umich.edu        Element mid[eCount];
31637639Sgblack@eecs.umich.edu        memcpy(&mid, &destReg, sizeof(destReg));
31647639Sgblack@eecs.umich.edu        for (unsigned i = 0; i < eCount / 2; i++) {
31657639Sgblack@eecs.umich.edu            destReg.elements[2 * i] = mid[i];
31667639Sgblack@eecs.umich.edu            destReg.elements[2 * i + 1] = srcReg1.elements[i];
31677639Sgblack@eecs.umich.edu        }
31687639Sgblack@eecs.umich.edu        for (int i = 0; i < eCount / 2; i++) {
31697639Sgblack@eecs.umich.edu            srcReg1.elements[2 * i] = mid[eCount / 2 + i];
31707639Sgblack@eecs.umich.edu            srcReg1.elements[2 * i + 1] = srcReg1.elements[eCount / 2 + i];
31717639Sgblack@eecs.umich.edu        }
31727639Sgblack@eecs.umich.edu    '''
31737760SGiacomo.Gabrielli@arm.com    twoRegMiscScramble("vzip", "NVzipD", "SimdAluOp", unsignedTypes, 2, vzipCode)
31747760SGiacomo.Gabrielli@arm.com    twoRegMiscScramble("vzip", "NVzipQ", "SimdAluOp", unsignedTypes, 4, vzipCode)
31757639Sgblack@eecs.umich.edu
31767639Sgblack@eecs.umich.edu    vmovnCode = 'destElem = srcElem1;'
31777760SGiacomo.Gabrielli@arm.com    twoRegNarrowMiscInst("vmovn", "NVmovn", "SimdMiscOp", smallUnsignedTypes, vmovnCode)
31787639Sgblack@eecs.umich.edu
31797639Sgblack@eecs.umich.edu    vdupCode = 'destElem = srcElem1;'
31807760SGiacomo.Gabrielli@arm.com    twoRegMiscScInst("vdup", "NVdupD", "SimdAluOp", smallUnsignedTypes, 2, vdupCode)
31817760SGiacomo.Gabrielli@arm.com    twoRegMiscScInst("vdup", "NVdupQ", "SimdAluOp", smallUnsignedTypes, 4, vdupCode)
31827639Sgblack@eecs.umich.edu
31837760SGiacomo.Gabrielli@arm.com    def vdupGprInst(name, Name, opClass, types, rCount):
31847639Sgblack@eecs.umich.edu        global header_output, exec_output
31857639Sgblack@eecs.umich.edu        eWalkCode = '''
31867639Sgblack@eecs.umich.edu        RegVect destReg;
31877639Sgblack@eecs.umich.edu        for (unsigned i = 0; i < eCount; i++) {
31887639Sgblack@eecs.umich.edu            destReg.elements[i] = htog((Element)Op1);
31897639Sgblack@eecs.umich.edu        }
31907639Sgblack@eecs.umich.edu        '''
31917639Sgblack@eecs.umich.edu        for reg in range(rCount):
31927639Sgblack@eecs.umich.edu            eWalkCode += '''
31938588Sgblack@eecs.umich.edu            FpDestP%(reg)d_uw = gtoh(destReg.regs[%(reg)d]);
31947639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
31957639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
31967639Sgblack@eecs.umich.edu                            "RegRegOp",
31977639Sgblack@eecs.umich.edu                            { "code": eWalkCode,
31987639Sgblack@eecs.umich.edu                              "r_count": rCount,
31997760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
32007760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
32017639Sgblack@eecs.umich.edu        header_output += NeonRegRegOpDeclare.subst(iop)
32027639Sgblack@eecs.umich.edu        exec_output += NeonEqualRegExecute.subst(iop)
32037639Sgblack@eecs.umich.edu        for type in types:
32047639Sgblack@eecs.umich.edu            substDict = { "targs" : type,
32057639Sgblack@eecs.umich.edu                          "class_name" : Name }
32067639Sgblack@eecs.umich.edu            exec_output += NeonExecDeclare.subst(substDict)
32078206SWilliam.Wang@arm.com    vdupGprInst("vdup", "NVdupDGpr", "SimdMiscOp", smallUnsignedTypes, 2)
32088206SWilliam.Wang@arm.com    vdupGprInst("vdup", "NVdupQGpr", "SimdMiscOp", smallUnsignedTypes, 4)
32097639Sgblack@eecs.umich.edu
32107639Sgblack@eecs.umich.edu    vmovCode = 'destElem = imm;'
32117760SGiacomo.Gabrielli@arm.com    oneRegImmInst("vmov", "NVmoviD", "SimdMiscOp", ("uint64_t",), 2, vmovCode)
32127760SGiacomo.Gabrielli@arm.com    oneRegImmInst("vmov", "NVmoviQ", "SimdMiscOp", ("uint64_t",), 4, vmovCode)
32137639Sgblack@eecs.umich.edu
32147639Sgblack@eecs.umich.edu    vorrCode = 'destElem |= imm;'
32157760SGiacomo.Gabrielli@arm.com    oneRegImmInst("vorr", "NVorriD", "SimdAluOp", ("uint64_t",), 2, vorrCode, True)
32167760SGiacomo.Gabrielli@arm.com    oneRegImmInst("vorr", "NVorriQ", "SimdAluOp", ("uint64_t",), 4, vorrCode, True)
32177639Sgblack@eecs.umich.edu
32187639Sgblack@eecs.umich.edu    vmvnCode = 'destElem = ~imm;'
32197760SGiacomo.Gabrielli@arm.com    oneRegImmInst("vmvn", "NVmvniD", "SimdAluOp", ("uint64_t",), 2, vmvnCode)
32207760SGiacomo.Gabrielli@arm.com    oneRegImmInst("vmvn", "NVmvniQ", "SimdAluOp", ("uint64_t",), 4, vmvnCode)
32217639Sgblack@eecs.umich.edu
32227639Sgblack@eecs.umich.edu    vbicCode = 'destElem &= ~imm;'
32237760SGiacomo.Gabrielli@arm.com    oneRegImmInst("vbic", "NVbiciD", "SimdAluOp", ("uint64_t",), 2, vbicCode, True)
32247760SGiacomo.Gabrielli@arm.com    oneRegImmInst("vbic", "NVbiciQ", "SimdAluOp", ("uint64_t",), 4, vbicCode, True)
32257639Sgblack@eecs.umich.edu
32267639Sgblack@eecs.umich.edu    vqmovnCode = '''
32277783SGiacomo.Gabrielli@arm.com    FPSCR fpscr = (FPSCR) FpscrQc;
32287639Sgblack@eecs.umich.edu    destElem = srcElem1;
32297639Sgblack@eecs.umich.edu    if ((BigElement)destElem != srcElem1) {
32307639Sgblack@eecs.umich.edu        fpscr.qc = 1;
32317639Sgblack@eecs.umich.edu        destElem = mask(sizeof(Element) * 8 - 1);
32327639Sgblack@eecs.umich.edu        if (srcElem1 < 0)
32337639Sgblack@eecs.umich.edu            destElem = ~destElem;
32347639Sgblack@eecs.umich.edu    }
32357783SGiacomo.Gabrielli@arm.com    FpscrQc = fpscr;
32367639Sgblack@eecs.umich.edu    '''
32377760SGiacomo.Gabrielli@arm.com    twoRegNarrowMiscInst("vqmovn", "NVqmovn", "SimdMiscOp", smallSignedTypes, vqmovnCode)
32387639Sgblack@eecs.umich.edu
32397639Sgblack@eecs.umich.edu    vqmovunCode = '''
32407783SGiacomo.Gabrielli@arm.com    FPSCR fpscr = (FPSCR) FpscrQc;
32417639Sgblack@eecs.umich.edu    destElem = srcElem1;
32427639Sgblack@eecs.umich.edu    if ((BigElement)destElem != srcElem1) {
32437639Sgblack@eecs.umich.edu        fpscr.qc = 1;
32447639Sgblack@eecs.umich.edu        destElem = mask(sizeof(Element) * 8);
32457639Sgblack@eecs.umich.edu    }
32467783SGiacomo.Gabrielli@arm.com    FpscrQc = fpscr;
32477639Sgblack@eecs.umich.edu    '''
32487639Sgblack@eecs.umich.edu    twoRegNarrowMiscInst("vqmovun", "NVqmovun",
32497760SGiacomo.Gabrielli@arm.com            "SimdMiscOp", smallUnsignedTypes, vqmovunCode)
32507639Sgblack@eecs.umich.edu
32517639Sgblack@eecs.umich.edu    vqmovunsCode = '''
32527783SGiacomo.Gabrielli@arm.com    FPSCR fpscr = (FPSCR) FpscrQc;
32537639Sgblack@eecs.umich.edu    destElem = srcElem1;
32547639Sgblack@eecs.umich.edu    if (srcElem1 < 0 ||
32557639Sgblack@eecs.umich.edu            ((BigElement)destElem & mask(sizeof(Element) * 8)) != srcElem1) {
32567639Sgblack@eecs.umich.edu        fpscr.qc = 1;
32577639Sgblack@eecs.umich.edu        destElem = mask(sizeof(Element) * 8);
32587639Sgblack@eecs.umich.edu        if (srcElem1 < 0)
32597639Sgblack@eecs.umich.edu            destElem = ~destElem;
32607639Sgblack@eecs.umich.edu    }
32617783SGiacomo.Gabrielli@arm.com    FpscrQc = fpscr;
32627639Sgblack@eecs.umich.edu    '''
32637639Sgblack@eecs.umich.edu    twoRegNarrowMiscInst("vqmovun", "NVqmovuns",
32647760SGiacomo.Gabrielli@arm.com            "SimdMiscOp", smallSignedTypes, vqmovunsCode)
32657639Sgblack@eecs.umich.edu
32667760SGiacomo.Gabrielli@arm.com    def buildVext(name, Name, opClass, types, rCount, op):
32677639Sgblack@eecs.umich.edu        global header_output, exec_output
32687639Sgblack@eecs.umich.edu        eWalkCode = '''
32697639Sgblack@eecs.umich.edu        RegVect srcReg1, srcReg2, destReg;
32707639Sgblack@eecs.umich.edu        '''
32717639Sgblack@eecs.umich.edu        for reg in range(rCount):
32727644Sali.saidi@arm.com            eWalkCode += simdEnabledCheckCode + '''
32738588Sgblack@eecs.umich.edu                srcReg1.regs[%(reg)d] = htog(FpOp1P%(reg)d_uw);
32748588Sgblack@eecs.umich.edu                srcReg2.regs[%(reg)d] = htog(FpOp2P%(reg)d_uw);
32757639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
32767639Sgblack@eecs.umich.edu        eWalkCode += op
32777639Sgblack@eecs.umich.edu        for reg in range(rCount):
32787639Sgblack@eecs.umich.edu            eWalkCode += '''
32798588Sgblack@eecs.umich.edu            FpDestP%(reg)d_uw = gtoh(destReg.regs[%(reg)d]);
32807639Sgblack@eecs.umich.edu            ''' % { "reg" : reg }
32817639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
32827639Sgblack@eecs.umich.edu                            "RegRegRegImmOp",
32837639Sgblack@eecs.umich.edu                            { "code": eWalkCode,
32847639Sgblack@eecs.umich.edu                              "r_count": rCount,
32857760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
32867760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
32877639Sgblack@eecs.umich.edu        header_output += NeonRegRegRegImmOpDeclare.subst(iop)
32887639Sgblack@eecs.umich.edu        exec_output += NeonEqualRegExecute.subst(iop)
32897639Sgblack@eecs.umich.edu        for type in types:
32907639Sgblack@eecs.umich.edu            substDict = { "targs" : type,
32917639Sgblack@eecs.umich.edu                          "class_name" : Name }
32927639Sgblack@eecs.umich.edu            exec_output += NeonExecDeclare.subst(substDict)
32937639Sgblack@eecs.umich.edu
32947639Sgblack@eecs.umich.edu    vextCode = '''
32957639Sgblack@eecs.umich.edu        for (unsigned i = 0; i < eCount; i++) {
32967639Sgblack@eecs.umich.edu            unsigned index = i + imm;
32977639Sgblack@eecs.umich.edu            if (index < eCount) {
32987639Sgblack@eecs.umich.edu                destReg.elements[i] = srcReg1.elements[index];
32997639Sgblack@eecs.umich.edu            } else {
33007639Sgblack@eecs.umich.edu                index -= eCount;
33017853SMatt.Horsnell@ARM.com                if (index >= eCount)
33027853SMatt.Horsnell@ARM.com#if FULL_SYSTEM
33037853SMatt.Horsnell@ARM.com                    fault = new UndefinedInstruction;
33047853SMatt.Horsnell@ARM.com#else
33057853SMatt.Horsnell@ARM.com                    fault = new UndefinedInstruction(false, mnemonic);
33067853SMatt.Horsnell@ARM.com#endif
33077853SMatt.Horsnell@ARM.com                else
33087853SMatt.Horsnell@ARM.com                    destReg.elements[i] = srcReg2.elements[index];
33097639Sgblack@eecs.umich.edu            }
33107639Sgblack@eecs.umich.edu        }
33117639Sgblack@eecs.umich.edu    '''
33128206SWilliam.Wang@arm.com    buildVext("vext", "NVextD", "SimdMiscOp", ("uint8_t",), 2, vextCode)
33138206SWilliam.Wang@arm.com    buildVext("vext", "NVextQ", "SimdMiscOp", ("uint8_t",), 4, vextCode)
33147639Sgblack@eecs.umich.edu
33157760SGiacomo.Gabrielli@arm.com    def buildVtbxl(name, Name, opClass, length, isVtbl):
33167639Sgblack@eecs.umich.edu        global header_output, decoder_output, exec_output
33177639Sgblack@eecs.umich.edu        code = '''
33187639Sgblack@eecs.umich.edu            union
33197639Sgblack@eecs.umich.edu            {
33207639Sgblack@eecs.umich.edu                uint8_t bytes[32];
33217639Sgblack@eecs.umich.edu                FloatRegBits regs[8];
33227639Sgblack@eecs.umich.edu            } table;
33237639Sgblack@eecs.umich.edu
33247639Sgblack@eecs.umich.edu            union
33257639Sgblack@eecs.umich.edu            {
33267639Sgblack@eecs.umich.edu                uint8_t bytes[8];
33277639Sgblack@eecs.umich.edu                FloatRegBits regs[2];
33287639Sgblack@eecs.umich.edu            } destReg, srcReg2;
33297639Sgblack@eecs.umich.edu
33307639Sgblack@eecs.umich.edu            const unsigned length = %(length)d;
33317639Sgblack@eecs.umich.edu            const bool isVtbl = %(isVtbl)s;
33327639Sgblack@eecs.umich.edu
33338588Sgblack@eecs.umich.edu            srcReg2.regs[0] = htog(FpOp2P0_uw);
33348588Sgblack@eecs.umich.edu            srcReg2.regs[1] = htog(FpOp2P1_uw);
33357639Sgblack@eecs.umich.edu
33368588Sgblack@eecs.umich.edu            destReg.regs[0] = htog(FpDestP0_uw);
33378588Sgblack@eecs.umich.edu            destReg.regs[1] = htog(FpDestP1_uw);
33387639Sgblack@eecs.umich.edu        ''' % { "length" : length, "isVtbl" : isVtbl }
33397639Sgblack@eecs.umich.edu        for reg in range(8):
33407639Sgblack@eecs.umich.edu            if reg < length * 2:
33418588Sgblack@eecs.umich.edu                code += 'table.regs[%(reg)d] = htog(FpOp1P%(reg)d_uw);\n' % \
33427639Sgblack@eecs.umich.edu                        { "reg" : reg }
33437639Sgblack@eecs.umich.edu            else:
33447639Sgblack@eecs.umich.edu                code += 'table.regs[%(reg)d] = 0;\n' % { "reg" : reg }
33457639Sgblack@eecs.umich.edu        code += '''
33467639Sgblack@eecs.umich.edu        for (unsigned i = 0; i < sizeof(destReg); i++) {
33477639Sgblack@eecs.umich.edu            uint8_t index = srcReg2.bytes[i];
33487639Sgblack@eecs.umich.edu            if (index < 8 * length) {
33497639Sgblack@eecs.umich.edu                destReg.bytes[i] = table.bytes[index];
33507639Sgblack@eecs.umich.edu            } else {
33517639Sgblack@eecs.umich.edu                if (isVtbl)
33527639Sgblack@eecs.umich.edu                    destReg.bytes[i] = 0;
33537639Sgblack@eecs.umich.edu                // else destReg.bytes[i] unchanged
33547639Sgblack@eecs.umich.edu            }
33557639Sgblack@eecs.umich.edu        }
33567639Sgblack@eecs.umich.edu
33578588Sgblack@eecs.umich.edu        FpDestP0_uw = gtoh(destReg.regs[0]);
33588588Sgblack@eecs.umich.edu        FpDestP1_uw = gtoh(destReg.regs[1]);
33597639Sgblack@eecs.umich.edu        '''
33607639Sgblack@eecs.umich.edu        iop = InstObjParams(name, Name,
33617639Sgblack@eecs.umich.edu                            "RegRegRegOp",
33627639Sgblack@eecs.umich.edu                            { "code": code,
33637760SGiacomo.Gabrielli@arm.com                              "predicate_test": predicateTest,
33647760SGiacomo.Gabrielli@arm.com                              "op_class": opClass }, [])
33657639Sgblack@eecs.umich.edu        header_output += RegRegRegOpDeclare.subst(iop)
33667639Sgblack@eecs.umich.edu        decoder_output += RegRegRegOpConstructor.subst(iop)
33677639Sgblack@eecs.umich.edu        exec_output += PredOpExecute.subst(iop)
33687639Sgblack@eecs.umich.edu
33698206SWilliam.Wang@arm.com    buildVtbxl("vtbl", "NVtbl1", "SimdMiscOp", 1, "true")
33708206SWilliam.Wang@arm.com    buildVtbxl("vtbl", "NVtbl2", "SimdMiscOp", 2, "true")
33718206SWilliam.Wang@arm.com    buildVtbxl("vtbl", "NVtbl3", "SimdMiscOp", 3, "true")
33728206SWilliam.Wang@arm.com    buildVtbxl("vtbl", "NVtbl4", "SimdMiscOp", 4, "true")
33737639Sgblack@eecs.umich.edu
33748206SWilliam.Wang@arm.com    buildVtbxl("vtbx", "NVtbx1", "SimdMiscOp", 1, "false")
33758206SWilliam.Wang@arm.com    buildVtbxl("vtbx", "NVtbx2", "SimdMiscOp", 2, "false")
33768206SWilliam.Wang@arm.com    buildVtbxl("vtbx", "NVtbx3", "SimdMiscOp", 3, "false")
33778206SWilliam.Wang@arm.com    buildVtbxl("vtbx", "NVtbx4", "SimdMiscOp", 4, "false")
33787639Sgblack@eecs.umich.edu}};
3379