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

Unified Diff: runtime/vm/flow_graph_compiler_x64.cc

Issue 10882055: Put live register bits in stackmaps. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Handle XMM registers in stackmaps. Created 8 years, 4 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 side-by-side diff with in-line comments
Download patch
Index: runtime/vm/flow_graph_compiler_x64.cc
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 0c11ba1dabf24abf9b4ffc7a177bf571246e8cf2..91dc2c44acd1710445c7ef4da6c739474d6be50c 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -804,7 +804,8 @@ void FlowGraphCompiler::CopyParameters() {
}
if (is_optimizing()) {
stackmap_table_builder_->AddEntry(assembler()->CodeSize(),
- empty_stack_bitmap);
+ empty_stack_bitmap,
+ 0);
}
if (FLAG_trace_functions) {
@@ -819,7 +820,8 @@ void FlowGraphCompiler::CopyParameters() {
CatchClauseNode::kInvalidTryIndex);
if (is_optimizing()) {
stackmap_table_builder_->AddEntry(assembler()->CodeSize(),
- empty_stack_bitmap);
+ empty_stack_bitmap,
+ 0);
}
__ popq(RAX); // Remove argument.
__ popq(RAX); // Restore result.
@@ -1122,18 +1124,18 @@ void FlowGraphCompiler::LoadDoubleOrSmiToXmm(XmmRegister result,
void FlowGraphCompiler::SaveLiveRegisters(LocationSummary* locs) {
// TODO(vegorov): consider saving only caller save (volatile) registers.
- const intptr_t xmm_regs_count = locs->live_registers()->xmm_regs_count();
+ intptr_t xmm_regs_count = locs->live_registers()->xmm_regs_count();
if (xmm_regs_count > 0) {
- // Pointer maps don't support pushed untagged values so we reserve spill
- // slots at the top of the spill slot area for live XMM registers.
- intptr_t stack_offs = (StackSize() + 1) * kWordSize;
+ __ subq(RSP, Immediate(xmm_regs_count * kDoubleSize));
+ intptr_t offset = 0;
for (intptr_t reg_idx = 0; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
if (locs->live_registers()->ContainsXmmRegister(xmm_reg)) {
- __ movsd(Address(RBP, -stack_offs), xmm_reg);
- stack_offs += kDoubleSize;
+ __ movsd(Address(RSP, offset), xmm_reg);
+ offset += kDoubleSize;
}
}
+ ASSERT(offset == (xmm_regs_count * kDoubleSize));
}
for (intptr_t reg_idx = 0; reg_idx < kNumberOfCpuRegisters; ++reg_idx) {
@@ -1155,16 +1157,16 @@ void FlowGraphCompiler::RestoreLiveRegisters(LocationSummary* locs) {
const intptr_t xmm_regs_count = locs->live_registers()->xmm_regs_count();
if (xmm_regs_count > 0) {
- // Pointer maps don't support pushed untagged values so we reserve spill
- // slots at the top of the spill slot area for live XMM registers.
- intptr_t stack_offs = (StackSize() + 1) * kWordSize;
+ intptr_t offset = 0;
for (intptr_t reg_idx = 0; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
if (locs->live_registers()->ContainsXmmRegister(xmm_reg)) {
- __ movsd(xmm_reg, Address(RBP, -stack_offs));
- stack_offs += kDoubleSize;
+ __ movsd(xmm_reg, Address(RSP, offset));
+ offset += kDoubleSize;
}
}
+ ASSERT(offset == (xmm_regs_count * kDoubleSize));
+ __ addq(RSP, Immediate(offset));
}
}

Powered by Google App Engine
This is Rietveld 408576698