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