OLD | NEW |
---|---|
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/js-graph.h" | 5 #include "src/compiler/js-graph.h" |
6 #include "src/compiler/js-typed-lowering.h" | 6 #include "src/compiler/js-typed-lowering.h" |
7 #include "src/compiler/machine-operator.h" | 7 #include "src/compiler/machine-operator.h" |
8 #include "src/compiler/node-properties.h" | 8 #include "src/compiler/node-properties.h" |
9 #include "src/compiler/opcodes.h" | 9 #include "src/compiler/opcodes.h" |
10 #include "src/compiler/operator-properties.h" | 10 #include "src/compiler/operator-properties.h" |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
220 #if 0 | 220 #if 0 |
221 TEST(StringBinops) { | 221 TEST(StringBinops) { |
222 JSTypedLoweringTester R; | 222 JSTypedLoweringTester R; |
223 | 223 |
224 for (size_t i = 0; i < arraysize(kStringTypes); ++i) { | 224 for (size_t i = 0; i < arraysize(kStringTypes); ++i) { |
225 Node* p0 = R.Parameter(kStringTypes[i], 0); | 225 Node* p0 = R.Parameter(kStringTypes[i], 0); |
226 | 226 |
227 for (size_t j = 0; j < arraysize(kStringTypes); ++j) { | 227 for (size_t j = 0; j < arraysize(kStringTypes); ++j) { |
228 Node* p1 = R.Parameter(kStringTypes[j], 1); | 228 Node* p1 = R.Parameter(kStringTypes[j], 1); |
229 | 229 |
230 Node* add = R.Binop(R.javascript.Add(), p0, p1); | 230 Node* add = R.Binop(R.javascript.Add(language_mode), p0, p1); |
231 Node* r = R.reduce(add); | 231 Node* r = R.reduce(add); |
232 | 232 |
233 R.CheckPureBinop(IrOpcode::kStringAdd, r); | 233 R.CheckPureBinop(IrOpcode::kStringAdd, r); |
234 CHECK_EQ(p0, r->InputAt(0)); | 234 CHECK_EQ(p0, r->InputAt(0)); |
235 CHECK_EQ(p1, r->InputAt(1)); | 235 CHECK_EQ(p1, r->InputAt(1)); |
236 } | 236 } |
237 } | 237 } |
238 } | 238 } |
239 #endif | 239 #endif |
240 | 240 |
241 | 241 |
242 TEST(AddNumber1) { | 242 TEST_WITH_STRONG(AddNumber1) { |
243 JSTypedLoweringTester R; | 243 JSTypedLoweringTester R; |
244 for (size_t i = 0; i < arraysize(kNumberTypes); ++i) { | 244 for (size_t i = 0; i < arraysize(kNumberTypes); ++i) { |
245 Node* p0 = R.Parameter(kNumberTypes[i], 0); | 245 Node* p0 = R.Parameter(kNumberTypes[i], 0); |
246 Node* p1 = R.Parameter(kNumberTypes[i], 1); | 246 Node* p1 = R.Parameter(kNumberTypes[i], 1); |
247 Node* add = R.Binop(R.javascript.Add(), p0, p1); | 247 Node* add = R.Binop(R.javascript.Add(language_mode), p0, p1); |
248 Node* r = R.reduce(add); | 248 Node* r = R.reduce(add); |
249 | 249 |
250 R.CheckPureBinop(IrOpcode::kNumberAdd, r); | 250 R.CheckPureBinop(IrOpcode::kNumberAdd, r); |
251 CHECK_EQ(p0, r->InputAt(0)); | 251 CHECK_EQ(p0, r->InputAt(0)); |
252 CHECK_EQ(p1, r->InputAt(1)); | 252 CHECK_EQ(p1, r->InputAt(1)); |
253 } | 253 } |
254 } | 254 } |
255 | 255 |
256 | 256 |
257 TEST(NumberBinops) { | 257 TEST_WITH_STRONG(NumberBinops) { |
258 JSTypedLoweringTester R; | 258 JSTypedLoweringTester R; |
259 const Operator* ops[] = { | 259 const Operator* ops[] = { |
260 R.javascript.Add(), R.simplified.NumberAdd(), | 260 R.javascript.Add(language_mode), R.simplified.NumberAdd(), |
261 R.javascript.Subtract(), R.simplified.NumberSubtract(), | 261 R.javascript.Subtract(language_mode), R.simplified.NumberSubtract(), |
262 R.javascript.Multiply(), R.simplified.NumberMultiply(), | 262 R.javascript.Multiply(language_mode), R.simplified.NumberMultiply(), |
263 R.javascript.Divide(), R.simplified.NumberDivide(), | 263 R.javascript.Divide(language_mode), R.simplified.NumberDivide(), |
264 R.javascript.Modulus(), R.simplified.NumberModulus(), | 264 R.javascript.Modulus(language_mode), R.simplified.NumberModulus(), |
265 }; | 265 }; |
266 | 266 |
267 for (size_t i = 0; i < arraysize(kNumberTypes); ++i) { | 267 for (size_t i = 0; i < arraysize(kNumberTypes); ++i) { |
268 Node* p0 = R.Parameter(kNumberTypes[i], 0); | 268 Node* p0 = R.Parameter(kNumberTypes[i], 0); |
269 | 269 |
270 for (size_t j = 0; j < arraysize(kNumberTypes); ++j) { | 270 for (size_t j = 0; j < arraysize(kNumberTypes); ++j) { |
271 Node* p1 = R.Parameter(kNumberTypes[j], 1); | 271 Node* p1 = R.Parameter(kNumberTypes[j], 1); |
272 | 272 |
273 for (size_t k = 0; k < arraysize(ops); k += 2) { | 273 for (size_t k = 0; k < arraysize(ops); k += 2) { |
274 Node* add = R.Binop(ops[k], p0, p1); | 274 Node* add = R.Binop(ops[k], p0, p1); |
(...skipping 19 matching lines...) Expand all Loading... | |
294 double v = OpParameter<double>(new_input); | 294 double v = OpParameter<double>(new_input); |
295 double e = static_cast<double>(is_signed ? FastD2I(v) : FastD2UI(v)); | 295 double e = static_cast<double>(is_signed ? FastD2I(v) : FastD2UI(v)); |
296 CHECK_EQ(e, v); | 296 CHECK_EQ(e, v); |
297 } | 297 } |
298 } | 298 } |
299 | 299 |
300 | 300 |
301 // A helper class for testing lowering of bitwise shift operators. | 301 // A helper class for testing lowering of bitwise shift operators. |
302 class JSBitwiseShiftTypedLoweringTester : public JSTypedLoweringTester { | 302 class JSBitwiseShiftTypedLoweringTester : public JSTypedLoweringTester { |
303 public: | 303 public: |
304 explicit JSBitwiseShiftTypedLoweringTester(LanguageMode language_mode) | |
305 : JSTypedLoweringTester(), language_mode_(language_mode) { | |
306 int i = 0; | |
307 set(i++, javascript.ShiftLeft(language_mode_), true); | |
308 set(i++, machine.Word32Shl(), false); | |
309 set(i++, javascript.ShiftRight(language_mode_), true); | |
310 set(i++, machine.Word32Sar(), false); | |
311 set(i++, javascript.ShiftRightLogical(language_mode_), false); | |
312 set(i++, machine.Word32Shr(), false); | |
313 } | |
304 static const int kNumberOps = 6; | 314 static const int kNumberOps = 6; |
305 const Operator* ops[kNumberOps]; | 315 const Operator* ops[kNumberOps]; |
306 bool signedness[kNumberOps]; | 316 bool signedness[kNumberOps]; |
307 | 317 |
308 JSBitwiseShiftTypedLoweringTester() { | |
309 int i = 0; | |
310 set(i++, javascript.ShiftLeft(), true); | |
311 set(i++, machine.Word32Shl(), false); | |
312 set(i++, javascript.ShiftRight(), true); | |
313 set(i++, machine.Word32Sar(), false); | |
314 set(i++, javascript.ShiftRightLogical(), false); | |
315 set(i++, machine.Word32Shr(), false); | |
316 } | |
317 | |
318 private: | 318 private: |
319 LanguageMode language_mode_; | |
319 void set(int idx, const Operator* op, bool s) { | 320 void set(int idx, const Operator* op, bool s) { |
320 ops[idx] = op; | 321 ops[idx] = op; |
321 signedness[idx] = s; | 322 signedness[idx] = s; |
322 } | 323 } |
323 }; | 324 }; |
324 | 325 |
325 | 326 |
326 TEST(Int32BitwiseShifts) { | 327 TEST(Int32BitwiseShifts) { |
327 JSBitwiseShiftTypedLoweringTester R; | 328 JSBitwiseShiftTypedLoweringTester R(LanguageMode::SLOPPY); |
328 | 329 |
329 Type* types[] = { | 330 Type* types[] = { |
330 Type::SignedSmall(), Type::UnsignedSmall(), Type::Negative32(), | 331 Type::SignedSmall(), Type::UnsignedSmall(), Type::Negative32(), |
331 Type::Unsigned31(), Type::Unsigned32(), Type::Signed32(), | 332 Type::Unsigned31(), Type::Unsigned32(), Type::Signed32(), |
332 Type::MinusZero(), Type::NaN(), Type::Undefined(), | 333 Type::MinusZero(), Type::NaN(), Type::Undefined(), |
333 Type::Null(), Type::Boolean(), Type::Number(), | 334 Type::Null(), Type::Boolean(), Type::Number(), |
334 Type::PlainNumber(), Type::String()}; | 335 Type::PlainNumber(), Type::String()}; |
335 | 336 |
336 for (size_t i = 0; i < arraysize(types); ++i) { | 337 for (size_t i = 0; i < arraysize(types); ++i) { |
337 Node* p0 = R.Parameter(types[i], 0); | 338 Node* p0 = R.Parameter(types[i], 0); |
(...skipping 20 matching lines...) Expand all Loading... | |
358 } | 359 } |
359 } | 360 } |
360 } | 361 } |
361 } | 362 } |
362 } | 363 } |
363 | 364 |
364 | 365 |
365 // A helper class for testing lowering of bitwise operators. | 366 // A helper class for testing lowering of bitwise operators. |
366 class JSBitwiseTypedLoweringTester : public JSTypedLoweringTester { | 367 class JSBitwiseTypedLoweringTester : public JSTypedLoweringTester { |
367 public: | 368 public: |
369 explicit JSBitwiseTypedLoweringTester(LanguageMode language_mode) | |
370 : JSTypedLoweringTester(), language_mode_(language_mode) { | |
371 int i = 0; | |
372 set(i++, javascript.BitwiseOr(language_mode_), true); | |
373 set(i++, machine.Word32Or(), true); | |
374 set(i++, javascript.BitwiseXor(language_mode_), true); | |
375 set(i++, machine.Word32Xor(), true); | |
376 set(i++, javascript.BitwiseAnd(language_mode_), true); | |
377 set(i++, machine.Word32And(), true); | |
378 } | |
368 static const int kNumberOps = 6; | 379 static const int kNumberOps = 6; |
369 const Operator* ops[kNumberOps]; | 380 const Operator* ops[kNumberOps]; |
370 bool signedness[kNumberOps]; | 381 bool signedness[kNumberOps]; |
371 | 382 |
372 JSBitwiseTypedLoweringTester() { | |
373 int i = 0; | |
374 set(i++, javascript.BitwiseOr(), true); | |
375 set(i++, machine.Word32Or(), true); | |
376 set(i++, javascript.BitwiseXor(), true); | |
377 set(i++, machine.Word32Xor(), true); | |
378 set(i++, javascript.BitwiseAnd(), true); | |
379 set(i++, machine.Word32And(), true); | |
380 } | |
381 | |
382 private: | 383 private: |
384 LanguageMode language_mode_; | |
383 void set(int idx, const Operator* op, bool s) { | 385 void set(int idx, const Operator* op, bool s) { |
384 ops[idx] = op; | 386 ops[idx] = op; |
385 signedness[idx] = s; | 387 signedness[idx] = s; |
386 } | 388 } |
387 }; | 389 }; |
388 | 390 |
389 | 391 |
390 TEST(Int32BitwiseBinops) { | 392 TEST(Int32BitwiseBinops) { |
391 JSBitwiseTypedLoweringTester R; | 393 JSBitwiseTypedLoweringTester R(LanguageMode::SLOPPY); |
392 | 394 |
393 Type* types[] = { | 395 Type* types[] = { |
394 Type::SignedSmall(), Type::UnsignedSmall(), Type::Unsigned32(), | 396 Type::SignedSmall(), Type::UnsignedSmall(), Type::Unsigned32(), |
395 Type::Signed32(), Type::MinusZero(), Type::NaN(), | 397 Type::Signed32(), Type::MinusZero(), Type::NaN(), |
396 Type::OrderedNumber(), Type::PlainNumber(), Type::Undefined(), | 398 Type::OrderedNumber(), Type::PlainNumber(), Type::Undefined(), |
397 Type::Null(), Type::Boolean(), Type::Number(), | 399 Type::Null(), Type::Boolean(), Type::Number(), |
398 Type::String()}; | 400 Type::String()}; |
399 | 401 |
400 for (size_t i = 0; i < arraysize(types); ++i) { | 402 for (size_t i = 0; i < arraysize(types); ++i) { |
401 Node* p0 = R.Parameter(types[i], 0); | 403 Node* p0 = R.Parameter(types[i], 0); |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
572 CHECK_EQ(IrOpcode::kHeapConstant, r->opcode()); | 574 CHECK_EQ(IrOpcode::kHeapConstant, r->opcode()); |
573 } | 575 } |
574 | 576 |
575 CHECK_EQ(n, add->InputAt(0)); | 577 CHECK_EQ(n, add->InputAt(0)); |
576 CHECK_EQ(r, add->InputAt(1)); | 578 CHECK_EQ(r, add->InputAt(1)); |
577 R.CheckEffectInput(R.start(), effect_use); | 579 R.CheckEffectInput(R.start(), effect_use); |
578 } | 580 } |
579 } | 581 } |
580 | 582 |
581 | 583 |
582 TEST(StringComparison) { | 584 TEST_WITH_STRONG(StringComparison) { |
583 JSTypedLoweringTester R; | 585 JSTypedLoweringTester R; |
584 | 586 |
585 const Operator* ops[] = { | 587 const Operator* ops[] = { |
586 R.javascript.LessThan(), R.simplified.StringLessThan(), | 588 R.javascript.LessThan(language_mode), R.simplified.StringLessThan(), |
587 R.javascript.LessThanOrEqual(), R.simplified.StringLessThanOrEqual(), | 589 R.javascript.LessThanOrEqual(language_mode), |
588 R.javascript.GreaterThan(), R.simplified.StringLessThan(), | 590 R.simplified.StringLessThanOrEqual(), |
589 R.javascript.GreaterThanOrEqual(), R.simplified.StringLessThanOrEqual()}; | 591 R.javascript.GreaterThan(language_mode), R.simplified.StringLessThan(), |
592 R.javascript.GreaterThanOrEqual(language_mode), | |
593 R.simplified.StringLessThanOrEqual()}; | |
590 | 594 |
591 for (size_t i = 0; i < arraysize(kStringTypes); i++) { | 595 for (size_t i = 0; i < arraysize(kStringTypes); i++) { |
592 Node* p0 = R.Parameter(kStringTypes[i], 0); | 596 Node* p0 = R.Parameter(kStringTypes[i], 0); |
593 for (size_t j = 0; j < arraysize(kStringTypes); j++) { | 597 for (size_t j = 0; j < arraysize(kStringTypes); j++) { |
594 Node* p1 = R.Parameter(kStringTypes[j], 1); | 598 Node* p1 = R.Parameter(kStringTypes[j], 1); |
595 | 599 |
596 for (size_t k = 0; k < arraysize(ops); k += 2) { | 600 for (size_t k = 0; k < arraysize(ops); k += 2) { |
597 Node* cmp = R.Binop(ops[k], p0, p1); | 601 Node* cmp = R.Binop(ops[k], p0, p1); |
598 Node* r = R.reduce(cmp); | 602 Node* r = R.reduce(cmp); |
599 | 603 |
(...skipping 20 matching lines...) Expand all Loading... | |
620 CHECK_EQ(IrOpcode::kBooleanToNumber, converted->opcode()); | 624 CHECK_EQ(IrOpcode::kBooleanToNumber, converted->opcode()); |
621 CHECK_EQ(val, converted->InputAt(0)); | 625 CHECK_EQ(val, converted->InputAt(0)); |
622 } else { | 626 } else { |
623 if (converted->opcode() == IrOpcode::kNumberConstant) return; | 627 if (converted->opcode() == IrOpcode::kNumberConstant) return; |
624 CHECK_EQ(IrOpcode::kJSToNumber, converted->opcode()); | 628 CHECK_EQ(IrOpcode::kJSToNumber, converted->opcode()); |
625 CHECK_EQ(val, converted->InputAt(0)); | 629 CHECK_EQ(val, converted->InputAt(0)); |
626 } | 630 } |
627 } | 631 } |
628 | 632 |
629 | 633 |
630 TEST(NumberComparison) { | 634 TEST_WITH_STRONG(NumberComparison) { |
631 JSTypedLoweringTester R; | 635 JSTypedLoweringTester R; |
632 | 636 |
633 const Operator* ops[] = { | 637 const Operator* ops[] = { |
634 R.javascript.LessThan(), R.simplified.NumberLessThan(), | 638 R.javascript.LessThan(language_mode), R.simplified.NumberLessThan(), |
635 R.javascript.LessThanOrEqual(), R.simplified.NumberLessThanOrEqual(), | 639 R.javascript.LessThanOrEqual(language_mode), |
636 R.javascript.GreaterThan(), R.simplified.NumberLessThan(), | 640 R.simplified.NumberLessThanOrEqual(), |
637 R.javascript.GreaterThanOrEqual(), R.simplified.NumberLessThanOrEqual()}; | 641 R.javascript.GreaterThan(language_mode), R.simplified.NumberLessThan(), |
642 R.javascript.GreaterThanOrEqual(language_mode), | |
643 R.simplified.NumberLessThanOrEqual()}; | |
638 | 644 |
639 Node* const p0 = R.Parameter(Type::Number(), 0); | 645 Node* const p0 = R.Parameter(Type::Number(), 0); |
640 Node* const p1 = R.Parameter(Type::Number(), 1); | 646 Node* const p1 = R.Parameter(Type::Number(), 1); |
641 | 647 |
642 for (size_t k = 0; k < arraysize(ops); k += 2) { | 648 for (size_t k = 0; k < arraysize(ops); k += 2) { |
643 Node* cmp = R.Binop(ops[k], p0, p1); | 649 Node* cmp = R.Binop(ops[k], p0, p1); |
644 Node* r = R.reduce(cmp); | 650 Node* r = R.reduce(cmp); |
645 | 651 |
646 R.CheckPureBinop(ops[k + 1], r); | 652 R.CheckPureBinop(ops[k + 1], r); |
647 if (k >= 4) { | 653 if (k >= 4) { |
648 // GreaterThan and GreaterThanOrEqual commute the inputs | 654 // GreaterThan and GreaterThanOrEqual commute the inputs |
649 // and use the LessThan and LessThanOrEqual operators. | 655 // and use the LessThan and LessThanOrEqual operators. |
650 CheckIsConvertedToNumber(p1, r->InputAt(0)); | 656 CheckIsConvertedToNumber(p1, r->InputAt(0)); |
651 CheckIsConvertedToNumber(p0, r->InputAt(1)); | 657 CheckIsConvertedToNumber(p0, r->InputAt(1)); |
652 } else { | 658 } else { |
653 CheckIsConvertedToNumber(p0, r->InputAt(0)); | 659 CheckIsConvertedToNumber(p0, r->InputAt(0)); |
654 CheckIsConvertedToNumber(p1, r->InputAt(1)); | 660 CheckIsConvertedToNumber(p1, r->InputAt(1)); |
655 } | 661 } |
656 } | 662 } |
657 } | 663 } |
658 | 664 |
659 | 665 |
660 TEST(MixedComparison1) { | 666 TEST_WITH_STRONG(MixedComparison1) { |
661 JSTypedLoweringTester R; | 667 JSTypedLoweringTester R; |
662 | 668 |
663 Type* types[] = {Type::Number(), Type::String(), | 669 Type* types[] = {Type::Number(), Type::String(), |
664 Type::Union(Type::Number(), Type::String(), R.main_zone())}; | 670 Type::Union(Type::Number(), Type::String(), R.main_zone())}; |
665 | 671 |
666 for (size_t i = 0; i < arraysize(types); i++) { | 672 for (size_t i = 0; i < arraysize(types); i++) { |
667 Node* p0 = R.Parameter(types[i], 0); | 673 Node* p0 = R.Parameter(types[i], 0); |
668 | 674 |
669 for (size_t j = 0; j < arraysize(types); j++) { | 675 for (size_t j = 0; j < arraysize(types); j++) { |
670 Node* p1 = R.Parameter(types[j], 1); | 676 Node* p1 = R.Parameter(types[j], 1); |
671 { | 677 { |
672 Node* cmp = R.Binop(R.javascript.LessThan(), p0, p1); | 678 Node* cmp = R.Binop(R.javascript.LessThan(language_mode), p0, p1); |
673 Node* r = R.reduce(cmp); | 679 Node* r = R.reduce(cmp); |
674 | 680 |
675 if (!types[i]->Maybe(Type::String()) || | 681 if (!types[i]->Maybe(Type::String()) || |
676 !types[j]->Maybe(Type::String())) { | 682 !types[j]->Maybe(Type::String())) { |
677 if (types[i]->Is(Type::String()) && types[j]->Is(Type::String())) { | 683 if (types[i]->Is(Type::String()) && types[j]->Is(Type::String())) { |
678 R.CheckPureBinop(R.simplified.StringLessThan(), r); | 684 R.CheckPureBinop(R.simplified.StringLessThan(), r); |
679 } else { | 685 } else { |
680 R.CheckPureBinop(R.simplified.NumberLessThan(), r); | 686 R.CheckPureBinop(R.simplified.NumberLessThan(), r); |
681 } | 687 } |
682 } else { | 688 } else { |
683 CHECK_EQ(cmp, r); // No reduction of mixed types. | 689 CHECK_EQ(cmp, r); // No reduction of mixed types. |
684 } | 690 } |
685 } | 691 } |
686 } | 692 } |
687 } | 693 } |
688 } | 694 } |
689 | 695 |
690 | 696 |
691 TEST(RemoveToNumberEffects) { | 697 TEST_WITH_STRONG(RemoveToNumberEffects) { |
692 FLAG_turbo_deoptimization = true; | 698 FLAG_turbo_deoptimization = true; |
693 | 699 |
694 JSTypedLoweringTester R; | 700 JSTypedLoweringTester R; |
695 | 701 |
696 Node* effect_use = NULL; | 702 Node* effect_use = NULL; |
697 for (int i = 0; i < 10; i++) { | 703 for (int i = 0; i < 10; i++) { |
698 Node* p0 = R.Parameter(Type::Number()); | 704 Node* p0 = R.Parameter(Type::Number()); |
699 Node* ton = R.Unop(R.javascript.ToNumber(), p0); | 705 Node* ton = R.Unop(R.javascript.ToNumber(), p0); |
700 Node* frame_state = R.EmptyFrameState(R.context()); | 706 Node* frame_state = R.EmptyFrameState(R.context()); |
701 effect_use = NULL; | 707 effect_use = NULL; |
(...skipping 18 matching lines...) Expand all Loading... | |
720 R.graph.NewNode(R.javascript.ToNumber(), ton, R.context(), | 726 R.graph.NewNode(R.javascript.ToNumber(), ton, R.context(), |
721 frame_state, ton, R.start()); | 727 frame_state, ton, R.start()); |
722 } else { | 728 } else { |
723 effect_use = R.graph.NewNode(R.javascript.ToNumber(), ton, | 729 effect_use = R.graph.NewNode(R.javascript.ToNumber(), ton, |
724 R.context(), ton, R.start()); | 730 R.context(), ton, R.start()); |
725 } | 731 } |
726 break; | 732 break; |
727 case 2: | 733 case 2: |
728 effect_use = R.graph.NewNode(R.common.EffectPhi(1), ton, R.start()); | 734 effect_use = R.graph.NewNode(R.common.EffectPhi(1), ton, R.start()); |
729 case 3: | 735 case 3: |
730 effect_use = R.graph.NewNode(R.javascript.Add(), ton, ton, R.context(), | 736 effect_use = R.graph.NewNode(R.javascript.Add(language_mode), ton, ton, |
731 frame_state, frame_state, ton, R.start()); | 737 R.context(), frame_state, frame_state, ton, |
738 R.start()); | |
732 break; | 739 break; |
733 case 4: | 740 case 4: |
734 effect_use = R.graph.NewNode(R.javascript.Add(), p0, p0, R.context(), | 741 effect_use = R.graph.NewNode(R.javascript.Add(language_mode), p0, p0, |
735 frame_state, frame_state, ton, R.start()); | 742 R.context(), frame_state, frame_state, ton, |
743 R.start()); | |
736 break; | 744 break; |
737 case 5: | 745 case 5: |
738 effect_use = R.graph.NewNode(R.common.Return(), p0, ton, R.start()); | 746 effect_use = R.graph.NewNode(R.common.Return(), p0, ton, R.start()); |
739 break; | 747 break; |
740 case 6: | 748 case 6: |
741 effect_use = R.graph.NewNode(R.common.Return(), ton, ton, R.start()); | 749 effect_use = R.graph.NewNode(R.common.Return(), ton, ton, R.start()); |
742 } | 750 } |
743 | 751 |
744 R.CheckEffectInput(R.start(), ton); | 752 R.CheckEffectInput(R.start(), ton); |
745 if (effect_use != NULL) R.CheckEffectInput(ton, effect_use); | 753 if (effect_use != NULL) R.CheckEffectInput(ton, effect_use); |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
883 TEST(StringEquality) { | 891 TEST(StringEquality) { |
884 JSTypedLoweringTester R; | 892 JSTypedLoweringTester R; |
885 Node* p0 = R.Parameter(Type::String()); | 893 Node* p0 = R.Parameter(Type::String()); |
886 Node* p1 = R.Parameter(Type::String()); | 894 Node* p1 = R.Parameter(Type::String()); |
887 | 895 |
888 CheckEqualityReduction(&R, true, p0, p1, IrOpcode::kStringEqual); | 896 CheckEqualityReduction(&R, true, p0, p1, IrOpcode::kStringEqual); |
889 CheckEqualityReduction(&R, false, p0, p1, IrOpcode::kStringEqual); | 897 CheckEqualityReduction(&R, false, p0, p1, IrOpcode::kStringEqual); |
890 } | 898 } |
891 | 899 |
892 | 900 |
893 TEST(RemovePureNumberBinopEffects) { | 901 TEST_WITH_STRONG(RemovePureNumberBinopEffects) { |
894 JSTypedLoweringTester R; | 902 JSTypedLoweringTester R; |
895 | 903 |
896 const Operator* ops[] = { | 904 const Operator* ops[] = { |
897 R.javascript.Equal(), R.simplified.NumberEqual(), | 905 R.javascript.Equal(), R.simplified.NumberEqual(), |
898 R.javascript.Add(), R.simplified.NumberAdd(), | 906 R.javascript.Add(language_mode), R.simplified.NumberAdd(), |
899 R.javascript.Subtract(), R.simplified.NumberSubtract(), | 907 R.javascript.Subtract(language_mode), R.simplified.NumberSubtract(), |
900 R.javascript.Multiply(), R.simplified.NumberMultiply(), | 908 R.javascript.Multiply(language_mode), R.simplified.NumberMultiply(), |
901 R.javascript.Divide(), R.simplified.NumberDivide(), | 909 R.javascript.Divide(language_mode), R.simplified.NumberDivide(), |
902 R.javascript.Modulus(), R.simplified.NumberModulus(), | 910 R.javascript.Modulus(language_mode), R.simplified.NumberModulus(), |
903 R.javascript.LessThan(), R.simplified.NumberLessThan(), | 911 R.javascript.LessThan(language_mode), R.simplified.NumberLessThan(), |
904 R.javascript.LessThanOrEqual(), R.simplified.NumberLessThanOrEqual(), | 912 R.javascript.LessThanOrEqual(language_mode), |
913 R.simplified.NumberLessThanOrEqual(), | |
905 }; | 914 }; |
906 | 915 |
907 for (size_t j = 0; j < arraysize(ops); j += 2) { | 916 for (size_t j = 0; j < arraysize(ops); j += 2) { |
908 BinopEffectsTester B(ops[j], Type::Number(), Type::Number()); | 917 BinopEffectsTester B(ops[j], Type::Number(), Type::Number()); |
909 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); | 918 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); |
910 | 919 |
911 B.R.CheckPureBinop(B.result->opcode(), B.result); | 920 B.R.CheckPureBinop(B.result->opcode(), B.result); |
912 | 921 |
913 B.CheckNoOp(0); | 922 B.CheckNoOp(0); |
914 B.CheckNoOp(1); | 923 B.CheckNoOp(1); |
915 | 924 |
916 B.CheckEffectsRemoved(); | 925 B.CheckEffectsRemoved(); |
917 } | 926 } |
918 } | 927 } |
919 | 928 |
920 | 929 |
921 TEST(OrderNumberBinopEffects1) { | 930 TEST(OrderNumberBinopEffects1) { |
922 JSTypedLoweringTester R; | 931 JSTypedLoweringTester R; |
923 | 932 |
924 const Operator* ops[] = { | 933 const Operator* ops[] = { |
925 R.javascript.Subtract(), R.simplified.NumberSubtract(), | 934 R.javascript.Subtract(LanguageMode::SLOPPY), |
926 R.javascript.Multiply(), R.simplified.NumberMultiply(), | 935 R.simplified.NumberSubtract(), |
927 R.javascript.Divide(), R.simplified.NumberDivide(), | 936 R.javascript.Multiply(LanguageMode::SLOPPY), |
928 R.javascript.Modulus(), R.simplified.NumberModulus(), | 937 R.simplified.NumberMultiply(), |
938 R.javascript.Divide(LanguageMode::SLOPPY), | |
939 R.simplified.NumberDivide(), | |
940 R.javascript.Modulus(LanguageMode::SLOPPY), | |
941 R.simplified.NumberModulus(), | |
929 }; | 942 }; |
930 | 943 |
931 for (size_t j = 0; j < arraysize(ops); j += 2) { | 944 for (size_t j = 0; j < arraysize(ops); j += 2) { |
932 BinopEffectsTester B(ops[j], Type::Symbol(), Type::Symbol()); | 945 BinopEffectsTester B(ops[j], Type::Symbol(), Type::Symbol()); |
933 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); | 946 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); |
934 | 947 |
935 Node* i0 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 0, true); | 948 Node* i0 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 0, true); |
936 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); | 949 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); |
937 | 950 |
938 CHECK_EQ(B.p0, i0->InputAt(0)); | 951 CHECK_EQ(B.p0, i0->InputAt(0)); |
939 CHECK_EQ(B.p1, i1->InputAt(0)); | 952 CHECK_EQ(B.p1, i1->InputAt(0)); |
940 | 953 |
941 // Effects should be ordered start -> i0 -> i1 -> effect_use | 954 // Effects should be ordered start -> i0 -> i1 -> effect_use |
942 B.CheckEffectOrdering(i0, i1); | 955 B.CheckEffectOrdering(i0, i1); |
943 } | 956 } |
944 } | 957 } |
945 | 958 |
946 | 959 |
947 TEST(OrderNumberBinopEffects2) { | 960 TEST(OrderNumberBinopEffects2) { |
948 JSTypedLoweringTester R; | 961 JSTypedLoweringTester R; |
949 | 962 |
950 const Operator* ops[] = { | 963 const Operator* ops[] = { |
951 R.javascript.Add(), R.simplified.NumberAdd(), | 964 R.javascript.Add(LanguageMode::SLOPPY), |
952 R.javascript.Subtract(), R.simplified.NumberSubtract(), | 965 R.simplified.NumberAdd(), |
953 R.javascript.Multiply(), R.simplified.NumberMultiply(), | 966 R.javascript.Subtract(LanguageMode::SLOPPY), |
954 R.javascript.Divide(), R.simplified.NumberDivide(), | 967 R.simplified.NumberSubtract(), |
955 R.javascript.Modulus(), R.simplified.NumberModulus(), | 968 R.javascript.Multiply(LanguageMode::SLOPPY), |
969 R.simplified.NumberMultiply(), | |
970 R.javascript.Divide(LanguageMode::SLOPPY), | |
971 R.simplified.NumberDivide(), | |
972 R.javascript.Modulus(LanguageMode::SLOPPY), | |
973 R.simplified.NumberModulus(), | |
956 }; | 974 }; |
957 | 975 |
958 for (size_t j = 0; j < arraysize(ops); j += 2) { | 976 for (size_t j = 0; j < arraysize(ops); j += 2) { |
959 BinopEffectsTester B(ops[j], Type::Number(), Type::Symbol()); | 977 BinopEffectsTester B(ops[j], Type::Number(), Type::Symbol()); |
960 | 978 |
961 Node* i0 = B.CheckNoOp(0); | 979 Node* i0 = B.CheckNoOp(0); |
962 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); | 980 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); |
963 | 981 |
964 CHECK_EQ(B.p0, i0); | 982 CHECK_EQ(B.p0, i0); |
965 CHECK_EQ(B.p1, i1->InputAt(0)); | 983 CHECK_EQ(B.p1, i1->InputAt(0)); |
(...skipping 14 matching lines...) Expand all Loading... | |
980 // Effects should be ordered start -> i0 -> effect_use | 998 // Effects should be ordered start -> i0 -> effect_use |
981 B.CheckEffectOrdering(i0); | 999 B.CheckEffectOrdering(i0); |
982 } | 1000 } |
983 } | 1001 } |
984 | 1002 |
985 | 1003 |
986 TEST(OrderCompareEffects) { | 1004 TEST(OrderCompareEffects) { |
987 JSTypedLoweringTester R; | 1005 JSTypedLoweringTester R; |
988 | 1006 |
989 const Operator* ops[] = { | 1007 const Operator* ops[] = { |
990 R.javascript.GreaterThan(), R.simplified.NumberLessThan(), | 1008 R.javascript.GreaterThan(LanguageMode::SLOPPY), |
991 R.javascript.GreaterThanOrEqual(), R.simplified.NumberLessThanOrEqual(), | 1009 R.simplified.NumberLessThan(), |
1010 R.javascript.GreaterThanOrEqual(LanguageMode::SLOPPY), | |
1011 R.simplified.NumberLessThanOrEqual(), | |
992 }; | 1012 }; |
993 | 1013 |
994 for (size_t j = 0; j < arraysize(ops); j += 2) { | 1014 for (size_t j = 0; j < arraysize(ops); j += 2) { |
995 BinopEffectsTester B(ops[j], Type::Symbol(), Type::String()); | 1015 BinopEffectsTester B(ops[j], Type::Symbol(), Type::String()); |
996 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); | 1016 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); |
997 | 1017 |
998 Node* i0 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 0, true); | 1018 Node* i0 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 0, true); |
999 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); | 1019 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); |
1000 | 1020 |
1001 // Inputs should be commuted. | 1021 // Inputs should be commuted. |
(...skipping 26 matching lines...) Expand all Loading... | |
1028 CHECK_EQ(B.p1, i0); // Should be commuted. | 1048 CHECK_EQ(B.p1, i0); // Should be commuted. |
1029 CHECK_EQ(B.p0, i1->InputAt(0)); | 1049 CHECK_EQ(B.p0, i1->InputAt(0)); |
1030 | 1050 |
1031 // Effects should be ordered start -> i0 -> effect_use | 1051 // Effects should be ordered start -> i0 -> effect_use |
1032 B.CheckEffectOrdering(i1); | 1052 B.CheckEffectOrdering(i1); |
1033 } | 1053 } |
1034 } | 1054 } |
1035 | 1055 |
1036 | 1056 |
1037 TEST(Int32BinopEffects) { | 1057 TEST(Int32BinopEffects) { |
1038 JSBitwiseTypedLoweringTester R; | 1058 JSBitwiseTypedLoweringTester R(LanguageMode::SLOPPY); |
1039 | |
1040 for (int j = 0; j < R.kNumberOps; j += 2) { | 1059 for (int j = 0; j < R.kNumberOps; j += 2) { |
1041 bool signed_left = R.signedness[j], signed_right = R.signedness[j + 1]; | 1060 bool signed_left = R.signedness[j], signed_right = R.signedness[j + 1]; |
1042 BinopEffectsTester B(R.ops[j], I32Type(signed_left), I32Type(signed_right)); | 1061 BinopEffectsTester B(R.ops[j], I32Type(signed_left), I32Type(signed_right)); |
1062 printf("%s\n%s\n", R.ops[j + 1]->mnemonic(), B.result->op()->mnemonic()); | |
rossberg
2015/04/23 13:29:37
Stray debug output?
conradw
2015/04/23 14:51:55
Oops, done.
| |
1043 CHECK_EQ(R.ops[j + 1]->opcode(), B.result->op()->opcode()); | 1063 CHECK_EQ(R.ops[j + 1]->opcode(), B.result->op()->opcode()); |
1044 | 1064 |
1045 B.R.CheckPureBinop(B.result->opcode(), B.result); | 1065 B.R.CheckPureBinop(B.result->opcode(), B.result); |
1046 | 1066 |
1047 B.CheckNoOp(0); | 1067 B.CheckNoOp(0); |
1048 B.CheckNoOp(1); | 1068 B.CheckNoOp(1); |
1049 | 1069 |
1050 B.CheckEffectsRemoved(); | 1070 B.CheckEffectsRemoved(); |
1051 } | 1071 } |
1052 | 1072 |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1110 Node* ii1 = B.CheckConverted(IrOpcode::kJSToNumber, i1->InputAt(0), true); | 1130 Node* ii1 = B.CheckConverted(IrOpcode::kJSToNumber, i1->InputAt(0), true); |
1111 | 1131 |
1112 CHECK_EQ(B.p0, ii0->InputAt(0)); | 1132 CHECK_EQ(B.p0, ii0->InputAt(0)); |
1113 CHECK_EQ(B.p1, ii1->InputAt(0)); | 1133 CHECK_EQ(B.p1, ii1->InputAt(0)); |
1114 | 1134 |
1115 B.CheckEffectOrdering(ii0, ii1); | 1135 B.CheckEffectOrdering(ii0, ii1); |
1116 } | 1136 } |
1117 } | 1137 } |
1118 | 1138 |
1119 | 1139 |
1120 TEST(Int32AddNarrowing) { | 1140 TEST_WITH_STRONG(Int32AddNarrowing) { |
1121 { | 1141 { |
1122 JSBitwiseTypedLoweringTester R; | 1142 JSBitwiseTypedLoweringTester R(language_mode); |
1123 | 1143 |
1124 for (int o = 0; o < R.kNumberOps; o += 2) { | 1144 for (int o = 0; o < R.kNumberOps; o += 2) { |
1125 for (size_t i = 0; i < arraysize(kInt32Types); i++) { | 1145 for (size_t i = 0; i < arraysize(kInt32Types); i++) { |
1126 Node* n0 = R.Parameter(kInt32Types[i]); | 1146 Node* n0 = R.Parameter(kInt32Types[i]); |
1127 for (size_t j = 0; j < arraysize(kInt32Types); j++) { | 1147 for (size_t j = 0; j < arraysize(kInt32Types); j++) { |
1128 Node* n1 = R.Parameter(kInt32Types[j]); | 1148 Node* n1 = R.Parameter(kInt32Types[j]); |
1129 Node* one = R.graph.NewNode(R.common.NumberConstant(1)); | 1149 Node* one = R.graph.NewNode(R.common.NumberConstant(1)); |
1130 | 1150 |
1131 for (int l = 0; l < 2; l++) { | 1151 for (int l = 0; l < 2; l++) { |
1132 Node* add_node = R.Binop(R.simplified.NumberAdd(), n0, n1); | 1152 Node* add_node = R.Binop(R.simplified.NumberAdd(), n0, n1); |
1133 Node* or_node = | 1153 Node* or_node = |
1134 R.Binop(R.ops[o], l ? add_node : one, l ? one : add_node); | 1154 R.Binop(R.ops[o], l ? add_node : one, l ? one : add_node); |
1135 Node* r = R.reduce(or_node); | 1155 Node* r = R.reduce(or_node); |
1136 | 1156 |
1137 CHECK_EQ(R.ops[o + 1]->opcode(), r->op()->opcode()); | 1157 CHECK_EQ(R.ops[o + 1]->opcode(), r->op()->opcode()); |
1138 CHECK_EQ(IrOpcode::kNumberAdd, add_node->opcode()); | 1158 CHECK_EQ(IrOpcode::kNumberAdd, add_node->opcode()); |
1139 } | 1159 } |
1140 } | 1160 } |
1141 } | 1161 } |
1142 } | 1162 } |
1143 } | 1163 } |
1144 { | 1164 { |
1145 JSBitwiseShiftTypedLoweringTester R; | 1165 JSBitwiseShiftTypedLoweringTester R(language_mode); |
1146 | 1166 |
1147 for (int o = 0; o < R.kNumberOps; o += 2) { | 1167 for (int o = 0; o < R.kNumberOps; o += 2) { |
1148 for (size_t i = 0; i < arraysize(kInt32Types); i++) { | 1168 for (size_t i = 0; i < arraysize(kInt32Types); i++) { |
1149 Node* n0 = R.Parameter(kInt32Types[i]); | 1169 Node* n0 = R.Parameter(kInt32Types[i]); |
1150 for (size_t j = 0; j < arraysize(kInt32Types); j++) { | 1170 for (size_t j = 0; j < arraysize(kInt32Types); j++) { |
1151 Node* n1 = R.Parameter(kInt32Types[j]); | 1171 Node* n1 = R.Parameter(kInt32Types[j]); |
1152 Node* one = R.graph.NewNode(R.common.NumberConstant(1)); | 1172 Node* one = R.graph.NewNode(R.common.NumberConstant(1)); |
1153 | 1173 |
1154 for (int l = 0; l < 2; l++) { | 1174 for (int l = 0; l < 2; l++) { |
1155 Node* add_node = R.Binop(R.simplified.NumberAdd(), n0, n1); | 1175 Node* add_node = R.Binop(R.simplified.NumberAdd(), n0, n1); |
1156 Node* or_node = | 1176 Node* or_node = |
1157 R.Binop(R.ops[o], l ? add_node : one, l ? one : add_node); | 1177 R.Binop(R.ops[o], l ? add_node : one, l ? one : add_node); |
1158 Node* r = R.reduce(or_node); | 1178 Node* r = R.reduce(or_node); |
1159 | 1179 |
1160 CHECK_EQ(R.ops[o + 1]->opcode(), r->op()->opcode()); | 1180 CHECK_EQ(R.ops[o + 1]->opcode(), r->op()->opcode()); |
1161 CHECK_EQ(IrOpcode::kNumberAdd, add_node->opcode()); | 1181 CHECK_EQ(IrOpcode::kNumberAdd, add_node->opcode()); |
1162 } | 1182 } |
1163 } | 1183 } |
1164 } | 1184 } |
1165 } | 1185 } |
1166 } | 1186 } |
1167 { | 1187 { |
1168 JSBitwiseTypedLoweringTester R; | 1188 JSBitwiseTypedLoweringTester R(language_mode); |
1169 | 1189 |
1170 for (int o = 0; o < R.kNumberOps; o += 2) { | 1190 for (int o = 0; o < R.kNumberOps; o += 2) { |
1171 Node* n0 = R.Parameter(I32Type(R.signedness[o])); | 1191 Node* n0 = R.Parameter(I32Type(R.signedness[o])); |
1172 Node* n1 = R.Parameter(I32Type(R.signedness[o + 1])); | 1192 Node* n1 = R.Parameter(I32Type(R.signedness[o + 1])); |
1173 Node* one = R.graph.NewNode(R.common.NumberConstant(1)); | 1193 Node* one = R.graph.NewNode(R.common.NumberConstant(1)); |
1174 | 1194 |
1175 Node* add_node = R.Binop(R.simplified.NumberAdd(), n0, n1); | 1195 Node* add_node = R.Binop(R.simplified.NumberAdd(), n0, n1); |
1176 Node* or_node = R.Binop(R.ops[o], add_node, one); | 1196 Node* or_node = R.Binop(R.ops[o], add_node, one); |
1177 Node* other_use = R.Binop(R.simplified.NumberAdd(), add_node, one); | 1197 Node* other_use = R.Binop(R.simplified.NumberAdd(), add_node, one); |
1178 Node* r = R.reduce(or_node); | 1198 Node* r = R.reduce(or_node); |
1179 CHECK_EQ(R.ops[o + 1]->opcode(), r->op()->opcode()); | 1199 CHECK_EQ(R.ops[o + 1]->opcode(), r->op()->opcode()); |
1180 CHECK_EQ(IrOpcode::kNumberAdd, add_node->opcode()); | 1200 CHECK_EQ(IrOpcode::kNumberAdd, add_node->opcode()); |
1181 // Conversion to int32 should be done. | 1201 // Conversion to int32 should be done. |
1182 CheckToI32(add_node, r->InputAt(0), R.signedness[o]); | 1202 CheckToI32(add_node, r->InputAt(0), R.signedness[o]); |
1183 CheckToI32(one, r->InputAt(1), R.signedness[o + 1]); | 1203 CheckToI32(one, r->InputAt(1), R.signedness[o + 1]); |
1184 // The other use should also not be touched. | 1204 // The other use should also not be touched. |
1185 CHECK_EQ(add_node, other_use->InputAt(0)); | 1205 CHECK_EQ(add_node, other_use->InputAt(0)); |
1186 CHECK_EQ(one, other_use->InputAt(1)); | 1206 CHECK_EQ(one, other_use->InputAt(1)); |
1187 } | 1207 } |
1188 } | 1208 } |
1189 } | 1209 } |
1190 | 1210 |
1191 | 1211 |
1192 TEST(Int32Comparisons) { | 1212 TEST_WITH_STRONG(Int32Comparisons) { |
1193 JSTypedLoweringTester R; | 1213 JSTypedLoweringTester R; |
1194 | 1214 |
1195 struct Entry { | 1215 struct Entry { |
1196 const Operator* js_op; | 1216 const Operator* js_op; |
1197 const Operator* uint_op; | 1217 const Operator* uint_op; |
1198 const Operator* int_op; | 1218 const Operator* int_op; |
1199 const Operator* num_op; | 1219 const Operator* num_op; |
1200 bool commute; | 1220 bool commute; |
1201 }; | 1221 }; |
1202 | 1222 |
1203 Entry ops[] = { | 1223 Entry ops[] = { |
1204 {R.javascript.LessThan(), R.machine.Uint32LessThan(), | 1224 {R.javascript.LessThan(language_mode), R.machine.Uint32LessThan(), |
1205 R.machine.Int32LessThan(), R.simplified.NumberLessThan(), false}, | 1225 R.machine.Int32LessThan(), R.simplified.NumberLessThan(), false}, |
1206 {R.javascript.LessThanOrEqual(), R.machine.Uint32LessThanOrEqual(), | 1226 {R.javascript.LessThanOrEqual(language_mode), |
1207 R.machine.Int32LessThanOrEqual(), R.simplified.NumberLessThanOrEqual(), | 1227 R.machine.Uint32LessThanOrEqual(), R.machine.Int32LessThanOrEqual(), |
1208 false}, | 1228 R.simplified.NumberLessThanOrEqual(), false}, |
1209 {R.javascript.GreaterThan(), R.machine.Uint32LessThan(), | 1229 {R.javascript.GreaterThan(language_mode), R.machine.Uint32LessThan(), |
1210 R.machine.Int32LessThan(), R.simplified.NumberLessThan(), true}, | 1230 R.machine.Int32LessThan(), R.simplified.NumberLessThan(), true}, |
1211 {R.javascript.GreaterThanOrEqual(), R.machine.Uint32LessThanOrEqual(), | 1231 {R.javascript.GreaterThanOrEqual(language_mode), |
1212 R.machine.Int32LessThanOrEqual(), R.simplified.NumberLessThanOrEqual(), | 1232 R.machine.Uint32LessThanOrEqual(), R.machine.Int32LessThanOrEqual(), |
1213 true}}; | 1233 R.simplified.NumberLessThanOrEqual(), true} |
1234 }; | |
1214 | 1235 |
1215 for (size_t o = 0; o < arraysize(ops); o++) { | 1236 for (size_t o = 0; o < arraysize(ops); o++) { |
1216 for (size_t i = 0; i < arraysize(kNumberTypes); i++) { | 1237 for (size_t i = 0; i < arraysize(kNumberTypes); i++) { |
1217 Type* t0 = kNumberTypes[i]; | 1238 Type* t0 = kNumberTypes[i]; |
1218 Node* p0 = R.Parameter(t0, 0); | 1239 Node* p0 = R.Parameter(t0, 0); |
1219 | 1240 |
1220 for (size_t j = 0; j < arraysize(kNumberTypes); j++) { | 1241 for (size_t j = 0; j < arraysize(kNumberTypes); j++) { |
1221 Type* t1 = kNumberTypes[j]; | 1242 Type* t1 = kNumberTypes[j]; |
1222 Node* p1 = R.Parameter(t1, 1); | 1243 Node* p1 = R.Parameter(t1, 1); |
1223 | 1244 |
(...skipping 13 matching lines...) Expand all Loading... | |
1237 CHECK_EQ(p1, r->InputAt(0)); | 1258 CHECK_EQ(p1, r->InputAt(0)); |
1238 CHECK_EQ(p0, r->InputAt(1)); | 1259 CHECK_EQ(p0, r->InputAt(1)); |
1239 } else { | 1260 } else { |
1240 CHECK_EQ(p0, r->InputAt(0)); | 1261 CHECK_EQ(p0, r->InputAt(0)); |
1241 CHECK_EQ(p1, r->InputAt(1)); | 1262 CHECK_EQ(p1, r->InputAt(1)); |
1242 } | 1263 } |
1243 } | 1264 } |
1244 } | 1265 } |
1245 } | 1266 } |
1246 } | 1267 } |
OLD | NEW |