1 1.3 christos /* $NetBSD: divu.S,v 1.3 2005/12/11 12:17:40 christos Exp $ */ 2 1.1 fredette 3 1.1 fredette /* $OpenBSD: divu.S,v 1.5 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.1 fredette #include <machine/asm.h> 45 1.1 fredette 46 1.1 fredette /************************************************************************** 47 1.1 fredette * Implement an integer divide routine for 32-bit operands and 32-bit quotient 48 1.1 fredette * and remainder with operand values of zero (divisor only) treated specially. 49 1.1 fredette * 50 1.1 fredette ***************************************************************************/ 51 1.1 fredette /* 52 1.1 fredette * General registers 53 1.1 fredette */ 54 1.2 chs gr0: .reg %r0 /* General register zero */ 55 1.2 chs rem: .reg %r3 /* remainder and upper part of dividend */ 56 1.2 chs quo: .reg %r4 /* quotient and lower part of dividend */ 57 1.2 chs dvr: .reg %r5 /* divisor */ 58 1.2 chs tp: .reg %r6 /* temp. reg. */ 59 1.1 fredette 60 1.1 fredette .text 61 1.1 fredette 62 1.1 fredette /*****************************************************************************/ 63 1.1 fredette ENTRY(divu,16) 64 1.2 chs stws,ma rem,4(%sp) ; save registers on stack 65 1.2 chs stws,ma quo,4(%sp) ; save registers on stack 66 1.2 chs stws,ma dvr,4(%sp) ; save registers on stack 67 1.2 chs stws,ma tp,4(%sp) ; save registers on stack 68 1.2 chs 69 1.2 chs addi 0,%arg2,dvr ; get divisor 70 1.2 chs addi 0,%arg1,quo ; get lower dividend 71 1.2 chs addi 0,%arg0,rem ; get upper dividend 72 1.1 fredette 73 1.1 fredette comib,>,n 0,dvr,hibit ; check for dvr >= 2**31 74 1.1 fredette addi -1,gr0,tp ; set V-bit to 1 75 1.1 fredette ds 0,tp,0 76 1.1 fredette add quo,quo,quo ; shift msb bit into carry 77 1.1 fredette ds rem,dvr,rem ; 1st divide step, if carry 78 1.1 fredette ; out, msb of quotient = 0 79 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 80 1.1 fredette ds rem,dvr,rem ; 2nd divide step 81 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 82 1.1 fredette ds rem,dvr,rem ; 3rd divide step 83 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 84 1.1 fredette ds rem,dvr,rem ; 4th divide step 85 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 86 1.1 fredette ds rem,dvr,rem ; 5th divide step 87 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 88 1.1 fredette ds rem,dvr,rem ; 6th divide step 89 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 90 1.1 fredette ds rem,dvr,rem ; 7th divide step 91 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 92 1.1 fredette ds rem,dvr,rem ; 8th divide step 93 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 94 1.1 fredette ds rem,dvr,rem ; 9th divide step 95 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 96 1.1 fredette ds rem,dvr,rem ; 10th divide step 97 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 98 1.1 fredette ds rem,dvr,rem ; 11th divide step 99 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 100 1.1 fredette ds rem,dvr,rem ; 12th divide step 101 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 102 1.1 fredette ds rem,dvr,rem ; 13th divide step 103 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 104 1.1 fredette ds rem,dvr,rem ; 14th divide step 105 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 106 1.1 fredette ds rem,dvr,rem ; 15th divide step 107 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 108 1.1 fredette ds rem,dvr,rem ; 16th divide step 109 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 110 1.1 fredette ds rem,dvr,rem ; 17th divide step 111 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 112 1.1 fredette ds rem,dvr,rem ; 18th divide step 113 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 114 1.1 fredette ds rem,dvr,rem ; 19th divide step 115 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 116 1.1 fredette ds rem,dvr,rem ; 20th divide step 117 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 118 1.1 fredette ds rem,dvr,rem ; 21st divide step 119 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 120 1.1 fredette ds rem,dvr,rem ; 22nd divide step 121 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 122 1.1 fredette ds rem,dvr,rem ; 23rd divide step 123 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 124 1.1 fredette ds rem,dvr,rem ; 24th divide step 125 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 126 1.1 fredette ds rem,dvr,rem ; 25th divide step 127 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 128 1.1 fredette ds rem,dvr,rem ; 26th divide step 129 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 130 1.1 fredette ds rem,dvr,rem ; 27th divide step 131 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 132 1.1 fredette ds rem,dvr,rem ; 28th divide step 133 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 134 1.1 fredette ds rem,dvr,rem ; 29th divide step 135 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 136 1.1 fredette ds rem,dvr,rem ; 30th divide step 137 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 138 1.1 fredette ds rem,dvr,rem ; 31st divide step 139 1.1 fredette addc quo,quo,quo ; shift quo with/into carry 140 1.1 fredette ds rem,dvr,rem ; 32nd divide step, 141 1.1 fredette addc quo,quo,quo ; shift last quo bit into quo 142 1.1 fredette addb,>=,n rem,0,finish ; branch if pos. rem 143 1.1 fredette add,< dvr,0,0 ; if dvr > 0, add dvr 144 1.1 fredette add,tr rem,dvr,rem ; for correcting rem. 145 1.1 fredette sub rem,dvr,rem ; else subtract dvr 146 1.1 fredette ; 147 1.1 fredette ; end of divide routine 148 1.1 fredette ; 149 1.2 chs finish: stws rem,0(%arg3) ; save remainder in high part 150 1.1 fredette ; of result 151 1.2 chs stws quo,4(%arg3) ; save quotient in low part 152 1.1 fredette ; of result 153 1.2 chs ldws,mb -4(%sp),tp ; restore registers 154 1.2 chs ldws,mb -4(%sp),dvr ; restore registers 155 1.2 chs ldws,mb -4(%sp),quo ; restore registers 156 1.2 chs bv 0(%rp) ; return 157 1.2 chs ldws,mb -4(%sp),rem ; restore registers 158 1.1 fredette ; 159 1.2 chs hibit: ldo 32(0),tp ; initialize loop counter 160 1.1 fredette add quo,quo,quo ; shift high bit into carry 161 1.2 chs loop: addc rem,rem,rem ; shift in high bit of dvdl 162 1.1 fredette addc,<> 0,0,0 ; if bit shifted out of dvdu, 163 1.1 fredette ; want to do subtract 164 1.1 fredette comb,<<,n rem,dvr,nosub ; if upper dividend > dvr, 165 1.1 fredette sub rem,dvr,rem ; subtract and 166 1.1 fredette add,tr dvr,dvr,0 ; set carry 167 1.2 chs nosub: addi 0,0,0 ; otherwise clear carry 168 1.1 fredette addib,> -1,tp,loop ; inc. counter; finished? 169 1.1 fredette addc quo,quo,quo ; shift bit of result into dvdl 170 1.1 fredette b finish+4 ; finish up 171 1.2 chs stws rem,0(%arg3) ; save remainder in high part 172 1.1 fredette ; of result 173 1.1 fredette 174 1.1 fredette EXIT(divu) 175 1.1 fredette .end 176