17cf9345cSTaylor Simpson/* 27cf9345cSTaylor Simpson * Copyright(c) 2019-2021 Qualcomm Innovation Center, Inc. All Rights Reserved. 37cf9345cSTaylor Simpson * 47cf9345cSTaylor Simpson * This program is free software; you can redistribute it and/or modify 57cf9345cSTaylor Simpson * it under the terms of the GNU General Public License as published by 67cf9345cSTaylor Simpson * the Free Software Foundation; either version 2 of the License, or 77cf9345cSTaylor Simpson * (at your option) any later version. 87cf9345cSTaylor Simpson * 97cf9345cSTaylor Simpson * This program is distributed in the hope that it will be useful, 107cf9345cSTaylor Simpson * but WITHOUT ANY WARRANTY; without even the implied warranty of 117cf9345cSTaylor Simpson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 127cf9345cSTaylor Simpson * GNU General Public License for more details. 137cf9345cSTaylor Simpson * 147cf9345cSTaylor Simpson * You should have received a copy of the GNU General Public License 157cf9345cSTaylor Simpson * along with this program; if not, see <http://www.gnu.org/licenses/>. 167cf9345cSTaylor Simpson */ 177cf9345cSTaylor Simpson 187cf9345cSTaylor Simpson/* 197cf9345cSTaylor Simpson * Floating-Point Instructions 207cf9345cSTaylor Simpson */ 217cf9345cSTaylor Simpson 227cf9345cSTaylor Simpson/*************************************/ 237cf9345cSTaylor Simpson/* Scalar FP */ 247cf9345cSTaylor Simpson/*************************************/ 257cf9345cSTaylor SimpsonQ6INSN(F2_sfadd,"Rd32=sfadd(Rs32,Rt32)",ATTRIBS(), 267cf9345cSTaylor Simpson"Floating-Point Add", 277cf9345cSTaylor Simpson{ RdV=fUNFLOAT(fFLOAT(RsV)+fFLOAT(RtV));}) 287cf9345cSTaylor Simpson 297cf9345cSTaylor SimpsonQ6INSN(F2_sfsub,"Rd32=sfsub(Rs32,Rt32)",ATTRIBS(), 307cf9345cSTaylor Simpson"Floating-Point Subtract", 317cf9345cSTaylor Simpson{ RdV=fUNFLOAT(fFLOAT(RsV)-fFLOAT(RtV));}) 327cf9345cSTaylor Simpson 337cf9345cSTaylor SimpsonQ6INSN(F2_sfmpy,"Rd32=sfmpy(Rs32,Rt32)",ATTRIBS(), 347cf9345cSTaylor Simpson"Floating-Point Multiply", 357cf9345cSTaylor Simpson{ RdV=fUNFLOAT(fSFMPY(fFLOAT(RsV),fFLOAT(RtV)));}) 367cf9345cSTaylor Simpson 377cf9345cSTaylor SimpsonQ6INSN(F2_sffma,"Rx32+=sfmpy(Rs32,Rt32)",ATTRIBS(), 387cf9345cSTaylor Simpson"Floating-Point Fused Multiply Add", 397cf9345cSTaylor Simpson{ RxV=fUNFLOAT(fFMAF(fFLOAT(RsV),fFLOAT(RtV),fFLOAT(RxV)));}) 407cf9345cSTaylor Simpson 417cf9345cSTaylor SimpsonQ6INSN(F2_sffma_sc,"Rx32+=sfmpy(Rs32,Rt32,Pu4):scale",ATTRIBS(), 427cf9345cSTaylor Simpson"Floating-Point Fused Multiply Add w/ Additional Scaling (2**Pu)", 437cf9345cSTaylor Simpson{ 447cf9345cSTaylor Simpson fHIDE(size4s_t tmp;) 457cf9345cSTaylor Simpson fCHECKSFNAN3(RxV,RxV,RsV,RtV); 467cf9345cSTaylor Simpson tmp=fUNFLOAT(fFMAFX(fFLOAT(RsV),fFLOAT(RtV),fFLOAT(RxV),PuV)); 477cf9345cSTaylor Simpson if (!((fFLOAT(RxV) == 0.0) && fISZEROPROD(fFLOAT(RsV),fFLOAT(RtV)))) RxV = tmp; 487cf9345cSTaylor Simpson}) 497cf9345cSTaylor Simpson 507cf9345cSTaylor SimpsonQ6INSN(F2_sffms,"Rx32-=sfmpy(Rs32,Rt32)",ATTRIBS(), 517cf9345cSTaylor Simpson"Floating-Point Fused Multiply Add", 527cf9345cSTaylor Simpson{ RxV=fUNFLOAT(fFMAF(-fFLOAT(RsV),fFLOAT(RtV),fFLOAT(RxV))); }) 537cf9345cSTaylor Simpson 547cf9345cSTaylor SimpsonQ6INSN(F2_sffma_lib,"Rx32+=sfmpy(Rs32,Rt32):lib",ATTRIBS(), 557cf9345cSTaylor Simpson"Floating-Point Fused Multiply Add for Library Routines", 567cf9345cSTaylor Simpson{ fFPSETROUND_NEAREST(); fHIDE(int infinp; int infminusinf; size4s_t tmp;) 577cf9345cSTaylor Simpson infminusinf = ((isinf(fFLOAT(RxV))) && 587cf9345cSTaylor Simpson (fISINFPROD(fFLOAT(RsV),fFLOAT(RtV))) && 597cf9345cSTaylor Simpson (fGETBIT(31,RsV ^ RxV ^ RtV) != 0)); 607cf9345cSTaylor Simpson infinp = (isinf(fFLOAT(RxV))) || (isinf(fFLOAT(RtV))) || (isinf(fFLOAT(RsV))); 617cf9345cSTaylor Simpson fCHECKSFNAN3(RxV,RxV,RsV,RtV); 627cf9345cSTaylor Simpson tmp=fUNFLOAT(fFMAF(fFLOAT(RsV),fFLOAT(RtV),fFLOAT(RxV))); 637cf9345cSTaylor Simpson if (!((fFLOAT(RxV) == 0.0) && fISZEROPROD(fFLOAT(RsV),fFLOAT(RtV)))) RxV = tmp; 647cf9345cSTaylor Simpson fFPCANCELFLAGS(); 657cf9345cSTaylor Simpson if (isinf(fFLOAT(RxV)) && !infinp) RxV = RxV - 1; 667cf9345cSTaylor Simpson if (infminusinf) RxV = 0; 677cf9345cSTaylor Simpson}) 687cf9345cSTaylor Simpson 697cf9345cSTaylor SimpsonQ6INSN(F2_sffms_lib,"Rx32-=sfmpy(Rs32,Rt32):lib",ATTRIBS(), 707cf9345cSTaylor Simpson"Floating-Point Fused Multiply Add for Library Routines", 717cf9345cSTaylor Simpson{ fFPSETROUND_NEAREST(); fHIDE(int infinp; int infminusinf; size4s_t tmp;) 727cf9345cSTaylor Simpson infminusinf = ((isinf(fFLOAT(RxV))) && 737cf9345cSTaylor Simpson (fISINFPROD(fFLOAT(RsV),fFLOAT(RtV))) && 747cf9345cSTaylor Simpson (fGETBIT(31,RsV ^ RxV ^ RtV) == 0)); 757cf9345cSTaylor Simpson infinp = (isinf(fFLOAT(RxV))) || (isinf(fFLOAT(RtV))) || (isinf(fFLOAT(RsV))); 767cf9345cSTaylor Simpson fCHECKSFNAN3(RxV,RxV,RsV,RtV); 777cf9345cSTaylor Simpson tmp=fUNFLOAT(fFMAF(-fFLOAT(RsV),fFLOAT(RtV),fFLOAT(RxV))); 787cf9345cSTaylor Simpson if (!((fFLOAT(RxV) == 0.0) && fISZEROPROD(fFLOAT(RsV),fFLOAT(RtV)))) RxV = tmp; 797cf9345cSTaylor Simpson fFPCANCELFLAGS(); 807cf9345cSTaylor Simpson if (isinf(fFLOAT(RxV)) && !infinp) RxV = RxV - 1; 817cf9345cSTaylor Simpson if (infminusinf) RxV = 0; 827cf9345cSTaylor Simpson}) 837cf9345cSTaylor Simpson 847cf9345cSTaylor Simpson 857cf9345cSTaylor SimpsonQ6INSN(F2_sfcmpeq,"Pd4=sfcmp.eq(Rs32,Rt32)",ATTRIBS(), 867cf9345cSTaylor Simpson"Floating Point Compare for Equal", 877cf9345cSTaylor Simpson{PdV=f8BITSOF(fFLOAT(RsV)==fFLOAT(RtV));}) 887cf9345cSTaylor Simpson 897cf9345cSTaylor SimpsonQ6INSN(F2_sfcmpgt,"Pd4=sfcmp.gt(Rs32,Rt32)",ATTRIBS(), 907cf9345cSTaylor Simpson"Floating-Point Compare for Greater Than", 917cf9345cSTaylor Simpson{PdV=f8BITSOF(fFLOAT(RsV)>fFLOAT(RtV));}) 927cf9345cSTaylor Simpson 937cf9345cSTaylor Simpson/* cmpge is not the same as !cmpgt(swapops) in IEEE */ 947cf9345cSTaylor Simpson 957cf9345cSTaylor SimpsonQ6INSN(F2_sfcmpge,"Pd4=sfcmp.ge(Rs32,Rt32)",ATTRIBS(), 967cf9345cSTaylor Simpson"Floating-Point Compare for Greater Than / Equal To", 977cf9345cSTaylor Simpson{PdV=f8BITSOF(fFLOAT(RsV)>=fFLOAT(RtV));}) 987cf9345cSTaylor Simpson 997cf9345cSTaylor Simpson/* Everyone seems to have this... */ 1007cf9345cSTaylor Simpson 1017cf9345cSTaylor SimpsonQ6INSN(F2_sfcmpuo,"Pd4=sfcmp.uo(Rs32,Rt32)",ATTRIBS(), 1027cf9345cSTaylor Simpson"Floating-Point Compare for Unordered", 1037cf9345cSTaylor Simpson{PdV=f8BITSOF(isunordered(fFLOAT(RsV),fFLOAT(RtV)));}) 1047cf9345cSTaylor Simpson 1057cf9345cSTaylor Simpson 1067cf9345cSTaylor SimpsonQ6INSN(F2_sfmax,"Rd32=sfmax(Rs32,Rt32)",ATTRIBS(), 1077cf9345cSTaylor Simpson"Maximum of Floating-Point values", 1087cf9345cSTaylor Simpson{ RdV = fUNFLOAT(fSF_MAX(fFLOAT(RsV),fFLOAT(RtV))); }) 1097cf9345cSTaylor Simpson 1107cf9345cSTaylor SimpsonQ6INSN(F2_sfmin,"Rd32=sfmin(Rs32,Rt32)",ATTRIBS(), 1117cf9345cSTaylor Simpson"Minimum of Floating-Point values", 1127cf9345cSTaylor Simpson{ RdV = fUNFLOAT(fSF_MIN(fFLOAT(RsV),fFLOAT(RtV))); }) 1137cf9345cSTaylor Simpson 1147cf9345cSTaylor Simpson 1157cf9345cSTaylor SimpsonQ6INSN(F2_sfclass,"Pd4=sfclass(Rs32,#u5)",ATTRIBS(), 1167cf9345cSTaylor Simpson"Classify Floating-Point Value", 1177cf9345cSTaylor Simpson{ 1187cf9345cSTaylor Simpson fHIDE(int class;) 1197cf9345cSTaylor Simpson PdV = 0; 1207cf9345cSTaylor Simpson class = fpclassify(fFLOAT(RsV)); 1217cf9345cSTaylor Simpson /* Is the value zero? */ 1227cf9345cSTaylor Simpson if (fGETBIT(0,uiV) && (class == FP_ZERO)) PdV = 0xff; 1237cf9345cSTaylor Simpson if (fGETBIT(1,uiV) && (class == FP_NORMAL)) PdV = 0xff; 1247cf9345cSTaylor Simpson if (fGETBIT(2,uiV) && (class == FP_SUBNORMAL)) PdV = 0xff; 1257cf9345cSTaylor Simpson if (fGETBIT(3,uiV) && (class == FP_INFINITE)) PdV = 0xff; 1267cf9345cSTaylor Simpson if (fGETBIT(4,uiV) && (class == FP_NAN)) PdV = 0xff; 1277cf9345cSTaylor Simpson fFPCANCELFLAGS(); 1287cf9345cSTaylor Simpson}) 1297cf9345cSTaylor Simpson 1307cf9345cSTaylor Simpson/* Range: +/- (1.0 .. 1+(63/64)) * 2**(-6 .. +9) */ 1317cf9345cSTaylor Simpson/* More immediate bits should probably be used for more precision? */ 1327cf9345cSTaylor Simpson 1337cf9345cSTaylor SimpsonQ6INSN(F2_sfimm_p,"Rd32=sfmake(#u10):pos",ATTRIBS(), 1347cf9345cSTaylor Simpson"Make Floating Point Value", 1357cf9345cSTaylor Simpson{ 1367cf9345cSTaylor Simpson RdV = (127 - 6) << 23; 1377cf9345cSTaylor Simpson RdV += uiV << 17; 1387cf9345cSTaylor Simpson}) 1397cf9345cSTaylor Simpson 1407cf9345cSTaylor SimpsonQ6INSN(F2_sfimm_n,"Rd32=sfmake(#u10):neg",ATTRIBS(), 1417cf9345cSTaylor Simpson"Make Floating Point Value", 1427cf9345cSTaylor Simpson{ 1437cf9345cSTaylor Simpson RdV = (127 - 6) << 23; 1447cf9345cSTaylor Simpson RdV += (uiV << 17); 1457cf9345cSTaylor Simpson RdV |= (1 << 31); 1467cf9345cSTaylor Simpson}) 1477cf9345cSTaylor Simpson 1487cf9345cSTaylor Simpson 149d934c16dSTaylor SimpsonQ6INSN(F2_sfrecipa,"Rd32,Pe4=sfrecipa(Rs32,Rt32)",ATTRIBS(), 150d934c16dSTaylor Simpson"Reciprocal Approximation for Division", 151d934c16dSTaylor Simpson{ 152d934c16dSTaylor Simpson fHIDE(int idx;) 153d934c16dSTaylor Simpson fHIDE(int adjust;) 154d934c16dSTaylor Simpson fHIDE(int mant;) 155d934c16dSTaylor Simpson fHIDE(int exp;) 156d934c16dSTaylor Simpson if (fSF_RECIP_COMMON(RsV,RtV,RdV,adjust)) { 157d934c16dSTaylor Simpson PeV = adjust; 158d934c16dSTaylor Simpson idx = (RtV >> 16) & 0x7f; 159d934c16dSTaylor Simpson mant = (fSF_RECIP_LOOKUP(idx) << 15) | 1; 160d934c16dSTaylor Simpson exp = fSF_BIAS() - (fSF_GETEXP(RtV) - fSF_BIAS()) - 1; 161d934c16dSTaylor Simpson RdV = fMAKESF(fGETBIT(31,RtV),exp,mant); 162d934c16dSTaylor Simpson } 163d934c16dSTaylor Simpson}) 164d934c16dSTaylor Simpson 1657cf9345cSTaylor SimpsonQ6INSN(F2_sffixupn,"Rd32=sffixupn(Rs32,Rt32)",ATTRIBS(), 1667cf9345cSTaylor Simpson"Fix Up Numerator", 1677cf9345cSTaylor Simpson{ 1687cf9345cSTaylor Simpson fHIDE(int adjust;) 1697cf9345cSTaylor Simpson fSF_RECIP_COMMON(RsV,RtV,RdV,adjust); 1707cf9345cSTaylor Simpson RdV = RsV; 1717cf9345cSTaylor Simpson}) 1727cf9345cSTaylor Simpson 1737cf9345cSTaylor SimpsonQ6INSN(F2_sffixupd,"Rd32=sffixupd(Rs32,Rt32)",ATTRIBS(), 1747cf9345cSTaylor Simpson"Fix Up Denominator", 1757cf9345cSTaylor Simpson{ 1767cf9345cSTaylor Simpson fHIDE(int adjust;) 1777cf9345cSTaylor Simpson fSF_RECIP_COMMON(RsV,RtV,RdV,adjust); 1787cf9345cSTaylor Simpson RdV = RtV; 1797cf9345cSTaylor Simpson}) 1807cf9345cSTaylor Simpson 181*dd8705bdSTaylor SimpsonQ6INSN(F2_sfinvsqrta,"Rd32,Pe4=sfinvsqrta(Rs32)",ATTRIBS(), 182*dd8705bdSTaylor Simpson"Reciprocal Square Root Approximation", 183*dd8705bdSTaylor Simpson{ 184*dd8705bdSTaylor Simpson fHIDE(int idx;) 185*dd8705bdSTaylor Simpson fHIDE(int adjust;) 186*dd8705bdSTaylor Simpson fHIDE(int mant;) 187*dd8705bdSTaylor Simpson fHIDE(int exp;) 188*dd8705bdSTaylor Simpson if (fSF_INVSQRT_COMMON(RsV,RdV,adjust)) { 189*dd8705bdSTaylor Simpson PeV = adjust; 190*dd8705bdSTaylor Simpson idx = (RsV >> 17) & 0x7f; 191*dd8705bdSTaylor Simpson mant = (fSF_INVSQRT_LOOKUP(idx) << 15); 192*dd8705bdSTaylor Simpson exp = fSF_BIAS() - ((fSF_GETEXP(RsV) - fSF_BIAS()) >> 1) - 1; 193*dd8705bdSTaylor Simpson RdV = fMAKESF(fGETBIT(31,RsV),exp,mant); 194*dd8705bdSTaylor Simpson } 195*dd8705bdSTaylor Simpson}) 196*dd8705bdSTaylor Simpson 1977cf9345cSTaylor SimpsonQ6INSN(F2_sffixupr,"Rd32=sffixupr(Rs32)",ATTRIBS(), 1987cf9345cSTaylor Simpson"Fix Up Radicand", 1997cf9345cSTaylor Simpson{ 2007cf9345cSTaylor Simpson fHIDE(int adjust;) 2017cf9345cSTaylor Simpson fSF_INVSQRT_COMMON(RsV,RdV,adjust); 2027cf9345cSTaylor Simpson RdV = RsV; 2037cf9345cSTaylor Simpson}) 2047cf9345cSTaylor Simpson 2057cf9345cSTaylor Simpson/*************************************/ 2067cf9345cSTaylor Simpson/* Scalar DP */ 2077cf9345cSTaylor Simpson/*************************************/ 2087cf9345cSTaylor SimpsonQ6INSN(F2_dfadd,"Rdd32=dfadd(Rss32,Rtt32)",ATTRIBS(), 2097cf9345cSTaylor Simpson"Floating-Point Add", 2107cf9345cSTaylor Simpson{ RddV=fUNDOUBLE(fDOUBLE(RssV)+fDOUBLE(RttV));}) 2117cf9345cSTaylor Simpson 2127cf9345cSTaylor SimpsonQ6INSN(F2_dfsub,"Rdd32=dfsub(Rss32,Rtt32)",ATTRIBS(), 2137cf9345cSTaylor Simpson"Floating-Point Subtract", 2147cf9345cSTaylor Simpson{ RddV=fUNDOUBLE(fDOUBLE(RssV)-fDOUBLE(RttV));}) 2157cf9345cSTaylor Simpson 2167cf9345cSTaylor SimpsonQ6INSN(F2_dfmax,"Rdd32=dfmax(Rss32,Rtt32)",ATTRIBS(), 2177cf9345cSTaylor Simpson"Maximum of Floating-Point values", 2187cf9345cSTaylor Simpson{ RddV = fUNDOUBLE(fDF_MAX(fDOUBLE(RssV),fDOUBLE(RttV))); }) 2197cf9345cSTaylor Simpson 2207cf9345cSTaylor SimpsonQ6INSN(F2_dfmin,"Rdd32=dfmin(Rss32,Rtt32)",ATTRIBS(), 2217cf9345cSTaylor Simpson"Minimum of Floating-Point values", 2227cf9345cSTaylor Simpson{ RddV = fUNDOUBLE(fDF_MIN(fDOUBLE(RssV),fDOUBLE(RttV))); }) 2237cf9345cSTaylor Simpson 2247cf9345cSTaylor SimpsonQ6INSN(F2_dfmpyfix,"Rdd32=dfmpyfix(Rss32,Rtt32)",ATTRIBS(), 2257cf9345cSTaylor Simpson"Fix Up Multiplicand for Multiplication", 2267cf9345cSTaylor Simpson{ 2277cf9345cSTaylor Simpson if (fDF_ISDENORM(RssV) && fDF_ISBIG(RttV) && fDF_ISNORMAL(RttV)) RddV = fUNDOUBLE(fDOUBLE(RssV) * 0x1.0p52); 2287cf9345cSTaylor Simpson else if (fDF_ISDENORM(RttV) && fDF_ISBIG(RssV) && fDF_ISNORMAL(RssV)) RddV = fUNDOUBLE(fDOUBLE(RssV) * 0x1.0p-52); 2297cf9345cSTaylor Simpson else RddV = RssV; 2307cf9345cSTaylor Simpson}) 2317cf9345cSTaylor Simpson 2327cf9345cSTaylor SimpsonQ6INSN(F2_dfmpyll,"Rdd32=dfmpyll(Rss32,Rtt32)",ATTRIBS(), 2337cf9345cSTaylor Simpson"Multiply low*low and shift off low 32 bits into sticky (in MSB)", 2347cf9345cSTaylor Simpson{ 2357cf9345cSTaylor Simpson fHIDE(size8u_t prod;) 2367cf9345cSTaylor Simpson prod = fMPY32UU(fGETUWORD(0,RssV),fGETUWORD(0,RttV)); 2377cf9345cSTaylor Simpson RddV = (prod >> 32) << 1; 2387cf9345cSTaylor Simpson if (fGETUWORD(0,prod) != 0) fSETBIT(0,RddV,1); 2397cf9345cSTaylor Simpson}) 2407cf9345cSTaylor Simpson 2417cf9345cSTaylor SimpsonQ6INSN(F2_dfmpylh,"Rxx32+=dfmpylh(Rss32,Rtt32)",ATTRIBS(), 2427cf9345cSTaylor Simpson"Multiply low*high and accumulate", 2437cf9345cSTaylor Simpson{ 2447cf9345cSTaylor Simpson RxxV += (fGETUWORD(0,RssV) * (0x00100000 | fZXTN(20,64,fGETUWORD(1,RttV)))) << 1; 2457cf9345cSTaylor Simpson}) 2467cf9345cSTaylor Simpson 2477cf9345cSTaylor SimpsonQ6INSN(F2_dfmpyhh,"Rxx32+=dfmpyhh(Rss32,Rtt32)",ATTRIBS(), 2487cf9345cSTaylor Simpson"Multiply high*high and accumulate with L*H value", 2497cf9345cSTaylor Simpson{ 2507cf9345cSTaylor Simpson RxxV = fUNDOUBLE(fDF_MPY_HH(fDOUBLE(RssV),fDOUBLE(RttV),RxxV)); 2517cf9345cSTaylor Simpson}) 2527cf9345cSTaylor Simpson 2537cf9345cSTaylor Simpson 2547cf9345cSTaylor Simpson 2557cf9345cSTaylor SimpsonQ6INSN(F2_dfcmpeq,"Pd4=dfcmp.eq(Rss32,Rtt32)",ATTRIBS(), 2567cf9345cSTaylor Simpson"Floating Point Compare for Equal", 2577cf9345cSTaylor Simpson{PdV=f8BITSOF(fDOUBLE(RssV)==fDOUBLE(RttV));}) 2587cf9345cSTaylor Simpson 2597cf9345cSTaylor SimpsonQ6INSN(F2_dfcmpgt,"Pd4=dfcmp.gt(Rss32,Rtt32)",ATTRIBS(), 2607cf9345cSTaylor Simpson"Floating-Point Compare for Greater Than", 2617cf9345cSTaylor Simpson{PdV=f8BITSOF(fDOUBLE(RssV)>fDOUBLE(RttV));}) 2627cf9345cSTaylor Simpson 2637cf9345cSTaylor Simpson 2647cf9345cSTaylor Simpson/* cmpge is not the same as !cmpgt(swapops) in IEEE */ 2657cf9345cSTaylor Simpson 2667cf9345cSTaylor SimpsonQ6INSN(F2_dfcmpge,"Pd4=dfcmp.ge(Rss32,Rtt32)",ATTRIBS(), 2677cf9345cSTaylor Simpson"Floating-Point Compare for Greater Than / Equal To", 2687cf9345cSTaylor Simpson{PdV=f8BITSOF(fDOUBLE(RssV)>=fDOUBLE(RttV));}) 2697cf9345cSTaylor Simpson 2707cf9345cSTaylor Simpson/* Everyone seems to have this... */ 2717cf9345cSTaylor Simpson 2727cf9345cSTaylor SimpsonQ6INSN(F2_dfcmpuo,"Pd4=dfcmp.uo(Rss32,Rtt32)",ATTRIBS(), 2737cf9345cSTaylor Simpson"Floating-Point Compare for Unordered", 2747cf9345cSTaylor Simpson{PdV=f8BITSOF(isunordered(fDOUBLE(RssV),fDOUBLE(RttV)));}) 2757cf9345cSTaylor Simpson 2767cf9345cSTaylor Simpson 2777cf9345cSTaylor SimpsonQ6INSN(F2_dfclass,"Pd4=dfclass(Rss32,#u5)",ATTRIBS(), 2787cf9345cSTaylor Simpson"Classify Floating-Point Value", 2797cf9345cSTaylor Simpson{ 2807cf9345cSTaylor Simpson fHIDE(int class;) 2817cf9345cSTaylor Simpson PdV = 0; 2827cf9345cSTaylor Simpson class = fpclassify(fDOUBLE(RssV)); 2837cf9345cSTaylor Simpson /* Is the value zero? */ 2847cf9345cSTaylor Simpson if (fGETBIT(0,uiV) && (class == FP_ZERO)) PdV = 0xff; 2857cf9345cSTaylor Simpson if (fGETBIT(1,uiV) && (class == FP_NORMAL)) PdV = 0xff; 2867cf9345cSTaylor Simpson if (fGETBIT(2,uiV) && (class == FP_SUBNORMAL)) PdV = 0xff; 2877cf9345cSTaylor Simpson if (fGETBIT(3,uiV) && (class == FP_INFINITE)) PdV = 0xff; 2887cf9345cSTaylor Simpson if (fGETBIT(4,uiV) && (class == FP_NAN)) PdV = 0xff; 2897cf9345cSTaylor Simpson fFPCANCELFLAGS(); 2907cf9345cSTaylor Simpson}) 2917cf9345cSTaylor Simpson 2927cf9345cSTaylor Simpson 2937cf9345cSTaylor Simpson/* Range: +/- (1.0 .. 1+(63/64)) * 2**(-6 .. +9) */ 2947cf9345cSTaylor Simpson/* More immediate bits should probably be used for more precision? */ 2957cf9345cSTaylor Simpson 2967cf9345cSTaylor SimpsonQ6INSN(F2_dfimm_p,"Rdd32=dfmake(#u10):pos",ATTRIBS(), 2977cf9345cSTaylor Simpson"Make Floating Point Value", 2987cf9345cSTaylor Simpson{ 2997cf9345cSTaylor Simpson RddV = (1023ULL - 6) << 52; 3007cf9345cSTaylor Simpson RddV += (fHIDE((size8u_t))uiV) << 46; 3017cf9345cSTaylor Simpson}) 3027cf9345cSTaylor Simpson 3037cf9345cSTaylor SimpsonQ6INSN(F2_dfimm_n,"Rdd32=dfmake(#u10):neg",ATTRIBS(), 3047cf9345cSTaylor Simpson"Make Floating Point Value", 3057cf9345cSTaylor Simpson{ 3067cf9345cSTaylor Simpson RddV = (1023ULL - 6) << 52; 3077cf9345cSTaylor Simpson RddV += (fHIDE((size8u_t))uiV) << 46; 3087cf9345cSTaylor Simpson RddV |= ((1ULL) << 63); 3097cf9345cSTaylor Simpson}) 3107cf9345cSTaylor Simpson 3117cf9345cSTaylor Simpson 3127cf9345cSTaylor Simpson/* CONVERSION */ 3137cf9345cSTaylor Simpson 3147cf9345cSTaylor Simpson#define CONVERT(TAG,DEST,DESTV,SRC,SRCV,OUTCAST,OUTTYPE,INCAST,INTYPE,MODETAG,MODESYN,MODEBEH) \ 3157cf9345cSTaylor Simpson Q6INSN(F2_conv_##TAG##MODETAG,#DEST"=convert_"#TAG"("#SRC")"#MODESYN,ATTRIBS(), \ 3167cf9345cSTaylor Simpson "Floating point format conversion", \ 3177cf9345cSTaylor Simpson { MODEBEH DESTV = OUTCAST(conv_##INTYPE##_to_##OUTTYPE(INCAST(SRCV))); }) 3187cf9345cSTaylor Simpson 3197cf9345cSTaylor SimpsonCONVERT(sf2df,Rdd32,RddV,Rs32,RsV,fUNDOUBLE,df,fFLOAT,sf,,,) 3207cf9345cSTaylor SimpsonCONVERT(df2sf,Rd32,RdV,Rss32,RssV,fUNFLOAT,sf,fDOUBLE,df,,,) 3217cf9345cSTaylor Simpson 3227cf9345cSTaylor Simpson#define ALLINTDST(TAGSTART,SRC,SRCV,INCAST,INTYPE,MODETAG,MODESYN,MODEBEH) \ 3237cf9345cSTaylor SimpsonCONVERT(TAGSTART##uw,Rd32,RdV,SRC,SRCV,fCAST4u,4u,INCAST,INTYPE,MODETAG,MODESYN,MODEBEH) \ 3247cf9345cSTaylor SimpsonCONVERT(TAGSTART##w,Rd32,RdV,SRC,SRCV,fCAST4s,4s,INCAST,INTYPE,MODETAG,MODESYN,MODEBEH) \ 3257cf9345cSTaylor SimpsonCONVERT(TAGSTART##ud,Rdd32,RddV,SRC,SRCV,fCAST8u,8u,INCAST,INTYPE,MODETAG,MODESYN,MODEBEH) \ 3267cf9345cSTaylor SimpsonCONVERT(TAGSTART##d,Rdd32,RddV,SRC,SRCV,fCAST8s,8s,INCAST,INTYPE,MODETAG,MODESYN,MODEBEH) 3277cf9345cSTaylor Simpson 3287cf9345cSTaylor Simpson#define ALLFPDST(TAGSTART,SRC,SRCV,INCAST,INTYPE,MODETAG,MODESYN,MODEBEH) \ 3297cf9345cSTaylor SimpsonCONVERT(TAGSTART##sf,Rd32,RdV,SRC,SRCV,fUNFLOAT,sf,INCAST,INTYPE,MODETAG,MODESYN,MODEBEH) \ 3307cf9345cSTaylor SimpsonCONVERT(TAGSTART##df,Rdd32,RddV,SRC,SRCV,fUNDOUBLE,df,INCAST,INTYPE,MODETAG,MODESYN,MODEBEH) 3317cf9345cSTaylor Simpson 3327cf9345cSTaylor Simpson#define ALLINTSRC(GEN,MODETAG,MODESYN,MODEBEH) \ 3337cf9345cSTaylor SimpsonGEN(uw##2,Rs32,RsV,fCAST4u,4u,MODETAG,MODESYN,MODEBEH) \ 3347cf9345cSTaylor SimpsonGEN(w##2,Rs32,RsV,fCAST4s,4s,MODETAG,MODESYN,MODEBEH) \ 3357cf9345cSTaylor SimpsonGEN(ud##2,Rss32,RssV,fCAST8u,8u,MODETAG,MODESYN,MODEBEH) \ 3367cf9345cSTaylor SimpsonGEN(d##2,Rss32,RssV,fCAST8s,8s,MODETAG,MODESYN,MODEBEH) 3377cf9345cSTaylor Simpson 3387cf9345cSTaylor Simpson#define ALLFPSRC(GEN,MODETAG,MODESYN,MODEBEH) \ 3397cf9345cSTaylor SimpsonGEN(sf##2,Rs32,RsV,fFLOAT,sf,MODETAG,MODESYN,MODEBEH) \ 3407cf9345cSTaylor SimpsonGEN(df##2,Rss32,RssV,fDOUBLE,df,MODETAG,MODESYN,MODEBEH) 3417cf9345cSTaylor Simpson 3427cf9345cSTaylor SimpsonALLINTSRC(ALLFPDST,,,) 3437cf9345cSTaylor SimpsonALLFPSRC(ALLINTDST,,,) 3447cf9345cSTaylor SimpsonALLFPSRC(ALLINTDST,_chop,:chop,fFPSETROUND_CHOP();) 345