| OLD | NEW |
| (Empty) |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // Flags: --allow-natives-syntax --turbo-filter=* | |
| 6 | |
| 7 function mul(a, b) { | |
| 8 const l = a & 0x3ffffff; | |
| 9 const h = b & 0x3ffffff; | |
| 10 | |
| 11 return (l * h) >>> 0; | |
| 12 } | |
| 13 | |
| 14 function mulAndDiv(a, b) { | |
| 15 const l = a & 0x3ffffff; | |
| 16 const h = b & 0x3ffffff; | |
| 17 const m = l * h; | |
| 18 | |
| 19 const rl = m & 0x3ffffff; | |
| 20 const rh = (m / 0x4000000) >>> 0; | |
| 21 | |
| 22 return rl | rh; | |
| 23 } | |
| 24 | |
| 25 function overflowMul(a, b) { | |
| 26 const l = a | 0; | |
| 27 const h = b | 0; | |
| 28 | |
| 29 return (l * h) >>> 0; | |
| 30 } | |
| 31 | |
| 32 function overflowDiv(a, b) { | |
| 33 const l = a & 0x3ffffff; | |
| 34 const h = b & 0x3ffffff; | |
| 35 const m = l * h; | |
| 36 | |
| 37 return (m / 0x10) >>> 0; | |
| 38 } | |
| 39 | |
| 40 function nonPowerOfTwoDiv(a, b) { | |
| 41 const l = a & 0x3ffffff; | |
| 42 const h = b & 0x3ffffff; | |
| 43 const m = l * h; | |
| 44 | |
| 45 return (m / 0x4000001) >>> 0; | |
| 46 } | |
| 47 | |
| 48 function test(fn, a, b, sets) { | |
| 49 const expected = fn(a, b); | |
| 50 fn(1, 2); | |
| 51 fn(0, 0); | |
| 52 %OptimizeFunctionOnNextCall(fn); | |
| 53 const actual = fn(a, b); | |
| 54 | |
| 55 assertEquals(expected, actual); | |
| 56 | |
| 57 sets.forEach(function(set, i) { | |
| 58 assertEquals(set.expected, fn(set.a, set.b), fn.name + ', set #' + i); | |
| 59 }); | |
| 60 } | |
| 61 | |
| 62 test(mul, 0x3ffffff, 0x3ffffff, [ | |
| 63 { a: 0, b: 0, expected: 0 }, | |
| 64 { a: 0xdead, b: 0xbeef, expected: 0xa6144983 }, | |
| 65 { a: 0x1aa1dea, b: 0x2badead, expected: 0x35eb2322 } | |
| 66 ]); | |
| 67 test(mulAndDiv, 0x3ffffff, 0x3ffffff, [ | |
| 68 { a: 0, b: 0, expected: 0 }, | |
| 69 { a: 0xdead, b: 0xbeef, expected: 0x21449ab }, | |
| 70 { a: 0x1aa1dea, b: 0x2badead, expected: 0x1ebf32f } | |
| 71 ]); | |
| 72 test(overflowMul, 0x4ffffff, 0x4ffffff, [ | |
| 73 { a: 0, b: 0, expected: 0 }, | |
| 74 { a: 0xdead, b: 0xbeef, expected: 0xa6144983 }, | |
| 75 { a: 0x1aa1dea, b: 0x2badead, expected: 0x35eb2322 } | |
| 76 ]); | |
| 77 test(overflowDiv, 0x3ffffff, 0x3ffffff, [ | |
| 78 { a: 0, b: 0, expected: 0 }, | |
| 79 { a: 0xdead, b: 0xbeef, expected: 0xa614498 }, | |
| 80 { a: 0x1aa1dea, b: 0x2badead, expected: 0x835eb232 } | |
| 81 ]); | |
| 82 test(nonPowerOfTwoDiv, 0x3ffffff, 0x3ffffff, [ | |
| 83 { a: 0, b: 0, expected: 0 }, | |
| 84 { a: 0xdead, b: 0xbeef, expected: 0x29 }, | |
| 85 { a: 0x1aa1dea, b: 0x2badead, expected: 0x122d20d } | |
| 86 ]); | |
| OLD | NEW |