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