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