Long integer multiply */
| 88 | |
| 89 | /* Long integer multiply */ |
| 90 | static inline npy_extint128_t |
| 91 | mul_64_64(npy_int64 a, npy_int64 b) |
| 92 | { |
| 93 | npy_extint128_t x, y, z; |
| 94 | npy_uint64 x1, x2, y1, y2, r1, r2, prev; |
| 95 | |
| 96 | x = to_128(a); |
| 97 | y = to_128(b); |
| 98 | |
| 99 | x1 = x.lo & 0xffffffff; |
| 100 | x2 = x.lo >> 32; |
| 101 | |
| 102 | y1 = y.lo & 0xffffffff; |
| 103 | y2 = y.lo >> 32; |
| 104 | |
| 105 | r1 = x1*y2; |
| 106 | r2 = x2*y1; |
| 107 | |
| 108 | z.sign = x.sign * y.sign; |
| 109 | z.hi = x2*y2 + (r1 >> 32) + (r2 >> 32); |
| 110 | z.lo = x1*y1; |
| 111 | |
| 112 | /* Add with carry */ |
| 113 | prev = z.lo; |
| 114 | z.lo += (r1 << 32); |
| 115 | if (z.lo < prev) { |
| 116 | ++z.hi; |
| 117 | } |
| 118 | |
| 119 | prev = z.lo; |
| 120 | z.lo += (r2 << 32); |
| 121 | if (z.lo < prev) { |
| 122 | ++z.hi; |
| 123 | } |
| 124 | |
| 125 | return z; |
| 126 | } |
| 127 | |
| 128 | |
| 129 | /* Long integer add */ |
no test coverage detected