bigint-mul-32.js (6622B)
1 const tests = [ 2 [-0x10001n, -2n, 0x20002n], 3 [-0x10000n, -2n, 0x20000n], 4 [-0xffffn, -2n, 0x1fffen], 5 [-0xfffen, -2n, 0x1fffcn], 6 [-0x8001n, -2n, 0x10002n], 7 [-0x8000n, -2n, 0x10000n], 8 [-0x7fffn, -2n, 0xfffen], 9 [-0x7ffen, -2n, 0xfffcn], 10 [-2n, -2n, 4n], 11 [-1n, -2n, 2n], 12 [0n, -2n, 0n], 13 [1n, -2n, -2n], 14 [2n, -2n, -4n], 15 [0x7ffen, -2n, -0xfffcn], 16 [0x7fffn, -2n, -0xfffen], 17 [0x8000n, -2n, -0x10000n], 18 [0x8001n, -2n, -0x10002n], 19 [0xfffen, -2n, -0x1fffcn], 20 [0xffffn, -2n, -0x1fffen], 21 [0x10000n, -2n, -0x20000n], 22 [0x10001n, -2n, -0x20002n], 23 [-0x7fffffffn, -1n, 0x7fffffffn], 24 [-0x7ffffffen, -1n, 0x7ffffffen], 25 [-0x10001n, -1n, 0x10001n], 26 [-0x10000n, -1n, 0x10000n], 27 [-0xffffn, -1n, 0xffffn], 28 [-0xfffen, -1n, 0xfffen], 29 [-0x8001n, -1n, 0x8001n], 30 [-0x8000n, -1n, 0x8000n], 31 [-0x7fffn, -1n, 0x7fffn], 32 [-0x7ffen, -1n, 0x7ffen], 33 [-1n, -1n, 1n], 34 [0n, -1n, 0n], 35 [1n, -1n, -1n], 36 [2n, -1n, -2n], 37 [0x7ffen, -1n, -0x7ffen], 38 [0x7fffn, -1n, -0x7fffn], 39 [0x8000n, -1n, -0x8000n], 40 [0x8001n, -1n, -0x8001n], 41 [0xfffen, -1n, -0xfffen], 42 [0xffffn, -1n, -0xffffn], 43 [0x10000n, -1n, -0x10000n], 44 [0x10001n, -1n, -0x10001n], 45 [0x7ffffffen, -1n, -0x7ffffffen], 46 [0x7fffffffn, -1n, -0x7fffffffn], 47 [-0x80000000n, 0n, 0n], 48 [-0x7fffffffn, 0n, 0n], 49 [-0x7ffffffen, 0n, 0n], 50 [-0x10001n, 0n, 0n], 51 [-0x10000n, 0n, 0n], 52 [-0xffffn, 0n, 0n], 53 [-0xfffen, 0n, 0n], 54 [-0x8001n, 0n, 0n], 55 [-0x8000n, 0n, 0n], 56 [-0x7fffn, 0n, 0n], 57 [-0x7ffen, 0n, 0n], 58 [0n, 0n, 0n], 59 [1n, 0n, 0n], 60 [2n, 0n, 0n], 61 [0x7ffen, 0n, 0n], 62 [0x7fffn, 0n, 0n], 63 [0x8000n, 0n, 0n], 64 [0x8001n, 0n, 0n], 65 [0xfffen, 0n, 0n], 66 [0xffffn, 0n, 0n], 67 [0x10000n, 0n, 0n], 68 [0x10001n, 0n, 0n], 69 [0x7ffffffen, 0n, 0n], 70 [0x7fffffffn, 0n, 0n], 71 [-0x80000000n, 1n, -0x80000000n], 72 [-0x7fffffffn, 1n, -0x7fffffffn], 73 [-0x7ffffffen, 1n, -0x7ffffffen], 74 [-0x10001n, 1n, -0x10001n], 75 [-0x10000n, 1n, -0x10000n], 76 [-0xffffn, 1n, -0xffffn], 77 [-0xfffen, 1n, -0xfffen], 78 [-0x8001n, 1n, -0x8001n], 79 [-0x8000n, 1n, -0x8000n], 80 [-0x7fffn, 1n, -0x7fffn], 81 [-0x7ffen, 1n, -0x7ffen], 82 [1n, 1n, 1n], 83 [2n, 1n, 2n], 84 [0x7ffen, 1n, 0x7ffen], 85 [0x7fffn, 1n, 0x7fffn], 86 [0x8000n, 1n, 0x8000n], 87 [0x8001n, 1n, 0x8001n], 88 [0xfffen, 1n, 0xfffen], 89 [0xffffn, 1n, 0xffffn], 90 [0x10000n, 1n, 0x10000n], 91 [0x10001n, 1n, 0x10001n], 92 [0x7ffffffen, 1n, 0x7ffffffen], 93 [0x7fffffffn, 1n, 0x7fffffffn], 94 [-0x10001n, 2n, -0x20002n], 95 [-0x10000n, 2n, -0x20000n], 96 [-0xffffn, 2n, -0x1fffen], 97 [-0xfffen, 2n, -0x1fffcn], 98 [-0x8001n, 2n, -0x10002n], 99 [-0x8000n, 2n, -0x10000n], 100 [-0x7fffn, 2n, -0xfffen], 101 [-0x7ffen, 2n, -0xfffcn], 102 [2n, 2n, 4n], 103 [0x7ffen, 2n, 0xfffcn], 104 [0x7fffn, 2n, 0xfffen], 105 [0x8000n, 2n, 0x10000n], 106 [0x8001n, 2n, 0x10002n], 107 [0xfffen, 2n, 0x1fffcn], 108 [0xffffn, 2n, 0x1fffen], 109 [0x10000n, 2n, 0x20000n], 110 [0x10001n, 2n, 0x20002n], 111 [-0x10001n, 0x7ffen, -0x7ffe7ffen], 112 [-0x10000n, 0x7ffen, -0x7ffe0000n], 113 [-0xffffn, 0x7ffen, -0x7ffd8002n], 114 [-0xfffen, 0x7ffen, -0x7ffd0004n], 115 [-0x8001n, 0x7ffen, -0x3fff7ffen], 116 [-0x8000n, 0x7ffen, -0x3fff0000n], 117 [-0x7fffn, 0x7ffen, -0x3ffe8002n], 118 [-0x7ffen, 0x7ffen, -0x3ffe0004n], 119 [0x7ffen, 0x7ffen, 0x3ffe0004n], 120 [0x7fffn, 0x7ffen, 0x3ffe8002n], 121 [0x8000n, 0x7ffen, 0x3fff0000n], 122 [0x8001n, 0x7ffen, 0x3fff7ffen], 123 [0xfffen, 0x7ffen, 0x7ffd0004n], 124 [0xffffn, 0x7ffen, 0x7ffd8002n], 125 [0x10000n, 0x7ffen, 0x7ffe0000n], 126 [0x10001n, 0x7ffen, 0x7ffe7ffen], 127 [-0x10001n, 0x7fffn, -0x7fff7fffn], 128 [-0x10000n, 0x7fffn, -0x7fff0000n], 129 [-0xffffn, 0x7fffn, -0x7ffe8001n], 130 [-0xfffen, 0x7fffn, -0x7ffe0002n], 131 [-0x8001n, 0x7fffn, -0x3fffffffn], 132 [-0x8000n, 0x7fffn, -0x3fff8000n], 133 [-0x7fffn, 0x7fffn, -0x3fff0001n], 134 [-0x7ffen, 0x7fffn, -0x3ffe8002n], 135 [0x7fffn, 0x7fffn, 0x3fff0001n], 136 [0x8000n, 0x7fffn, 0x3fff8000n], 137 [0x8001n, 0x7fffn, 0x3fffffffn], 138 [0xfffen, 0x7fffn, 0x7ffe0002n], 139 [0xffffn, 0x7fffn, 0x7ffe8001n], 140 [0x10000n, 0x7fffn, 0x7fff0000n], 141 [0x10001n, 0x7fffn, 0x7fff7fffn], 142 [-0x10000n, 0x8000n, -0x80000000n], 143 [-0xffffn, 0x8000n, -0x7fff8000n], 144 [-0xfffen, 0x8000n, -0x7fff0000n], 145 [-0x8001n, 0x8000n, -0x40008000n], 146 [-0x8000n, 0x8000n, -0x40000000n], 147 [-0x7fffn, 0x8000n, -0x3fff8000n], 148 [-0x7ffen, 0x8000n, -0x3fff0000n], 149 [0x8000n, 0x8000n, 0x40000000n], 150 [0x8001n, 0x8000n, 0x40008000n], 151 [0xfffen, 0x8000n, 0x7fff0000n], 152 [0xffffn, 0x8000n, 0x7fff8000n], 153 [-0xfffen, 0x8001n, -0x7ffffffen], 154 [-0x8001n, 0x8001n, -0x40010001n], 155 [-0x8000n, 0x8001n, -0x40008000n], 156 [-0x7fffn, 0x8001n, -0x3fffffffn], 157 [-0x7ffen, 0x8001n, -0x3fff7ffen], 158 [0x8001n, 0x8001n, 0x40010001n], 159 [0xfffen, 0x8001n, 0x7ffffffen], 160 [-0xfffen, -0x8001n, 0x7ffffffen], 161 [-0x8001n, -0x8001n, 0x40010001n], 162 [-0x8000n, -0x8001n, 0x40008000n], 163 [-0x7fffn, -0x8001n, 0x3fffffffn], 164 [-0x7ffen, -0x8001n, 0x3fff7ffen], 165 [0xfffen, -0x8001n, -0x7ffffffen], 166 [-0xffffn, -0x8000n, 0x7fff8000n], 167 [-0xfffen, -0x8000n, 0x7fff0000n], 168 [-0x8000n, -0x8000n, 0x40000000n], 169 [-0x7fffn, -0x8000n, 0x3fff8000n], 170 [-0x7ffen, -0x8000n, 0x3fff0000n], 171 [0xfffen, -0x8000n, -0x7fff0000n], 172 [0xffffn, -0x8000n, -0x7fff8000n], 173 [0x10000n, -0x8000n, -0x80000000n], 174 [-0x10001n, -0x7fffn, 0x7fff7fffn], 175 [-0x10000n, -0x7fffn, 0x7fff0000n], 176 [-0xffffn, -0x7fffn, 0x7ffe8001n], 177 [-0xfffen, -0x7fffn, 0x7ffe0002n], 178 [-0x7fffn, -0x7fffn, 0x3fff0001n], 179 [-0x7ffen, -0x7fffn, 0x3ffe8002n], 180 [0xfffen, -0x7fffn, -0x7ffe0002n], 181 [0xffffn, -0x7fffn, -0x7ffe8001n], 182 [0x10000n, -0x7fffn, -0x7fff0000n], 183 [0x10001n, -0x7fffn, -0x7fff7fffn], 184 [-0x10001n, -0x7ffen, 0x7ffe7ffen], 185 [-0x10000n, -0x7ffen, 0x7ffe0000n], 186 [-0xffffn, -0x7ffen, 0x7ffd8002n], 187 [-0xfffen, -0x7ffen, 0x7ffd0004n], 188 [-0x7ffen, -0x7ffen, 0x3ffe0004n], 189 [0xfffen, -0x7ffen, -0x7ffd0004n], 190 [0xffffn, -0x7ffen, -0x7ffd8002n], 191 [0x10000n, -0x7ffen, -0x7ffe0000n], 192 [0x10001n, -0x7ffen, -0x7ffe7ffen], 193 ]; 194 195 // Cases not covered above. 196 tests.push( 197 // Int32 overflow: 198 // 199 // Math.floor(2 ** (Math.log2(2147483648) / 2)) 200 // = Math.floor(2 ** 15.5) 201 // = 46340 202 // 203 // Math.ceil(2 ** (Math.log2(2147483648) / 2)) 204 // = Math.ceil(2 ** 15.5) 205 // = 46341 206 [46340n, 46340n, 2147395600n], 207 [46340n, -46340n, -2147395600n], 208 [-46340n, -46340n, 2147395600n], 209 ); 210 211 function f(tests) { 212 for (let test of tests) { 213 let lhs = test[0], rhs = test[1], expected = test[2]; 214 assertEq(BigInt.asIntN(32, lhs), lhs); 215 assertEq(BigInt.asIntN(32, rhs), rhs); 216 assertEq(BigInt.asIntN(32, expected), expected); 217 218 assertEq(lhs * rhs, expected); 219 assertEq(rhs * lhs, expected); 220 } 221 } 222 223 for (let i = 0; i < 10; ++i) { 224 f(tests); 225 }