summaryrefslogtreecommitdiffstats
path: root/compiler/jni
diff options
context:
space:
mode:
authorNicolas Geoffray <ngeoffray@google.com>2015-01-12 14:10:24 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2015-01-12 14:10:24 +0000
commit603104b5b5c3759b0bc2733bda2f972686a775a3 (patch)
tree6c4ec2cef8fd0caf45712191bcbc5d72ed0d318b /compiler/jni
parent11adb76fbc2dc3d8cbb6665945ff5d6733e2a8e6 (diff)
parent425f239c291d435f519a1cf4bdd9ccc9a2c0c070 (diff)
downloadandroid_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.cc6
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);
}