diff options
author | Mark Mendell <mark.p.mendell@intel.com> | 2015-01-19 14:09:22 -0500 |
---|---|---|
committer | Mark P Mendell <mark.p.mendell@intel.com> | 2015-01-30 13:17:23 +0000 |
commit | 3e6a3bf797e49b7f449256455c7e522e888687d8 (patch) | |
tree | 1e574169ff7743729cdfb1b9cf3b217f198a330d /runtime/entrypoints/quick | |
parent | 9544368685b4aa65e746332e602491a3e8e5b247 (diff) | |
download | art-3e6a3bf797e49b7f449256455c7e522e888687d8.zip art-3e6a3bf797e49b7f449256455c7e522e888687d8.tar.gz art-3e6a3bf797e49b7f449256455c7e522e888687d8.tar.bz2 |
ART: Change x86 long param ABI (Quick/JNI/Opt)
Ensure that we don't pass a long parameter across the last register
and the stack: skip the register and allocate it only on the stack.
This was requested to simplify the optimizing compiler code
generation for x86.
Optimizing (Baseline) compiler support for x86 longs:
- Remove QuickParameter from Location, as there are no longer any uses
of it.
Bump oat.h version because we changed an ABI again.
I changed IsParamALong() to return false for argument 0 (this argument).
I am not sure why it differed from all other tests.
I have not tested on ARM. I followed Nicolas's suggestions for setting
the value of kSplitPairAcrossRegisterAndStack for different
architectures.
Change-Id: I2f16b33c1dac58dd4f4f503e9c2309d845f5fb7a
Signed-off-by: Mark Mendell <mark.p.mendell@intel.com>
Diffstat (limited to 'runtime/entrypoints/quick')
-rw-r--r-- | runtime/entrypoints/quick/quick_trampoline_entrypoints.cc | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc b/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc index a67ebca..98f1684 100644 --- a/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc +++ b/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc @@ -59,6 +59,7 @@ class QuickArgumentVisitor { // | S0 | // | | 4x2 bytes padding // | Method* | <- sp + static constexpr bool kSplitPairAcrossRegisterAndStack = kArm32QuickCodeUseSoftFloat; static constexpr bool kAlignPairRegister = !kArm32QuickCodeUseSoftFloat; static constexpr bool kQuickSoftFloatAbi = kArm32QuickCodeUseSoftFloat; static constexpr bool kQuickDoubleRegAlignedFloatBackFilled = !kArm32QuickCodeUseSoftFloat; @@ -95,6 +96,7 @@ class QuickArgumentVisitor { // | D0 | // | | padding // | Method* | <- sp + static constexpr bool kSplitPairAcrossRegisterAndStack = false; static constexpr bool kAlignPairRegister = false; static constexpr bool kQuickSoftFloatAbi = false; // This is a hard float ABI. static constexpr bool kQuickDoubleRegAlignedFloatBackFilled = false; @@ -125,6 +127,7 @@ class QuickArgumentVisitor { // | A2 | arg2 // | A1 | arg1 // | A0/Method* | <- sp + static constexpr bool kSplitPairAcrossRegisterAndStack = true; static constexpr bool kAlignPairRegister = false; static constexpr bool kQuickSoftFloatAbi = true; // This is a soft float ABI. static constexpr bool kQuickDoubleRegAlignedFloatBackFilled = false; @@ -203,6 +206,7 @@ class QuickArgumentVisitor { // | XMM1 | float arg 2 // | XMM0 | float arg 1 // | EAX/Method* | <- sp + static constexpr bool kSplitPairAcrossRegisterAndStack = false; static constexpr bool kAlignPairRegister = false; static constexpr bool kQuickSoftFloatAbi = false; // This is a hard float ABI. static constexpr bool kQuickDoubleRegAlignedFloatBackFilled = false; @@ -243,6 +247,7 @@ class QuickArgumentVisitor { // | XMM0 | float arg 1 // | Padding | // | RDI/Method* | <- sp + static constexpr bool kSplitPairAcrossRegisterAndStack = false; static constexpr bool kAlignPairRegister = false; static constexpr bool kQuickSoftFloatAbi = false; // This is a hard float ABI. static constexpr bool kQuickDoubleRegAlignedFloatBackFilled = false; @@ -452,6 +457,11 @@ class QuickArgumentVisitor { } is_split_long_or_double_ = (GetBytesPerGprSpillLocation(kRuntimeISA) == 4) && ((gpr_index_ + 1) == kNumQuickGprArgs); + if (!kSplitPairAcrossRegisterAndStack && is_split_long_or_double_) { + // We don't want to split this. Pass over this register. + gpr_index_++; + is_split_long_or_double_ = false; + } Visit(); if (kBytesStackArgLocation == 4) { stack_index_+= 2; |