15e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
25e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
35e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org// found in the LICENSE file.
45e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
55e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org#include "src/base/bits.h"
6ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org#include "src/compiler/graph-unittest.h"
7ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org#include "src/compiler/js-graph.h"
85e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org#include "src/compiler/machine-operator-reducer.h"
9ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org#include "src/compiler/typer.h"
105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgnamespace v8 {
125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgnamespace internal {
135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgnamespace compiler {
145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgclass MachineOperatorReducerTest : public GraphTest {
165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org public:
175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  explicit MachineOperatorReducerTest(int num_parameters = 2)
186313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org      : GraphTest(num_parameters) {}
195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org protected:
215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Reduction Reduce(Node* node) {
22ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org    Typer typer(zone());
23b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    JSOperatorBuilder javascript(zone());
24b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    JSGraph jsgraph(graph(), common(), &javascript, &typer, &machine_);
25ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.org    MachineOperatorReducer reducer(&jsgraph);
265e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    return reducer.Reduce(node);
275e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
285e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  MachineOperatorBuilder* machine() { return &machine_; }
305e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
315e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org private:
325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  MachineOperatorBuilder machine_;
335e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org};
345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
36a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgtemplate <typename T>
37a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgclass MachineOperatorReducerTestWithParam
38a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    : public MachineOperatorReducerTest,
39a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      public ::testing::WithParamInterface<T> {
40a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org public:
41a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  explicit MachineOperatorReducerTestWithParam(int num_parameters = 2)
42a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      : MachineOperatorReducerTest(num_parameters) {}
43a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  virtual ~MachineOperatorReducerTestWithParam() {}
44a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org};
45a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
46a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
475e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgnamespace {
485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.orgstatic const float kFloat32Values[] = {
5006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    -std::numeric_limits<float>::infinity(), -2.70497e+38f, -1.4698e+37f,
5106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    -1.22813e+35f,                           -1.20555e+35f, -1.34584e+34f,
5206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    -1.0079e+32f,                            -6.49364e+26f, -3.06077e+25f,
5306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    -1.46821e+25f,                           -1.17658e+23f, -1.9617e+22f,
5406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    -2.7357e+20f,                            -1.48708e+13f, -1.89633e+12f,
5506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    -4.66622e+11f,                           -2.22581e+11f, -1.45381e+10f,
5606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    -1.3956e+09f,                            -1.32951e+09f, -1.30721e+09f,
5706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    -1.19756e+09f,                           -9.26822e+08f, -6.35647e+08f,
5806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    -4.00037e+08f,                           -1.81227e+08f, -5.09256e+07f,
5906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    -964300.0f,                              -192446.0f,    -28455.0f,
6006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    -27194.0f,                               -26401.0f,     -20575.0f,
6106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    -17069.0f,                               -9167.0f,      -960.178f,
6206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    -113.0f,                                 -62.0f,        -15.0f,
6306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    -7.0f,                                   -0.0256635f,   -4.60374e-07f,
6406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    -3.63759e-10f,                           -4.30175e-14f, -5.27385e-15f,
6506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    -1.48084e-15f,                           -1.05755e-19f, -3.2995e-21f,
6606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    -1.67354e-23f,                           -1.11885e-23f, -1.78506e-30f,
6706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    -5.07594e-31f,                           -3.65799e-31f, -1.43718e-34f,
6806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    -1.27126e-38f,                           -0.0f,         0.0f,
6906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    1.17549e-38f,                            1.56657e-37f,  4.08512e-29f,
7006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    3.31357e-28f,                            6.25073e-22f,  4.1723e-13f,
7106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    1.44343e-09f,                            5.27004e-08f,  9.48298e-08f,
7206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    5.57888e-07f,                            4.89988e-05f,  0.244326f,
7306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    12.4895f,                                19.0f,         47.0f,
7406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    106.0f,                                  538.324f,      564.536f,
7506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    819.124f,                                7048.0f,       12611.0f,
7606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    19878.0f,                                20309.0f,      797056.0f,
7706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    1.77219e+09f,                            1.51116e+11f,  4.18193e+13f,
7806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    3.59167e+16f,                            3.38211e+19f,  2.67488e+20f,
7906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    1.78831e+21f,                            9.20914e+21f,  8.35654e+23f,
8006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    1.4495e+24f,                             5.94015e+25f,  4.43608e+30f,
8106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    2.44502e+33f,                            2.61152e+33f,  1.38178e+37f,
8206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    1.71306e+37f,                            3.31899e+38f,  3.40282e+38f,
8306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    std::numeric_limits<float>::infinity()};
8406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org
8506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org
86a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgstatic const double kFloat64Values[] = {
87a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -V8_INFINITY,  -4.23878e+275, -5.82632e+265, -6.60355e+220, -6.26172e+212,
88a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -2.56222e+211, -4.82408e+201, -1.84106e+157, -1.63662e+127, -1.55772e+100,
89a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -1.67813e+72,  -2.3382e+55,   -3.179e+30,    -1.441e+09,    -1.0647e+09,
90a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -7.99361e+08,  -5.77375e+08,  -2.20984e+08,  -32757,        -13171,
91a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -9970,         -3984,         -107,          -105,          -92,
92a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -77,           -61,           -0.000208163,  -1.86685e-06,  -1.17296e-10,
93a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -9.26358e-11,  -5.08004e-60,  -1.74753e-65,  -1.06561e-71,  -5.67879e-79,
94a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -5.78459e-130, -2.90989e-171, -7.15489e-243, -3.76242e-252, -1.05639e-263,
95a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -4.40497e-267, -2.19666e-273, -4.9998e-276,  -5.59821e-278, -2.03855e-282,
96a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -5.99335e-283, -7.17554e-284, -3.11744e-309, -0.0,          0.0,
97a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    2.22507e-308,  1.30127e-270,  7.62898e-260,  4.00313e-249,  3.16829e-233,
98a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    1.85244e-228,  2.03544e-129,  1.35126e-110,  1.01182e-106,  5.26333e-94,
99a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    1.35292e-90,   2.85394e-83,   1.78323e-77,   5.4967e-57,    1.03207e-25,
100a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    4.57401e-25,   1.58738e-05,   2,             125,           2310,
101a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    9636,          14802,         17168,         28945,         29305,
102a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    4.81336e+07,   1.41207e+08,   4.65962e+08,   1.40499e+09,   2.12648e+09,
103a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    8.80006e+30,   1.4446e+45,    1.12164e+54,   2.48188e+89,   6.71121e+102,
104a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    3.074e+112,    4.9699e+152,   5.58383e+166,  4.30654e+172,  7.08824e+185,
105a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    9.6586e+214,   2.028e+223,    6.63277e+243,  1.56192e+261,  1.23202e+269,
106a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    5.72883e+289,  8.5798e+290,   1.40256e+294,  1.79769e+308,  V8_INFINITY};
107a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
108a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
109a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgstatic const int32_t kInt32Values[] = {
110a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -2147483647 - 1, -1914954528, -1698749618, -1578693386, -1577976073,
111a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -1573998034,     -1529085059, -1499540537, -1299205097, -1090814845,
112a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -938186388,      -806828902,  -750927650,  -520676892,  -513661538,
113a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -453036354,      -433622833,  -282638793,  -28375,      -27788,
114a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -22770,          -18806,      -14173,      -11956,      -11200,
115a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -10212,          -8160,       -3751,       -2758,       -1522,
116a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -121,            -120,        -118,        -117,        -106,
117a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -84,             -80,         -74,         -59,         -52,
118a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -48,             -39,         -35,         -17,         -11,
119a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    -10,             -9,          -7,          -5,          0,
120a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    9,               12,          17,          23,          29,
121a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    31,              33,          35,          40,          47,
122a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    55,              56,          62,          64,          67,
123a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    68,              69,          74,          79,          84,
124a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    89,              90,          97,          104,         118,
125a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    124,             126,         127,         7278,        17787,
126a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    24136,           24202,       25570,       26680,       30242,
127a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    32399,           420886487,   642166225,   821912648,   822577803,
128a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    851385718,       1212241078,  1411419304,  1589626102,  1596437184,
129a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    1876245816,      1954730266,  2008792749,  2045320228,  2147483647};
130a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
131a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
132a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgstatic const int64_t kInt64Values[] = {
133a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-9223372036854775807) - 1, V8_INT64_C(-8974392461363618006),
134a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-8874367046689588135),     V8_INT64_C(-8269197512118230839),
135a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-8146091527100606733),     V8_INT64_C(-7550917981466150848),
136a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-7216590251577894337),     V8_INT64_C(-6464086891160048440),
137a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-6365616494908257190),     V8_INT64_C(-6305630541365849726),
138a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-5982222642272245453),     V8_INT64_C(-5510103099058504169),
139a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-5496838675802432701),     V8_INT64_C(-4047626578868642657),
140a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-4033755046900164544),     V8_INT64_C(-3554299241457877041),
141a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-2482258764588614470),     V8_INT64_C(-1688515425526875335),
142a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-924784137176548532),      V8_INT64_C(-725316567157391307),
143a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-439022654781092241),      V8_INT64_C(-105545757668917080),
144a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-2088319373),              V8_INT64_C(-2073699916),
145a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-1844949911),              V8_INT64_C(-1831090548),
146a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-1756711933),              V8_INT64_C(-1559409497),
147a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-1281179700),              V8_INT64_C(-1211513985),
148a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-1182371520),              V8_INT64_C(-785934753),
149a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-767480697),               V8_INT64_C(-705745662),
150a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-514362436),               V8_INT64_C(-459916580),
151a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-312328082),               V8_INT64_C(-302949707),
152a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-285499304),               V8_INT64_C(-125701262),
153a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-95139843),                V8_INT64_C(-32768),
154a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-27542),                   V8_INT64_C(-23600),
155a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-18582),                   V8_INT64_C(-17770),
156a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-9086),                    V8_INT64_C(-9010),
157a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-8244),                    V8_INT64_C(-2890),
158a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-103),                     V8_INT64_C(-34),
159a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-27),                      V8_INT64_C(-25),
160a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(-9),                       V8_INT64_C(-7),
161a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(0),                        V8_INT64_C(2),
162a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(38),                       V8_INT64_C(58),
163a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(65),                       V8_INT64_C(93),
164a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(111),                      V8_INT64_C(1003),
165a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(1267),                     V8_INT64_C(12797),
166a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(23122),                    V8_INT64_C(28200),
167a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(30888),                    V8_INT64_C(42648848),
168a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(116836693),                V8_INT64_C(263003643),
169a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(571039860),                V8_INT64_C(1079398689),
170a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(1145196402),               V8_INT64_C(1184846321),
171a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(1758281648),               V8_INT64_C(1859991374),
172a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(1960251588),               V8_INT64_C(2042443199),
173a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(296220586027987448),       V8_INT64_C(1015494173071134726),
174a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(1151237951914455318),      V8_INT64_C(1331941174616854174),
175a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(2022020418667972654),      V8_INT64_C(2450251424374977035),
176a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(3668393562685561486),      V8_INT64_C(4858229301215502171),
177a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(4919426235170669383),      V8_INT64_C(5034286595330341762),
178a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(5055797915536941182),      V8_INT64_C(6072389716149252074),
179a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(6185309910199801210),      V8_INT64_C(6297328311011094138),
180a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(6932372858072165827),      V8_INT64_C(8483640924987737210),
181a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(8663764179455849203),      V8_INT64_C(8877197042645298254),
182a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    V8_INT64_C(8901543506779157333),      V8_INT64_C(9223372036854775807)};
183a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
184a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
185a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgstatic const uint32_t kUint32Values[] = {
1865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    0x00000000, 0x00000001, 0xffffffff, 0x1b09788b, 0x04c5fce8, 0xcc0de5bf,
1875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    0x273a798e, 0x187937a3, 0xece3af83, 0x5495a16b, 0x0b668ecc, 0x11223344,
1885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    0x0000009e, 0x00000043, 0x0000af73, 0x0000116b, 0x00658ecc, 0x002b3b4c,
1895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    0x88776655, 0x70000000, 0x07200000, 0x7fffffff, 0x56123761, 0x7fffff00,
1905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    0x761c4761, 0x80000000, 0x88888888, 0xa0000000, 0xdddddddd, 0xe0000000,
1915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    0xeeeeeeee, 0xfffffffd, 0xf0000000, 0x007fffff, 0x003fffff, 0x001fffff,
1925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    0x000fffff, 0x0007ffff, 0x0003ffff, 0x0001ffff, 0x0000ffff, 0x00007fff,
1935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    0x00003fff, 0x00001fff, 0x00000fff, 0x000007ff, 0x000003ff, 0x000001ff};
1945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
1955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}  // namespace
1965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
1975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
198a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// -----------------------------------------------------------------------------
199a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// Unary operators
200a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
201a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
202a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgnamespace {
203a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
204a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgstruct UnaryOperator {
20506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org  const Operator* (MachineOperatorBuilder::*constructor)();
206a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  const char* constructor_name;
207a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org};
208a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
209a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
210a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgstd::ostream& operator<<(std::ostream& os, const UnaryOperator& unop) {
211a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  return os << unop.constructor_name;
212a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}
213a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
214a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
215a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgstatic const UnaryOperator kUnaryOperators[] = {
216a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    {&MachineOperatorBuilder::ChangeInt32ToFloat64, "ChangeInt32ToFloat64"},
217a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    {&MachineOperatorBuilder::ChangeUint32ToFloat64, "ChangeUint32ToFloat64"},
218a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    {&MachineOperatorBuilder::ChangeFloat64ToInt32, "ChangeFloat64ToInt32"},
219a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    {&MachineOperatorBuilder::ChangeFloat64ToUint32, "ChangeFloat64ToUint32"},
220a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    {&MachineOperatorBuilder::ChangeInt32ToInt64, "ChangeInt32ToInt64"},
221a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    {&MachineOperatorBuilder::ChangeUint32ToUint64, "ChangeUint32ToUint64"},
222a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    {&MachineOperatorBuilder::TruncateFloat64ToInt32, "TruncateFloat64ToInt32"},
223a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    {&MachineOperatorBuilder::TruncateInt64ToInt32, "TruncateInt64ToInt32"}};
224a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
225a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}  // namespace
226a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
227a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
228a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgtypedef MachineOperatorReducerTestWithParam<UnaryOperator>
229a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    MachineUnaryOperatorReducerTest;
230a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
231a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
232a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgTEST_P(MachineUnaryOperatorReducerTest, Parameter) {
233a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  const UnaryOperator unop = GetParam();
234a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  Reduction reduction =
235a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      Reduce(graph()->NewNode((machine()->*unop.constructor)(), Parameter(0)));
236a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  EXPECT_FALSE(reduction.Changed());
237a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}
238a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
239a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
240a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgINSTANTIATE_TEST_CASE_P(MachineOperatorReducerTest,
241a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                        MachineUnaryOperatorReducerTest,
242a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org                        ::testing::ValuesIn(kUnaryOperators));
243a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
244a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
245a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// -----------------------------------------------------------------------------
24606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org// ChangeFloat64ToFloat32
24706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org
24806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org
24906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.orgTEST_F(MachineOperatorReducerTest, ChangeFloat64ToFloat32WithConstant) {
25006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org  TRACED_FOREACH(float, x, kFloat32Values) {
25106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    Reduction reduction = Reduce(graph()->NewNode(
25206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org        machine()->ChangeFloat32ToFloat64(), Float32Constant(x)));
25306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    ASSERT_TRUE(reduction.Changed());
25406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    EXPECT_THAT(reduction.replacement(), IsFloat64Constant(x));
25506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org  }
25606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org}
25706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org
25806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org
25906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org// -----------------------------------------------------------------------------
260a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// ChangeFloat64ToInt32
261a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
262a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
263a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgTEST_F(MachineOperatorReducerTest,
264a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org       ChangeFloat64ToInt32WithChangeInt32ToFloat64) {
265a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  Node* value = Parameter(0);
266a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  Reduction reduction = Reduce(graph()->NewNode(
267a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      machine()->ChangeFloat64ToInt32(),
268a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      graph()->NewNode(machine()->ChangeInt32ToFloat64(), value)));
269a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  ASSERT_TRUE(reduction.Changed());
270a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  EXPECT_EQ(value, reduction.replacement());
271a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}
272a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
273a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
274a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgTEST_F(MachineOperatorReducerTest, ChangeFloat64ToInt32WithConstant) {
275a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  TRACED_FOREACH(int32_t, x, kInt32Values) {
276a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Reduction reduction = Reduce(graph()->NewNode(
277a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        machine()->ChangeFloat64ToInt32(), Float64Constant(FastI2D(x))));
278a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    ASSERT_TRUE(reduction.Changed());
279a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    EXPECT_THAT(reduction.replacement(), IsInt32Constant(x));
280a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  }
281a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}
282a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
283a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
284a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// -----------------------------------------------------------------------------
285a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// ChangeFloat64ToUint32
286a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
287a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
288a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgTEST_F(MachineOperatorReducerTest,
289a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org       ChangeFloat64ToUint32WithChangeUint32ToFloat64) {
290a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  Node* value = Parameter(0);
291a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  Reduction reduction = Reduce(graph()->NewNode(
292a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      machine()->ChangeFloat64ToUint32(),
293a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      graph()->NewNode(machine()->ChangeUint32ToFloat64(), value)));
294a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  ASSERT_TRUE(reduction.Changed());
295a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  EXPECT_EQ(value, reduction.replacement());
296a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}
297a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
298a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
299a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgTEST_F(MachineOperatorReducerTest, ChangeFloat64ToUint32WithConstant) {
300a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  TRACED_FOREACH(uint32_t, x, kUint32Values) {
301a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Reduction reduction = Reduce(graph()->NewNode(
302a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        machine()->ChangeFloat64ToUint32(), Float64Constant(FastUI2D(x))));
303a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    ASSERT_TRUE(reduction.Changed());
304e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    EXPECT_THAT(reduction.replacement(), IsInt32Constant(bit_cast<int32_t>(x)));
305a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  }
306a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}
307a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
308a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
309a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// -----------------------------------------------------------------------------
310a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// ChangeInt32ToFloat64
311a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
312a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
313a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgTEST_F(MachineOperatorReducerTest, ChangeInt32ToFloat64WithConstant) {
314a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  TRACED_FOREACH(int32_t, x, kInt32Values) {
315a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Reduction reduction = Reduce(
316a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        graph()->NewNode(machine()->ChangeInt32ToFloat64(), Int32Constant(x)));
317a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    ASSERT_TRUE(reduction.Changed());
318a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    EXPECT_THAT(reduction.replacement(), IsFloat64Constant(FastI2D(x)));
319a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  }
320a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}
321a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
322a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
323a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// -----------------------------------------------------------------------------
324a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// ChangeInt32ToInt64
325a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
326a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
327a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgTEST_F(MachineOperatorReducerTest, ChangeInt32ToInt64WithConstant) {
328a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  TRACED_FOREACH(int32_t, x, kInt32Values) {
329a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Reduction reduction = Reduce(
330a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        graph()->NewNode(machine()->ChangeInt32ToInt64(), Int32Constant(x)));
331a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    ASSERT_TRUE(reduction.Changed());
332a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    EXPECT_THAT(reduction.replacement(), IsInt64Constant(x));
333a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  }
334a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}
335a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
336a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
337a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// -----------------------------------------------------------------------------
338a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// ChangeUint32ToFloat64
339a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
340a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
341a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgTEST_F(MachineOperatorReducerTest, ChangeUint32ToFloat64WithConstant) {
342a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  TRACED_FOREACH(uint32_t, x, kUint32Values) {
343a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Reduction reduction =
344a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        Reduce(graph()->NewNode(machine()->ChangeUint32ToFloat64(),
345e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org                                Int32Constant(bit_cast<int32_t>(x))));
346a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    ASSERT_TRUE(reduction.Changed());
347a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    EXPECT_THAT(reduction.replacement(), IsFloat64Constant(FastUI2D(x)));
348a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  }
349a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}
350a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
351a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
352a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// -----------------------------------------------------------------------------
353a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// ChangeUint32ToUint64
354a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
355a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
356a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgTEST_F(MachineOperatorReducerTest, ChangeUint32ToUint64WithConstant) {
357a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  TRACED_FOREACH(uint32_t, x, kUint32Values) {
358e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    Reduction reduction =
359e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org        Reduce(graph()->NewNode(machine()->ChangeUint32ToUint64(),
360e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org                                Int32Constant(bit_cast<int32_t>(x))));
361a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    ASSERT_TRUE(reduction.Changed());
362a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    EXPECT_THAT(reduction.replacement(),
363e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org                IsInt64Constant(bit_cast<int64_t>(static_cast<uint64_t>(x))));
364a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  }
365a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}
366a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
367a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
368a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// -----------------------------------------------------------------------------
36906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org// TruncateFloat64ToFloat32
37006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org
37106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org
37206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.orgTEST_F(MachineOperatorReducerTest,
37306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org       TruncateFloat64ToFloat32WithChangeFloat32ToFloat64) {
37406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org  Node* value = Parameter(0);
37506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org  Reduction reduction = Reduce(graph()->NewNode(
37606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org      machine()->TruncateFloat64ToFloat32(),
37706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org      graph()->NewNode(machine()->ChangeFloat32ToFloat64(), value)));
37806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org  ASSERT_TRUE(reduction.Changed());
37906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org  EXPECT_EQ(value, reduction.replacement());
38006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org}
38106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org
38206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org
38306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.orgTEST_F(MachineOperatorReducerTest, TruncateFloat64ToFloat32WithConstant) {
38406b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org  TRACED_FOREACH(double, x, kFloat64Values) {
38506b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    Reduction reduction = Reduce(graph()->NewNode(
38606b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org        machine()->TruncateFloat64ToFloat32(), Float64Constant(x)));
38706b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    ASSERT_TRUE(reduction.Changed());
38806b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org    EXPECT_THAT(reduction.replacement(), IsFloat32Constant(DoubleToFloat32(x)));
38906b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org  }
39006b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org}
39106b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org
39206b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org
39306b2696801712948b665372a38f96b1f10be6997machenbach@chromium.org// -----------------------------------------------------------------------------
394a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// TruncateFloat64ToInt32
395a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
396a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
397a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgTEST_F(MachineOperatorReducerTest,
398a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org       TruncateFloat64ToInt32WithChangeInt32ToFloat64) {
399a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  Node* value = Parameter(0);
400a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  Reduction reduction = Reduce(graph()->NewNode(
401a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      machine()->TruncateFloat64ToInt32(),
402a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      graph()->NewNode(machine()->ChangeInt32ToFloat64(), value)));
403a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  ASSERT_TRUE(reduction.Changed());
404a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  EXPECT_EQ(value, reduction.replacement());
405a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}
406a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
407a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
408a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgTEST_F(MachineOperatorReducerTest, TruncateFloat64ToInt32WithConstant) {
409a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  TRACED_FOREACH(double, x, kFloat64Values) {
410a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Reduction reduction = Reduce(graph()->NewNode(
411a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        machine()->TruncateFloat64ToInt32(), Float64Constant(x)));
412a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    ASSERT_TRUE(reduction.Changed());
413a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    EXPECT_THAT(reduction.replacement(), IsInt32Constant(DoubleToInt32(x)));
414a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  }
415a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}
416a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
417a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
418a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// -----------------------------------------------------------------------------
419a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// TruncateInt64ToInt32
420a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
421a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
422a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgTEST_F(MachineOperatorReducerTest, TruncateInt64ToInt32WithChangeInt32ToInt64) {
423a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  Node* value = Parameter(0);
424a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  Reduction reduction = Reduce(graph()->NewNode(
425a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      machine()->TruncateInt64ToInt32(),
426a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org      graph()->NewNode(machine()->ChangeInt32ToInt64(), value)));
427a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  ASSERT_TRUE(reduction.Changed());
428a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  EXPECT_EQ(value, reduction.replacement());
429a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}
430a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
431a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
432a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.orgTEST_F(MachineOperatorReducerTest, TruncateInt64ToInt32WithConstant) {
433a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  TRACED_FOREACH(int64_t, x, kInt64Values) {
434a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    Reduction reduction = Reduce(
435a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org        graph()->NewNode(machine()->TruncateInt64ToInt32(), Int64Constant(x)));
436a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    ASSERT_TRUE(reduction.Changed());
437a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org    EXPECT_THAT(reduction.replacement(),
438e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org                IsInt32Constant(bit_cast<int32_t>(
439e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org                    static_cast<uint32_t>(bit_cast<uint64_t>(x)))));
440a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  }
441a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org}
442a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
443a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
444a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// -----------------------------------------------------------------------------
445a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org// Word32Ror
446a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
447a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org
4485e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(MachineOperatorReducerTest, ReduceToWord32RorWithParameters) {
4495e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Node* value = Parameter(0);
4505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Node* shift = Parameter(1);
4515e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Node* shl = graph()->NewNode(machine()->Word32Shl(), value, shift);
4525e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Node* shr = graph()->NewNode(
4535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      machine()->Word32Shr(), value,
4545e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      graph()->NewNode(machine()->Int32Sub(), Int32Constant(32), shift));
4555e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4565e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  // (x << y) | (x >> (32 - y)) => x ror y
4575e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Node* node1 = graph()->NewNode(machine()->Word32Or(), shl, shr);
4585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Reduction reduction1 = Reduce(node1);
4595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_TRUE(reduction1.Changed());
4605e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(reduction1.replacement(), node1);
4615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_THAT(reduction1.replacement(), IsWord32Ror(value, shift));
4625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4635e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  // (x >> (32 - y)) | (x << y) => x ror y
4645e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Node* node2 = graph()->NewNode(machine()->Word32Or(), shr, shl);
4655e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Reduction reduction2 = Reduce(node2);
4665e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_TRUE(reduction2.Changed());
4675e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(reduction2.replacement(), node2);
4685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_THAT(reduction2.replacement(), IsWord32Ror(value, shift));
4695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
4705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(MachineOperatorReducerTest, ReduceToWord32RorWithConstant) {
4735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Node* value = Parameter(0);
4745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  TRACED_FORRANGE(int32_t, k, 0, 31) {
4755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Node* shl =
4765e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        graph()->NewNode(machine()->Word32Shl(), value, Int32Constant(k));
4775e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Node* shr =
4785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org        graph()->NewNode(machine()->Word32Shr(), value, Int32Constant(32 - k));
4795e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    // (x << K) | (x >> ((32 - K) - y)) => x ror K
4815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Node* node1 = graph()->NewNode(machine()->Word32Or(), shl, shr);
4825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Reduction reduction1 = Reduce(node1);
4835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_TRUE(reduction1.Changed());
4845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(reduction1.replacement(), node1);
4855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_THAT(reduction1.replacement(),
4865e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                IsWord32Ror(value, IsInt32Constant(k)));
4875e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4885e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    // (x >> (32 - K)) | (x << K) => x ror K
4895e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Node* node2 = graph()->NewNode(machine()->Word32Or(), shr, shl);
4905e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    Reduction reduction2 = Reduce(node2);
4915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_TRUE(reduction2.Changed());
4925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_EQ(reduction2.replacement(), node2);
4935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    EXPECT_THAT(reduction2.replacement(),
4945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                IsWord32Ror(value, IsInt32Constant(k)));
4955e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
4965e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
4975e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4995e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(MachineOperatorReducerTest, Word32RorWithZeroShift) {
5005e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Node* value = Parameter(0);
5015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Node* node =
5025e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      graph()->NewNode(machine()->Word32Ror(), value, Int32Constant(0));
5035e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Reduction reduction = Reduce(node);
5045e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_TRUE(reduction.Changed());
5055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  EXPECT_EQ(reduction.replacement(), value);
5065e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
5075e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
5085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
5095e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgTEST_F(MachineOperatorReducerTest, Word32RorWithConstants) {
510a8702c210b949f35c64d8e4aa01bb6d525086c85machenbach@chromium.org  TRACED_FOREACH(int32_t, x, kUint32Values) {
5115e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    TRACED_FORRANGE(int32_t, y, 0, 31) {
5125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Node* node = graph()->NewNode(machine()->Word32Ror(), Int32Constant(x),
5135e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                                    Int32Constant(y));
5145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      Reduction reduction = Reduce(node);
5155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_TRUE(reduction.Changed());
5165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      EXPECT_THAT(reduction.replacement(),
5175e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                  IsInt32Constant(base::bits::RotateRight32(x, y)));
5185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    }
5195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  }
5205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
5215e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
5222c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
5232c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org// -----------------------------------------------------------------------------
5242c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org// Int32AddWithOverflow
5252c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
5262c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
5272c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgTEST_F(MachineOperatorReducerTest, Int32AddWithOverflowWithZero) {
5282c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  Node* p0 = Parameter(0);
5292c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  {
5302c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    Node* add = graph()->NewNode(machine()->Int32AddWithOverflow(),
5312c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org                                 Int32Constant(0), p0);
5322c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
5332c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    Reduction r = Reduce(graph()->NewNode(common()->Projection(1), add));
5342c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    ASSERT_TRUE(r.Changed());
5352c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    EXPECT_THAT(r.replacement(), IsInt32Constant(0));
5362c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
5372c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    r = Reduce(graph()->NewNode(common()->Projection(0), add));
5382c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    ASSERT_TRUE(r.Changed());
5392c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    EXPECT_EQ(p0, r.replacement());
5402c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  }
5412c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  {
5422c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    Node* add = graph()->NewNode(machine()->Int32AddWithOverflow(), p0,
5432c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org                                 Int32Constant(0));
5442c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
5452c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    Reduction r = Reduce(graph()->NewNode(common()->Projection(1), add));
5462c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    ASSERT_TRUE(r.Changed());
5472c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    EXPECT_THAT(r.replacement(), IsInt32Constant(0));
5482c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
5492c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    r = Reduce(graph()->NewNode(common()->Projection(0), add));
5502c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    ASSERT_TRUE(r.Changed());
5512c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    EXPECT_EQ(p0, r.replacement());
5522c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  }
5532c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org}
5542c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
5552c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
5562c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgTEST_F(MachineOperatorReducerTest, Int32AddWithOverflowWithConstant) {
5572c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  TRACED_FOREACH(int32_t, x, kInt32Values) {
5582c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    TRACED_FOREACH(int32_t, y, kInt32Values) {
5592c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      int32_t z;
5602c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      Node* add = graph()->NewNode(machine()->Int32AddWithOverflow(),
5612c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org                                   Int32Constant(x), Int32Constant(y));
5622c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
5632c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      Reduction r = Reduce(graph()->NewNode(common()->Projection(1), add));
5642c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      ASSERT_TRUE(r.Changed());
5652c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      EXPECT_THAT(r.replacement(),
5662c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org                  IsInt32Constant(base::bits::SignedAddOverflow32(x, y, &z)));
5672c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
5682c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      r = Reduce(graph()->NewNode(common()->Projection(0), add));
5692c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      ASSERT_TRUE(r.Changed());
5702c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      EXPECT_THAT(r.replacement(), IsInt32Constant(z));
5712c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    }
5722c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  }
5732c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org}
5742c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
5752c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
5762c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org// -----------------------------------------------------------------------------
5772c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org// Int32SubWithOverflow
5782c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
5792c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
5802c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgTEST_F(MachineOperatorReducerTest, Int32SubWithOverflowWithZero) {
5812c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  Node* p0 = Parameter(0);
5822c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  Node* add =
5832c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      graph()->NewNode(machine()->Int32SubWithOverflow(), p0, Int32Constant(0));
5842c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
5852c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  Reduction r = Reduce(graph()->NewNode(common()->Projection(1), add));
5862c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  ASSERT_TRUE(r.Changed());
5872c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  EXPECT_THAT(r.replacement(), IsInt32Constant(0));
5882c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
5892c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  r = Reduce(graph()->NewNode(common()->Projection(0), add));
5902c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  ASSERT_TRUE(r.Changed());
5912c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  EXPECT_EQ(p0, r.replacement());
5922c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org}
5932c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
5942c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
5952c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.orgTEST_F(MachineOperatorReducerTest, Int32SubWithOverflowWithConstant) {
5962c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  TRACED_FOREACH(int32_t, x, kInt32Values) {
5972c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    TRACED_FOREACH(int32_t, y, kInt32Values) {
5982c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      int32_t z;
5992c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      Node* add = graph()->NewNode(machine()->Int32SubWithOverflow(),
6002c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org                                   Int32Constant(x), Int32Constant(y));
6012c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
6022c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      Reduction r = Reduce(graph()->NewNode(common()->Projection(1), add));
6032c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      ASSERT_TRUE(r.Changed());
6042c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      EXPECT_THAT(r.replacement(),
6052c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org                  IsInt32Constant(base::bits::SignedSubOverflow32(x, y, &z)));
6062c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
6072c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      r = Reduce(graph()->NewNode(common()->Projection(0), add));
6082c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      ASSERT_TRUE(r.Changed());
6092c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org      EXPECT_THAT(r.replacement(), IsInt32Constant(z));
6102c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org    }
6112c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  }
6122c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org}
6132c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
6145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}  // namespace compiler
6155e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}  // namespace internal
6165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}  // namespace v8
617