Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/softint/generic/division.c

    r88d5c1e r9d58539  
    3737#include <division.h>
    3838
    39 #define ABSVAL(x)  ((x) > 0 ? (x) : -(x))
    40 #define SGN(x)     ((x) >= 0 ? 1 : 0)
    41 
    42 static unsigned int divandmod32(unsigned int a, unsigned int b,
    43     unsigned int *remainder)
     39#define ABSVAL(x) ( (x) > 0 ? (x) : -(x))
     40#define SGN(x) ( (x) >= 0 ? 1 : 0 )
     41                                     
     42static unsigned int divandmod32(unsigned int a, unsigned int b, unsigned int *remainder)
    4443{
    4544        unsigned int result;
     
    5453        }
    5554       
    56         if (a < b) {
     55        if ( a < b) {
    5756                *remainder = a;
    5857                return 0;
    5958        }
    60        
    61         for (; steps > 0; steps--) {
     59
     60        for ( ; steps > 0; steps--) {
    6261                /* shift one bit to remainder */
    63                 *remainder = ((*remainder) << 1) | (( a >> 31) & 0x1);
     62                *remainder = ( (*remainder) << 1) | (( a >> 31) & 0x1);
    6463                result <<= 1;
    6564               
    6665                if (*remainder >= b) {
    67                         *remainder -= b;
    68                         result |= 0x1;
     66                                *remainder -= b;
     67                                result |= 0x1;
    6968                }
    7069                a <<= 1;
    7170        }
    72        
     71
    7372        return result;
    7473}
    7574
    76 static unsigned long long divandmod64(unsigned long long a,
    77     unsigned long long b, unsigned long long *remainder)
     75
     76static unsigned long long divandmod64(unsigned long long a, unsigned long long b, unsigned long long *remainder)
    7877{
    7978        unsigned long long result;
    80         int steps = sizeof(unsigned long long) * 8;
     79        int steps = sizeof(unsigned long long) * 8; 
    8180       
    8281        *remainder = 0;
     
    8887        }
    8988       
    90         if (a < b) {
     89        if ( a < b) {
    9190                *remainder = a;
    9291                return 0;
    9392        }
    94        
    95         for (; steps > 0; steps--) {
     93
     94        for ( ; steps > 0; steps--) {
    9695                /* shift one bit to remainder */
    97                 *remainder = ((*remainder) << 1) | ((a >> 63) & 0x1);
     96                *remainder = ( (*remainder) << 1) | ((a >> 63) & 0x1);
    9897                result <<= 1;
    9998               
    10099                if (*remainder >= b) {
    101                         *remainder -= b;
    102                         result |= 0x1;
     100                                *remainder -= b;
     101                                result |= 0x1;
    103102                }
    104103                a <<= 1;
    105104        }
    106        
     105
    107106        return result;
    108107}
    109108
    110109/* 32bit integer division */
    111 int __divsi3(int a, int b)
     110int __divsi3(int a, int b) 
    112111{
    113112        unsigned int rem;
    114         int result = (int) divandmod32(ABSVAL(a), ABSVAL(b), &rem);
     113        int result;
    115114       
    116         if (SGN(a) == SGN(b))
    117                 return result;
    118        
     115        result = (int)divandmod32(ABSVAL(a), ABSVAL(b), &rem);
     116
     117        if ( SGN(a) == SGN(b)) return result;
    119118        return -result;
    120119}
    121120
    122121/* 64bit integer division */
    123 long long __divdi3(long long a, long long b)
     122long long __divdi3(long long a, long long b) 
    124123{
    125124        unsigned long long rem;
    126         long long result = (long long) divandmod64(ABSVAL(a), ABSVAL(b), &rem);
     125        long long result;
    127126       
    128         if (SGN(a) == SGN(b))
    129                 return result;
    130        
     127        result = (long long)divandmod64(ABSVAL(a), ABSVAL(b), &rem);
     128
     129        if ( SGN(a) == SGN(b)) return result;
    131130        return -result;
    132131}
     
    142141unsigned long long __udivdi3(unsigned long long a, unsigned long long b)
    143142{
    144         unsigned long long rem;
     143        unsigned long long  rem;
    145144        return divandmod64(a, b, &rem);
    146145}
     
    153152       
    154153        /* if divident is negative, remainder must be too */
    155         if (!(SGN(a)))
    156                 return -((int) rem);
     154        if (!(SGN(a))) {
     155                return -((int)rem);
     156        }
    157157       
    158         return (int) rem;
     158        return (int)rem;
    159159}
    160160
    161161/* 64bit remainder of the signed division */
    162 long long __moddi3(long long a, long long b)
     162long long __moddi3(long long a,long long b)
    163163{
    164164        unsigned long long rem;
     
    166166       
    167167        /* if divident is negative, remainder must be too */
    168         if (!(SGN(a)))
    169                 return -((long long) rem);
     168        if (!(SGN(a))) {
     169                return -((long long)rem);
     170        }
    170171       
    171         return (long long) rem;
     172        return (long long)rem;
    172173}
    173174
     
    188189}
    189190
    190 int __divmodsi3(int a, int b, int *c)
    191 {
    192         unsigned int rem;
    193         int result = (int) divandmod32(ABSVAL(a), ABSVAL(b), &rem);
    194        
    195         if (SGN(a) == SGN(b)) {
    196                 *c = rem;
    197                 return result;
    198         }
    199        
    200         *c = -rem;
    201         return -result;
    202 }
    203 
    204 unsigned int __udivmodsi3(unsigned int a, unsigned int b,
    205     unsigned int *c)
    206 {
    207         return divandmod32(a, b, c);
    208 }
    209 
    210 long long __divmoddi3(long long a, long long b, long long *c)
    211 {
    212         unsigned long long rem;
    213         long long result = (int) divandmod64(ABSVAL(a), ABSVAL(b), &rem);
    214        
    215         if (SGN(a) == SGN(b)) {
    216                 *c = rem;
    217                 return result;
    218         }
    219        
    220         *c = -rem;
    221         return -result;
    222 }
    223 
    224 unsigned long long __udivmoddi3(unsigned long long a, unsigned long long b,
    225     unsigned long long *c)
     191unsigned long long __udivmoddi3(unsigned long long a, unsigned long long b, unsigned long long *c)
    226192{
    227193        return divandmod64(a, b, c);
Note: See TracChangeset for help on using the changeset viewer.