/*************************************************************************** * Copyright (c) 2002-2009, Broadcom Corporation * All Rights Reserved * Confidential Property of Broadcom Corporation * * THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE * AGREEMENT BETWEEN THE USER AND BROADCOM. YOU HAVE NO RIGHT TO USE OR * EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT. * * Filename: mp2_smalldiv.c * ***************************************************************************/ #include "mp2.h" /* smalldiv returns 'q' and 'r' so q = (hi*RADIX + lo)/d; r = (hi*RADIX + lo)%d; Assumes 0 <= hi < d < RADIX and 0 <= lo < RADIX. */ int smalldiv (u32 hi, u32 lo, u32 d, u32 *q, u32 *r) { register u32 tmp; register u32 i; register u32 numbits = (NBITS << 1); register u32 lr = 0; register u32 lq = 0; if (d==0L) return 0; //printf("x= %d, hi = %x (%d), lo= %x (%d), d= %x (%d)\n", hi*RADIX+lo, hi, hi, lo, lo, d, d); if (hi) { while ( (tmp=((lr << 1) | ((hi & MSBMASK) >> NBITSM1))) < d ) { lr = tmp; hi = (hi << 1) & RADIXM;; lo <<= 1; if (lo>=RADIX) { hi |= 0x00000001L; lo &= RADIXM; } numbits--; //printf("x = %d, hi= %x (%d), lo= %x (%d), lr= %x (%d), numbits= %d\n", // hi*RADIX+lo, hi, hi, lo, lo, lr, lr, numbits); } for (i=0; i> NBITSM1); lq = (lq << 1) & RADIXM; //printf("i= %d, lq = %x (%d), lr= %x (%d)\n", i, lq, lq, lr,lr); if (lr >= d) { //printf ("lr > d: lr= %x (%d), d= %d\n", lr, lr, d); lq |= 1; lr -= d; //printf ("lr > d: lq= %x (%d), lr= %x (%d)\n", lq, lq, lr, lr); } hi = (hi << 1) & RADIXM;; lo <<= 1; if (lo>=RADIX) { hi |= 0x00000001L; lo &= RADIXM; } //printf("x << 1: hi= %x (%d), lo= %x (%d)\n", hi, hi, lo, lo); } } else { lr = lo % d; lq = lo / d; } //printf("lq= %d, lr= %d\n", lq, lr); *r = lr; *q = lq; return 1; }