vfp.hh revision 7430
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" 447378Sgblack@eecs.umich.edu#include "arch/arm/miscregs.hh" 457378Sgblack@eecs.umich.edu#include <fenv.h> 467382Sgblack@eecs.umich.edu#include <cmath> 477375Sgblack@eecs.umich.edu 487384Sgblack@eecs.umich.edunamespace ArmISA 497384Sgblack@eecs.umich.edu{ 507384Sgblack@eecs.umich.edu 517375Sgblack@eecs.umich.eduenum VfpMicroMode { 527375Sgblack@eecs.umich.edu VfpNotAMicroop, 537375Sgblack@eecs.umich.edu VfpMicroop, 547375Sgblack@eecs.umich.edu VfpFirstMicroop, 557375Sgblack@eecs.umich.edu VfpLastMicroop 567375Sgblack@eecs.umich.edu}; 577375Sgblack@eecs.umich.edu 587375Sgblack@eecs.umich.edutemplate<class T> 597375Sgblack@eecs.umich.edustatic inline void 607375Sgblack@eecs.umich.edusetVfpMicroFlags(VfpMicroMode mode, T &flags) 617375Sgblack@eecs.umich.edu{ 627375Sgblack@eecs.umich.edu switch (mode) { 637375Sgblack@eecs.umich.edu case VfpMicroop: 647375Sgblack@eecs.umich.edu flags[StaticInst::IsMicroop] = true; 657375Sgblack@eecs.umich.edu break; 667375Sgblack@eecs.umich.edu case VfpFirstMicroop: 677375Sgblack@eecs.umich.edu flags[StaticInst::IsMicroop] = 687375Sgblack@eecs.umich.edu flags[StaticInst::IsFirstMicroop] = true; 697375Sgblack@eecs.umich.edu break; 707375Sgblack@eecs.umich.edu case VfpLastMicroop: 717375Sgblack@eecs.umich.edu flags[StaticInst::IsMicroop] = 727375Sgblack@eecs.umich.edu flags[StaticInst::IsLastMicroop] = true; 737375Sgblack@eecs.umich.edu break; 747375Sgblack@eecs.umich.edu case VfpNotAMicroop: 757375Sgblack@eecs.umich.edu break; 767375Sgblack@eecs.umich.edu } 777376Sgblack@eecs.umich.edu if (mode == VfpMicroop || mode == VfpFirstMicroop) { 787376Sgblack@eecs.umich.edu flags[StaticInst::IsDelayedCommit] = true; 797376Sgblack@eecs.umich.edu } 807375Sgblack@eecs.umich.edu} 817375Sgblack@eecs.umich.edu 827378Sgblack@eecs.umich.eduenum FeExceptionBit 837378Sgblack@eecs.umich.edu{ 847378Sgblack@eecs.umich.edu FeDivByZero = FE_DIVBYZERO, 857378Sgblack@eecs.umich.edu FeInexact = FE_INEXACT, 867378Sgblack@eecs.umich.edu FeInvalid = FE_INVALID, 877378Sgblack@eecs.umich.edu FeOverflow = FE_OVERFLOW, 887378Sgblack@eecs.umich.edu FeUnderflow = FE_UNDERFLOW, 897378Sgblack@eecs.umich.edu FeAllExceptions = FE_ALL_EXCEPT 907378Sgblack@eecs.umich.edu}; 917378Sgblack@eecs.umich.edu 927378Sgblack@eecs.umich.eduenum FeRoundingMode 937378Sgblack@eecs.umich.edu{ 947378Sgblack@eecs.umich.edu FeRoundDown = FE_DOWNWARD, 957378Sgblack@eecs.umich.edu FeRoundNearest = FE_TONEAREST, 967378Sgblack@eecs.umich.edu FeRoundZero = FE_TOWARDZERO, 977378Sgblack@eecs.umich.edu FeRoundUpward = FE_UPWARD 987378Sgblack@eecs.umich.edu}; 997378Sgblack@eecs.umich.edu 1007378Sgblack@eecs.umich.eduenum VfpRoundingMode 1017378Sgblack@eecs.umich.edu{ 1027378Sgblack@eecs.umich.edu VfpRoundNearest = 0, 1037378Sgblack@eecs.umich.edu VfpRoundUpward = 1, 1047378Sgblack@eecs.umich.edu VfpRoundDown = 2, 1057378Sgblack@eecs.umich.edu VfpRoundZero = 3 1067378Sgblack@eecs.umich.edu}; 1077378Sgblack@eecs.umich.edu 1087382Sgblack@eecs.umich.edutemplate <class fpType> 1097396Sgblack@eecs.umich.edustatic inline bool 1107396Sgblack@eecs.umich.eduflushToZero(fpType &op) 1117396Sgblack@eecs.umich.edu{ 1127396Sgblack@eecs.umich.edu fpType junk = 0.0; 1137396Sgblack@eecs.umich.edu if (std::fpclassify(op) == FP_SUBNORMAL) { 1147396Sgblack@eecs.umich.edu uint64_t bitMask = ULL(0x1) << (sizeof(fpType) * 8 - 1); 1157396Sgblack@eecs.umich.edu op = bitsToFp(fpToBits(op) & bitMask, junk); 1167396Sgblack@eecs.umich.edu return true; 1177396Sgblack@eecs.umich.edu } 1187396Sgblack@eecs.umich.edu return false; 1197396Sgblack@eecs.umich.edu} 1207396Sgblack@eecs.umich.edu 1217396Sgblack@eecs.umich.edutemplate <class fpType> 1227396Sgblack@eecs.umich.edustatic inline bool 1237396Sgblack@eecs.umich.eduflushToZero(fpType &op1, fpType &op2) 1247396Sgblack@eecs.umich.edu{ 1257396Sgblack@eecs.umich.edu bool flush1 = flushToZero(op1); 1267396Sgblack@eecs.umich.edu bool flush2 = flushToZero(op2); 1277396Sgblack@eecs.umich.edu return flush1 || flush2; 1287396Sgblack@eecs.umich.edu} 1297396Sgblack@eecs.umich.edu 1307397Sgblack@eecs.umich.edutemplate <class fpType> 1317397Sgblack@eecs.umich.edustatic inline void 1327397Sgblack@eecs.umich.eduvfpFlushToZero(FPSCR &fpscr, fpType &op) 1337397Sgblack@eecs.umich.edu{ 1347397Sgblack@eecs.umich.edu if (fpscr.fz == 1 && flushToZero(op)) { 1357397Sgblack@eecs.umich.edu fpscr.idc = 1; 1367397Sgblack@eecs.umich.edu } 1377397Sgblack@eecs.umich.edu} 1387397Sgblack@eecs.umich.edu 1397397Sgblack@eecs.umich.edutemplate <class fpType> 1407397Sgblack@eecs.umich.edustatic inline void 1417397Sgblack@eecs.umich.eduvfpFlushToZero(FPSCR &fpscr, fpType &op1, fpType &op2) 1427397Sgblack@eecs.umich.edu{ 1437397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, op1); 1447397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, op2); 1457397Sgblack@eecs.umich.edu} 1467397Sgblack@eecs.umich.edu 1477384Sgblack@eecs.umich.edustatic inline uint32_t 1487384Sgblack@eecs.umich.edufpToBits(float fp) 1497384Sgblack@eecs.umich.edu{ 1507384Sgblack@eecs.umich.edu union 1517384Sgblack@eecs.umich.edu { 1527384Sgblack@eecs.umich.edu float fp; 1537384Sgblack@eecs.umich.edu uint32_t bits; 1547384Sgblack@eecs.umich.edu } val; 1557384Sgblack@eecs.umich.edu val.fp = fp; 1567384Sgblack@eecs.umich.edu return val.bits; 1577384Sgblack@eecs.umich.edu} 1587384Sgblack@eecs.umich.edu 1597384Sgblack@eecs.umich.edustatic inline uint64_t 1607384Sgblack@eecs.umich.edufpToBits(double fp) 1617384Sgblack@eecs.umich.edu{ 1627384Sgblack@eecs.umich.edu union 1637384Sgblack@eecs.umich.edu { 1647384Sgblack@eecs.umich.edu double fp; 1657384Sgblack@eecs.umich.edu uint64_t bits; 1667384Sgblack@eecs.umich.edu } val; 1677384Sgblack@eecs.umich.edu val.fp = fp; 1687384Sgblack@eecs.umich.edu return val.bits; 1697384Sgblack@eecs.umich.edu} 1707384Sgblack@eecs.umich.edu 1717384Sgblack@eecs.umich.edustatic inline float 1727384Sgblack@eecs.umich.edubitsToFp(uint64_t bits, float junk) 1737384Sgblack@eecs.umich.edu{ 1747384Sgblack@eecs.umich.edu union 1757384Sgblack@eecs.umich.edu { 1767384Sgblack@eecs.umich.edu float fp; 1777384Sgblack@eecs.umich.edu uint32_t bits; 1787384Sgblack@eecs.umich.edu } val; 1797384Sgblack@eecs.umich.edu val.bits = bits; 1807384Sgblack@eecs.umich.edu return val.fp; 1817384Sgblack@eecs.umich.edu} 1827384Sgblack@eecs.umich.edu 1837384Sgblack@eecs.umich.edustatic inline double 1847384Sgblack@eecs.umich.edubitsToFp(uint64_t bits, double junk) 1857384Sgblack@eecs.umich.edu{ 1867384Sgblack@eecs.umich.edu union 1877384Sgblack@eecs.umich.edu { 1887384Sgblack@eecs.umich.edu double fp; 1897384Sgblack@eecs.umich.edu uint64_t bits; 1907384Sgblack@eecs.umich.edu } val; 1917384Sgblack@eecs.umich.edu val.bits = bits; 1927384Sgblack@eecs.umich.edu return val.fp; 1937384Sgblack@eecs.umich.edu} 1947384Sgblack@eecs.umich.edu 1957396Sgblack@eecs.umich.edutypedef int VfpSavedState; 1967396Sgblack@eecs.umich.edu 1977430Sgblack@eecs.umich.eduVfpSavedState prepFpState(uint32_t rMode); 1987430Sgblack@eecs.umich.eduvoid finishVfp(FPSCR &fpscr, VfpSavedState state); 1997396Sgblack@eecs.umich.edu 2007384Sgblack@eecs.umich.edutemplate <class fpType> 2017430Sgblack@eecs.umich.edufpType fixDest(FPSCR fpscr, fpType val, fpType op1); 2027386Sgblack@eecs.umich.edu 2037386Sgblack@eecs.umich.edutemplate <class fpType> 2047430Sgblack@eecs.umich.edufpType fixDest(FPSCR fpscr, fpType val, fpType op1, fpType op2); 2057384Sgblack@eecs.umich.edu 2067386Sgblack@eecs.umich.edutemplate <class fpType> 2077430Sgblack@eecs.umich.edufpType fixDivDest(FPSCR fpscr, fpType val, fpType op1, fpType op2); 2087386Sgblack@eecs.umich.edu 2097430Sgblack@eecs.umich.edufloat fixFpDFpSDest(FPSCR fpscr, double val); 2107430Sgblack@eecs.umich.edudouble fixFpSFpDDest(FPSCR fpscr, float val); 2117386Sgblack@eecs.umich.edu 2127430Sgblack@eecs.umich.edufloat vcvtFpSFpH(FPSCR &fpscr, float op, float dest, bool top); 2137430Sgblack@eecs.umich.edufloat vcvtFpHFpS(FPSCR &fpscr, float op, bool top); 2147398Sgblack@eecs.umich.edu 2157396Sgblack@eecs.umich.edustatic inline double 2167396Sgblack@eecs.umich.edumakeDouble(uint32_t low, uint32_t high) 2177396Sgblack@eecs.umich.edu{ 2187396Sgblack@eecs.umich.edu double junk = 0.0; 2197396Sgblack@eecs.umich.edu return bitsToFp((uint64_t)low | ((uint64_t)high << 32), junk); 2207396Sgblack@eecs.umich.edu} 2217396Sgblack@eecs.umich.edu 2227396Sgblack@eecs.umich.edustatic inline uint32_t 2237396Sgblack@eecs.umich.edulowFromDouble(double val) 2247396Sgblack@eecs.umich.edu{ 2257396Sgblack@eecs.umich.edu return fpToBits(val); 2267396Sgblack@eecs.umich.edu} 2277396Sgblack@eecs.umich.edu 2287396Sgblack@eecs.umich.edustatic inline uint32_t 2297396Sgblack@eecs.umich.eduhighFromDouble(double val) 2307396Sgblack@eecs.umich.edu{ 2317396Sgblack@eecs.umich.edu return fpToBits(val) >> 32; 2327396Sgblack@eecs.umich.edu} 2337396Sgblack@eecs.umich.edu 2347430Sgblack@eecs.umich.eduuint64_t vfpFpSToFixed(float val, bool isSigned, bool half, 2357430Sgblack@eecs.umich.edu uint8_t imm, bool rzero = true); 2367430Sgblack@eecs.umich.edufloat vfpUFixedToFpS(FPSCR fpscr, uint32_t val, bool half, uint8_t imm); 2377430Sgblack@eecs.umich.edufloat vfpSFixedToFpS(FPSCR fpscr, int32_t val, bool half, uint8_t imm); 2387382Sgblack@eecs.umich.edu 2397430Sgblack@eecs.umich.eduuint64_t vfpFpDToFixed(double val, bool isSigned, bool half, 2407430Sgblack@eecs.umich.edu uint8_t imm, bool rzero = true); 2417430Sgblack@eecs.umich.edudouble vfpUFixedToFpD(FPSCR fpscr, uint32_t val, bool half, uint8_t imm); 2427430Sgblack@eecs.umich.edudouble vfpSFixedToFpD(FPSCR fpscr, int32_t val, bool half, uint8_t imm); 2437379Sgblack@eecs.umich.edu 2447376Sgblack@eecs.umich.educlass VfpMacroOp : public PredMacroOp 2457376Sgblack@eecs.umich.edu{ 2467376Sgblack@eecs.umich.edu public: 2477376Sgblack@eecs.umich.edu static bool 2487376Sgblack@eecs.umich.edu inScalarBank(IntRegIndex idx) 2497376Sgblack@eecs.umich.edu { 2507376Sgblack@eecs.umich.edu return (idx % 32) < 8; 2517376Sgblack@eecs.umich.edu } 2527376Sgblack@eecs.umich.edu 2537376Sgblack@eecs.umich.edu protected: 2547376Sgblack@eecs.umich.edu bool wide; 2557376Sgblack@eecs.umich.edu 2567376Sgblack@eecs.umich.edu VfpMacroOp(const char *mnem, ExtMachInst _machInst, 2577376Sgblack@eecs.umich.edu OpClass __opClass, bool _wide) : 2587376Sgblack@eecs.umich.edu PredMacroOp(mnem, _machInst, __opClass), wide(_wide) 2597376Sgblack@eecs.umich.edu {} 2607376Sgblack@eecs.umich.edu 2617430Sgblack@eecs.umich.edu IntRegIndex addStride(IntRegIndex idx, unsigned stride); 2627430Sgblack@eecs.umich.edu void nextIdxs(IntRegIndex &dest, IntRegIndex &op1, IntRegIndex &op2); 2637430Sgblack@eecs.umich.edu void nextIdxs(IntRegIndex &dest, IntRegIndex &op1); 2647430Sgblack@eecs.umich.edu void nextIdxs(IntRegIndex &dest); 2657376Sgblack@eecs.umich.edu}; 2667376Sgblack@eecs.umich.edu 2677396Sgblack@eecs.umich.edustatic inline float 2687396Sgblack@eecs.umich.edufpAddS(float a, float b) 2697396Sgblack@eecs.umich.edu{ 2707396Sgblack@eecs.umich.edu return a + b; 2717396Sgblack@eecs.umich.edu} 2727396Sgblack@eecs.umich.edu 2737396Sgblack@eecs.umich.edustatic inline double 2747396Sgblack@eecs.umich.edufpAddD(double a, double b) 2757396Sgblack@eecs.umich.edu{ 2767396Sgblack@eecs.umich.edu return a + b; 2777396Sgblack@eecs.umich.edu} 2787396Sgblack@eecs.umich.edu 2797396Sgblack@eecs.umich.edustatic inline float 2807396Sgblack@eecs.umich.edufpSubS(float a, float b) 2817396Sgblack@eecs.umich.edu{ 2827396Sgblack@eecs.umich.edu return a - b; 2837396Sgblack@eecs.umich.edu} 2847396Sgblack@eecs.umich.edu 2857396Sgblack@eecs.umich.edustatic inline double 2867396Sgblack@eecs.umich.edufpSubD(double a, double b) 2877396Sgblack@eecs.umich.edu{ 2887396Sgblack@eecs.umich.edu return a - b; 2897396Sgblack@eecs.umich.edu} 2907396Sgblack@eecs.umich.edu 2917396Sgblack@eecs.umich.edustatic inline float 2927396Sgblack@eecs.umich.edufpDivS(float a, float b) 2937396Sgblack@eecs.umich.edu{ 2947396Sgblack@eecs.umich.edu return a / b; 2957396Sgblack@eecs.umich.edu} 2967396Sgblack@eecs.umich.edu 2977396Sgblack@eecs.umich.edustatic inline double 2987396Sgblack@eecs.umich.edufpDivD(double a, double b) 2997396Sgblack@eecs.umich.edu{ 3007396Sgblack@eecs.umich.edu return a / b; 3017396Sgblack@eecs.umich.edu} 3027396Sgblack@eecs.umich.edu 3037396Sgblack@eecs.umich.edustatic inline float 3047396Sgblack@eecs.umich.edufpMulS(float a, float b) 3057396Sgblack@eecs.umich.edu{ 3067396Sgblack@eecs.umich.edu return a * b; 3077396Sgblack@eecs.umich.edu} 3087396Sgblack@eecs.umich.edu 3097396Sgblack@eecs.umich.edustatic inline double 3107396Sgblack@eecs.umich.edufpMulD(double a, double b) 3117396Sgblack@eecs.umich.edu{ 3127396Sgblack@eecs.umich.edu return a * b; 3137396Sgblack@eecs.umich.edu} 3147396Sgblack@eecs.umich.edu 3157396Sgblack@eecs.umich.educlass FpOp : public PredOp 3167375Sgblack@eecs.umich.edu{ 3177375Sgblack@eecs.umich.edu protected: 3187396Sgblack@eecs.umich.edu FpOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass) : 3197396Sgblack@eecs.umich.edu PredOp(mnem, _machInst, __opClass) 3207396Sgblack@eecs.umich.edu {} 3217396Sgblack@eecs.umich.edu 3227396Sgblack@eecs.umich.edu virtual float 3237396Sgblack@eecs.umich.edu doOp(float op1, float op2) const 3247396Sgblack@eecs.umich.edu { 3257396Sgblack@eecs.umich.edu panic("Unimplemented version of doOp called.\n"); 3267396Sgblack@eecs.umich.edu } 3277396Sgblack@eecs.umich.edu 3287396Sgblack@eecs.umich.edu virtual float 3297396Sgblack@eecs.umich.edu doOp(float op1) const 3307396Sgblack@eecs.umich.edu { 3317396Sgblack@eecs.umich.edu panic("Unimplemented version of doOp called.\n"); 3327396Sgblack@eecs.umich.edu } 3337396Sgblack@eecs.umich.edu 3347396Sgblack@eecs.umich.edu virtual double 3357396Sgblack@eecs.umich.edu doOp(double op1, double op2) const 3367396Sgblack@eecs.umich.edu { 3377396Sgblack@eecs.umich.edu panic("Unimplemented version of doOp called.\n"); 3387396Sgblack@eecs.umich.edu } 3397396Sgblack@eecs.umich.edu 3407396Sgblack@eecs.umich.edu virtual double 3417396Sgblack@eecs.umich.edu doOp(double op1) const 3427396Sgblack@eecs.umich.edu { 3437396Sgblack@eecs.umich.edu panic("Unimplemented version of doOp called.\n"); 3447396Sgblack@eecs.umich.edu } 3457396Sgblack@eecs.umich.edu 3467396Sgblack@eecs.umich.edu double 3477396Sgblack@eecs.umich.edu dbl(uint32_t low, uint32_t high) const 3487396Sgblack@eecs.umich.edu { 3497396Sgblack@eecs.umich.edu double junk = 0.0; 3507396Sgblack@eecs.umich.edu return bitsToFp((uint64_t)low | ((uint64_t)high << 32), junk); 3517396Sgblack@eecs.umich.edu } 3527396Sgblack@eecs.umich.edu 3537396Sgblack@eecs.umich.edu uint32_t 3547396Sgblack@eecs.umich.edu dblLow(double val) const 3557396Sgblack@eecs.umich.edu { 3567396Sgblack@eecs.umich.edu return fpToBits(val); 3577396Sgblack@eecs.umich.edu } 3587396Sgblack@eecs.umich.edu 3597396Sgblack@eecs.umich.edu uint32_t 3607396Sgblack@eecs.umich.edu dblHi(double val) const 3617396Sgblack@eecs.umich.edu { 3627396Sgblack@eecs.umich.edu return fpToBits(val) >> 32; 3637396Sgblack@eecs.umich.edu } 3647396Sgblack@eecs.umich.edu 3657396Sgblack@eecs.umich.edu template <class fpType> 3667396Sgblack@eecs.umich.edu fpType 3677396Sgblack@eecs.umich.edu binaryOp(FPSCR &fpscr, fpType op1, fpType op2, 3687396Sgblack@eecs.umich.edu fpType (*func)(fpType, fpType), 3697430Sgblack@eecs.umich.edu bool flush, uint32_t rMode) const; 3707396Sgblack@eecs.umich.edu 3717396Sgblack@eecs.umich.edu template <class fpType> 3727396Sgblack@eecs.umich.edu fpType 3737396Sgblack@eecs.umich.edu unaryOp(FPSCR &fpscr, fpType op1, 3747396Sgblack@eecs.umich.edu fpType (*func)(fpType), 3757430Sgblack@eecs.umich.edu bool flush, uint32_t rMode) const; 3767396Sgblack@eecs.umich.edu}; 3777396Sgblack@eecs.umich.edu 3787396Sgblack@eecs.umich.educlass FpRegRegOp : public FpOp 3797396Sgblack@eecs.umich.edu{ 3807396Sgblack@eecs.umich.edu protected: 3817396Sgblack@eecs.umich.edu IntRegIndex dest; 3827396Sgblack@eecs.umich.edu IntRegIndex op1; 3837396Sgblack@eecs.umich.edu 3847396Sgblack@eecs.umich.edu FpRegRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass, 3857396Sgblack@eecs.umich.edu IntRegIndex _dest, IntRegIndex _op1, 3867396Sgblack@eecs.umich.edu VfpMicroMode mode = VfpNotAMicroop) : 3877396Sgblack@eecs.umich.edu FpOp(mnem, _machInst, __opClass), dest(_dest), op1(_op1) 3887375Sgblack@eecs.umich.edu { 3897375Sgblack@eecs.umich.edu setVfpMicroFlags(mode, flags); 3907375Sgblack@eecs.umich.edu } 3917396Sgblack@eecs.umich.edu 3927396Sgblack@eecs.umich.edu std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; 3937375Sgblack@eecs.umich.edu}; 3947375Sgblack@eecs.umich.edu 3957396Sgblack@eecs.umich.educlass FpRegImmOp : public FpOp 3967375Sgblack@eecs.umich.edu{ 3977375Sgblack@eecs.umich.edu protected: 3987396Sgblack@eecs.umich.edu IntRegIndex dest; 3997396Sgblack@eecs.umich.edu uint64_t imm; 4007396Sgblack@eecs.umich.edu 4017396Sgblack@eecs.umich.edu FpRegImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass, 4027396Sgblack@eecs.umich.edu IntRegIndex _dest, uint64_t _imm, 4037396Sgblack@eecs.umich.edu VfpMicroMode mode = VfpNotAMicroop) : 4047396Sgblack@eecs.umich.edu FpOp(mnem, _machInst, __opClass), dest(_dest), imm(_imm) 4057375Sgblack@eecs.umich.edu { 4067375Sgblack@eecs.umich.edu setVfpMicroFlags(mode, flags); 4077375Sgblack@eecs.umich.edu } 4087396Sgblack@eecs.umich.edu 4097396Sgblack@eecs.umich.edu std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; 4107375Sgblack@eecs.umich.edu}; 4117375Sgblack@eecs.umich.edu 4127396Sgblack@eecs.umich.educlass FpRegRegImmOp : public FpOp 4137375Sgblack@eecs.umich.edu{ 4147375Sgblack@eecs.umich.edu protected: 4157396Sgblack@eecs.umich.edu IntRegIndex dest; 4167396Sgblack@eecs.umich.edu IntRegIndex op1; 4177396Sgblack@eecs.umich.edu uint64_t imm; 4187396Sgblack@eecs.umich.edu 4197396Sgblack@eecs.umich.edu FpRegRegImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass, 4207396Sgblack@eecs.umich.edu IntRegIndex _dest, IntRegIndex _op1, 4217396Sgblack@eecs.umich.edu uint64_t _imm, VfpMicroMode mode = VfpNotAMicroop) : 4227396Sgblack@eecs.umich.edu FpOp(mnem, _machInst, __opClass), dest(_dest), op1(_op1), imm(_imm) 4237375Sgblack@eecs.umich.edu { 4247375Sgblack@eecs.umich.edu setVfpMicroFlags(mode, flags); 4257375Sgblack@eecs.umich.edu } 4267396Sgblack@eecs.umich.edu 4277396Sgblack@eecs.umich.edu std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; 4287375Sgblack@eecs.umich.edu}; 4297375Sgblack@eecs.umich.edu 4307396Sgblack@eecs.umich.educlass FpRegRegRegOp : public FpOp 4317375Sgblack@eecs.umich.edu{ 4327375Sgblack@eecs.umich.edu protected: 4337396Sgblack@eecs.umich.edu IntRegIndex dest; 4347396Sgblack@eecs.umich.edu IntRegIndex op1; 4357396Sgblack@eecs.umich.edu IntRegIndex op2; 4367396Sgblack@eecs.umich.edu 4377396Sgblack@eecs.umich.edu FpRegRegRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass, 4387396Sgblack@eecs.umich.edu IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2, 4397396Sgblack@eecs.umich.edu VfpMicroMode mode = VfpNotAMicroop) : 4407396Sgblack@eecs.umich.edu FpOp(mnem, _machInst, __opClass), dest(_dest), op1(_op1), op2(_op2) 4417375Sgblack@eecs.umich.edu { 4427375Sgblack@eecs.umich.edu setVfpMicroFlags(mode, flags); 4437375Sgblack@eecs.umich.edu } 4447396Sgblack@eecs.umich.edu 4457396Sgblack@eecs.umich.edu std::string generateDisassembly(Addr pc, const SymbolTable *symtab) const; 4467375Sgblack@eecs.umich.edu}; 4477375Sgblack@eecs.umich.edu 4487384Sgblack@eecs.umich.edu} 4497384Sgblack@eecs.umich.edu 4507375Sgblack@eecs.umich.edu#endif //__ARCH_ARM_INSTS_VFP_HH__ 451