diff options
| author | 2017-03-15 16:41:31 +0000 | |
|---|---|---|
| committer | 2017-03-16 11:12:56 +0000 | |
| commit | 13a797bc53596af3d68eeb9721a8d76c23710ce9 (patch) | |
| tree | b2d2b68a1a60215c7e10ac0821c1c761cebda787 /test | |
| parent | 0a1f0798176250853c1fb83f00a436a183d2bfc1 (diff) | |
vixl32: do not use D14 as a temporary.
D14 is a callee-save register, which means we would need to
save it in the prologue, but at the point we're using it
the prologue has already been generated.
bug: 35977033
test: m ART_USE_VIXL_ARM_BACKEND=true test-art-target
Change-Id: Id7340ad9e87a9e527ce0989f45aae0b3a0963206
Diffstat (limited to 'test')
| -rw-r--r-- | test/642-fp-callees/expected.txt | 2 | ||||
| -rw-r--r-- | test/642-fp-callees/fp_callees.cc | 71 | ||||
| -rw-r--r-- | test/642-fp-callees/info.txt | 2 | ||||
| -rw-r--r-- | test/642-fp-callees/src/Main.java | 34 | ||||
| -rw-r--r-- | test/Android.bp | 1 |
5 files changed, 110 insertions, 0 deletions
diff --git a/test/642-fp-callees/expected.txt b/test/642-fp-callees/expected.txt new file mode 100644 index 0000000000..77a1486479 --- /dev/null +++ b/test/642-fp-callees/expected.txt @@ -0,0 +1,2 @@ +JNI_OnLoad called +Done diff --git a/test/642-fp-callees/fp_callees.cc b/test/642-fp-callees/fp_callees.cc new file mode 100644 index 0000000000..600f9690eb --- /dev/null +++ b/test/642-fp-callees/fp_callees.cc @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "base/casts.h" +#include "base/logging.h" +#include "jni.h" + +namespace art { + +// Make the array volatile, which is apparently making the C compiler +// use FP registers in the method below. +volatile double array[] = { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0 }; + +extern "C" JNIEXPORT void JNICALL Java_Main_holdFpTemporaries(JNIEnv* env, jclass cls) { + jmethodID mid = env->GetStaticMethodID(cls, "caller", "(IIJ)V"); + CHECK(mid != nullptr); + // Load values from the arrays, which will be loaded in callee-save FP registers. + double a = array[0]; + double b = array[1]; + double c = array[2]; + double d = array[3]; + double e = array[4]; + double f = array[5]; + double g = array[6]; + double h = array[7]; + double i = array[8]; + double j = array[9]; + double k = array[10]; + double l = array[11]; + env->CallStaticVoidMethod(cls, mid, 1, 1, 1L); + // Load it in a temporary to please C compiler with bit_cast. + double temp = array[0]; + CHECK_EQ(bit_cast<int64_t>(a), bit_cast<int64_t>(temp)); + temp = array[1]; + CHECK_EQ(bit_cast<int64_t>(b), bit_cast<int64_t>(temp)); + temp = array[2]; + CHECK_EQ(bit_cast<int64_t>(c), bit_cast<int64_t>(temp)); + temp = array[3]; + CHECK_EQ(bit_cast<int64_t>(d), bit_cast<int64_t>(temp)); + temp = array[4]; + CHECK_EQ(bit_cast<int64_t>(e), bit_cast<int64_t>(temp)); + temp = array[5]; + CHECK_EQ(bit_cast<int64_t>(f), bit_cast<int64_t>(temp)); + temp = array[6]; + CHECK_EQ(bit_cast<int64_t>(g), bit_cast<int64_t>(temp)); + temp = array[7]; + CHECK_EQ(bit_cast<int64_t>(h), bit_cast<int64_t>(temp)); + temp = array[8]; + CHECK_EQ(bit_cast<int64_t>(i), bit_cast<int64_t>(temp)); + temp = array[9]; + CHECK_EQ(bit_cast<int64_t>(j), bit_cast<int64_t>(temp)); + temp = array[10]; + CHECK_EQ(bit_cast<int64_t>(k), bit_cast<int64_t>(temp)); + temp = array[11]; + CHECK_EQ(bit_cast<int64_t>(l), bit_cast<int64_t>(temp)); +} + +} // namespace art diff --git a/test/642-fp-callees/info.txt b/test/642-fp-callees/info.txt new file mode 100644 index 0000000000..d3e4bdac50 --- /dev/null +++ b/test/642-fp-callees/info.txt @@ -0,0 +1,2 @@ +Regression test for vixl32 backend, which used to incorrectly +use D14 as a temporary register. diff --git a/test/642-fp-callees/src/Main.java b/test/642-fp-callees/src/Main.java new file mode 100644 index 0000000000..fa57c93eda --- /dev/null +++ b/test/642-fp-callees/src/Main.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +public class Main { + public static void main(String[] args) { + System.loadLibrary(args[0]); + holdFpTemporaries(); + System.out.println("Done"); + } + + public static void caller(int a, int b, long c) { + $noinline$callee(a, b, c); + } + + // This method is "no inline", in order to generate the + // bad floating point use at the call site. + public static void $noinline$callee(int a, int b, long c) { + } + + public native static void holdFpTemporaries(); +} diff --git a/test/Android.bp b/test/Android.bp index 594cce2a6e..9911af0b03 100644 --- a/test/Android.bp +++ b/test/Android.bp @@ -336,6 +336,7 @@ cc_defaults { "596-monitor-inflation/monitor_inflation.cc", "597-deopt-new-string/deopt.cc", "626-const-class-linking/clear_dex_cache_types.cc", + "642-fp-callees/fp_callees.cc", ], shared_libs: [ "libbacktrace", |