Changeset a35b458 in mainline for boot/genarch/src/division.c
- Timestamp:
- 2018-03-02T20:10:49Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/genarch/src/division.c
r3061bc1 ra35b458 40 40 unsigned int result; 41 41 int steps = sizeof(unsigned int) * 8; 42 42 43 43 *remainder = 0; 44 44 result = 0; 45 45 46 46 if (b == 0) { 47 47 /* FIXME: division by zero */ 48 48 return 0; 49 49 } 50 50 51 51 if (a < b) { 52 52 *remainder = a; 53 53 return 0; 54 54 } 55 55 56 56 for (; steps > 0; steps--) { 57 57 /* shift one bit to remainder */ 58 58 *remainder = ((*remainder) << 1) | (( a >> 31) & 0x1); 59 59 result <<= 1; 60 60 61 61 if (*remainder >= b) { 62 62 *remainder -= b; … … 65 65 a <<= 1; 66 66 } 67 67 68 68 return result; 69 69 } … … 74 74 unsigned long long result; 75 75 int steps = sizeof(unsigned long long) * 8; 76 76 77 77 *remainder = 0; 78 78 result = 0; 79 79 80 80 if (b == 0) { 81 81 /* FIXME: division by zero */ 82 82 return 0; 83 83 } 84 84 85 85 if (a < b) { 86 86 *remainder = a; 87 87 return 0; 88 88 } 89 89 90 90 for (; steps > 0; steps--) { 91 91 /* shift one bit to remainder */ 92 92 *remainder = ((*remainder) << 1) | ((a >> 63) & 0x1); 93 93 result <<= 1; 94 94 95 95 if (*remainder >= b) { 96 96 *remainder -= b; … … 99 99 a <<= 1; 100 100 } 101 101 102 102 return result; 103 103 } … … 108 108 unsigned int rem; 109 109 int result = (int) divandmod32(ABSVAL(a), ABSVAL(b), &rem); 110 110 111 111 if (SGN(a) == SGN(b)) 112 112 return result; 113 113 114 114 return -result; 115 115 } … … 120 120 unsigned long long rem; 121 121 long long result = (long long) divandmod64(ABSVAL(a), ABSVAL(b), &rem); 122 122 123 123 if (SGN(a) == SGN(b)) 124 124 return result; 125 125 126 126 return -result; 127 127 } … … 146 146 unsigned int rem; 147 147 divandmod32(a, b, &rem); 148 148 149 149 /* if divident is negative, remainder must be too */ 150 150 if (!(SGN(a))) 151 151 return -((int) rem); 152 152 153 153 return (int) rem; 154 154 } … … 159 159 unsigned long long rem; 160 160 divandmod64(a, b, &rem); 161 161 162 162 /* if divident is negative, remainder must be too */ 163 163 if (!(SGN(a))) 164 164 return -((long long) rem); 165 165 166 166 return (long long) rem; 167 167 } … … 187 187 unsigned int rem; 188 188 int result = (int) divandmod32(ABSVAL(a), ABSVAL(b), &rem); 189 189 190 190 if (SGN(a) == SGN(b)) { 191 191 *c = rem; 192 192 return result; 193 193 } 194 194 195 195 *c = -rem; 196 196 return -result; … … 207 207 unsigned long long rem; 208 208 long long result = (int) divandmod64(ABSVAL(a), ABSVAL(b), &rem); 209 209 210 210 if (SGN(a) == SGN(b)) { 211 211 *c = rem; 212 212 return result; 213 213 } 214 214 215 215 *c = -rem; 216 216 return -result;
Note:
See TracChangeset
for help on using the changeset viewer.