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

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

1.1       nbrk        1: /*     $OpenBSD: cnv_float.h,v 1.9 2003/04/10 17:27:58 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: /* @(#)cnv_float.h: Revision: 2.9.88.1 Date: 93/12/07 15:05:29 */
                     16:
                     17: /*
                     18:  * Some more constants
                     19:  */
                     20: #define SGL_FX_MAX_EXP 30
                     21: #define DBL_FX_MAX_EXP 62
                     22: #define QUAD_FX_MAX_EXP 126
                     23:
                     24:
                     25: #define Dintp1(object) (object)
                     26: #define Dintp2(object) (object)
                     27:
                     28: #define Qintp0(object) (object)
                     29: #define Qintp1(object) (object)
                     30: #define Qintp2(object) (object)
                     31: #define Qintp3(object) (object)
                     32:
                     33:
                     34: /*
                     35:  * These macros will be used specifically by the convert instructions.
                     36:  *
                     37:  *
                     38:  * Single format macros
                     39:  */
                     40:
                     41: #define Sgl_to_dbl_exponent(src_exponent,dest)                 \
                     42:     Deposit_dexponent(dest,src_exponent+(DBL_BIAS-SGL_BIAS))
                     43:
                     44: #define Sgl_to_dbl_mantissa(src_mantissa,destA,destB)  \
                     45:     Deposit_dmantissap1(destA,src_mantissa>>3);                \
                     46:     Dmantissap2(destB) = src_mantissa << 29
                     47:
                     48: #define Sgl_isinexact_to_fix(sgl_value,exponent)       \
                     49:     ((exponent < (SGL_P - 1)) ?                                \
                     50:      (Sall(sgl_value) << (SGL_EXP_LENGTH + 1 + exponent)) : FALSE)
                     51:
                     52: #define Int_isinexact_to_sgl(int_value)        (int_value << (33 - SGL_EXP_LENGTH))
                     53:
                     54: #define Sgl_roundnearest_from_int(int_value,sgl_value)                 \
                     55:     if (int_value & 1<<(SGL_EXP_LENGTH - 2))   /* round bit */         \
                     56:        if ((int_value << (34 - SGL_EXP_LENGTH)) || Slow(sgl_value))    \
                     57:                Sall(sgl_value)++
                     58:
                     59: #define Dint_isinexact_to_sgl(dint_valueA,dint_valueB)         \
                     60:     ((Dintp1(dint_valueA) << (33 - SGL_EXP_LENGTH)) || Dintp2(dint_valueB))
                     61:
                     62: #define Sgl_roundnearest_from_dint(dint_valueA,dint_valueB,sgl_value)  \
                     63:     if (Dintp1(dint_valueA) & 1<<(SGL_EXP_LENGTH - 2))                 \
                     64:        if ((Dintp1(dint_valueA) << (34 - SGL_EXP_LENGTH)) ||           \
                     65:        Dintp2(dint_valueB) || Slow(sgl_value)) Sall(sgl_value)++
                     66:
                     67: #define Dint_isinexact_to_dbl(dint_value)      \
                     68:     (Dintp2(dint_value) << (33 - DBL_EXP_LENGTH))
                     69:
                     70: #define Dbl_roundnearest_from_dint(dint_opndB,dbl_opndA,dbl_opndB)     \
                     71:     if (Dintp2(dint_opndB) & 1<<(DBL_EXP_LENGTH - 2))                  \
                     72:        if ((Dintp2(dint_opndB) << (34 - DBL_EXP_LENGTH)) || Dlowp2(dbl_opndB))  \
                     73:           if ((++Dallp2(dbl_opndB))==0) Dallp1(dbl_opndA)++
                     74:
                     75: #define Sgl_isone_roundbit(sgl_value,exponent)                 \
                     76:     ((Sall(sgl_value) << (SGL_EXP_LENGTH + 1 + exponent)) >> 31)
                     77:
                     78: #define Sgl_isone_stickybit(sgl_value,exponent)                \
                     79:     (exponent < (SGL_P - 2) ?                          \
                     80:      Sall(sgl_value) << (SGL_EXP_LENGTH + 2 + exponent) : FALSE)
                     81:
                     82:
                     83: /*
                     84:  * Double format macros
                     85:  */
                     86:
                     87: #define Dbl_to_sgl_exponent(src_exponent,dest)                 \
                     88:     dest = src_exponent + (SGL_BIAS - DBL_BIAS)
                     89:
                     90: #define Dbl_to_sgl_mantissa(srcA,srcB,dest,inexact,guard,sticky,odd)   \
                     91:     Shiftdouble(Dmantissap1(srcA),Dmantissap2(srcB),29,dest);  \
                     92:     guard = Dbit3p2(srcB);                                     \
                     93:     sticky = Dallp2(srcB)<<4;                                  \
                     94:     inexact = guard | sticky;                                  \
                     95:     odd = Dbit2p2(srcB)
                     96:
                     97: #define Dbl_to_sgl_denormalized(srcA,srcB,exp,dest,inexact,guard,sticky,odd,tiny) \
                     98:     Deposit_dexponent(srcA,1);                                         \
                     99:     tiny = TRUE;                                                       \
                    100:     if (exp >= -2) {                                                   \
                    101:        if (exp == 0) {                                                 \
                    102:            inexact = Dallp2(srcB) << 3;                                \
                    103:            guard = inexact >> 31;                                      \
                    104:            sticky = inexact << 1;                                      \
                    105:            Shiftdouble(Dmantissap1(srcA),Dmantissap2(srcB),29,dest);   \
                    106:            odd = dest << 31;                                           \
                    107:            if (inexact) {                                              \
                    108:                switch(Rounding_mode()) {                               \
                    109:                    case ROUNDPLUS:                                     \
                    110:                        if (Dbl_iszero_sign(srcA)) {                    \
                    111:                            dest++;                                     \
                    112:                            if (Sgl_isone_hidden(dest)) \
                    113:                                tiny = FALSE;                           \
                    114:                            dest--;                                     \
                    115:                        }                                               \
                    116:                        break;                                          \
                    117:                    case ROUNDMINUS:                                    \
                    118:                        if (Dbl_isone_sign(srcA)) {                     \
                    119:                            dest++;                                     \
                    120:                            if (Sgl_isone_hidden(dest)) \
                    121:                                tiny = FALSE;                           \
                    122:                            dest--;                                     \
                    123:                        }                                               \
                    124:                        break;                                          \
                    125:                    case ROUNDNEAREST:                                  \
                    126:                        if (guard && (sticky || odd)) {                 \
                    127:                            dest++;                                     \
                    128:                            if (Sgl_isone_hidden(dest)) \
                    129:                                tiny = FALSE;                           \
                    130:                            dest--;                                     \
                    131:                        }                                               \
                    132:                        break;                                          \
                    133:                }                                                       \
                    134:            }                                                           \
                    135:                /* shift right by one to get correct result */          \
                    136:                guard = odd;                                            \
                    137:                sticky = inexact;                                       \
                    138:                inexact |= guard;                                       \
                    139:                dest >>= 1;                                             \
                    140:                Deposit_dsign(srcA,0);                                  \
                    141:                Shiftdouble(Dallp1(srcA),Dallp2(srcB),30,dest);         \
                    142:                odd = dest << 31;                                       \
                    143:        }                                                               \
                    144:        else {                                                          \
                    145:            inexact = Dallp2(srcB) << (2 + exp);                        \
                    146:            guard = inexact >> 31;                                      \
                    147:            sticky = inexact << 1;                                      \
                    148:            Deposit_dsign(srcA,0);                                      \
                    149:            if (exp == -2) dest = Dallp1(srcA);                         \
                    150:            else Variable_shift_double(Dallp1(srcA),Dallp2(srcB),30-exp,dest); \
                    151:            odd = dest << 31;                                           \
                    152:        }                                                               \
                    153:     }                                                                  \
                    154:     else {                                                             \
                    155:        Deposit_dsign(srcA,0);                                          \
                    156:        if (exp > (1 - SGL_P)) {                                        \
                    157:            dest = Dallp1(srcA) >> (- 2 - exp);                         \
                    158:            inexact = Dallp1(srcA) << (34 + exp);                       \
                    159:            guard = inexact >> 31;                                      \
                    160:            sticky = (inexact << 1) | Dallp2(srcB);                     \
                    161:            inexact |= Dallp2(srcB);                                    \
                    162:            odd = dest << 31;                                           \
                    163:        }                                                               \
                    164:        else {                                                          \
                    165:            dest = 0;                                                   \
                    166:            inexact = Dallp1(srcA) | Dallp2(srcB);                      \
                    167:            if (exp == (1 - SGL_P)) {                                   \
                    168:                guard = Dhidden(srcA);                                  \
                    169:                sticky = Dmantissap1(srcA) | Dallp2(srcB);              \
                    170:            }                                                           \
                    171:            else {                                                      \
                    172:                guard = 0;                                              \
                    173:                sticky = inexact;                                       \
                    174:            }                                                           \
                    175:            odd = 0;                                                    \
                    176:        }                                                               \
                    177:     }                                                                  \
                    178:     exp = 0
                    179:
                    180: #define Dbl_isinexact_to_fix(dbl_valueA,dbl_valueB,exponent)           \
                    181:     (exponent < (DBL_P-33) ?                                           \
                    182:      Dallp2(dbl_valueB) || Dallp1(dbl_valueA) << (DBL_EXP_LENGTH+1+exponent) : \
                    183:      (exponent < (DBL_P-1) ? Dallp2(dbl_valueB) << (exponent + (33-DBL_P)) :   \
                    184:       FALSE))
                    185:
                    186: #define Dbl_isoverflow_to_int(exponent,dbl_valueA,dbl_valueB)          \
                    187:     ((exponent > SGL_FX_MAX_EXP + 1) || Dsign(dbl_valueA)==0 ||                \
                    188:      Dmantissap1(dbl_valueA)!=0 || (Dallp2(dbl_valueB)>>21)!=0 )
                    189:
                    190: #define Dbl_isone_roundbit(dbl_valueA,dbl_valueB,exponent)              \
                    191:     ((exponent < (DBL_P - 33) ?                                                \
                    192:       Dallp1(dbl_valueA) >> ((30 - DBL_EXP_LENGTH) - exponent) :       \
                    193:       Dallp2(dbl_valueB) >> ((DBL_P - 2) - exponent)) & 1)
                    194:
                    195: #define Dbl_isone_stickybit(dbl_valueA,dbl_valueB,exponent)            \
                    196:     (exponent < (DBL_P-34) ?                                           \
                    197:      (Dallp2(dbl_valueB) || Dallp1(dbl_valueA)<<(DBL_EXP_LENGTH+2+exponent)) : \
                    198:      (exponent<(DBL_P-2) ? (Dallp2(dbl_valueB) << (exponent + (34-DBL_P))) : \
                    199:       FALSE))
                    200:
                    201:
                    202: /* Int macros */
                    203:
                    204: #define Int_from_sgl_mantissa(sgl_value,exponent)      \
                    205:     Sall(sgl_value) =                          \
                    206:        (unsigned)(Sall(sgl_value) << SGL_EXP_LENGTH)>>(31 - exponent)
                    207:
                    208: #define Int_from_dbl_mantissa(dbl_valueA,dbl_valueB,exponent)  \
                    209:     Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),22,Dallp1(dbl_valueA)); \
                    210:     if (exponent < 31) Dallp1(dbl_valueA) >>= 30 - exponent;   \
                    211:     else Dallp1(dbl_valueA) <<= 1
                    212:
                    213: #define Int_negate(int_value) int_value = -int_value
                    214:
                    215:
                    216: /* Dint macros */
                    217:
                    218: #define Dint_from_sgl_mantissa(sgl_value,exponent,dresultA,dresultB)   \
                    219:     {Sall(sgl_value) <<= SGL_EXP_LENGTH;  /*  left-justify  */         \
                    220:     if (exponent <= 31) {                                              \
                    221:        Dintp1(dresultA) = 0;                                           \
                    222:        Dintp2(dresultB) = (unsigned)Sall(sgl_value) >> (31 - exponent); \
                    223:     }                                                                  \
                    224:     else {                                                             \
                    225:        Dintp1(dresultA) = Sall(sgl_value) >> (63 - exponent);          \
                    226:        Dintp2(dresultB) = Sall(sgl_value) << (exponent - 31);          \
                    227:     }}
                    228:
                    229:
                    230: #define Dint_from_dbl_mantissa(dbl_valueA,dbl_valueB,exponent,destA,destB) \
                    231:     {if (exponent < 32) {                                              \
                    232:        Dintp1(destA) = 0;                                              \
                    233:        if (exponent <= 20)                                             \
                    234:            Dintp2(destB) = Dallp1(dbl_valueA) >> (20-exponent);        \
                    235:        else Variable_shift_double(Dallp1(dbl_valueA),Dallp2(dbl_valueB), \
                    236:             52-exponent,Dintp2(destB));                                        \
                    237:     }                                                                  \
                    238:     else {                                                             \
                    239:        if (exponent <= 52) {                                           \
                    240:            Dintp1(destA) = Dallp1(dbl_valueA) >> (52-exponent);        \
                    241:            if (exponent == 52) Dintp2(destB) = Dallp2(dbl_valueB);     \
                    242:            else Variable_shift_double(Dallp1(dbl_valueA),Dallp2(dbl_valueB), \
                    243:            52-exponent,Dintp2(destB));                                 \
                    244:         }                                                              \
                    245:        else {                                                          \
                    246:            Variable_shift_double(Dallp1(dbl_valueA),Dallp2(dbl_valueB), \
                    247:            84-exponent,Dintp1(destA));                                 \
                    248:            Dintp2(destB) = Dallp2(dbl_valueB) << (exponent-52);        \
                    249:        }                                                               \
                    250:     }}
                    251:
                    252: #define Dint_setzero(dresultA,dresultB)                \
                    253:     Dintp1(dresultA) = 0;                      \
                    254:     Dintp2(dresultB) = 0
                    255:
                    256: #define Dint_setone_sign(dresultA,dresultB)            \
                    257:     Dintp1(dresultA) = ~Dintp1(dresultA);              \
                    258:     if ((Dintp2(dresultB) = -Dintp2(dresultB)) == 0) Dintp1(dresultA)++
                    259:
                    260: #define Dint_set_minint(dresultA,dresultB)             \
                    261:     Dintp1(dresultA) = 1<<31;                          \
                    262:     Dintp2(dresultB) = 0
                    263:
                    264: #define Dint_isone_lowp2(dresultB)  (Dintp2(dresultB) & 01)
                    265:
                    266: #define Dint_increment(dresultA,dresultB)              \
                    267:     if ((++Dintp2(dresultB))==0) Dintp1(dresultA)++
                    268:
                    269: #define Dint_decrement(dresultA,dresultB)              \
                    270:     if ((Dintp2(dresultB)--)==0) Dintp1(dresultA)--
                    271:
                    272: #define Dint_negate(dresultA,dresultB)                 \
                    273:     Dintp1(dresultA) = ~Dintp1(dresultA);              \
                    274:     if ((Dintp2(dresultB) = -Dintp2(dresultB))==0) Dintp1(dresultA)++
                    275:
                    276: #define Dint_copyfromptr(src,destA,destB) \
                    277:      Dintp1(destA) = src->wd0;         \
                    278:      Dintp2(destB) = src->wd1
                    279: #define Dint_copytoptr(srcA,srcB,dest) \
                    280:     dest->wd0 = Dintp1(srcA);          \
                    281:     dest->wd1 = Dintp2(srcB)
                    282:
                    283:
                    284: /* other macros  */
                    285:
                    286: #define Find_ms_one_bit(value, position)       \
                    287:     {                                          \
                    288:        int var;                                \
                    289:        for (var = 8; var >= 1; var >>= 1) {    \
                    290:            if (value >> (32 - position))       \
                    291:                position -= var;                \
                    292:                else position += var;           \
                    293:        }                                       \
                    294:        if ((value >> (32 - position)) == 0)    \
                    295:            position--;                         \
                    296:        else position -= 2;                     \
                    297:     }
                    298:
                    299: int sgl_to_sgl_fcnvfx(sgl_floating_point *, sgl_floating_point *, sgl_floating_point *, unsigned int *);
                    300: int sgl_to_dbl_fcnvfx(sgl_floating_point *, sgl_floating_point *, dbl_integer *, unsigned int *);
                    301: int dbl_to_sgl_fcnvfx(dbl_floating_point *, dbl_floating_point *, int *, unsigned int *);
                    302: int dbl_to_dbl_fcnvfx(dbl_floating_point *, dbl_floating_point *, dbl_integer *, unsigned int *);
                    303:
                    304: int sgl_to_sgl_fcnvfxt(sgl_floating_point *, sgl_floating_point *, int *, unsigned int *);
                    305: int sgl_to_dbl_fcnvfxt(sgl_floating_point *, sgl_floating_point *, dbl_integer *, unsigned int *);
                    306: int dbl_to_sgl_fcnvfxt(dbl_floating_point *, dbl_floating_point *, int *, unsigned int *);
                    307: int dbl_to_dbl_fcnvfxt(dbl_floating_point *, dbl_floating_point *, dbl_integer *, unsigned int *);
                    308:
                    309: int sgl_to_sgl_fcnvxf(int *, int *, sgl_floating_point *, unsigned int *);
                    310: int sgl_to_dbl_fcnvxf(int *, int *, dbl_floating_point *, unsigned int *);
                    311: int dbl_to_sgl_fcnvxf(dbl_integer *, dbl_integer *, sgl_floating_point *, unsigned int *);
                    312: int dbl_to_dbl_fcnvxf(dbl_integer *, dbl_integer *, dbl_floating_point *, unsigned int *);

CVSweb