vfp.hh revision 7386
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>
1097382Sgblack@eecs.umich.edustatic inline void
1107382Sgblack@eecs.umich.eduvfpFlushToZero(uint32_t &_fpscr, fpType &op)
1117382Sgblack@eecs.umich.edu{
1127382Sgblack@eecs.umich.edu    FPSCR fpscr = _fpscr;
1137382Sgblack@eecs.umich.edu    if (fpscr.fz == 1 && (std::fpclassify(op) == FP_SUBNORMAL)) {
1147382Sgblack@eecs.umich.edu        fpscr.idc = 1;
1157382Sgblack@eecs.umich.edu        op = 0;
1167382Sgblack@eecs.umich.edu    }
1177382Sgblack@eecs.umich.edu    _fpscr = fpscr;
1187382Sgblack@eecs.umich.edu}
1197382Sgblack@eecs.umich.edu
1207382Sgblack@eecs.umich.edutemplate <class fpType>
1217382Sgblack@eecs.umich.edustatic inline void
1227382Sgblack@eecs.umich.eduvfpFlushToZero(uint32_t &fpscr, fpType &op1, fpType &op2)
1237382Sgblack@eecs.umich.edu{
1247382Sgblack@eecs.umich.edu    vfpFlushToZero(fpscr, op1);
1257382Sgblack@eecs.umich.edu    vfpFlushToZero(fpscr, op2);
1267382Sgblack@eecs.umich.edu}
1277382Sgblack@eecs.umich.edu
1287384Sgblack@eecs.umich.edustatic inline uint32_t
1297384Sgblack@eecs.umich.edufpToBits(float fp)
1307384Sgblack@eecs.umich.edu{
1317384Sgblack@eecs.umich.edu    union
1327384Sgblack@eecs.umich.edu    {
1337384Sgblack@eecs.umich.edu        float fp;
1347384Sgblack@eecs.umich.edu        uint32_t bits;
1357384Sgblack@eecs.umich.edu    } val;
1367384Sgblack@eecs.umich.edu    val.fp = fp;
1377384Sgblack@eecs.umich.edu    return val.bits;
1387384Sgblack@eecs.umich.edu}
1397384Sgblack@eecs.umich.edu
1407384Sgblack@eecs.umich.edustatic inline uint64_t
1417384Sgblack@eecs.umich.edufpToBits(double fp)
1427384Sgblack@eecs.umich.edu{
1437384Sgblack@eecs.umich.edu    union
1447384Sgblack@eecs.umich.edu    {
1457384Sgblack@eecs.umich.edu        double fp;
1467384Sgblack@eecs.umich.edu        uint64_t bits;
1477384Sgblack@eecs.umich.edu    } val;
1487384Sgblack@eecs.umich.edu    val.fp = fp;
1497384Sgblack@eecs.umich.edu    return val.bits;
1507384Sgblack@eecs.umich.edu}
1517384Sgblack@eecs.umich.edu
1527384Sgblack@eecs.umich.edustatic inline float
1537384Sgblack@eecs.umich.edubitsToFp(uint64_t bits, float junk)
1547384Sgblack@eecs.umich.edu{
1557384Sgblack@eecs.umich.edu    union
1567384Sgblack@eecs.umich.edu    {
1577384Sgblack@eecs.umich.edu        float fp;
1587384Sgblack@eecs.umich.edu        uint32_t bits;
1597384Sgblack@eecs.umich.edu    } val;
1607384Sgblack@eecs.umich.edu    val.bits = bits;
1617384Sgblack@eecs.umich.edu    return val.fp;
1627384Sgblack@eecs.umich.edu}
1637384Sgblack@eecs.umich.edu
1647384Sgblack@eecs.umich.edustatic inline double
1657384Sgblack@eecs.umich.edubitsToFp(uint64_t bits, double junk)
1667384Sgblack@eecs.umich.edu{
1677384Sgblack@eecs.umich.edu    union
1687384Sgblack@eecs.umich.edu    {
1697384Sgblack@eecs.umich.edu        double fp;
1707384Sgblack@eecs.umich.edu        uint64_t bits;
1717384Sgblack@eecs.umich.edu    } val;
1727384Sgblack@eecs.umich.edu    val.bits = bits;
1737384Sgblack@eecs.umich.edu    return val.fp;
1747384Sgblack@eecs.umich.edu}
1757384Sgblack@eecs.umich.edu
1767384Sgblack@eecs.umich.edutemplate <class fpType>
1777384Sgblack@eecs.umich.edustatic inline fpType
1787386Sgblack@eecs.umich.edufixDest(FPSCR fpscr, fpType val, fpType op1)
1797386Sgblack@eecs.umich.edu{
1807386Sgblack@eecs.umich.edu    int fpClass = std::fpclassify(val);
1817386Sgblack@eecs.umich.edu    fpType junk = 0.0;
1827386Sgblack@eecs.umich.edu    if (fpClass == FP_NAN) {
1837386Sgblack@eecs.umich.edu        const bool single = (sizeof(val) == sizeof(float));
1847386Sgblack@eecs.umich.edu        const uint64_t qnan = single ? 0x7fc00000 : ULL(0x7ff8000000000000);
1857386Sgblack@eecs.umich.edu        const bool nan = std::isnan(op1);
1867386Sgblack@eecs.umich.edu        if (!nan || (fpscr.dn == 1)) {
1877386Sgblack@eecs.umich.edu            val = bitsToFp(qnan, junk);
1887386Sgblack@eecs.umich.edu        } else if (nan) {
1897386Sgblack@eecs.umich.edu            val = bitsToFp(fpToBits(op1) | qnan, junk);
1907386Sgblack@eecs.umich.edu        }
1917386Sgblack@eecs.umich.edu    } else if (fpClass == FP_SUBNORMAL && fpscr.fz == 1) {
1927386Sgblack@eecs.umich.edu        // Turn val into a zero with the correct sign;
1937386Sgblack@eecs.umich.edu        uint64_t bitMask = ULL(0x1) << (sizeof(fpType) * 8 - 1);
1947386Sgblack@eecs.umich.edu        val = bitsToFp(fpToBits(val) & bitMask, junk);
1957386Sgblack@eecs.umich.edu        feraiseexcept(FeUnderflow);
1967386Sgblack@eecs.umich.edu    }
1977386Sgblack@eecs.umich.edu    return val;
1987386Sgblack@eecs.umich.edu}
1997386Sgblack@eecs.umich.edu
2007386Sgblack@eecs.umich.edutemplate <class fpType>
2017386Sgblack@eecs.umich.edustatic inline fpType
2027385Sgblack@eecs.umich.edufixDest(FPSCR fpscr, fpType val, fpType op1, fpType op2)
2037384Sgblack@eecs.umich.edu{
2047385Sgblack@eecs.umich.edu    int fpClass = std::fpclassify(val);
2057385Sgblack@eecs.umich.edu    fpType junk = 0.0;
2067385Sgblack@eecs.umich.edu    if (fpClass == FP_NAN) {
2077384Sgblack@eecs.umich.edu        const bool single = (sizeof(val) == sizeof(float));
2087384Sgblack@eecs.umich.edu        const uint64_t qnan = single ? 0x7fc00000 : ULL(0x7ff8000000000000);
2097384Sgblack@eecs.umich.edu        const bool nan1 = std::isnan(op1);
2107384Sgblack@eecs.umich.edu        const bool nan2 = std::isnan(op2);
2117384Sgblack@eecs.umich.edu        const bool signal1 = nan1 && ((fpToBits(op1) & qnan) != qnan);
2127384Sgblack@eecs.umich.edu        const bool signal2 = nan2 && ((fpToBits(op2) & qnan) != qnan);
2137384Sgblack@eecs.umich.edu        if ((!nan1 && !nan2) || (fpscr.dn == 1)) {
2147384Sgblack@eecs.umich.edu            val = bitsToFp(qnan, junk);
2157384Sgblack@eecs.umich.edu        } else if (signal1) {
2167384Sgblack@eecs.umich.edu            val = bitsToFp(fpToBits(op1) | qnan, junk);
2177384Sgblack@eecs.umich.edu        } else if (signal2) {
2187384Sgblack@eecs.umich.edu            val = bitsToFp(fpToBits(op2) | qnan, junk);
2197384Sgblack@eecs.umich.edu        } else if (nan1) {
2207384Sgblack@eecs.umich.edu            val = op1;
2217384Sgblack@eecs.umich.edu        } else if (nan2) {
2227384Sgblack@eecs.umich.edu            val = op2;
2237384Sgblack@eecs.umich.edu        }
2247385Sgblack@eecs.umich.edu    } else if (fpClass == FP_SUBNORMAL && fpscr.fz == 1) {
2257385Sgblack@eecs.umich.edu        // Turn val into a zero with the correct sign;
2267385Sgblack@eecs.umich.edu        uint64_t bitMask = ULL(0x1) << (sizeof(fpType) * 8 - 1);
2277385Sgblack@eecs.umich.edu        val = bitsToFp(fpToBits(val) & bitMask, junk);
2287385Sgblack@eecs.umich.edu        feraiseexcept(FeUnderflow);
2297384Sgblack@eecs.umich.edu    }
2307384Sgblack@eecs.umich.edu    return val;
2317384Sgblack@eecs.umich.edu}
2327384Sgblack@eecs.umich.edu
2337386Sgblack@eecs.umich.edutemplate <class fpType>
2347386Sgblack@eecs.umich.edustatic inline fpType
2357386Sgblack@eecs.umich.edufixMultDest(FPSCR fpscr, fpType val, fpType op1, fpType op2)
2367386Sgblack@eecs.umich.edu{
2377386Sgblack@eecs.umich.edu    fpType mid = fixDest(fpscr, val, op1, op2);
2387386Sgblack@eecs.umich.edu    const bool single = (sizeof(fpType) == sizeof(float));
2397386Sgblack@eecs.umich.edu    const fpType junk = 0.0;
2407386Sgblack@eecs.umich.edu    if ((single && (val == bitsToFp(0x00800000, junk) ||
2417386Sgblack@eecs.umich.edu                    val == bitsToFp(0x80800000, junk))) ||
2427386Sgblack@eecs.umich.edu        (!single && (val == bitsToFp(ULL(0x0010000000000000), junk) ||
2437386Sgblack@eecs.umich.edu                     val == bitsToFp(ULL(0x8010000000000000), junk)))
2447386Sgblack@eecs.umich.edu        ) {
2457386Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (op1) : "m" (op1));
2467386Sgblack@eecs.umich.edu        fesetround(FeRoundZero);
2477386Sgblack@eecs.umich.edu        fpType temp = 0.0;
2487386Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (temp) : "m" (temp));
2497386Sgblack@eecs.umich.edu        temp = op1 * op2;
2507386Sgblack@eecs.umich.edu        if (!std::isnormal(temp)) {
2517386Sgblack@eecs.umich.edu            feraiseexcept(FeUnderflow);
2527386Sgblack@eecs.umich.edu        }
2537386Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (temp));
2547386Sgblack@eecs.umich.edu    }
2557386Sgblack@eecs.umich.edu    return mid;
2567386Sgblack@eecs.umich.edu}
2577386Sgblack@eecs.umich.edu
2587386Sgblack@eecs.umich.edutemplate <class fpType>
2597386Sgblack@eecs.umich.edustatic inline fpType
2607386Sgblack@eecs.umich.edufixDivDest(FPSCR fpscr, fpType val, fpType op1, fpType op2)
2617386Sgblack@eecs.umich.edu{
2627386Sgblack@eecs.umich.edu    fpType mid = fixDest(fpscr, val, op1, op2);
2637386Sgblack@eecs.umich.edu    const bool single = (sizeof(fpType) == sizeof(float));
2647386Sgblack@eecs.umich.edu    const fpType junk = 0.0;
2657386Sgblack@eecs.umich.edu    if ((single && (val == bitsToFp(0x00800000, junk) ||
2667386Sgblack@eecs.umich.edu                    val == bitsToFp(0x80800000, junk))) ||
2677386Sgblack@eecs.umich.edu        (!single && (val == bitsToFp(ULL(0x0010000000000000), junk) ||
2687386Sgblack@eecs.umich.edu                     val == bitsToFp(ULL(0x8010000000000000), junk)))
2697386Sgblack@eecs.umich.edu        ) {
2707386Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (op1) : "m" (op1));
2717386Sgblack@eecs.umich.edu        fesetround(FeRoundZero);
2727386Sgblack@eecs.umich.edu        fpType temp = 0.0;
2737386Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (temp) : "m" (temp));
2747386Sgblack@eecs.umich.edu        temp = op1 / op2;
2757386Sgblack@eecs.umich.edu        if (!std::isnormal(temp)) {
2767386Sgblack@eecs.umich.edu            feraiseexcept(FeUnderflow);
2777386Sgblack@eecs.umich.edu        }
2787386Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (temp));
2797386Sgblack@eecs.umich.edu    }
2807386Sgblack@eecs.umich.edu    return mid;
2817386Sgblack@eecs.umich.edu}
2827386Sgblack@eecs.umich.edu
2837386Sgblack@eecs.umich.edustatic inline float
2847386Sgblack@eecs.umich.edufixFpDFpSDest(FPSCR fpscr, double val)
2857386Sgblack@eecs.umich.edu{
2867386Sgblack@eecs.umich.edu    const float junk = 0.0;
2877386Sgblack@eecs.umich.edu    float op1 = 0.0;
2887386Sgblack@eecs.umich.edu    if (std::isnan(val)) {
2897386Sgblack@eecs.umich.edu        uint64_t valBits = fpToBits(val);
2907386Sgblack@eecs.umich.edu        uint32_t op1Bits = bits(valBits, 50, 29) |
2917386Sgblack@eecs.umich.edu                           (mask(9) << 22) |
2927386Sgblack@eecs.umich.edu                           (bits(valBits, 63) << 31);
2937386Sgblack@eecs.umich.edu        op1 = bitsToFp(op1Bits, junk);
2947386Sgblack@eecs.umich.edu    }
2957386Sgblack@eecs.umich.edu    float mid = fixDest(fpscr, (float)val, op1);
2967386Sgblack@eecs.umich.edu    if (mid == bitsToFp(0x00800000, junk) ||
2977386Sgblack@eecs.umich.edu        mid == bitsToFp(0x80800000, junk)) {
2987386Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (val) : "m" (val));
2997386Sgblack@eecs.umich.edu        fesetround(FeRoundZero);
3007386Sgblack@eecs.umich.edu        float temp = 0.0;
3017386Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (temp) : "m" (temp));
3027386Sgblack@eecs.umich.edu        temp = val;
3037386Sgblack@eecs.umich.edu        if (!std::isnormal(temp)) {
3047386Sgblack@eecs.umich.edu            feraiseexcept(FeUnderflow);
3057386Sgblack@eecs.umich.edu        }
3067386Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (temp));
3077386Sgblack@eecs.umich.edu    }
3087386Sgblack@eecs.umich.edu    return mid;
3097386Sgblack@eecs.umich.edu}
3107386Sgblack@eecs.umich.edu
3117379Sgblack@eecs.umich.edustatic inline uint64_t
3127379Sgblack@eecs.umich.eduvfpFpSToFixed(float val, bool isSigned, bool half, uint8_t imm)
3137379Sgblack@eecs.umich.edu{
3147379Sgblack@eecs.umich.edu    fesetround(FeRoundZero);
3157379Sgblack@eecs.umich.edu    val = val * powf(2.0, imm);
3167379Sgblack@eecs.umich.edu    __asm__ __volatile__("" : "=m" (val) : "m" (val));
3177379Sgblack@eecs.umich.edu    feclearexcept(FeAllExceptions);
3187382Sgblack@eecs.umich.edu    __asm__ __volatile__("" : "=m" (val) : "m" (val));
3197382Sgblack@eecs.umich.edu    float origVal = val;
3207382Sgblack@eecs.umich.edu    val = rintf(val);
3217382Sgblack@eecs.umich.edu    int fpType = std::fpclassify(val);
3227382Sgblack@eecs.umich.edu    if (fpType == FP_SUBNORMAL || fpType == FP_NAN) {
3237382Sgblack@eecs.umich.edu        if (fpType == FP_NAN) {
3247382Sgblack@eecs.umich.edu            feraiseexcept(FeInvalid);
3257382Sgblack@eecs.umich.edu        }
3267382Sgblack@eecs.umich.edu        val = 0.0;
3277382Sgblack@eecs.umich.edu    } else if (origVal != val) {
3287382Sgblack@eecs.umich.edu        feraiseexcept(FeInexact);
3297382Sgblack@eecs.umich.edu    }
3307382Sgblack@eecs.umich.edu
3317379Sgblack@eecs.umich.edu    if (isSigned) {
3327379Sgblack@eecs.umich.edu        if (half) {
3337381Sgblack@eecs.umich.edu            if ((double)val < (int16_t)(1 << 15)) {
3347379Sgblack@eecs.umich.edu                feraiseexcept(FeInvalid);
3357382Sgblack@eecs.umich.edu                feclearexcept(FeInexact);
3367379Sgblack@eecs.umich.edu                return (int16_t)(1 << 15);
3377379Sgblack@eecs.umich.edu            }
3387381Sgblack@eecs.umich.edu            if ((double)val > (int16_t)mask(15)) {
3397379Sgblack@eecs.umich.edu                feraiseexcept(FeInvalid);
3407382Sgblack@eecs.umich.edu                feclearexcept(FeInexact);
3417379Sgblack@eecs.umich.edu                return (int16_t)mask(15);
3427379Sgblack@eecs.umich.edu            }
3437379Sgblack@eecs.umich.edu            return (int16_t)val;
3447379Sgblack@eecs.umich.edu        } else {
3457381Sgblack@eecs.umich.edu            if ((double)val < (int32_t)(1 << 31)) {
3467379Sgblack@eecs.umich.edu                feraiseexcept(FeInvalid);
3477382Sgblack@eecs.umich.edu                feclearexcept(FeInexact);
3487379Sgblack@eecs.umich.edu                return (int32_t)(1 << 31);
3497379Sgblack@eecs.umich.edu            }
3507381Sgblack@eecs.umich.edu            if ((double)val > (int32_t)mask(31)) {
3517379Sgblack@eecs.umich.edu                feraiseexcept(FeInvalid);
3527382Sgblack@eecs.umich.edu                feclearexcept(FeInexact);
3537379Sgblack@eecs.umich.edu                return (int32_t)mask(31);
3547379Sgblack@eecs.umich.edu            }
3557379Sgblack@eecs.umich.edu            return (int32_t)val;
3567379Sgblack@eecs.umich.edu        }
3577379Sgblack@eecs.umich.edu    } else {
3587379Sgblack@eecs.umich.edu        if (half) {
3597381Sgblack@eecs.umich.edu            if ((double)val < 0) {
3607379Sgblack@eecs.umich.edu                feraiseexcept(FeInvalid);
3617382Sgblack@eecs.umich.edu                feclearexcept(FeInexact);
3627379Sgblack@eecs.umich.edu                return 0;
3637379Sgblack@eecs.umich.edu            }
3647381Sgblack@eecs.umich.edu            if ((double)val > (mask(16))) {
3657379Sgblack@eecs.umich.edu                feraiseexcept(FeInvalid);
3667382Sgblack@eecs.umich.edu                feclearexcept(FeInexact);
3677379Sgblack@eecs.umich.edu                return mask(16);
3687379Sgblack@eecs.umich.edu            }
3697379Sgblack@eecs.umich.edu            return (uint16_t)val;
3707379Sgblack@eecs.umich.edu        } else {
3717381Sgblack@eecs.umich.edu            if ((double)val < 0) {
3727379Sgblack@eecs.umich.edu                feraiseexcept(FeInvalid);
3737382Sgblack@eecs.umich.edu                feclearexcept(FeInexact);
3747379Sgblack@eecs.umich.edu                return 0;
3757379Sgblack@eecs.umich.edu            }
3767381Sgblack@eecs.umich.edu            if ((double)val > (mask(32))) {
3777379Sgblack@eecs.umich.edu                feraiseexcept(FeInvalid);
3787382Sgblack@eecs.umich.edu                feclearexcept(FeInexact);
3797379Sgblack@eecs.umich.edu                return mask(32);
3807379Sgblack@eecs.umich.edu            }
3817379Sgblack@eecs.umich.edu            return (uint32_t)val;
3827379Sgblack@eecs.umich.edu        }
3837379Sgblack@eecs.umich.edu    }
3847379Sgblack@eecs.umich.edu}
3857379Sgblack@eecs.umich.edu
3867379Sgblack@eecs.umich.edustatic inline float
3877386Sgblack@eecs.umich.eduvfpUFixedToFpS(FPSCR fpscr, uint32_t val, bool half, uint8_t imm)
3887379Sgblack@eecs.umich.edu{
3897379Sgblack@eecs.umich.edu    fesetround(FeRoundNearest);
3907379Sgblack@eecs.umich.edu    if (half)
3917379Sgblack@eecs.umich.edu        val = (uint16_t)val;
3927382Sgblack@eecs.umich.edu    float scale = powf(2.0, imm);
3937382Sgblack@eecs.umich.edu    __asm__ __volatile__("" : "=m" (scale) : "m" (scale));
3947382Sgblack@eecs.umich.edu    feclearexcept(FeAllExceptions);
3957382Sgblack@eecs.umich.edu    __asm__ __volatile__("" : "=m" (scale) : "m" (scale));
3967386Sgblack@eecs.umich.edu    return fixDivDest(fpscr, val / scale, (float)val, scale);
3977379Sgblack@eecs.umich.edu}
3987379Sgblack@eecs.umich.edu
3997379Sgblack@eecs.umich.edustatic inline float
4007386Sgblack@eecs.umich.eduvfpSFixedToFpS(FPSCR fpscr, int32_t val, bool half, uint8_t imm)
4017379Sgblack@eecs.umich.edu{
4027379Sgblack@eecs.umich.edu    fesetround(FeRoundNearest);
4037379Sgblack@eecs.umich.edu    if (half)
4047379Sgblack@eecs.umich.edu        val = sext<16>(val & mask(16));
4057382Sgblack@eecs.umich.edu    float scale = powf(2.0, imm);
4067382Sgblack@eecs.umich.edu    __asm__ __volatile__("" : "=m" (scale) : "m" (scale));
4077382Sgblack@eecs.umich.edu    feclearexcept(FeAllExceptions);
4087382Sgblack@eecs.umich.edu    __asm__ __volatile__("" : "=m" (scale) : "m" (scale));
4097386Sgblack@eecs.umich.edu    return fixDivDest(fpscr, val / scale, (float)val, scale);
4107379Sgblack@eecs.umich.edu}
4117379Sgblack@eecs.umich.edu
4127379Sgblack@eecs.umich.edustatic inline uint64_t
4137379Sgblack@eecs.umich.eduvfpFpDToFixed(double val, bool isSigned, bool half, uint8_t imm)
4147379Sgblack@eecs.umich.edu{
4157382Sgblack@eecs.umich.edu    fesetround(FeRoundNearest);
4167379Sgblack@eecs.umich.edu    val = val * pow(2.0, imm);
4177379Sgblack@eecs.umich.edu    __asm__ __volatile__("" : "=m" (val) : "m" (val));
4187382Sgblack@eecs.umich.edu    fesetround(FeRoundZero);
4197379Sgblack@eecs.umich.edu    feclearexcept(FeAllExceptions);
4207382Sgblack@eecs.umich.edu    __asm__ __volatile__("" : "=m" (val) : "m" (val));
4217382Sgblack@eecs.umich.edu    double origVal = val;
4227382Sgblack@eecs.umich.edu    val = rint(val);
4237382Sgblack@eecs.umich.edu    int fpType = std::fpclassify(val);
4247382Sgblack@eecs.umich.edu    if (fpType == FP_SUBNORMAL || fpType == FP_NAN) {
4257382Sgblack@eecs.umich.edu        if (fpType == FP_NAN) {
4267382Sgblack@eecs.umich.edu            feraiseexcept(FeInvalid);
4277382Sgblack@eecs.umich.edu        }
4287382Sgblack@eecs.umich.edu        val = 0.0;
4297382Sgblack@eecs.umich.edu    } else if (origVal != val) {
4307382Sgblack@eecs.umich.edu        feraiseexcept(FeInexact);
4317382Sgblack@eecs.umich.edu    }
4327379Sgblack@eecs.umich.edu    if (isSigned) {
4337379Sgblack@eecs.umich.edu        if (half) {
4347379Sgblack@eecs.umich.edu            if (val < (int16_t)(1 << 15)) {
4357379Sgblack@eecs.umich.edu                feraiseexcept(FeInvalid);
4367382Sgblack@eecs.umich.edu                feclearexcept(FeInexact);
4377379Sgblack@eecs.umich.edu                return (int16_t)(1 << 15);
4387379Sgblack@eecs.umich.edu            }
4397379Sgblack@eecs.umich.edu            if (val > (int16_t)mask(15)) {
4407379Sgblack@eecs.umich.edu                feraiseexcept(FeInvalid);
4417382Sgblack@eecs.umich.edu                feclearexcept(FeInexact);
4427379Sgblack@eecs.umich.edu                return (int16_t)mask(15);
4437379Sgblack@eecs.umich.edu            }
4447379Sgblack@eecs.umich.edu            return (int16_t)val;
4457379Sgblack@eecs.umich.edu        } else {
4467379Sgblack@eecs.umich.edu            if (val < (int32_t)(1 << 31)) {
4477379Sgblack@eecs.umich.edu                feraiseexcept(FeInvalid);
4487382Sgblack@eecs.umich.edu                feclearexcept(FeInexact);
4497379Sgblack@eecs.umich.edu                return (int32_t)(1 << 31);
4507379Sgblack@eecs.umich.edu            }
4517379Sgblack@eecs.umich.edu            if (val > (int32_t)mask(31)) {
4527379Sgblack@eecs.umich.edu                feraiseexcept(FeInvalid);
4537382Sgblack@eecs.umich.edu                feclearexcept(FeInexact);
4547379Sgblack@eecs.umich.edu                return (int32_t)mask(31);
4557379Sgblack@eecs.umich.edu            }
4567379Sgblack@eecs.umich.edu            return (int32_t)val;
4577379Sgblack@eecs.umich.edu        }
4587379Sgblack@eecs.umich.edu    } else {
4597379Sgblack@eecs.umich.edu        if (half) {
4607379Sgblack@eecs.umich.edu            if (val < 0) {
4617379Sgblack@eecs.umich.edu                feraiseexcept(FeInvalid);
4627382Sgblack@eecs.umich.edu                feclearexcept(FeInexact);
4637379Sgblack@eecs.umich.edu                return 0;
4647379Sgblack@eecs.umich.edu            }
4657379Sgblack@eecs.umich.edu            if (val > mask(16)) {
4667379Sgblack@eecs.umich.edu                feraiseexcept(FeInvalid);
4677382Sgblack@eecs.umich.edu                feclearexcept(FeInexact);
4687379Sgblack@eecs.umich.edu                return mask(16);
4697379Sgblack@eecs.umich.edu            }
4707379Sgblack@eecs.umich.edu            return (uint16_t)val;
4717379Sgblack@eecs.umich.edu        } else {
4727379Sgblack@eecs.umich.edu            if (val < 0) {
4737379Sgblack@eecs.umich.edu                feraiseexcept(FeInvalid);
4747382Sgblack@eecs.umich.edu                feclearexcept(FeInexact);
4757379Sgblack@eecs.umich.edu                return 0;
4767379Sgblack@eecs.umich.edu            }
4777379Sgblack@eecs.umich.edu            if (val > mask(32)) {
4787379Sgblack@eecs.umich.edu                feraiseexcept(FeInvalid);
4797382Sgblack@eecs.umich.edu                feclearexcept(FeInexact);
4807379Sgblack@eecs.umich.edu                return mask(32);
4817379Sgblack@eecs.umich.edu            }
4827379Sgblack@eecs.umich.edu            return (uint32_t)val;
4837379Sgblack@eecs.umich.edu        }
4847379Sgblack@eecs.umich.edu    }
4857379Sgblack@eecs.umich.edu}
4867379Sgblack@eecs.umich.edu
4877379Sgblack@eecs.umich.edustatic inline double
4887386Sgblack@eecs.umich.eduvfpUFixedToFpD(FPSCR fpscr, uint32_t val, bool half, uint8_t imm)
4897379Sgblack@eecs.umich.edu{
4907379Sgblack@eecs.umich.edu    fesetround(FeRoundNearest);
4917379Sgblack@eecs.umich.edu    if (half)
4927379Sgblack@eecs.umich.edu        val = (uint16_t)val;
4937382Sgblack@eecs.umich.edu    double scale = pow(2.0, imm);
4947382Sgblack@eecs.umich.edu    __asm__ __volatile__("" : "=m" (scale) : "m" (scale));
4957382Sgblack@eecs.umich.edu    feclearexcept(FeAllExceptions);
4967382Sgblack@eecs.umich.edu    __asm__ __volatile__("" : "=m" (scale) : "m" (scale));
4977386Sgblack@eecs.umich.edu    return fixDivDest(fpscr, val / scale, (double)val, scale);
4987379Sgblack@eecs.umich.edu}
4997379Sgblack@eecs.umich.edu
5007379Sgblack@eecs.umich.edustatic inline double
5017386Sgblack@eecs.umich.eduvfpSFixedToFpD(FPSCR fpscr, int32_t val, bool half, uint8_t imm)
5027379Sgblack@eecs.umich.edu{
5037379Sgblack@eecs.umich.edu    fesetround(FeRoundNearest);
5047379Sgblack@eecs.umich.edu    if (half)
5057379Sgblack@eecs.umich.edu        val = sext<16>(val & mask(16));
5067382Sgblack@eecs.umich.edu    double scale = pow(2.0, imm);
5077382Sgblack@eecs.umich.edu    __asm__ __volatile__("" : "=m" (scale) : "m" (scale));
5087382Sgblack@eecs.umich.edu    feclearexcept(FeAllExceptions);
5097382Sgblack@eecs.umich.edu    __asm__ __volatile__("" : "=m" (scale) : "m" (scale));
5107386Sgblack@eecs.umich.edu    return fixDivDest(fpscr, val / scale, (double)val, scale);
5117379Sgblack@eecs.umich.edu}
5127379Sgblack@eecs.umich.edu
5137378Sgblack@eecs.umich.edutypedef int VfpSavedState;
5147378Sgblack@eecs.umich.edu
5157378Sgblack@eecs.umich.edustatic inline VfpSavedState
5167378Sgblack@eecs.umich.eduprepVfpFpscr(FPSCR fpscr)
5177378Sgblack@eecs.umich.edu{
5187378Sgblack@eecs.umich.edu    int roundingMode = fegetround();
5197378Sgblack@eecs.umich.edu    feclearexcept(FeAllExceptions);
5207378Sgblack@eecs.umich.edu    switch (fpscr.rMode) {
5217378Sgblack@eecs.umich.edu      case VfpRoundNearest:
5227378Sgblack@eecs.umich.edu        fesetround(FeRoundNearest);
5237378Sgblack@eecs.umich.edu        break;
5247378Sgblack@eecs.umich.edu      case VfpRoundUpward:
5257378Sgblack@eecs.umich.edu        fesetround(FeRoundUpward);
5267378Sgblack@eecs.umich.edu        break;
5277378Sgblack@eecs.umich.edu      case VfpRoundDown:
5287378Sgblack@eecs.umich.edu        fesetround(FeRoundDown);
5297378Sgblack@eecs.umich.edu        break;
5307378Sgblack@eecs.umich.edu      case VfpRoundZero:
5317378Sgblack@eecs.umich.edu        fesetround(FeRoundZero);
5327378Sgblack@eecs.umich.edu        break;
5337378Sgblack@eecs.umich.edu    }
5347378Sgblack@eecs.umich.edu    return roundingMode;
5357378Sgblack@eecs.umich.edu}
5367378Sgblack@eecs.umich.edu
5377378Sgblack@eecs.umich.edustatic inline FPSCR
5387378Sgblack@eecs.umich.edusetVfpFpscr(FPSCR fpscr, VfpSavedState state)
5397378Sgblack@eecs.umich.edu{
5407378Sgblack@eecs.umich.edu    int exceptions = fetestexcept(FeAllExceptions);
5417378Sgblack@eecs.umich.edu    if (exceptions & FeInvalid) {
5427378Sgblack@eecs.umich.edu        fpscr.ioc = 1;
5437378Sgblack@eecs.umich.edu    }
5447378Sgblack@eecs.umich.edu    if (exceptions & FeDivByZero) {
5457378Sgblack@eecs.umich.edu        fpscr.dzc = 1;
5467378Sgblack@eecs.umich.edu    }
5477378Sgblack@eecs.umich.edu    if (exceptions & FeOverflow) {
5487378Sgblack@eecs.umich.edu        fpscr.ofc = 1;
5497378Sgblack@eecs.umich.edu    }
5507378Sgblack@eecs.umich.edu    if (exceptions & FeUnderflow) {
5517378Sgblack@eecs.umich.edu        fpscr.ufc = 1;
5527378Sgblack@eecs.umich.edu    }
5537378Sgblack@eecs.umich.edu    if (exceptions & FeInexact) {
5547378Sgblack@eecs.umich.edu        fpscr.ixc = 1;
5557378Sgblack@eecs.umich.edu    }
5567378Sgblack@eecs.umich.edu    fesetround(state);
5577378Sgblack@eecs.umich.edu    return fpscr;
5587378Sgblack@eecs.umich.edu}
5597378Sgblack@eecs.umich.edu
5607376Sgblack@eecs.umich.educlass VfpMacroOp : public PredMacroOp
5617376Sgblack@eecs.umich.edu{
5627376Sgblack@eecs.umich.edu  public:
5637376Sgblack@eecs.umich.edu    static bool
5647376Sgblack@eecs.umich.edu    inScalarBank(IntRegIndex idx)
5657376Sgblack@eecs.umich.edu    {
5667376Sgblack@eecs.umich.edu        return (idx % 32) < 8;
5677376Sgblack@eecs.umich.edu    }
5687376Sgblack@eecs.umich.edu
5697376Sgblack@eecs.umich.edu  protected:
5707376Sgblack@eecs.umich.edu    bool wide;
5717376Sgblack@eecs.umich.edu
5727376Sgblack@eecs.umich.edu    VfpMacroOp(const char *mnem, ExtMachInst _machInst,
5737376Sgblack@eecs.umich.edu            OpClass __opClass, bool _wide) :
5747376Sgblack@eecs.umich.edu        PredMacroOp(mnem, _machInst, __opClass), wide(_wide)
5757376Sgblack@eecs.umich.edu    {}
5767376Sgblack@eecs.umich.edu
5777376Sgblack@eecs.umich.edu    IntRegIndex
5787376Sgblack@eecs.umich.edu    addStride(IntRegIndex idx, unsigned stride)
5797376Sgblack@eecs.umich.edu    {
5807376Sgblack@eecs.umich.edu        if (wide) {
5817376Sgblack@eecs.umich.edu            stride *= 2;
5827376Sgblack@eecs.umich.edu        }
5837376Sgblack@eecs.umich.edu        unsigned offset = idx % 8;
5847376Sgblack@eecs.umich.edu        idx = (IntRegIndex)(idx - offset);
5857376Sgblack@eecs.umich.edu        offset += stride;
5867376Sgblack@eecs.umich.edu        idx = (IntRegIndex)(idx + (offset % 8));
5877376Sgblack@eecs.umich.edu        return idx;
5887376Sgblack@eecs.umich.edu    }
5897376Sgblack@eecs.umich.edu
5907376Sgblack@eecs.umich.edu    void
5917376Sgblack@eecs.umich.edu    nextIdxs(IntRegIndex &dest, IntRegIndex &op1, IntRegIndex &op2)
5927376Sgblack@eecs.umich.edu    {
5937376Sgblack@eecs.umich.edu        unsigned stride = (machInst.fpscrStride == 0) ? 1 : 2;
5947376Sgblack@eecs.umich.edu        assert(!inScalarBank(dest));
5957376Sgblack@eecs.umich.edu        dest = addStride(dest, stride);
5967376Sgblack@eecs.umich.edu        op1 = addStride(op1, stride);
5977376Sgblack@eecs.umich.edu        if (!inScalarBank(op2)) {
5987376Sgblack@eecs.umich.edu            op2 = addStride(op2, stride);
5997376Sgblack@eecs.umich.edu        }
6007376Sgblack@eecs.umich.edu    }
6017376Sgblack@eecs.umich.edu
6027376Sgblack@eecs.umich.edu    void
6037376Sgblack@eecs.umich.edu    nextIdxs(IntRegIndex &dest, IntRegIndex &op1)
6047376Sgblack@eecs.umich.edu    {
6057376Sgblack@eecs.umich.edu        unsigned stride = (machInst.fpscrStride == 0) ? 1 : 2;
6067376Sgblack@eecs.umich.edu        assert(!inScalarBank(dest));
6077376Sgblack@eecs.umich.edu        dest = addStride(dest, stride);
6087376Sgblack@eecs.umich.edu        if (!inScalarBank(op1)) {
6097376Sgblack@eecs.umich.edu            op1 = addStride(op1, stride);
6107376Sgblack@eecs.umich.edu        }
6117376Sgblack@eecs.umich.edu    }
6127376Sgblack@eecs.umich.edu
6137376Sgblack@eecs.umich.edu    void
6147376Sgblack@eecs.umich.edu    nextIdxs(IntRegIndex &dest)
6157376Sgblack@eecs.umich.edu    {
6167376Sgblack@eecs.umich.edu        unsigned stride = (machInst.fpscrStride == 0) ? 1 : 2;
6177376Sgblack@eecs.umich.edu        assert(!inScalarBank(dest));
6187376Sgblack@eecs.umich.edu        dest = addStride(dest, stride);
6197376Sgblack@eecs.umich.edu    }
6207376Sgblack@eecs.umich.edu};
6217376Sgblack@eecs.umich.edu
6227375Sgblack@eecs.umich.educlass VfpRegRegOp : public RegRegOp
6237375Sgblack@eecs.umich.edu{
6247375Sgblack@eecs.umich.edu  protected:
6257375Sgblack@eecs.umich.edu    VfpRegRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
6267375Sgblack@eecs.umich.edu                IntRegIndex _dest, IntRegIndex _op1,
6277375Sgblack@eecs.umich.edu                VfpMicroMode mode = VfpNotAMicroop) :
6287375Sgblack@eecs.umich.edu        RegRegOp(mnem, _machInst, __opClass, _dest, _op1)
6297375Sgblack@eecs.umich.edu    {
6307375Sgblack@eecs.umich.edu        setVfpMicroFlags(mode, flags);
6317375Sgblack@eecs.umich.edu    }
6327375Sgblack@eecs.umich.edu};
6337375Sgblack@eecs.umich.edu
6347375Sgblack@eecs.umich.educlass VfpRegImmOp : public RegImmOp
6357375Sgblack@eecs.umich.edu{
6367375Sgblack@eecs.umich.edu  protected:
6377375Sgblack@eecs.umich.edu    VfpRegImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
6387375Sgblack@eecs.umich.edu                IntRegIndex _dest, uint64_t _imm,
6397375Sgblack@eecs.umich.edu                VfpMicroMode mode = VfpNotAMicroop) :
6407375Sgblack@eecs.umich.edu        RegImmOp(mnem, _machInst, __opClass, _dest, _imm)
6417375Sgblack@eecs.umich.edu    {
6427375Sgblack@eecs.umich.edu        setVfpMicroFlags(mode, flags);
6437375Sgblack@eecs.umich.edu    }
6447375Sgblack@eecs.umich.edu};
6457375Sgblack@eecs.umich.edu
6467375Sgblack@eecs.umich.educlass VfpRegRegImmOp : public RegRegImmOp
6477375Sgblack@eecs.umich.edu{
6487375Sgblack@eecs.umich.edu  protected:
6497375Sgblack@eecs.umich.edu    VfpRegRegImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
6507375Sgblack@eecs.umich.edu                   IntRegIndex _dest, IntRegIndex _op1,
6517375Sgblack@eecs.umich.edu                   uint64_t _imm, VfpMicroMode mode = VfpNotAMicroop) :
6527375Sgblack@eecs.umich.edu        RegRegImmOp(mnem, _machInst, __opClass, _dest, _op1, _imm)
6537375Sgblack@eecs.umich.edu    {
6547375Sgblack@eecs.umich.edu        setVfpMicroFlags(mode, flags);
6557375Sgblack@eecs.umich.edu    }
6567375Sgblack@eecs.umich.edu};
6577375Sgblack@eecs.umich.edu
6587375Sgblack@eecs.umich.educlass VfpRegRegRegOp : public RegRegRegOp
6597375Sgblack@eecs.umich.edu{
6607375Sgblack@eecs.umich.edu  protected:
6617375Sgblack@eecs.umich.edu    VfpRegRegRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass,
6627375Sgblack@eecs.umich.edu                   IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2,
6637375Sgblack@eecs.umich.edu                   VfpMicroMode mode = VfpNotAMicroop) :
6647375Sgblack@eecs.umich.edu        RegRegRegOp(mnem, _machInst, __opClass, _dest, _op1, _op2)
6657375Sgblack@eecs.umich.edu    {
6667375Sgblack@eecs.umich.edu        setVfpMicroFlags(mode, flags);
6677375Sgblack@eecs.umich.edu    }
6687375Sgblack@eecs.umich.edu};
6697375Sgblack@eecs.umich.edu
6707384Sgblack@eecs.umich.edu}
6717384Sgblack@eecs.umich.edu
6727375Sgblack@eecs.umich.edu#endif //__ARCH_ARM_INSTS_VFP_HH__
673