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

Unified Diff: runtime/vm/flow_graph_compiler_ia32.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_ia32.cc
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 533385098524a410c8769fc086f87a1ee19b5efc..f27885f8ddb745c42c99c2042e3760e79e7c9745 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -798,7 +798,8 @@ void FlowGraphCompiler::CopyParameters() {
}
if (is_optimizing()) {
stackmap_table_builder_->AddEntry(assembler()->CodeSize(),
- empty_stack_bitmap);
+ empty_stack_bitmap,
+ 0); // No registers.
}
@@ -814,7 +815,8 @@ void FlowGraphCompiler::CopyParameters() {
CatchClauseNode::kInvalidTryIndex);
if (is_optimizing()) {
stackmap_table_builder_->AddEntry(assembler()->CodeSize(),
- empty_stack_bitmap);
+ empty_stack_bitmap,
+ 0); // No registers.
}
__ popl(EAX); // Remove argument.
__ popl(EAX); // Restore result.
@@ -1116,14 +1118,16 @@ 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();
if (xmm_regs_count > 0) {
- intptr_t stack_offs = (StackSize() + 1) * kWordSize;
+ __ subl(ESP, 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(EBP, -stack_offs), xmm_reg);
- stack_offs += kDoubleSize;
+ __ movsd(Address(ESP, offset), xmm_reg);
+ offset += kDoubleSize;
}
}
+ ASSERT(offset == (xmm_regs_count * kDoubleSize));
}
for (intptr_t reg_idx = 0; reg_idx < kNumberOfCpuRegisters; ++reg_idx) {
@@ -1145,14 +1149,16 @@ void FlowGraphCompiler::RestoreLiveRegisters(LocationSummary* locs) {
const intptr_t xmm_regs_count = locs->live_registers()->xmm_regs_count();
if (xmm_regs_count > 0) {
- 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(EBP, -stack_offs));
- stack_offs += kDoubleSize;
+ __ movsd(xmm_reg, Address(ESP, offset));
+ offset += kDoubleSize;
}
}
+ ASSERT(offset == (xmm_regs_count * kDoubleSize));
+ __ addl(ESP, Immediate(offset));
}
}

Powered by Google App Engine
This is Rietveld 408576698