mirror of
https://github.com/openjdk/jdk.git
synced 2026-03-19 20:33:16 +00:00
8165673: AArch64: Fix JNI floating point argument handling
Reviewed-by: aph, adinn
This commit is contained in:
parent
ec43099478
commit
d3ef4d9c33
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@ -130,8 +130,8 @@ void InterpreterRuntime::SignatureHandlerGenerator::pass_float() {
|
||||
if (_num_fp_args < Argument::n_float_register_parameters_c) {
|
||||
__ ldrs(as_FloatRegister(_num_fp_args++), src);
|
||||
} else {
|
||||
__ ldrh(r0, src);
|
||||
__ strh(r0, Address(to(), _stack_offset));
|
||||
__ ldrw(r0, src);
|
||||
__ strw(r0, Address(to(), _stack_offset));
|
||||
_stack_offset += wordSize;
|
||||
_num_fp_args++;
|
||||
}
|
||||
@ -349,7 +349,7 @@ class SlowSignatureHandler
|
||||
_num_fp_args++;
|
||||
} else {
|
||||
*_to++ = from_obj;
|
||||
_num_int_args++;
|
||||
_num_fp_args++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -364,7 +364,7 @@ class SlowSignatureHandler
|
||||
_num_fp_args++;
|
||||
} else {
|
||||
*_to++ = from_obj;
|
||||
_num_int_args++;
|
||||
_num_fp_args++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -989,7 +989,16 @@ static void object_move(MacroAssembler* masm,
|
||||
|
||||
// A float arg may have to do float reg int reg conversion
|
||||
static void float_move(MacroAssembler* masm, VMRegPair src, VMRegPair dst) {
|
||||
if (src.first() != dst.first()) {
|
||||
assert(src.first()->is_stack() && dst.first()->is_stack() ||
|
||||
src.first()->is_reg() && dst.first()->is_reg(), "Unexpected error");
|
||||
if (src.first()->is_stack()) {
|
||||
if (dst.first()->is_stack()) {
|
||||
__ ldrw(rscratch1, Address(rfp, reg2offset_in(src.first())));
|
||||
__ strw(rscratch1, Address(sp, reg2offset_out(dst.first())));
|
||||
} else {
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
} else if (src.first() != dst.first()) {
|
||||
if (src.is_single_phys_reg() && dst.is_single_phys_reg())
|
||||
__ fmovs(dst.first()->as_FloatRegister(), src.first()->as_FloatRegister());
|
||||
else
|
||||
@ -1023,7 +1032,16 @@ static void long_move(MacroAssembler* masm, VMRegPair src, VMRegPair dst) {
|
||||
|
||||
// A double move
|
||||
static void double_move(MacroAssembler* masm, VMRegPair src, VMRegPair dst) {
|
||||
if (src.first() != dst.first()) {
|
||||
assert(src.first()->is_stack() && dst.first()->is_stack() ||
|
||||
src.first()->is_reg() && dst.first()->is_reg(), "Unexpected error");
|
||||
if (src.first()->is_stack()) {
|
||||
if (dst.first()->is_stack()) {
|
||||
__ ldr(rscratch1, Address(rfp, reg2offset_in(src.first())));
|
||||
__ str(rscratch1, Address(sp, reg2offset_out(dst.first())));
|
||||
} else {
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
} else if (src.first() != dst.first()) {
|
||||
if (src.is_single_phys_reg() && dst.is_single_phys_reg())
|
||||
__ fmovd(dst.first()->as_FloatRegister(), src.first()->as_FloatRegister());
|
||||
else
|
||||
|
||||
@ -1,64 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2015 SAP SE. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/* @test
|
||||
* @bug 8139258
|
||||
* @summary Regression test for 8139258 which failed to properly pass float args
|
||||
* to a jni function on ppc64le.
|
||||
*
|
||||
* @run main/othervm/native -Xint compiler.floatingpoint.Test15FloatJNIArgs
|
||||
* @run main/othervm/native -XX:+TieredCompilation -Xcomp compiler.floatingpoint.Test15FloatJNIArgs
|
||||
* @run main/othervm/native -XX:-TieredCompilation -Xcomp compiler.floatingpoint.Test15FloatJNIArgs
|
||||
*/
|
||||
|
||||
package compiler.floatingpoint;
|
||||
|
||||
public class Test15FloatJNIArgs {
|
||||
static {
|
||||
try {
|
||||
System.loadLibrary("Test15FloatJNIArgs");
|
||||
} catch (UnsatisfiedLinkError e) {
|
||||
System.out.println("could not load native lib: " + e);
|
||||
}
|
||||
}
|
||||
|
||||
public static native float add15floats(
|
||||
float f1, float f2, float f3, float f4,
|
||||
float f5, float f6, float f7, float f8,
|
||||
float f9, float f10, float f11, float f12,
|
||||
float f13, float f14, float f15);
|
||||
|
||||
static void test() throws Exception {
|
||||
float sum = Test15FloatJNIArgs.add15floats(1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
|
||||
1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
|
||||
if (sum != 15.0f) {
|
||||
throw new Error("Passed 15 times 1.0f to jni function which didn't add them properly: " + sum);
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
for (int i = 0; i < 200; ++i) {
|
||||
test();
|
||||
}
|
||||
}
|
||||
}
|
||||
98
hotspot/test/compiler/floatingpoint/TestFloatJNIArgs.java
Normal file
98
hotspot/test/compiler/floatingpoint/TestFloatJNIArgs.java
Normal file
@ -0,0 +1,98 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2016 SAP SE. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/* @test
|
||||
* @bug 8139258 8165673
|
||||
* @summary Regression test for passing float args to a jni function.
|
||||
*
|
||||
*
|
||||
* @run main/othervm/native -Xint compiler.floatingpoint.TestFloatJNIArgs
|
||||
* @run main/othervm/native -XX:+TieredCompilation -Xcomp compiler.floatingpoint.TestFloatJNIArgs
|
||||
* @run main/othervm/native -XX:-TieredCompilation -Xcomp compiler.floatingpoint.TestFloatJNIArgs
|
||||
*/
|
||||
|
||||
package compiler.floatingpoint;
|
||||
|
||||
public class TestFloatJNIArgs {
|
||||
static {
|
||||
try {
|
||||
System.loadLibrary("TestFloatJNIArgs");
|
||||
} catch (UnsatisfiedLinkError e) {
|
||||
System.out.println("could not load native lib: " + e);
|
||||
}
|
||||
}
|
||||
|
||||
public static native float add15floats(
|
||||
float f1, float f2, float f3, float f4,
|
||||
float f5, float f6, float f7, float f8,
|
||||
float f9, float f10, float f11, float f12,
|
||||
float f13, float f14, float f15);
|
||||
|
||||
public static native float add10floats(
|
||||
float f1, float f2, float f3, float f4,
|
||||
float f5, float f6, float f7, float f8,
|
||||
float f9, float f10);
|
||||
|
||||
public static native float addFloatsInts(
|
||||
float f1, float f2, float f3, float f4,
|
||||
float f5, float f6, float f7, float f8,
|
||||
float f9, float f10, float f11, float f12,
|
||||
float f13, float f14, float f15, int a16, int a17);
|
||||
|
||||
public static native double add15doubles(
|
||||
double d1, double d2, double d3, double d4,
|
||||
double d5, double d6, double d7, double d8,
|
||||
double d9, double d10, double d11, double d12,
|
||||
double d13, double d14, double d15);
|
||||
|
||||
static void test() throws Exception {
|
||||
float sum = TestFloatJNIArgs.add15floats(1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
|
||||
1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
|
||||
if (sum != 15.0f) {
|
||||
throw new Error("Passed 15 times 1.0f to jni function which didn't add them properly: " + sum);
|
||||
}
|
||||
|
||||
float sum1 = TestFloatJNIArgs.add10floats(1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f);
|
||||
if (sum1 != 10.0f) {
|
||||
throw new Error("Passed 10 times 1.0f to jni function which didn't add them properly: " + sum1);
|
||||
}
|
||||
|
||||
float sum2 = TestFloatJNIArgs.addFloatsInts(1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
|
||||
1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1, 1);
|
||||
if (sum2 != 17.0f) {
|
||||
throw new Error("Passed 17 times 1 to jni function which didn't add them properly: " + sum2);
|
||||
}
|
||||
|
||||
double dsum = TestFloatJNIArgs.add15doubles(1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0,
|
||||
1.0, 1.0, 1.0, 1.0, 1.0, 1.0);
|
||||
if (dsum != 15.0) {
|
||||
throw new Error("Passed 15 times 1.0 to jni function which didn't add them properly: " + dsum);
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
for (int i = 0; i < 200; ++i) {
|
||||
test();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015. All rights reserved.
|
||||
* Copyright (c) 2015, 2016. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -27,7 +27,7 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
JNIEXPORT jfloat JNICALL Java_compiler_floatingpoint_Test15FloatJNIArgs_add15floats
|
||||
JNIEXPORT jfloat JNICALL Java_compiler_floatingpoint_TestFloatJNIArgs_add15floats
|
||||
(JNIEnv *env, jclass cls,
|
||||
jfloat f1, jfloat f2, jfloat f3, jfloat f4,
|
||||
jfloat f5, jfloat f6, jfloat f7, jfloat f8,
|
||||
@ -36,6 +36,33 @@ JNIEXPORT jfloat JNICALL Java_compiler_floatingpoint_Test15FloatJNIArgs_add15flo
|
||||
return f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8 + f9 + f10 + f11 + f12 + f13 + f14 + f15;
|
||||
}
|
||||
|
||||
JNIEXPORT jfloat JNICALL Java_compiler_floatingpoint_TestFloatJNIArgs_add10floats
|
||||
(JNIEnv *env, jclass cls,
|
||||
jfloat f1, jfloat f2, jfloat f3, jfloat f4,
|
||||
jfloat f5, jfloat f6, jfloat f7, jfloat f8,
|
||||
jfloat f9, jfloat f10) {
|
||||
return f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8 + f9 + f10;
|
||||
}
|
||||
|
||||
JNIEXPORT jfloat JNICALL Java_compiler_floatingpoint_TestFloatJNIArgs_addFloatsInts
|
||||
(JNIEnv *env, jclass cls,
|
||||
jfloat f1, jfloat f2, jfloat f3, jfloat f4,
|
||||
jfloat f5, jfloat f6, jfloat f7, jfloat f8,
|
||||
jfloat f9, jfloat f10, jfloat f11, jfloat f12,
|
||||
jfloat f13, jfloat f14, jfloat f15, jint a16, jint a17) {
|
||||
return f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8 + f9 + f10 + f11 + f12 + f13 + f14 + f15 + a16 + a17;
|
||||
}
|
||||
|
||||
JNIEXPORT jdouble JNICALL Java_compiler_floatingpoint_TestFloatJNIArgs_add15doubles
|
||||
(JNIEnv *env, jclass cls,
|
||||
jdouble f1, jdouble f2, jdouble f3, jdouble f4,
|
||||
jdouble f5, jdouble f6, jdouble f7, jdouble f8,
|
||||
jdouble f9, jdouble f10, jdouble f11, jdouble f12,
|
||||
jdouble f13, jdouble f14, jdouble f15) {
|
||||
return f1 + f2 + f3 + f4 + f5 + f6 + f7 + f8 + f9 + f10 + f11 + f12 + f13 + f14 + f15;
|
||||
}
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
Loading…
x
Reference in New Issue
Block a user