diff options
author | Roland Levillain <rpl@google.com> | 2016-07-20 11:32:19 +0100 |
---|---|---|
committer | Roland Levillain <rpl@google.com> | 2016-07-21 11:21:20 +0100 |
commit | 4359e61927866c254bc2d701e3ea4c48de10b79c (patch) | |
tree | 05d274ecd6b5ff6eb890f64cd3bb670c7170bf15 /compiler/optimizing/code_generator_arm.cc | |
parent | 2be946bbf995496fe56364d9b7c4957fcb6aeec5 (diff) |
Move caller-saves saving/restoring to ReadBarrierMarkRegX.
Instead of saving/restoring live caller-save registers
before/after the call to read barrier mark entry points
ReadBarrierMarkRegX, have these entry points save/restore
all the caller-save registers themselves (except register
rX, which contains the return value).
Also refactor the assembly code of these entry points
using macros.
* Boot image code size variation on Nexus 5X
(aosp_bullhead-userdebug build):
- total ARM64 framework Oat files size change:
119196792 bytes -> 115575920 bytes (-3.04%)
- total ARM framework Oat files size change:
100435212 bytes -> 97621188 bytes (-2.80%)
* Benchmarks (ARM64) score variations on Nexus 5X
(aosp_bullhead-userdebug build):
- RitzPerf (lower is better)
- average score difference: -2.71%
- CaffeineMark (higher is better)
- no real difference for most tests
(absolute variation lower than 1%)
- better score on the "Method" benchmark:
score variation 41253 -> 44891 (+8.82%)
Test: ART host and target (ARM, ARM64) tests.
Bug: 29506760
Bug: 12687968
Change-Id: I881bf73139a3f1c2bee9ffc6fc8c00f9a392afa6
Diffstat (limited to 'compiler/optimizing/code_generator_arm.cc')
-rw-r--r-- | compiler/optimizing/code_generator_arm.cc | 10 |
1 files changed, 3 insertions, 7 deletions
diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc index 1aa7b5404c..474e9d540a 100644 --- a/compiler/optimizing/code_generator_arm.cc +++ b/compiler/optimizing/code_generator_arm.cc @@ -437,11 +437,9 @@ class ReadBarrierMarkSlowPathARM : public SlowPathCode { << instruction_->DebugName(); __ Bind(GetEntryLabel()); - // Save live registers before the runtime call, and in particular - // R0 (if it is live), as it is clobbered by functions - // art_quick_read_barrier_mark_regX. - SaveLiveRegisters(codegen, locations); - + // No need to save live registers; it's taken care of by the + // entrypoint. Also, there is no need to update the stack mask, + // as this runtime call will not trigger a garbage collection. InvokeRuntimeCallingConvention calling_convention; CodeGeneratorARM* arm_codegen = down_cast<CodeGeneratorARM*>(codegen); DCHECK_NE(reg, SP); @@ -469,8 +467,6 @@ class ReadBarrierMarkSlowPathARM : public SlowPathCode { instruction_, instruction_->GetDexPc(), this); - - RestoreLiveRegisters(codegen, locations); __ b(GetExitLabel()); } |