| Index: runtime/vm/intermediate_language_x64.cc
|
| ===================================================================
|
| --- runtime/vm/intermediate_language_x64.cc (revision 11611)
|
| +++ runtime/vm/intermediate_language_x64.cc (working copy)
|
| @@ -249,9 +249,7 @@
|
| const intptr_t kNumInputs = 2;
|
| const bool is_checked_strict_equal =
|
| HasICData() && ic_data()->AllTargetsHaveSameOwner(kInstanceCid);
|
| - if ((receiver_class_id() == kSmiCid) ||
|
| - (receiver_class_id() == kDoubleCid) ||
|
| - is_checked_strict_equal) {
|
| + if ((receiver_class_id() == kSmiCid) || is_checked_strict_equal) {
|
| const intptr_t kNumTemps = 1;
|
| LocationSummary* locs =
|
| new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
|
| @@ -261,6 +259,17 @@
|
| locs->set_out(Location::RequiresRegister());
|
| return locs;
|
| }
|
| + if (receiver_class_id() == kDoubleCid) {
|
| + const intptr_t kNumTemps = 2;
|
| + LocationSummary* locs =
|
| + new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
|
| + locs->set_in(0, Location::RequiresRegister());
|
| + locs->set_in(1, Location::RequiresRegister());
|
| + locs->set_out(Location::RequiresRegister());
|
| + locs->set_temp(0, Location::RequiresRegister());
|
| + locs->set_temp(1, Location::XmmRegisterLocation(XMM1));
|
| + return locs;
|
| + }
|
| if (HasICData() && (ic_data()->NumberOfChecks() > 0)) {
|
| const intptr_t kNumTemps = 1;
|
| LocationSummary* locs =
|
| @@ -540,19 +549,6 @@
|
| intptr_t deopt_id) {
|
| Register left = locs.in(0).reg();
|
| Register right = locs.in(1).reg();
|
| - const bool left_is_smi = (branch == NULL) ?
|
| - false : (branch->computation()->left()->ResultCid() == kSmiCid);
|
| - const bool right_is_smi = (branch == NULL) ?
|
| - false : (branch->computation()->right()->ResultCid() == kSmiCid);
|
| - // TODO(fschneider): Move smi smi checks outside this instruction.
|
| - if (!left_is_smi || !right_is_smi) {
|
| - Register temp = locs.temp(0).reg();
|
| - Label* deopt = compiler->AddDeoptStub(deopt_id, kDeoptSmiCompareSmi);
|
| - __ movq(temp, left);
|
| - __ orq(temp, right);
|
| - __ testq(temp, Immediate(kSmiTagMask));
|
| - __ j(NOT_ZERO, deopt);
|
| - }
|
|
|
| Condition true_condition = TokenKindToSmiCondition(kind);
|
| __ cmpq(left, right);
|
| @@ -691,7 +687,7 @@
|
|
|
| LocationSummary* RelationalOpComp::MakeLocationSummary() const {
|
| const intptr_t kNumInputs = 2;
|
| - if (operands_class_id() == kSmiCid || operands_class_id() == kDoubleCid) {
|
| + if (operands_class_id() == kSmiCid) {
|
| const intptr_t kNumTemps = 1;
|
| LocationSummary* summary =
|
| new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
|
| @@ -701,6 +697,17 @@
|
| summary->set_temp(0, Location::RequiresRegister());
|
| return summary;
|
| }
|
| + if (operands_class_id() == kDoubleCid) {
|
| + const intptr_t kNumTemps = 2;
|
| + LocationSummary* summary =
|
| + new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
|
| + summary->set_in(0, Location::RequiresRegister());
|
| + summary->set_in(1, Location::RequiresRegister());
|
| + summary->set_out(Location::RequiresRegister());
|
| + summary->set_temp(0, Location::RequiresRegister());
|
| + summary->set_temp(1, Location::XmmRegisterLocation(XMM1));
|
| + return summary;
|
| + }
|
| const intptr_t kNumTemps = 0;
|
| LocationSummary* locs =
|
| new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
|
|
|