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 |