Annotation of sys/arch/hppa/spmath/divsfr.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: divsfr.c,v 1.5 2002/05/07 22:19:30 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: /* @(#)divsfr.c: Revision: 1.6.88.1 Date: 93/12/07 15:05:53 */
16:
17: #include "md.h"
18:
19: void
20: divsfr(opnd1,opnd2,result)
21: int opnd1, opnd2;
22: struct mdsfu_register *result;
23: {
24: int sign, op1_sign;
25:
26: /* check divisor for zero */
27: if (opnd2 == 0) {
28: overflow = TRUE;
29: return;
30: }
31:
32: /* get sign of result */
33: sign = opnd1 ^ opnd2;
34:
35: /* get absolute value of operands */
36: if (opnd1 < 0) {
37: opnd1 = -opnd1;
38: op1_sign = TRUE;
39: }
40: else op1_sign = FALSE;
41: if (opnd2 < 0) opnd2 = -opnd2;
42:
43: /*
44: * check for overflow
45: *
46: * if abs(opnd1) < 0, then opnd1 = -2**31
47: * and abs(opnd1) >= abs(opnd2) always
48: */
49: if (opnd1 >= opnd2 || opnd1 < 0) {
50: /* check for opnd2 = -2**31 */
51: if (opnd2 < 0 && opnd1 != opnd2) {
52: result_hi = 0; /* remainder = 0 */
53: result_lo = opnd1 << 1;
54: }
55: else {
56: overflow = TRUE;
57: return;
58: }
59: }
60: else {
61: /* do the divide */
62: divu(opnd1,0,opnd2,result);
63: }
64:
65: /* check for overflow */
66: if (result_lo < 0) {
67: overflow = TRUE;
68: return;
69: }
70: overflow = FALSE;
71:
72: /* return appropriately signed remainder and result */
73: if (op1_sign) result_hi = -result_hi;
74: if (sign<0) result_lo = -result_lo;
75: return;
76: }
CVSweb