Chromium Code Reviews| 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_ARM. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM. |
| 6 #if defined(TARGET_ARCH_ARM) | 6 #if defined(TARGET_ARCH_ARM) |
| 7 | 7 |
| 8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
| 9 | 9 |
| 10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
| (...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 487 return; | 487 return; |
| 488 } | 488 } |
| 489 if (operation_cid() == kDoubleCid) { | 489 if (operation_cid() == kDoubleCid) { |
| 490 EmitDoubleComparisonOp(compiler, *locs(), kind(), branch); | 490 EmitDoubleComparisonOp(compiler, *locs(), kind(), branch); |
| 491 return; | 491 return; |
| 492 } | 492 } |
| 493 UNREACHABLE(); | 493 UNREACHABLE(); |
| 494 } | 494 } |
| 495 | 495 |
| 496 | 496 |
| 497 LocationSummary* TestSmiInstr::MakeLocationSummary() const { | |
| 498 const intptr_t kNumInputs = 2; | |
| 499 const intptr_t kNumTemps = 0; | |
| 500 LocationSummary* locs = | |
| 501 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | |
| 502 locs->set_in(0, Location::RequiresRegister()); | |
| 503 // Only one input can be a constant operand. The case of two constant | |
| 504 // operands should be handled by constant propagation. | |
| 505 locs->set_in(1, Location::RegisterOrConstant(right())); | |
| 506 return locs; | |
| 507 } | |
| 508 | |
| 509 | |
| 510 void TestSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | |
| 511 // Never emitted outside of the BranchInstr. | |
| 512 UNREACHABLE(); | |
| 513 } | |
| 514 | |
| 515 | |
| 516 void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler, | |
| 517 BranchInstr* branch) { | |
| 518 Condition branch_condition = (kind() == Token::kNE) ? NE : EQ; | |
| 519 Register left = locs()->in(0).reg(); | |
| 520 Location right = locs()->in(1); | |
| 521 if (right.IsConstant()) { | |
| 522 ASSERT(right.constant().IsSmi()); | |
| 523 const int32_t imm = | |
| 524 reinterpret_cast<int32_t>(right.constant().raw()); | |
| 525 ShifterOperand shifter_op; | |
| 526 if (ShifterOperand::CanHold(imm, &shifter_op)) { | |
|
zra
2013/11/05 18:38:03
Maybe add TstImmediate macro to assembler.
Florian Schneider
2013/11/06 12:13:42
Done.
| |
| 527 __ tst(left, shifter_op); | |
| 528 } else { | |
| 529 __ LoadImmediate(IP, imm); | |
| 530 __ tst(left, ShifterOperand(IP)); | |
| 531 } | |
| 532 } else { | |
| 533 __ tst(left, ShifterOperand(right.reg())); | |
| 534 } | |
| 535 branch->EmitBranchOnCondition(compiler, branch_condition); | |
| 536 } | |
| 537 | |
| 538 | |
| 497 LocationSummary* RelationalOpInstr::MakeLocationSummary() const { | 539 LocationSummary* RelationalOpInstr::MakeLocationSummary() const { |
| 498 const intptr_t kNumInputs = 2; | 540 const intptr_t kNumInputs = 2; |
| 499 const intptr_t kNumTemps = 0; | 541 const intptr_t kNumTemps = 0; |
| 500 if (operation_cid() == kMintCid) { | 542 if (operation_cid() == kMintCid) { |
| 501 const intptr_t kNumTemps = 2; | 543 const intptr_t kNumTemps = 2; |
| 502 LocationSummary* locs = | 544 LocationSummary* locs = |
| 503 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 545 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 504 locs->set_in(0, Location::RequiresFpuRegister()); | 546 locs->set_in(0, Location::RequiresFpuRegister()); |
| 505 locs->set_in(1, Location::RequiresFpuRegister()); | 547 locs->set_in(1, Location::RequiresFpuRegister()); |
| 506 locs->set_temp(0, Location::RequiresRegister()); | 548 locs->set_temp(0, Location::RequiresRegister()); |
| (...skipping 3929 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4436 compiler->GenerateCall(token_pos(), | 4478 compiler->GenerateCall(token_pos(), |
| 4437 &label, | 4479 &label, |
| 4438 PcDescriptors::kOther, | 4480 PcDescriptors::kOther, |
| 4439 locs()); | 4481 locs()); |
| 4440 __ Drop(2); // Discard type arguments and receiver. | 4482 __ Drop(2); // Discard type arguments and receiver. |
| 4441 } | 4483 } |
| 4442 | 4484 |
| 4443 } // namespace dart | 4485 } // namespace dart |
| 4444 | 4486 |
| 4445 #endif // defined TARGET_ARCH_ARM | 4487 #endif // defined TARGET_ARCH_ARM |
| OLD | NEW |