[BACK]Return to dbl_float.h CVS log [TXT][DIR] Up to [local] / sys / arch / hppa / spmath

Annotation of sys/arch/hppa/spmath/dbl_float.h, Revision 1.1.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