binaryarith.js (11753B)
1 setJitCompilerOption('ion.forceinlineCaches', 1); 2 3 function warmup(fun, input_array) { 4 for (var index = 0; index < input_array.length; index++) { 5 input = input_array[index]; 6 input_lhs = input[0]; 7 input_rhs = input[1]; 8 output = input[2]; 9 for (var i = 0; i < 30; i++) { 10 var y = fun(input_lhs, input_rhs); 11 assertEq(y, output) 12 } 13 } 14 } 15 16 17 // Add: Int32 + Int32 Overflow 18 var funAdd1 = (a, b) => { return a + b; } 19 warmup(funAdd1, [[1,2, 3], [3,4, 7], [4294967295, 2, 4294967297]]); 20 21 // Add: Doubles 22 var funAdd2 = (a, b) => { return a + b; } 23 warmup(funAdd2, [[1.2, 2, 3.2], [3.5, 4, 7.5], [4294967295.1, 2, 4294967297.1]]); 24 25 // Add: Type Change Int32 -> Double 26 var funAdd3 = (a, b) => { return a + b; } 27 warmup(funAdd3, [[1, 2, 3], [3, 4, 7], [4294967295, 2, 4294967297], [1.2, 2, 3.2]]); 28 29 //Add: String Concat 30 var funAdd4 = (a, b) => { return a + b; } 31 warmup(funAdd4, [["","a","a"], ["ab","ba","abba"], ["123","456","123456"]]) 32 33 function D(name) { this.name = name; } 34 D.prototype.toString = function stringify() { 35 return this.name; 36 } 37 obj1 = new D('A'); 38 39 // Add: String Object Concat 40 var funAdd4 = (a, b) => { return a + b; } 41 warmup(funAdd4, [["x", obj1, "xA"], [obj1, "bba", "Abba"]]); 42 43 // Add: Int32 Boolean 44 var funAdd5 = (a, b) => { return a + b; } 45 warmup(funAdd5, [[true, 10, 11], [false, 1, 1], [10, true, 11], [1, false, 1], 46 [2147483647, true, 2147483648],[true, 2147483647, 2147483648]]); 47 48 // Add: String Number Concat 49 var funAdd6 = (a, b) => { return a + b; } 50 warmup(funAdd6, [["x", 10, "x10"], [10, "bba", "10bba"], ["x", 1.2, "x1.2"], 51 [1.2, "bba", "1.2bba"]]); 52 53 // Add: String Boolean 54 var funAddStrBool = (a, b) => { return a + b; } 55 warmup(funAddStrBool, [[true, "true", "truetrue"], [false, "true", "falsetrue"], 56 ["a string", true, "a stringtrue"]]); 57 58 // Sub Int32 59 var funSub1 = (a, b) => { return a - b; } 60 warmup(funSub1, [[7, 0, 7], [7, 8, -1], [4294967295, 2, 4294967293], [0,0,0]]); 61 62 // Sub Double 63 var funSub2 = (a, b) => { return a - b; } 64 warmup(funSub2, [[7.5, 0, 7.5], [7, 8.125, -1.125], [4294967295.3125, 2, 4294967293.3125], [NaN,10,NaN]]); 65 66 // Sub Int32 + Boolean 67 var funSub3 = (a, b) => { return a - b; } 68 warmup(funSub3, [[7, false, 7], [7, true, 6], [false, 1, -1], [true,1,0]]); 69 70 71 72 // Mul: Int32+ Int32 Overflow 73 var funMul1 = (a, b) => { return a * b; } 74 warmup(funMul1, [[1, 2, 2], [10, 21, 210], [3, 4, 12], [2147483649, 2, 4294967298], [1073741824, 1024, 1099511627776 ]]); 75 76 // Mul: Doubles 77 var funMul2 = (a, b) => { return a * b; } 78 warmup(funMul2, [[3/32, 32, 3], [16/64, 32, 8], [3.0, 1.0, 3], [-1, 0, -0], [0, -20, -0]]); 79 80 // Mul: Type change Int32 -> Double 81 var funMul3 = (a, b) => { return a * b; } 82 warmup(funMul3, [[1,2, 2], [10, 21, 210], [3, 4, 12], [63/32, 32, 63], [16/64, 32, 8]]); 83 84 // Mul: Boolean 85 var funMul1 = (a, b) => { return a * b; } 86 warmup(funMul1, [[1, true, 1], [10, false, 0], [false, 4, 0], [2147483640, true, 2147483640]]); 87 88 //Div: Int32 89 var funDiv1 = (a,b) => { return a / b;} 90 warmup(funDiv1,[[8, 4, 2], [16, 32, 0.5], [10, 0, Infinity], [0, 0, NaN]]); 91 92 //Div: Double 93 var funDiv2 = (a,b) => { return a / b;} 94 warmup(funDiv2, [[8.8, 4, 2.2], [16.8, 32, 0.525], [10, 0.5, 20]]); 95 96 //Div: Type change Int32 -> Double 97 var funDiv3 = (a,b) => { return a / b;} 98 warmup(funDiv1, [[8, 4, 2], [16, 32, 0.5], [10, 0, Infinity], [0, 0, NaN], [8.8, 4, 2.2], 99 [16.8, 32, 0.525], [10, 0.5, 20]]); 100 101 //Div: Boolean w/ Int32 102 var funDiv4 = (a,b) => { return a / b;} 103 warmup(funDiv4,[[8, true, 8], [true, 2, 0.5], [10, false, Infinity], [false, false, NaN]]); 104 105 //Mod: Int32 106 var funMod1 = (a,b) => {return a % b}; 107 warmup(funMod1, [[8, 4, 0], [9, 4, 1], [-1, 2, -1], [4294967297, 2, 1], 108 [10, -3, 1]]); 109 110 //Mod: Double 111 var funMod2 = (a,b) => {return a % b}; 112 warmup(funMod2, [[8.5, 1, 0.5], [9.5, 0.5, 0], [-0.03125, 0.0625, -0.03125], [1.64, 1.16, 0.48]]); 113 114 //Mod: Type change Int32 -> Double 115 var funMod3 = (a,b) => {return a % b}; 116 warmup(funMod3, [[10, 0, NaN], [8, 4, 0], [9, 4, 1], [-1, 2, -1], [4294967297, 2, 1], 117 [8.5, 1, 0.5], [9.5, 0.5, 0], [-0.03125, 0.0625, -0.03125], 118 [1.64, 1.16, 0.48]]); 119 120 //Mod: Boolean w/ Int32 121 var funMod4 = (a,b) => {return a % b}; 122 warmup(funMod4, [[10, false, NaN], [8, true, 0], [false, 4, 0], [true, 2, 1]]); 123 124 //Pow: Int32 125 var funPow1 = (a,b) => {return a ** b}; 126 warmup(funPow1, [[8, 4, 4096], [9, 4, 6561], [-1, 2, 1], [2, -10000, 0], 127 [-3, 3, -27]]); 128 129 //Pow: Double 130 var funPow2 = (a,b) => {return a ** b}; 131 warmup(funPow2, [[8.5, 1, 8.5], [16, 0.5, 4], [4.5, 5, 1845.28125], [18.0625, 0.5, 4.25], 132 [4, -1, 0.25]]); 133 134 //Pow: Type change Int32 -> Double 135 var funPow3 = (a,b) => {return a ** b}; 136 warmup(funPow3, [[10, 0, 1], [8, 4, 4096], [9, 4, 6561], [-1, 2, 1], [2, -10000, 0], 137 [8.5, 1, 8.5], [16, 0.5, 4], [4.5, 5, 1845.28125], [18.0625, 0.5, 4.25], 138 [4, -1, 0.25]]); 139 140 //Pow: Boolean w/ Int32 141 var funPow4 = (a,b) => {return a ** b}; 142 warmup(funPow4, [[10, 2, 100], [8, true, 8], [false, 4, 0], [true, 2, 1]]); 143 144 //BitOr Int32 145 var funBitOr1 = (a, b) => { return a | b; } 146 warmup(funBitOr1, [[1, 1, 1], [8, 1, 9], [0, 1233, 1233], [5, 0, 5], 147 [4294967295, 123231, -1], [2147483647, 1243524, 2147483647]]); 148 149 //BitOr Boolean w/ Int32 150 var funBitOr3 = (a, b) => { return a | b; } 151 warmup(funBitOr3, [[1, true, 1], [8, true, 9], [false, 1233, 1233], [5, false, 5]]); 152 153 //BitOr null w/ Int32 154 var funBitOr4 = (a, b) => { return a | b; } 155 warmup(funBitOr4, [[1, null, 1], [8, null, 8], [null, 1233, 1233], [5, null, 5]]); 156 157 //BitOr undefined w/ Int32 158 var funBitOr5 = (a, b) => { return a | b; } 159 warmup(funBitOr5, [[1, void 0, 1], [8, void 0, 8], [void 0, 1233, 1233], [5, void 0, 5]]); 160 161 //BitXOr Int32 162 var funBitXOr1 = (a, b) => { return a ^ b; } 163 warmup(funBitXOr1, [[1, 1, 0], [5, 1, 4], [63, 31, 32], [4294967295, 2147483647, -2147483648 ] ]); 164 165 //BitXOr Int32 166 var funBitXOr2 = (a, b) => { return a ^ b; } 167 warmup(funBitXOr2, [[1, true, 0], [5, true, 4], [5, false, 5], [false, 1, 1]]); 168 169 //BitXOr Double+int32 170 var funBitXOr3 = (a, b) => { return a ^ b; } 171 warmup(funBitXOr3, [[1.3, 1, 0], [5, 1.4, 4], [63.1, 31, 32], [4294967295.9, 2147483647, -2147483648 ] ]); 172 173 //BitXOr Number Number 174 var funBitXOr4 = (a, b) => { return a ^ b; } 175 warmup(funBitXOr4, [[54772703898, 2890608493, 1828589047], 176 [-54772703898, 2890608493, -1828589045], 177 [18446744073709551615, 54772703898, -1061870950], //UINT64 Max 178 [-18446744073709551615, 54772703898, -1061870950], 179 [4294967295, -1, 0]]); 180 181 //BitXOr null+int32 182 var funBitXOr5 = (a, b) => { return a ^ b; } 183 warmup(funBitXOr5, [[1, null, 1], [5, null, 5], [5, null, 5], [null, 1, 1]]); 184 185 //BitXOr undefined+int32 186 var funBitXOr6 = (a, b) => { return a ^ b; } 187 warmup(funBitXOr6, [[1, void 0, 1], [5, void 0, 5], [5, void 0, 5], [void 0, 1, 1]]); 188 189 //BitAnd Int32 190 var funBitAnd1 = (a, b) => { return a & b; } 191 warmup(funBitAnd1, [[1,1,1], [5,1,1], [63,31,31], [4294967295,2147483647,2147483647], 192 [-2,10,10], [-15,-2,-16], [4,128,0]]); 193 //BitAnd Double w/ Int32 194 var funBitAnd2 = (a, b) => { return a & b; } 195 warmup(funBitAnd2, [[1.2 ,1, 1], [5, 1.4, 1], [63,31.99,31], 196 [4294967295.98,2147483647,2147483647], 197 [-2.9, 10, 10], [-15,-2.9,-16], [4,128.01,0]]); 198 199 //BitAnd Int32 + Boolean 200 var funBitAnd1 = (a, b) => { return a & b; } 201 warmup(funBitAnd1, [[1,true,1], [5,false,0], [true, 6, 0], [false, 12, 0]]); 202 203 //BitAnd Int32 + null 204 var funBitAnd4 = (a, b) => { return a & b; } 205 warmup(funBitAnd4, [[1, null, 0], [5, null, 0], [null, 6, 0], [null, 12, 0]]); 206 207 //BitAnd Int32 + undefined 208 var funBitAnd5 = (a, b) => { return a & b; } 209 warmup(funBitAnd5, [[1, void 0, 0], [5, void 0, 0], [void 0, 6, 0], [void 0, 12, 0]]); 210 211 //Lsh Int32 212 var funLsh1 = (a, b) => { return a << b; } 213 warmup(funLsh1, [[5,1,10], [1,1,2], [63,31,-2147483648], 214 [4294967295,2147483647,-2147483648], [-2,10,-2048], [-15,-2,1073741824], 215 [4,128,4], [1,10,1024], [1024,2,4096]]); 216 217 //Lsh Boolean w/ Int32 218 var funLsh2 = (a, b) => { return a << b; } 219 warmup(funLsh2, [[5,true,10], [true,1,2], [63,false,63], [false, 12, 0]]); 220 221 //Lsh Number Number 222 var funLsh3 = (a, b) => { return a << b; } 223 warmup(funLsh3, [[54772703898, 1, -2123741900],[2147483658, 0, -2147483638]]); 224 225 //Lsh Boolean w/ null 226 var funLsh4 = (a, b) => { return a << b; } 227 warmup(funLsh4, [[5, null, 5], [null, 1, 0], [63, null, 63], [null, 12, 0]]); 228 229 //Lsh Boolean w/ undefined 230 var funLsh5 = (a, b) => { return a << b; } 231 warmup(funLsh5, [[5, void 0, 5], [void 0, 1, 0], [63, void 0, 63], [void 0, 12, 0]]); 232 233 //Rsh Int32 234 var funRsh1 = (a, b) => { return a >> b; } 235 warmup(funRsh1, [[1,1,0], [5,1,2], [63,31,0], [4294967295,2147483647,-1], [-2,10,-1], 236 [-15,-2,-1], [4,128,4], [1,10,0], [1024,2,256]]); 237 238 //Rsh Int32 239 var funRsh2 = (a, b) => { return a >> b; } 240 warmup(funRsh2, [[true,1,0], [1,true,0], [false, 3, 0], [3, false, 3]]); 241 242 //Rsh Number Number 243 var funRsh3 = (a, b) => { return a >> b; } 244 warmup(funRsh3, [[54772703898, 11, -518492 ], [2147483658, 0, -2147483638]]); 245 246 //Rsh Int32 null 247 var funRsh4 = (a, b) => { return a >> b; } 248 warmup(funRsh4, [[null, 1, 0], [1, null, 1], [null, 3, 0], [3, null, 3]]); 249 250 //Rsh Int32 undefined 251 var funRsh5 = (a, b) => { return a >> b; } 252 warmup(funRsh5, [[void 0, 1, 0], [1, void 0, 1], [void 0, 3, 0], [3, void 0, 3]]); 253 254 //URsh Int32 255 var funURsh1 = (a, b) => { return a >>> b; } 256 warmup(funURsh1, [[1,1,0], [5,1,2], [63,31,0], [4294967295,2147483647,1], [-2,10,4194303], 257 [-15,-2,3], [4,128,4], [1,10,0], [1024,2,256], [0, -6, 0], [0, 6, 0], 258 [0x55005500, 2, 0x15401540]]); 259 260 //URsh Boolean Int32 261 var funURsh2 = (a, b) => { return a >>> b; } 262 warmup(funURsh2, [[true,1,0], [5,true,2], [63,false,63], [false, 20, 0]]); 263 264 //URsh Int32 265 var funURsh3 = (a, b) => { return a >>> b; } 266 warmup(funURsh3, [[4294967295, 0, 4294967295]]); 267 268 //URsh Number Number 269 var funURsh4 = (a, b) => { return a >>> b; } 270 warmup(funURsh4, [[54772703898, 11, 1578660], [2147483658, 11, 1048576], 271 [4294967295, 0, 4294967295]]); 272 273 //URsh null Int32 274 var funURsh5 = (a, b) => { return a >>> b; } 275 warmup(funURsh5, [[null, 1, 0], [5, null, 5], [63, null, 63], [null, 20, 0]]); 276 277 //URsh undefined Int32 278 var funURsh6 = (a, b) => { return a >>> b; } 279 warmup(funURsh6, [[void 0, 1, 0], [5, void 0, 5], [63, void 0, 63], [void 0, 20, 0]]); 280 281 var funDateSub = (a, b) => { return a - b; } 282 warmup(funDateSub, [[new Date("2024-09-20T19:54:27.432Z"), new Date("2024-09-20T19:54:27.427Z"), 5], 283 [new Date("2024-09-20T19:54:27.432Z"), 1726862067427, 5], 284 [1726862067427, new Date("2024-09-20T19:54:27.432Z"), -5]]); 285 286 287 // Other Test cases that Have been useful: 288 for (var k=0; k < 30; k++) { 289 A="01234567"; 290 res ="" 291 for (var i = 0; i < 8; ++i) { 292 var v = A[7 - i]; 293 res+=v; 294 } 295 assertEq(res, "76543210"); 296 } 297 298 // Begin OOM testing: 299 if (!('oomTest' in this)) 300 quit(); 301 302 // Add: String Number Concat OOM test 303 var addOom = (a, b) => { return a + b; } 304 305 function generate_digits(prefix, start) { 306 digits = [] 307 number = ""+start+".25"; 308 for (var i = 1; i < 7; i++) { 309 number = i + number; 310 digits.push([prefix, Number(number), prefix + number]); 311 } 312 return digits; 313 } 314 315 // Trying to defeat dtoacache: Warm the IC with one set of digits, then actually oomTest 316 // using another set. 317 var warmup_digits = generate_digits("x", 1); 318 var test_digits = generate_digits("x", 2); 319 320 function ot(digits) { 321 warmup(addOom, digits); 322 } 323 324 // Ensure ICs are warmed 325 ot(warmup_digits); 326 327 oomTest(() => { ot(test_digits); });