vfp.hh revision 7388
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 3127388Sgblack@eecs.umich.eduvfpFpSToFixed(float val, bool isSigned, bool half, 3137388Sgblack@eecs.umich.edu uint8_t imm, bool rzero = true) 3147379Sgblack@eecs.umich.edu{ 3157388Sgblack@eecs.umich.edu int rmode = fegetround(); 3167388Sgblack@eecs.umich.edu fesetround(FeRoundNearest); 3177379Sgblack@eecs.umich.edu val = val * powf(2.0, imm); 3187379Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (val) : "m" (val)); 3197388Sgblack@eecs.umich.edu if (rzero) 3207388Sgblack@eecs.umich.edu fesetround(FeRoundZero); 3217388Sgblack@eecs.umich.edu else 3227388Sgblack@eecs.umich.edu fesetround(rmode); 3237379Sgblack@eecs.umich.edu feclearexcept(FeAllExceptions); 3247382Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (val) : "m" (val)); 3257382Sgblack@eecs.umich.edu float origVal = val; 3267382Sgblack@eecs.umich.edu val = rintf(val); 3277382Sgblack@eecs.umich.edu int fpType = std::fpclassify(val); 3287382Sgblack@eecs.umich.edu if (fpType == FP_SUBNORMAL || fpType == FP_NAN) { 3297382Sgblack@eecs.umich.edu if (fpType == FP_NAN) { 3307382Sgblack@eecs.umich.edu feraiseexcept(FeInvalid); 3317382Sgblack@eecs.umich.edu } 3327382Sgblack@eecs.umich.edu val = 0.0; 3337382Sgblack@eecs.umich.edu } else if (origVal != val) { 3347382Sgblack@eecs.umich.edu feraiseexcept(FeInexact); 3357382Sgblack@eecs.umich.edu } 3367382Sgblack@eecs.umich.edu 3377379Sgblack@eecs.umich.edu if (isSigned) { 3387379Sgblack@eecs.umich.edu if (half) { 3397381Sgblack@eecs.umich.edu if ((double)val < (int16_t)(1 << 15)) { 3407379Sgblack@eecs.umich.edu feraiseexcept(FeInvalid); 3417382Sgblack@eecs.umich.edu feclearexcept(FeInexact); 3427379Sgblack@eecs.umich.edu return (int16_t)(1 << 15); 3437379Sgblack@eecs.umich.edu } 3447381Sgblack@eecs.umich.edu if ((double)val > (int16_t)mask(15)) { 3457379Sgblack@eecs.umich.edu feraiseexcept(FeInvalid); 3467382Sgblack@eecs.umich.edu feclearexcept(FeInexact); 3477379Sgblack@eecs.umich.edu return (int16_t)mask(15); 3487379Sgblack@eecs.umich.edu } 3497379Sgblack@eecs.umich.edu return (int16_t)val; 3507379Sgblack@eecs.umich.edu } else { 3517381Sgblack@eecs.umich.edu if ((double)val < (int32_t)(1 << 31)) { 3527379Sgblack@eecs.umich.edu feraiseexcept(FeInvalid); 3537382Sgblack@eecs.umich.edu feclearexcept(FeInexact); 3547379Sgblack@eecs.umich.edu return (int32_t)(1 << 31); 3557379Sgblack@eecs.umich.edu } 3567381Sgblack@eecs.umich.edu if ((double)val > (int32_t)mask(31)) { 3577379Sgblack@eecs.umich.edu feraiseexcept(FeInvalid); 3587382Sgblack@eecs.umich.edu feclearexcept(FeInexact); 3597379Sgblack@eecs.umich.edu return (int32_t)mask(31); 3607379Sgblack@eecs.umich.edu } 3617379Sgblack@eecs.umich.edu return (int32_t)val; 3627379Sgblack@eecs.umich.edu } 3637379Sgblack@eecs.umich.edu } else { 3647379Sgblack@eecs.umich.edu if (half) { 3657381Sgblack@eecs.umich.edu if ((double)val < 0) { 3667379Sgblack@eecs.umich.edu feraiseexcept(FeInvalid); 3677382Sgblack@eecs.umich.edu feclearexcept(FeInexact); 3687379Sgblack@eecs.umich.edu return 0; 3697379Sgblack@eecs.umich.edu } 3707381Sgblack@eecs.umich.edu if ((double)val > (mask(16))) { 3717379Sgblack@eecs.umich.edu feraiseexcept(FeInvalid); 3727382Sgblack@eecs.umich.edu feclearexcept(FeInexact); 3737379Sgblack@eecs.umich.edu return mask(16); 3747379Sgblack@eecs.umich.edu } 3757379Sgblack@eecs.umich.edu return (uint16_t)val; 3767379Sgblack@eecs.umich.edu } else { 3777381Sgblack@eecs.umich.edu if ((double)val < 0) { 3787379Sgblack@eecs.umich.edu feraiseexcept(FeInvalid); 3797382Sgblack@eecs.umich.edu feclearexcept(FeInexact); 3807379Sgblack@eecs.umich.edu return 0; 3817379Sgblack@eecs.umich.edu } 3827381Sgblack@eecs.umich.edu if ((double)val > (mask(32))) { 3837379Sgblack@eecs.umich.edu feraiseexcept(FeInvalid); 3847382Sgblack@eecs.umich.edu feclearexcept(FeInexact); 3857379Sgblack@eecs.umich.edu return mask(32); 3867379Sgblack@eecs.umich.edu } 3877379Sgblack@eecs.umich.edu return (uint32_t)val; 3887379Sgblack@eecs.umich.edu } 3897379Sgblack@eecs.umich.edu } 3907379Sgblack@eecs.umich.edu} 3917379Sgblack@eecs.umich.edu 3927379Sgblack@eecs.umich.edustatic inline float 3937386Sgblack@eecs.umich.eduvfpUFixedToFpS(FPSCR fpscr, uint32_t val, bool half, uint8_t imm) 3947379Sgblack@eecs.umich.edu{ 3957379Sgblack@eecs.umich.edu fesetround(FeRoundNearest); 3967379Sgblack@eecs.umich.edu if (half) 3977379Sgblack@eecs.umich.edu val = (uint16_t)val; 3987382Sgblack@eecs.umich.edu float scale = powf(2.0, imm); 3997382Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (scale) : "m" (scale)); 4007382Sgblack@eecs.umich.edu feclearexcept(FeAllExceptions); 4017382Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (scale) : "m" (scale)); 4027386Sgblack@eecs.umich.edu return fixDivDest(fpscr, val / scale, (float)val, scale); 4037379Sgblack@eecs.umich.edu} 4047379Sgblack@eecs.umich.edu 4057379Sgblack@eecs.umich.edustatic inline float 4067386Sgblack@eecs.umich.eduvfpSFixedToFpS(FPSCR fpscr, int32_t val, bool half, uint8_t imm) 4077379Sgblack@eecs.umich.edu{ 4087379Sgblack@eecs.umich.edu fesetround(FeRoundNearest); 4097379Sgblack@eecs.umich.edu if (half) 4107379Sgblack@eecs.umich.edu val = sext<16>(val & mask(16)); 4117382Sgblack@eecs.umich.edu float scale = powf(2.0, imm); 4127382Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (scale) : "m" (scale)); 4137382Sgblack@eecs.umich.edu feclearexcept(FeAllExceptions); 4147382Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (scale) : "m" (scale)); 4157386Sgblack@eecs.umich.edu return fixDivDest(fpscr, val / scale, (float)val, scale); 4167379Sgblack@eecs.umich.edu} 4177379Sgblack@eecs.umich.edu 4187379Sgblack@eecs.umich.edustatic inline uint64_t 4197388Sgblack@eecs.umich.eduvfpFpDToFixed(double val, bool isSigned, bool half, 4207388Sgblack@eecs.umich.edu uint8_t imm, bool rzero = true) 4217379Sgblack@eecs.umich.edu{ 4227388Sgblack@eecs.umich.edu int rmode = fegetround(); 4237382Sgblack@eecs.umich.edu fesetround(FeRoundNearest); 4247379Sgblack@eecs.umich.edu val = val * pow(2.0, imm); 4257379Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (val) : "m" (val)); 4267388Sgblack@eecs.umich.edu if (rzero) 4277388Sgblack@eecs.umich.edu fesetround(FeRoundZero); 4287388Sgblack@eecs.umich.edu else 4297388Sgblack@eecs.umich.edu fesetround(rmode); 4307379Sgblack@eecs.umich.edu feclearexcept(FeAllExceptions); 4317382Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (val) : "m" (val)); 4327382Sgblack@eecs.umich.edu double origVal = val; 4337382Sgblack@eecs.umich.edu val = rint(val); 4347382Sgblack@eecs.umich.edu int fpType = std::fpclassify(val); 4357382Sgblack@eecs.umich.edu if (fpType == FP_SUBNORMAL || fpType == FP_NAN) { 4367382Sgblack@eecs.umich.edu if (fpType == FP_NAN) { 4377382Sgblack@eecs.umich.edu feraiseexcept(FeInvalid); 4387382Sgblack@eecs.umich.edu } 4397382Sgblack@eecs.umich.edu val = 0.0; 4407382Sgblack@eecs.umich.edu } else if (origVal != val) { 4417382Sgblack@eecs.umich.edu feraiseexcept(FeInexact); 4427382Sgblack@eecs.umich.edu } 4437379Sgblack@eecs.umich.edu if (isSigned) { 4447379Sgblack@eecs.umich.edu if (half) { 4457379Sgblack@eecs.umich.edu if (val < (int16_t)(1 << 15)) { 4467379Sgblack@eecs.umich.edu feraiseexcept(FeInvalid); 4477382Sgblack@eecs.umich.edu feclearexcept(FeInexact); 4487379Sgblack@eecs.umich.edu return (int16_t)(1 << 15); 4497379Sgblack@eecs.umich.edu } 4507379Sgblack@eecs.umich.edu if (val > (int16_t)mask(15)) { 4517379Sgblack@eecs.umich.edu feraiseexcept(FeInvalid); 4527382Sgblack@eecs.umich.edu feclearexcept(FeInexact); 4537379Sgblack@eecs.umich.edu return (int16_t)mask(15); 4547379Sgblack@eecs.umich.edu } 4557379Sgblack@eecs.umich.edu return (int16_t)val; 4567379Sgblack@eecs.umich.edu } else { 4577379Sgblack@eecs.umich.edu if (val < (int32_t)(1 << 31)) { 4587379Sgblack@eecs.umich.edu feraiseexcept(FeInvalid); 4597382Sgblack@eecs.umich.edu feclearexcept(FeInexact); 4607379Sgblack@eecs.umich.edu return (int32_t)(1 << 31); 4617379Sgblack@eecs.umich.edu } 4627379Sgblack@eecs.umich.edu if (val > (int32_t)mask(31)) { 4637379Sgblack@eecs.umich.edu feraiseexcept(FeInvalid); 4647382Sgblack@eecs.umich.edu feclearexcept(FeInexact); 4657379Sgblack@eecs.umich.edu return (int32_t)mask(31); 4667379Sgblack@eecs.umich.edu } 4677379Sgblack@eecs.umich.edu return (int32_t)val; 4687379Sgblack@eecs.umich.edu } 4697379Sgblack@eecs.umich.edu } else { 4707379Sgblack@eecs.umich.edu if (half) { 4717379Sgblack@eecs.umich.edu if (val < 0) { 4727379Sgblack@eecs.umich.edu feraiseexcept(FeInvalid); 4737382Sgblack@eecs.umich.edu feclearexcept(FeInexact); 4747379Sgblack@eecs.umich.edu return 0; 4757379Sgblack@eecs.umich.edu } 4767379Sgblack@eecs.umich.edu if (val > mask(16)) { 4777379Sgblack@eecs.umich.edu feraiseexcept(FeInvalid); 4787382Sgblack@eecs.umich.edu feclearexcept(FeInexact); 4797379Sgblack@eecs.umich.edu return mask(16); 4807379Sgblack@eecs.umich.edu } 4817379Sgblack@eecs.umich.edu return (uint16_t)val; 4827379Sgblack@eecs.umich.edu } else { 4837379Sgblack@eecs.umich.edu if (val < 0) { 4847379Sgblack@eecs.umich.edu feraiseexcept(FeInvalid); 4857382Sgblack@eecs.umich.edu feclearexcept(FeInexact); 4867379Sgblack@eecs.umich.edu return 0; 4877379Sgblack@eecs.umich.edu } 4887379Sgblack@eecs.umich.edu if (val > mask(32)) { 4897379Sgblack@eecs.umich.edu feraiseexcept(FeInvalid); 4907382Sgblack@eecs.umich.edu feclearexcept(FeInexact); 4917379Sgblack@eecs.umich.edu return mask(32); 4927379Sgblack@eecs.umich.edu } 4937379Sgblack@eecs.umich.edu return (uint32_t)val; 4947379Sgblack@eecs.umich.edu } 4957379Sgblack@eecs.umich.edu } 4967379Sgblack@eecs.umich.edu} 4977379Sgblack@eecs.umich.edu 4987379Sgblack@eecs.umich.edustatic inline double 4997386Sgblack@eecs.umich.eduvfpUFixedToFpD(FPSCR fpscr, uint32_t val, bool half, uint8_t imm) 5007379Sgblack@eecs.umich.edu{ 5017379Sgblack@eecs.umich.edu fesetround(FeRoundNearest); 5027379Sgblack@eecs.umich.edu if (half) 5037379Sgblack@eecs.umich.edu val = (uint16_t)val; 5047382Sgblack@eecs.umich.edu double scale = pow(2.0, imm); 5057382Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (scale) : "m" (scale)); 5067382Sgblack@eecs.umich.edu feclearexcept(FeAllExceptions); 5077382Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (scale) : "m" (scale)); 5087386Sgblack@eecs.umich.edu return fixDivDest(fpscr, val / scale, (double)val, scale); 5097379Sgblack@eecs.umich.edu} 5107379Sgblack@eecs.umich.edu 5117379Sgblack@eecs.umich.edustatic inline double 5127386Sgblack@eecs.umich.eduvfpSFixedToFpD(FPSCR fpscr, int32_t val, bool half, uint8_t imm) 5137379Sgblack@eecs.umich.edu{ 5147379Sgblack@eecs.umich.edu fesetround(FeRoundNearest); 5157379Sgblack@eecs.umich.edu if (half) 5167379Sgblack@eecs.umich.edu val = sext<16>(val & mask(16)); 5177382Sgblack@eecs.umich.edu double scale = pow(2.0, imm); 5187382Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (scale) : "m" (scale)); 5197382Sgblack@eecs.umich.edu feclearexcept(FeAllExceptions); 5207382Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (scale) : "m" (scale)); 5217386Sgblack@eecs.umich.edu return fixDivDest(fpscr, val / scale, (double)val, scale); 5227379Sgblack@eecs.umich.edu} 5237379Sgblack@eecs.umich.edu 5247378Sgblack@eecs.umich.edutypedef int VfpSavedState; 5257378Sgblack@eecs.umich.edu 5267378Sgblack@eecs.umich.edustatic inline VfpSavedState 5277378Sgblack@eecs.umich.eduprepVfpFpscr(FPSCR fpscr) 5287378Sgblack@eecs.umich.edu{ 5297378Sgblack@eecs.umich.edu int roundingMode = fegetround(); 5307378Sgblack@eecs.umich.edu feclearexcept(FeAllExceptions); 5317378Sgblack@eecs.umich.edu switch (fpscr.rMode) { 5327378Sgblack@eecs.umich.edu case VfpRoundNearest: 5337378Sgblack@eecs.umich.edu fesetround(FeRoundNearest); 5347378Sgblack@eecs.umich.edu break; 5357378Sgblack@eecs.umich.edu case VfpRoundUpward: 5367378Sgblack@eecs.umich.edu fesetround(FeRoundUpward); 5377378Sgblack@eecs.umich.edu break; 5387378Sgblack@eecs.umich.edu case VfpRoundDown: 5397378Sgblack@eecs.umich.edu fesetround(FeRoundDown); 5407378Sgblack@eecs.umich.edu break; 5417378Sgblack@eecs.umich.edu case VfpRoundZero: 5427378Sgblack@eecs.umich.edu fesetround(FeRoundZero); 5437378Sgblack@eecs.umich.edu break; 5447378Sgblack@eecs.umich.edu } 5457378Sgblack@eecs.umich.edu return roundingMode; 5467378Sgblack@eecs.umich.edu} 5477378Sgblack@eecs.umich.edu 5487378Sgblack@eecs.umich.edustatic inline FPSCR 5497378Sgblack@eecs.umich.edusetVfpFpscr(FPSCR fpscr, VfpSavedState state) 5507378Sgblack@eecs.umich.edu{ 5517378Sgblack@eecs.umich.edu int exceptions = fetestexcept(FeAllExceptions); 5527378Sgblack@eecs.umich.edu if (exceptions & FeInvalid) { 5537378Sgblack@eecs.umich.edu fpscr.ioc = 1; 5547378Sgblack@eecs.umich.edu } 5557378Sgblack@eecs.umich.edu if (exceptions & FeDivByZero) { 5567378Sgblack@eecs.umich.edu fpscr.dzc = 1; 5577378Sgblack@eecs.umich.edu } 5587378Sgblack@eecs.umich.edu if (exceptions & FeOverflow) { 5597378Sgblack@eecs.umich.edu fpscr.ofc = 1; 5607378Sgblack@eecs.umich.edu } 5617378Sgblack@eecs.umich.edu if (exceptions & FeUnderflow) { 5627378Sgblack@eecs.umich.edu fpscr.ufc = 1; 5637378Sgblack@eecs.umich.edu } 5647378Sgblack@eecs.umich.edu if (exceptions & FeInexact) { 5657378Sgblack@eecs.umich.edu fpscr.ixc = 1; 5667378Sgblack@eecs.umich.edu } 5677378Sgblack@eecs.umich.edu fesetround(state); 5687378Sgblack@eecs.umich.edu return fpscr; 5697378Sgblack@eecs.umich.edu} 5707378Sgblack@eecs.umich.edu 5717376Sgblack@eecs.umich.educlass VfpMacroOp : public PredMacroOp 5727376Sgblack@eecs.umich.edu{ 5737376Sgblack@eecs.umich.edu public: 5747376Sgblack@eecs.umich.edu static bool 5757376Sgblack@eecs.umich.edu inScalarBank(IntRegIndex idx) 5767376Sgblack@eecs.umich.edu { 5777376Sgblack@eecs.umich.edu return (idx % 32) < 8; 5787376Sgblack@eecs.umich.edu } 5797376Sgblack@eecs.umich.edu 5807376Sgblack@eecs.umich.edu protected: 5817376Sgblack@eecs.umich.edu bool wide; 5827376Sgblack@eecs.umich.edu 5837376Sgblack@eecs.umich.edu VfpMacroOp(const char *mnem, ExtMachInst _machInst, 5847376Sgblack@eecs.umich.edu OpClass __opClass, bool _wide) : 5857376Sgblack@eecs.umich.edu PredMacroOp(mnem, _machInst, __opClass), wide(_wide) 5867376Sgblack@eecs.umich.edu {} 5877376Sgblack@eecs.umich.edu 5887376Sgblack@eecs.umich.edu IntRegIndex 5897376Sgblack@eecs.umich.edu addStride(IntRegIndex idx, unsigned stride) 5907376Sgblack@eecs.umich.edu { 5917376Sgblack@eecs.umich.edu if (wide) { 5927376Sgblack@eecs.umich.edu stride *= 2; 5937376Sgblack@eecs.umich.edu } 5947376Sgblack@eecs.umich.edu unsigned offset = idx % 8; 5957376Sgblack@eecs.umich.edu idx = (IntRegIndex)(idx - offset); 5967376Sgblack@eecs.umich.edu offset += stride; 5977376Sgblack@eecs.umich.edu idx = (IntRegIndex)(idx + (offset % 8)); 5987376Sgblack@eecs.umich.edu return idx; 5997376Sgblack@eecs.umich.edu } 6007376Sgblack@eecs.umich.edu 6017376Sgblack@eecs.umich.edu void 6027376Sgblack@eecs.umich.edu nextIdxs(IntRegIndex &dest, IntRegIndex &op1, IntRegIndex &op2) 6037376Sgblack@eecs.umich.edu { 6047376Sgblack@eecs.umich.edu unsigned stride = (machInst.fpscrStride == 0) ? 1 : 2; 6057376Sgblack@eecs.umich.edu assert(!inScalarBank(dest)); 6067376Sgblack@eecs.umich.edu dest = addStride(dest, stride); 6077376Sgblack@eecs.umich.edu op1 = addStride(op1, stride); 6087376Sgblack@eecs.umich.edu if (!inScalarBank(op2)) { 6097376Sgblack@eecs.umich.edu op2 = addStride(op2, 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, IntRegIndex &op1) 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 if (!inScalarBank(op1)) { 6207376Sgblack@eecs.umich.edu op1 = addStride(op1, stride); 6217376Sgblack@eecs.umich.edu } 6227376Sgblack@eecs.umich.edu } 6237376Sgblack@eecs.umich.edu 6247376Sgblack@eecs.umich.edu void 6257376Sgblack@eecs.umich.edu nextIdxs(IntRegIndex &dest) 6267376Sgblack@eecs.umich.edu { 6277376Sgblack@eecs.umich.edu unsigned stride = (machInst.fpscrStride == 0) ? 1 : 2; 6287376Sgblack@eecs.umich.edu assert(!inScalarBank(dest)); 6297376Sgblack@eecs.umich.edu dest = addStride(dest, stride); 6307376Sgblack@eecs.umich.edu } 6317376Sgblack@eecs.umich.edu}; 6327376Sgblack@eecs.umich.edu 6337375Sgblack@eecs.umich.educlass VfpRegRegOp : public RegRegOp 6347375Sgblack@eecs.umich.edu{ 6357375Sgblack@eecs.umich.edu protected: 6367375Sgblack@eecs.umich.edu VfpRegRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass, 6377375Sgblack@eecs.umich.edu IntRegIndex _dest, IntRegIndex _op1, 6387375Sgblack@eecs.umich.edu VfpMicroMode mode = VfpNotAMicroop) : 6397375Sgblack@eecs.umich.edu RegRegOp(mnem, _machInst, __opClass, _dest, _op1) 6407375Sgblack@eecs.umich.edu { 6417375Sgblack@eecs.umich.edu setVfpMicroFlags(mode, flags); 6427375Sgblack@eecs.umich.edu } 6437375Sgblack@eecs.umich.edu}; 6447375Sgblack@eecs.umich.edu 6457375Sgblack@eecs.umich.educlass VfpRegImmOp : public RegImmOp 6467375Sgblack@eecs.umich.edu{ 6477375Sgblack@eecs.umich.edu protected: 6487375Sgblack@eecs.umich.edu VfpRegImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass, 6497375Sgblack@eecs.umich.edu IntRegIndex _dest, uint64_t _imm, 6507375Sgblack@eecs.umich.edu VfpMicroMode mode = VfpNotAMicroop) : 6517375Sgblack@eecs.umich.edu RegImmOp(mnem, _machInst, __opClass, _dest, _imm) 6527375Sgblack@eecs.umich.edu { 6537375Sgblack@eecs.umich.edu setVfpMicroFlags(mode, flags); 6547375Sgblack@eecs.umich.edu } 6557375Sgblack@eecs.umich.edu}; 6567375Sgblack@eecs.umich.edu 6577375Sgblack@eecs.umich.educlass VfpRegRegImmOp : public RegRegImmOp 6587375Sgblack@eecs.umich.edu{ 6597375Sgblack@eecs.umich.edu protected: 6607375Sgblack@eecs.umich.edu VfpRegRegImmOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass, 6617375Sgblack@eecs.umich.edu IntRegIndex _dest, IntRegIndex _op1, 6627375Sgblack@eecs.umich.edu uint64_t _imm, VfpMicroMode mode = VfpNotAMicroop) : 6637375Sgblack@eecs.umich.edu RegRegImmOp(mnem, _machInst, __opClass, _dest, _op1, _imm) 6647375Sgblack@eecs.umich.edu { 6657375Sgblack@eecs.umich.edu setVfpMicroFlags(mode, flags); 6667375Sgblack@eecs.umich.edu } 6677375Sgblack@eecs.umich.edu}; 6687375Sgblack@eecs.umich.edu 6697375Sgblack@eecs.umich.educlass VfpRegRegRegOp : public RegRegRegOp 6707375Sgblack@eecs.umich.edu{ 6717375Sgblack@eecs.umich.edu protected: 6727375Sgblack@eecs.umich.edu VfpRegRegRegOp(const char *mnem, ExtMachInst _machInst, OpClass __opClass, 6737375Sgblack@eecs.umich.edu IntRegIndex _dest, IntRegIndex _op1, IntRegIndex _op2, 6747375Sgblack@eecs.umich.edu VfpMicroMode mode = VfpNotAMicroop) : 6757375Sgblack@eecs.umich.edu RegRegRegOp(mnem, _machInst, __opClass, _dest, _op1, _op2) 6767375Sgblack@eecs.umich.edu { 6777375Sgblack@eecs.umich.edu setVfpMicroFlags(mode, flags); 6787375Sgblack@eecs.umich.edu } 6797375Sgblack@eecs.umich.edu}; 6807375Sgblack@eecs.umich.edu 6817384Sgblack@eecs.umich.edu} 6827384Sgblack@eecs.umich.edu 6837375Sgblack@eecs.umich.edu#endif //__ARCH_ARM_INSTS_VFP_HH__ 684