Annotation of sys/arch/hppa/spmath/fcnvfxt.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: fcnvfxt.c,v 1.7 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: /* @(#)fcnvfxt.c: Revision: 2.8.88.2 Date: 93/12/08 13:27:34 */
16:
17: #include "float.h"
18: #include "sgl_float.h"
19: #include "dbl_float.h"
20: #include "cnv_float.h"
21:
22: /*
23: * Convert single floating-point to single fixed-point format
24: * with truncated result
25: */
26: /*ARGSUSED*/
27: int
28: sgl_to_sgl_fcnvfxt(srcptr, null, dstptr, status)
29: sgl_floating_point *srcptr, *null;
30: int *dstptr;
31: unsigned int *status;
32: {
33: register unsigned int src, temp;
34: register int src_exponent, result;
35:
36: src = *srcptr;
37: src_exponent = Sgl_exponent(src) - SGL_BIAS;
38:
39: /*
40: * Test for overflow
41: */
42: if (src_exponent > SGL_FX_MAX_EXP) {
43: /* check for MININT */
44: if ((src_exponent > SGL_FX_MAX_EXP + 1) ||
45: Sgl_isnotzero_mantissa(src) || Sgl_iszero_sign(src)) {
46: if( Sgl_isnan(src) )
47: /*
48: * On NaN go unimplemented.
49: */
50: return(UNIMPLEMENTEDEXCEPTION);
51: else {
52: if (Sgl_iszero_sign(src)) result = 0x7fffffff;
53: else result = 0x80000000;
54:
55: if (Is_overflowtrap_enabled()) {
56: if (Is_inexacttrap_enabled())
57: return(OVERFLOWEXCEPTION|INEXACTEXCEPTION);
58: else Set_inexactflag();
59: return(OVERFLOWEXCEPTION);
60: }
61: Set_overflowflag();
62: *dstptr = result;
63: if (Is_inexacttrap_enabled() )
64: return(INEXACTEXCEPTION);
65: else Set_inexactflag();
66: return(NOEXCEPTION);
67: }
68: }
69: }
70: /*
71: * Generate result
72: */
73: if (src_exponent >= 0) {
74: temp = src;
75: Sgl_clear_signexponent_set_hidden(temp);
76: Int_from_sgl_mantissa(temp,src_exponent);
77: if (Sgl_isone_sign(src)) result = -Sgl_all(temp);
78: else result = Sgl_all(temp);
79: *dstptr = result;
80:
81: /* check for inexact */
82: if (Sgl_isinexact_to_fix(src,src_exponent)) {
83: if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
84: else Set_inexactflag();
85: }
86: }
87: else {
88: *dstptr = 0;
89:
90: /* check for inexact */
91: if (Sgl_isnotzero_exponentmantissa(src)) {
92: if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
93: else Set_inexactflag();
94: }
95: }
96: return(NOEXCEPTION);
97: }
98:
99: /*
100: * Single Floating-point to Double Fixed-point
101: */
102: /*ARGSUSED*/
103: int
104: sgl_to_dbl_fcnvfxt(srcptr, null, dstptr, status)
105: sgl_floating_point *srcptr, *null;
106: dbl_integer *dstptr;
107: unsigned int *status;
108: {
109: register int src_exponent, resultp1;
110: register unsigned int src, temp, resultp2;
111:
112: src = *srcptr;
113: src_exponent = Sgl_exponent(src) - SGL_BIAS;
114:
115: /*
116: * Test for overflow
117: */
118: if (src_exponent > DBL_FX_MAX_EXP) {
119: /* check for MININT */
120: if ((src_exponent > DBL_FX_MAX_EXP + 1) ||
121: Sgl_isnotzero_mantissa(src) || Sgl_iszero_sign(src)) {
122: if( Sgl_isnan(src) )
123: /*
124: * On NaN go unimplemented.
125: */
126: return(UNIMPLEMENTEDEXCEPTION);
127: else {
128: if (Sgl_iszero_sign(src)) {
129: resultp1 = 0x7fffffff;
130: resultp2 = 0xffffffff;
131: }
132: else {
133: resultp1 = 0x80000000;
134: resultp2 = 0;
135: }
136: if (Is_overflowtrap_enabled()) {
137: if (Is_inexacttrap_enabled())
138: return(OVERFLOWEXCEPTION|INEXACTEXCEPTION);
139: else Set_inexactflag();
140: return(OVERFLOWEXCEPTION);
141: }
142: Set_overflowflag();
143: Dint_copytoptr(resultp1,resultp2,dstptr);
144: if (Is_inexacttrap_enabled() )
145: return(INEXACTEXCEPTION);
146: else Set_inexactflag();
147: return(NOEXCEPTION);
148: }
149: }
150: Dint_set_minint(resultp1,resultp2);
151: Dint_copytoptr(resultp1,resultp2,dstptr);
152: return(NOEXCEPTION);
153: }
154: /*
155: * Generate result
156: */
157: if (src_exponent >= 0) {
158: temp = src;
159: Sgl_clear_signexponent_set_hidden(temp);
160: Dint_from_sgl_mantissa(temp,src_exponent,resultp1,resultp2);
161: if (Sgl_isone_sign(src)) {
162: Dint_setone_sign(resultp1,resultp2);
163: }
164: Dint_copytoptr(resultp1,resultp2,dstptr);
165:
166: /* check for inexact */
167: if (Sgl_isinexact_to_fix(src,src_exponent)) {
168: if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
169: else Set_inexactflag();
170: }
171: }
172: else {
173: Dint_setzero(resultp1,resultp2);
174: Dint_copytoptr(resultp1,resultp2,dstptr);
175:
176: /* check for inexact */
177: if (Sgl_isnotzero_exponentmantissa(src)) {
178: if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
179: else Set_inexactflag();
180: }
181: }
182: return(NOEXCEPTION);
183: }
184:
185: /*
186: * Double Floating-point to Single Fixed-point
187: */
188: /*ARGSUSED*/
189: int
190: dbl_to_sgl_fcnvfxt(srcptr, null, dstptr, status)
191: dbl_floating_point *srcptr, *null;
192: int *dstptr;
193: unsigned int *status;
194: {
195: register unsigned int srcp1, srcp2, tempp1, tempp2;
196: register int src_exponent, result;
197:
198: Dbl_copyfromptr(srcptr,srcp1,srcp2);
199: src_exponent = Dbl_exponent(srcp1) - DBL_BIAS;
200:
201: /*
202: * Test for overflow
203: */
204: if (src_exponent > SGL_FX_MAX_EXP) {
205: /* check for MININT */
206: if (Dbl_isoverflow_to_int(src_exponent,srcp1,srcp2)) {
207: if( Dbl_isnan(srcp1,srcp2) )
208: /*
209: * On NaN go unimplemented.
210: */
211: return(UNIMPLEMENTEDEXCEPTION);
212: else {
213: if (Dbl_iszero_sign(srcp1)) result = 0x7fffffff;
214: else result = 0x80000000;
215:
216: if (Is_overflowtrap_enabled()) {
217: if (Is_inexacttrap_enabled())
218: return(OVERFLOWEXCEPTION|INEXACTEXCEPTION);
219: else Set_inexactflag();
220: return(OVERFLOWEXCEPTION);
221: }
222: Set_overflowflag();
223: *dstptr = result;
224: if (Is_inexacttrap_enabled() )
225: return(INEXACTEXCEPTION);
226: else Set_inexactflag();
227: return(NOEXCEPTION);
228: }
229: }
230: }
231: /*
232: * Generate result
233: */
234: if (src_exponent >= 0) {
235: tempp1 = srcp1;
236: tempp2 = srcp2;
237: Dbl_clear_signexponent_set_hidden(tempp1);
238: Int_from_dbl_mantissa(tempp1,tempp2,src_exponent);
239: if (Dbl_isone_sign(srcp1) && (src_exponent <= SGL_FX_MAX_EXP))
240: result = -Dbl_allp1(tempp1);
241: else result = Dbl_allp1(tempp1);
242: *dstptr = result;
243:
244: /* check for inexact */
245: if (Dbl_isinexact_to_fix(srcp1,srcp2,src_exponent)) {
246: if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
247: else Set_inexactflag();
248: }
249: }
250: else {
251: *dstptr = 0;
252:
253: /* check for inexact */
254: if (Dbl_isnotzero_exponentmantissa(srcp1,srcp2)) {
255: if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
256: else Set_inexactflag();
257: }
258: }
259: return(NOEXCEPTION);
260: }
261:
262: /*
263: * Double Floating-point to Double Fixed-point
264: */
265: /*ARGSUSED*/
266: int
267: dbl_to_dbl_fcnvfxt(srcptr, null, dstptr, status)
268: dbl_floating_point *srcptr, *null;
269: dbl_integer *dstptr;
270: unsigned int *status;
271: {
272: register int src_exponent, resultp1;
273: register unsigned int srcp1, srcp2, tempp1, tempp2, resultp2;
274:
275: Dbl_copyfromptr(srcptr,srcp1,srcp2);
276: src_exponent = Dbl_exponent(srcp1) - DBL_BIAS;
277:
278: /*
279: * Test for overflow
280: */
281: if (src_exponent > DBL_FX_MAX_EXP) {
282: /* check for MININT */
283: if ((src_exponent > DBL_FX_MAX_EXP + 1) ||
284: Dbl_isnotzero_mantissa(srcp1,srcp2) || Dbl_iszero_sign(srcp1)) {
285: if( Dbl_isnan(srcp1,srcp2) )
286: /*
287: * On NaN go unimplemented.
288: */
289: return(UNIMPLEMENTEDEXCEPTION);
290: else {
291: if (Dbl_iszero_sign(srcp1)) {
292: resultp1 = 0x7fffffff;
293: resultp2 = 0xffffffff;
294: }
295: else {
296: resultp1 = 0x80000000;
297: resultp2 = 0;
298: }
299: if (Is_overflowtrap_enabled()) {
300: if (Is_inexacttrap_enabled())
301: return(OVERFLOWEXCEPTION|INEXACTEXCEPTION);
302: else Set_inexactflag();
303: return(OVERFLOWEXCEPTION);
304: }
305: Set_overflowflag();
306: Dint_copytoptr(resultp1,resultp2,dstptr);
307: if (Is_inexacttrap_enabled() )
308: return(INEXACTEXCEPTION);
309: else Set_inexactflag();
310: return(NOEXCEPTION);
311: }
312: }
313: }
314: /*
315: * Generate result
316: */
317: if (src_exponent >= 0) {
318: tempp1 = srcp1;
319: tempp2 = srcp2;
320: Dbl_clear_signexponent_set_hidden(tempp1);
321: Dint_from_dbl_mantissa(tempp1,tempp2,src_exponent,
322: resultp1,resultp2);
323: if (Dbl_isone_sign(srcp1)) {
324: Dint_setone_sign(resultp1,resultp2);
325: }
326: Dint_copytoptr(resultp1,resultp2,dstptr);
327:
328: /* check for inexact */
329: if (Dbl_isinexact_to_fix(srcp1,srcp2,src_exponent)) {
330: if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
331: else Set_inexactflag();
332: }
333: }
334: else {
335: Dint_setzero(resultp1,resultp2);
336: Dint_copytoptr(resultp1,resultp2,dstptr);
337:
338: /* check for inexact */
339: if (Dbl_isnotzero_exponentmantissa(srcp1,srcp2)) {
340: if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
341: else Set_inexactflag();
342: }
343: }
344: return(NOEXCEPTION);
345: }
CVSweb