Move @CriticalNative arguments in registers.
And spill stack arguments directly to the right location.
Do not spill to the reserved space in the caller's frame.
Preliminary Golem results for art-opt-cc:
x86 x86-64 arm arm64
NativeDowncallCritical6: n/a +14.3% +17.2% +26.1%
(x86 seems to be currently providing results that are worse
than interpreter, so something is not working.)
Test: Additional tests in 178-app-image-native-method test.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Test: aosp_taimen-userdebug boots.
Test: run-gtests.sh
Test: testrunner.py --target --optimizing
Bug: 112189621
Change-Id: I709c52ab2585a8f5f441f53ad2bf4a01d2b25dca
diff --git a/test/178-app-image-native-method/expected.txt b/test/178-app-image-native-method/expected.txt
index 30cc336..b4e5ece 100644
--- a/test/178-app-image-native-method/expected.txt
+++ b/test/178-app-image-native-method/expected.txt
@@ -5,6 +5,7 @@
testMissing
testMissingFast
testMissingCritical
+testCriticalSignatures
JNI_OnLoad called
test
testFast
@@ -12,3 +13,4 @@
testMissing
testMissingFast
testMissingCritical
+testCriticalSignatures
diff --git a/test/178-app-image-native-method/native_methods.cc b/test/178-app-image-native-method/native_methods.cc
index 794a78a..becda81 100644
--- a/test/178-app-image-native-method/native_methods.cc
+++ b/test/178-app-image-native-method/native_methods.cc
@@ -127,4 +127,486 @@
return ok ? 42 : -1;
}
+extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeILFFFFD(
+ jint i,
+ jlong l,
+ jfloat f1,
+ jfloat f2,
+ jfloat f3,
+ jfloat f4,
+ jdouble d) {
+ if (i != 1) return -1;
+ if (l != INT64_C(0xf00000002)) return -2;
+ if (f1 != 3.0f) return -3;
+ if (f2 != 4.0f) return -4;
+ if (f3 != 5.0f) return -5;
+ if (f4 != 6.0f) return -6;
+ if (d != 7.0) return -7;
+ return 42;
+}
+
+extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeLIFFFFD(
+ jlong l,
+ jint i,
+ jfloat f1,
+ jfloat f2,
+ jfloat f3,
+ jfloat f4,
+ jdouble d) {
+ if (l != INT64_C(0xf00000007)) return -1;
+ if (i != 6) return -2;
+ if (f1 != 5.0f) return -3;
+ if (f2 != 4.0f) return -4;
+ if (f3 != 3.0f) return -5;
+ if (f4 != 2.0f) return -6;
+ if (d != 1.0) return -7;
+ return 42;
+}
+
+extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeFLIFFFD(
+ jfloat f1,
+ jlong l,
+ jint i,
+ jfloat f2,
+ jfloat f3,
+ jfloat f4,
+ jdouble d) {
+ if (f1 != 1.0f) return -3;
+ if (l != INT64_C(0xf00000002)) return -1;
+ if (i != 3) return -2;
+ if (f2 != 4.0f) return -4;
+ if (f3 != 5.0f) return -5;
+ if (f4 != 6.0f) return -6;
+ if (d != 7.0) return -7;
+ return 42;
+}
+
+extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeDDIIIIII(
+ jdouble d1,
+ jdouble d2,
+ jint i1,
+ jint i2,
+ jint i3,
+ jint i4,
+ jint i5,
+ jint i6) {
+ if (d1 != 8.0) return -1;
+ if (d2 != 7.0) return -2;
+ if (i1 != 6) return -3;
+ if (i2 != 5) return -4;
+ if (i3 != 4) return -5;
+ if (i4 != 3) return -6;
+ if (i5 != 2) return -7;
+ if (i6 != 1) return -8;
+ return 42;
+}
+
+extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeDFFILIII(
+ jdouble d,
+ jfloat f1,
+ jfloat f2,
+ jint i1,
+ jlong l,
+ jint i2,
+ jint i3,
+ jint i4) {
+ if (d != 1.0) return -1;
+ if (f1 != 2.0f) return -2;
+ if (f2 != 3.0f) return -3;
+ if (i1 != 4) return -4;
+ if (l != INT64_C(0xf00000005)) return -5;
+ if (i2 != 6) return -6;
+ if (i3 != 7) return -7;
+ if (i4 != 8) return -8;
+ return 42;
+}
+
+extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeDDFILIII(
+ jdouble d1,
+ jdouble d2,
+ jfloat f,
+ jint i1,
+ jlong l,
+ jint i2,
+ jint i3,
+ jint i4) {
+ if (d1 != 8.0) return -1;
+ if (d2 != 7.0) return -2;
+ if (f != 6.0f) return -3;
+ if (i1 != 5) return -4;
+ if (l != INT64_C(0xf00000004)) return -5;
+ if (i2 != 3) return -6;
+ if (i3 != 2) return -7;
+ if (i4 != 1) return -8;
+ return 42;
+}
+
+extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeDDIFII(
+ jdouble d1,
+ jdouble d2,
+ jint i1,
+ jfloat f,
+ jint i2,
+ jint i3) {
+ if (d1 != 1.0) return -1;
+ if (d2 != 2.0) return -2;
+ if (i1 != 3) return -3;
+ if (f != 4.0f) return -4;
+ if (i2 != 5) return -5;
+ if (i3 != 6) return -6;
+ return 42;
+}
+
+extern "C" JNIEXPORT jint JNICALL Java_CriticalSignatures_nativeFullArgs(
+ // Generated by script (then modified to close argument list):
+ // for i in {0..84}; do echo " jlong l$((i*3)),"; echo " jint i$((i*3+2)),"; done
+ jlong l0,
+ jint i2,
+ jlong l3,
+ jint i5,
+ jlong l6,
+ jint i8,
+ jlong l9,
+ jint i11,
+ jlong l12,
+ jint i14,
+ jlong l15,
+ jint i17,
+ jlong l18,
+ jint i20,
+ jlong l21,
+ jint i23,
+ jlong l24,
+ jint i26,
+ jlong l27,
+ jint i29,
+ jlong l30,
+ jint i32,
+ jlong l33,
+ jint i35,
+ jlong l36,
+ jint i38,
+ jlong l39,
+ jint i41,
+ jlong l42,
+ jint i44,
+ jlong l45,
+ jint i47,
+ jlong l48,
+ jint i50,
+ jlong l51,
+ jint i53,
+ jlong l54,
+ jint i56,
+ jlong l57,
+ jint i59,
+ jlong l60,
+ jint i62,
+ jlong l63,
+ jint i65,
+ jlong l66,
+ jint i68,
+ jlong l69,
+ jint i71,
+ jlong l72,
+ jint i74,
+ jlong l75,
+ jint i77,
+ jlong l78,
+ jint i80,
+ jlong l81,
+ jint i83,
+ jlong l84,
+ jint i86,
+ jlong l87,
+ jint i89,
+ jlong l90,
+ jint i92,
+ jlong l93,
+ jint i95,
+ jlong l96,
+ jint i98,
+ jlong l99,
+ jint i101,
+ jlong l102,
+ jint i104,
+ jlong l105,
+ jint i107,
+ jlong l108,
+ jint i110,
+ jlong l111,
+ jint i113,
+ jlong l114,
+ jint i116,
+ jlong l117,
+ jint i119,
+ jlong l120,
+ jint i122,
+ jlong l123,
+ jint i125,
+ jlong l126,
+ jint i128,
+ jlong l129,
+ jint i131,
+ jlong l132,
+ jint i134,
+ jlong l135,
+ jint i137,
+ jlong l138,
+ jint i140,
+ jlong l141,
+ jint i143,
+ jlong l144,
+ jint i146,
+ jlong l147,
+ jint i149,
+ jlong l150,
+ jint i152,
+ jlong l153,
+ jint i155,
+ jlong l156,
+ jint i158,
+ jlong l159,
+ jint i161,
+ jlong l162,
+ jint i164,
+ jlong l165,
+ jint i167,
+ jlong l168,
+ jint i170,
+ jlong l171,
+ jint i173,
+ jlong l174,
+ jint i176,
+ jlong l177,
+ jint i179,
+ jlong l180,
+ jint i182,
+ jlong l183,
+ jint i185,
+ jlong l186,
+ jint i188,
+ jlong l189,
+ jint i191,
+ jlong l192,
+ jint i194,
+ jlong l195,
+ jint i197,
+ jlong l198,
+ jint i200,
+ jlong l201,
+ jint i203,
+ jlong l204,
+ jint i206,
+ jlong l207,
+ jint i209,
+ jlong l210,
+ jint i212,
+ jlong l213,
+ jint i215,
+ jlong l216,
+ jint i218,
+ jlong l219,
+ jint i221,
+ jlong l222,
+ jint i224,
+ jlong l225,
+ jint i227,
+ jlong l228,
+ jint i230,
+ jlong l231,
+ jint i233,
+ jlong l234,
+ jint i236,
+ jlong l237,
+ jint i239,
+ jlong l240,
+ jint i242,
+ jlong l243,
+ jint i245,
+ jlong l246,
+ jint i248,
+ jlong l249,
+ jint i251,
+ jlong l252,
+ jint i254) {
+ jlong l = INT64_C(0xf00000000);
+ // Generated by script (then modified to close argument list):
+ // for i in {0..84}; do \
+ // echo " if (l$((i*3)) != l + $(($i*3))) return -$(($i*3));"; \
+ // echo " if (i$(($i*3+2)) != $(($i*3+2))) return -$(($i*3+2));"; \
+ // done
+ if (l0 != l + 0) return -0;
+ if (i2 != 2) return -2;
+ if (l3 != l + 3) return -3;
+ if (i5 != 5) return -5;
+ if (l6 != l + 6) return -6;
+ if (i8 != 8) return -8;
+ if (l9 != l + 9) return -9;
+ if (i11 != 11) return -11;
+ if (l12 != l + 12) return -12;
+ if (i14 != 14) return -14;
+ if (l15 != l + 15) return -15;
+ if (i17 != 17) return -17;
+ if (l18 != l + 18) return -18;
+ if (i20 != 20) return -20;
+ if (l21 != l + 21) return -21;
+ if (i23 != 23) return -23;
+ if (l24 != l + 24) return -24;
+ if (i26 != 26) return -26;
+ if (l27 != l + 27) return -27;
+ if (i29 != 29) return -29;
+ if (l30 != l + 30) return -30;
+ if (i32 != 32) return -32;
+ if (l33 != l + 33) return -33;
+ if (i35 != 35) return -35;
+ if (l36 != l + 36) return -36;
+ if (i38 != 38) return -38;
+ if (l39 != l + 39) return -39;
+ if (i41 != 41) return -41;
+ if (l42 != l + 42) return -42;
+ if (i44 != 44) return -44;
+ if (l45 != l + 45) return -45;
+ if (i47 != 47) return -47;
+ if (l48 != l + 48) return -48;
+ if (i50 != 50) return -50;
+ if (l51 != l + 51) return -51;
+ if (i53 != 53) return -53;
+ if (l54 != l + 54) return -54;
+ if (i56 != 56) return -56;
+ if (l57 != l + 57) return -57;
+ if (i59 != 59) return -59;
+ if (l60 != l + 60) return -60;
+ if (i62 != 62) return -62;
+ if (l63 != l + 63) return -63;
+ if (i65 != 65) return -65;
+ if (l66 != l + 66) return -66;
+ if (i68 != 68) return -68;
+ if (l69 != l + 69) return -69;
+ if (i71 != 71) return -71;
+ if (l72 != l + 72) return -72;
+ if (i74 != 74) return -74;
+ if (l75 != l + 75) return -75;
+ if (i77 != 77) return -77;
+ if (l78 != l + 78) return -78;
+ if (i80 != 80) return -80;
+ if (l81 != l + 81) return -81;
+ if (i83 != 83) return -83;
+ if (l84 != l + 84) return -84;
+ if (i86 != 86) return -86;
+ if (l87 != l + 87) return -87;
+ if (i89 != 89) return -89;
+ if (l90 != l + 90) return -90;
+ if (i92 != 92) return -92;
+ if (l93 != l + 93) return -93;
+ if (i95 != 95) return -95;
+ if (l96 != l + 96) return -96;
+ if (i98 != 98) return -98;
+ if (l99 != l + 99) return -99;
+ if (i101 != 101) return -101;
+ if (l102 != l + 102) return -102;
+ if (i104 != 104) return -104;
+ if (l105 != l + 105) return -105;
+ if (i107 != 107) return -107;
+ if (l108 != l + 108) return -108;
+ if (i110 != 110) return -110;
+ if (l111 != l + 111) return -111;
+ if (i113 != 113) return -113;
+ if (l114 != l + 114) return -114;
+ if (i116 != 116) return -116;
+ if (l117 != l + 117) return -117;
+ if (i119 != 119) return -119;
+ if (l120 != l + 120) return -120;
+ if (i122 != 122) return -122;
+ if (l123 != l + 123) return -123;
+ if (i125 != 125) return -125;
+ if (l126 != l + 126) return -126;
+ if (i128 != 128) return -128;
+ if (l129 != l + 129) return -129;
+ if (i131 != 131) return -131;
+ if (l132 != l + 132) return -132;
+ if (i134 != 134) return -134;
+ if (l135 != l + 135) return -135;
+ if (i137 != 137) return -137;
+ if (l138 != l + 138) return -138;
+ if (i140 != 140) return -140;
+ if (l141 != l + 141) return -141;
+ if (i143 != 143) return -143;
+ if (l144 != l + 144) return -144;
+ if (i146 != 146) return -146;
+ if (l147 != l + 147) return -147;
+ if (i149 != 149) return -149;
+ if (l150 != l + 150) return -150;
+ if (i152 != 152) return -152;
+ if (l153 != l + 153) return -153;
+ if (i155 != 155) return -155;
+ if (l156 != l + 156) return -156;
+ if (i158 != 158) return -158;
+ if (l159 != l + 159) return -159;
+ if (i161 != 161) return -161;
+ if (l162 != l + 162) return -162;
+ if (i164 != 164) return -164;
+ if (l165 != l + 165) return -165;
+ if (i167 != 167) return -167;
+ if (l168 != l + 168) return -168;
+ if (i170 != 170) return -170;
+ if (l171 != l + 171) return -171;
+ if (i173 != 173) return -173;
+ if (l174 != l + 174) return -174;
+ if (i176 != 176) return -176;
+ if (l177 != l + 177) return -177;
+ if (i179 != 179) return -179;
+ if (l180 != l + 180) return -180;
+ if (i182 != 182) return -182;
+ if (l183 != l + 183) return -183;
+ if (i185 != 185) return -185;
+ if (l186 != l + 186) return -186;
+ if (i188 != 188) return -188;
+ if (l189 != l + 189) return -189;
+ if (i191 != 191) return -191;
+ if (l192 != l + 192) return -192;
+ if (i194 != 194) return -194;
+ if (l195 != l + 195) return -195;
+ if (i197 != 197) return -197;
+ if (l198 != l + 198) return -198;
+ if (i200 != 200) return -200;
+ if (l201 != l + 201) return -201;
+ if (i203 != 203) return -203;
+ if (l204 != l + 204) return -204;
+ if (i206 != 206) return -206;
+ if (l207 != l + 207) return -207;
+ if (i209 != 209) return -209;
+ if (l210 != l + 210) return -210;
+ if (i212 != 212) return -212;
+ if (l213 != l + 213) return -213;
+ if (i215 != 215) return -215;
+ if (l216 != l + 216) return -216;
+ if (i218 != 218) return -218;
+ if (l219 != l + 219) return -219;
+ if (i221 != 221) return -221;
+ if (l222 != l + 222) return -222;
+ if (i224 != 224) return -224;
+ if (l225 != l + 225) return -225;
+ if (i227 != 227) return -227;
+ if (l228 != l + 228) return -228;
+ if (i230 != 230) return -230;
+ if (l231 != l + 231) return -231;
+ if (i233 != 233) return -233;
+ if (l234 != l + 234) return -234;
+ if (i236 != 236) return -236;
+ if (l237 != l + 237) return -237;
+ if (i239 != 239) return -239;
+ if (l240 != l + 240) return -240;
+ if (i242 != 242) return -242;
+ if (l243 != l + 243) return -243;
+ if (i245 != 245) return -245;
+ if (l246 != l + 246) return -246;
+ if (i248 != 248) return -248;
+ if (l249 != l + 249) return -249;
+ if (i251 != 251) return -251;
+ if (l252 != l + 252) return -252;
+ if (i254 != 254) return -254;
+ return 42;
+}
+
} // namespace art
diff --git a/test/178-app-image-native-method/src/Main.java b/test/178-app-image-native-method/src/Main.java
index 07990cb..9043081 100644
--- a/test/178-app-image-native-method/src/Main.java
+++ b/test/178-app-image-native-method/src/Main.java
@@ -29,6 +29,7 @@
new TestMissing();
new TestMissingFast();
new TestMissingCritical();
+ new CriticalSignatures();
makeVisiblyInitialized(); // Make sure they are visibly initialized.
test();
@@ -37,6 +38,8 @@
testMissing();
testMissingFast();
testMissingCritical();
+
+ testCriticalSignatures();
}
static void test() {
@@ -165,6 +168,194 @@
} catch (LinkageError expected) {}
}
+ static void testCriticalSignatures() {
+ System.out.println("testCriticalSignatures");
+ long l = 0xf00000000L;
+ assertEquals(42, CriticalSignatures.nativeILFFFFD(1, l + 2L, 3.0f, 4.0f, 5.0f, 6.0f, 7.0));
+ assertEquals(42, CriticalSignatures.nativeLIFFFFD(l + 7L, 6, 5.0f, 4.0f, 3.0f, 2.0f, 1.0));
+ assertEquals(42, CriticalSignatures.nativeFLIFFFD(1.0f, l + 2L, 3, 4.0f, 5.0f, 6.0f, 7.0));
+ assertEquals(42, CriticalSignatures.nativeDDIIIIII(8.0, 7.0, 6, 5, 4, 3, 2, 1));
+ assertEquals(42, CriticalSignatures.nativeDFFILIII(1.0, 2.0f, 3.0f, 4, l + 5L, 6, 7, 8));
+ assertEquals(42, CriticalSignatures.nativeDDFILIII(8.0, 7.0, 6.0f, 5, l + 4L, 3, 2, 1));
+ assertEquals(42, CriticalSignatures.nativeDDIFII(1.0, 2.0, 3, 4.0f, 5, 6));
+ assertEquals(42, CriticalSignatures.nativeFullArgs(
+ // Generated by script (then modified to close argument list):
+ // for i in {0..84}; \
+ // do echo " 0xf00000000L + $((i*3))L,"; \
+ // echo " $((i*3+2)),"; \
+ // done
+ 0xf00000000L + 0L,
+ 2,
+ 0xf00000000L + 3L,
+ 5,
+ 0xf00000000L + 6L,
+ 8,
+ 0xf00000000L + 9L,
+ 11,
+ 0xf00000000L + 12L,
+ 14,
+ 0xf00000000L + 15L,
+ 17,
+ 0xf00000000L + 18L,
+ 20,
+ 0xf00000000L + 21L,
+ 23,
+ 0xf00000000L + 24L,
+ 26,
+ 0xf00000000L + 27L,
+ 29,
+ 0xf00000000L + 30L,
+ 32,
+ 0xf00000000L + 33L,
+ 35,
+ 0xf00000000L + 36L,
+ 38,
+ 0xf00000000L + 39L,
+ 41,
+ 0xf00000000L + 42L,
+ 44,
+ 0xf00000000L + 45L,
+ 47,
+ 0xf00000000L + 48L,
+ 50,
+ 0xf00000000L + 51L,
+ 53,
+ 0xf00000000L + 54L,
+ 56,
+ 0xf00000000L + 57L,
+ 59,
+ 0xf00000000L + 60L,
+ 62,
+ 0xf00000000L + 63L,
+ 65,
+ 0xf00000000L + 66L,
+ 68,
+ 0xf00000000L + 69L,
+ 71,
+ 0xf00000000L + 72L,
+ 74,
+ 0xf00000000L + 75L,
+ 77,
+ 0xf00000000L + 78L,
+ 80,
+ 0xf00000000L + 81L,
+ 83,
+ 0xf00000000L + 84L,
+ 86,
+ 0xf00000000L + 87L,
+ 89,
+ 0xf00000000L + 90L,
+ 92,
+ 0xf00000000L + 93L,
+ 95,
+ 0xf00000000L + 96L,
+ 98,
+ 0xf00000000L + 99L,
+ 101,
+ 0xf00000000L + 102L,
+ 104,
+ 0xf00000000L + 105L,
+ 107,
+ 0xf00000000L + 108L,
+ 110,
+ 0xf00000000L + 111L,
+ 113,
+ 0xf00000000L + 114L,
+ 116,
+ 0xf00000000L + 117L,
+ 119,
+ 0xf00000000L + 120L,
+ 122,
+ 0xf00000000L + 123L,
+ 125,
+ 0xf00000000L + 126L,
+ 128,
+ 0xf00000000L + 129L,
+ 131,
+ 0xf00000000L + 132L,
+ 134,
+ 0xf00000000L + 135L,
+ 137,
+ 0xf00000000L + 138L,
+ 140,
+ 0xf00000000L + 141L,
+ 143,
+ 0xf00000000L + 144L,
+ 146,
+ 0xf00000000L + 147L,
+ 149,
+ 0xf00000000L + 150L,
+ 152,
+ 0xf00000000L + 153L,
+ 155,
+ 0xf00000000L + 156L,
+ 158,
+ 0xf00000000L + 159L,
+ 161,
+ 0xf00000000L + 162L,
+ 164,
+ 0xf00000000L + 165L,
+ 167,
+ 0xf00000000L + 168L,
+ 170,
+ 0xf00000000L + 171L,
+ 173,
+ 0xf00000000L + 174L,
+ 176,
+ 0xf00000000L + 177L,
+ 179,
+ 0xf00000000L + 180L,
+ 182,
+ 0xf00000000L + 183L,
+ 185,
+ 0xf00000000L + 186L,
+ 188,
+ 0xf00000000L + 189L,
+ 191,
+ 0xf00000000L + 192L,
+ 194,
+ 0xf00000000L + 195L,
+ 197,
+ 0xf00000000L + 198L,
+ 200,
+ 0xf00000000L + 201L,
+ 203,
+ 0xf00000000L + 204L,
+ 206,
+ 0xf00000000L + 207L,
+ 209,
+ 0xf00000000L + 210L,
+ 212,
+ 0xf00000000L + 213L,
+ 215,
+ 0xf00000000L + 216L,
+ 218,
+ 0xf00000000L + 219L,
+ 221,
+ 0xf00000000L + 222L,
+ 224,
+ 0xf00000000L + 225L,
+ 227,
+ 0xf00000000L + 228L,
+ 230,
+ 0xf00000000L + 231L,
+ 233,
+ 0xf00000000L + 234L,
+ 236,
+ 0xf00000000L + 237L,
+ 239,
+ 0xf00000000L + 240L,
+ 242,
+ 0xf00000000L + 243L,
+ 245,
+ 0xf00000000L + 246L,
+ 248,
+ 0xf00000000L + 249L,
+ 251,
+ 0xf00000000L + 252L,
+ 254));
+ }
+
static void assertEquals(int expected, int actual) {
if (expected != actual) {
throw new AssertionError("Expected " + expected + " got " + actual);
@@ -281,3 +472,280 @@
int i7, long l7, float f7, double d7,
int i8, long l8, float f8, double d8);
}
+
+class CriticalSignatures {
+ // The following signatures exercise ARM argument moving and serve
+ // as an example of the optimizations performed by the assembler.
+ // Moving arguments is a lot simpler for other architectures.
+
+ // JNI compiler does not emit the CFG, so we cannot CHECK the "dissassembly (after)".
+
+ // vstm sp, {d0-d2} # f1, f2, f3, f4, d -- store floats as D regs together with double
+ // mov r4, r0 # hidden arg
+ // mov r0, r1 # i
+ // # l stays in r2-r3
+ @CriticalNative
+ public static native int nativeILFFFFD(
+ int i, long l, float f1, float f2, float f3, float f4, double d);
+
+ // vstm sp, {s1-s3} # f2, f3, f4 -- store floats up to alignment gap
+ // vstr d2, [sp, #16] # d
+ // mov r4, r0 # hidden arg
+ // mov r0, r2 # low(l)
+ // mov r1, r3 # high(l)
+ // ldr r2, [sp, #...] # i
+ // vmov r3, s0 # f1
+ @CriticalNative
+ public static native int nativeLIFFFFD(
+ long l, int i, float f1, float f2, float f3, float f4, double d);
+
+ // ldr ip, [sp, #...] # i
+ // str ip, [sp] # i
+ // add ip, sp, #4 # Spilling multiple floats at an offset from SP
+ // vstm ip, {s1-s5} # f2, f3, f4, d
+ // mov r4, r0 # hidden arg
+ // vmov r0, s0 # f1
+ // # l stays in r2-r3
+ @CriticalNative
+ public static native int nativeFLIFFFD(
+ float f1, long l, int i, float f2, float f3, float f4, double d);
+
+ // stm sp, {r1,r2,r3} # i1, i2, i3 -- store ints together
+ // ldrd r1, ip, [sp, #...] # i4, i5
+ // strd r1, ip, [sp, #12] # i4, i5
+ // ldr ip, [sp, #72] # i6
+ // str ip, [sp, #20] # i6
+ // mov r4, r0 # hidden arg
+ // vmov r0, r1, d0 # d1
+ // vmov r2, r3, d1 # d2
+ @CriticalNative
+ public static native int nativeDDIIIIII(
+ double d1, double d2, int i1, int i2, int i3, int i4, int i5, int i6);
+
+ // str r1, [sp] # i1 -- cannot store with l due to alignment gap
+ // strd r2, r3, [sp, #8] # l
+ // ldrd r1, ip, [sp, #...] # i2, i3
+ // strd r1, ip, [sp, #16] # i2, i3
+ // ldr ip, [sp, #...] # i4
+ // str ip, [sp, #24] # i4
+ // mov r4, r0 # hidden arg
+ // vmov r0, r1, d0 # d
+ // vmov r2, r3, d1 # f1, f2 -- move both floats together as double
+ @CriticalNative
+ public static native int nativeDFFILIII(
+ double d, float f1, float f2, int i1, long l, int i2, int i3, int i4);
+
+ // vstr s4, [sp] # f
+ // add ip, sp, #4 # Spilling multiple core registers at an offset from SP
+ // stm ip, {r1,r2,r3} # i1, l -- store int together with long
+ // ldrd r1, ip, [sp, #...] # i2, i3
+ // strd r1, ip, [sp, #16] # i2, i3
+ // ldr ip, [sp, #...] # i4
+ // str ip, [sp, #24] # i4
+ // mov r4, r0 # hidden arg
+ // vmov r0, r1, d0 # d1
+ // vmov r2, r3, d1 # d2
+ @CriticalNative
+ public static native int nativeDDFILIII(
+ double d1, double d2, float f, int i1, long l, int i2, int i3, int i4);
+
+ // str r1, [sp] # i1
+ // vstr s4, [sp, #4] # f
+ // strd r2, r3, [sp, #8] # i2, i3 -- store ints together with STRD
+ // mov r4, r0 # hidden arg
+ // vmov r0, r1, d0 # d1
+ // vmov r2, r3, d1 # d2
+ @CriticalNative
+ public static native int nativeDDIFII(
+ double d1, double d2, int i1, float f, int i2, int i3);
+
+ // ...
+ // ldr ip, [sp, #2112] # int
+ // str ip, [sp, #1000] # int
+ // add r1, sp, #2048 # Prepare to use LDRD for loading long from a large offset
+ // ldrd r1, ip, [r1, #68] # long
+ // strd r1, ip, [sp, #1008] # long
+ // ldr ip, [sp, #2124] # int
+ // str ip, [sp, #1016] # int
+ // ldr ip, [sp, #2128] # low(long) -- copy the next long as two words because the offset
+ // str ip, [sp, #1024] # low(long) -- is too large for STRD and we only use 2 temps (r1, ip)
+ // ldr ip, [sp, #2132] # high(long)
+ // str ip, [sp, #1028] # high(long)
+ // ...
+ @CriticalNative
+ public static native int nativeFullArgs(
+ // Note: Numbered by dalvik registers, 0-254 (max 255 regs for invoke-*-range)
+ //
+ // Generated by script (then modified to close the argument list):
+ // for i in {0..84}; do echo " long l$((i*3)),"; echo " int i$(($i*3+2)),"; done
+ long l0,
+ int i2,
+ long l3,
+ int i5,
+ long l6,
+ int i8,
+ long l9,
+ int i11,
+ long l12,
+ int i14,
+ long l15,
+ int i17,
+ long l18,
+ int i20,
+ long l21,
+ int i23,
+ long l24,
+ int i26,
+ long l27,
+ int i29,
+ long l30,
+ int i32,
+ long l33,
+ int i35,
+ long l36,
+ int i38,
+ long l39,
+ int i41,
+ long l42,
+ int i44,
+ long l45,
+ int i47,
+ long l48,
+ int i50,
+ long l51,
+ int i53,
+ long l54,
+ int i56,
+ long l57,
+ int i59,
+ long l60,
+ int i62,
+ long l63,
+ int i65,
+ long l66,
+ int i68,
+ long l69,
+ int i71,
+ long l72,
+ int i74,
+ long l75,
+ int i77,
+ long l78,
+ int i80,
+ long l81,
+ int i83,
+ long l84,
+ int i86,
+ long l87,
+ int i89,
+ long l90,
+ int i92,
+ long l93,
+ int i95,
+ long l96,
+ int i98,
+ long l99,
+ int i101,
+ long l102,
+ int i104,
+ long l105,
+ int i107,
+ long l108,
+ int i110,
+ long l111,
+ int i113,
+ long l114,
+ int i116,
+ long l117,
+ int i119,
+ long l120,
+ int i122,
+ long l123,
+ int i125,
+ long l126,
+ int i128,
+ long l129,
+ int i131,
+ long l132,
+ int i134,
+ long l135,
+ int i137,
+ long l138,
+ int i140,
+ long l141,
+ int i143,
+ long l144,
+ int i146,
+ long l147,
+ int i149,
+ long l150,
+ int i152,
+ long l153,
+ int i155,
+ long l156,
+ int i158,
+ long l159,
+ int i161,
+ long l162,
+ int i164,
+ long l165,
+ int i167,
+ long l168,
+ int i170,
+ long l171,
+ int i173,
+ long l174,
+ int i176,
+ long l177,
+ int i179,
+ long l180,
+ int i182,
+ long l183,
+ int i185,
+ long l186,
+ int i188,
+ long l189,
+ int i191,
+ long l192,
+ int i194,
+ long l195,
+ int i197,
+ long l198,
+ int i200,
+ long l201,
+ int i203,
+ long l204,
+ int i206,
+ long l207,
+ int i209,
+ long l210,
+ int i212,
+ long l213,
+ int i215,
+ long l216,
+ int i218,
+ long l219,
+ int i221,
+ long l222,
+ int i224,
+ long l225,
+ int i227,
+ long l228,
+ int i230,
+ long l231,
+ int i233,
+ long l234,
+ int i236,
+ long l237,
+ int i239,
+ long l240,
+ int i242,
+ long l243,
+ int i245,
+ long l246,
+ int i248,
+ long l249,
+ int i251,
+ long l252,
+ int i254);
+}