Annotation of sys/arch/m68k/fpe/fpu_int.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: fpu_int.c,v 1.4 2006/06/11 20:43:28 miod Exp $ */
2: /* $NetBSD: fpu_int.c,v 1.6 2003/07/15 02:43:10 lukem Exp $ */
3:
4: /*
5: * Copyright (c) 1995 Ken Nakata
6: * All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: *
17: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27: * SUCH DAMAGE.
28: *
29: * @(#)fpu_int.c
30: */
31:
32: #include <sys/types.h>
33:
34: #include <machine/reg.h>
35:
36: #include <m68k/fpe/fpu_arith.h>
37: #include <m68k/fpe/fpu_emulate.h>
38:
39: /* FINTRZ - always round to zero */
40: struct fpn *
41: fpu_intrz(fe)
42: struct fpemu *fe;
43: {
44: struct fpn *x = &fe->fe_f2;
45: int sh, clr, mask, i;
46:
47: /* special cases first */
48: if (x->fp_class != FPC_NUM) {
49: return x;
50: }
51: /* when |x| < 1.0 */
52: if (x->fp_exp < 0) {
53: x->fp_class = FPC_ZERO;
54: x->fp_mant[0] = x->fp_mant[1] = x->fp_mant[2] = 0;
55: return x;
56: }
57:
58: /* real work */
59: sh = FP_NMANT - 1 - x->fp_exp;
60: if (sh <= 0) {
61: return x;
62: }
63:
64: clr = 2 - sh / 32;
65: mask = (0xffffffff << (sh % 32));
66:
67: for (i = 2; i > clr; i--) {
68: x->fp_mant[i] = 0;
69: }
70: x->fp_mant[i] &= mask;
71:
72: return x;
73: }
74:
75: /* FINT */
76: struct fpn *
77: fpu_int(fe)
78: struct fpemu *fe;
79: {
80: struct fpn *x = &fe->fe_f2;
81: int rsh, lsh, wsh, i;
82:
83: /* special cases first */
84: if (x->fp_class != FPC_NUM) {
85: return x;
86: }
87: /* even if we have exponent == -1, we still have possiblity
88: that the result >= 1.0 when mantissa ~= 1.0 and rounded up */
89: if (x->fp_exp < -1) {
90: x->fp_class = FPC_ZERO;
91: x->fp_mant[0] = x->fp_mant[1] = x->fp_mant[2] = 0;
92: return x;
93: }
94:
95: /* real work */
96: rsh = FP_NMANT - 1 - x->fp_exp;
97: if (rsh - FP_NG <= 0) {
98: return x;
99: }
100:
101: fpu_shr(x, rsh - FP_NG); /* shift to the right */
102:
103: if (fpu_round(fe, x) == 1 /* rounded up */ &&
104: x->fp_mant[2 - (FP_NMANT-rsh)/32] & (1 << ((FP_NMANT-rsh)%32))
105: /* x >= 2.0 */) {
106: rsh--; /* reduce shift count by 1 */
107: x->fp_exp++; /* adjust exponent */
108: }
109:
110: /* shift it back to the left */
111: wsh = rsh / 32;
112: lsh = rsh % 32;
113: rsh = 32 - lsh;
114: for (i = 0; i + wsh < 2; i++) {
115: x->fp_mant[i] = (x->fp_mant[i+wsh] << lsh) | (x->fp_mant[i+wsh+1] >> rsh);
116: }
117: x->fp_mant[i] = (x->fp_mant[i+wsh] << lsh);
118: i++;
119: for (; i < 3; i++) {
120: x->fp_mant[i] = 0;
121: }
122:
123: return x;
124: }
CVSweb