Optimizing: Introduce {Increase,Decrease}Frame().
And use it to clean up code generators.
Also fix CFI in MaybeIncrementHotness() for arm/arm64/x86.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Test: testrunner.py --host --debuggable --ndebuggable \
--optimizing --jit --jit-on-first-use -t 178
Test: aosp_cf_x86_phone-userdebug boots.
Test: aosp_cf_x86_phone-userdebug/jitzygote boots.
Test: # On blueline:
testrunner.py --target --debuggable --ndebuggable \
--optimizing --jit --jit-on-first-use -t 178
Bug: 112189621
Change-Id: I524e6c3054ffe1b05e2860fd7988cd9995df2963
diff --git a/compiler/optimizing/code_generator_x86_64.cc b/compiler/optimizing/code_generator_x86_64.cc
index 4a0cc78..2df2d16 100644
--- a/compiler/optimizing/code_generator_x86_64.cc
+++ b/compiler/optimizing/code_generator_x86_64.cc
@@ -1046,16 +1046,10 @@
RecordPcInfo(invoke, invoke->GetDexPc(), slow_path);
break;
case HInvokeStaticOrDirect::CodePtrLocation::kCallCriticalNative: {
- HParallelMove parallel_move(GetGraph()->GetAllocator());
size_t out_frame_size =
PrepareCriticalNativeCall<CriticalNativeCallingConventionVisitorX86_64,
kNativeStackAlignment,
- GetCriticalNativeDirectCallFrameSize>(invoke, ¶llel_move);
- if (out_frame_size != 0u) {
- __ subq(CpuRegister(RSP), Immediate(out_frame_size));
- __ cfi().AdjustCFAOffset(out_frame_size);
- GetMoveResolver()->EmitNativeCode(¶llel_move);
- }
+ GetCriticalNativeDirectCallFrameSize>(invoke);
// (callee_method + offset_of_jni_entry_point)()
__ call(Address(callee_method.AsRegister<CpuRegister>(),
ArtMethod::EntryPointFromJniOffset(kX86_64PointerSize).SizeValue()));
@@ -1085,8 +1079,7 @@
break;
}
if (out_frame_size != 0u) {
- __ addq(CpuRegister(RSP), Immediate(out_frame_size));
- __ cfi().AdjustCFAOffset(-out_frame_size);
+ DecreaseFrame(out_frame_size);
}
break;
}
@@ -1477,8 +1470,7 @@
}
int adjust = GetFrameSize() - GetCoreSpillSize();
- __ subq(CpuRegister(RSP), Immediate(adjust));
- __ cfi().AdjustCFAOffset(adjust);
+ IncreaseFrame(adjust);
uint32_t xmm_spill_location = GetFpuSpillStart();
size_t xmm_spill_slot_size = GetCalleePreservedFPWidth();
@@ -1523,8 +1515,7 @@
}
int adjust = GetFrameSize() - GetCoreSpillSize();
- __ addq(CpuRegister(RSP), Immediate(adjust));
- __ cfi().AdjustCFAOffset(-adjust);
+ DecreaseFrame(adjust);
for (size_t i = 0; i < arraysize(kCoreCalleeSaves); ++i) {
Register reg = kCoreCalleeSaves[i];
@@ -2045,6 +2036,16 @@
// MaybeRecordNativeDebugInfo is already called implicitly in CodeGenerator::Compile.
}
+void CodeGeneratorX86_64::IncreaseFrame(size_t adjustment) {
+ __ subq(CpuRegister(RSP), Immediate(adjustment));
+ __ cfi().AdjustCFAOffset(adjustment);
+}
+
+void CodeGeneratorX86_64::DecreaseFrame(size_t adjustment) {
+ __ addq(CpuRegister(RSP), Immediate(adjustment));
+ __ cfi().AdjustCFAOffset(-adjustment);
+}
+
void CodeGeneratorX86_64::GenerateNop() {
__ nop();
}