summaryrefslogtreecommitdiffstats
path: root/compiler/optimizing/code_generator_x86.cc
diff options
context:
space:
mode:
authorDavid Srbecky <dsrbecky@google.com>2015-04-12 09:27:43 +0100
committerDavid Srbecky <dsrbecky@google.com>2015-04-12 09:30:57 +0100
commitc34dc9362b9ec624b3bdd97d36b6b2098814cd73 (patch)
treec2049b2dc19d318e3917b52ef66608b985d7ac69 /compiler/optimizing/code_generator_x86.cc
parent58565098b2298041ccc97371a3cc486df88d51b3 (diff)
downloadart-c34dc9362b9ec624b3bdd97d36b6b2098814cd73.tar.gz
art-c34dc9362b9ec624b3bdd97d36b6b2098814cd73.tar.bz2
art-c34dc9362b9ec624b3bdd97d36b6b2098814cd73.zip
Move 'ret' instruction generation inside GenerateFrameExit.
Change-Id: I0c594d9a2356a006a5ce8dfd41d307cf7c3704ba
Diffstat (limited to 'compiler/optimizing/code_generator_x86.cc')
-rw-r--r--compiler/optimizing/code_generator_x86.cc38
1 files changed, 16 insertions, 22 deletions
diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc
index 48445d79da..637064d101 100644
--- a/compiler/optimizing/code_generator_x86.cc
+++ b/compiler/optimizing/code_generator_x86.cc
@@ -496,22 +496,24 @@ void CodeGeneratorX86::GenerateFrameEntry() {
}
void CodeGeneratorX86::GenerateFrameExit() {
- if (HasEmptyFrame()) {
- return;
- }
-
- int adjust = GetFrameSize() - FrameEntrySpillSize();
- __ addl(ESP, Immediate(adjust));
- __ cfi().AdjustCFAOffset(-adjust);
-
- for (size_t i = 0; i < arraysize(kCoreCalleeSaves); ++i) {
- Register reg = kCoreCalleeSaves[i];
- if (allocated_registers_.ContainsCoreRegister(reg)) {
- __ popl(reg);
- __ cfi().AdjustCFAOffset(-static_cast<int>(kX86WordSize));
- __ cfi().Restore(DWARFReg(reg));
+ __ cfi().RememberState();
+ if (!HasEmptyFrame()) {
+ int adjust = GetFrameSize() - FrameEntrySpillSize();
+ __ addl(ESP, Immediate(adjust));
+ __ cfi().AdjustCFAOffset(-adjust);
+
+ for (size_t i = 0; i < arraysize(kCoreCalleeSaves); ++i) {
+ Register reg = kCoreCalleeSaves[i];
+ if (allocated_registers_.ContainsCoreRegister(reg)) {
+ __ popl(reg);
+ __ cfi().AdjustCFAOffset(-static_cast<int>(kX86WordSize));
+ __ cfi().Restore(DWARFReg(reg));
+ }
}
}
+ __ ret();
+ __ cfi().RestoreState();
+ __ cfi().DefCFAOffset(GetFrameSize());
}
void CodeGeneratorX86::Bind(HBasicBlock* block) {
@@ -1116,11 +1118,7 @@ void LocationsBuilderX86::VisitReturnVoid(HReturnVoid* ret) {
void InstructionCodeGeneratorX86::VisitReturnVoid(HReturnVoid* ret) {
UNUSED(ret);
- __ cfi().RememberState();
codegen_->GenerateFrameExit();
- __ ret();
- __ cfi().RestoreState();
- __ cfi().DefCFAOffset(codegen_->GetFrameSize());
}
void LocationsBuilderX86::VisitReturn(HReturn* ret) {
@@ -1178,11 +1176,7 @@ void InstructionCodeGeneratorX86::VisitReturn(HReturn* ret) {
LOG(FATAL) << "Unknown return type " << ret->InputAt(0)->GetType();
}
}
- __ cfi().RememberState();
codegen_->GenerateFrameExit();
- __ ret();
- __ cfi().RestoreState();
- __ cfi().DefCFAOffset(codegen_->GetFrameSize());
}
void LocationsBuilderX86::VisitInvokeStaticOrDirect(HInvokeStaticOrDirect* invoke) {