194b212c2SPaul Mackerras/* 294b212c2SPaul Mackerras * Divide a 64-bit unsigned number by a 32-bit unsigned number. 394b212c2SPaul Mackerras * This routine assumes that the top 32 bits of the dividend are 494b212c2SPaul Mackerras * non-zero to start with. 594b212c2SPaul Mackerras * On entry, r3 points to the dividend, which get overwritten with 694b212c2SPaul Mackerras * the 64-bit quotient, and r4 contains the divisor. 794b212c2SPaul Mackerras * On exit, r3 contains the remainder. 894b212c2SPaul Mackerras * 994b212c2SPaul Mackerras * Copyright (C) 2002 Paul Mackerras, IBM Corp. 1094b212c2SPaul Mackerras * 1194b212c2SPaul Mackerras * This program is free software; you can redistribute it and/or 1294b212c2SPaul Mackerras * modify it under the terms of the GNU General Public License 1394b212c2SPaul Mackerras * as published by the Free Software Foundation; either version 1494b212c2SPaul Mackerras * 2 of the License, or (at your option) any later version. 1594b212c2SPaul Mackerras */ 1694b212c2SPaul Mackerras#include "ppc_asm.h" 1794b212c2SPaul Mackerras 1894b212c2SPaul Mackerras .globl __div64_32 1994b212c2SPaul Mackerras__div64_32: 2094b212c2SPaul Mackerras lwz r5,0(r3) # get the dividend into r5/r6 2194b212c2SPaul Mackerras lwz r6,4(r3) 2294b212c2SPaul Mackerras cmplw r5,r4 2394b212c2SPaul Mackerras li r7,0 2494b212c2SPaul Mackerras li r8,0 2594b212c2SPaul Mackerras blt 1f 2694b212c2SPaul Mackerras divwu r7,r5,r4 # if dividend.hi >= divisor, 2794b212c2SPaul Mackerras mullw r0,r7,r4 # quotient.hi = dividend.hi / divisor 2894b212c2SPaul Mackerras subf. r5,r0,r5 # dividend.hi %= divisor 2994b212c2SPaul Mackerras beq 3f 3094b212c2SPaul Mackerras1: mr r11,r5 # here dividend.hi != 0 3194b212c2SPaul Mackerras andis. r0,r5,0xc000 3294b212c2SPaul Mackerras bne 2f 3394b212c2SPaul Mackerras cntlzw r0,r5 # we are shifting the dividend right 3494b212c2SPaul Mackerras li r10,-1 # to make it < 2^32, and shifting 3594b212c2SPaul Mackerras srw r10,r10,r0 # the divisor right the same amount, 36*acbfd58eSBenjamin Herrenschmidt addc r9,r4,r10 # rounding up (so the estimate cannot 3794b212c2SPaul Mackerras andc r11,r6,r10 # ever be too large, only too small) 3894b212c2SPaul Mackerras andc r9,r9,r10 39*acbfd58eSBenjamin Herrenschmidt addze r9,r9 4094b212c2SPaul Mackerras or r11,r5,r11 4194b212c2SPaul Mackerras rotlw r9,r9,r0 4294b212c2SPaul Mackerras rotlw r11,r11,r0 4394b212c2SPaul Mackerras divwu r11,r11,r9 # then we divide the shifted quantities 4494b212c2SPaul Mackerras2: mullw r10,r11,r4 # to get an estimate of the quotient, 4594b212c2SPaul Mackerras mulhwu r9,r11,r4 # multiply the estimate by the divisor, 4694b212c2SPaul Mackerras subfc r6,r10,r6 # take the product from the divisor, 4794b212c2SPaul Mackerras add r8,r8,r11 # and add the estimate to the accumulated 4894b212c2SPaul Mackerras subfe. r5,r9,r5 # quotient 4994b212c2SPaul Mackerras bne 1b 5094b212c2SPaul Mackerras3: cmplw r6,r4 5194b212c2SPaul Mackerras blt 4f 5294b212c2SPaul Mackerras divwu r0,r6,r4 # perform the remaining 32-bit division 5394b212c2SPaul Mackerras mullw r10,r0,r4 # and get the remainder 5494b212c2SPaul Mackerras add r8,r8,r0 5594b212c2SPaul Mackerras subf r6,r10,r6 5694b212c2SPaul Mackerras4: stw r7,0(r3) # return the quotient in *r3 5794b212c2SPaul Mackerras stw r8,4(r3) 5894b212c2SPaul Mackerras mr r3,r6 # return the remainder in r3 5994b212c2SPaul Mackerras blr 60