17d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
27d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
37d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// found in the LICENSE file.
47d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
57d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "test/cctest/cctest.h"
67d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/base/utils/random-number-generator.h"
87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/graph-inl.h"
9ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org#include "src/compiler/js-graph.h"
107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/machine-operator-reducer.h"
11ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org#include "src/compiler/typer.h"
127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "test/cctest/compiler/value-helper.h"
137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgusing namespace v8::internal;
157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgusing namespace v8::internal::compiler;
167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgtemplate <typename T>
182c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgconst Operator* NewConstantOperator(CommonOperatorBuilder* common,
192c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org                                    volatile T value);
207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgtemplate <>
222c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgconst Operator* NewConstantOperator<int32_t>(CommonOperatorBuilder* common,
232c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org                                             volatile int32_t value) {
247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  return common->Int32Constant(value);
257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgtemplate <>
282c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgconst Operator* NewConstantOperator<double>(CommonOperatorBuilder* common,
292c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org                                            volatile double value) {
307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  return common->Float64Constant(value);
317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
34e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgtemplate <typename T>
35e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgT ValueOfOperator(const Operator* op);
36e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
37e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgtemplate <>
38e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgint32_t ValueOfOperator<int32_t>(const Operator* op) {
39e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  CHECK_EQ(IrOpcode::kInt32Constant, op->opcode());
40e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  return OpParameter<int32_t>(op);
41e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org}
42e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
43e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgtemplate <>
44e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgdouble ValueOfOperator<double>(const Operator* op) {
45e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  CHECK_EQ(IrOpcode::kFloat64Constant, op->opcode());
46e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  return OpParameter<double>(op);
47e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org}
48e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
49e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgclass ReducerTester : public HandleAndZoneScope {
517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public:
523e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  explicit ReducerTester(int num_parameters = 0)
537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      : isolate(main_isolate()),
547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org        binop(NULL),
557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org        unop(NULL),
567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org        common(main_zone()),
577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org        graph(main_zone()),
58b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org        javascript(main_zone()),
59ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org        typer(main_zone()),
60b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org        jsgraph(&graph, &common, &javascript, &typer, &machine),
613e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org        maxuint32(Constant<int32_t>(kMaxUInt32)) {
623e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org    Node* s = graph.NewNode(common.Start(num_parameters));
633e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org    graph.SetStart(s);
643e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org  }
657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Isolate* isolate;
672c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* binop;
682c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  const Operator* unop;
697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  MachineOperatorBuilder machine;
707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CommonOperatorBuilder common;
717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Graph graph;
72b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  JSOperatorBuilder javascript;
73ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  Typer typer;
74ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org  JSGraph jsgraph;
757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* maxuint32;
767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  template <typename T>
787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* Constant(volatile T value) {
797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    return graph.NewNode(NewConstantOperator<T>(&common, value));
807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
82e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  template <typename T>
83e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  const T ValueOf(const Operator* op) {
84e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    return ValueOfOperator<T>(op);
85e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  }
86e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Check that the reduction of this binop applied to constants {a} and {b}
887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // yields the {expect} value.
897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  template <typename T>
907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  void CheckFoldBinop(volatile T expect, volatile T a, volatile T b) {
917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CheckFoldBinop<T>(expect, Constant<T>(a), Constant<T>(b));
927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Check that the reduction of this binop applied to {a} and {b} yields
957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // the {expect} value.
967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  template <typename T>
977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  void CheckFoldBinop(volatile T expect, Node* a, Node* b) {
987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_NE(NULL, binop);
997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node* n = graph.NewNode(binop, a, b);
100ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org    MachineOperatorReducer reducer(&jsgraph);
1017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Reduction reduction = reducer.Reduce(n);
1027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK(reduction.Changed());
1037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_NE(n, reduction.replacement());
1047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_EQ(expect, ValueOf<T>(reduction.replacement()->op()));
1057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Check that the reduction of this binop applied to {a} and {b} yields
1087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // the {expect} node.
1097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  void CheckBinop(Node* expect, Node* a, Node* b) {
1107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_NE(NULL, binop);
1117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node* n = graph.NewNode(binop, a, b);
112ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org    MachineOperatorReducer reducer(&jsgraph);
1137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Reduction reduction = reducer.Reduce(n);
1147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK(reduction.Changed());
1157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_EQ(expect, reduction.replacement());
1167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Check that the reduction of this binop applied to {left} and {right} yields
1197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // this binop applied to {left_expect} and {right_expect}.
1207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  void CheckFoldBinop(Node* left_expect, Node* right_expect, Node* left,
1217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                      Node* right) {
1227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_NE(NULL, binop);
1237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node* n = graph.NewNode(binop, left, right);
124ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org    MachineOperatorReducer reducer(&jsgraph);
1257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Reduction reduction = reducer.Reduce(n);
1267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK(reduction.Changed());
1277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_EQ(binop, reduction.replacement()->op());
1287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_EQ(left_expect, reduction.replacement()->InputAt(0));
1297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_EQ(right_expect, reduction.replacement()->InputAt(1));
1307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Check that the reduction of this binop applied to {left} and {right} yields
1337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // the {op_expect} applied to {left_expect} and {right_expect}.
1347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  template <typename T>
1352c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  void CheckFoldBinop(volatile T left_expect, const Operator* op_expect,
1367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                      Node* right_expect, Node* left, Node* right) {
1377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_NE(NULL, binop);
1387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node* n = graph.NewNode(binop, left, right);
139ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org    MachineOperatorReducer reducer(&jsgraph);
1407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Reduction r = reducer.Reduce(n);
1417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK(r.Changed());
1427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_EQ(op_expect->opcode(), r.replacement()->op()->opcode());
1437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_EQ(left_expect, ValueOf<T>(r.replacement()->InputAt(0)->op()));
1447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_EQ(right_expect, r.replacement()->InputAt(1));
1457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Check that the reduction of this binop applied to {left} and {right} yields
1487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // the {op_expect} applied to {left_expect} and {right_expect}.
1497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  template <typename T>
1502c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  void CheckFoldBinop(Node* left_expect, const Operator* op_expect,
1517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                      volatile T right_expect, Node* left, Node* right) {
1527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_NE(NULL, binop);
1537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node* n = graph.NewNode(binop, left, right);
154ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org    MachineOperatorReducer reducer(&jsgraph);
1557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Reduction r = reducer.Reduce(n);
1567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK(r.Changed());
1577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_EQ(op_expect->opcode(), r.replacement()->op()->opcode());
1587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_EQ(left_expect, r.replacement()->InputAt(0));
1597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_EQ(right_expect, ValueOf<T>(r.replacement()->InputAt(1)->op()));
1607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Check that if the given constant appears on the left, the reducer will
1637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // swap it to be on the right.
1647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  template <typename T>
1657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  void CheckPutConstantOnRight(volatile T constant) {
1667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    // TODO(titzer): CHECK(binop->HasProperty(Operator::kCommutative));
1677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node* p = Parameter();
1687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node* k = Constant<T>(constant);
1697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    {
1707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      Node* n = graph.NewNode(binop, k, p);
171ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org      MachineOperatorReducer reducer(&jsgraph);
1727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      Reduction reduction = reducer.Reduce(n);
1737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CHECK(!reduction.Changed() || reduction.replacement() == n);
1747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CHECK_EQ(p, n->InputAt(0));
1757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CHECK_EQ(k, n->InputAt(1));
1767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
1777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    {
1787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      Node* n = graph.NewNode(binop, p, k);
179ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org      MachineOperatorReducer reducer(&jsgraph);
1807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      Reduction reduction = reducer.Reduce(n);
1817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CHECK(!reduction.Changed());
1827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CHECK_EQ(p, n->InputAt(0));
1837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      CHECK_EQ(k, n->InputAt(1));
1847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
1857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
1867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // Check that if the given constant appears on the left, the reducer will
1887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // *NOT* swap it to be on the right.
1897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  template <typename T>
1907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  void CheckDontPutConstantOnRight(volatile T constant) {
1917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK(!binop->HasProperty(Operator::kCommutative));
1927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node* p = Parameter();
1937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node* k = Constant<T>(constant);
1947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node* n = graph.NewNode(binop, k, p);
195ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org    MachineOperatorReducer reducer(&jsgraph);
1967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Reduction reduction = reducer.Reduce(n);
1977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK(!reduction.Changed());
1987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_EQ(k, n->InputAt(0));
1997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK_EQ(p, n->InputAt(1));
2007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
2017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* Parameter(int32_t index = 0) {
2033e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org    return graph.NewNode(common.Parameter(index), graph.start());
2047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
2057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org};
2067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceWord32And) {
2097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
2107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Word32And();
2117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_INT32_INPUTS(pl) {
2137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_INT32_INPUTS(pr) {
2147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      int32_t x = *pl, y = *pr;
2157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<int32_t>(x & y, x, y);
2167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
2177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
2187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckPutConstantOnRight(33);
2207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckPutConstantOnRight(44000);
2217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter();
2237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* zero = R.Constant<int32_t>(0);
2247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* minus_1 = R.Constant<int32_t>(-1);
2257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(zero, x, zero);  // x  & 0  => 0
2277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(zero, zero, x);  // 0  & x  => 0
2287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, x, minus_1);  // x  & -1 => 0
2297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, minus_1, x);  // -1 & x  => 0
2307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, x, x);        // x  & x  => x
2317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
2327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceWord32Or) {
2357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
2367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Word32Or();
2377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_INT32_INPUTS(pl) {
2397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_INT32_INPUTS(pr) {
2407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      int32_t x = *pl, y = *pr;
2417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<int32_t>(x | y, x, y);
2427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
2437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
2447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckPutConstantOnRight(36);
2467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckPutConstantOnRight(44001);
2477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter();
2497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* zero = R.Constant<int32_t>(0);
2507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* minus_1 = R.Constant<int32_t>(-1);
2517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, x, zero);           // x  & 0  => x
2537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, zero, x);           // 0  & x  => x
2547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(minus_1, x, minus_1);  // x  & -1 => -1
2557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(minus_1, minus_1, x);  // -1 & x  => -1
2567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, x, x);              // x  & x  => x
2577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
2587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceWord32Xor) {
2617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
2627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Word32Xor();
2637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_INT32_INPUTS(pl) {
2657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_INT32_INPUTS(pr) {
2667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      int32_t x = *pl, y = *pr;
2677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<int32_t>(x ^ y, x, y);
2687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
2697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
2707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckPutConstantOnRight(39);
2727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckPutConstantOnRight(4403);
2737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter();
2757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* zero = R.Constant<int32_t>(0);
2767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, x, zero);            // x ^ 0  => x
2787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, zero, x);            // 0 ^ x  => x
2797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop<int32_t>(0, x, x);  // x ^ x  => 0
2807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
2817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceWord32Shl) {
2847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
2857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Word32Shl();
2867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // TODO(titzer): out of range shifts
2887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_INT32_INPUTS(i) {
2897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    for (int y = 0; y < 32; y++) {
2907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      int32_t x = *i;
2917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<int32_t>(x << y, x, y);
2927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
2937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
2947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckDontPutConstantOnRight(44);
2967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter();
2987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* zero = R.Constant<int32_t>(0);
2997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, x, zero);  // x << 0  => x
3017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceWord32Shr) {
3057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
3067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Word32Shr();
3077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // TODO(titzer): test out of range shifts
3097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_UINT32_INPUTS(i) {
3107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    for (uint32_t y = 0; y < 32; y++) {
3117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      uint32_t x = *i;
3127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<int32_t>(x >> y, x, y);
3137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
3147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
3157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckDontPutConstantOnRight(44);
3177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter();
3197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* zero = R.Constant<int32_t>(0);
3207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, x, zero);  // x >>> 0  => x
3227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceWord32Sar) {
3267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
3277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Word32Sar();
3287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // TODO(titzer): test out of range shifts
3307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_INT32_INPUTS(i) {
3317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    for (int32_t y = 0; y < 32; y++) {
3327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      int32_t x = *i;
3337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<int32_t>(x >> y, x, y);
3347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
3357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
3367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckDontPutConstantOnRight(44);
3387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter();
3407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* zero = R.Constant<int32_t>(0);
3417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, x, zero);  // x >> 0  => x
3437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceWord32Equal) {
3477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
3487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Word32Equal();
3497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_INT32_INPUTS(pl) {
3517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_INT32_INPUTS(pr) {
3527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      int32_t x = *pl, y = *pr;
3537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<int32_t>(x == y ? 1 : 0, x, y);
3547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
3557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
3567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckPutConstantOnRight(48);
3587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckPutConstantOnRight(-48);
3597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter(0);
3617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* y = R.Parameter(1);
3627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* zero = R.Constant<int32_t>(0);
3637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* sub = R.graph.NewNode(R.machine.Int32Sub(), x, y);
3647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop<int32_t>(1, x, x);  // x == x  => 1
3667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop(x, y, sub, zero);   // x - y == 0  => x == y
3677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop(x, y, zero, sub);   // 0 == x - y  => x == y
3687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceInt32Add) {
3727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
3737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Int32Add();
3747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_INT32_INPUTS(pl) {
3767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_INT32_INPUTS(pr) {
3777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      int32_t x = *pl, y = *pr;
3787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<int32_t>(x + y, x, y);  // TODO(titzer): signed overflow
3797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
3807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
3817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckPutConstantOnRight(41);
3837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckPutConstantOnRight(4407);
3847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter();
3867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* zero = R.Constant<int32_t>(0);
3877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, x, zero);  // x + 0  => x
3897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, zero, x);  // 0 + x  => x
3907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceInt32Sub) {
3947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
3957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Int32Sub();
3967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_INT32_INPUTS(pl) {
3987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_INT32_INPUTS(pr) {
3997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      int32_t x = *pl, y = *pr;
4007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<int32_t>(x - y, x, y);
4017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
4027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
4037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckDontPutConstantOnRight(412);
4057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter();
4077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* zero = R.Constant<int32_t>(0);
4087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, x, zero);  // x - 0  => x
4107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
4117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceInt32Mul) {
4147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
4157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Int32Mul();
4167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_INT32_INPUTS(pl) {
4187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_INT32_INPUTS(pr) {
4197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      int32_t x = *pl, y = *pr;
4207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<int32_t>(x * y, x, y);  // TODO(titzer): signed overflow
4217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
4227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
4237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckPutConstantOnRight(4111);
4257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckPutConstantOnRight(-4407);
4267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter();
4287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* zero = R.Constant<int32_t>(0);
4297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* one = R.Constant<int32_t>(1);
4307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* minus_one = R.Constant<int32_t>(-1);
4317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(zero, x, zero);  // x * 0  => 0
4337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(zero, zero, x);  // 0 * x  => 0
4347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, x, one);      // x * 1  => x
4357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, one, x);      // 1 * x  => x
4367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop<int32_t>(0, R.machine.Int32Sub(), x, minus_one,
4377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                            x);  // -1 * x  => 0 - x
4387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop<int32_t>(0, R.machine.Int32Sub(), x, x,
4397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                            minus_one);  // x * -1  => 0 - x
4407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (int32_t n = 1; n < 31; ++n) {
4427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node* multiplier = R.Constant<int32_t>(1 << n);
4437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    R.CheckFoldBinop<int32_t>(x, R.machine.Word32Shl(), n, x,
4447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                              multiplier);  // x * 2^n => x << n
4457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    R.CheckFoldBinop<int32_t>(x, R.machine.Word32Shl(), n, multiplier,
4467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                              x);  // 2^n * x => x << n
4477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
4487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
4497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceInt32Div) {
4527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
4537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Int32Div();
4547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_INT32_INPUTS(pl) {
4567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_INT32_INPUTS(pr) {
4577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      int32_t x = *pl, y = *pr;
4587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (y == 0) continue;              // TODO(titzer): test / 0
4597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      int32_t r = y == -1 ? -x : x / y;  // INT_MIN / -1 may explode in C
4607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<int32_t>(r, x, y);
4617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
4627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
4637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckDontPutConstantOnRight(41111);
4657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckDontPutConstantOnRight(-44071);
4667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter();
4687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* one = R.Constant<int32_t>(1);
4697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* minus_one = R.Constant<int32_t>(-1);
4707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, x, one);  // x / 1  => x
4727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // TODO(titzer):                          // 0 / x  => 0 if x != 0
4737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // TODO(titzer):                          // x / 2^n => x >> n and round
4747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop<int32_t>(0, R.machine.Int32Sub(), x, x,
4757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                            minus_one);  // x / -1  => 0 - x
4767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
4777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceInt32UDiv) {
4807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
4817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Int32UDiv();
4827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_UINT32_INPUTS(pl) {
4847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_UINT32_INPUTS(pr) {
4857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      uint32_t x = *pl, y = *pr;
4867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (y == 0) continue;  // TODO(titzer): test / 0
4877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<int32_t>(x / y, x, y);
4887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
4897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
4907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckDontPutConstantOnRight(41311);
4927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckDontPutConstantOnRight(-44371);
4937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter();
4957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* one = R.Constant<int32_t>(1);
4967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, x, one);  // x / 1  => x
4987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // TODO(titzer):                            // 0 / x  => 0 if x != 0
4997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (uint32_t n = 1; n < 32; ++n) {
5017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node* divisor = R.Constant<int32_t>(1u << n);
5027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    R.CheckFoldBinop<int32_t>(x, R.machine.Word32Shr(), n, x,
5037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                              divisor);  // x / 2^n => x >> n
5047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
5057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
5067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceInt32Mod) {
5097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
5107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Int32Mod();
5117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_INT32_INPUTS(pl) {
5137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_INT32_INPUTS(pr) {
5147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      int32_t x = *pl, y = *pr;
5157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (y == 0) continue;             // TODO(titzer): test % 0
5167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      int32_t r = y == -1 ? 0 : x % y;  // INT_MIN % -1 may explode in C
5177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<int32_t>(r, x, y);
5187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
5197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
5207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckDontPutConstantOnRight(413);
5227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckDontPutConstantOnRight(-4401);
5237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter();
5257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* one = R.Constant<int32_t>(1);
5267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop<int32_t>(0, x, one);  // x % 1  => 0
5287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // TODO(titzer):                       // x % 2^n => x & 2^n-1 and round
5297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
5307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceInt32UMod) {
5337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
5347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Int32UMod();
5357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_INT32_INPUTS(pl) {
5377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_INT32_INPUTS(pr) {
5387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      uint32_t x = *pl, y = *pr;
5397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (y == 0) continue;  // TODO(titzer): test x % 0
5407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<int32_t>(x % y, x, y);
5417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
5427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
5437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckDontPutConstantOnRight(417);
5457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckDontPutConstantOnRight(-4371);
5467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter();
5487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* one = R.Constant<int32_t>(1);
5497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop<int32_t>(0, x, one);  // x % 1  => 0
5517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (uint32_t n = 1; n < 32; ++n) {
5537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Node* divisor = R.Constant<int32_t>(1u << n);
5547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    R.CheckFoldBinop<int32_t>(x, R.machine.Word32And(), (1u << n) - 1, x,
5557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                              divisor);  // x % 2^n => x & 2^n-1
5567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
5577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
5587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceInt32LessThan) {
5617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
5627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Int32LessThan();
5637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_INT32_INPUTS(pl) {
5657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_INT32_INPUTS(pr) {
5667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      int32_t x = *pl, y = *pr;
5677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<int32_t>(x < y ? 1 : 0, x, y);
5687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
5697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
5707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckDontPutConstantOnRight(41399);
5727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckDontPutConstantOnRight(-440197);
5737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter(0);
5757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* y = R.Parameter(1);
5767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* zero = R.Constant<int32_t>(0);
5777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* sub = R.graph.NewNode(R.machine.Int32Sub(), x, y);
5787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop<int32_t>(0, x, x);  // x < x  => 0
5807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop(x, y, sub, zero);   // x - y < 0 => x < y
5817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop(y, x, zero, sub);   // 0 < x - y => y < x
5827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
5837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceInt32LessThanOrEqual) {
5867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
5877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Int32LessThanOrEqual();
5887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_INT32_INPUTS(pl) {
5907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_INT32_INPUTS(pr) {
5917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      int32_t x = *pl, y = *pr;
5927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<int32_t>(x <= y ? 1 : 0, x, y);
5937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
5947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
5957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_INT32_INPUTS(i) { R.CheckDontPutConstantOnRight<int32_t>(*i); }
5977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter(0);
5997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* y = R.Parameter(1);
6007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* zero = R.Constant<int32_t>(0);
6017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* sub = R.graph.NewNode(R.machine.Int32Sub(), x, y);
6027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop<int32_t>(1, x, x);  // x <= x => 1
6047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop(x, y, sub, zero);   // x - y <= 0 => x <= y
6057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop(y, x, zero, sub);   // 0 <= x - y => y <= x
6067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
6077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceUint32LessThan) {
6107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
6117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Uint32LessThan();
6127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_UINT32_INPUTS(pl) {
6147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_UINT32_INPUTS(pr) {
6157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      uint32_t x = *pl, y = *pr;
6167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<int32_t>(x < y ? 1 : 0, x, y);
6177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
6187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
6197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckDontPutConstantOnRight(41399);
6217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckDontPutConstantOnRight(-440197);
6227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter();
6247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* max = R.maxuint32;
6257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* zero = R.Constant<int32_t>(0);
6267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop<int32_t>(0, max, x);   // M < x  => 0
6287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop<int32_t>(0, x, zero);  // x < 0  => 0
6297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop<int32_t>(0, x, x);     // x < x  => 0
6307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
6317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceUint32LessThanOrEqual) {
6347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
6357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Uint32LessThanOrEqual();
6367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_UINT32_INPUTS(pl) {
6387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_UINT32_INPUTS(pr) {
6397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      uint32_t x = *pl, y = *pr;
6407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<int32_t>(x <= y ? 1 : 0, x, y);
6417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
6427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
6437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckDontPutConstantOnRight(41399);
6457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckDontPutConstantOnRight(-440197);
6467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter();
6487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* max = R.maxuint32;
6497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* zero = R.Constant<int32_t>(0);
6507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop<int32_t>(1, x, max);   // x <= M  => 1
6527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop<int32_t>(1, zero, x);  // 0 <= x  => 1
6537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckFoldBinop<int32_t>(1, x, x);     // x <= x  => 1
6547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
6557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceLoadStore) {
6587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
6597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* base = R.Constant<int32_t>(11);
6617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* index = R.Constant<int32_t>(4);
6625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Node* load = R.graph.NewNode(R.machine.Load(kMachInt32), base, index);
6637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  {
665ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org    MachineOperatorReducer reducer(&R.jsgraph);
6667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Reduction reduction = reducer.Reduce(load);
6677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK(!reduction.Changed());  // loads should not be reduced.
6687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
6697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  {
6716313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org    Node* store = R.graph.NewNode(
6726313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org        R.machine.Store(StoreRepresentation(kMachInt32, kNoWriteBarrier)), base,
6736313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org        index, load);
674ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org    MachineOperatorReducer reducer(&R.jsgraph);
6757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Reduction reduction = reducer.Reduce(store);
6767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    CHECK(!reduction.Changed());  // stores should not be reduced.
6777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
6787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
6797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic void CheckNans(ReducerTester* R) {
6827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R->Parameter();
6837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  std::vector<double> nans = ValueHelper::nan_vector();
6847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  for (std::vector<double>::const_iterator pl = nans.begin(); pl != nans.end();
6857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       ++pl) {
6867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    for (std::vector<double>::const_iterator pr = nans.begin();
6877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         pr != nans.end(); ++pr) {
6887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      Node* nan1 = R->Constant<double>(*pl);
6897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      Node* nan2 = R->Constant<double>(*pr);
6907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R->CheckBinop(nan1, x, nan1);     // x % NaN => NaN
6917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R->CheckBinop(nan1, nan1, x);     // NaN % x => NaN
6927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R->CheckBinop(nan1, nan2, nan1);  // NaN % NaN => NaN
6937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
6947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
6957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
6967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceFloat64Add) {
6997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
7007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Float64Add();
7017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_FLOAT64_INPUTS(pl) {
7037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_FLOAT64_INPUTS(pr) {
7047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      double x = *pl, y = *pr;
7057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<double>(x + y, x, y);
7067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
7077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
7087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_FLOAT64_INPUTS(i) { R.CheckPutConstantOnRight(*i); }
7107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // TODO(titzer): CheckNans(&R);
7117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
7127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceFloat64Sub) {
7157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
7167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Float64Sub();
7177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_FLOAT64_INPUTS(pl) {
7197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_FLOAT64_INPUTS(pr) {
7207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      double x = *pl, y = *pr;
7217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<double>(x - y, x, y);
7227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
7237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
7247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  // TODO(titzer): CheckNans(&R);
7257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
7267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceFloat64Mul) {
7297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
7307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Float64Mul();
7317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_FLOAT64_INPUTS(pl) {
7337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_FLOAT64_INPUTS(pr) {
7347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      double x = *pl, y = *pr;
7357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<double>(x * y, x, y);
7367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
7377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
7387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  double inf = V8_INFINITY;
7407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckPutConstantOnRight(-inf);
7417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckPutConstantOnRight(-0.1);
7427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckPutConstantOnRight(0.1);
7437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckPutConstantOnRight(inf);
7447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter();
7467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* one = R.Constant<double>(1.0);
7477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, x, one);  // x * 1.0 => x
7497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, one, x);  // 1.0 * x => x
7507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckNans(&R);
7527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
7537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceFloat64Div) {
7567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
7577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Float64Div();
7587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_FLOAT64_INPUTS(pl) {
7607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_FLOAT64_INPUTS(pr) {
7617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      double x = *pl, y = *pr;
7627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<double>(x / y, x, y);
7637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
7647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
7657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* x = R.Parameter();
7677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Node* one = R.Constant<double>(1.0);
7687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.CheckBinop(x, x, one);  // x / 1.0 => x
7707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckNans(&R);
7727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
7737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgTEST(ReduceFloat64Mod) {
7767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ReducerTester R;
7777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  R.binop = R.machine.Float64Mod();
7787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  FOR_FLOAT64_INPUTS(pl) {
7807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    FOR_FLOAT64_INPUTS(pr) {
7817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      double x = *pl, y = *pr;
7827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      R.CheckFoldBinop<double>(modulo(x, y), x, y);
7837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
7847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
7857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  CheckNans(&R);
7877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
7887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Word64And
7917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Word64Or
7927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Word64Xor
7937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Word64Shl
7947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Word64Shr
7957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Word64Sar
7967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Word64Equal
7977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Word64Not
7987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Int64Add
7997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Int64Sub
8007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Int64Mul
8017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Int64UMul
8027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Int64Div
8037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Int64UDiv
8047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Int64Mod
8057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Int64UMod
8067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Int64Neg
807aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for ChangeInt32ToFloat64
808aca8beeda619beb0f9758b04d1eaebdea5538a44machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for ChangeFloat64ToInt32
8097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// TODO(titzer): test MachineOperatorReducer for Float64Compare
810