fplib.hh revision 10037
110037SARM gem5 Developers/* 210037SARM gem5 Developers * Copyright (c) 2012-2013 ARM Limited 310037SARM gem5 Developers * All rights reserved 410037SARM gem5 Developers * 510037SARM gem5 Developers * The license below extends only to copyright in the software and shall 610037SARM gem5 Developers * not be construed as granting a license to any other intellectual 710037SARM gem5 Developers * property including but not limited to intellectual property relating 810037SARM gem5 Developers * to a hardware implementation of the functionality of the software 910037SARM gem5 Developers * licensed hereunder. You may use the software subject to the license 1010037SARM gem5 Developers * terms below provided that you ensure that this notice is replicated 1110037SARM gem5 Developers * unmodified and in its entirety in all distributions of the software, 1210037SARM gem5 Developers * modified or unmodified, in source code or in binary form. 1310037SARM gem5 Developers * 1410037SARM gem5 Developers * Redistribution and use in source and binary forms, with or without 1510037SARM gem5 Developers * modification, are permitted provided that the following conditions are 1610037SARM gem5 Developers * met: redistributions of source code must retain the above copyright 1710037SARM gem5 Developers * notice, this list of conditions and the following disclaimer; 1810037SARM gem5 Developers * redistributions in binary form must reproduce the above copyright 1910037SARM gem5 Developers * notice, this list of conditions and the following disclaimer in the 2010037SARM gem5 Developers * documentation and/or other materials provided with the distribution; 2110037SARM gem5 Developers * neither the name of the copyright holders nor the names of its 2210037SARM gem5 Developers * contributors may be used to endorse or promote products derived from 2310037SARM gem5 Developers * this software without specific prior written permission. 2410037SARM gem5 Developers * 2510037SARM gem5 Developers * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2610037SARM gem5 Developers * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2710037SARM gem5 Developers * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2810037SARM gem5 Developers * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2910037SARM gem5 Developers * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3010037SARM gem5 Developers * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3110037SARM gem5 Developers * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3210037SARM gem5 Developers * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3310037SARM gem5 Developers * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3410037SARM gem5 Developers * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3510037SARM gem5 Developers * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3610037SARM gem5 Developers * 3710037SARM gem5 Developers * Authors: Edmund Grimley Evans 3810037SARM gem5 Developers * Thomas Grocutt 3910037SARM gem5 Developers */ 4010037SARM gem5 Developers 4110037SARM gem5 Developers/** 4210037SARM gem5 Developers * @file 4310037SARM gem5 Developers * Floating-point library code, which will gradually replace vfp.hh. For 4410037SARM gem5 Developers * portability, this library does not use floating-point data types. Currently, 4510037SARM gem5 Developers * C's standard integer types are used in the API, though this could be changed 4610037SARM gem5 Developers * to something like class Fp32 { uint32_t x; }, etc. 4710037SARM gem5 Developers */ 4810037SARM gem5 Developers 4910037SARM gem5 Developers#ifndef __ARCH_ARM_INSTS_FPLIB_HH__ 5010037SARM gem5 Developers#define __ARCH_ARM_INSTS_FPLIB_HH__ 5110037SARM gem5 Developers 5210037SARM gem5 Developers#include <stdint.h> 5310037SARM gem5 Developers 5410037SARM gem5 Developers#include "arch/arm/miscregs.hh" 5510037SARM gem5 Developers 5610037SARM gem5 Developersnamespace ArmISA 5710037SARM gem5 Developers{ 5810037SARM gem5 Developers 5910037SARM gem5 Developersenum FPRounding { 6010037SARM gem5 Developers FPRounding_TIEEVEN = 0, 6110037SARM gem5 Developers FPRounding_POSINF = 1, 6210037SARM gem5 Developers FPRounding_NEGINF = 2, 6310037SARM gem5 Developers FPRounding_ZERO = 3, 6410037SARM gem5 Developers FPRounding_TIEAWAY = 4, 6510037SARM gem5 Developers FPRounding_ODD = 5 6610037SARM gem5 Developers}; 6710037SARM gem5 Developers 6810037SARM gem5 Developersstatic inline FPRounding 6910037SARM gem5 DevelopersFPCRRounding(FPSCR &fpscr) 7010037SARM gem5 Developers{ 7110037SARM gem5 Developers return (FPRounding)((uint32_t)fpscr >> 22 & 3); 7210037SARM gem5 Developers} 7310037SARM gem5 Developers 7410037SARM gem5 Developers/** Floating-point absolute value. */ 7510037SARM gem5 Developerstemplate <class T> 7610037SARM gem5 DevelopersT fplibAbs(T op); 7710037SARM gem5 Developers/** Floating-point add. */ 7810037SARM gem5 Developerstemplate <class T> 7910037SARM gem5 DevelopersT fplibAdd(T op1, T op2, FPSCR &fpscr); 8010037SARM gem5 Developers/** Floating-point compare (quiet and signaling). */ 8110037SARM gem5 Developerstemplate <class T> 8210037SARM gem5 Developersint fplibCompare(T op1, T op2, bool signal_nans, FPSCR &fpscr); 8310037SARM gem5 Developers/** Floating-point compare equal. */ 8410037SARM gem5 Developerstemplate <class T> 8510037SARM gem5 Developersbool fplibCompareEQ(T op1, T op2, FPSCR &fpscr); 8610037SARM gem5 Developers/** Floating-point compare greater than or equal. */ 8710037SARM gem5 Developerstemplate <class T> 8810037SARM gem5 Developersbool fplibCompareGE(T op1, T op2, FPSCR &fpscr); 8910037SARM gem5 Developers/** Floating-point compare greater than. */ 9010037SARM gem5 Developerstemplate <class T> 9110037SARM gem5 Developersbool fplibCompareGT(T op1, T op2, FPSCR &fpscr); 9210037SARM gem5 Developers/** Floating-point convert precision. */ 9310037SARM gem5 Developerstemplate <class T1, class T2> 9410037SARM gem5 DevelopersT2 fplibConvert(T1 op, FPRounding rounding, FPSCR &fpscr); 9510037SARM gem5 Developers/** Floating-point division. */ 9610037SARM gem5 Developerstemplate <class T> 9710037SARM gem5 DevelopersT fplibDiv(T op1, T op2, FPSCR &fpscr); 9810037SARM gem5 Developers/** Floating-point maximum. */ 9910037SARM gem5 Developerstemplate <class T> 10010037SARM gem5 DevelopersT fplibMax(T op1, T op2, FPSCR &fpscr); 10110037SARM gem5 Developers/** Floating-point maximum number. */ 10210037SARM gem5 Developerstemplate <class T> 10310037SARM gem5 DevelopersT fplibMaxNum(T op1, T op2, FPSCR &fpscr); 10410037SARM gem5 Developers/** Floating-point minimum. */ 10510037SARM gem5 Developerstemplate <class T> 10610037SARM gem5 DevelopersT fplibMin(T op1, T op2, FPSCR &fpscr); 10710037SARM gem5 Developers/** Floating-point minimum number. */ 10810037SARM gem5 Developerstemplate <class T> 10910037SARM gem5 DevelopersT fplibMinNum(T op1, T op2, FPSCR &fpscr); 11010037SARM gem5 Developers/** Floating-point multiply. */ 11110037SARM gem5 Developerstemplate <class T> 11210037SARM gem5 DevelopersT fplibMul(T op1, T op2, FPSCR &fpscr); 11310037SARM gem5 Developers/** Floating-point multiply-add. */ 11410037SARM gem5 Developerstemplate <class T> 11510037SARM gem5 DevelopersT fplibMulAdd(T addend, T op1, T op2, FPSCR &fpscr); 11610037SARM gem5 Developers/** Floating-point multiply extended. */ 11710037SARM gem5 Developerstemplate <class T> 11810037SARM gem5 DevelopersT fplibMulX(T op1, T op2, FPSCR &fpscr); 11910037SARM gem5 Developers/** Floating-point negate. */ 12010037SARM gem5 Developerstemplate <class T> 12110037SARM gem5 DevelopersT fplibNeg(T op); 12210037SARM gem5 Developers/** Floating-point reciprocal square root estimate. */ 12310037SARM gem5 Developerstemplate <class T> 12410037SARM gem5 DevelopersT fplibRSqrtEstimate(T op, FPSCR &fpscr); 12510037SARM gem5 Developers/** Floating-point reciprocal square root step. */ 12610037SARM gem5 Developerstemplate <class T> 12710037SARM gem5 DevelopersT fplibRSqrtStepFused(T op1, T op2, FPSCR &fpscr); 12810037SARM gem5 Developers/** Floating-point reciprocal estimate. */ 12910037SARM gem5 Developerstemplate <class T> 13010037SARM gem5 DevelopersT fplibRecipEstimate(T op, FPSCR &fpscr); 13110037SARM gem5 Developers/** Floating-point reciprocal step. */ 13210037SARM gem5 Developerstemplate <class T> 13310037SARM gem5 DevelopersT fplibRecipStepFused(T op1, T op2, FPSCR &fpscr); 13410037SARM gem5 Developers/** Floating-point reciprocal exponent. */ 13510037SARM gem5 Developerstemplate <class T> 13610037SARM gem5 DevelopersT fplibRecpX(T op, FPSCR &fpscr); 13710037SARM gem5 Developers/** Floating-point convert to integer. */ 13810037SARM gem5 Developerstemplate <class T> 13910037SARM gem5 DevelopersT fplibRoundInt(T op, FPRounding rounding, bool exact, FPSCR &fpscr); 14010037SARM gem5 Developers/** Floating-point square root. */ 14110037SARM gem5 Developerstemplate <class T> 14210037SARM gem5 DevelopersT fplibSqrt(T op, FPSCR &fpscr); 14310037SARM gem5 Developers/** Floating-point subtract. */ 14410037SARM gem5 Developerstemplate <class T> 14510037SARM gem5 DevelopersT fplibSub(T op1, T op2, FPSCR &fpscr); 14610037SARM gem5 Developers/** Floating-point convert to fixed-point. */ 14710037SARM gem5 Developerstemplate <class T1, class T2> 14810037SARM gem5 DevelopersT2 fplibFPToFixed(T1 op, int fbits, bool u, FPRounding rounding, FPSCR &fpscr); 14910037SARM gem5 Developers/** Floating-point convert from fixed-point. */ 15010037SARM gem5 Developerstemplate <class T> 15110037SARM gem5 DevelopersT fplibFixedToFP(uint64_t op, int fbits, bool u, FPRounding rounding, 15210037SARM gem5 Developers FPSCR &fpscr); 15310037SARM gem5 Developers 15410037SARM gem5 Developers/* Function specializations... */ 15510037SARM gem5 Developerstemplate <> 15610037SARM gem5 Developersuint32_t fplibAbs(uint32_t op); 15710037SARM gem5 Developerstemplate <> 15810037SARM gem5 Developersuint64_t fplibAbs(uint64_t op); 15910037SARM gem5 Developerstemplate <> 16010037SARM gem5 Developersuint32_t fplibAdd(uint32_t op1, uint32_t op2, FPSCR &fpscr); 16110037SARM gem5 Developerstemplate <> 16210037SARM gem5 Developersuint64_t fplibAdd(uint64_t op1, uint64_t op2, FPSCR &fpscr); 16310037SARM gem5 Developerstemplate <> 16410037SARM gem5 Developersint fplibCompare(uint32_t op1, uint32_t op2, bool signal_nans, FPSCR &fpscr); 16510037SARM gem5 Developerstemplate <> 16610037SARM gem5 Developersint fplibCompare(uint64_t op1, uint64_t op2, bool signal_nans, FPSCR &fpscr); 16710037SARM gem5 Developerstemplate <> 16810037SARM gem5 Developersbool fplibCompareEQ(uint32_t op1, uint32_t op2, FPSCR &fpscr); 16910037SARM gem5 Developerstemplate <> 17010037SARM gem5 Developersbool fplibCompareEQ(uint64_t op1, uint64_t op2, FPSCR &fpscr); 17110037SARM gem5 Developerstemplate <> 17210037SARM gem5 Developersbool fplibCompareGE(uint32_t op1, uint32_t op2, FPSCR &fpscr); 17310037SARM gem5 Developerstemplate <> 17410037SARM gem5 Developersbool fplibCompareGE(uint64_t op1, uint64_t op2, FPSCR &fpscr); 17510037SARM gem5 Developerstemplate <> 17610037SARM gem5 Developersbool fplibCompareGT(uint32_t op1, uint32_t op2, FPSCR &fpscr); 17710037SARM gem5 Developerstemplate <> 17810037SARM gem5 Developersbool fplibCompareGT(uint64_t op1, uint64_t op2, FPSCR &fpscr); 17910037SARM gem5 Developerstemplate <> 18010037SARM gem5 Developersuint16_t fplibConvert(uint32_t op, FPRounding rounding, FPSCR &fpscr); 18110037SARM gem5 Developerstemplate <> 18210037SARM gem5 Developersuint16_t fplibConvert(uint64_t op, FPRounding rounding, FPSCR &fpscr); 18310037SARM gem5 Developerstemplate <> 18410037SARM gem5 Developersuint32_t fplibConvert(uint16_t op, FPRounding rounding, FPSCR &fpscr); 18510037SARM gem5 Developerstemplate <> 18610037SARM gem5 Developersuint32_t fplibConvert(uint64_t op, FPRounding rounding, FPSCR &fpscr); 18710037SARM gem5 Developerstemplate <> 18810037SARM gem5 Developersuint64_t fplibConvert(uint16_t op, FPRounding rounding, FPSCR &fpscr); 18910037SARM gem5 Developerstemplate <> 19010037SARM gem5 Developersuint64_t fplibConvert(uint32_t op, FPRounding rounding, FPSCR &fpscr); 19110037SARM gem5 Developerstemplate <> 19210037SARM gem5 Developersuint32_t fplibDiv(uint32_t op1, uint32_t op2, FPSCR &fpscr); 19310037SARM gem5 Developerstemplate <> 19410037SARM gem5 Developersuint64_t fplibDiv(uint64_t op1, uint64_t op2, FPSCR &fpscr); 19510037SARM gem5 Developerstemplate <> 19610037SARM gem5 Developersuint32_t fplibMax(uint32_t op1, uint32_t op2, FPSCR &fpscr); 19710037SARM gem5 Developerstemplate <> 19810037SARM gem5 Developersuint64_t fplibMax(uint64_t op1, uint64_t op2, FPSCR &fpscr); 19910037SARM gem5 Developerstemplate <> 20010037SARM gem5 Developersuint32_t fplibMaxNum(uint32_t op1, uint32_t op2, FPSCR &fpscr); 20110037SARM gem5 Developerstemplate <> 20210037SARM gem5 Developersuint64_t fplibMaxNum(uint64_t op1, uint64_t op2, FPSCR &fpscr); 20310037SARM gem5 Developerstemplate <> 20410037SARM gem5 Developersuint32_t fplibMin(uint32_t op1, uint32_t op2, FPSCR &fpscr); 20510037SARM gem5 Developerstemplate <> 20610037SARM gem5 Developersuint64_t fplibMin(uint64_t op1, uint64_t op2, FPSCR &fpscr); 20710037SARM gem5 Developerstemplate <> 20810037SARM gem5 Developersuint32_t fplibMinNum(uint32_t op1, uint32_t op2, FPSCR &fpscr); 20910037SARM gem5 Developerstemplate <> 21010037SARM gem5 Developersuint64_t fplibMinNum(uint64_t op1, uint64_t op2, FPSCR &fpscr); 21110037SARM gem5 Developerstemplate <> 21210037SARM gem5 Developersuint32_t fplibMul(uint32_t op1, uint32_t op2, FPSCR &fpscr); 21310037SARM gem5 Developerstemplate <> 21410037SARM gem5 Developersuint64_t fplibMul(uint64_t op1, uint64_t op2, FPSCR &fpscr); 21510037SARM gem5 Developerstemplate <> 21610037SARM gem5 Developersuint32_t fplibMulAdd(uint32_t addend, uint32_t op1, uint32_t op2, 21710037SARM gem5 Developers FPSCR &fpscr); 21810037SARM gem5 Developerstemplate <> 21910037SARM gem5 Developersuint64_t fplibMulAdd(uint64_t addend, uint64_t op1, uint64_t op2, 22010037SARM gem5 Developers FPSCR &fpscr); 22110037SARM gem5 Developerstemplate <> 22210037SARM gem5 Developersuint32_t fplibMulX(uint32_t op1, uint32_t op2, FPSCR &fpscr); 22310037SARM gem5 Developerstemplate <> 22410037SARM gem5 Developersuint64_t fplibMulX(uint64_t op1, uint64_t op2, FPSCR &fpscr); 22510037SARM gem5 Developerstemplate <> 22610037SARM gem5 Developersuint32_t fplibNeg(uint32_t op); 22710037SARM gem5 Developerstemplate <> 22810037SARM gem5 Developersuint64_t fplibNeg(uint64_t op); 22910037SARM gem5 Developerstemplate <> 23010037SARM gem5 Developersuint32_t fplibRSqrtEstimate(uint32_t op, FPSCR &fpscr); 23110037SARM gem5 Developerstemplate<> 23210037SARM gem5 Developersuint64_t fplibRSqrtEstimate(uint64_t op, FPSCR &fpscr); 23310037SARM gem5 Developerstemplate <> 23410037SARM gem5 Developersuint32_t fplibRSqrtStepFused(uint32_t op1, uint32_t op2, FPSCR &fpscr); 23510037SARM gem5 Developerstemplate <> 23610037SARM gem5 Developersuint64_t fplibRSqrtStepFused(uint64_t op1, uint64_t op2, FPSCR &fpscr); 23710037SARM gem5 Developerstemplate <> 23810037SARM gem5 Developersuint32_t fplibRecipEstimate(uint32_t op, FPSCR &fpscr); 23910037SARM gem5 Developerstemplate <> 24010037SARM gem5 Developersuint64_t fplibRecipEstimate(uint64_t op, FPSCR &fpscr); 24110037SARM gem5 Developerstemplate <> 24210037SARM gem5 Developersuint32_t fplibRecipStepFused(uint32_t op1, uint32_t op2, FPSCR &fpscr); 24310037SARM gem5 Developerstemplate <> 24410037SARM gem5 Developersuint64_t fplibRecipStepFused(uint64_t op1, uint64_t op2, FPSCR &fpscr); 24510037SARM gem5 Developerstemplate <> 24610037SARM gem5 Developersuint32_t fplibRecpX(uint32_t op, FPSCR &fpscr); 24710037SARM gem5 Developerstemplate <> 24810037SARM gem5 Developersuint64_t fplibRecpX(uint64_t op, FPSCR &fpscr); 24910037SARM gem5 Developerstemplate <> 25010037SARM gem5 Developersuint32_t fplibRoundInt(uint32_t op, FPRounding rounding, bool exact, 25110037SARM gem5 Developers FPSCR &fpscr); 25210037SARM gem5 Developerstemplate <> 25310037SARM gem5 Developersuint64_t fplibRoundInt(uint64_t op, FPRounding rounding, bool exact, 25410037SARM gem5 Developers FPSCR &fpscr); 25510037SARM gem5 Developerstemplate <> 25610037SARM gem5 Developersuint32_t fplibSqrt(uint32_t op, FPSCR &fpscr); 25710037SARM gem5 Developerstemplate <> 25810037SARM gem5 Developersuint64_t fplibSqrt(uint64_t op, FPSCR &fpscr); 25910037SARM gem5 Developerstemplate <> 26010037SARM gem5 Developersuint32_t fplibSub(uint32_t op1, uint32_t op2, FPSCR &fpscr); 26110037SARM gem5 Developerstemplate <> 26210037SARM gem5 Developersuint64_t fplibSub(uint64_t op1, uint64_t op2, FPSCR &fpscr); 26310037SARM gem5 Developerstemplate <> 26410037SARM gem5 Developersuint32_t fplibFPToFixed(uint32_t op, int fbits, bool u, FPRounding rounding, 26510037SARM gem5 Developers FPSCR &fpscr); 26610037SARM gem5 Developerstemplate <> 26710037SARM gem5 Developersuint32_t fplibFPToFixed(uint64_t op, int fbits, bool u, FPRounding rounding, 26810037SARM gem5 Developers FPSCR &fpscr); 26910037SARM gem5 Developerstemplate <> 27010037SARM gem5 Developersuint64_t fplibFPToFixed(uint32_t op, int fbits, bool u, FPRounding rounding, 27110037SARM gem5 Developers FPSCR &fpscr); 27210037SARM gem5 Developerstemplate <> 27310037SARM gem5 Developersuint64_t fplibFPToFixed(uint64_t op, int fbits, bool u, FPRounding rounding, 27410037SARM gem5 Developers FPSCR &fpscr); 27510037SARM gem5 Developerstemplate <> 27610037SARM gem5 Developersuint32_t fplibFixedToFP(uint64_t op, int fbits, bool u, FPRounding rounding, 27710037SARM gem5 Developers FPSCR &fpscr); 27810037SARM gem5 Developerstemplate <> 27910037SARM gem5 Developersuint64_t fplibFixedToFP(uint64_t op, int fbits, bool u, FPRounding rounding, 28010037SARM gem5 Developers FPSCR &fpscr); 28110037SARM gem5 Developers} 28210037SARM gem5 Developers 28310037SARM gem5 Developers#endif 284