Rev 2071 | Go to most recent revision | 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 | /** @} |