/* SPDX-License-Identifier: GPL-2.0-or-later */1/*2* Divide a 64-bit unsigned number by a 32-bit unsigned number.3* This routine assumes that the top 32 bits of the dividend are4* non-zero to start with.5* On entry, r3 points to the dividend, which get overwritten with6* the 64-bit quotient, and r4 contains the divisor.7* On exit, r3 contains the remainder.8*9* Copyright (C) 2002 Paul Mackerras, IBM Corp.10*/11#include <asm/ppc_asm.h>12#include <asm/processor.h>1314_GLOBAL(__div64_32)15lwz r5,0(r3) # get the dividend into r5/r616lwz r6,4(r3)17cmplw r5,r418li r7,019li r8,020blt 1f21divwu r7,r5,r4 # if dividend.hi >= divisor,22mullw r0,r7,r4 # quotient.hi = dividend.hi / divisor23subf. r5,r0,r5 # dividend.hi %= divisor24beq 3f251: mr r11,r5 # here dividend.hi != 026andis. r0,r5,0xc00027bne 2f28cntlzw r0,r5 # we are shifting the dividend right29li r10,-1 # to make it < 2^32, and shifting30srw r10,r10,r0 # the divisor right the same amount,31addc r9,r4,r10 # rounding up (so the estimate cannot32andc r11,r6,r10 # ever be too large, only too small)33andc r9,r9,r1034addze r9,r935or r11,r5,r1136rotlw r9,r9,r037rotlw r11,r11,r038divwu r11,r11,r9 # then we divide the shifted quantities392: mullw r10,r11,r4 # to get an estimate of the quotient,40mulhwu r9,r11,r4 # multiply the estimate by the divisor,41subfc r6,r10,r6 # take the product from the divisor,42add r8,r8,r11 # and add the estimate to the accumulated43subfe. r5,r9,r5 # quotient44bne 1b453: cmplw r6,r446blt 4f47divwu r0,r6,r4 # perform the remaining 32-bit division48mullw r10,r0,r4 # and get the remainder49add r8,r8,r050subf r6,r10,r6514: stw r7,0(r3) # return the quotient in *r352stw r8,4(r3)53mr r3,r6 # return the remainder in r354blr555657