Changeset 1433ecda in mainline for kernel/genarch/src/softint/multiplication.c
- Timestamp:
- 2018-04-04T15:42:37Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 2c4e1cc
- Parents:
- 47b2d7e3
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/softint/multiplication.c
r47b2d7e3 r1433ecda 54 54 * @result 55 55 */ 56 static unsigned long long mul(unsigned int a, unsigned int b) { 56 static unsigned long long mul(unsigned int a, unsigned int b) 57 { 57 58 unsigned int a1, a2, b1, b2; 58 59 unsigned long long t1, t2, t3; … … 64 65 65 66 t1 = a1 * b1; 66 t2 = a1 *b2;67 t2 += a2 *b1;68 t3 = a2 *b2;67 t2 = a1 * b2; 68 t2 += a2 * b1; 69 t3 = a2 * b2; 69 70 70 71 t3 = (((t1 << 16) + t2) << 16) + t3; … … 79 80 { 80 81 long long result; 81 unsigned long long t1, t2;82 unsigned long long t1, t2; 82 83 unsigned long long a1, a2, b1, b2; 83 84 char neg = 0; … … 101 102 if (SOFTINT_CHECK_OF && (a1 != 0) && (b1 != 0)) { 102 103 // error, overflow 103 return (neg ?MIN_INT64:MAX_INT64);104 return (neg ? MIN_INT64 : MAX_INT64); 104 105 } 105 106 106 107 // (if OF checked) a1 or b1 is zero => result fits in 64 bits, no need to another overflow check 107 t1 = mul(a1, b2) + mul(b1,a2);108 t1 = mul(a1, b2) + mul(b1, a2); 108 109 109 110 if (SOFTINT_CHECK_OF && t1 > MAX_UINT32) { 110 111 // error, overflow 111 return (neg ?MIN_INT64:MAX_INT64);112 return (neg ? MIN_INT64 : MAX_INT64); 112 113 } 113 114 114 115 t1 = t1 << 32; 115 t2 = mul(a2, b2);116 t2 = mul(a2, b2); 116 117 t2 += t1; 117 118 … … 120 121 if (SOFTINT_CHECK_OF && ((t2 < t1) || (t2 & (1ull << 63)))) { 121 122 // error, overflow 122 return (neg ?MIN_INT64:MAX_INT64);123 return (neg ? MIN_INT64 : MAX_INT64); 123 124 } 124 125
Note:
See TracChangeset
for help on using the changeset viewer.