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

Annotation of sys/arch/hppa/spmath/sgl_float.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: sgl_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: /* @(#)sgl_float.h: Revision: 2.8.88.1 Date: 93/12/07 15:07:17 */
                     16:
                     17: #include <sys/cdefs.h>
                     18:
                     19: /******************************
                     20:  * Single precision functions *
                     21:  ******************************/
                     22:
                     23: /* 32-bit word grabing functions */
                     24: #define Sgl_firstword(value) Sall(value)
                     25: #define Sgl_secondword(value) dummy_location
                     26: #define Sgl_thirdword(value) dummy_location
                     27: #define Sgl_fourthword(value) dummy_location
                     28:
                     29: #define Sgl_sign(object) Ssign(object)
                     30: #define Sgl_exponent(object) Sexponent(object)
                     31: #define Sgl_signexponent(object) Ssignexponent(object)
                     32: #define Sgl_mantissa(object) Smantissa(object)
                     33: #define Sgl_exponentmantissa(object) Sexponentmantissa(object)
                     34: #define Sgl_all(object) Sall(object)
                     35:
                     36: /* sgl_and_signs ands the sign bits of each argument and puts the result
                     37:  * into the first argument. sgl_or_signs ors those same sign bits */
                     38: #define Sgl_and_signs( src1dst, src2)          \
                     39:     Sall(src1dst) = (Sall(src2)|~(1<<31)) & Sall(src1dst)
                     40: #define Sgl_or_signs( src1dst, src2)           \
                     41:     Sall(src1dst) = (Sall(src2)&(1<<31)) | Sall(src1dst)
                     42:
                     43: /* The hidden bit is always the low bit of the exponent */
                     44: #define Sgl_clear_exponent_set_hidden(srcdst) Deposit_sexponent(srcdst,1)
                     45: #define Sgl_clear_signexponent_set_hidden(srcdst) \
                     46:     Deposit_ssignexponent(srcdst,1)
                     47: #define Sgl_clear_sign(srcdst) Sall(srcdst) &= ~(1<<31)
                     48: #define Sgl_clear_signexponent(srcdst) Sall(srcdst) &= 0x007fffff
                     49:
                     50: /* varamount must be less than 32 for the next three functions */
                     51: #define Sgl_rightshift(srcdst, varamount)      \
                     52:     Sall(srcdst) >>= varamount
                     53: #define Sgl_leftshift(srcdst, varamount)       \
                     54:     Sall(srcdst) <<= varamount
                     55: #define Sgl_rightshift_exponentmantissa(srcdst, varamount) \
                     56:     Sall(srcdst) = \
                     57:        (Sexponentmantissa(srcdst) >> (varamount)) | (Sall(srcdst) & (1<<31))
                     58:
                     59: #define Sgl_leftshiftby1_withextent(left,right,result) \
                     60:     Shiftdouble(Sall(left),Extall(right),31,Sall(result))
                     61:
                     62: #define Sgl_rightshiftby1_withextent(left,right,dst)           \
                     63:     Shiftdouble(Sall(left),Extall(right),1,Extall(right))
                     64: #define Sgl_arithrightshiftby1(srcdst) \
                     65:     Sall(srcdst) = (int)Sall(srcdst) >> 1
                     66:
                     67: /* Sign extend the sign bit with an integer destination */
                     68: #define Sgl_signextendedsign(value) Ssignedsign(value)
                     69:
                     70: #define Sgl_isone_hidden(sgl_value) (Shidden(sgl_value))
                     71: #define Sgl_increment(sgl_value) Sall(sgl_value) += 1
                     72: #define Sgl_increment_mantissa(sgl_value) \
                     73:     Deposit_smantissa(sgl_value,sgl_value+1)
                     74: #define Sgl_decrement(sgl_value) Sall(sgl_value) -= 1
                     75:
                     76: #define Sgl_isone_sign(sgl_value) (Is_ssign(sgl_value)!=0)
                     77: #define Sgl_isone_hiddenoverflow(sgl_value) \
                     78:     (Is_shiddenoverflow(sgl_value)!=0)
                     79: #define Sgl_isone_lowmantissa(sgl_value) (Is_slow(sgl_value)!=0)
                     80: #define Sgl_isone_signaling(sgl_value) (Is_ssignaling(sgl_value)!=0)
                     81: #define Sgl_is_signalingnan(sgl_value) (Ssignalingnan(sgl_value)==0x1ff)
                     82: #define Sgl_isnotzero(sgl_value) (Sall(sgl_value)!=0)
                     83: #define Sgl_isnotzero_hiddenhigh7mantissa(sgl_value) \
                     84:     (Shiddenhigh7mantissa(sgl_value)!=0)
                     85: #define Sgl_isnotzero_low4(sgl_value) (Slow4(sgl_value)!=0)
                     86: #define Sgl_isnotzero_exponent(sgl_value) (Sexponent(sgl_value)!=0)
                     87: #define Sgl_isnotzero_mantissa(sgl_value) (Smantissa(sgl_value)!=0)
                     88: #define Sgl_isnotzero_exponentmantissa(sgl_value) \
                     89:     (Sexponentmantissa(sgl_value)!=0)
                     90: #define Sgl_iszero(sgl_value) (Sall(sgl_value)==0)
                     91: #define Sgl_iszero_signaling(sgl_value) (Is_ssignaling(sgl_value)==0)
                     92: #define Sgl_iszero_hidden(sgl_value) (Is_shidden(sgl_value)==0)
                     93: #define Sgl_iszero_hiddenoverflow(sgl_value) \
                     94:     (Is_shiddenoverflow(sgl_value)==0)
                     95: #define Sgl_iszero_hiddenhigh3mantissa(sgl_value) \
                     96:     (Shiddenhigh3mantissa(sgl_value)==0)
                     97: #define Sgl_iszero_hiddenhigh7mantissa(sgl_value) \
                     98:     (Shiddenhigh7mantissa(sgl_value)==0)
                     99: #define Sgl_iszero_sign(sgl_value) (Is_ssign(sgl_value)==0)
                    100: #define Sgl_iszero_exponent(sgl_value) (Sexponent(sgl_value)==0)
                    101: #define Sgl_iszero_mantissa(sgl_value) (Smantissa(sgl_value)==0)
                    102: #define Sgl_iszero_exponentmantissa(sgl_value) \
                    103:     (Sexponentmantissa(sgl_value)==0)
                    104: #define Sgl_isinfinity_exponent(sgl_value)             \
                    105:     (Sgl_exponent(sgl_value)==SGL_INFINITY_EXPONENT)
                    106: #define Sgl_isnotinfinity_exponent(sgl_value)          \
                    107:     (Sgl_exponent(sgl_value)!=SGL_INFINITY_EXPONENT)
                    108: #define Sgl_isinfinity(sgl_value)                      \
                    109:     (Sgl_exponent(sgl_value)==SGL_INFINITY_EXPONENT && \
                    110:     Sgl_mantissa(sgl_value)==0)
                    111: #define Sgl_isnan(sgl_value)                           \
                    112:     (Sgl_exponent(sgl_value)==SGL_INFINITY_EXPONENT && \
                    113:     Sgl_mantissa(sgl_value)!=0)
                    114: #define Sgl_isnotnan(sgl_value)                                \
                    115:     (Sgl_exponent(sgl_value)!=SGL_INFINITY_EXPONENT || \
                    116:     Sgl_mantissa(sgl_value)==0)
                    117: #define Sgl_islessthan(sgl_op1,sgl_op2)                        \
                    118:     (Sall(sgl_op1) < Sall(sgl_op2))
                    119: #define Sgl_isgreaterthan(sgl_op1,sgl_op2)             \
                    120:     (Sall(sgl_op1) > Sall(sgl_op2))
                    121: #define Sgl_isnotlessthan(sgl_op1,sgl_op2)             \
                    122:     (Sall(sgl_op1) >= Sall(sgl_op2))
                    123: #define Sgl_isequal(sgl_op1,sgl_op2)                   \
                    124:     (Sall(sgl_op1) == Sall(sgl_op2))
                    125:
                    126: #define Sgl_leftshiftby8(sgl_value) \
                    127:     Sall(sgl_value) <<= 8
                    128: #define Sgl_leftshiftby4(sgl_value) \
                    129:     Sall(sgl_value) <<= 4
                    130: #define Sgl_leftshiftby3(sgl_value) \
                    131:     Sall(sgl_value) <<= 3
                    132: #define Sgl_leftshiftby2(sgl_value) \
                    133:     Sall(sgl_value) <<= 2
                    134: #define Sgl_leftshiftby1(sgl_value) \
                    135:     Sall(sgl_value) <<= 1
                    136: #define Sgl_rightshiftby1(sgl_value) \
                    137:     Sall(sgl_value) >>= 1
                    138: #define Sgl_rightshiftby4(sgl_value) \
                    139:     Sall(sgl_value) >>= 4
                    140: #define Sgl_rightshiftby8(sgl_value) \
                    141:     Sall(sgl_value) >>= 8
                    142:
                    143: #define Sgl_ismagnitudeless(signlessleft,signlessright)                        \
                    144: /*  unsigned int signlessleft, signlessright; */                       \
                    145:       (signlessleft < signlessright)
                    146:
                    147:
                    148: #define Sgl_copytoint_exponentmantissa(source,dest)     \
                    149:     dest = Sexponentmantissa(source)
                    150:
                    151: /* A quiet NaN has the high mantissa bit clear and at least on other (in this
                    152:  * case the adjacent bit) bit set. */
                    153: #define Sgl_set_quiet(sgl_value) Deposit_shigh2mantissa(sgl_value,1)
                    154: #define Sgl_set_exponent(sgl_value,exp) Deposit_sexponent(sgl_value,exp)
                    155:
                    156: #define Sgl_set_mantissa(dest,value) Deposit_smantissa(dest,value)
                    157: #define Sgl_set_exponentmantissa(dest,value) \
                    158:     Deposit_sexponentmantissa(dest,value)
                    159:
                    160: /*  An infinity is represented with the max exponent and a zero mantissa */
                    161: #define Sgl_setinfinity_exponent(sgl_value) \
                    162:     Deposit_sexponent(sgl_value,SGL_INFINITY_EXPONENT)
                    163: #define Sgl_setinfinity_exponentmantissa(sgl_value)    \
                    164:     Deposit_sexponentmantissa(sgl_value, \
                    165:        (SGL_INFINITY_EXPONENT << (32-(1+SGL_EXP_LENGTH))))
                    166: #define Sgl_setinfinitypositive(sgl_value)             \
                    167:     Sall(sgl_value) = (SGL_INFINITY_EXPONENT << (32-(1+SGL_EXP_LENGTH)))
                    168: #define Sgl_setinfinitynegative(sgl_value)             \
                    169:     Sall(sgl_value) = (SGL_INFINITY_EXPONENT << (32-(1+SGL_EXP_LENGTH))) \
                    170:     | (1<<31)
                    171: #define Sgl_setinfinity(sgl_value,sign)                                        \
                    172:     Sall(sgl_value) = (SGL_INFINITY_EXPONENT << (32-(1+SGL_EXP_LENGTH))) | \
                    173:      (sign << 31)
                    174: #define Sgl_sethigh4bits(sgl_value, extsign)  \
                    175:     Deposit_shigh4(sgl_value,extsign)
                    176: #define Sgl_set_sign(sgl_value,sign) Deposit_ssign(sgl_value,sign)
                    177: #define Sgl_invert_sign(sgl_value)  \
                    178:     Deposit_ssign(sgl_value,~Ssign(sgl_value))
                    179: #define Sgl_setone_sign(sgl_value) Deposit_ssign(sgl_value,1)
                    180: #define Sgl_setone_lowmantissa(sgl_value) Deposit_slow(sgl_value,1)
                    181: #define Sgl_setzero_sign(sgl_value)  Sall(sgl_value) &= 0x7fffffff
                    182: #define Sgl_setzero_exponent(sgl_value) Sall(sgl_value) &= 0x807fffff
                    183: #define Sgl_setzero_mantissa(sgl_value) Sall(sgl_value) &= 0xff800000
                    184: #define Sgl_setzero_exponentmantissa(sgl_value)  Sall(sgl_value) &= 0x80000000
                    185: #define Sgl_setzero(sgl_value) Sall(sgl_value) = 0
                    186: #define Sgl_setnegativezero(sgl_value) Sall(sgl_value) = 1 << 31
                    187:
                    188: /* Use following macro for both overflow & underflow conditions */
                    189: #define ovfl -
                    190: #define unfl +
                    191: #define Sgl_setwrapped_exponent(sgl_value,exponent,op) \
                    192:     Deposit_sexponent(sgl_value,(exponent op SGL_WRAP))
                    193:
                    194: #define Sgl_setlargestpositive(sgl_value)                              \
                    195:     Sall(sgl_value) = ((SGL_EMAX+SGL_BIAS) << (32-(1+SGL_EXP_LENGTH))) \
                    196:                        | ((1<<(32-(1+SGL_EXP_LENGTH))) - 1)
                    197: #define Sgl_setlargestnegative(sgl_value)                              \
                    198:     Sall(sgl_value) = ((SGL_EMAX+SGL_BIAS) << (32-(1+SGL_EXP_LENGTH))) \
                    199:                        | ((1<<(32-(1+SGL_EXP_LENGTH))) - 1 ) | (1<<31)
                    200:
                    201: #define Sgl_setnegativeinfinity(sgl_value)     \
                    202:     Sall(sgl_value) =                          \
                    203:     ((1<<SGL_EXP_LENGTH) | SGL_INFINITY_EXPONENT) << (32-(1+SGL_EXP_LENGTH))
                    204: #define Sgl_setlargest(sgl_value,sign)                                 \
                    205:     Sall(sgl_value) = ((sign) << 31) |                                 \
                    206:        (((SGL_EMAX+SGL_BIAS) << (32-(1+SGL_EXP_LENGTH)))               \
                    207:          | ((1 << (32-(1+SGL_EXP_LENGTH))) - 1 ))
                    208: #define Sgl_setlargest_exponentmantissa(sgl_value)                     \
                    209:     Sall(sgl_value) = (Sall(sgl_value) & (1<<31)) |                    \
                    210:        (((SGL_EMAX+SGL_BIAS) << (32-(1+SGL_EXP_LENGTH)))               \
                    211:          | ((1 << (32-(1+SGL_EXP_LENGTH))) - 1 ))
                    212:
                    213: /* The high bit is always zero so arithmetic or logical shifts will work. */
                    214: #define Sgl_right_align(srcdst,shift,extent)                           \
                    215:     /* sgl_floating_point srcdst; int shift; extension extent */       \
                    216:     if (shift < 32) {                                                  \
                    217:        Extall(extent) = Sall(srcdst) << (32-(shift));                  \
                    218:        Sall(srcdst) >>= shift;                                         \
                    219:     }                                                                  \
                    220:     else {                                                             \
                    221:        Extall(extent) = Sall(srcdst);                                  \
                    222:        Sall(srcdst) = 0;                                               \
                    223:     }
                    224: #define Sgl_hiddenhigh3mantissa(sgl_value) Shiddenhigh3mantissa(sgl_value)
                    225: #define Sgl_hidden(sgl_value) Shidden(sgl_value)
                    226: #define Sgl_lowmantissa(sgl_value) Slow(sgl_value)
                    227:
                    228: /* The left argument is never smaller than the right argument */
                    229: #define Sgl_subtract(sgl_left,sgl_right,sgl_result) \
                    230:     Sall(sgl_result) = Sall(sgl_left) - Sall(sgl_right)
                    231:
                    232: /* Subtract right augmented with extension from left augmented with zeros and
                    233:  * store into result and extension. */
                    234: #define Sgl_subtract_withextension(left,right,extent,result)           \
                    235:     /* sgl_floating_point left,right,result; extension extent */       \
                    236:   Sgl_subtract(left,right,result);                                     \
                    237:   if((Extall(extent) = 0-Extall(extent)))                              \
                    238:       Sall(result) = Sall(result)-1
                    239:
                    240: #define Sgl_addition(sgl_left,sgl_right,sgl_result) \
                    241:     Sall(sgl_result) = Sall(sgl_left) + Sall(sgl_right)
                    242:
                    243: #define Sgl_xortointp1(left,right,result)                      \
                    244:     result = Sall(left) XOR Sall(right);
                    245:
                    246: #define Sgl_xorfromintp1(left,right,result)                    \
                    247:     Sall(result) = left XOR Sall(right)
                    248:
                    249: /* Need to Initialize */
                    250: #define Sgl_makequietnan(dest)                                         \
                    251:     Sall(dest) = ((SGL_EMAX+SGL_BIAS)+1)<< (32-(1+SGL_EXP_LENGTH))     \
                    252:                | (1<<(32-(1+SGL_EXP_LENGTH+2)))
                    253: #define Sgl_makesignalingnan(dest)                                     \
                    254:     Sall(dest) = ((SGL_EMAX+SGL_BIAS)+1)<< (32-(1+SGL_EXP_LENGTH))     \
                    255:                | (1<<(32-(1+SGL_EXP_LENGTH+1)))
                    256:
                    257: #define Sgl_normalize(sgl_opnd,exponent)                       \
                    258:        while(Sgl_iszero_hiddenhigh7mantissa(sgl_opnd)) {       \
                    259:                Sgl_leftshiftby8(sgl_opnd);                     \
                    260:                exponent -= 8;                                  \
                    261:        }                                                       \
                    262:        if(Sgl_iszero_hiddenhigh3mantissa(sgl_opnd)) {          \
                    263:                Sgl_leftshiftby4(sgl_opnd);                     \
                    264:                exponent -= 4;                                  \
                    265:        }                                                       \
                    266:        while(Sgl_iszero_hidden(sgl_opnd)) {                    \
                    267:                Sgl_leftshiftby1(sgl_opnd);                     \
                    268:                exponent -= 1;                                  \
                    269:        }
                    270:
                    271: #define Sgl_setoverflow(sgl_opnd)                              \
                    272:        /* set result to infinity or largest number */          \
                    273:        switch (Rounding_mode()) {                              \
                    274:                case ROUNDPLUS:                                 \
                    275:                        if (Sgl_isone_sign(sgl_opnd)) {         \
                    276:                                Sgl_setlargestnegative(sgl_opnd); \
                    277:                        }                                       \
                    278:                        else {                                  \
                    279:                                Sgl_setinfinitypositive(sgl_opnd); \
                    280:                        }                                       \
                    281:                        break;                                  \
                    282:                case ROUNDMINUS:                                \
                    283:                        if (Sgl_iszero_sign(sgl_opnd)) {        \
                    284:                                Sgl_setlargestpositive(sgl_opnd); \
                    285:                        }                                       \
                    286:                        else {                                  \
                    287:                                Sgl_setinfinitynegative(sgl_opnd); \
                    288:                        }                                       \
                    289:                        break;                                  \
                    290:                case ROUNDNEAREST:                              \
                    291:                        Sgl_setinfinity_exponentmantissa(sgl_opnd); \
                    292:                        break;                                  \
                    293:                case ROUNDZERO:                                 \
                    294:                        Sgl_setlargest_exponentmantissa(sgl_opnd); \
                    295:        }
                    296:
                    297: #define Sgl_denormalize(opnd,exponent,guard,sticky,inexact)            \
                    298:        Sgl_clear_signexponent_set_hidden(opnd);                        \
                    299:        if (exponent >= (1 - SGL_P)) {                                  \
                    300:                guard = (Sall(opnd) >> (-(exponent))) & 1;              \
                    301:                if (exponent < 0) sticky |= Sall(opnd) << (32+exponent); \
                    302:                inexact = (guard) | (sticky);                           \
                    303:                Sall(opnd) >>= (1-exponent);                            \
                    304:        }                                                               \
                    305:        else {                                                          \
                    306:                guard = 0;                                              \
                    307:                sticky |= Sall(opnd);                                   \
                    308:                inexact = sticky;                                       \
                    309:                Sgl_setzero(opnd);                                      \
                    310:        }
                    311:
                    312: int sgl_fadd(sgl_floating_point *, sgl_floating_point *, sgl_floating_point *, unsigned int *);
                    313: int sgl_fcmp(sgl_floating_point *, sgl_floating_point *, unsigned int, unsigned int *);
                    314: int sgl_fdiv(sgl_floating_point *, sgl_floating_point *, sgl_floating_point *, unsigned int *);
                    315: int sgl_fmpy(sgl_floating_point *, sgl_floating_point *, sgl_floating_point *, unsigned int *);
                    316: int sgl_frem(sgl_floating_point *, sgl_floating_point *, sgl_floating_point *, unsigned int *);
                    317: int sgl_fsqrt(sgl_floating_point *, sgl_floating_point *, sgl_floating_point *, unsigned int *);
                    318: int sgl_fsub(sgl_floating_point *, sgl_floating_point *, sgl_floating_point *, unsigned int *);
                    319: int sgl_frnd(sgl_floating_point *, sgl_floating_point *, sgl_floating_point *, unsigned int *);

CVSweb