Subversion Repositories HelenOS

Rev

Rev 2071 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2071 Rev 2505
Line 35... Line 35...
35
#include <genarch/softint/division.h>
35
#include <genarch/softint/division.h>
36
 
36
 
37
#define ABSVAL(x) ( (x) > 0 ? (x) : -(x))
37
#define ABSVAL(x) ((x) > 0 ? (x) : -(x))
38
#define SGN(x) ( (x) >= 0 ? 1 : 0 )
38
#define SGN(x) ((x) >= 0 ? 1 : 0)
39
                     
39
                     
40
static unsigned int divandmod32(unsigned int a, unsigned int b, unsigned int *remainder)
40
static unsigned int divandmod32(unsigned int a, unsigned int b,
-
 
41
    unsigned int *remainder)
41
{
42
{
42
    unsigned int result;
43
    unsigned int result;
43
    int steps = sizeof(unsigned int) * 8;
44
    int steps = sizeof(unsigned int) * 8;
44
   
45
   
45
    *remainder = 0;
46
    *remainder = 0;
Line 69... Line 70...
69
 
70
 
70
    return result;
71
    return result;
71
}
72
}
72
 
73
 
73
 
74
 
74
static unsigned long long divandmod64(unsigned long long a, unsigned long long b, unsigned long long *remainder)
75
static unsigned long long divandmod64(unsigned long long a,
-
 
76
    unsigned long long b, unsigned long long *remainder)
75
{
77
{
76
    unsigned long long result;
78
    unsigned long long result;
77
    int steps = sizeof(unsigned long long) * 8;
79
    int steps = sizeof(unsigned long long) * 8;
78
   
80
   
79
    *remainder = 0;
81
    *remainder = 0;
Line 110... Line 112...
110
    unsigned int rem;
112
    unsigned int rem;
111
    int result;
113
    int result;
112
   
114
   
113
    result = (int)divandmod32(ABSVAL(a), ABSVAL(b), &rem);
115
    result = (int) divandmod32(ABSVAL(a), ABSVAL(b), &rem);
114
 
116
 
115
    if ( SGN(a) == SGN(b)) return result;
117
    if (SGN(a) == SGN(b))
-
 
118
        return result;
116
    return -result;
119
    return -result;
117
}
120
}
118
 
121
 
119
/* 64bit integer division */
122
/* 64bit integer division */
120
long long __divdi3(long long a, long long b)
123
long long __divdi3(long long a, long long b)
Line 122... Line 125...
122
    unsigned long long rem;
125
    unsigned long long rem;
123
    long long result;
126
    long long result;
124
   
127
   
125
    result = (long long)divandmod64(ABSVAL(a), ABSVAL(b), &rem);
128
    result = (long long) divandmod64(ABSVAL(a), ABSVAL(b), &rem);
126
 
129
 
127
    if ( SGN(a) == SGN(b)) return result;
130
    if (SGN(a) == SGN(b))
-
 
131
        return result;
128
    return -result;
132
    return -result;
129
}
133
}
130
 
134
 
131
/* 32bit unsigned integer division */
135
/* 32bit unsigned integer division */
132
unsigned int __udivsi3(unsigned int a, unsigned int b)
136
unsigned int __udivsi3(unsigned int a, unsigned int b)
Line 184... Line 188...
184
    unsigned long long rem;
188
    unsigned long long rem;
185
    divandmod64(a, b, &rem);
189
    divandmod64(a, b, &rem);
186
    return rem;
190
    return rem;
187
}
191
}
188
 
192
 
189
unsigned long long __udivmoddi3(unsigned long long a, unsigned long long b, unsigned long long *c)
193
unsigned long long __udivmoddi3(unsigned long long a, unsigned long long b,
-
 
194
    unsigned long long *c)
190
{
195
{
191
    return divandmod64(a, b, c);
196
    return divandmod64(a, b, c);
192
}
197
}
193
 
198
 
194
/** @}
199
/** @}