Changes in kernel/genarch/src/softint/division.c [1b20da0:a35b458] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/softint/division.c
r1b20da0 ra35b458 43 43 unsigned int result; 44 44 int steps = sizeof(unsigned int) * 8; 45 45 46 46 *remainder = 0; 47 47 result = 0; 48 48 49 49 if (b == 0) { 50 50 /* FIXME: division by zero */ 51 51 return 0; 52 52 } 53 53 54 54 if (a < b) { 55 55 *remainder = a; 56 56 return 0; 57 57 } 58 58 59 59 for (; steps > 0; steps--) { 60 60 /* shift one bit to remainder */ 61 61 *remainder = ((*remainder) << 1) | (( a >> 31) & 0x1); 62 62 result <<= 1; 63 63 64 64 if (*remainder >= b) { 65 65 *remainder -= b; … … 68 68 a <<= 1; 69 69 } 70 70 71 71 return result; 72 72 } … … 77 77 unsigned long long result; 78 78 int steps = sizeof(unsigned long long) * 8; 79 79 80 80 *remainder = 0; 81 81 result = 0; 82 82 83 83 if (b == 0) { 84 84 /* FIXME: division by zero */ 85 85 return 0; 86 86 } 87 87 88 88 if (a < b) { 89 89 *remainder = a; 90 90 return 0; 91 91 } 92 92 93 93 for (; steps > 0; steps--) { 94 94 /* shift one bit to remainder */ 95 95 *remainder = ((*remainder) << 1) | ((a >> 63) & 0x1); 96 96 result <<= 1; 97 97 98 98 if (*remainder >= b) { 99 99 *remainder -= b; … … 102 102 a <<= 1; 103 103 } 104 104 105 105 return result; 106 106 } … … 111 111 unsigned int rem; 112 112 int result = (int) divandmod32(ABSVAL(a), ABSVAL(b), &rem); 113 113 114 114 if (SGN(a) == SGN(b)) 115 115 return result; 116 116 117 117 return -result; 118 118 } … … 123 123 unsigned long long rem; 124 124 long long result = (long long) divandmod64(ABSVAL(a), ABSVAL(b), &rem); 125 125 126 126 if (SGN(a) == SGN(b)) 127 127 return result; 128 128 129 129 return -result; 130 130 } … … 149 149 unsigned int rem; 150 150 divandmod32(a, b, &rem); 151 151 152 152 /* if divident is negative, remainder must be too */ 153 153 if (!(SGN(a))) 154 154 return -((int) rem); 155 155 156 156 return (int) rem; 157 157 } … … 162 162 unsigned long long rem; 163 163 divandmod64(a, b, &rem); 164 164 165 165 /* if divident is negative, remainder must be too */ 166 166 if (!(SGN(a))) 167 167 return -((long long) rem); 168 168 169 169 return (long long) rem; 170 170 } … … 190 190 unsigned int rem; 191 191 int result = (int) divandmod32(ABSVAL(a), ABSVAL(b), &rem); 192 192 193 193 if (SGN(a) == SGN(b)) { 194 194 *c = rem; 195 195 return result; 196 196 } 197 197 198 198 *c = -rem; 199 199 return -result; … … 210 210 unsigned long long rem; 211 211 long long result = (int) divandmod64(ABSVAL(a), ABSVAL(b), &rem); 212 212 213 213 if (SGN(a) == SGN(b)) { 214 214 *c = rem; 215 215 return result; 216 216 } 217 217 218 218 *c = -rem; 219 219 return -result;
Note:
See TracChangeset
for help on using the changeset viewer.