summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Goran Jakovljevic <Goran.Jakovljevic@imgtec.com> 2016-09-09 17:53:01 +0200
committer Goran Jakovljevic <Goran.Jakovljevic@imgtec.com> 2016-09-09 17:53:48 +0200
commitfd0740a7dc1d93fc1fd37da23a9f346ebb03f95b (patch)
treec1dacdf16bbcd6cec04eb1b7a8bcaaafbade6c95
parent4b3acdb2e432d267b7c091ed4c15b0f46ec48bc0 (diff)
MIPS64: Sign-extend results in art_quick_get32_static/instance
Return types of artGet32StaticFromCode and artGet32InstanceFromCode are unsigned (size_t). On the other hand, managed code expects signed 32-bit values. This is problematic on MIPS64 which expects that all integer type variables are properly sign-extended in registers. This fixes test 529-checker-unresolved. Test: mma -j2 test-art-target in QEMU Change-Id: I70f53ded9bfa1cfd53bcc639fb4841192ee71b2b
-rw-r--r--runtime/arch/mips64/quick_entrypoints_mips64.S2
-rw-r--r--test/529-checker-unresolved/src/Main.java10
2 files changed, 12 insertions, 0 deletions
diff --git a/runtime/arch/mips64/quick_entrypoints_mips64.S b/runtime/arch/mips64/quick_entrypoints_mips64.S
index 0bf2a35bd4..26717ad798 100644
--- a/runtime/arch/mips64/quick_entrypoints_mips64.S
+++ b/runtime/arch/mips64/quick_entrypoints_mips64.S
@@ -1487,6 +1487,7 @@ ENTRY art_quick_get32_static
ld $a1, FRAME_SIZE_SAVE_REFS_ONLY($sp) # pass referrer's Method*
jal artGet32StaticFromCode # (uint32_t field_idx, const Method* referrer, Thread*)
move $a2, rSELF # pass Thread::Current
+ sll $v0, $v0, 0 # sign-extend result
RETURN_IF_NO_EXCEPTION
END art_quick_get32_static
@@ -1571,6 +1572,7 @@ ENTRY art_quick_get32_instance
ld $a2, FRAME_SIZE_SAVE_REFS_ONLY($sp) # pass referrer's Method*
jal artGet32InstanceFromCode # (field_idx, Object*, referrer, Thread*)
move $a3, rSELF # pass Thread::Current
+ sll $v0, $v0, 0 # sign-extend result
RETURN_IF_NO_EXCEPTION
END art_quick_get32_instance
diff --git a/test/529-checker-unresolved/src/Main.java b/test/529-checker-unresolved/src/Main.java
index 7b5cbc1504..5fd51e1dca 100644
--- a/test/529-checker-unresolved/src/Main.java
+++ b/test/529-checker-unresolved/src/Main.java
@@ -122,6 +122,16 @@ public class Main extends UnresolvedSuperClass {
expectEquals(123456789123456789f, c.instanceFloat);
expectEquals(123456789123456789d, c.instanceDouble);
expectEquals(o, c.instanceObject);
+
+ // Check "large" values.
+
+ c.instanceByte = (byte)-1;
+ c.instanceChar = (char)32768;
+ c.instanceInt = -1;
+
+ expectEquals((byte)-1, c.instanceByte);
+ expectEquals((char)32768, c.instanceChar);
+ expectEquals(-1, c.instanceInt);
}
/// CHECK-START: void Main.callUnresolvedNull(UnresolvedClass) register (before)