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/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