OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64. |
6 #if defined(TARGET_ARCH_X64) | 6 #if defined(TARGET_ARCH_X64) |
7 | 7 |
8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
9 | 9 |
10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 | 158 |
159 | 159 |
160 void IfThenElseInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 160 void IfThenElseInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
161 ASSERT(locs()->out(0).reg() == RDX); | 161 ASSERT(locs()->out(0).reg() == RDX); |
162 | 162 |
163 // Clear upper part of the out register. We are going to use setcc on it | 163 // Clear upper part of the out register. We are going to use setcc on it |
164 // which is a byte move. | 164 // which is a byte move. |
165 __ xorq(RDX, RDX); | 165 __ xorq(RDX, RDX); |
166 | 166 |
167 // Emit comparison code. This must not overwrite the result register. | 167 // Emit comparison code. This must not overwrite the result register. |
168 // IfThenElseInstr::Supports() should prevent EmitComparisonCode from using | |
169 // the labels or returning an invalid condition. | |
170 BranchLabels labels = {NULL, NULL, NULL}; | 168 BranchLabels labels = {NULL, NULL, NULL}; |
171 Condition true_condition = comparison()->EmitComparisonCode(compiler, labels); | 169 Condition true_condition = comparison()->EmitComparisonCode(compiler, labels); |
172 ASSERT(true_condition != INVALID_CONDITION); | |
173 | 170 |
174 const bool is_power_of_two_kind = IsPowerOfTwoKind(if_true_, if_false_); | 171 const bool is_power_of_two_kind = IsPowerOfTwoKind(if_true_, if_false_); |
175 | 172 |
176 intptr_t true_value = if_true_; | 173 intptr_t true_value = if_true_; |
177 intptr_t false_value = if_false_; | 174 intptr_t false_value = if_false_; |
178 | 175 |
179 if (is_power_of_two_kind) { | 176 if (is_power_of_two_kind) { |
180 if (true_value == 0) { | 177 if (true_value == 0) { |
181 // We need to have zero in RDX on true_condition. | 178 // We need to have zero in RDX on true_condition. |
182 true_condition = NegateCondition(true_condition); | 179 true_condition = NegateCondition(true_condition); |
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
569 BranchLabels labels) { | 566 BranchLabels labels) { |
570 if ((operation_cid() == kSmiCid) || (operation_cid() == kMintCid)) { | 567 if ((operation_cid() == kSmiCid) || (operation_cid() == kMintCid)) { |
571 return EmitInt64ComparisonOp(compiler, *locs(), kind()); | 568 return EmitInt64ComparisonOp(compiler, *locs(), kind()); |
572 } else { | 569 } else { |
573 ASSERT(operation_cid() == kDoubleCid); | 570 ASSERT(operation_cid() == kDoubleCid); |
574 return EmitDoubleComparisonOp(compiler, *locs(), kind(), labels); | 571 return EmitDoubleComparisonOp(compiler, *locs(), kind(), labels); |
575 } | 572 } |
576 } | 573 } |
577 | 574 |
578 | 575 |
579 void ComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 576 void EqualityCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 577 ASSERT((kind() == Token::kEQ) || (kind() == Token::kNE)); |
| 578 |
580 Label is_true, is_false; | 579 Label is_true, is_false; |
581 BranchLabels labels = {&is_true, &is_false, &is_false}; | 580 BranchLabels labels = {&is_true, &is_false, &is_false}; |
582 Condition true_condition = EmitComparisonCode(compiler, labels); | 581 Condition true_condition = EmitComparisonCode(compiler, labels); |
583 if (true_condition != INVALID_CONDITION) { | 582 EmitBranchOnCondition(compiler, true_condition, labels); |
584 EmitBranchOnCondition(compiler, true_condition, labels); | |
585 } | |
586 | 583 |
587 Register result = locs()->out(0).reg(); | 584 Register result = locs()->out(0).reg(); |
588 Label done; | 585 Label done; |
589 __ Bind(&is_false); | 586 __ Bind(&is_false); |
590 __ LoadObject(result, Bool::False()); | 587 __ LoadObject(result, Bool::False()); |
591 __ jmp(&done); | 588 __ jmp(&done); |
592 __ Bind(&is_true); | 589 __ Bind(&is_true); |
593 __ LoadObject(result, Bool::True()); | 590 __ LoadObject(result, Bool::True()); |
594 __ Bind(&done); | 591 __ Bind(&done); |
595 } | 592 } |
596 | 593 |
597 | 594 |
598 void ComparisonInstr::EmitBranchCode(FlowGraphCompiler* compiler, | 595 void EqualityCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
599 BranchInstr* branch) { | 596 BranchInstr* branch) { |
| 597 ASSERT((kind() == Token::kNE) || (kind() == Token::kEQ)); |
| 598 |
600 BranchLabels labels = compiler->CreateBranchLabels(branch); | 599 BranchLabels labels = compiler->CreateBranchLabels(branch); |
601 Condition true_condition = EmitComparisonCode(compiler, labels); | 600 Condition true_condition = EmitComparisonCode(compiler, labels); |
602 if (true_condition != INVALID_CONDITION) { | 601 EmitBranchOnCondition(compiler, true_condition, labels); |
603 EmitBranchOnCondition(compiler, true_condition, labels); | |
604 } | |
605 } | 602 } |
606 | 603 |
607 | 604 |
608 LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone, bool opt) const { | 605 LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone, bool opt) const { |
609 const intptr_t kNumInputs = 2; | 606 const intptr_t kNumInputs = 2; |
610 const intptr_t kNumTemps = 0; | 607 const intptr_t kNumTemps = 0; |
611 LocationSummary* locs = new (zone) | 608 LocationSummary* locs = new (zone) |
612 LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 609 LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
613 locs->set_in(0, Location::RequiresRegister()); | 610 locs->set_in(0, Location::RequiresRegister()); |
614 // Only one input can be a constant operand. The case of two constant | 611 // Only one input can be a constant operand. The case of two constant |
(...skipping 12 matching lines...) Expand all Loading... |
627 const int64_t imm = reinterpret_cast<int64_t>(right.constant().raw()); | 624 const int64_t imm = reinterpret_cast<int64_t>(right.constant().raw()); |
628 __ TestImmediate(left_reg, Immediate(imm)); | 625 __ TestImmediate(left_reg, Immediate(imm)); |
629 } else { | 626 } else { |
630 __ testq(left_reg, right.reg()); | 627 __ testq(left_reg, right.reg()); |
631 } | 628 } |
632 Condition true_condition = (kind() == Token::kNE) ? NOT_ZERO : ZERO; | 629 Condition true_condition = (kind() == Token::kNE) ? NOT_ZERO : ZERO; |
633 return true_condition; | 630 return true_condition; |
634 } | 631 } |
635 | 632 |
636 | 633 |
| 634 void TestSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 635 // Never emitted outside of the BranchInstr. |
| 636 UNREACHABLE(); |
| 637 } |
| 638 |
| 639 |
| 640 void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
| 641 BranchInstr* branch) { |
| 642 BranchLabels labels = compiler->CreateBranchLabels(branch); |
| 643 Condition true_condition = EmitComparisonCode(compiler, labels); |
| 644 EmitBranchOnCondition(compiler, true_condition, labels); |
| 645 } |
| 646 |
| 647 |
637 LocationSummary* TestCidsInstr::MakeLocationSummary(Zone* zone, | 648 LocationSummary* TestCidsInstr::MakeLocationSummary(Zone* zone, |
638 bool opt) const { | 649 bool opt) const { |
639 const intptr_t kNumInputs = 1; | 650 const intptr_t kNumInputs = 1; |
640 const intptr_t kNumTemps = 1; | 651 const intptr_t kNumTemps = 1; |
641 LocationSummary* locs = new (zone) | 652 LocationSummary* locs = new (zone) |
642 LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 653 LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
643 locs->set_in(0, Location::RequiresRegister()); | 654 locs->set_in(0, Location::RequiresRegister()); |
644 locs->set_temp(0, Location::RequiresRegister()); | 655 locs->set_temp(0, Location::RequiresRegister()); |
645 locs->set_out(0, Location::RequiresRegister()); | 656 locs->set_out(0, Location::RequiresRegister()); |
646 return locs; | 657 return locs; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
678 // If the cid is not in the list, jump to the opposite label from the cids | 689 // If the cid is not in the list, jump to the opposite label from the cids |
679 // that are in the list. These must be all the same (see asserts in the | 690 // that are in the list. These must be all the same (see asserts in the |
680 // constructor). | 691 // constructor). |
681 Label* target = result ? labels.false_label : labels.true_label; | 692 Label* target = result ? labels.false_label : labels.true_label; |
682 if (target != labels.fall_through) { | 693 if (target != labels.fall_through) { |
683 __ jmp(target); | 694 __ jmp(target); |
684 } | 695 } |
685 } else { | 696 } else { |
686 __ jmp(deopt); | 697 __ jmp(deopt); |
687 } | 698 } |
688 // Dummy result as this method already did the jump, there's no need | 699 // Dummy result as the last instruction is a jump, any conditional |
689 // for the caller to branch on a condition. | 700 // branch using the result will therefore be skipped. |
690 return INVALID_CONDITION; | 701 return ZERO; |
691 } | 702 } |
692 | 703 |
693 | 704 |
| 705 void TestCidsInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
| 706 BranchInstr* branch) { |
| 707 BranchLabels labels = compiler->CreateBranchLabels(branch); |
| 708 EmitComparisonCode(compiler, labels); |
| 709 } |
| 710 |
| 711 |
| 712 void TestCidsInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 713 Register result_reg = locs()->out(0).reg(); |
| 714 Label is_true, is_false, done; |
| 715 BranchLabels labels = {&is_true, &is_false, &is_false}; |
| 716 EmitComparisonCode(compiler, labels); |
| 717 __ Bind(&is_false); |
| 718 __ LoadObject(result_reg, Bool::False()); |
| 719 __ jmp(&done, Assembler::kNearJump); |
| 720 __ Bind(&is_true); |
| 721 __ LoadObject(result_reg, Bool::True()); |
| 722 __ Bind(&done); |
| 723 } |
| 724 |
| 725 |
694 LocationSummary* RelationalOpInstr::MakeLocationSummary(Zone* zone, | 726 LocationSummary* RelationalOpInstr::MakeLocationSummary(Zone* zone, |
695 bool opt) const { | 727 bool opt) const { |
696 const intptr_t kNumInputs = 2; | 728 const intptr_t kNumInputs = 2; |
697 const intptr_t kNumTemps = 0; | 729 const intptr_t kNumTemps = 0; |
698 if (operation_cid() == kDoubleCid) { | 730 if (operation_cid() == kDoubleCid) { |
699 LocationSummary* summary = new (zone) | 731 LocationSummary* summary = new (zone) |
700 LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 732 LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
701 summary->set_in(0, Location::RequiresFpuRegister()); | 733 summary->set_in(0, Location::RequiresFpuRegister()); |
702 summary->set_in(1, Location::RequiresFpuRegister()); | 734 summary->set_in(1, Location::RequiresFpuRegister()); |
703 summary->set_out(0, Location::RequiresRegister()); | 735 summary->set_out(0, Location::RequiresRegister()); |
(...skipping 24 matching lines...) Expand all Loading... |
728 BranchLabels labels) { | 760 BranchLabels labels) { |
729 if ((operation_cid() == kSmiCid) || (operation_cid() == kMintCid)) { | 761 if ((operation_cid() == kSmiCid) || (operation_cid() == kMintCid)) { |
730 return EmitInt64ComparisonOp(compiler, *locs(), kind()); | 762 return EmitInt64ComparisonOp(compiler, *locs(), kind()); |
731 } else { | 763 } else { |
732 ASSERT(operation_cid() == kDoubleCid); | 764 ASSERT(operation_cid() == kDoubleCid); |
733 return EmitDoubleComparisonOp(compiler, *locs(), kind(), labels); | 765 return EmitDoubleComparisonOp(compiler, *locs(), kind(), labels); |
734 } | 766 } |
735 } | 767 } |
736 | 768 |
737 | 769 |
| 770 void RelationalOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 771 Label is_true, is_false; |
| 772 BranchLabels labels = {&is_true, &is_false, &is_false}; |
| 773 Condition true_condition = EmitComparisonCode(compiler, labels); |
| 774 EmitBranchOnCondition(compiler, true_condition, labels); |
| 775 |
| 776 Register result = locs()->out(0).reg(); |
| 777 Label done; |
| 778 __ Bind(&is_false); |
| 779 __ LoadObject(result, Bool::False()); |
| 780 __ jmp(&done); |
| 781 __ Bind(&is_true); |
| 782 __ LoadObject(result, Bool::True()); |
| 783 __ Bind(&done); |
| 784 } |
| 785 |
| 786 |
| 787 void RelationalOpInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
| 788 BranchInstr* branch) { |
| 789 BranchLabels labels = compiler->CreateBranchLabels(branch); |
| 790 Condition true_condition = EmitComparisonCode(compiler, labels); |
| 791 EmitBranchOnCondition(compiler, true_condition, labels); |
| 792 } |
| 793 |
| 794 |
738 LocationSummary* NativeCallInstr::MakeLocationSummary(Zone* zone, | 795 LocationSummary* NativeCallInstr::MakeLocationSummary(Zone* zone, |
739 bool opt) const { | 796 bool opt) const { |
740 return MakeCallSummary(zone); | 797 return MakeCallSummary(zone); |
741 } | 798 } |
742 | 799 |
743 | 800 |
744 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 801 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
745 SetupNative(); | 802 SetupNative(); |
746 Register result = locs()->out(0).reg(); | 803 Register result = locs()->out(0).reg(); |
747 const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function()); | 804 const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function()); |
(...skipping 2297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3045 | 3102 |
3046 void CheckedSmiComparisonInstr::EmitBranchCode(FlowGraphCompiler* compiler, | 3103 void CheckedSmiComparisonInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
3047 BranchInstr* branch) { | 3104 BranchInstr* branch) { |
3048 BranchLabels labels = compiler->CreateBranchLabels(branch); | 3105 BranchLabels labels = compiler->CreateBranchLabels(branch); |
3049 CheckedSmiComparisonSlowPath* slow_path = new CheckedSmiComparisonSlowPath( | 3106 CheckedSmiComparisonSlowPath* slow_path = new CheckedSmiComparisonSlowPath( |
3050 this, compiler->CurrentTryIndex(), labels, | 3107 this, compiler->CurrentTryIndex(), labels, |
3051 /* merged = */ true); | 3108 /* merged = */ true); |
3052 compiler->AddSlowPathCode(slow_path); | 3109 compiler->AddSlowPathCode(slow_path); |
3053 EMIT_SMI_CHECK; | 3110 EMIT_SMI_CHECK; |
3054 Condition true_condition = EmitComparisonCode(compiler, labels); | 3111 Condition true_condition = EmitComparisonCode(compiler, labels); |
3055 ASSERT(true_condition != INVALID_CONDITION); | |
3056 EmitBranchOnCondition(compiler, true_condition, labels); | 3112 EmitBranchOnCondition(compiler, true_condition, labels); |
3057 __ Bind(slow_path->exit_label()); | 3113 __ Bind(slow_path->exit_label()); |
3058 } | 3114 } |
3059 | 3115 |
3060 | 3116 |
3061 void CheckedSmiComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3117 void CheckedSmiComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3062 Label true_label, false_label, done; | 3118 Label true_label, false_label, done; |
3063 BranchLabels labels = {&true_label, &false_label, &false_label}; | 3119 BranchLabels labels = {&true_label, &false_label, &false_label}; |
3064 CheckedSmiComparisonSlowPath* slow_path = new CheckedSmiComparisonSlowPath( | 3120 CheckedSmiComparisonSlowPath* slow_path = new CheckedSmiComparisonSlowPath( |
3065 this, compiler->CurrentTryIndex(), labels, | 3121 this, compiler->CurrentTryIndex(), labels, |
3066 /* merged = */ false); | 3122 /* merged = */ false); |
3067 compiler->AddSlowPathCode(slow_path); | 3123 compiler->AddSlowPathCode(slow_path); |
3068 EMIT_SMI_CHECK; | 3124 EMIT_SMI_CHECK; |
3069 Condition true_condition = EmitComparisonCode(compiler, labels); | 3125 Condition true_condition = EmitComparisonCode(compiler, labels); |
3070 ASSERT(true_condition != INVALID_CONDITION); | |
3071 EmitBranchOnCondition(compiler, true_condition, labels); | 3126 EmitBranchOnCondition(compiler, true_condition, labels); |
3072 Register result = locs()->out(0).reg(); | 3127 Register result = locs()->out(0).reg(); |
3073 __ Bind(&false_label); | 3128 __ Bind(&false_label); |
3074 __ LoadObject(result, Bool::False()); | 3129 __ LoadObject(result, Bool::False()); |
3075 __ jmp(&done); | 3130 __ jmp(&done); |
3076 __ Bind(&true_label); | 3131 __ Bind(&true_label); |
3077 __ LoadObject(result, Bool::True()); | 3132 __ LoadObject(result, Bool::True()); |
3078 __ Bind(&done); | 3133 __ Bind(&done); |
3079 __ Bind(slow_path->exit_label()); | 3134 __ Bind(slow_path->exit_label()); |
3080 } | 3135 } |
(...skipping 808 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3889 __ AddImmediate(RSP, Immediate(kDoubleSize)); | 3944 __ AddImmediate(RSP, Immediate(kDoubleSize)); |
3890 // Mask off the sign. | 3945 // Mask off the sign. |
3891 __ AndImmediate(temp, Immediate(0x7FFFFFFFFFFFFFFFLL)); | 3946 __ AndImmediate(temp, Immediate(0x7FFFFFFFFFFFFFFFLL)); |
3892 // Compare with +infinity. | 3947 // Compare with +infinity. |
3893 __ CompareImmediate(temp, Immediate(0x7FF0000000000000LL)); | 3948 __ CompareImmediate(temp, Immediate(0x7FF0000000000000LL)); |
3894 return is_negated ? NOT_EQUAL : EQUAL; | 3949 return is_negated ? NOT_EQUAL : EQUAL; |
3895 } | 3950 } |
3896 } | 3951 } |
3897 | 3952 |
3898 | 3953 |
| 3954 void DoubleTestOpInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
| 3955 BranchInstr* branch) { |
| 3956 ASSERT(compiler->is_optimizing()); |
| 3957 BranchLabels labels = compiler->CreateBranchLabels(branch); |
| 3958 Condition true_condition = EmitComparisonCode(compiler, labels); |
| 3959 EmitBranchOnCondition(compiler, true_condition, labels); |
| 3960 } |
| 3961 |
| 3962 |
| 3963 void DoubleTestOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 3964 Label is_true, is_false; |
| 3965 BranchLabels labels = {&is_true, &is_false, &is_false}; |
| 3966 Condition true_condition = EmitComparisonCode(compiler, labels); |
| 3967 EmitBranchOnCondition(compiler, true_condition, labels); |
| 3968 |
| 3969 Register result = locs()->out(0).reg(); |
| 3970 Label done; |
| 3971 __ Bind(&is_false); |
| 3972 __ LoadObject(result, Bool::False()); |
| 3973 __ jmp(&done); |
| 3974 __ Bind(&is_true); |
| 3975 __ LoadObject(result, Bool::True()); |
| 3976 __ Bind(&done); |
| 3977 } |
| 3978 |
| 3979 |
3899 LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Zone* zone, | 3980 LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Zone* zone, |
3900 bool opt) const { | 3981 bool opt) const { |
3901 const intptr_t kNumInputs = 2; | 3982 const intptr_t kNumInputs = 2; |
3902 const intptr_t kNumTemps = 0; | 3983 const intptr_t kNumTemps = 0; |
3903 LocationSummary* summary = new (zone) | 3984 LocationSummary* summary = new (zone) |
3904 LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3985 LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3905 summary->set_in(0, Location::RequiresFpuRegister()); | 3986 summary->set_in(0, Location::RequiresFpuRegister()); |
3906 summary->set_in(1, Location::RequiresFpuRegister()); | 3987 summary->set_in(1, Location::RequiresFpuRegister()); |
3907 summary->set_out(0, Location::SameAsFirstInput()); | 3988 summary->set_out(0, Location::SameAsFirstInput()); |
3908 return summary; | 3989 return summary; |
(...skipping 2641 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6550 left.reg(), right.reg(), needs_number_check(), token_pos(), deopt_id_); | 6631 left.reg(), right.reg(), needs_number_check(), token_pos(), deopt_id_); |
6551 } | 6632 } |
6552 if (kind() != Token::kEQ_STRICT) { | 6633 if (kind() != Token::kEQ_STRICT) { |
6553 ASSERT(kind() == Token::kNE_STRICT); | 6634 ASSERT(kind() == Token::kNE_STRICT); |
6554 true_condition = NegateCondition(true_condition); | 6635 true_condition = NegateCondition(true_condition); |
6555 } | 6636 } |
6556 return true_condition; | 6637 return true_condition; |
6557 } | 6638 } |
6558 | 6639 |
6559 | 6640 |
| 6641 void StrictCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 6642 ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT); |
| 6643 |
| 6644 Label is_true, is_false; |
| 6645 BranchLabels labels = {&is_true, &is_false, &is_false}; |
| 6646 |
| 6647 Condition true_condition = EmitComparisonCode(compiler, labels); |
| 6648 EmitBranchOnCondition(compiler, true_condition, labels); |
| 6649 |
| 6650 Register result = locs()->out(0).reg(); |
| 6651 Label done; |
| 6652 __ Bind(&is_false); |
| 6653 __ LoadObject(result, Bool::False()); |
| 6654 __ jmp(&done); |
| 6655 __ Bind(&is_true); |
| 6656 __ LoadObject(result, Bool::True()); |
| 6657 __ Bind(&done); |
| 6658 } |
| 6659 |
| 6660 |
| 6661 void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
| 6662 BranchInstr* branch) { |
| 6663 ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT); |
| 6664 |
| 6665 BranchLabels labels = compiler->CreateBranchLabels(branch); |
| 6666 Condition true_condition = EmitComparisonCode(compiler, labels); |
| 6667 EmitBranchOnCondition(compiler, true_condition, labels); |
| 6668 } |
| 6669 |
| 6670 |
6560 LocationSummary* ClosureCallInstr::MakeLocationSummary(Zone* zone, | 6671 LocationSummary* ClosureCallInstr::MakeLocationSummary(Zone* zone, |
6561 bool opt) const { | 6672 bool opt) const { |
6562 const intptr_t kNumInputs = 1; | 6673 const intptr_t kNumInputs = 1; |
6563 const intptr_t kNumTemps = 0; | 6674 const intptr_t kNumTemps = 0; |
6564 LocationSummary* summary = new (zone) | 6675 LocationSummary* summary = new (zone) |
6565 LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall); | 6676 LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
6566 summary->set_in(0, Location::RegisterLocation(RAX)); // Function. | 6677 summary->set_in(0, Location::RegisterLocation(RAX)); // Function. |
6567 summary->set_out(0, Location::RegisterLocation(RAX)); | 6678 summary->set_out(0, Location::RegisterLocation(RAX)); |
6568 return summary; | 6679 return summary; |
6569 } | 6680 } |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6670 __ Drop(1); | 6781 __ Drop(1); |
6671 __ popq(result); | 6782 __ popq(result); |
6672 } | 6783 } |
6673 | 6784 |
6674 | 6785 |
6675 } // namespace dart | 6786 } // namespace dart |
6676 | 6787 |
6677 #undef __ | 6788 #undef __ |
6678 | 6789 |
6679 #endif // defined TARGET_ARCH_X64 | 6790 #endif // defined TARGET_ARCH_X64 |
OLD | NEW |