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_IA32. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32. |
6 #if defined(TARGET_ARCH_IA32) | 6 #if defined(TARGET_ARCH_IA32) |
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 6563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6574 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); | 6574 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
6575 | 6575 |
6576 summary->set_in(0, Location::RequiresRegister()); | 6576 summary->set_in(0, Location::RequiresRegister()); |
6577 summary->set_temp(0, Location::RequiresRegister()); | 6577 summary->set_temp(0, Location::RequiresRegister()); |
6578 | 6578 |
6579 return summary; | 6579 return summary; |
6580 } | 6580 } |
6581 | 6581 |
6582 | 6582 |
6583 void IndirectGotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 6583 void IndirectGotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
6584 Register target_reg = locs()->temp_slot(0)->reg(); | 6584 Register target_address_reg = locs()->temp_slot(0)->reg(); |
6585 | 6585 |
6586 // Load code object from frame. | 6586 // Load from [current frame pointer] + kPcMarkerSlotFromFp. |
6587 __ movl(target_reg, Address(EBP, kPcMarkerSlotFromFp * kWordSize)); | 6587 __ movl(target_address_reg, Address(EBP, kPcMarkerSlotFromFp * kWordSize)); |
6588 // Load instructions entry point. | |
6589 __ movl(target_reg, FieldAddress(target_reg, Code::entry_point_offset())); | |
6590 | 6588 |
6591 // Add the offset. | 6589 // Add the offset. |
6592 Register offset_reg = locs()->in(0).reg(); | 6590 Register offset_reg = locs()->in(0).reg(); |
6593 if (offset()->definition()->representation() == kTagged) { | 6591 if (offset()->definition()->representation() == kTagged) { |
6594 __ SmiUntag(offset_reg); | 6592 __ SmiUntag(offset_reg); |
6595 } | 6593 } |
6596 __ addl(target_reg, offset_reg); | 6594 __ addl(target_address_reg, offset_reg); |
6597 | 6595 |
6598 // Jump to the absolute address. | 6596 // Jump to the absolute address. |
6599 __ jmp(target_reg); | 6597 __ jmp(target_address_reg); |
6600 } | 6598 } |
6601 | 6599 |
6602 | 6600 |
6603 LocationSummary* StrictCompareInstr::MakeLocationSummary(Zone* zone, | 6601 LocationSummary* StrictCompareInstr::MakeLocationSummary(Zone* zone, |
6604 bool opt) const { | 6602 bool opt) const { |
6605 const intptr_t kNumInputs = 2; | 6603 const intptr_t kNumInputs = 2; |
6606 const intptr_t kNumTemps = 0; | 6604 const intptr_t kNumTemps = 0; |
6607 if (needs_number_check()) { | 6605 if (needs_number_check()) { |
6608 LocationSummary* locs = new(zone) LocationSummary( | 6606 LocationSummary* locs = new(zone) LocationSummary( |
6609 zone, kNumInputs, kNumTemps, LocationSummary::kCall); | 6607 zone, kNumInputs, kNumTemps, LocationSummary::kCall); |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6870 __ Drop(1); | 6868 __ Drop(1); |
6871 __ popl(result); | 6869 __ popl(result); |
6872 } | 6870 } |
6873 | 6871 |
6874 | 6872 |
6875 } // namespace dart | 6873 } // namespace dart |
6876 | 6874 |
6877 #undef __ | 6875 #undef __ |
6878 | 6876 |
6879 #endif // defined TARGET_ARCH_IA32 | 6877 #endif // defined TARGET_ARCH_IA32 |
OLD | NEW |