25 MachineOperatorReducer reducer(&jsgraph);
26 return reducer.Reduce(node);
39 public ::testing::WithParamInterface<T> {
50 -std::numeric_limits<float>::infinity(), -2.70497e+38f, -1.4698e+37f,
51 -1.22813e+35f, -1.20555e+35f, -1.34584e+34f,
52 -1.0079e+32f, -6.49364e+26f, -3.06077e+25f,
53 -1.46821e+25f, -1.17658e+23f, -1.9617e+22f,
54 -2.7357e+20f, -1.48708e+13f, -1.89633e+12f,
55 -4.66622e+11f, -2.22581e+11f, -1.45381e+10f,
56 -1.3956e+09f, -1.32951e+09f, -1.30721e+09f,
57 -1.19756e+09f, -9.26822e+08f, -6.35647e+08f,
58 -4.00037e+08f, -1.81227e+08f, -5.09256e+07f,
59 -964300.0f, -192446.0f, -28455.0f,
60 -27194.0f, -26401.0f, -20575.0f,
61 -17069.0f, -9167.0f, -960.178f,
62 -113.0f, -62.0f, -15.0f,
63 -7.0f, -0.0256635f, -4.60374e-07f,
64 -3.63759e-10f, -4.30175e-14f, -5.27385e-15f,
65 -1.48084e-15f, -1.05755e-19f, -3.2995e-21f,
66 -1.67354e-23f, -1.11885e-23f, -1.78506e-30f,
67 -5.07594e-31f, -3.65799e-31f, -1.43718e-34f,
68 -1.27126e-38f, -0.0f, 0.0f,
69 1.17549e-38f, 1.56657e-37f, 4.08512e-29f,
70 3.31357e-28f, 6.25073e-22f, 4.1723e-13f,
71 1.44343e-09f, 5.27004e-08f, 9.48298e-08f,
72 5.57888e-07f, 4.89988e-05f, 0.244326f,
73 12.4895f, 19.0f, 47.0f,
74 106.0f, 538.324f, 564.536f,
75 819.124f, 7048.0f, 12611.0f,
76 19878.0f, 20309.0f, 797056.0f,
77 1.77219e+09f, 1.51116e+11f, 4.18193e+13f,
78 3.59167e+16f, 3.38211e+19f, 2.67488e+20f,
79 1.78831e+21f, 9.20914e+21f, 8.35654e+23f,
80 1.4495e+24f, 5.94015e+25f, 4.43608e+30f,
81 2.44502e+33f, 2.61152e+33f, 1.38178e+37f,
82 1.71306e+37f, 3.31899e+38f, 3.40282e+38f,
83 std::numeric_limits<float>::infinity()};
87 -
V8_INFINITY, -4.23878e+275, -5.82632e+265, -6.60355e+220, -6.26172e+212,
88 -2.56222e+211, -4.82408e+201, -1.84106e+157, -1.63662e+127, -1.55772e+100,
89 -1.67813e+72, -2.3382e+55, -3.179e+30, -1.441e+09, -1.0647e+09,
90 -7.99361e+08, -5.77375e+08, -2.20984e+08, -32757, -13171,
91 -9970, -3984, -107, -105, -92,
92 -77, -61, -0.000208163, -1.86685e-06, -1.17296e-10,
93 -9.26358e-11, -5.08004e-60, -1.74753e-65, -1.06561e-71, -5.67879e-79,
94 -5.78459e-130, -2.90989e-171, -7.15489e-243, -3.76242e-252, -1.05639e-263,
95 -4.40497e-267, -2.19666e-273, -4.9998e-276, -5.59821e-278, -2.03855e-282,
96 -5.99335e-283, -7.17554e-284, -3.11744e-309, -0.0, 0.0,
97 2.22507e-308, 1.30127e-270, 7.62898e-260, 4.00313e-249, 3.16829e-233,
98 1.85244e-228, 2.03544e-129, 1.35126e-110, 1.01182e-106, 5.26333e-94,
99 1.35292e-90, 2.85394e-83, 1.78323e-77, 5.4967e-57, 1.03207e-25,
100 4.57401e-25, 1.58738e-05, 2, 125, 2310,
101 9636, 14802, 17168, 28945, 29305,
102 4.81336e+07, 1.41207e+08, 4.65962e+08, 1.40499e+09, 2.12648e+09,
103 8.80006e+30, 1.4446e+45, 1.12164e+54, 2.48188e+89, 6.71121e+102,
104 3.074e+112, 4.9699e+152, 5.58383e+166, 4.30654e+172, 7.08824e+185,
105 9.6586e+214, 2.028e+223, 6.63277e+243, 1.56192e+261, 1.23202e+269,
106 5.72883e+289, 8.5798e+290, 1.40256e+294, 1.79769e+308,
V8_INFINITY};
110 -2147483647 - 1, -1914954528, -1698749618, -1578693386, -1577976073,
111 -1573998034, -1529085059, -1499540537, -1299205097, -1090814845,
112 -938186388, -806828902, -750927650, -520676892, -513661538,
113 -453036354, -433622833, -282638793, -28375, -27788,
114 -22770, -18806, -14173, -11956, -11200,
115 -10212, -8160, -3751, -2758, -1522,
116 -121, -120, -118, -117, -106,
117 -84, -80, -74, -59, -52,
118 -48, -39, -35, -17, -11,
124 89, 90, 97, 104, 118,
125 124, 126, 127, 7278, 17787,
126 24136, 24202, 25570, 26680, 30242,
127 32399, 420886487, 642166225, 821912648, 822577803,
128 851385718, 1212241078, 1411419304, 1589626102, 1596437184,
129 1876245816, 1954730266, 2008792749, 2045320228, 2147483647};
186 0x00000000, 0x00000001, 0xffffffff, 0x1b09788b, 0x04c5fce8, 0xcc0de5bf,
187 0x273a798e, 0x187937a3, 0xece3af83, 0x5495a16b, 0x0b668ecc, 0x11223344,
188 0x0000009e, 0x00000043, 0x0000af73, 0x0000116b, 0x00658ecc, 0x002b3b4c,
189 0x88776655, 0x70000000, 0x07200000, 0x7fffffff, 0x56123761, 0x7fffff00,
190 0x761c4761, 0x80000000, 0x88888888, 0xa0000000, 0xdddddddd, 0xe0000000,
191 0xeeeeeeee, 0xfffffffd, 0xf0000000, 0x007fffff, 0x003fffff, 0x001fffff,
192 0x000fffff, 0x0007ffff, 0x0003ffff, 0x0001ffff, 0x0000ffff, 0x00007fff,
193 0x00003fff, 0x00001fff, 0x00000fff, 0x000007ff, 0x000003ff, 0x000001ff};
216 {&MachineOperatorBuilder::ChangeInt32ToFloat64,
"ChangeInt32ToFloat64"},
217 {&MachineOperatorBuilder::ChangeUint32ToFloat64,
"ChangeUint32ToFloat64"},
218 {&MachineOperatorBuilder::ChangeFloat64ToInt32,
"ChangeFloat64ToInt32"},
219 {&MachineOperatorBuilder::ChangeFloat64ToUint32,
"ChangeFloat64ToUint32"},
220 {&MachineOperatorBuilder::ChangeInt32ToInt64,
"ChangeInt32ToInt64"},
221 {&MachineOperatorBuilder::ChangeUint32ToUint64,
"ChangeUint32ToUint64"},
222 {&MachineOperatorBuilder::TruncateFloat64ToInt32,
"TruncateFloat64ToInt32"},
223 {&MachineOperatorBuilder::TruncateInt64ToInt32,
"TruncateInt64ToInt32"}};
228 typedef MachineOperatorReducerTestWithParam<UnaryOperator>
233 const UnaryOperator unop = GetParam();
234 Reduction reduction =
235 Reduce(graph()->NewNode((machine()->*unop.constructor)(), Parameter(0)));
236 EXPECT_FALSE(reduction.Changed());
251 Reduction reduction = Reduce(graph()->NewNode(
252 machine()->ChangeFloat32ToFloat64(), Float32Constant(x)));
253 ASSERT_TRUE(reduction.Changed());
264 ChangeFloat64ToInt32WithChangeInt32ToFloat64) {
265 Node* value = Parameter(0);
266 Reduction reduction = Reduce(graph()->NewNode(
267 machine()->ChangeFloat64ToInt32(),
268 graph()->NewNode(machine()->ChangeInt32ToFloat64(), value)));
269 ASSERT_TRUE(reduction.Changed());
270 EXPECT_EQ(value, reduction.replacement());
276 Reduction reduction = Reduce(graph()->NewNode(
277 machine()->ChangeFloat64ToInt32(), Float64Constant(
FastI2D(x))));
278 ASSERT_TRUE(reduction.Changed());
289 ChangeFloat64ToUint32WithChangeUint32ToFloat64) {
290 Node* value = Parameter(0);
291 Reduction reduction = Reduce(graph()->NewNode(
292 machine()->ChangeFloat64ToUint32(),
293 graph()->NewNode(machine()->ChangeUint32ToFloat64(), value)));
294 ASSERT_TRUE(reduction.Changed());
295 EXPECT_EQ(value, reduction.replacement());
301 Reduction reduction = Reduce(graph()->NewNode(
302 machine()->ChangeFloat64ToUint32(), Float64Constant(
FastUI2D(x))));
303 ASSERT_TRUE(reduction.Changed());
304 EXPECT_THAT(reduction.replacement(),
IsInt32Constant(bit_cast<int32_t>(x)));
315 Reduction reduction = Reduce(
316 graph()->NewNode(machine()->ChangeInt32ToFloat64(), Int32Constant(x)));
317 ASSERT_TRUE(reduction.Changed());
329 Reduction reduction = Reduce(
330 graph()->NewNode(machine()->ChangeInt32ToInt64(), Int32Constant(x)));
331 ASSERT_TRUE(reduction.Changed());
343 Reduction reduction =
344 Reduce(graph()->NewNode(machine()->ChangeUint32ToFloat64(),
345 Int32Constant(bit_cast<int32_t>(x))));
346 ASSERT_TRUE(reduction.Changed());
358 Reduction reduction =
359 Reduce(graph()->NewNode(machine()->ChangeUint32ToUint64(),
360 Int32Constant(bit_cast<int32_t>(x))));
361 ASSERT_TRUE(reduction.Changed());
362 EXPECT_THAT(reduction.replacement(),
373 TruncateFloat64ToFloat32WithChangeFloat32ToFloat64) {
374 Node* value = Parameter(0);
375 Reduction reduction = Reduce(graph()->NewNode(
376 machine()->TruncateFloat64ToFloat32(),
377 graph()->NewNode(machine()->ChangeFloat32ToFloat64(), value)));
378 ASSERT_TRUE(reduction.Changed());
379 EXPECT_EQ(value, reduction.replacement());
385 Reduction reduction = Reduce(graph()->NewNode(
386 machine()->TruncateFloat64ToFloat32(), Float64Constant(x)));
387 ASSERT_TRUE(reduction.Changed());
398 TruncateFloat64ToInt32WithChangeInt32ToFloat64) {
399 Node* value = Parameter(0);
400 Reduction reduction = Reduce(graph()->NewNode(
401 machine()->TruncateFloat64ToInt32(),
402 graph()->NewNode(machine()->ChangeInt32ToFloat64(), value)));
403 ASSERT_TRUE(reduction.Changed());
404 EXPECT_EQ(value, reduction.replacement());
410 Reduction reduction = Reduce(graph()->NewNode(
411 machine()->TruncateFloat64ToInt32(), Float64Constant(x)));
412 ASSERT_TRUE(reduction.Changed());
423 Node* value = Parameter(0);
424 Reduction reduction = Reduce(graph()->NewNode(
425 machine()->TruncateInt64ToInt32(),
426 graph()->NewNode(machine()->ChangeInt32ToInt64(), value)));
427 ASSERT_TRUE(reduction.Changed());
428 EXPECT_EQ(value, reduction.replacement());
434 Reduction reduction = Reduce(
435 graph()->NewNode(machine()->TruncateInt64ToInt32(), Int64Constant(x)));
436 ASSERT_TRUE(reduction.Changed());
437 EXPECT_THAT(reduction.replacement(),
439 static_cast<uint32_t>(bit_cast<uint64_t>(x)))));
449 Node* value = Parameter(0);
450 Node*
shift = Parameter(1);
451 Node* shl = graph()->NewNode(machine()->Word32Shl(), value,
shift);
452 Node* shr = graph()->NewNode(
453 machine()->Word32Shr(), value,
454 graph()->NewNode(machine()->Int32Sub(), Int32Constant(32),
shift));
457 Node* node1 = graph()->NewNode(machine()->Word32Or(), shl, shr);
458 Reduction reduction1 = Reduce(node1);
459 EXPECT_TRUE(reduction1.Changed());
460 EXPECT_EQ(reduction1.replacement(), node1);
464 Node* node2 = graph()->NewNode(machine()->Word32Or(), shr, shl);
465 Reduction reduction2 = Reduce(node2);
466 EXPECT_TRUE(reduction2.Changed());
467 EXPECT_EQ(reduction2.replacement(), node2);
473 Node* value = Parameter(0);
474 TRACED_FORRANGE(
int32_t, k, 0, 31) {
476 graph()->NewNode(machine()->Word32Shl(), value, Int32Constant(k));
478 graph()->NewNode(machine()->Word32Shr(), value, Int32Constant(32 - k));
481 Node* node1 = graph()->NewNode(machine()->Word32Or(), shl, shr);
482 Reduction reduction1 = Reduce(node1);
483 EXPECT_TRUE(reduction1.Changed());
484 EXPECT_EQ(reduction1.replacement(), node1);
485 EXPECT_THAT(reduction1.replacement(),
489 Node* node2 = graph()->NewNode(machine()->Word32Or(), shr, shl);
490 Reduction reduction2 = Reduce(node2);
491 EXPECT_TRUE(reduction2.Changed());
492 EXPECT_EQ(reduction2.replacement(), node2);
493 EXPECT_THAT(reduction2.replacement(),
500 Node* value = Parameter(0);
502 graph()->NewNode(machine()->Word32Ror(), value, Int32Constant(0));
503 Reduction reduction = Reduce(node);
504 EXPECT_TRUE(reduction.Changed());
505 EXPECT_EQ(reduction.replacement(), value);
511 TRACED_FORRANGE(
int32_t,
y, 0, 31) {
512 Node* node = graph()->NewNode(machine()->Word32Ror(), Int32Constant(x),
514 Reduction reduction = Reduce(node);
515 EXPECT_TRUE(reduction.Changed());
516 EXPECT_THAT(reduction.replacement(),
528 Node*
p0 = Parameter(0);
529 Node* node = graph()->NewNode(machine()->Word32Shl(),
p0, Int32Constant(0));
530 Reduction r = Reduce(node);
531 ASSERT_TRUE(r.Changed());
532 EXPECT_EQ(
p0, r.replacement());
537 Node*
p0 = Parameter(0);
538 TRACED_FORRANGE(
int32_t, x, 1, 31) {
539 Node* node = graph()->NewNode(
540 machine()->Word32Shl(),
541 graph()->NewNode(machine()->Word32Sar(),
p0, Int32Constant(x)),
543 Reduction r = Reduce(node);
544 ASSERT_TRUE(r.Changed());
545 int32_t m = bit_cast<int32_t>(~((1U << x) - 1U));
552 Node*
p0 = Parameter(0);
553 TRACED_FORRANGE(
int32_t, x, 1, 31) {
554 Node* node = graph()->NewNode(
555 machine()->Word32Shl(),
556 graph()->NewNode(machine()->Word32Shr(),
p0, Int32Constant(x)),
558 Reduction r = Reduce(node);
559 ASSERT_TRUE(r.Changed());
560 int32_t m = bit_cast<int32_t>(~((1U << x) - 1U));
571 Node*
p0 = Parameter(0);
573 Node* add = graph()->NewNode(machine()->Int32AddWithOverflow(),
574 Int32Constant(0),
p0);
576 Reduction r = Reduce(graph()->NewNode(common()->Projection(1), add));
577 ASSERT_TRUE(r.Changed());
580 r = Reduce(graph()->NewNode(common()->Projection(0), add));
581 ASSERT_TRUE(r.Changed());
582 EXPECT_EQ(
p0, r.replacement());
585 Node* add = graph()->NewNode(machine()->Int32AddWithOverflow(),
p0,
588 Reduction r = Reduce(graph()->NewNode(common()->Projection(1), add));
589 ASSERT_TRUE(r.Changed());
592 r = Reduce(graph()->NewNode(common()->Projection(0), add));
593 ASSERT_TRUE(r.Changed());
594 EXPECT_EQ(
p0, r.replacement());
603 Node* add = graph()->NewNode(machine()->Int32AddWithOverflow(),
604 Int32Constant(x), Int32Constant(
y));
606 Reduction r = Reduce(graph()->NewNode(common()->Projection(1), add));
607 ASSERT_TRUE(r.Changed());
608 EXPECT_THAT(r.replacement(),
611 r = Reduce(graph()->NewNode(common()->Projection(0), add));
612 ASSERT_TRUE(r.Changed());
624 Node*
p0 = Parameter(0);
626 graph()->NewNode(machine()->Int32SubWithOverflow(),
p0, Int32Constant(0));
628 Reduction r = Reduce(graph()->NewNode(common()->Projection(1), add));
629 ASSERT_TRUE(r.Changed());
632 r = Reduce(graph()->NewNode(common()->Projection(0), add));
633 ASSERT_TRUE(r.Changed());
634 EXPECT_EQ(
p0, r.replacement());
642 Node* add = graph()->NewNode(machine()->Int32SubWithOverflow(),
643 Int32Constant(x), Int32Constant(
y));
645 Reduction r = Reduce(graph()->NewNode(common()->Projection(1), add));
646 ASSERT_TRUE(r.Changed());
647 EXPECT_THAT(r.replacement(),
650 r = Reduce(graph()->NewNode(common()->Projection(0), add));
651 ASSERT_TRUE(r.Changed());
CommonOperatorBuilder * common()
MachineOperatorReducerTestWithParam(int num_parameters=2)
virtual ~MachineOperatorReducerTestWithParam()
Reduction Reduce(Node *node)
MachineOperatorBuilder * machine()
MachineOperatorReducerTest(int num_parameters=2)
MachineOperatorBuilder machine_
enable harmony numeric enable harmony object literal extensions Optimize object Array shift
uint32_t RotateRight32(uint32_t value, uint32_t shift)
bool SignedAddOverflow32(int32_t lhs, int32_t rhs, int32_t *val)
bool SignedSubOverflow32(int32_t lhs, int32_t rhs, int32_t *val)
static const double kFloat64Values[]
static const int32_t kInt32Values[]
static const float kFloat32Values[]
static const int64_t kInt64Values[]
static const UnaryOperator kUnaryOperators[]
static const uint32_t kUint32Values[]
Matcher< Node * > IsFloat64Constant(const Matcher< double > &value_matcher)
Matcher< Node * > IsInt64Constant(const Matcher< int64_t > &value_matcher)
MachineOperatorReducerTestWithParam< UnaryOperator > MachineUnaryOperatorReducerTest
std::ostream & operator<<(std::ostream &os, const MachineType &type)
Matcher< Node * > IsFloat32Constant(const Matcher< float > &value_matcher)
Matcher< Node * > IsWord32Ror(const Matcher< Node * > &lhs_matcher, const Matcher< Node * > &rhs_matcher)
Matcher< Node * > IsInt32Constant(const Matcher< int32_t > &value_matcher)
Matcher< Node * > IsWord32And(const Matcher< Node * > &lhs_matcher, const Matcher< Node * > &rhs_matcher)
TEST_P(InstructionSelectorDPITest, Parameters)
INSTANTIATE_TEST_CASE_P(InstructionSelectorTest, InstructionSelectorDPITest, ::testing::ValuesIn(kDPIs))
TEST_F(InstructionSelectorTest, ChangeFloat32ToFloat64WithParameter)
int32_t DoubleToInt32(double x)
float DoubleToFloat32(double x)
double FastUI2D(unsigned x)
Debugger support for the V8 JavaScript engine.
const char * constructor_name
const Operator *(MachineOperatorBuilder::* constructor)()