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
6
7function mul(a, b) {
8  const l = a & 0x3ffffff;
9  const h = b & 0x3ffffff;
10
11  return (l * h) >>> 0;
12}
13
14function 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
25function overflowMul(a, b) {
26  const l = a | 0;
27  const h = b | 0;
28
29  return (l * h) >>> 0;
30}
31
32function 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
40function 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
48function 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
62test(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]);
67test(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]);
72test(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]);
77test(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]);
82test(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]);
87