xref: /qemu/target/hexagon/imported/float.idef (revision dd8705bd)
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