neon.isa revision 7641
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.edudef template NeonRegRegRegOpDeclare {{
417639Sgblack@eecs.umich.edutemplate <class _Element>
427639Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
437639Sgblack@eecs.umich.edu{
447639Sgblack@eecs.umich.edu  protected:
457639Sgblack@eecs.umich.edu    typedef _Element Element;
467639Sgblack@eecs.umich.edu  public:
477639Sgblack@eecs.umich.edu    // Constructor
487639Sgblack@eecs.umich.edu    %(class_name)s(ExtMachInst machInst,
497639Sgblack@eecs.umich.edu                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2)
507639Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
517639Sgblack@eecs.umich.edu                         _dest, _op1, _op2)
527639Sgblack@eecs.umich.edu    {
537639Sgblack@eecs.umich.edu        %(constructor)s;
547639Sgblack@eecs.umich.edu    }
557639Sgblack@eecs.umich.edu
567639Sgblack@eecs.umich.edu    %(BasicExecDeclare)s
577639Sgblack@eecs.umich.edu};
587639Sgblack@eecs.umich.edu}};
597639Sgblack@eecs.umich.edu
607639Sgblack@eecs.umich.edudef template NeonRegRegRegImmOpDeclare {{
617639Sgblack@eecs.umich.edutemplate <class _Element>
627639Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
637639Sgblack@eecs.umich.edu{
647639Sgblack@eecs.umich.edu  protected:
657639Sgblack@eecs.umich.edu    typedef _Element Element;
667639Sgblack@eecs.umich.edu  public:
677639Sgblack@eecs.umich.edu    // Constructor
687639Sgblack@eecs.umich.edu    %(class_name)s(ExtMachInst machInst,
697639Sgblack@eecs.umich.edu                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
707639Sgblack@eecs.umich.edu                   uint64_t _imm)
717639Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
727639Sgblack@eecs.umich.edu                         _dest, _op1, _op2, _imm)
737639Sgblack@eecs.umich.edu    {
747639Sgblack@eecs.umich.edu        %(constructor)s;
757639Sgblack@eecs.umich.edu    }
767639Sgblack@eecs.umich.edu
777639Sgblack@eecs.umich.edu    %(BasicExecDeclare)s
787639Sgblack@eecs.umich.edu};
797639Sgblack@eecs.umich.edu}};
807639Sgblack@eecs.umich.edu
817639Sgblack@eecs.umich.edudef template NeonRegRegImmOpDeclare {{
827639Sgblack@eecs.umich.edutemplate <class _Element>
837639Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
847639Sgblack@eecs.umich.edu{
857639Sgblack@eecs.umich.edu  protected:
867639Sgblack@eecs.umich.edu    typedef _Element Element;
877639Sgblack@eecs.umich.edu  public:
887639Sgblack@eecs.umich.edu    // Constructor
897639Sgblack@eecs.umich.edu    %(class_name)s(ExtMachInst machInst,
907639Sgblack@eecs.umich.edu                   IntRegIndex _dest, IntRegIndex _op1, uint64_t _imm)
917639Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
927639Sgblack@eecs.umich.edu                         _dest, _op1, _imm)
937639Sgblack@eecs.umich.edu    {
947639Sgblack@eecs.umich.edu        %(constructor)s;
957639Sgblack@eecs.umich.edu    }
967639Sgblack@eecs.umich.edu
977639Sgblack@eecs.umich.edu    %(BasicExecDeclare)s
987639Sgblack@eecs.umich.edu};
997639Sgblack@eecs.umich.edu}};
1007639Sgblack@eecs.umich.edu
1017639Sgblack@eecs.umich.edudef template NeonRegImmOpDeclare {{
1027639Sgblack@eecs.umich.edutemplate <class _Element>
1037639Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
1047639Sgblack@eecs.umich.edu{
1057639Sgblack@eecs.umich.edu  protected:
1067639Sgblack@eecs.umich.edu    typedef _Element Element;
1077639Sgblack@eecs.umich.edu  public:
1087639Sgblack@eecs.umich.edu    // Constructor
1097639Sgblack@eecs.umich.edu    %(class_name)s(ExtMachInst machInst, IntRegIndex _dest, uint64_t _imm)
1107639Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s, _dest, _imm)
1117639Sgblack@eecs.umich.edu    {
1127639Sgblack@eecs.umich.edu        %(constructor)s;
1137639Sgblack@eecs.umich.edu    }
1147639Sgblack@eecs.umich.edu
1157639Sgblack@eecs.umich.edu    %(BasicExecDeclare)s
1167639Sgblack@eecs.umich.edu};
1177639Sgblack@eecs.umich.edu}};
1187639Sgblack@eecs.umich.edu
1197639Sgblack@eecs.umich.edudef template NeonRegRegOpDeclare {{
1207639Sgblack@eecs.umich.edutemplate <class _Element>
1217639Sgblack@eecs.umich.educlass %(class_name)s : public %(base_class)s
1227639Sgblack@eecs.umich.edu{
1237639Sgblack@eecs.umich.edu  protected:
1247639Sgblack@eecs.umich.edu    typedef _Element Element;
1257639Sgblack@eecs.umich.edu  public:
1267639Sgblack@eecs.umich.edu    // Constructor
1277639Sgblack@eecs.umich.edu    %(class_name)s(ExtMachInst machInst,
1287639Sgblack@eecs.umich.edu                   IntRegIndex _dest, IntRegIndex _op1)
1297639Sgblack@eecs.umich.edu        : %(base_class)s("%(mnemonic)s", machInst, %(op_class)s,
1307639Sgblack@eecs.umich.edu                         _dest, _op1)
1317639Sgblack@eecs.umich.edu    {
1327639Sgblack@eecs.umich.edu        %(constructor)s;
1337639Sgblack@eecs.umich.edu    }
1347639Sgblack@eecs.umich.edu
1357639Sgblack@eecs.umich.edu    %(BasicExecDeclare)s
1367639Sgblack@eecs.umich.edu};
1377639Sgblack@eecs.umich.edu}};
1387639Sgblack@eecs.umich.edu
1397639Sgblack@eecs.umich.edudef template NeonExecDeclare {{
1407639Sgblack@eecs.umich.edu    template
1417639Sgblack@eecs.umich.edu    Fault %(class_name)s<%(targs)s>::execute(
1427639Sgblack@eecs.umich.edu            %(CPU_exec_context)s *, Trace::InstRecord *) const;
1437639Sgblack@eecs.umich.edu}};
1447639Sgblack@eecs.umich.edu
1457641Sgblack@eecs.umich.eduoutput header {{
1467641Sgblack@eecs.umich.edu    template <class T>
1477641Sgblack@eecs.umich.edu    // Implement a less-than-zero function: ltz()
1487641Sgblack@eecs.umich.edu    // this function exists because some versions of GCC complain when a
1497641Sgblack@eecs.umich.edu    // comparison is done between a unsigned variable and 0 and for GCC 4.2
1507641Sgblack@eecs.umich.edu    // there is no way to disable this warning
1517641Sgblack@eecs.umich.edu    inline bool ltz(T t);
1527641Sgblack@eecs.umich.edu
1537641Sgblack@eecs.umich.edu    template <>
1547641Sgblack@eecs.umich.edu    inline bool ltz(uint8_t) { return false; }
1557641Sgblack@eecs.umich.edu    template <>
1567641Sgblack@eecs.umich.edu    inline bool ltz(uint16_t) { return false; }
1577641Sgblack@eecs.umich.edu    template <>
1587641Sgblack@eecs.umich.edu    inline bool ltz(uint32_t) { return false; }
1597641Sgblack@eecs.umich.edu    template <>
1607641Sgblack@eecs.umich.edu    inline bool ltz(uint64_t) { return false; }
1617641Sgblack@eecs.umich.edu    template <>
1627641Sgblack@eecs.umich.edu    inline bool ltz(int8_t v) { return v < 0; }
1637641Sgblack@eecs.umich.edu    template <>
1647641Sgblack@eecs.umich.edu    inline bool ltz(int16_t v) { return v < 0; }
1657641Sgblack@eecs.umich.edu    template <>
1667641Sgblack@eecs.umich.edu    inline bool ltz(int32_t v) { return v < 0; }
1677641Sgblack@eecs.umich.edu    template <>
1687641Sgblack@eecs.umich.edu    inline bool ltz(int64_t v) { return v < 0; }
1697641Sgblack@eecs.umich.edu}};
1707641Sgblack@eecs.umich.edu
1717639Sgblack@eecs.umich.edudef template NeonEqualRegExecute {{
1727639Sgblack@eecs.umich.edu    template <class Element>
1737639Sgblack@eecs.umich.edu    Fault %(class_name)s<Element>::execute(%(CPU_exec_context)s *xc,
1747639Sgblack@eecs.umich.edu            Trace::InstRecord *traceData) const
1757639Sgblack@eecs.umich.edu    {
1767639Sgblack@eecs.umich.edu        Fault fault = NoFault;
1777639Sgblack@eecs.umich.edu        %(op_decl)s;
1787639Sgblack@eecs.umich.edu        %(op_rd)s;
1797639Sgblack@eecs.umich.edu
1807639Sgblack@eecs.umich.edu        const unsigned rCount = %(r_count)d;
1817639Sgblack@eecs.umich.edu        const unsigned eCount = rCount * sizeof(FloatRegBits) / sizeof(Element);
1827639Sgblack@eecs.umich.edu
1837639Sgblack@eecs.umich.edu        union RegVect {
1847639Sgblack@eecs.umich.edu            FloatRegBits regs[rCount];
1857639Sgblack@eecs.umich.edu            Element elements[eCount];
1867639Sgblack@eecs.umich.edu        };
1877639Sgblack@eecs.umich.edu
1887639Sgblack@eecs.umich.edu        if (%(predicate_test)s)
1897639Sgblack@eecs.umich.edu        {
1907639Sgblack@eecs.umich.edu            %(code)s;
1917639Sgblack@eecs.umich.edu            if (fault == NoFault)
1927639Sgblack@eecs.umich.edu            {
1937639Sgblack@eecs.umich.edu                %(op_wb)s;
1947639Sgblack@eecs.umich.edu            }
1957639Sgblack@eecs.umich.edu        }
1967639Sgblack@eecs.umich.edu
1977639Sgblack@eecs.umich.edu        if (fault == NoFault && machInst.itstateMask != 0) {
1987639Sgblack@eecs.umich.edu            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
1997639Sgblack@eecs.umich.edu        }
2007639Sgblack@eecs.umich.edu
2017639Sgblack@eecs.umich.edu        return fault;
2027639Sgblack@eecs.umich.edu    }
2037639Sgblack@eecs.umich.edu}};
2047639Sgblack@eecs.umich.edu
2057639Sgblack@eecs.umich.eduoutput header {{
2067639Sgblack@eecs.umich.edu    uint16_t nextBiggerType(uint8_t);
2077639Sgblack@eecs.umich.edu    uint32_t nextBiggerType(uint16_t);
2087639Sgblack@eecs.umich.edu    uint64_t nextBiggerType(uint32_t);
2097639Sgblack@eecs.umich.edu    int16_t nextBiggerType(int8_t);
2107639Sgblack@eecs.umich.edu    int32_t nextBiggerType(int16_t);
2117639Sgblack@eecs.umich.edu    int64_t nextBiggerType(int32_t);
2127639Sgblack@eecs.umich.edu}};
2137639Sgblack@eecs.umich.edu
2147639Sgblack@eecs.umich.edudef template NeonUnequalRegExecute {{
2157639Sgblack@eecs.umich.edu    template <class Element>
2167639Sgblack@eecs.umich.edu    Fault %(class_name)s<Element>::execute(%(CPU_exec_context)s *xc,
2177639Sgblack@eecs.umich.edu            Trace::InstRecord *traceData) const
2187639Sgblack@eecs.umich.edu    {
2197639Sgblack@eecs.umich.edu        typedef typeof(nextBiggerType((Element)0)) BigElement;
2207639Sgblack@eecs.umich.edu        Fault fault = NoFault;
2217639Sgblack@eecs.umich.edu        %(op_decl)s;
2227639Sgblack@eecs.umich.edu        %(op_rd)s;
2237639Sgblack@eecs.umich.edu
2247639Sgblack@eecs.umich.edu        const unsigned rCount = %(r_count)d;
2257639Sgblack@eecs.umich.edu        const unsigned eCount = rCount * sizeof(FloatRegBits) / sizeof(Element);
2267639Sgblack@eecs.umich.edu
2277639Sgblack@eecs.umich.edu        union RegVect {
2287639Sgblack@eecs.umich.edu            FloatRegBits regs[rCount];
2297639Sgblack@eecs.umich.edu            Element elements[eCount];
2307639Sgblack@eecs.umich.edu            BigElement bigElements[eCount / 2];
2317639Sgblack@eecs.umich.edu        };
2327639Sgblack@eecs.umich.edu
2337639Sgblack@eecs.umich.edu        union BigRegVect {
2347639Sgblack@eecs.umich.edu            FloatRegBits regs[2 * rCount];
2357639Sgblack@eecs.umich.edu            BigElement elements[eCount];
2367639Sgblack@eecs.umich.edu        };
2377639Sgblack@eecs.umich.edu
2387639Sgblack@eecs.umich.edu        if (%(predicate_test)s)
2397639Sgblack@eecs.umich.edu        {
2407639Sgblack@eecs.umich.edu            %(code)s;
2417639Sgblack@eecs.umich.edu            if (fault == NoFault)
2427639Sgblack@eecs.umich.edu            {
2437639Sgblack@eecs.umich.edu                %(op_wb)s;
2447639Sgblack@eecs.umich.edu            }
2457639Sgblack@eecs.umich.edu        }
2467639Sgblack@eecs.umich.edu
2477639Sgblack@eecs.umich.edu        if (fault == NoFault && machInst.itstateMask != 0) {
2487639Sgblack@eecs.umich.edu            xc->setMiscReg(MISCREG_ITSTATE, machInst.newItstate);
2497639Sgblack@eecs.umich.edu        }
2507639Sgblack@eecs.umich.edu
2517639Sgblack@eecs.umich.edu        return fault;
2527639Sgblack@eecs.umich.edu    }
2537639Sgblack@eecs.umich.edu}};
254