[PATCH] Bug fix in TemplateTable::iop2 (JDK9 aarch32)
Xiang Yuan
xiang.yuan at linaro.org
Tue Dec 29 13:21:17 UTC 2015
Hi, All:
Our team fix a bug in JDK9 aarch32 template interpreter, the detail is
described below:
*Test Case:*
/***************code start***************/
public class Iop2 {
public static void main(String args[]) {
int shift_bits = 36; //0x24, 0b00100100
int data = 0x87654321;
System.out.println(Integer.toHexString(data <<
shift_bits));
System.out.println(Integer.toHexString(data >>
shift_bits));
System.out.println(Integer.toHexString(data >>>
shift_bits));
}
}
/***************code end****************/
The result of Openjdk9(aarch32):
0
ffffffff
0
The correct result:
76543210
f8765432
8765432
*Bug Description:*
This test case uses Java bytecodes ishl, ishr and iushr. To interpret
them, aarch32 instructions lsl, asr and lsr are used directly in the
procedure “void TemplateTable::iop2(Operation op) in
./hotspot/src/cpu/aarch32/vm/templateTable_aarch32.cpp”.
/***************code start***************/
case shl : __ lsl(r0, r1, r0); break;
case shr : __ asr(r0, r1, r0); break;
case ushr : __ lsr(r0, r1, r0); break;
/***************code end****************/
The r1 is the int value need to be shifted, and the r0 is the shift
bits.
The JVM Specification requires that for these 3 bytecodes, they pop two
int values from the expression stack as value2 and value1, and then they
shift value1 by the low 5 bits of value2. However, these aarch32
instructions shift
value1 by the low 8 bits of value2. And the semantics of aarch32
instructions don’t match the Java bytecodes. And therefore, using aarch32
instruction to interpret these Java bytecodes directly will get a wrong
result.
*Bug Solution:*
Clear the high 27 bits of value2 before shifting can fix this bug.
/***************code start***************/
case shl : __ andr(r0, r0, 31); __ lsl(r0, r1, r0); break;
case shr : __ andr(r0, r0, 31); __ asr(r0, r1, r0); break;
case ushr : __ andr(r0, r0, 31); __ lsr(r0, r1, r0); break;
/***************code end****************/
*Bug Patch:*
/***************patch start***************/
--- a/src/cpu/aarch32/vm/templateTable_aarch32.cpp Wed Dec 23 12:21:32 2015
+0000
+++ b/src/cpu/aarch32/vm/templateTable_aarch32.cpp Mon Dec 28
17:12:30 2015 +0800
@@ -1275,9 +1275,9 @@
case _and : __ andr(r0, r1, r0); break;
case _or : __ orr(r0, r1, r0); break;
case _xor : __ eor(r0, r1, r0); break;
- case shl : __ lsl(r0, r1, r0); break;
- case shr : __ asr(r0, r1, r0); break;
- case ushr : __ lsr(r0, r1, r0); break;
+ case shl : __ andr(r0, r0, 31); __ lsl(r0, r1, r0); break;
+ case shr : __ andr(r0, r0, 31); __ asr(r0, r1, r0); break;
+ case ushr : __ andr(r0, r0, 31); __ lsr(r0, r1, r0); break;
default : ShouldNotReachHere();
}
}
/***************patch end****************/
And the attachment are the test case and patch.
Best regards!
-------------- next part --------------
--- a/src/cpu/aarch32/vm/templateTable_aarch32.cpp Wed Dec 23 12:21:32 2015 +0000
+++ b/src/cpu/aarch32/vm/templateTable_aarch32.cpp Tue Dec 29 18:50:42 2015 +0800
@@ -1275,9 +1275,9 @@
case _and : __ andr(r0, r1, r0); break;
case _or : __ orr(r0, r1, r0); break;
case _xor : __ eor(r0, r1, r0); break;
- case shl : __ lsl(r0, r1, r0); break;
- case shr : __ asr(r0, r1, r0); break;
- case ushr : __ lsr(r0, r1, r0); break;
+ case shl : __ andr(r0, r0, 31); __ lsl(r0, r1, r0); break;
+ case shr : __ andr(r0, r0, 31); __ asr(r0, r1, r0); break;
+ case ushr : __ andr(r0, r0, 31); __ lsr(r0, r1, r0); break;
default : ShouldNotReachHere();
}
}
More information about the aarch32-port-dev
mailing list