1*95e1ffb1Schristos/* $NetBSD: divu.S,v 1.3 2005/12/11 12:17:40 christos Exp $ */ 2f4f0d8a3Sfredette 3f4f0d8a3Sfredette/* $OpenBSD: divu.S,v 1.5 2001/03/29 03:58:18 mickey Exp $ */ 4f4f0d8a3Sfredette 5f4f0d8a3Sfredette/* 6f4f0d8a3Sfredette * Copyright 1996 1995 by Open Software Foundation, Inc. 7f4f0d8a3Sfredette * All Rights Reserved 8f4f0d8a3Sfredette * 9f4f0d8a3Sfredette * Permission to use, copy, modify, and distribute this software and 10f4f0d8a3Sfredette * its documentation for any purpose and without fee is hereby granted, 11f4f0d8a3Sfredette * provided that the above copyright notice appears in all copies and 12f4f0d8a3Sfredette * that both the copyright notice and this permission notice appear in 13f4f0d8a3Sfredette * supporting documentation. 14f4f0d8a3Sfredette * 15f4f0d8a3Sfredette * OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 16f4f0d8a3Sfredette * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 17f4f0d8a3Sfredette * FOR A PARTICULAR PURPOSE. 18f4f0d8a3Sfredette * 19f4f0d8a3Sfredette * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 20f4f0d8a3Sfredette * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 21f4f0d8a3Sfredette * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 22f4f0d8a3Sfredette * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 23f4f0d8a3Sfredette * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 24f4f0d8a3Sfredette * 25f4f0d8a3Sfredette */ 26f4f0d8a3Sfredette/* 27f4f0d8a3Sfredette * pmk1.1 28f4f0d8a3Sfredette */ 29f4f0d8a3Sfredette/* 30f4f0d8a3Sfredette * (c) Copyright 1986 HEWLETT-PACKARD COMPANY 31f4f0d8a3Sfredette * 32f4f0d8a3Sfredette * To anyone who acknowledges that this file is provided "AS IS" 33f4f0d8a3Sfredette * without any express or implied warranty: 34f4f0d8a3Sfredette * permission to use, copy, modify, and distribute this file 35f4f0d8a3Sfredette * for any purpose is hereby granted without fee, provided that 36f4f0d8a3Sfredette * the above copyright notice and this notice appears in all 37f4f0d8a3Sfredette * copies, and that the name of Hewlett-Packard Company not be 38f4f0d8a3Sfredette * used in advertising or publicity pertaining to distribution 39f4f0d8a3Sfredette * of the software without specific, written prior permission. 40f4f0d8a3Sfredette * Hewlett-Packard Company makes no representations about the 41f4f0d8a3Sfredette * suitability of this software for any purpose. 42f4f0d8a3Sfredette */ 43f4f0d8a3Sfredette 44f4f0d8a3Sfredette#include <machine/asm.h> 45f4f0d8a3Sfredette 46f4f0d8a3Sfredette/************************************************************************** 47f4f0d8a3Sfredette * Implement an integer divide routine for 32-bit operands and 32-bit quotient 48f4f0d8a3Sfredette * and remainder with operand values of zero (divisor only) treated specially. 49f4f0d8a3Sfredette * 50f4f0d8a3Sfredette ***************************************************************************/ 51f4f0d8a3Sfredette/* 52f4f0d8a3Sfredette * General registers 53f4f0d8a3Sfredette */ 5406332c88Schsgr0: .reg %r0 /* General register zero */ 5506332c88Schsrem: .reg %r3 /* remainder and upper part of dividend */ 5606332c88Schsquo: .reg %r4 /* quotient and lower part of dividend */ 5706332c88Schsdvr: .reg %r5 /* divisor */ 5806332c88Schstp: .reg %r6 /* temp. reg. */ 59f4f0d8a3Sfredette 60f4f0d8a3Sfredette .text 61f4f0d8a3Sfredette 62f4f0d8a3Sfredette/*****************************************************************************/ 63f4f0d8a3SfredetteENTRY(divu,16) 6406332c88Schs stws,ma rem,4(%sp) ; save registers on stack 6506332c88Schs stws,ma quo,4(%sp) ; save registers on stack 6606332c88Schs stws,ma dvr,4(%sp) ; save registers on stack 6706332c88Schs stws,ma tp,4(%sp) ; save registers on stack 68f4f0d8a3Sfredette 6906332c88Schs addi 0,%arg2,dvr ; get divisor 7006332c88Schs addi 0,%arg1,quo ; get lower dividend 7106332c88Schs addi 0,%arg0,rem ; get upper dividend 72f4f0d8a3Sfredette 73f4f0d8a3Sfredette comib,>,n 0,dvr,hibit ; check for dvr >= 2**31 74f4f0d8a3Sfredette addi -1,gr0,tp ; set V-bit to 1 75f4f0d8a3Sfredette ds 0,tp,0 76f4f0d8a3Sfredette add quo,quo,quo ; shift msb bit into carry 77f4f0d8a3Sfredette ds rem,dvr,rem ; 1st divide step, if carry 78f4f0d8a3Sfredette ; out, msb of quotient = 0 79f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 80f4f0d8a3Sfredette ds rem,dvr,rem ; 2nd divide step 81f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 82f4f0d8a3Sfredette ds rem,dvr,rem ; 3rd divide step 83f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 84f4f0d8a3Sfredette ds rem,dvr,rem ; 4th divide step 85f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 86f4f0d8a3Sfredette ds rem,dvr,rem ; 5th divide step 87f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 88f4f0d8a3Sfredette ds rem,dvr,rem ; 6th divide step 89f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 90f4f0d8a3Sfredette ds rem,dvr,rem ; 7th divide step 91f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 92f4f0d8a3Sfredette ds rem,dvr,rem ; 8th divide step 93f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 94f4f0d8a3Sfredette ds rem,dvr,rem ; 9th divide step 95f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 96f4f0d8a3Sfredette ds rem,dvr,rem ; 10th divide step 97f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 98f4f0d8a3Sfredette ds rem,dvr,rem ; 11th divide step 99f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 100f4f0d8a3Sfredette ds rem,dvr,rem ; 12th divide step 101f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 102f4f0d8a3Sfredette ds rem,dvr,rem ; 13th divide step 103f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 104f4f0d8a3Sfredette ds rem,dvr,rem ; 14th divide step 105f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 106f4f0d8a3Sfredette ds rem,dvr,rem ; 15th divide step 107f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 108f4f0d8a3Sfredette ds rem,dvr,rem ; 16th divide step 109f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 110f4f0d8a3Sfredette ds rem,dvr,rem ; 17th divide step 111f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 112f4f0d8a3Sfredette ds rem,dvr,rem ; 18th divide step 113f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 114f4f0d8a3Sfredette ds rem,dvr,rem ; 19th divide step 115f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 116f4f0d8a3Sfredette ds rem,dvr,rem ; 20th divide step 117f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 118f4f0d8a3Sfredette ds rem,dvr,rem ; 21st divide step 119f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 120f4f0d8a3Sfredette ds rem,dvr,rem ; 22nd divide step 121f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 122f4f0d8a3Sfredette ds rem,dvr,rem ; 23rd divide step 123f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 124f4f0d8a3Sfredette ds rem,dvr,rem ; 24th divide step 125f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 126f4f0d8a3Sfredette ds rem,dvr,rem ; 25th divide step 127f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 128f4f0d8a3Sfredette ds rem,dvr,rem ; 26th divide step 129f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 130f4f0d8a3Sfredette ds rem,dvr,rem ; 27th divide step 131f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 132f4f0d8a3Sfredette ds rem,dvr,rem ; 28th divide step 133f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 134f4f0d8a3Sfredette ds rem,dvr,rem ; 29th divide step 135f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 136f4f0d8a3Sfredette ds rem,dvr,rem ; 30th divide step 137f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 138f4f0d8a3Sfredette ds rem,dvr,rem ; 31st divide step 139f4f0d8a3Sfredette addc quo,quo,quo ; shift quo with/into carry 140f4f0d8a3Sfredette ds rem,dvr,rem ; 32nd divide step, 141f4f0d8a3Sfredette addc quo,quo,quo ; shift last quo bit into quo 142f4f0d8a3Sfredette addb,>=,n rem,0,finish ; branch if pos. rem 143f4f0d8a3Sfredette add,< dvr,0,0 ; if dvr > 0, add dvr 144f4f0d8a3Sfredette add,tr rem,dvr,rem ; for correcting rem. 145f4f0d8a3Sfredette sub rem,dvr,rem ; else subtract dvr 146f4f0d8a3Sfredette; 147f4f0d8a3Sfredette; end of divide routine 148f4f0d8a3Sfredette; 14906332c88Schsfinish: stws rem,0(%arg3) ; save remainder in high part 150f4f0d8a3Sfredette ; of result 15106332c88Schs stws quo,4(%arg3) ; save quotient in low part 152f4f0d8a3Sfredette ; of result 15306332c88Schs ldws,mb -4(%sp),tp ; restore registers 15406332c88Schs ldws,mb -4(%sp),dvr ; restore registers 15506332c88Schs ldws,mb -4(%sp),quo ; restore registers 15606332c88Schs bv 0(%rp) ; return 15706332c88Schs ldws,mb -4(%sp),rem ; restore registers 158f4f0d8a3Sfredette; 15906332c88Schshibit: ldo 32(0),tp ; initialize loop counter 160f4f0d8a3Sfredette add quo,quo,quo ; shift high bit into carry 16106332c88Schsloop: addc rem,rem,rem ; shift in high bit of dvdl 162f4f0d8a3Sfredette addc,<> 0,0,0 ; if bit shifted out of dvdu, 163f4f0d8a3Sfredette ; want to do subtract 164f4f0d8a3Sfredette comb,<<,n rem,dvr,nosub ; if upper dividend > dvr, 165f4f0d8a3Sfredette sub rem,dvr,rem ; subtract and 166f4f0d8a3Sfredette add,tr dvr,dvr,0 ; set carry 16706332c88Schsnosub: addi 0,0,0 ; otherwise clear carry 168f4f0d8a3Sfredette addib,> -1,tp,loop ; inc. counter; finished? 169f4f0d8a3Sfredette addc quo,quo,quo ; shift bit of result into dvdl 170f4f0d8a3Sfredette b finish+4 ; finish up 17106332c88Schs stws rem,0(%arg3) ; save remainder in high part 172f4f0d8a3Sfredette ; of result 173f4f0d8a3Sfredette 174f4f0d8a3SfredetteEXIT(divu) 175f4f0d8a3Sfredette .end 176