Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(778)

Side by Side Diff: test/cctest/compiler/test-js-typed-lowering.cc

Issue 1144183004: [strong] Refactor ObjectStrength into a replacement for strong boolean args (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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"
11 #include "src/compiler/typer.h" 11 #include "src/compiler/typer.h"
12 #include "test/cctest/cctest.h" 12 #include "test/cctest/cctest.h"
13 13
14 using namespace v8::internal; 14 using namespace v8::internal;
15 using namespace v8::internal::compiler; 15 using namespace v8::internal::compiler;
16 16
17 #ifndef TEST_WITH_STRONG 17 #ifndef TEST_WITH_STRENGTH
18 #define TEST_WITH_STRONG(Name) \ 18 #define TEST_WITH_STRENGTH(Name) \
19 static void Test##Name(); \ 19 static void Test##Name(); \
20 static void TestWithStrong##Name(LanguageMode language_mode); \ 20 static void TestWithStrength##Name(Strength strength); \
21 CcTest register_test_##Name(Test##Name, __FILE__, #Name, NULL, true, true); \ 21 CcTest register_test_##Name(Test##Name, __FILE__, #Name, NULL, true, true); \
22 static void Test##Name() { \ 22 static void Test##Name() { \
23 TestWithStrong##Name(LanguageMode::SLOPPY); \ 23 TestWithStrength##Name(Strength::NORMAL); \
24 TestWithStrong##Name(LanguageMode::STRONG); \ 24 TestWithStrength##Name(Strength::STRONG); \
25 } \ 25 } \
26 static void TestWithStrong##Name(LanguageMode language_mode) 26 static void TestWithStrength##Name(Strength strength)
27 #endif 27 #endif
28 28
29 29
30 class JSTypedLoweringTester : public HandleAndZoneScope { 30 class JSTypedLoweringTester : public HandleAndZoneScope {
31 public: 31 public:
32 explicit JSTypedLoweringTester(int num_parameters = 0) 32 explicit JSTypedLoweringTester(int num_parameters = 0)
33 : isolate(main_isolate()), 33 : isolate(main_isolate()),
34 binop(NULL), 34 binop(NULL),
35 unop(NULL), 35 unop(NULL),
36 javascript(main_zone()), 36 javascript(main_zone()),
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 } 226 }
227 227
228 228
229 static IrOpcode::Value NumberToI32(bool is_signed) { 229 static IrOpcode::Value NumberToI32(bool is_signed) {
230 return is_signed ? IrOpcode::kNumberToInt32 : IrOpcode::kNumberToUint32; 230 return is_signed ? IrOpcode::kNumberToInt32 : IrOpcode::kNumberToUint32;
231 } 231 }
232 232
233 233
234 // TODO(turbofan): Lowering of StringAdd is disabled for now. 234 // TODO(turbofan): Lowering of StringAdd is disabled for now.
235 #if 0 235 #if 0
236 TEST_WITH_STRONG(StringBinops) { 236 TEST_WITH_STRENGTH(StringBinops) {
237 JSTypedLoweringTester R; 237 JSTypedLoweringTester R;
238 238
239 for (size_t i = 0; i < arraysize(kStringTypes); ++i) { 239 for (size_t i = 0; i < arraysize(kStringTypes); ++i) {
240 Node* p0 = R.Parameter(kStringTypes[i], 0); 240 Node* p0 = R.Parameter(kStringTypes[i], 0);
241 241
242 for (size_t j = 0; j < arraysize(kStringTypes); ++j) { 242 for (size_t j = 0; j < arraysize(kStringTypes); ++j) {
243 Node* p1 = R.Parameter(kStringTypes[j], 1); 243 Node* p1 = R.Parameter(kStringTypes[j], 1);
244 244
245 Node* add = R.Binop(R.javascript.Add(language_mode), p0, p1); 245 Node* add = R.Binop(R.javascript.Add(strength), p0, p1);
246 Node* r = R.reduce(add); 246 Node* r = R.reduce(add);
247 247
248 R.CheckPureBinop(IrOpcode::kStringAdd, r); 248 R.CheckPureBinop(IrOpcode::kStringAdd, r);
249 CHECK_EQ(p0, r->InputAt(0)); 249 CHECK_EQ(p0, r->InputAt(0));
250 CHECK_EQ(p1, r->InputAt(1)); 250 CHECK_EQ(p1, r->InputAt(1));
251 } 251 }
252 } 252 }
253 } 253 }
254 #endif 254 #endif
255 255
256 256
257 TEST_WITH_STRONG(AddNumber1) { 257 TEST_WITH_STRENGTH(AddNumber1) {
258 JSTypedLoweringTester R; 258 JSTypedLoweringTester R;
259 for (size_t i = 0; i < arraysize(kNumberTypes); ++i) { 259 for (size_t i = 0; i < arraysize(kNumberTypes); ++i) {
260 Node* p0 = R.Parameter(kNumberTypes[i], 0); 260 Node* p0 = R.Parameter(kNumberTypes[i], 0);
261 Node* p1 = R.Parameter(kNumberTypes[i], 1); 261 Node* p1 = R.Parameter(kNumberTypes[i], 1);
262 Node* add = R.Binop(R.javascript.Add(language_mode), p0, p1); 262 Node* add = R.Binop(R.javascript.Add(strength), p0, p1);
263 Node* r = R.reduce(add); 263 Node* r = R.reduce(add);
264 264
265 R.CheckPureBinop(IrOpcode::kNumberAdd, r); 265 R.CheckPureBinop(IrOpcode::kNumberAdd, r);
266 CHECK_EQ(p0, r->InputAt(0)); 266 CHECK_EQ(p0, r->InputAt(0));
267 CHECK_EQ(p1, r->InputAt(1)); 267 CHECK_EQ(p1, r->InputAt(1));
268 } 268 }
269 } 269 }
270 270
271 271
272 TEST_WITH_STRONG(NumberBinops) { 272 TEST_WITH_STRENGTH(NumberBinops) {
273 JSTypedLoweringTester R; 273 JSTypedLoweringTester R;
274 const Operator* ops[] = { 274 const Operator* ops[] = {
275 R.javascript.Add(language_mode), R.simplified.NumberAdd(), 275 R.javascript.Add(strength), R.simplified.NumberAdd(),
276 R.javascript.Subtract(language_mode), R.simplified.NumberSubtract(), 276 R.javascript.Subtract(strength), R.simplified.NumberSubtract(),
277 R.javascript.Multiply(language_mode), R.simplified.NumberMultiply(), 277 R.javascript.Multiply(strength), R.simplified.NumberMultiply(),
278 R.javascript.Divide(language_mode), R.simplified.NumberDivide(), 278 R.javascript.Divide(strength), R.simplified.NumberDivide(),
279 R.javascript.Modulus(language_mode), R.simplified.NumberModulus(), 279 R.javascript.Modulus(strength), R.simplified.NumberModulus(),
280 }; 280 };
281 281
282 for (size_t i = 0; i < arraysize(kNumberTypes); ++i) { 282 for (size_t i = 0; i < arraysize(kNumberTypes); ++i) {
283 Node* p0 = R.Parameter(kNumberTypes[i], 0); 283 Node* p0 = R.Parameter(kNumberTypes[i], 0);
284 284
285 for (size_t j = 0; j < arraysize(kNumberTypes); ++j) { 285 for (size_t j = 0; j < arraysize(kNumberTypes); ++j) {
286 Node* p1 = R.Parameter(kNumberTypes[j], 1); 286 Node* p1 = R.Parameter(kNumberTypes[j], 1);
287 287
288 for (size_t k = 0; k < arraysize(ops); k += 2) { 288 for (size_t k = 0; k < arraysize(ops); k += 2) {
289 Node* add = R.Binop(ops[k], p0, p1); 289 Node* add = R.Binop(ops[k], p0, p1);
(...skipping 19 matching lines...) Expand all
309 double v = OpParameter<double>(new_input); 309 double v = OpParameter<double>(new_input);
310 double e = static_cast<double>(is_signed ? FastD2I(v) : FastD2UI(v)); 310 double e = static_cast<double>(is_signed ? FastD2I(v) : FastD2UI(v));
311 CHECK_EQ(e, v); 311 CHECK_EQ(e, v);
312 } 312 }
313 } 313 }
314 314
315 315
316 // A helper class for testing lowering of bitwise shift operators. 316 // A helper class for testing lowering of bitwise shift operators.
317 class JSBitwiseShiftTypedLoweringTester : public JSTypedLoweringTester { 317 class JSBitwiseShiftTypedLoweringTester : public JSTypedLoweringTester {
318 public: 318 public:
319 explicit JSBitwiseShiftTypedLoweringTester(LanguageMode language_mode) 319 explicit JSBitwiseShiftTypedLoweringTester(Strength strength)
320 : JSTypedLoweringTester(), language_mode_(language_mode) { 320 : JSTypedLoweringTester(), strength_(strength) {
321 int i = 0; 321 int i = 0;
322 set(i++, javascript.ShiftLeft(language_mode_), true); 322 set(i++, javascript.ShiftLeft(strength_), true);
323 set(i++, machine.Word32Shl(), false); 323 set(i++, machine.Word32Shl(), false);
324 set(i++, javascript.ShiftRight(language_mode_), true); 324 set(i++, javascript.ShiftRight(strength_), true);
325 set(i++, machine.Word32Sar(), false); 325 set(i++, machine.Word32Sar(), false);
326 set(i++, javascript.ShiftRightLogical(language_mode_), false); 326 set(i++, javascript.ShiftRightLogical(strength_), false);
327 set(i++, machine.Word32Shr(), false); 327 set(i++, machine.Word32Shr(), false);
328 } 328 }
329 static const int kNumberOps = 6; 329 static const int kNumberOps = 6;
330 const Operator* ops[kNumberOps]; 330 const Operator* ops[kNumberOps];
331 bool signedness[kNumberOps]; 331 bool signedness[kNumberOps];
332 332
333 private: 333 private:
334 LanguageMode language_mode_; 334 Strength strength_;
335 void set(int idx, const Operator* op, bool s) { 335 void set(int idx, const Operator* op, bool s) {
336 ops[idx] = op; 336 ops[idx] = op;
337 signedness[idx] = s; 337 signedness[idx] = s;
338 } 338 }
339 }; 339 };
340 340
341 341
342 TEST(Int32BitwiseShifts) { 342 TEST(Int32BitwiseShifts) {
343 JSBitwiseShiftTypedLoweringTester R(LanguageMode::SLOPPY); 343 JSBitwiseShiftTypedLoweringTester R(Strength::NORMAL);
344 344
345 Type* types[] = { 345 Type* types[] = {
346 Type::SignedSmall(), Type::UnsignedSmall(), Type::Negative32(), 346 Type::SignedSmall(), Type::UnsignedSmall(), Type::Negative32(),
347 Type::Unsigned31(), Type::Unsigned32(), Type::Signed32(), 347 Type::Unsigned31(), Type::Unsigned32(), Type::Signed32(),
348 Type::MinusZero(), Type::NaN(), Type::Undefined(), 348 Type::MinusZero(), Type::NaN(), Type::Undefined(),
349 Type::Null(), Type::Boolean(), Type::Number(), 349 Type::Null(), Type::Boolean(), Type::Number(),
350 Type::PlainNumber(), Type::String()}; 350 Type::PlainNumber(), Type::String()};
351 351
352 for (size_t i = 0; i < arraysize(types); ++i) { 352 for (size_t i = 0; i < arraysize(types); ++i) {
353 Node* p0 = R.Parameter(types[i], 0); 353 Node* p0 = R.Parameter(types[i], 0);
(...skipping 20 matching lines...) Expand all
374 } 374 }
375 } 375 }
376 } 376 }
377 } 377 }
378 } 378 }
379 379
380 380
381 // A helper class for testing lowering of bitwise operators. 381 // A helper class for testing lowering of bitwise operators.
382 class JSBitwiseTypedLoweringTester : public JSTypedLoweringTester { 382 class JSBitwiseTypedLoweringTester : public JSTypedLoweringTester {
383 public: 383 public:
384 explicit JSBitwiseTypedLoweringTester(LanguageMode language_mode) 384 explicit JSBitwiseTypedLoweringTester(Strength strength)
385 : JSTypedLoweringTester(), language_mode_(language_mode) { 385 : JSTypedLoweringTester(), strength_(strength) {
386 int i = 0; 386 int i = 0;
387 set(i++, javascript.BitwiseOr(language_mode_), true); 387 set(i++, javascript.BitwiseOr(strength_), true);
388 set(i++, machine.Word32Or(), true); 388 set(i++, machine.Word32Or(), true);
389 set(i++, javascript.BitwiseXor(language_mode_), true); 389 set(i++, javascript.BitwiseXor(strength_), true);
390 set(i++, machine.Word32Xor(), true); 390 set(i++, machine.Word32Xor(), true);
391 set(i++, javascript.BitwiseAnd(language_mode_), true); 391 set(i++, javascript.BitwiseAnd(strength_), true);
392 set(i++, machine.Word32And(), true); 392 set(i++, machine.Word32And(), true);
393 } 393 }
394 static const int kNumberOps = 6; 394 static const int kNumberOps = 6;
395 const Operator* ops[kNumberOps]; 395 const Operator* ops[kNumberOps];
396 bool signedness[kNumberOps]; 396 bool signedness[kNumberOps];
397 397
398 private: 398 private:
399 LanguageMode language_mode_; 399 Strength strength_;
400 void set(int idx, const Operator* op, bool s) { 400 void set(int idx, const Operator* op, bool s) {
401 ops[idx] = op; 401 ops[idx] = op;
402 signedness[idx] = s; 402 signedness[idx] = s;
403 } 403 }
404 }; 404 };
405 405
406 406
407 TEST(Int32BitwiseBinops) { 407 TEST(Int32BitwiseBinops) {
408 JSBitwiseTypedLoweringTester R(LanguageMode::SLOPPY); 408 JSBitwiseTypedLoweringTester R(Strength::NORMAL);
409 409
410 Type* types[] = { 410 Type* types[] = {
411 Type::SignedSmall(), Type::UnsignedSmall(), Type::Unsigned32(), 411 Type::SignedSmall(), Type::UnsignedSmall(), Type::Unsigned32(),
412 Type::Signed32(), Type::MinusZero(), Type::NaN(), 412 Type::Signed32(), Type::MinusZero(), Type::NaN(),
413 Type::OrderedNumber(), Type::PlainNumber(), Type::Undefined(), 413 Type::OrderedNumber(), Type::PlainNumber(), Type::Undefined(),
414 Type::Null(), Type::Boolean(), Type::Number(), 414 Type::Null(), Type::Boolean(), Type::Number(),
415 Type::String()}; 415 Type::String()};
416 416
417 for (size_t i = 0; i < arraysize(types); ++i) { 417 for (size_t i = 0; i < arraysize(types); ++i) {
418 Node* p0 = R.Parameter(types[i], 0); 418 Node* p0 = R.Parameter(types[i], 0);
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
590 CHECK_EQ(IrOpcode::kHeapConstant, r->opcode()); 590 CHECK_EQ(IrOpcode::kHeapConstant, r->opcode());
591 } 591 }
592 592
593 CHECK_EQ(n, add->InputAt(0)); 593 CHECK_EQ(n, add->InputAt(0));
594 CHECK_EQ(r, add->InputAt(1)); 594 CHECK_EQ(r, add->InputAt(1));
595 R.CheckEffectInput(R.start(), effect_use); 595 R.CheckEffectInput(R.start(), effect_use);
596 } 596 }
597 } 597 }
598 598
599 599
600 TEST_WITH_STRONG(StringComparison) { 600 TEST_WITH_STRENGTH(StringComparison) {
601 JSTypedLoweringTester R; 601 JSTypedLoweringTester R;
602 602
603 const Operator* ops[] = { 603 const Operator* ops[] = {
604 R.javascript.LessThan(language_mode), R.simplified.StringLessThan(), 604 R.javascript.LessThan(strength), R.simplified.StringLessThan(),
605 R.javascript.LessThanOrEqual(language_mode), 605 R.javascript.LessThanOrEqual(strength),
606 R.simplified.StringLessThanOrEqual(), 606 R.simplified.StringLessThanOrEqual(), R.javascript.GreaterThan(strength),
607 R.javascript.GreaterThan(language_mode), R.simplified.StringLessThan(), 607 R.simplified.StringLessThan(), R.javascript.GreaterThanOrEqual(strength),
608 R.javascript.GreaterThanOrEqual(language_mode),
609 R.simplified.StringLessThanOrEqual()}; 608 R.simplified.StringLessThanOrEqual()};
610 609
611 for (size_t i = 0; i < arraysize(kStringTypes); i++) { 610 for (size_t i = 0; i < arraysize(kStringTypes); i++) {
612 Node* p0 = R.Parameter(kStringTypes[i], 0); 611 Node* p0 = R.Parameter(kStringTypes[i], 0);
613 for (size_t j = 0; j < arraysize(kStringTypes); j++) { 612 for (size_t j = 0; j < arraysize(kStringTypes); j++) {
614 Node* p1 = R.Parameter(kStringTypes[j], 1); 613 Node* p1 = R.Parameter(kStringTypes[j], 1);
615 614
616 for (size_t k = 0; k < arraysize(ops); k += 2) { 615 for (size_t k = 0; k < arraysize(ops); k += 2) {
617 Node* cmp = R.Binop(ops[k], p0, p1); 616 Node* cmp = R.Binop(ops[k], p0, p1);
618 Node* r = R.reduce(cmp); 617 Node* r = R.reduce(cmp);
(...skipping 21 matching lines...) Expand all
640 CHECK_EQ(IrOpcode::kBooleanToNumber, converted->opcode()); 639 CHECK_EQ(IrOpcode::kBooleanToNumber, converted->opcode());
641 CHECK_EQ(val, converted->InputAt(0)); 640 CHECK_EQ(val, converted->InputAt(0));
642 } else { 641 } else {
643 if (converted->opcode() == IrOpcode::kNumberConstant) return; 642 if (converted->opcode() == IrOpcode::kNumberConstant) return;
644 CHECK_EQ(IrOpcode::kJSToNumber, converted->opcode()); 643 CHECK_EQ(IrOpcode::kJSToNumber, converted->opcode());
645 CHECK_EQ(val, converted->InputAt(0)); 644 CHECK_EQ(val, converted->InputAt(0));
646 } 645 }
647 } 646 }
648 647
649 648
650 TEST_WITH_STRONG(NumberComparison) { 649 TEST_WITH_STRENGTH(NumberComparison) {
651 JSTypedLoweringTester R; 650 JSTypedLoweringTester R;
652 651
653 const Operator* ops[] = { 652 const Operator* ops[] = {
654 R.javascript.LessThan(language_mode), R.simplified.NumberLessThan(), 653 R.javascript.LessThan(strength), R.simplified.NumberLessThan(),
655 R.javascript.LessThanOrEqual(language_mode), 654 R.javascript.LessThanOrEqual(strength),
656 R.simplified.NumberLessThanOrEqual(), 655 R.simplified.NumberLessThanOrEqual(), R.javascript.GreaterThan(strength),
657 R.javascript.GreaterThan(language_mode), R.simplified.NumberLessThan(), 656 R.simplified.NumberLessThan(), R.javascript.GreaterThanOrEqual(strength),
658 R.javascript.GreaterThanOrEqual(language_mode),
659 R.simplified.NumberLessThanOrEqual()}; 657 R.simplified.NumberLessThanOrEqual()};
660 658
661 Node* const p0 = R.Parameter(Type::Number(), 0); 659 Node* const p0 = R.Parameter(Type::Number(), 0);
662 Node* const p1 = R.Parameter(Type::Number(), 1); 660 Node* const p1 = R.Parameter(Type::Number(), 1);
663 661
664 for (size_t k = 0; k < arraysize(ops); k += 2) { 662 for (size_t k = 0; k < arraysize(ops); k += 2) {
665 Node* cmp = R.Binop(ops[k], p0, p1); 663 Node* cmp = R.Binop(ops[k], p0, p1);
666 Node* r = R.reduce(cmp); 664 Node* r = R.reduce(cmp);
667 665
668 R.CheckPureBinop(ops[k + 1], r); 666 R.CheckPureBinop(ops[k + 1], r);
669 if (k >= 4) { 667 if (k >= 4) {
670 // GreaterThan and GreaterThanOrEqual commute the inputs 668 // GreaterThan and GreaterThanOrEqual commute the inputs
671 // and use the LessThan and LessThanOrEqual operators. 669 // and use the LessThan and LessThanOrEqual operators.
672 CheckIsConvertedToNumber(p1, r->InputAt(0)); 670 CheckIsConvertedToNumber(p1, r->InputAt(0));
673 CheckIsConvertedToNumber(p0, r->InputAt(1)); 671 CheckIsConvertedToNumber(p0, r->InputAt(1));
674 } else { 672 } else {
675 CheckIsConvertedToNumber(p0, r->InputAt(0)); 673 CheckIsConvertedToNumber(p0, r->InputAt(0));
676 CheckIsConvertedToNumber(p1, r->InputAt(1)); 674 CheckIsConvertedToNumber(p1, r->InputAt(1));
677 } 675 }
678 } 676 }
679 } 677 }
680 678
681 679
682 TEST_WITH_STRONG(MixedComparison1) { 680 TEST_WITH_STRENGTH(MixedComparison1) {
683 JSTypedLoweringTester R; 681 JSTypedLoweringTester R;
684 682
685 Type* types[] = {Type::Number(), Type::String(), 683 Type* types[] = {Type::Number(), Type::String(),
686 Type::Union(Type::Number(), Type::String(), R.main_zone())}; 684 Type::Union(Type::Number(), Type::String(), R.main_zone())};
687 685
688 for (size_t i = 0; i < arraysize(types); i++) { 686 for (size_t i = 0; i < arraysize(types); i++) {
689 Node* p0 = R.Parameter(types[i], 0); 687 Node* p0 = R.Parameter(types[i], 0);
690 688
691 for (size_t j = 0; j < arraysize(types); j++) { 689 for (size_t j = 0; j < arraysize(types); j++) {
692 Node* p1 = R.Parameter(types[j], 1); 690 Node* p1 = R.Parameter(types[j], 1);
693 { 691 {
694 const Operator* less_than = R.javascript.LessThan(language_mode); 692 const Operator* less_than = R.javascript.LessThan(strength);
695 Node* cmp = R.Binop(less_than, p0, p1); 693 Node* cmp = R.Binop(less_than, p0, p1);
696 Node* r = R.reduce(cmp); 694 Node* r = R.reduce(cmp);
697 if (types[i]->Is(Type::String()) && types[j]->Is(Type::String())) { 695 if (types[i]->Is(Type::String()) && types[j]->Is(Type::String())) {
698 R.CheckPureBinop(R.simplified.StringLessThan(), r); 696 R.CheckPureBinop(R.simplified.StringLessThan(), r);
699 } else if ((types[i]->Is(Type::Number()) && 697 } else if ((types[i]->Is(Type::Number()) &&
700 types[j]->Is(Type::Number())) || 698 types[j]->Is(Type::Number())) ||
701 (!is_strong(language_mode) && 699 (!is_strong(strength) &&
702 (!types[i]->Maybe(Type::String()) || 700 (!types[i]->Maybe(Type::String()) ||
703 !types[j]->Maybe(Type::String())))) { 701 !types[j]->Maybe(Type::String())))) {
704 R.CheckPureBinop(R.simplified.NumberLessThan(), r); 702 R.CheckPureBinop(R.simplified.NumberLessThan(), r);
705 } else { 703 } else {
706 // No reduction of mixed types. 704 // No reduction of mixed types.
707 CHECK_EQ(r->op(), less_than); 705 CHECK_EQ(r->op(), less_than);
708 } 706 }
709 } 707 }
710 } 708 }
711 } 709 }
712 } 710 }
713 711
714 712
715 TEST_WITH_STRONG(RemoveToNumberEffects) { 713 TEST_WITH_STRENGTH(RemoveToNumberEffects) {
716 JSTypedLoweringTester R; 714 JSTypedLoweringTester R;
717 715
718 Node* effect_use = NULL; 716 Node* effect_use = NULL;
719 for (int i = 0; i < 10; i++) { 717 for (int i = 0; i < 10; i++) {
720 Node* p0 = R.Parameter(Type::Number()); 718 Node* p0 = R.Parameter(Type::Number());
721 Node* ton = R.Unop(R.javascript.ToNumber(), p0); 719 Node* ton = R.Unop(R.javascript.ToNumber(), p0);
722 Node* frame_state = R.EmptyFrameState(R.context()); 720 Node* frame_state = R.EmptyFrameState(R.context());
723 effect_use = NULL; 721 effect_use = NULL;
724 722
725 switch (i) { 723 switch (i) {
726 case 0: 724 case 0:
727 DCHECK(OperatorProperties::GetFrameStateInputCount( 725 DCHECK(OperatorProperties::GetFrameStateInputCount(
728 R.javascript.ToNumber()) == 1); 726 R.javascript.ToNumber()) == 1);
729 effect_use = R.graph.NewNode(R.javascript.ToNumber(), p0, R.context(), 727 effect_use = R.graph.NewNode(R.javascript.ToNumber(), p0, R.context(),
730 frame_state, ton, R.start()); 728 frame_state, ton, R.start());
731 break; 729 break;
732 case 1: 730 case 1:
733 DCHECK(OperatorProperties::GetFrameStateInputCount( 731 DCHECK(OperatorProperties::GetFrameStateInputCount(
734 R.javascript.ToNumber()) == 1); 732 R.javascript.ToNumber()) == 1);
735 effect_use = R.graph.NewNode(R.javascript.ToNumber(), ton, R.context(), 733 effect_use = R.graph.NewNode(R.javascript.ToNumber(), ton, R.context(),
736 frame_state, ton, R.start()); 734 frame_state, ton, R.start());
737 break; 735 break;
738 case 2: 736 case 2:
739 effect_use = R.graph.NewNode(R.common.EffectPhi(1), ton, R.start()); 737 effect_use = R.graph.NewNode(R.common.EffectPhi(1), ton, R.start());
740 case 3: 738 case 3:
741 effect_use = R.graph.NewNode(R.javascript.Add(language_mode), ton, ton, 739 effect_use =
742 R.context(), frame_state, frame_state, ton, 740 R.graph.NewNode(R.javascript.Add(strength), ton, ton, R.context(),
743 R.start()); 741 frame_state, frame_state, ton, R.start());
744 break; 742 break;
745 case 4: 743 case 4:
746 effect_use = R.graph.NewNode(R.javascript.Add(language_mode), p0, p0, 744 effect_use =
747 R.context(), frame_state, frame_state, ton, 745 R.graph.NewNode(R.javascript.Add(strength), p0, p0, R.context(),
748 R.start()); 746 frame_state, frame_state, ton, R.start());
749 break; 747 break;
750 case 5: 748 case 5:
751 effect_use = R.graph.NewNode(R.common.Return(), p0, ton, R.start()); 749 effect_use = R.graph.NewNode(R.common.Return(), p0, ton, R.start());
752 break; 750 break;
753 case 6: 751 case 6:
754 effect_use = R.graph.NewNode(R.common.Return(), ton, ton, R.start()); 752 effect_use = R.graph.NewNode(R.common.Return(), ton, ton, R.start());
755 } 753 }
756 754
757 R.CheckEffectInput(R.start(), ton); 755 R.CheckEffectInput(R.start(), ton);
758 if (effect_use != NULL) R.CheckEffectInput(ton, effect_use); 756 if (effect_use != NULL) R.CheckEffectInput(ton, effect_use);
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 TEST(StringEquality) { 894 TEST(StringEquality) {
897 JSTypedLoweringTester R; 895 JSTypedLoweringTester R;
898 Node* p0 = R.Parameter(Type::String()); 896 Node* p0 = R.Parameter(Type::String());
899 Node* p1 = R.Parameter(Type::String()); 897 Node* p1 = R.Parameter(Type::String());
900 898
901 CheckEqualityReduction(&R, true, p0, p1, IrOpcode::kStringEqual); 899 CheckEqualityReduction(&R, true, p0, p1, IrOpcode::kStringEqual);
902 CheckEqualityReduction(&R, false, p0, p1, IrOpcode::kStringEqual); 900 CheckEqualityReduction(&R, false, p0, p1, IrOpcode::kStringEqual);
903 } 901 }
904 902
905 903
906 TEST_WITH_STRONG(RemovePureNumberBinopEffects) { 904 TEST_WITH_STRENGTH(RemovePureNumberBinopEffects) {
907 JSTypedLoweringTester R; 905 JSTypedLoweringTester R;
908 906
909 const Operator* ops[] = { 907 const Operator* ops[] = {
910 R.javascript.Equal(), R.simplified.NumberEqual(), 908 R.javascript.Equal(), R.simplified.NumberEqual(),
911 R.javascript.Add(language_mode), R.simplified.NumberAdd(), 909 R.javascript.Add(strength), R.simplified.NumberAdd(),
912 R.javascript.Subtract(language_mode), R.simplified.NumberSubtract(), 910 R.javascript.Subtract(strength), R.simplified.NumberSubtract(),
913 R.javascript.Multiply(language_mode), R.simplified.NumberMultiply(), 911 R.javascript.Multiply(strength), R.simplified.NumberMultiply(),
914 R.javascript.Divide(language_mode), R.simplified.NumberDivide(), 912 R.javascript.Divide(strength), R.simplified.NumberDivide(),
915 R.javascript.Modulus(language_mode), R.simplified.NumberModulus(), 913 R.javascript.Modulus(strength), R.simplified.NumberModulus(),
916 R.javascript.LessThan(language_mode), R.simplified.NumberLessThan(), 914 R.javascript.LessThan(strength), R.simplified.NumberLessThan(),
917 R.javascript.LessThanOrEqual(language_mode), 915 R.javascript.LessThanOrEqual(strength),
918 R.simplified.NumberLessThanOrEqual(), 916 R.simplified.NumberLessThanOrEqual(),
919 }; 917 };
920 918
921 for (size_t j = 0; j < arraysize(ops); j += 2) { 919 for (size_t j = 0; j < arraysize(ops); j += 2) {
922 BinopEffectsTester B(ops[j], Type::Number(), Type::Number()); 920 BinopEffectsTester B(ops[j], Type::Number(), Type::Number());
923 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); 921 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode());
924 922
925 B.R.CheckPureBinop(B.result->opcode(), B.result); 923 B.R.CheckPureBinop(B.result->opcode(), B.result);
926 924
927 B.CheckNoOp(0); 925 B.CheckNoOp(0);
928 B.CheckNoOp(1); 926 B.CheckNoOp(1);
929 927
930 B.CheckEffectsRemoved(); 928 B.CheckEffectsRemoved();
931 } 929 }
932 } 930 }
933 931
934 932
935 TEST(OrderNumberBinopEffects1) { 933 TEST(OrderNumberBinopEffects1) {
936 JSTypedLoweringTester R; 934 JSTypedLoweringTester R;
937 935
938 const Operator* ops[] = { 936 const Operator* ops[] = {
939 R.javascript.Subtract(LanguageMode::SLOPPY), 937 R.javascript.Subtract(Strength::NORMAL), R.simplified.NumberSubtract(),
940 R.simplified.NumberSubtract(), 938 R.javascript.Multiply(Strength::NORMAL), R.simplified.NumberMultiply(),
941 R.javascript.Multiply(LanguageMode::SLOPPY), 939 R.javascript.Divide(Strength::NORMAL), R.simplified.NumberDivide()};
942 R.simplified.NumberMultiply(),
943 R.javascript.Divide(LanguageMode::SLOPPY),
944 R.simplified.NumberDivide(),
945 };
946 940
947 for (size_t j = 0; j < arraysize(ops); j += 2) { 941 for (size_t j = 0; j < arraysize(ops); j += 2) {
948 BinopEffectsTester B(ops[j], Type::Symbol(), Type::Symbol()); 942 BinopEffectsTester B(ops[j], Type::Symbol(), Type::Symbol());
949 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); 943 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode());
950 944
951 Node* i0 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 0, true); 945 Node* i0 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 0, true);
952 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); 946 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true);
953 947
954 CHECK_EQ(B.p0, i0->InputAt(0)); 948 CHECK_EQ(B.p0, i0->InputAt(0));
955 CHECK_EQ(B.p1, i1->InputAt(0)); 949 CHECK_EQ(B.p1, i1->InputAt(0));
956 950
957 // Effects should be ordered start -> i0 -> i1 -> effect_use 951 // Effects should be ordered start -> i0 -> i1 -> effect_use
958 B.CheckEffectOrdering(i0, i1); 952 B.CheckEffectOrdering(i0, i1);
959 } 953 }
960 } 954 }
961 955
962 956
963 TEST(OrderNumberBinopEffects2) { 957 TEST(OrderNumberBinopEffects2) {
964 JSTypedLoweringTester R; 958 JSTypedLoweringTester R;
965 959
966 const Operator* ops[] = { 960 const Operator* ops[] = {
967 R.javascript.Add(LanguageMode::SLOPPY), 961 R.javascript.Add(Strength::NORMAL), R.simplified.NumberAdd(),
968 R.simplified.NumberAdd(), 962 R.javascript.Subtract(Strength::NORMAL), R.simplified.NumberSubtract(),
969 R.javascript.Subtract(LanguageMode::SLOPPY), 963 R.javascript.Multiply(Strength::NORMAL), R.simplified.NumberMultiply(),
970 R.simplified.NumberSubtract(), 964 R.javascript.Divide(Strength::NORMAL), R.simplified.NumberDivide()};
971 R.javascript.Multiply(LanguageMode::SLOPPY),
972 R.simplified.NumberMultiply(),
973 R.javascript.Divide(LanguageMode::SLOPPY),
974 R.simplified.NumberDivide(),
975 };
976 965
977 for (size_t j = 0; j < arraysize(ops); j += 2) { 966 for (size_t j = 0; j < arraysize(ops); j += 2) {
978 BinopEffectsTester B(ops[j], Type::Number(), Type::Symbol()); 967 BinopEffectsTester B(ops[j], Type::Number(), Type::Symbol());
979 968
980 Node* i0 = B.CheckNoOp(0); 969 Node* i0 = B.CheckNoOp(0);
981 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); 970 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true);
982 971
983 CHECK_EQ(B.p0, i0); 972 CHECK_EQ(B.p0, i0);
984 CHECK_EQ(B.p1, i1->InputAt(0)); 973 CHECK_EQ(B.p1, i1->InputAt(0));
985 974
(...skipping 13 matching lines...) Expand all
999 // Effects should be ordered start -> i0 -> effect_use 988 // Effects should be ordered start -> i0 -> effect_use
1000 B.CheckEffectOrdering(i0); 989 B.CheckEffectOrdering(i0);
1001 } 990 }
1002 } 991 }
1003 992
1004 993
1005 TEST(OrderCompareEffects) { 994 TEST(OrderCompareEffects) {
1006 JSTypedLoweringTester R; 995 JSTypedLoweringTester R;
1007 996
1008 const Operator* ops[] = { 997 const Operator* ops[] = {
1009 R.javascript.GreaterThan(LanguageMode::SLOPPY), 998 R.javascript.GreaterThan(Strength::NORMAL), R.simplified.NumberLessThan(),
1010 R.simplified.NumberLessThan(), 999 R.javascript.GreaterThanOrEqual(Strength::NORMAL),
1011 R.javascript.GreaterThanOrEqual(LanguageMode::SLOPPY),
1012 R.simplified.NumberLessThanOrEqual(), 1000 R.simplified.NumberLessThanOrEqual(),
1013 }; 1001 };
1014 1002
1015 for (size_t j = 0; j < arraysize(ops); j += 2) { 1003 for (size_t j = 0; j < arraysize(ops); j += 2) {
1016 BinopEffectsTester B(ops[j], Type::Symbol(), Type::String()); 1004 BinopEffectsTester B(ops[j], Type::Symbol(), Type::String());
1017 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode()); 1005 CHECK_EQ(ops[j + 1]->opcode(), B.result->op()->opcode());
1018 1006
1019 Node* i0 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 0, true); 1007 Node* i0 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 0, true);
1020 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true); 1008 Node* i1 = B.CheckConvertedInput(IrOpcode::kJSToNumber, 1, true);
1021 1009
(...skipping 27 matching lines...) Expand all
1049 CHECK_EQ(B.p1, i0); // Should be commuted. 1037 CHECK_EQ(B.p1, i0); // Should be commuted.
1050 CHECK_EQ(B.p0, i1->InputAt(0)); 1038 CHECK_EQ(B.p0, i1->InputAt(0));
1051 1039
1052 // Effects should be ordered start -> i0 -> effect_use 1040 // Effects should be ordered start -> i0 -> effect_use
1053 B.CheckEffectOrdering(i1); 1041 B.CheckEffectOrdering(i1);
1054 } 1042 }
1055 } 1043 }
1056 1044
1057 1045
1058 TEST(Int32BinopEffects) { 1046 TEST(Int32BinopEffects) {
1059 JSBitwiseTypedLoweringTester R(LanguageMode::SLOPPY); 1047 JSBitwiseTypedLoweringTester R(Strength::NORMAL);
1060 for (int j = 0; j < R.kNumberOps; j += 2) { 1048 for (int j = 0; j < R.kNumberOps; j += 2) {
1061 bool signed_left = R.signedness[j], signed_right = R.signedness[j + 1]; 1049 bool signed_left = R.signedness[j], signed_right = R.signedness[j + 1];
1062 BinopEffectsTester B(R.ops[j], I32Type(signed_left), I32Type(signed_right)); 1050 BinopEffectsTester B(R.ops[j], I32Type(signed_left), I32Type(signed_right));
1063 CHECK_EQ(R.ops[j + 1]->opcode(), B.result->op()->opcode()); 1051 CHECK_EQ(R.ops[j + 1]->opcode(), B.result->op()->opcode());
1064 1052
1065 B.R.CheckPureBinop(B.result->opcode(), B.result); 1053 B.R.CheckPureBinop(B.result->opcode(), B.result);
1066 1054
1067 B.CheckNoOp(0); 1055 B.CheckNoOp(0);
1068 B.CheckNoOp(1); 1056 B.CheckNoOp(1);
1069 1057
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1130 Node* ii1 = B.CheckConverted(IrOpcode::kJSToNumber, i1->InputAt(0), true); 1118 Node* ii1 = B.CheckConverted(IrOpcode::kJSToNumber, i1->InputAt(0), true);
1131 1119
1132 CHECK_EQ(B.p0, ii0->InputAt(0)); 1120 CHECK_EQ(B.p0, ii0->InputAt(0));
1133 CHECK_EQ(B.p1, ii1->InputAt(0)); 1121 CHECK_EQ(B.p1, ii1->InputAt(0));
1134 1122
1135 B.CheckEffectOrdering(ii0, ii1); 1123 B.CheckEffectOrdering(ii0, ii1);
1136 } 1124 }
1137 } 1125 }
1138 1126
1139 1127
1140 TEST_WITH_STRONG(Int32AddNarrowing) { 1128 TEST_WITH_STRENGTH(Int32AddNarrowing) {
1141 { 1129 {
1142 JSBitwiseTypedLoweringTester R(language_mode); 1130 JSBitwiseTypedLoweringTester R(strength);
1143 1131
1144 for (int o = 0; o < R.kNumberOps; o += 2) { 1132 for (int o = 0; o < R.kNumberOps; o += 2) {
1145 for (size_t i = 0; i < arraysize(kInt32Types); i++) { 1133 for (size_t i = 0; i < arraysize(kInt32Types); i++) {
1146 Node* n0 = R.Parameter(kInt32Types[i]); 1134 Node* n0 = R.Parameter(kInt32Types[i]);
1147 for (size_t j = 0; j < arraysize(kInt32Types); j++) { 1135 for (size_t j = 0; j < arraysize(kInt32Types); j++) {
1148 Node* n1 = R.Parameter(kInt32Types[j]); 1136 Node* n1 = R.Parameter(kInt32Types[j]);
1149 Node* one = R.graph.NewNode(R.common.NumberConstant(1)); 1137 Node* one = R.graph.NewNode(R.common.NumberConstant(1));
1150 1138
1151 for (int l = 0; l < 2; l++) { 1139 for (int l = 0; l < 2; l++) {
1152 Node* add_node = R.Binop(R.simplified.NumberAdd(), n0, n1); 1140 Node* add_node = R.Binop(R.simplified.NumberAdd(), n0, n1);
1153 Node* or_node = 1141 Node* or_node =
1154 R.Binop(R.ops[o], l ? add_node : one, l ? one : add_node); 1142 R.Binop(R.ops[o], l ? add_node : one, l ? one : add_node);
1155 Node* r = R.reduce(or_node); 1143 Node* r = R.reduce(or_node);
1156 1144
1157 CHECK_EQ(R.ops[o + 1]->opcode(), r->op()->opcode()); 1145 CHECK_EQ(R.ops[o + 1]->opcode(), r->op()->opcode());
1158 CHECK_EQ(IrOpcode::kNumberAdd, add_node->opcode()); 1146 CHECK_EQ(IrOpcode::kNumberAdd, add_node->opcode());
1159 } 1147 }
1160 } 1148 }
1161 } 1149 }
1162 } 1150 }
1163 } 1151 }
1164 { 1152 {
1165 JSBitwiseShiftTypedLoweringTester R(language_mode); 1153 JSBitwiseShiftTypedLoweringTester R(strength);
1166 1154
1167 for (int o = 0; o < R.kNumberOps; o += 2) { 1155 for (int o = 0; o < R.kNumberOps; o += 2) {
1168 for (size_t i = 0; i < arraysize(kInt32Types); i++) { 1156 for (size_t i = 0; i < arraysize(kInt32Types); i++) {
1169 Node* n0 = R.Parameter(kInt32Types[i]); 1157 Node* n0 = R.Parameter(kInt32Types[i]);
1170 for (size_t j = 0; j < arraysize(kInt32Types); j++) { 1158 for (size_t j = 0; j < arraysize(kInt32Types); j++) {
1171 Node* n1 = R.Parameter(kInt32Types[j]); 1159 Node* n1 = R.Parameter(kInt32Types[j]);
1172 Node* one = R.graph.NewNode(R.common.NumberConstant(1)); 1160 Node* one = R.graph.NewNode(R.common.NumberConstant(1));
1173 1161
1174 for (int l = 0; l < 2; l++) { 1162 for (int l = 0; l < 2; l++) {
1175 Node* add_node = R.Binop(R.simplified.NumberAdd(), n0, n1); 1163 Node* add_node = R.Binop(R.simplified.NumberAdd(), n0, n1);
1176 Node* or_node = 1164 Node* or_node =
1177 R.Binop(R.ops[o], l ? add_node : one, l ? one : add_node); 1165 R.Binop(R.ops[o], l ? add_node : one, l ? one : add_node);
1178 Node* r = R.reduce(or_node); 1166 Node* r = R.reduce(or_node);
1179 1167
1180 CHECK_EQ(R.ops[o + 1]->opcode(), r->op()->opcode()); 1168 CHECK_EQ(R.ops[o + 1]->opcode(), r->op()->opcode());
1181 CHECK_EQ(IrOpcode::kNumberAdd, add_node->opcode()); 1169 CHECK_EQ(IrOpcode::kNumberAdd, add_node->opcode());
1182 } 1170 }
1183 } 1171 }
1184 } 1172 }
1185 } 1173 }
1186 } 1174 }
1187 { 1175 {
1188 JSBitwiseTypedLoweringTester R(language_mode); 1176 JSBitwiseTypedLoweringTester R(strength);
1189 1177
1190 for (int o = 0; o < R.kNumberOps; o += 2) { 1178 for (int o = 0; o < R.kNumberOps; o += 2) {
1191 Node* n0 = R.Parameter(I32Type(R.signedness[o])); 1179 Node* n0 = R.Parameter(I32Type(R.signedness[o]));
1192 Node* n1 = R.Parameter(I32Type(R.signedness[o + 1])); 1180 Node* n1 = R.Parameter(I32Type(R.signedness[o + 1]));
1193 Node* one = R.graph.NewNode(R.common.NumberConstant(1)); 1181 Node* one = R.graph.NewNode(R.common.NumberConstant(1));
1194 1182
1195 Node* add_node = R.Binop(R.simplified.NumberAdd(), n0, n1); 1183 Node* add_node = R.Binop(R.simplified.NumberAdd(), n0, n1);
1196 Node* or_node = R.Binop(R.ops[o], add_node, one); 1184 Node* or_node = R.Binop(R.ops[o], add_node, one);
1197 Node* other_use = R.Binop(R.simplified.NumberAdd(), add_node, one); 1185 Node* other_use = R.Binop(R.simplified.NumberAdd(), add_node, one);
1198 Node* r = R.reduce(or_node); 1186 Node* r = R.reduce(or_node);
1199 CHECK_EQ(R.ops[o + 1]->opcode(), r->op()->opcode()); 1187 CHECK_EQ(R.ops[o + 1]->opcode(), r->op()->opcode());
1200 CHECK_EQ(IrOpcode::kNumberAdd, add_node->opcode()); 1188 CHECK_EQ(IrOpcode::kNumberAdd, add_node->opcode());
1201 // Conversion to int32 should be done. 1189 // Conversion to int32 should be done.
1202 CheckToI32(add_node, r->InputAt(0), R.signedness[o]); 1190 CheckToI32(add_node, r->InputAt(0), R.signedness[o]);
1203 CheckToI32(one, r->InputAt(1), R.signedness[o + 1]); 1191 CheckToI32(one, r->InputAt(1), R.signedness[o + 1]);
1204 // The other use should also not be touched. 1192 // The other use should also not be touched.
1205 CHECK_EQ(add_node, other_use->InputAt(0)); 1193 CHECK_EQ(add_node, other_use->InputAt(0));
1206 CHECK_EQ(one, other_use->InputAt(1)); 1194 CHECK_EQ(one, other_use->InputAt(1));
1207 } 1195 }
1208 } 1196 }
1209 } 1197 }
1210 1198
1211 1199
1212 TEST_WITH_STRONG(Int32Comparisons) { 1200 TEST_WITH_STRENGTH(Int32Comparisons) {
1213 JSTypedLoweringTester R; 1201 JSTypedLoweringTester R;
1214 1202
1215 struct Entry { 1203 struct Entry {
1216 const Operator* js_op; 1204 const Operator* js_op;
1217 const Operator* uint_op; 1205 const Operator* uint_op;
1218 const Operator* int_op; 1206 const Operator* int_op;
1219 const Operator* num_op; 1207 const Operator* num_op;
1220 bool commute; 1208 bool commute;
1221 }; 1209 };
1222 1210
1223 Entry ops[] = { 1211 Entry ops[] = {
1224 {R.javascript.LessThan(language_mode), R.machine.Uint32LessThan(), 1212 {R.javascript.LessThan(strength), R.machine.Uint32LessThan(),
1225 R.machine.Int32LessThan(), R.simplified.NumberLessThan(), false}, 1213 R.machine.Int32LessThan(), R.simplified.NumberLessThan(), false},
1226 {R.javascript.LessThanOrEqual(language_mode), 1214 {R.javascript.LessThanOrEqual(strength),
1227 R.machine.Uint32LessThanOrEqual(), R.machine.Int32LessThanOrEqual(), 1215 R.machine.Uint32LessThanOrEqual(), R.machine.Int32LessThanOrEqual(),
1228 R.simplified.NumberLessThanOrEqual(), false}, 1216 R.simplified.NumberLessThanOrEqual(), false},
1229 {R.javascript.GreaterThan(language_mode), R.machine.Uint32LessThan(), 1217 {R.javascript.GreaterThan(strength), R.machine.Uint32LessThan(),
1230 R.machine.Int32LessThan(), R.simplified.NumberLessThan(), true}, 1218 R.machine.Int32LessThan(), R.simplified.NumberLessThan(), true},
1231 {R.javascript.GreaterThanOrEqual(language_mode), 1219 {R.javascript.GreaterThanOrEqual(strength),
1232 R.machine.Uint32LessThanOrEqual(), R.machine.Int32LessThanOrEqual(), 1220 R.machine.Uint32LessThanOrEqual(), R.machine.Int32LessThanOrEqual(),
1233 R.simplified.NumberLessThanOrEqual(), true} 1221 R.simplified.NumberLessThanOrEqual(), true}};
1234 };
1235 1222
1236 for (size_t o = 0; o < arraysize(ops); o++) { 1223 for (size_t o = 0; o < arraysize(ops); o++) {
1237 for (size_t i = 0; i < arraysize(kNumberTypes); i++) { 1224 for (size_t i = 0; i < arraysize(kNumberTypes); i++) {
1238 Type* t0 = kNumberTypes[i]; 1225 Type* t0 = kNumberTypes[i];
1239 Node* p0 = R.Parameter(t0, 0); 1226 Node* p0 = R.Parameter(t0, 0);
1240 1227
1241 for (size_t j = 0; j < arraysize(kNumberTypes); j++) { 1228 for (size_t j = 0; j < arraysize(kNumberTypes); j++) {
1242 Type* t1 = kNumberTypes[j]; 1229 Type* t1 = kNumberTypes[j];
1243 Node* p1 = R.Parameter(t1, 1); 1230 Node* p1 = R.Parameter(t1, 1);
1244 1231
(...skipping 13 matching lines...) Expand all
1258 CHECK_EQ(p1, r->InputAt(0)); 1245 CHECK_EQ(p1, r->InputAt(0));
1259 CHECK_EQ(p0, r->InputAt(1)); 1246 CHECK_EQ(p0, r->InputAt(1));
1260 } else { 1247 } else {
1261 CHECK_EQ(p0, r->InputAt(0)); 1248 CHECK_EQ(p0, r->InputAt(0));
1262 CHECK_EQ(p1, r->InputAt(1)); 1249 CHECK_EQ(p1, r->InputAt(1));
1263 } 1250 }
1264 } 1251 }
1265 } 1252 }
1266 } 1253 }
1267 } 1254 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698