Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/softint/division.c

    rc7afcba7 r9d58539  
    2727 */
    2828
    29 /** @addtogroup genarch
     29/** @addtogroup genarch 
    3030 * @{
    3131 */
     
    3535#include <genarch/softint/division.h>
    3636
    37 #define ABSVAL(x)  ((x) > 0 ? (x) : -(x))
    38 #define SGN(x)     ((x) >= 0 ? 1 : 0)
    39 
     37#define ABSVAL(x) ((x) > 0 ? (x) : -(x))
     38#define SGN(x) ((x) >= 0 ? 1 : 0)
     39                                     
    4040static unsigned int divandmod32(unsigned int a, unsigned int b,
    4141    unsigned int *remainder)
     
    5656                return 0;
    5757        }
    58        
     58
    5959        for (; steps > 0; steps--) {
    6060                /* shift one bit to remainder */
     
    6868                a <<= 1;
    6969        }
    70        
     70
    7171        return result;
    7272}
     73
    7374
    7475static unsigned long long divandmod64(unsigned long long a,
     
    7677{
    7778        unsigned long long result;
    78         int steps = sizeof(unsigned long long) * 8;
     79        int steps = sizeof(unsigned long long) * 8; 
    7980       
    8081        *remainder = 0;
     
    9091                return 0;
    9192        }
    92        
     93
    9394        for (; steps > 0; steps--) {
    9495                /* shift one bit to remainder */
     
    102103                a <<= 1;
    103104        }
    104        
     105
    105106        return result;
    106107}
    107108
    108109/* 32bit integer division */
    109 int __divsi3(int a, int b)
    110 {
    111         unsigned int rem;
    112         int result = (int) divandmod32(ABSVAL(a), ABSVAL(b), &rem);
    113        
     110int __divsi3(int a, int b)
     111{
     112        unsigned int rem;
     113        int result;
     114       
     115        result = (int) divandmod32(ABSVAL(a), ABSVAL(b), &rem);
     116
    114117        if (SGN(a) == SGN(b))
    115118                return result;
    116        
    117119        return -result;
    118120}
    119121
    120122/* 64bit integer division */
    121 long long __divdi3(long long a, long long b)
     123long long __divdi3(long long a, long long b) 
    122124{
    123125        unsigned long long rem;
    124         long long result = (long long) divandmod64(ABSVAL(a), ABSVAL(b), &rem);
    125        
     126        long long result;
     127       
     128        result = (long long) divandmod64(ABSVAL(a), ABSVAL(b), &rem);
     129
    126130        if (SGN(a) == SGN(b))
    127131                return result;
    128        
    129132        return -result;
    130133}
     
    140143unsigned long long __udivdi3(unsigned long long a, unsigned long long b)
    141144{
    142         unsigned long long rem;
     145        unsigned long long  rem;
    143146        return divandmod64(a, b, &rem);
    144147}
     
    151154       
    152155        /* if divident is negative, remainder must be too */
    153         if (!(SGN(a)))
     156        if (!(SGN(a))) {
    154157                return -((int) rem);
     158        }
    155159       
    156160        return (int) rem;
     
    158162
    159163/* 64bit remainder of the signed division */
    160 long long __moddi3(long long a, long long b)
     164long long __moddi3(long long a,long long b)
    161165{
    162166        unsigned long long rem;
     
    164168       
    165169        /* if divident is negative, remainder must be too */
    166         if (!(SGN(a)))
     170        if (!(SGN(a))) {
    167171                return -((long long) rem);
     172        }
    168173       
    169174        return (long long) rem;
     
    186191}
    187192
    188 int __divmodsi3(int a, int b, int *c)
    189 {
    190         unsigned int rem;
    191         int result = (int) divandmod32(ABSVAL(a), ABSVAL(b), &rem);
    192        
    193         if (SGN(a) == SGN(b)) {
    194                 *c = rem;
    195                 return result;
    196         }
    197        
    198         *c = -rem;
    199         return -result;
    200 }
    201 
    202 unsigned int __udivmodsi3(unsigned int a, unsigned int b,
    203     unsigned int *c)
    204 {
    205         return divandmod32(a, b, c);
    206 }
    207 
    208 long long __divmoddi3(long long a, long long b, long long *c)
    209 {
    210         unsigned long long rem;
    211         long long result = (int) divandmod64(ABSVAL(a), ABSVAL(b), &rem);
    212        
    213         if (SGN(a) == SGN(b)) {
    214                 *c = rem;
    215                 return result;
    216         }
    217        
    218         *c = -rem;
    219         return -result;
    220 }
    221 
    222193unsigned long long __udivmoddi3(unsigned long long a, unsigned long long b,
    223194    unsigned long long *c)
Note: See TracChangeset for help on using the changeset viewer.