diff options
author | David Srbecky <dsrbecky@google.com> | 2015-04-12 09:27:43 +0100 |
---|---|---|
committer | David Srbecky <dsrbecky@google.com> | 2015-04-12 09:30:57 +0100 |
commit | c34dc9362b9ec624b3bdd97d36b6b2098814cd73 (patch) | |
tree | c2049b2dc19d318e3917b52ef66608b985d7ac69 /compiler/optimizing/code_generator_x86.cc | |
parent | 58565098b2298041ccc97371a3cc486df88d51b3 (diff) | |
download | art-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.cc | 38 |
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) { |