vfp.hh revision 7376
17375Sgblack@eecs.umich.edu/*
27375Sgblack@eecs.umich.edu * Copyright (c) 2010 ARM Limited
37375Sgblack@eecs.umich.edu * All rights reserved
47375Sgblack@eecs.umich.edu *
57375Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall
67375Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual
77375Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating
87375Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software
97375Sgblack@eecs.umich.edu * licensed hereunder.  You may use the software subject to the license
107375Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
117375Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
127375Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form.
137375Sgblack@eecs.umich.edu *
147375Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
157375Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
167375Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
177375Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
187375Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
197375Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
207375Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
217375Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
227375Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
237375Sgblack@eecs.umich.edu * this software without specific prior written permission.
247375Sgblack@eecs.umich.edu *
257375Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
267375Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
277375Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
287375Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
297375Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
307375Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
317375Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
327375Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
337375Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
347375Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
357375Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
367375Sgblack@eecs.umich.edu *
377375Sgblack@eecs.umich.edu * Authors: Gabe Black
387375Sgblack@eecs.umich.edu */
397375Sgblack@eecs.umich.edu
407375Sgblack@eecs.umich.edu#ifndef __ARCH_ARM_INSTS_VFP_HH__
417375Sgblack@eecs.umich.edu#define __ARCH_ARM_INSTS_VFP_HH__
427375Sgblack@eecs.umich.edu
437375Sgblack@eecs.umich.edu#include "arch/arm/insts/misc.hh"
447375Sgblack@eecs.umich.edu
457375Sgblack@eecs.umich.eduenum VfpMicroMode {
467375Sgblack@eecs.umich.edu    VfpNotAMicroop,
477375Sgblack@eecs.umich.edu    VfpMicroop,
487375Sgblack@eecs.umich.edu    VfpFirstMicroop,
497375Sgblack@eecs.umich.edu    VfpLastMicroop
507375Sgblack@eecs.umich.edu};
517375Sgblack@eecs.umich.edu
527375Sgblack@eecs.umich.edutemplate<class T>
537375Sgblack@eecs.umich.edustatic inline void
547375Sgblack@eecs.umich.edusetVfpMicroFlags(VfpMicroMode mode, T &flags)
557375Sgblack@eecs.umich.edu{
567375Sgblack@eecs.umich.edu    switch (mode) {
577375Sgblack@eecs.umich.edu      case VfpMicroop:
587375Sgblack@eecs.umich.edu        flags[StaticInst::IsMicroop] = true;
597375Sgblack@eecs.umich.edu        break;
607375Sgblack@eecs.umich.edu      case VfpFirstMicroop:
617375Sgblack@eecs.umich.edu        flags[StaticInst::IsMicroop] =
627375Sgblack@eecs.umich.edu            flags[StaticInst::IsFirstMicroop] = true;
637375Sgblack@eecs.umich.edu        break;
647375Sgblack@eecs.umich.edu      case VfpLastMicroop:
657375Sgblack@eecs.umich.edu        flags[StaticInst::IsMicroop] =
667375Sgblack@eecs.umich.edu            flags[StaticInst::IsLastMicroop] = true;
677375Sgblack@eecs.umich.edu        break;
687375Sgblack@eecs.umich.edu      case VfpNotAMicroop:
697375Sgblack@eecs.umich.edu        break;
707375Sgblack@eecs.umich.edu    }
717376Sgblack@eecs.umich.edu    if (mode == VfpMicroop || mode == VfpFirstMicroop) {
727376Sgblack@eecs.umich.edu        flags[StaticInst::IsDelayedCommit] = true;
737376Sgblack@eecs.umich.edu    }
747375Sgblack@eecs.umich.edu}
757375Sgblack@eecs.umich.edu
767376Sgblack@eecs.umich.educlass VfpMacroOp : public PredMacroOp
777376Sgblack@eecs.umich.edu{
787376Sgblack@eecs.umich.edu  public:
797376Sgblack@eecs.umich.edu    static bool
807376Sgblack@eecs.umich.edu    inScalarBank(IntRegIndex idx)
817376Sgblack@eecs.umich.edu    {
827376Sgblack@eecs.umich.edu        return (idx % 32) < 8;
837376Sgblack@eecs.umich.edu    }
847376Sgblack@eecs.umich.edu
857376Sgblack@eecs.umich.edu  protected:
867376Sgblack@eecs.umich.edu    bool wide;
877376Sgblack@eecs.umich.edu
887376Sgblack@eecs.umich.edu    VfpMacroOp(const char *mnem, ExtMachInst _machInst,
897376Sgblack@eecs.umich.edu            OpClass __opClass, bool _wide) :
907376Sgblack@eecs.umich.edu        PredMacroOp(mnem, _machInst, __opClass), wide(_wide)
917376Sgblack@eecs.umich.edu    {}
927376Sgblack@eecs.umich.edu
937376Sgblack@eecs.umich.edu    IntRegIndex
947376Sgblack@eecs.umich.edu    addStride(IntRegIndex idx, unsigned stride)
957376Sgblack@eecs.umich.edu    {
967376Sgblack@eecs.umich.edu        if (wide) {
977376Sgblack@eecs.umich.edu            stride *= 2;
987376Sgblack@eecs.umich.edu        }
997376Sgblack@eecs.umich.edu        unsigned offset = idx % 8;
1007376Sgblack@eecs.umich.edu        idx = (IntRegIndex)(idx - offset);
1017376Sgblack@eecs.umich.edu        offset += stride;
1027376Sgblack@eecs.umich.edu        idx = (IntRegIndex)(idx + (offset % 8));
1037376Sgblack@eecs.umich.edu        return idx;
1047376Sgblack@eecs.umich.edu    }
1057376Sgblack@eecs.umich.edu
1067376Sgblack@eecs.umich.edu    void
1077376Sgblack@eecs.umich.edu    nextIdxs(IntRegIndex &dest, IntRegIndex &op1, IntRegIndex &op2)
1087376Sgblack@eecs.umich.edu    {
1097376Sgblack@eecs.umich.edu        unsigned stride = (machInst.fpscrStride == 0) ? 1 : 2;
1107376Sgblack@eecs.umich.edu        assert(!inScalarBank(dest));
1117376Sgblack@eecs.umich.edu        dest = addStride(dest, stride);
1127376Sgblack@eecs.umich.edu        op1 = addStride(op1, stride);
1137376Sgblack@eecs.umich.edu        if (!inScalarBank(op2)) {
1147376Sgblack@eecs.umich.edu            op2 = addStride(op2, stride);
1157376Sgblack@eecs.umich.edu        }
1167376Sgblack@eecs.umich.edu    }
1177376Sgblack@eecs.umich.edu
1187376Sgblack@eecs.umich.edu    void
1197376Sgblack@eecs.umich.edu    nextIdxs(IntRegIndex &dest, IntRegIndex &op1)
1207376Sgblack@eecs.umich.edu    {
1217376Sgblack@eecs.umich.edu        unsigned stride = (machInst.fpscrStride == 0) ? 1 : 2;
1227376Sgblack@eecs.umich.edu        assert(!inScalarBank(dest));
1237376Sgblack@eecs.umich.edu        dest = addStride(dest, stride);
1247376Sgblack@eecs.umich.edu        if (!inScalarBank(op1)) {
1257376Sgblack@eecs.umich.edu            op1 = addStride(op1, stride);
1267376Sgblack@eecs.umich.edu        }
1277376Sgblack@eecs.umich.edu    }
1287376Sgblack@eecs.umich.edu
1297376Sgblack@eecs.umich.edu    void
1307376Sgblack@eecs.umich.edu    nextIdxs(IntRegIndex &dest)
1317376Sgblack@eecs.umich.edu    {
1327376Sgblack@eecs.umich.edu        unsigned stride = (machInst.fpscrStride == 0) ? 1 : 2;
1337376Sgblack@eecs.umich.edu        assert(!inScalarBank(dest));
1347376Sgblack@eecs.umich.edu        dest = addStride(dest, stride);
1357376Sgblack@eecs.umich.edu    }
1367376Sgblack@eecs.umich.edu};
1377376Sgblack@eecs.umich.edu
1387375Sgblack@eecs.umich.educlass VfpRegRegOp : public RegRegOp
1397375Sgblack@eecs.umich.edu{
1407375Sgblack@eecs.umich.edu  protected:
1417375Sgblack@eecs.umich.edu    VfpRegRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
1427375Sgblack@eecs.umich.edu                IntRegIndex _dest, IntRegIndex _op1,
1437375Sgblack@eecs.umich.edu                VfpMicroMode mode = VfpNotAMicroop) :
1447375Sgblack@eecs.umich.edu        RegRegOp(mnem, _machInst, __opClass, _dest, _op1)
1457375Sgblack@eecs.umich.edu    {
1467375Sgblack@eecs.umich.edu        setVfpMicroFlags(mode, flags);
1477375Sgblack@eecs.umich.edu    }
1487375Sgblack@eecs.umich.edu};
1497375Sgblack@eecs.umich.edu
1507375Sgblack@eecs.umich.educlass VfpRegImmOp : public RegImmOp
1517375Sgblack@eecs.umich.edu{
1527375Sgblack@eecs.umich.edu  protected:
1537375Sgblack@eecs.umich.edu    VfpRegImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
1547375Sgblack@eecs.umich.edu                IntRegIndex _dest, uint64_t _imm,
1557375Sgblack@eecs.umich.edu                VfpMicroMode mode = VfpNotAMicroop) :
1567375Sgblack@eecs.umich.edu        RegImmOp(mnem, _machInst, __opClass, _dest, _imm)
1577375Sgblack@eecs.umich.edu    {
1587375Sgblack@eecs.umich.edu        setVfpMicroFlags(mode, flags);
1597375Sgblack@eecs.umich.edu    }
1607375Sgblack@eecs.umich.edu};
1617375Sgblack@eecs.umich.edu
1627375Sgblack@eecs.umich.educlass VfpRegRegImmOp : public RegRegImmOp
1637375Sgblack@eecs.umich.edu{
1647375Sgblack@eecs.umich.edu  protected:
1657375Sgblack@eecs.umich.edu    VfpRegRegImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
1667375Sgblack@eecs.umich.edu                   IntRegIndex _dest, IntRegIndex _op1,
1677375Sgblack@eecs.umich.edu                   uint64_t _imm, VfpMicroMode mode = VfpNotAMicroop) :
1687375Sgblack@eecs.umich.edu        RegRegImmOp(mnem, _machInst, __opClass, _dest, _op1, _imm)
1697375Sgblack@eecs.umich.edu    {
1707375Sgblack@eecs.umich.edu        setVfpMicroFlags(mode, flags);
1717375Sgblack@eecs.umich.edu    }
1727375Sgblack@eecs.umich.edu};
1737375Sgblack@eecs.umich.edu
1747375Sgblack@eecs.umich.educlass VfpRegRegRegOp : public RegRegRegOp
1757375Sgblack@eecs.umich.edu{
1767375Sgblack@eecs.umich.edu  protected:
1777375Sgblack@eecs.umich.edu    VfpRegRegRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
1787375Sgblack@eecs.umich.edu                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
1797375Sgblack@eecs.umich.edu                   VfpMicroMode mode = VfpNotAMicroop) :
1807375Sgblack@eecs.umich.edu        RegRegRegOp(mnem, _machInst, __opClass, _dest, _op1, _op2)
1817375Sgblack@eecs.umich.edu    {
1827375Sgblack@eecs.umich.edu        setVfpMicroFlags(mode, flags);
1837375Sgblack@eecs.umich.edu    }
1847375Sgblack@eecs.umich.edu};
1857375Sgblack@eecs.umich.edu
1867375Sgblack@eecs.umich.edu#endif //__ARCH_ARM_INSTS_VFP_HH__
187