Annotation of sys/arch/hppa/spmath/divsfm.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: divsfm.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: /* @(#)divsfm.c: Revision: 1.6.88.1 Date: 93/12/07 15:05:51 */
! 16:
! 17: #include "md.h"
! 18:
! 19: void
! 20: divsfm(opnd1,opnd2,result)
! 21: int opnd1, opnd2;
! 22: struct mdsfu_register *result;
! 23: {
! 24: register 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: /* return positive residue */
! 65: if (op1_sign && result_hi) {
! 66: result_hi = opnd2 - result_hi;
! 67: result_lo++;
! 68: }
! 69: }
! 70:
! 71: /* check for overflow */
! 72: if (result_lo < 0) {
! 73: overflow = TRUE;
! 74: return;
! 75: }
! 76: overflow = FALSE;
! 77:
! 78: /* return appropriately signed result */
! 79: if (sign<0) result_lo = -result_lo;
! 80: return;
! 81: }
CVSweb