Annotation of sys/arch/hppa/spmath/dbl_float.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: dbl_float.h,v 1.11 2006/11/29 10:40:44 mickey Exp $ */
! 2: /*
! 3: (c) Copyright 1986 HEWLETT-PACKARD COMPANY
! 4: To anyone who acknowledges that this file is provided "AS IS"
! 5: without any express or implied warranty:
! 6: permission to use, copy, modify, and distribute this file
! 7: for any purpose is hereby granted without fee, provided that
! 8: the above copyright notice and this notice appears in all
! 9: copies, and that the name of Hewlett-Packard Company not be
! 10: used in advertising or publicity pertaining to distribution
! 11: of the software without specific, written prior permission.
! 12: Hewlett-Packard Company makes no representations about the
! 13: suitability of this software for any purpose.
! 14: */
! 15: /* @(#)dbl_float.h: Revision: 2.9.88.1 Date: 93/12/07 15:05:32 */
! 16:
! 17: /**************************************
! 18: * Declare double precision functions *
! 19: **************************************/
! 20:
! 21: /* 32-bit word grabing functions */
! 22: #define Dbl_firstword(value) Dallp1(value)
! 23: #define Dbl_secondword(value) Dallp2(value)
! 24: #define Dbl_thirdword(value) dummy_location
! 25: #define Dbl_fourthword(value) dummy_location
! 26:
! 27: #define Dbl_sign(object) Dsign(object)
! 28: #define Dbl_exponent(object) Dexponent(object)
! 29: #define Dbl_signexponent(object) Dsignexponent(object)
! 30: #define Dbl_mantissap1(object) Dmantissap1(object)
! 31: #define Dbl_mantissap2(object) Dmantissap2(object)
! 32: #define Dbl_exponentmantissap1(object) Dexponentmantissap1(object)
! 33: #define Dbl_allp1(object) Dallp1(object)
! 34: #define Dbl_allp2(object) Dallp2(object)
! 35:
! 36: /* dbl_and_signs ands the sign bits of each argument and puts the result
! 37: * into the first argument. dbl_or_signs ors those same sign bits */
! 38: #define Dbl_and_signs( src1dst, src2) \
! 39: Dallp1(src1dst) = (Dallp1(src2)|~(1<<31)) & Dallp1(src1dst)
! 40: #define Dbl_or_signs( src1dst, src2) \
! 41: Dallp1(src1dst) = (Dallp1(src2)&(1<<31)) | Dallp1(src1dst)
! 42:
! 43: /* The hidden bit is always the low bit of the exponent */
! 44: #define Dbl_clear_exponent_set_hidden(srcdst) Deposit_dexponent(srcdst,1)
! 45: #define Dbl_clear_signexponent_set_hidden(srcdst) \
! 46: Deposit_dsignexponent(srcdst,1)
! 47: #define Dbl_clear_sign(srcdst) Dallp1(srcdst) &= ~(1<<31)
! 48: #define Dbl_clear_signexponent(srcdst) \
! 49: Dallp1(srcdst) &= Dmantissap1((unsigned)-1)
! 50:
! 51: /* Exponent field for doubles has already been cleared and may be
! 52: * included in the shift. Here we need to generate two double width
! 53: * variable shifts. The insignificant bits can be ignored.
! 54: * MTSAR f(varamount)
! 55: * VSHD srcdst.high,srcdst.low => srcdst.low
! 56: * VSHD 0,srcdst.high => srcdst.high
! 57: * This is very difficult to model with C expressions since the shift amount
! 58: * could exceed 32. */
! 59: /* varamount must be less than 64 */
! 60: #define Dbl_rightshift(srcdstA, srcdstB, varamount) \
! 61: {if((varamount) >= 32) { \
! 62: Dallp2(srcdstB) = Dallp1(srcdstA) >> (varamount-32); \
! 63: Dallp1(srcdstA)=0; \
! 64: } \
! 65: else if(varamount > 0) { \
! 66: Variable_shift_double(Dallp1(srcdstA), Dallp2(srcdstB), \
! 67: (varamount), Dallp2(srcdstB)); \
! 68: Dallp1(srcdstA) >>= varamount; \
! 69: } }
! 70: /* varamount must be less than 64 */
! 71: #define Dbl_rightshift_exponentmantissa(srcdstA, srcdstB, varamount) \
! 72: {if((varamount) >= 32) { \
! 73: Dallp2(srcdstB) = Dexponentmantissap1(srcdstA) >> ((varamount)-32); \
! 74: Dallp1(srcdstA) &= (1<<31); /* clear exponentmantissa field */ \
! 75: } \
! 76: else if(varamount > 0) { \
! 77: Variable_shift_double(Dexponentmantissap1(srcdstA), Dallp2(srcdstB), \
! 78: (varamount), Dallp2(srcdstB)); \
! 79: Deposit_dexponentmantissap1(srcdstA, \
! 80: (Dexponentmantissap1(srcdstA)>>(varamount))); \
! 81: } }
! 82: /* varamount must be less than 64 */
! 83: #define Dbl_leftshift(srcdstA, srcdstB, varamount) \
! 84: {if((varamount) >= 32) { \
! 85: Dallp1(srcdstA) = Dallp2(srcdstB) << (varamount-32); \
! 86: Dallp2(srcdstB)=0; \
! 87: } \
! 88: else { \
! 89: if ((varamount) > 0) { \
! 90: Dallp1(srcdstA) = (Dallp1(srcdstA) << (varamount)) | \
! 91: (Dallp2(srcdstB) >> (32-(varamount))); \
! 92: Dallp2(srcdstB) <<= varamount; \
! 93: } \
! 94: } }
! 95: #define Dbl_leftshiftby1_withextent(lefta,leftb,right,resulta,resultb) \
! 96: Shiftdouble(Dallp1(lefta), Dallp2(leftb), 31, Dallp1(resulta)); \
! 97: Shiftdouble(Dallp2(leftb), Extall(right), 31, Dallp2(resultb))
! 98:
! 99: #define Dbl_rightshiftby1_withextent(leftb,right,dst) \
! 100: Extall(dst) = (Dallp2(leftb) << 31) | ((unsigned)Extall(right) >> 1) | \
! 101: Extlow(right)
! 102:
! 103: #define Dbl_arithrightshiftby1(srcdstA,srcdstB) \
! 104: Shiftdouble(Dallp1(srcdstA),Dallp2(srcdstB),1,Dallp2(srcdstB));\
! 105: Dallp1(srcdstA) = (int)Dallp1(srcdstA) >> 1
! 106:
! 107: /* Sign extend the sign bit with an integer destination */
! 108: #define Dbl_signextendedsign(value) Dsignedsign(value)
! 109:
! 110: #define Dbl_isone_hidden(dbl_value) (Is_dhidden(dbl_value)!=0)
! 111: /* Singles and doubles may include the sign and exponent fields. The
! 112: * hidden bit and the hidden overflow must be included. */
! 113: #define Dbl_increment(dbl_valueA,dbl_valueB) \
! 114: if( (Dallp2(dbl_valueB) += 1) == 0 ) Dallp1(dbl_valueA) += 1
! 115: #define Dbl_increment_mantissa(dbl_valueA,dbl_valueB) \
! 116: if( (Dmantissap2(dbl_valueB) += 1) == 0 ) \
! 117: Deposit_dmantissap1(dbl_valueA,dbl_valueA+1)
! 118: #define Dbl_decrement(dbl_valueA,dbl_valueB) \
! 119: if( Dallp2(dbl_valueB) == 0 ) Dallp1(dbl_valueA) -= 1; \
! 120: Dallp2(dbl_valueB) -= 1
! 121:
! 122: #define Dbl_isone_sign(dbl_value) (Is_dsign(dbl_value)!=0)
! 123: #define Dbl_isone_hiddenoverflow(dbl_value) (Is_dhiddenoverflow(dbl_value)!=0)
! 124: #define Dbl_isone_lowmantissap1(dbl_valueA) (Is_dlowp1(dbl_valueA)!=0)
! 125: #define Dbl_isone_lowmantissap2(dbl_valueB) (Is_dlowp2(dbl_valueB)!=0)
! 126: #define Dbl_isone_signaling(dbl_value) (Is_dsignaling(dbl_value)!=0)
! 127: #define Dbl_is_signalingnan(dbl_value) (Dsignalingnan(dbl_value)==0xfff)
! 128: #define Dbl_isnotzero(dbl_valueA,dbl_valueB) \
! 129: (Dallp1(dbl_valueA) || Dallp2(dbl_valueB))
! 130: #define Dbl_isnotzero_hiddenhigh7mantissa(dbl_value) \
! 131: (Dhiddenhigh7mantissa(dbl_value)!=0)
! 132: #define Dbl_isnotzero_exponent(dbl_value) (Dexponent(dbl_value)!=0)
! 133: #define Dbl_isnotzero_mantissa(dbl_valueA,dbl_valueB) \
! 134: (Dmantissap1(dbl_valueA) || Dmantissap2(dbl_valueB))
! 135: #define Dbl_isnotzero_mantissap1(dbl_valueA) (Dmantissap1(dbl_valueA)!=0)
! 136: #define Dbl_isnotzero_mantissap2(dbl_valueB) (Dmantissap2(dbl_valueB)!=0)
! 137: #define Dbl_isnotzero_exponentmantissa(dbl_valueA,dbl_valueB) \
! 138: (Dexponentmantissap1(dbl_valueA) || Dmantissap2(dbl_valueB))
! 139: #define Dbl_isnotzero_low4p2(dbl_value) (Dlow4p2(dbl_value)!=0)
! 140: #define Dbl_iszero(dbl_valueA,dbl_valueB) (Dallp1(dbl_valueA)==0 && \
! 141: Dallp2(dbl_valueB)==0)
! 142: #define Dbl_iszero_allp1(dbl_value) (Dallp1(dbl_value)==0)
! 143: #define Dbl_iszero_allp2(dbl_value) (Dallp2(dbl_value)==0)
! 144: #define Dbl_iszero_hidden(dbl_value) (Is_dhidden(dbl_value)==0)
! 145: #define Dbl_iszero_hiddenoverflow(dbl_value) (Is_dhiddenoverflow(dbl_value)==0)
! 146: #define Dbl_iszero_hiddenhigh3mantissa(dbl_value) \
! 147: (Dhiddenhigh3mantissa(dbl_value)==0)
! 148: #define Dbl_iszero_hiddenhigh7mantissa(dbl_value) \
! 149: (Dhiddenhigh7mantissa(dbl_value)==0)
! 150: #define Dbl_iszero_sign(dbl_value) (Is_dsign(dbl_value)==0)
! 151: #define Dbl_iszero_exponent(dbl_value) (Dexponent(dbl_value)==0)
! 152: #define Dbl_iszero_mantissa(dbl_valueA,dbl_valueB) \
! 153: (Dmantissap1(dbl_valueA)==0 && Dmantissap2(dbl_valueB)==0)
! 154: #define Dbl_iszero_exponentmantissa(dbl_valueA,dbl_valueB) \
! 155: (Dexponentmantissap1(dbl_valueA)==0 && Dmantissap2(dbl_valueB)==0)
! 156: #define Dbl_isinfinity_exponent(dbl_value) \
! 157: (Dexponent(dbl_value)==DBL_INFINITY_EXPONENT)
! 158: #define Dbl_isnotinfinity_exponent(dbl_value) \
! 159: (Dexponent(dbl_value)!=DBL_INFINITY_EXPONENT)
! 160: #define Dbl_isinfinity(dbl_valueA,dbl_valueB) \
! 161: (Dexponent(dbl_valueA)==DBL_INFINITY_EXPONENT && \
! 162: Dmantissap1(dbl_valueA)==0 && Dmantissap2(dbl_valueB)==0)
! 163: #define Dbl_isnan(dbl_valueA,dbl_valueB) \
! 164: (Dexponent(dbl_valueA)==DBL_INFINITY_EXPONENT && \
! 165: (Dmantissap1(dbl_valueA)!=0 || Dmantissap2(dbl_valueB)!=0))
! 166: #define Dbl_isnotnan(dbl_valueA,dbl_valueB) \
! 167: (Dexponent(dbl_valueA)!=DBL_INFINITY_EXPONENT || \
! 168: (Dmantissap1(dbl_valueA)==0 && Dmantissap2(dbl_valueB)==0))
! 169:
! 170: #define Dbl_islessthan(dbl_op1a,dbl_op1b,dbl_op2a,dbl_op2b) \
! 171: (Dallp1(dbl_op1a) < Dallp1(dbl_op2a) || \
! 172: (Dallp1(dbl_op1a) == Dallp1(dbl_op2a) && \
! 173: Dallp2(dbl_op1b) < Dallp2(dbl_op2b)))
! 174: #define Dbl_isgreaterthan(dbl_op1a,dbl_op1b,dbl_op2a,dbl_op2b) \
! 175: (Dallp1(dbl_op1a) > Dallp1(dbl_op2a) || \
! 176: (Dallp1(dbl_op1a) == Dallp1(dbl_op2a) && \
! 177: Dallp2(dbl_op1b) > Dallp2(dbl_op2b)))
! 178: #define Dbl_isnotlessthan(dbl_op1a,dbl_op1b,dbl_op2a,dbl_op2b) \
! 179: (Dallp1(dbl_op1a) > Dallp1(dbl_op2a) || \
! 180: (Dallp1(dbl_op1a) == Dallp1(dbl_op2a) && \
! 181: Dallp2(dbl_op1b) >= Dallp2(dbl_op2b)))
! 182: #define Dbl_isnotgreaterthan(dbl_op1a,dbl_op1b,dbl_op2a,dbl_op2b) \
! 183: (Dallp1(dbl_op1a) < Dallp1(dbl_op2a) || \
! 184: (Dallp1(dbl_op1a) == Dallp1(dbl_op2a) && \
! 185: Dallp2(dbl_op1b) <= Dallp2(dbl_op2b)))
! 186: #define Dbl_isequal(dbl_op1a,dbl_op1b,dbl_op2a,dbl_op2b) \
! 187: ((Dallp1(dbl_op1a) == Dallp1(dbl_op2a)) && \
! 188: (Dallp2(dbl_op1b) == Dallp2(dbl_op2b)))
! 189:
! 190: #define Dbl_leftshiftby8(dbl_valueA,dbl_valueB) \
! 191: Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),24,Dallp1(dbl_valueA)); \
! 192: Dallp2(dbl_valueB) <<= 8
! 193: #define Dbl_leftshiftby7(dbl_valueA,dbl_valueB) \
! 194: Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),25,Dallp1(dbl_valueA)); \
! 195: Dallp2(dbl_valueB) <<= 7
! 196: #define Dbl_leftshiftby4(dbl_valueA,dbl_valueB) \
! 197: Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),28,Dallp1(dbl_valueA)); \
! 198: Dallp2(dbl_valueB) <<= 4
! 199: #define Dbl_leftshiftby3(dbl_valueA,dbl_valueB) \
! 200: Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),29,Dallp1(dbl_valueA)); \
! 201: Dallp2(dbl_valueB) <<= 3
! 202: #define Dbl_leftshiftby2(dbl_valueA,dbl_valueB) \
! 203: Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),30,Dallp1(dbl_valueA)); \
! 204: Dallp2(dbl_valueB) <<= 2
! 205: #define Dbl_leftshiftby1(dbl_valueA,dbl_valueB) \
! 206: Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),31,Dallp1(dbl_valueA)); \
! 207: Dallp2(dbl_valueB) <<= 1
! 208:
! 209: #define Dbl_rightshiftby8(dbl_valueA,dbl_valueB) \
! 210: Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),8,Dallp2(dbl_valueB)); \
! 211: Dallp1(dbl_valueA) >>= 8
! 212: #define Dbl_rightshiftby4(dbl_valueA,dbl_valueB) \
! 213: Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),4,Dallp2(dbl_valueB)); \
! 214: Dallp1(dbl_valueA) >>= 4
! 215: #define Dbl_rightshiftby2(dbl_valueA,dbl_valueB) \
! 216: Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),2,Dallp2(dbl_valueB)); \
! 217: Dallp1(dbl_valueA) >>= 2
! 218: #define Dbl_rightshiftby1(dbl_valueA,dbl_valueB) \
! 219: Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),1,Dallp2(dbl_valueB)); \
! 220: Dallp1(dbl_valueA) >>= 1
! 221:
! 222: /* This magnitude comparison uses the signless first words and
! 223: * the regular part2 words. The comparison is graphically:
! 224: *
! 225: * 1st greater? -------------
! 226: * |
! 227: * 1st less?-----------------+---------
! 228: * | |
! 229: * 2nd greater or equal----->| |
! 230: * False True
! 231: */
! 232: #define Dbl_ismagnitudeless(leftB,rightB,signlessleft,signlessright) \
! 233: ((signlessleft <= signlessright) && \
! 234: ( (signlessleft < signlessright) || (Dallp2(leftB)<Dallp2(rightB)) ))
! 235:
! 236: #define Dbl_copytoint_exponentmantissap1(src,dest) \
! 237: dest = Dexponentmantissap1(src)
! 238:
! 239: /* A quiet NaN has the high mantissa bit clear and at least on other (in this
! 240: * case the adjacent bit) bit set. */
! 241: #define Dbl_set_quiet(dbl_value) Deposit_dhigh2mantissa(dbl_value,1)
! 242: #define Dbl_set_exponent(dbl_value, exp) Deposit_dexponent(dbl_value,exp)
! 243:
! 244: #define Dbl_set_mantissa(desta,destb,valuea,valueb) \
! 245: Deposit_dmantissap1(desta,valuea); \
! 246: Dmantissap2(destb) = Dmantissap2(valueb)
! 247: #define Dbl_set_mantissap1(desta,valuea) \
! 248: Deposit_dmantissap1(desta,valuea)
! 249: #define Dbl_set_mantissap2(destb,valueb) \
! 250: Dmantissap2(destb) = Dmantissap2(valueb)
! 251:
! 252: #define Dbl_set_exponentmantissa(desta,destb,valuea,valueb) \
! 253: Deposit_dexponentmantissap1(desta,valuea); \
! 254: Dmantissap2(destb) = Dmantissap2(valueb)
! 255: #define Dbl_set_exponentmantissap1(dest,value) \
! 256: Deposit_dexponentmantissap1(dest,value)
! 257:
! 258: #define Dbl_copyfromptr(src,desta,destb) \
! 259: Dallp1(desta) = src->wd0; \
! 260: Dallp2(destb) = src->wd1
! 261: #define Dbl_copytoptr(srca,srcb,dest) \
! 262: dest->wd0 = Dallp1(srca); \
! 263: dest->wd1 = Dallp2(srcb)
! 264:
! 265: /* An infinity is represented with the max exponent and a zero mantissa */
! 266: #define Dbl_setinfinity_exponent(dbl_value) \
! 267: Deposit_dexponent(dbl_value,DBL_INFINITY_EXPONENT)
! 268: #define Dbl_setinfinity_exponentmantissa(dbl_valueA,dbl_valueB) \
! 269: Deposit_dexponentmantissap1(dbl_valueA, \
! 270: (DBL_INFINITY_EXPONENT << (32-(1+DBL_EXP_LENGTH)))); \
! 271: Dmantissap2(dbl_valueB) = 0
! 272: #define Dbl_setinfinitypositive(dbl_valueA,dbl_valueB) \
! 273: Dallp1(dbl_valueA) \
! 274: = (DBL_INFINITY_EXPONENT << (32-(1+DBL_EXP_LENGTH))); \
! 275: Dmantissap2(dbl_valueB) = 0
! 276: #define Dbl_setinfinitynegative(dbl_valueA,dbl_valueB) \
! 277: Dallp1(dbl_valueA) = (1<<31) | \
! 278: (DBL_INFINITY_EXPONENT << (32-(1+DBL_EXP_LENGTH))); \
! 279: Dmantissap2(dbl_valueB) = 0
! 280: #define Dbl_setinfinity(dbl_valueA,dbl_valueB,sign) \
! 281: Dallp1(dbl_valueA) = (sign << 31) | \
! 282: (DBL_INFINITY_EXPONENT << (32-(1+DBL_EXP_LENGTH))); \
! 283: Dmantissap2(dbl_valueB) = 0
! 284:
! 285: #define Dbl_sethigh4bits(dbl_value, extsign) Deposit_dhigh4p1(dbl_value,extsign)
! 286: #define Dbl_set_sign(dbl_value,sign) Deposit_dsign(dbl_value,sign)
! 287: #define Dbl_invert_sign(dbl_value) Deposit_dsign(dbl_value,~Dsign(dbl_value))
! 288: #define Dbl_setone_sign(dbl_value) Deposit_dsign(dbl_value,1)
! 289: #define Dbl_setone_lowmantissap2(dbl_value) Deposit_dlowp2(dbl_value,1)
! 290: #define Dbl_setzero_sign(dbl_value) Dallp1(dbl_value) &= 0x7fffffff
! 291: #define Dbl_setzero_exponent(dbl_value) \
! 292: Dallp1(dbl_value) &= 0x800fffff
! 293: #define Dbl_setzero_mantissa(dbl_valueA,dbl_valueB) \
! 294: Dallp1(dbl_valueA) &= 0xfff00000; \
! 295: Dallp2(dbl_valueB) = 0
! 296: #define Dbl_setzero_mantissap1(dbl_value) Dallp1(dbl_value) &= 0xfff00000
! 297: #define Dbl_setzero_mantissap2(dbl_value) Dallp2(dbl_value) = 0
! 298: #define Dbl_setzero_exponentmantissa(dbl_valueA,dbl_valueB) \
! 299: Dallp1(dbl_valueA) &= 0x80000000; \
! 300: Dallp2(dbl_valueB) = 0
! 301: #define Dbl_setzero_exponentmantissap1(dbl_valueA) \
! 302: Dallp1(dbl_valueA) &= 0x80000000
! 303: #define Dbl_setzero(dbl_valueA,dbl_valueB) \
! 304: Dallp1(dbl_valueA) = 0; Dallp2(dbl_valueB) = 0
! 305: #define Dbl_setzerop1(dbl_value) Dallp1(dbl_value) = 0
! 306: #define Dbl_setzerop2(dbl_value) Dallp2(dbl_value) = 0
! 307: #define Dbl_setnegativezero(dbl_value) \
! 308: Dallp1(dbl_value) = 1 << 31; Dallp2(dbl_value) = 0
! 309: #define Dbl_setnegativezerop1(dbl_value) Dallp1(dbl_value) = 1 << 31
! 310:
! 311: /* Use the following macro for both overflow & underflow conditions */
! 312: #define ovfl -
! 313: #define unfl +
! 314: #define Dbl_setwrapped_exponent(dbl_value,exponent,op) \
! 315: Deposit_dexponent(dbl_value,(exponent op DBL_WRAP))
! 316:
! 317: #define Dbl_setlargestpositive(dbl_valueA,dbl_valueB) \
! 318: Dallp1(dbl_valueA) = ((DBL_EMAX+DBL_BIAS) << (32-(1+DBL_EXP_LENGTH))) \
! 319: | ((1<<(32-(1+DBL_EXP_LENGTH))) - 1 ); \
! 320: Dallp2(dbl_valueB) = 0xFFFFFFFF
! 321: #define Dbl_setlargestnegative(dbl_valueA,dbl_valueB) \
! 322: Dallp1(dbl_valueA) = ((DBL_EMAX+DBL_BIAS) << (32-(1+DBL_EXP_LENGTH))) \
! 323: | ((1<<(32-(1+DBL_EXP_LENGTH))) - 1 ) | (1<<31); \
! 324: Dallp2(dbl_valueB) = 0xFFFFFFFF
! 325: #define Dbl_setlargest_exponentmantissa(dbl_valueA,dbl_valueB) \
! 326: Deposit_dexponentmantissap1(dbl_valueA, \
! 327: (((DBL_EMAX+DBL_BIAS) << (32-(1+DBL_EXP_LENGTH))) \
! 328: | ((1<<(32-(1+DBL_EXP_LENGTH))) - 1 ))); \
! 329: Dallp2(dbl_valueB) = 0xFFFFFFFF
! 330:
! 331: #define Dbl_setnegativeinfinity(dbl_valueA,dbl_valueB) \
! 332: Dallp1(dbl_valueA) = ((1<<DBL_EXP_LENGTH) | DBL_INFINITY_EXPONENT) \
! 333: << (32-(1+DBL_EXP_LENGTH)) ; \
! 334: Dallp2(dbl_valueB) = 0
! 335: #define Dbl_setlargest(dbl_valueA,dbl_valueB,sign) \
! 336: Dallp1(dbl_valueA) = (sign << 31) | \
! 337: ((DBL_EMAX+DBL_BIAS) << (32-(1+DBL_EXP_LENGTH))) | \
! 338: ((1 << (32-(1+DBL_EXP_LENGTH))) - 1 ); \
! 339: Dallp2(dbl_valueB) = 0xFFFFFFFF
! 340:
! 341:
! 342: /* The high bit is always zero so arithmetic or logical shifts will work. */
! 343: #define Dbl_right_align(srcdstA,srcdstB,shift,extent) \
! 344: if( shift >= 32 ) \
! 345: { \
! 346: /* Big shift requires examining the portion shift off \
! 347: the end to properly set inexact. */ \
! 348: if(shift < 64) \
! 349: { \
! 350: if(shift > 32) \
! 351: { \
! 352: Variable_shift_double(Dallp1(srcdstA),Dallp2(srcdstB), \
! 353: shift-32, Extall(extent)); \
! 354: if(Dallp2(srcdstB) << (64 - (shift))) Ext_setone_low(extent); \
! 355: } \
! 356: else Extall(extent) = Dallp2(srcdstB); \
! 357: Dallp2(srcdstB) = Dallp1(srcdstA) >> (shift - 32); \
! 358: } \
! 359: else \
! 360: { \
! 361: Extall(extent) = Dallp1(srcdstA); \
! 362: if(Dallp2(srcdstB)) Ext_setone_low(extent); \
! 363: Dallp2(srcdstB) = 0; \
! 364: } \
! 365: Dallp1(srcdstA) = 0; \
! 366: } \
! 367: else \
! 368: { \
! 369: /* Small alignment is simpler. Extension is easily set. */ \
! 370: if (shift > 0) \
! 371: { \
! 372: Extall(extent) = Dallp2(srcdstB) << (32 - (shift)); \
! 373: Variable_shift_double(Dallp1(srcdstA),Dallp2(srcdstB),shift, \
! 374: Dallp2(srcdstB)); \
! 375: Dallp1(srcdstA) >>= shift; \
! 376: } \
! 377: else Extall(extent) = 0; \
! 378: }
! 379:
! 380: /*
! 381: * Here we need to shift the result right to correct for an overshift
! 382: * (due to the exponent becoming negative) during normalization.
! 383: */
! 384: #define Dbl_fix_overshift(srcdstA,srcdstB,shift,extent) \
! 385: Extall(extent) = Dallp2(srcdstB) << (32 - (shift)); \
! 386: Dallp2(srcdstB) = (Dallp1(srcdstA) << (32 - (shift))) | \
! 387: (Dallp2(srcdstB) >> (shift)); \
! 388: Dallp1(srcdstA) = Dallp1(srcdstA) >> shift
! 389:
! 390: #define Dbl_hiddenhigh3mantissa(dbl_value) Dhiddenhigh3mantissa(dbl_value)
! 391: #define Dbl_hidden(dbl_value) Dhidden(dbl_value)
! 392: #define Dbl_lowmantissap2(dbl_value) Dlowp2(dbl_value)
! 393:
! 394: /* The left argument is never smaller than the right argument */
! 395: #define Dbl_subtract(lefta,leftb,righta,rightb,resulta,resultb) \
! 396: if( Dallp2(rightb) > Dallp2(leftb) ) Dallp1(lefta)--; \
! 397: Dallp2(resultb) = Dallp2(leftb) - Dallp2(rightb); \
! 398: Dallp1(resulta) = Dallp1(lefta) - Dallp1(righta)
! 399:
! 400: /* Subtract right augmented with extension from left augmented with zeros and
! 401: * store into result and extension. */
! 402: #define Dbl_subtract_withextension(lefta,leftb,righta,rightb,extent,resulta,resultb) \
! 403: Dbl_subtract(lefta,leftb,righta,rightb,resulta,resultb); \
! 404: if( (Extall(extent) = 0-Extall(extent)) ) \
! 405: { \
! 406: if((Dallp2(resultb)--) == 0) Dallp1(resulta)--; \
! 407: }
! 408:
! 409: #define Dbl_addition(lefta,leftb,righta,rightb,resulta,resultb) \
! 410: /* If the sum of the low words is less than either source, then \
! 411: * an overflow into the next word occurred. */ \
! 412: Dallp1(resulta) = Dallp1(lefta) + Dallp1(righta); \
! 413: if((Dallp2(resultb) = Dallp2(leftb) + Dallp2(rightb)) < Dallp2(rightb)) \
! 414: Dallp1(resulta)++
! 415:
! 416: #define Dbl_xortointp1(left,right,result) \
! 417: result = Dallp1(left) XOR Dallp1(right)
! 418:
! 419: #define Dbl_xorfromintp1(left,right,result) \
! 420: Dallp1(result) = left XOR Dallp1(right)
! 421:
! 422: #define Dbl_swap_lower(left,right) \
! 423: Dallp2(left) = Dallp2(left) XOR Dallp2(right); \
! 424: Dallp2(right) = Dallp2(left) XOR Dallp2(right); \
! 425: Dallp2(left) = Dallp2(left) XOR Dallp2(right)
! 426:
! 427: /* Need to Initialize */
! 428: #define Dbl_makequietnan(desta,destb) \
! 429: Dallp1(desta) = ((DBL_EMAX+DBL_BIAS)+1)<< (32-(1+DBL_EXP_LENGTH)) \
! 430: | (1<<(32-(1+DBL_EXP_LENGTH+2))); \
! 431: Dallp2(destb) = 0
! 432: #define Dbl_makesignalingnan(desta,destb) \
! 433: Dallp1(desta) = ((DBL_EMAX+DBL_BIAS)+1)<< (32-(1+DBL_EXP_LENGTH)) \
! 434: | (1<<(32-(1+DBL_EXP_LENGTH+1))); \
! 435: Dallp2(destb) = 0
! 436:
! 437: #define Dbl_normalize(dbl_opndA,dbl_opndB,exponent) \
! 438: while(Dbl_iszero_hiddenhigh7mantissa(dbl_opndA)) { \
! 439: Dbl_leftshiftby8(dbl_opndA,dbl_opndB); \
! 440: exponent -= 8; \
! 441: } \
! 442: if(Dbl_iszero_hiddenhigh3mantissa(dbl_opndA)) { \
! 443: Dbl_leftshiftby4(dbl_opndA,dbl_opndB); \
! 444: exponent -= 4; \
! 445: } \
! 446: while(Dbl_iszero_hidden(dbl_opndA)) { \
! 447: Dbl_leftshiftby1(dbl_opndA,dbl_opndB); \
! 448: exponent -= 1; \
! 449: }
! 450:
! 451: #define Twoword_add(src1dstA,src1dstB,src2A,src2B) \
! 452: /* \
! 453: * want this macro to generate: \
! 454: * ADD src1dstB,src2B,src1dstB; \
! 455: * ADDC src1dstA,src2A,src1dstA; \
! 456: */ \
! 457: if ((src1dstB) + (src2B) < (src1dstB)) Dallp1(src1dstA)++; \
! 458: Dallp1(src1dstA) += (src2A); \
! 459: Dallp2(src1dstB) += (src2B)
! 460:
! 461: #define Twoword_subtract(src1dstA,src1dstB,src2A,src2B) \
! 462: /* \
! 463: * want this macro to generate: \
! 464: * SUB src1dstB,src2B,src1dstB; \
! 465: * SUBB src1dstA,src2A,src1dstA; \
! 466: */ \
! 467: if ((src1dstB) < (src2B)) Dallp1(src1dstA)--; \
! 468: Dallp1(src1dstA) -= (src2A); \
! 469: Dallp2(src1dstB) -= (src2B)
! 470:
! 471: #define Dbl_setoverflow(resultA,resultB) \
! 472: /* set result to infinity or largest number */ \
! 473: switch (Rounding_mode()) { \
! 474: case ROUNDPLUS: \
! 475: if (Dbl_isone_sign(resultA)) { \
! 476: Dbl_setlargestnegative(resultA,resultB); \
! 477: } \
! 478: else { \
! 479: Dbl_setinfinitypositive(resultA,resultB); \
! 480: } \
! 481: break; \
! 482: case ROUNDMINUS: \
! 483: if (Dbl_iszero_sign(resultA)) { \
! 484: Dbl_setlargestpositive(resultA,resultB); \
! 485: } \
! 486: else { \
! 487: Dbl_setinfinitynegative(resultA,resultB); \
! 488: } \
! 489: break; \
! 490: case ROUNDNEAREST: \
! 491: Dbl_setinfinity_exponentmantissa(resultA,resultB); \
! 492: break; \
! 493: case ROUNDZERO: \
! 494: Dbl_setlargest_exponentmantissa(resultA,resultB); \
! 495: }
! 496:
! 497: #define Dbl_denormalize(opndp1,opndp2,exponent,guard,sticky,inexact) \
! 498: Dbl_clear_signexponent_set_hidden(opndp1); \
! 499: if (exponent >= (1-DBL_P)) { \
! 500: if (exponent >= -31) { \
! 501: guard = (Dallp2(opndp2) >> (-(exponent))) & 1; \
! 502: if (exponent < 0) sticky |= Dallp2(opndp2) << (32+exponent); \
! 503: if (exponent > -31) { \
! 504: Variable_shift_double(opndp1,opndp2,1-exponent,opndp2); \
! 505: Dallp1(opndp1) >>= 1-exponent; \
! 506: } \
! 507: else { \
! 508: Dallp2(opndp2) = Dallp1(opndp1); \
! 509: Dbl_setzerop1(opndp1); \
! 510: } \
! 511: } \
! 512: else { \
! 513: guard = (Dallp1(opndp1) >> (-32-(exponent))) & 1; \
! 514: if (exponent == -32) sticky |= Dallp2(opndp2); \
! 515: else sticky |= (Dallp2(opndp2) | Dallp1(opndp1) << (64+(exponent))); \
! 516: Dallp2(opndp2) = Dallp1(opndp1) >> (-31-(exponent)); \
! 517: Dbl_setzerop1(opndp1); \
! 518: } \
! 519: inexact = guard | sticky; \
! 520: } \
! 521: else { \
! 522: guard = 0; \
! 523: sticky |= (Dallp1(opndp1) | Dallp2(opndp2)); \
! 524: Dbl_setzero(opndp1,opndp2); \
! 525: inexact = sticky; \
! 526: }
! 527:
! 528:
! 529: int dbl_fadd(dbl_floating_point *, dbl_floating_point *, dbl_floating_point *, unsigned int *);
! 530: int dbl_fcmp(dbl_floating_point *, dbl_floating_point *, unsigned int, unsigned int *);
! 531: int dbl_fdiv(dbl_floating_point *, dbl_floating_point *, dbl_floating_point *, unsigned int *);
! 532: int dbl_fmpy(dbl_floating_point *, dbl_floating_point *, dbl_floating_point *, unsigned int *);
! 533: int dbl_frem(dbl_floating_point *, dbl_floating_point *, dbl_floating_point *, unsigned int *);
! 534: int dbl_fsqrt(dbl_floating_point *, dbl_floating_point *, dbl_floating_point *, unsigned int *);
! 535: int dbl_fsub(dbl_floating_point *, dbl_floating_point *, dbl_floating_point *, unsigned int *);
! 536:
! 537: int sgl_to_dbl_fcnvff(sgl_floating_point *, sgl_floating_point *, dbl_floating_point *, unsigned int *);
! 538: int dbl_to_sgl_fcnvff(dbl_floating_point *, dbl_floating_point *, sgl_floating_point *, unsigned int *);
! 539:
! 540: int dbl_frnd(dbl_floating_point *, dbl_floating_point *, dbl_floating_point *, unsigned int *);
CVSweb