1 1.5 skrll /* $NetBSD: divsfr.c,v 1.5 2012/02/04 17:03:09 skrll Exp $ */ 2 1.1 fredette 3 1.1 fredette /* $OpenBSD: divsfr.c,v 1.4 2001/03/29 03:58:18 mickey Exp $ */ 4 1.1 fredette 5 1.1 fredette /* 6 1.1 fredette * Copyright 1996 1995 by Open Software Foundation, Inc. 7 1.1 fredette * All Rights Reserved 8 1.1 fredette * 9 1.1 fredette * Permission to use, copy, modify, and distribute this software and 10 1.1 fredette * its documentation for any purpose and without fee is hereby granted, 11 1.1 fredette * provided that the above copyright notice appears in all copies and 12 1.1 fredette * that both the copyright notice and this permission notice appear in 13 1.1 fredette * supporting documentation. 14 1.1 fredette * 15 1.1 fredette * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 16 1.1 fredette * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 17 1.1 fredette * FOR A PARTICULAR PURPOSE. 18 1.1 fredette * 19 1.1 fredette * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 20 1.1 fredette * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 21 1.1 fredette * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 22 1.1 fredette * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 23 1.1 fredette * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 24 1.1 fredette * 25 1.1 fredette */ 26 1.1 fredette /* 27 1.1 fredette * pmk1.1 28 1.1 fredette */ 29 1.1 fredette /* 30 1.1 fredette * (c) Copyright 1986 HEWLETT-PACKARD COMPANY 31 1.1 fredette * 32 1.1 fredette * To anyone who acknowledges that this file is provided "AS IS" 33 1.1 fredette * without any express or implied warranty: 34 1.1 fredette * permission to use, copy, modify, and distribute this file 35 1.1 fredette * for any purpose is hereby granted without fee, provided that 36 1.1 fredette * the above copyright notice and this notice appears in all 37 1.1 fredette * copies, and that the name of Hewlett-Packard Company not be 38 1.1 fredette * used in advertising or publicity pertaining to distribution 39 1.1 fredette * of the software without specific, written prior permission. 40 1.1 fredette * Hewlett-Packard Company makes no representations about the 41 1.1 fredette * suitability of this software for any purpose. 42 1.1 fredette */ 43 1.1 fredette 44 1.2 lukem #include <sys/cdefs.h> 45 1.5 skrll __KERNEL_RCSID(0, "$NetBSD: divsfr.c,v 1.5 2012/02/04 17:03:09 skrll Exp $"); 46 1.1 fredette 47 1.1 fredette #include "md.h" 48 1.1 fredette 49 1.1 fredette void 50 1.5 skrll divsfr(int opnd1, int opnd2, struct mdsfu_register *result) 51 1.1 fredette { 52 1.1 fredette int sign, op1_sign; 53 1.1 fredette 54 1.1 fredette /* check divisor for zero */ 55 1.1 fredette if (opnd2 == 0) { 56 1.4 thorpej overflow = true; 57 1.1 fredette return; 58 1.1 fredette } 59 1.1 fredette 60 1.1 fredette /* get sign of result */ 61 1.1 fredette sign = opnd1 ^ opnd2; 62 1.1 fredette 63 1.1 fredette /* get absolute value of operands */ 64 1.1 fredette if (opnd1 < 0) { 65 1.1 fredette opnd1 = -opnd1; 66 1.4 thorpej op1_sign = true; 67 1.1 fredette } 68 1.4 thorpej else op1_sign = false; 69 1.1 fredette if (opnd2 < 0) opnd2 = -opnd2; 70 1.1 fredette 71 1.1 fredette /* 72 1.1 fredette * check for overflow 73 1.1 fredette * 74 1.1 fredette * if abs(opnd1) < 0, then opnd1 = -2**31 75 1.1 fredette * and abs(opnd1) >= abs(opnd2) always 76 1.1 fredette */ 77 1.1 fredette if (opnd1 >= opnd2 || opnd1 < 0) { 78 1.1 fredette /* check for opnd2 = -2**31 */ 79 1.1 fredette if (opnd2 < 0 && opnd1 != opnd2) { 80 1.1 fredette result_hi = 0; /* remainder = 0 */ 81 1.1 fredette result_lo = opnd1 << 1; 82 1.1 fredette } 83 1.1 fredette else { 84 1.4 thorpej overflow = true; 85 1.1 fredette return; 86 1.1 fredette } 87 1.1 fredette } 88 1.1 fredette else { 89 1.1 fredette /* do the divide */ 90 1.1 fredette divu(opnd1,0,opnd2,result); 91 1.1 fredette } 92 1.1 fredette 93 1.1 fredette /* check for overflow */ 94 1.1 fredette if (result_lo < 0) { 95 1.4 thorpej overflow = true; 96 1.1 fredette return; 97 1.1 fredette } 98 1.4 thorpej overflow = false; 99 1.1 fredette 100 1.1 fredette /* return appropriately signed remainder and result */ 101 1.1 fredette if (op1_sign) result_hi = -result_hi; 102 1.1 fredette if (sign<0) result_lo = -result_lo; 103 1.1 fredette return; 104 1.1 fredette } 105