Changes in uspace/lib/softint/generic/multiplication.c [2467b41:a35b458] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/softint/generic/multiplication.c
r2467b41 ra35b458 53 53 unsigned int b1 = b >> 16; 54 54 unsigned int b2 = b & UINT16_MAX; 55 55 56 56 unsigned long long t1 = a1 * b1; 57 57 unsigned long long t2 = a1 * b2; 58 58 t2 += a2 * b1; 59 59 unsigned long long t3 = a2 * b2; 60 60 61 61 t3 = (((t1 << 16) + t2) << 16) + t3; 62 62 63 63 return t3; 64 64 } … … 70 70 { 71 71 char neg = 0; 72 72 73 73 if (a < 0) { 74 74 neg = !neg; 75 75 a = -a; 76 76 } 77 77 78 78 if (b < 0) { 79 79 neg = !neg; 80 80 b = -b; 81 81 } 82 82 83 83 unsigned long long a1 = a >> 32; 84 84 unsigned long long b1 = b >> 32; 85 85 86 86 unsigned long long a2 = a & (UINT32_MAX); 87 87 unsigned long long b2 = b & (UINT32_MAX); 88 88 89 89 if (SOFTINT_CHECK_OF && (a1 != 0) && (b1 != 0)) { 90 90 /* Error (overflow) */ 91 91 return (neg ? INT64_MIN : INT64_MAX); 92 92 } 93 93 94 94 /* (if OF checked) a1 or b1 is zero => result fits in 64 bits, 95 95 * no need to another overflow check 96 96 */ 97 97 unsigned long long t1 = mul(a1, b2) + mul(b1, a2); 98 98 99 99 if ((SOFTINT_CHECK_OF) && (t1 > UINT32_MAX)) { 100 100 /* Error (overflow) */ 101 101 return (neg ? INT64_MIN : INT64_MAX); 102 102 } 103 103 104 104 t1 = t1 << 32; 105 105 unsigned long long t2 = mul(a2, b2); 106 106 t2 += t1; 107 107 108 108 /* t2 & (1ull << 63) - if this bit is set in unsigned long long, 109 109 * result does not fit in signed one */ … … 112 112 return (neg ? INT64_MIN : INT64_MAX); 113 113 } 114 114 115 115 long long result = t2; 116 116 if (neg) 117 117 result = -result; 118 118 119 119 return result; 120 120 }
Note:
See TracChangeset
for help on using the changeset viewer.