source: svn/trunk/newcon3bcm2_21bu/dta/src/bootloader/rsa/mp2_smalldiv.c

Last change on this file was 2, checked in by jglee, 11 years ago

first commit

  • Property svn:executable set to *
File size: 2.0 KB
Line 
1/***************************************************************************
2 *     Copyright (c) 2002-2009, Broadcom Corporation
3 *     All Rights Reserved
4 *     Confidential Property of Broadcom Corporation
5 *
6 *  THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE
7 *  AGREEMENT  BETWEEN THE USER AND BROADCOM.  YOU HAVE NO RIGHT TO USE OR
8 *  EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT.
9 *
10 * Filename: mp2_smalldiv.c
11 *
12 ***************************************************************************/
13
14#include "mp2.h"
15
16/*
17        smalldiv returns 'q' and 'r' so
18
19        q = (hi*RADIX + lo)/d;
20        r = (hi*RADIX + lo)%d;
21 
22        Assumes 0 <= hi < d < RADIX and 0 <= lo < RADIX.
23*/
24int smalldiv (u32 hi, u32 lo, u32 d, u32 *q, u32 *r)
25{
26        register u32 tmp; 
27        register u32 i; 
28        register u32 numbits = (NBITS << 1); 
29
30        register u32 lr = 0;
31        register u32 lq = 0; 
32
33        if (d==0L) return 0;
34       
35        //printf("x= %d, hi = %x (%d), lo= %x (%d), d= %x (%d)\n", hi*RADIX+lo, hi, hi, lo, lo, d, d);
36        if (hi)
37        {
38                while ( (tmp=((lr << 1) | ((hi & MSBMASK) >> NBITSM1))) < d )
39                {
40                        lr = tmp; 
41                        hi = (hi << 1) & RADIXM;;
42                        lo <<= 1;
43                        if (lo>=RADIX) 
44                        {
45                                hi |= 0x00000001L;
46                                lo &= RADIXM;
47                        }
48                        numbits--;
49                        //printf("x = %d, hi= %x (%d), lo= %x (%d), lr= %x (%d), numbits= %d\n",
50                        //              hi*RADIX+lo, hi, hi, lo, lo, lr, lr, numbits);
51                }
52                for (i=0; i<numbits; i++)
53                {
54                        lr = (lr << 1) | ((hi & MSBMASK) >> NBITSM1);
55                        lq = (lq << 1) & RADIXM;
56                        //printf("i= %d, lq = %x (%d), lr= %x (%d)\n", i, lq, lq, lr,lr);
57                        if (lr >= d) 
58                        {
59                                //printf ("lr > d: lr= %x (%d), d= %d\n", lr, lr, d);
60                                lq |= 1;
61                                lr -= d;
62                                //printf ("lr > d: lq= %x (%d), lr= %x (%d)\n", lq, lq, lr, lr);
63                        }
64               
65                        hi = (hi << 1) & RADIXM;;
66                        lo <<= 1;
67                        if (lo>=RADIX) 
68                        {
69                                hi |= 0x00000001L;
70                                lo &= RADIXM;
71                        }
72                        //printf("x << 1: hi= %x (%d), lo= %x (%d)\n", hi, hi, lo, lo);
73                }
74        }
75        else
76        {
77                lr = lo % d;
78                lq = lo / d;
79        }
80        //printf("lq= %d, lr= %d\n", lq, lr);
81        *r = lr; 
82        *q = lq;
83
84        return 1;
85}
86
Note: See TracBrowser for help on using the repository browser.