neon.isa revision 8206
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 += ''' 6427639Sgblack@eecs.umich.edu srcReg1.regs[%(reg)d] = htog(FpOp1P%(reg)d.uw); 6437639Sgblack@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 += ''' 6477639Sgblack@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 += ''' 6807639Sgblack@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 += ''' 7617639Sgblack@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 += ''' 8017639Sgblack@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 += ''' 8057639Sgblack@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 += ''' 8107639Sgblack@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 += ''' 8297639Sgblack@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 += ''' 8637639Sgblack@eecs.umich.edu srcReg1.regs[%(reg)d] = htog(FpOp1P%(reg)d.uw); 8647639Sgblack@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 += ''' 8687639Sgblack@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 += ''' 8937639Sgblack@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 += ''' 9177639Sgblack@eecs.umich.edu srcReg1.regs[%(reg)d] = htog(FpOp1P%(reg)d.uw); 9187639Sgblack@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 += ''' 9237639Sgblack@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 += ''' 9487639Sgblack@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 += ''' 10247639Sgblack@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 += ''' 10287639Sgblack@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 += ''' 10587639Sgblack@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 += ''' 10817639Sgblack@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 += ''' 10867639Sgblack@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 += ''' 11027639Sgblack@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 += ''' 11257639Sgblack@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 += ''' 11307639Sgblack@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 += ''' 11467639Sgblack@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 += ''' 11687639Sgblack@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 += ''' 11727639Sgblack@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 += ''' 11897639Sgblack@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 += ''' 12117639Sgblack@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 += ''' 12157639Sgblack@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 += ''' 12317639Sgblack@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 += ''' 12537639Sgblack@eecs.umich.edu srcReg1.regs[%(reg)d] = htog(FpOp1P%(reg)d.uw); 12547639Sgblack@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 += ''' 12657639Sgblack@eecs.umich.edu FpDestP%(reg)d.uw = gtoh(destReg.regs[%(reg)d]); 12667639Sgblack@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 += ''' 13287639Sgblack@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 += ''' 13557639Sgblack@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 += ''' 13597639Sgblack@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 += ''' 13767639Sgblack@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 += ''' 13997639Sgblack@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 += ''' 14047639Sgblack@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 += ''' 14207639Sgblack@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 += ''' 14437639Sgblack@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 += ''' 14587639Sgblack@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 += ''' 14817639Sgblack@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 += ''' 14867639Sgblack@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 += ''' 15027639Sgblack@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 += ''' 31937639Sgblack@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 + ''' 32737639Sgblack@eecs.umich.edu srcReg1.regs[%(reg)d] = htog(FpOp1P%(reg)d.uw); 32747639Sgblack@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 += ''' 32797639Sgblack@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 33337639Sgblack@eecs.umich.edu srcReg2.regs[0] = htog(FpOp2P0.uw); 33347639Sgblack@eecs.umich.edu srcReg2.regs[1] = htog(FpOp2P1.uw); 33357639Sgblack@eecs.umich.edu 33367639Sgblack@eecs.umich.edu destReg.regs[0] = htog(FpDestP0.uw); 33377639Sgblack@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: 33417639Sgblack@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 33577639Sgblack@eecs.umich.edu FpDestP0.uw = gtoh(destReg.regs[0]); 33587639Sgblack@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