diff options
author | Nicolas Geoffray <ngeoffray@google.com> | 2015-01-12 14:10:24 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-01-12 14:10:24 +0000 |
commit | 603104b5b5c3759b0bc2733bda2f972686a775a3 (patch) | |
tree | 6c4ec2cef8fd0caf45712191bcbc5d72ed0d318b /compiler/jni | |
parent | 11adb76fbc2dc3d8cbb6665945ff5d6733e2a8e6 (diff) | |
parent | 425f239c291d435f519a1cf4bdd9ccc9a2c0c070 (diff) | |
download | android_art-603104b5b5c3759b0bc2733bda2f972686a775a3.tar.gz android_art-603104b5b5c3759b0bc2733bda2f972686a775a3.tar.bz2 android_art-603104b5b5c3759b0bc2733bda2f972686a775a3.zip |
Merge "Fix handling of long argument spanning register/memory."
Diffstat (limited to 'compiler/jni')
-rw-r--r-- | compiler/jni/quick/arm/calling_convention_arm.cc | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/compiler/jni/quick/arm/calling_convention_arm.cc b/compiler/jni/quick/arm/calling_convention_arm.cc index a3323e133a..fd207150f7 100644 --- a/compiler/jni/quick/arm/calling_convention_arm.cc +++ b/compiler/jni/quick/arm/calling_convention_arm.cc @@ -168,9 +168,13 @@ const ManagedRegisterEntrySpills& ArmManagedRuntimeCallingConvention::EntrySpill } else { // FIXME: Pointer this returns as both reference and long. if (IsCurrentParamALong() && !IsCurrentParamAReference()) { // Long. - if (gpr_index < arraysize(kHFCoreArgumentRegisters)) { + // If it spans register and memory, we must use the value in memory. + if (gpr_index < arraysize(kHFCoreArgumentRegisters) - 1) { entry_spills_.push_back( ArmManagedRegister::FromCoreRegister(kHFCoreArgumentRegisters[gpr_index++])); + } else if (gpr_index == arraysize(kHFCoreArgumentRegisters) - 1) { + gpr_index++; + entry_spills_.push_back(ManagedRegister::NoRegister(), 4); } else { entry_spills_.push_back(ManagedRegister::NoRegister(), 4); } |