1*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2015 The Android Open Source Project 2*795d594fSAndroid Build Coastguard Worker# 3*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*795d594fSAndroid Build Coastguard Worker# 7*795d594fSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*795d594fSAndroid Build Coastguard Worker# 9*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*795d594fSAndroid Build Coastguard Worker# limitations under the License. 14*795d594fSAndroid Build Coastguard Worker 15*795d594fSAndroid Build Coastguard Worker.class public LRuntime; 16*795d594fSAndroid Build Coastguard Worker.super Ljava/lang/Object; 17*795d594fSAndroid Build Coastguard Worker 18*795d594fSAndroid Build Coastguard Worker# The following tests all share the same structure, signature and return values: 19*795d594fSAndroid Build Coastguard Worker# - foo(false, false): normal path, returns 42 20*795d594fSAndroid Build Coastguard Worker# - foo(true, false): exceptional path #1, returns 3 21*795d594fSAndroid Build Coastguard Worker# - foo(false, true): exceptional path #2, returns 8 22*795d594fSAndroid Build Coastguard Worker# - foo(true, true): undefined 23*795d594fSAndroid Build Coastguard Worker 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard Worker# Test register allocation of 32-bit core intervals crossing catch block positions. 26*795d594fSAndroid Build Coastguard Worker 27*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Runtime.testUseAfterCatch_int(boolean, boolean) register (after) 28*795d594fSAndroid Build Coastguard Worker## CHECK-NOT: Phi is_catch_phi:true 29*795d594fSAndroid Build Coastguard Worker 30*795d594fSAndroid Build Coastguard Worker.method public static testUseAfterCatch_int(ZZ)I 31*795d594fSAndroid Build Coastguard Worker .registers 6 32*795d594fSAndroid Build Coastguard Worker 33*795d594fSAndroid Build Coastguard Worker sget-object v0, LRuntime;->intArray:[I 34*795d594fSAndroid Build Coastguard Worker const/4 v1, 0 35*795d594fSAndroid Build Coastguard Worker aget v1, v0, v1 36*795d594fSAndroid Build Coastguard Worker const/4 v2, 1 37*795d594fSAndroid Build Coastguard Worker aget v2, v0, v2 38*795d594fSAndroid Build Coastguard Worker const/4 v3, 2 39*795d594fSAndroid Build Coastguard Worker aget v3, v0, v3 40*795d594fSAndroid Build Coastguard Worker 41*795d594fSAndroid Build Coastguard Worker :try_start 42*795d594fSAndroid Build Coastguard Worker invoke-static {p0}, LRuntime;->$noinline$ThrowIfTrue(Z)V 43*795d594fSAndroid Build Coastguard Worker invoke-static {p1}, LRuntime;->$noinline$ThrowIfTrue(Z)V 44*795d594fSAndroid Build Coastguard Worker :try_end 45*795d594fSAndroid Build Coastguard Worker .catchall {:try_start .. :try_end} :catch_all 46*795d594fSAndroid Build Coastguard Worker 47*795d594fSAndroid Build Coastguard Worker return v3 # Normal path return. 48*795d594fSAndroid Build Coastguard Worker 49*795d594fSAndroid Build Coastguard Worker :catch_all 50*795d594fSAndroid Build Coastguard Worker if-eqz p0, :second_throw 51*795d594fSAndroid Build Coastguard Worker return v1 # Exceptional path #1 return. 52*795d594fSAndroid Build Coastguard Worker 53*795d594fSAndroid Build Coastguard Worker :second_throw 54*795d594fSAndroid Build Coastguard Worker return v2 # Exceptional path #2 return. 55*795d594fSAndroid Build Coastguard Worker.end method 56*795d594fSAndroid Build Coastguard Worker 57*795d594fSAndroid Build Coastguard Worker 58*795d594fSAndroid Build Coastguard Worker# Test register allocation of 64-bit core intervals crossing catch block positions. 59*795d594fSAndroid Build Coastguard Worker 60*795d594fSAndroid Build Coastguard Worker# The sum of the low and high 32 bits treated as integers is returned to prove 61*795d594fSAndroid Build Coastguard Worker# that both vregs allocated correctly. 62*795d594fSAndroid Build Coastguard Worker 63*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Runtime.testUseAfterCatch_long(boolean, boolean) register (after) 64*795d594fSAndroid Build Coastguard Worker## CHECK-NOT: Phi is_catch_phi:true 65*795d594fSAndroid Build Coastguard Worker 66*795d594fSAndroid Build Coastguard Worker.method public static testUseAfterCatch_long(ZZ)I 67*795d594fSAndroid Build Coastguard Worker .registers 10 68*795d594fSAndroid Build Coastguard Worker 69*795d594fSAndroid Build Coastguard Worker sget-object v0, LRuntime;->longArray:[J 70*795d594fSAndroid Build Coastguard Worker const/4 v1, 0 71*795d594fSAndroid Build Coastguard Worker aget-wide v1, v0, v1 72*795d594fSAndroid Build Coastguard Worker const/4 v3, 1 73*795d594fSAndroid Build Coastguard Worker aget-wide v3, v0, v3 74*795d594fSAndroid Build Coastguard Worker const/4 v5, 2 75*795d594fSAndroid Build Coastguard Worker aget-wide v5, v0, v5 76*795d594fSAndroid Build Coastguard Worker 77*795d594fSAndroid Build Coastguard Worker :try_start 78*795d594fSAndroid Build Coastguard Worker invoke-static {p0}, LRuntime;->$noinline$ThrowIfTrue(Z)V 79*795d594fSAndroid Build Coastguard Worker invoke-static {p1}, LRuntime;->$noinline$ThrowIfTrue(Z)V 80*795d594fSAndroid Build Coastguard Worker :try_end 81*795d594fSAndroid Build Coastguard Worker .catchall {:try_start .. :try_end} :catch_all 82*795d594fSAndroid Build Coastguard Worker 83*795d594fSAndroid Build Coastguard Worker const v0, 32 84*795d594fSAndroid Build Coastguard Worker ushr-long v7, v5, v0 85*795d594fSAndroid Build Coastguard Worker long-to-int v5, v5 86*795d594fSAndroid Build Coastguard Worker long-to-int v7, v7 87*795d594fSAndroid Build Coastguard Worker add-int/2addr v5, v7 88*795d594fSAndroid Build Coastguard Worker return v5 # Normal path return. 89*795d594fSAndroid Build Coastguard Worker 90*795d594fSAndroid Build Coastguard Worker :catch_all 91*795d594fSAndroid Build Coastguard Worker const v0, 32 92*795d594fSAndroid Build Coastguard Worker if-eqz p0, :second_throw 93*795d594fSAndroid Build Coastguard Worker 94*795d594fSAndroid Build Coastguard Worker ushr-long v7, v1, v0 95*795d594fSAndroid Build Coastguard Worker long-to-int v1, v1 96*795d594fSAndroid Build Coastguard Worker long-to-int v7, v7 97*795d594fSAndroid Build Coastguard Worker add-int/2addr v1, v7 98*795d594fSAndroid Build Coastguard Worker return v1 # Exceptional path #1 return. 99*795d594fSAndroid Build Coastguard Worker 100*795d594fSAndroid Build Coastguard Worker :second_throw 101*795d594fSAndroid Build Coastguard Worker ushr-long v7, v3, v0 102*795d594fSAndroid Build Coastguard Worker long-to-int v3, v3 103*795d594fSAndroid Build Coastguard Worker long-to-int v7, v7 104*795d594fSAndroid Build Coastguard Worker add-int/2addr v3, v7 105*795d594fSAndroid Build Coastguard Worker return v3 # Exceptional path #2 return. 106*795d594fSAndroid Build Coastguard Worker.end method 107*795d594fSAndroid Build Coastguard Worker 108*795d594fSAndroid Build Coastguard Worker 109*795d594fSAndroid Build Coastguard Worker# Test register allocation of 32-bit floating-point intervals crossing catch block positions. 110*795d594fSAndroid Build Coastguard Worker 111*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Runtime.testUseAfterCatch_float(boolean, boolean) register (after) 112*795d594fSAndroid Build Coastguard Worker## CHECK-NOT: Phi is_catch_phi:true 113*795d594fSAndroid Build Coastguard Worker 114*795d594fSAndroid Build Coastguard Worker.method public static testUseAfterCatch_float(ZZ)I 115*795d594fSAndroid Build Coastguard Worker .registers 6 116*795d594fSAndroid Build Coastguard Worker 117*795d594fSAndroid Build Coastguard Worker sget-object v0, LRuntime;->floatArray:[F 118*795d594fSAndroid Build Coastguard Worker const/4 v1, 0 119*795d594fSAndroid Build Coastguard Worker aget v1, v0, v1 120*795d594fSAndroid Build Coastguard Worker const/4 v2, 1 121*795d594fSAndroid Build Coastguard Worker aget v2, v0, v2 122*795d594fSAndroid Build Coastguard Worker const/4 v3, 2 123*795d594fSAndroid Build Coastguard Worker aget v3, v0, v3 124*795d594fSAndroid Build Coastguard Worker 125*795d594fSAndroid Build Coastguard Worker :try_start 126*795d594fSAndroid Build Coastguard Worker invoke-static {p0}, LRuntime;->$noinline$ThrowIfTrue(Z)V 127*795d594fSAndroid Build Coastguard Worker invoke-static {p1}, LRuntime;->$noinline$ThrowIfTrue(Z)V 128*795d594fSAndroid Build Coastguard Worker :try_end 129*795d594fSAndroid Build Coastguard Worker .catchall {:try_start .. :try_end} :catch_all 130*795d594fSAndroid Build Coastguard Worker 131*795d594fSAndroid Build Coastguard Worker float-to-int v3, v3 132*795d594fSAndroid Build Coastguard Worker return v3 # Normal path return. 133*795d594fSAndroid Build Coastguard Worker 134*795d594fSAndroid Build Coastguard Worker :catch_all 135*795d594fSAndroid Build Coastguard Worker if-eqz p0, :second_throw 136*795d594fSAndroid Build Coastguard Worker float-to-int v1, v1 137*795d594fSAndroid Build Coastguard Worker return v1 # Exceptional path #1 return. 138*795d594fSAndroid Build Coastguard Worker 139*795d594fSAndroid Build Coastguard Worker :second_throw 140*795d594fSAndroid Build Coastguard Worker float-to-int v2, v2 141*795d594fSAndroid Build Coastguard Worker return v2 # Exceptional path #2 return. 142*795d594fSAndroid Build Coastguard Worker.end method 143*795d594fSAndroid Build Coastguard Worker 144*795d594fSAndroid Build Coastguard Worker 145*795d594fSAndroid Build Coastguard Worker# Test register allocation of 64-bit floating-point intervals crossing catch block positions. 146*795d594fSAndroid Build Coastguard Worker 147*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Runtime.testUseAfterCatch_double(boolean, boolean) register (after) 148*795d594fSAndroid Build Coastguard Worker## CHECK-NOT: Phi is_catch_phi:true 149*795d594fSAndroid Build Coastguard Worker 150*795d594fSAndroid Build Coastguard Worker.method public static testUseAfterCatch_double(ZZ)I 151*795d594fSAndroid Build Coastguard Worker .registers 10 152*795d594fSAndroid Build Coastguard Worker 153*795d594fSAndroid Build Coastguard Worker sget-object v0, LRuntime;->doubleArray:[D 154*795d594fSAndroid Build Coastguard Worker const/4 v1, 0 155*795d594fSAndroid Build Coastguard Worker aget-wide v1, v0, v1 156*795d594fSAndroid Build Coastguard Worker const/4 v3, 1 157*795d594fSAndroid Build Coastguard Worker aget-wide v3, v0, v3 158*795d594fSAndroid Build Coastguard Worker const/4 v5, 2 159*795d594fSAndroid Build Coastguard Worker aget-wide v5, v0, v5 160*795d594fSAndroid Build Coastguard Worker 161*795d594fSAndroid Build Coastguard Worker :try_start 162*795d594fSAndroid Build Coastguard Worker invoke-static {p0}, LRuntime;->$noinline$ThrowIfTrue(Z)V 163*795d594fSAndroid Build Coastguard Worker invoke-static {p1}, LRuntime;->$noinline$ThrowIfTrue(Z)V 164*795d594fSAndroid Build Coastguard Worker :try_end 165*795d594fSAndroid Build Coastguard Worker .catchall {:try_start .. :try_end} :catch_all 166*795d594fSAndroid Build Coastguard Worker 167*795d594fSAndroid Build Coastguard Worker double-to-int v5, v5 168*795d594fSAndroid Build Coastguard Worker return v5 # Normal path return. 169*795d594fSAndroid Build Coastguard Worker 170*795d594fSAndroid Build Coastguard Worker :catch_all 171*795d594fSAndroid Build Coastguard Worker if-eqz p0, :second_throw 172*795d594fSAndroid Build Coastguard Worker double-to-int v1, v1 173*795d594fSAndroid Build Coastguard Worker return v1 # Exceptional path #1 return. 174*795d594fSAndroid Build Coastguard Worker 175*795d594fSAndroid Build Coastguard Worker :second_throw 176*795d594fSAndroid Build Coastguard Worker double-to-int v3, v3 177*795d594fSAndroid Build Coastguard Worker return v3 # Exceptional path #2 return. 178*795d594fSAndroid Build Coastguard Worker.end method 179*795d594fSAndroid Build Coastguard Worker 180*795d594fSAndroid Build Coastguard Worker 181*795d594fSAndroid Build Coastguard Worker# Test catch-phi runtime support for constant values. 182*795d594fSAndroid Build Coastguard Worker 183*795d594fSAndroid Build Coastguard Worker# Register v0 holds different constants at two throwing instructions. Runtime is 184*795d594fSAndroid Build Coastguard Worker# expected to load them from stack map and copy to the catch phi's location. 185*795d594fSAndroid Build Coastguard Worker 186*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Runtime.testCatchPhi_const(boolean, boolean) register (after) 187*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Const3:i\d+>> IntConstant 3 188*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Const8:i\d+>> IntConstant 8 189*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Phi [<<Const3>>,<<Const8>>] is_catch_phi:true 190*795d594fSAndroid Build Coastguard Worker 191*795d594fSAndroid Build Coastguard Worker.method public static testCatchPhi_const(ZZ)I 192*795d594fSAndroid Build Coastguard Worker .registers 3 193*795d594fSAndroid Build Coastguard Worker 194*795d594fSAndroid Build Coastguard Worker :try_start 195*795d594fSAndroid Build Coastguard Worker const v0, 3 196*795d594fSAndroid Build Coastguard Worker invoke-static {p0}, LRuntime;->$noinline$ThrowIfTrue(Z)V 197*795d594fSAndroid Build Coastguard Worker 198*795d594fSAndroid Build Coastguard Worker const v0, 8 199*795d594fSAndroid Build Coastguard Worker invoke-static {p1}, LRuntime;->$noinline$ThrowIfTrue(Z)V 200*795d594fSAndroid Build Coastguard Worker :try_end 201*795d594fSAndroid Build Coastguard Worker .catchall {:try_start .. :try_end} :catch_all 202*795d594fSAndroid Build Coastguard Worker 203*795d594fSAndroid Build Coastguard Worker const v0, 42 204*795d594fSAndroid Build Coastguard Worker return v0 # Normal path return. 205*795d594fSAndroid Build Coastguard Worker 206*795d594fSAndroid Build Coastguard Worker :catch_all 207*795d594fSAndroid Build Coastguard Worker return v0 # Exceptional path #1/#2 return. 208*795d594fSAndroid Build Coastguard Worker.end method 209*795d594fSAndroid Build Coastguard Worker 210*795d594fSAndroid Build Coastguard Worker 211*795d594fSAndroid Build Coastguard Worker# Test catch-phi runtime support for 32-bit values stored in core registers. 212*795d594fSAndroid Build Coastguard Worker 213*795d594fSAndroid Build Coastguard Worker# Register v0 holds different integer values at two throwing instructions. 214*795d594fSAndroid Build Coastguard Worker# Runtime is expected to find their location in the stack map and copy the value 215*795d594fSAndroid Build Coastguard Worker# to the location of the catch phi. 216*795d594fSAndroid Build Coastguard Worker 217*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Runtime.testCatchPhi_int(boolean, boolean) register (after) 218*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Val1:i\d+>> ArrayGet 219*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Val2:i\d+>> ArrayGet 220*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Phi [<<Val1>>,<<Val2>>] is_catch_phi:true 221*795d594fSAndroid Build Coastguard Worker 222*795d594fSAndroid Build Coastguard Worker.method public static testCatchPhi_int(ZZ)I 223*795d594fSAndroid Build Coastguard Worker .registers 6 224*795d594fSAndroid Build Coastguard Worker 225*795d594fSAndroid Build Coastguard Worker sget-object v0, LRuntime;->intArray:[I 226*795d594fSAndroid Build Coastguard Worker const/4 v1, 0 227*795d594fSAndroid Build Coastguard Worker aget v1, v0, v1 228*795d594fSAndroid Build Coastguard Worker const/4 v2, 1 229*795d594fSAndroid Build Coastguard Worker aget v2, v0, v2 230*795d594fSAndroid Build Coastguard Worker const/4 v3, 2 231*795d594fSAndroid Build Coastguard Worker aget v3, v0, v3 232*795d594fSAndroid Build Coastguard Worker 233*795d594fSAndroid Build Coastguard Worker :try_start 234*795d594fSAndroid Build Coastguard Worker move v0, v1 # Set catch phi value 235*795d594fSAndroid Build Coastguard Worker invoke-static {p0}, LRuntime;->$noinline$ThrowIfTrue(Z)V 236*795d594fSAndroid Build Coastguard Worker 237*795d594fSAndroid Build Coastguard Worker move v0, v2 # Set catch phi value 238*795d594fSAndroid Build Coastguard Worker invoke-static {p1}, LRuntime;->$noinline$ThrowIfTrue(Z)V 239*795d594fSAndroid Build Coastguard Worker :try_end 240*795d594fSAndroid Build Coastguard Worker .catchall {:try_start .. :try_end} :catch_all 241*795d594fSAndroid Build Coastguard Worker 242*795d594fSAndroid Build Coastguard Worker return v3 # Normal path return. 243*795d594fSAndroid Build Coastguard Worker 244*795d594fSAndroid Build Coastguard Worker :catch_all 245*795d594fSAndroid Build Coastguard Worker return v0 # Exceptional path #1/#2 return. 246*795d594fSAndroid Build Coastguard Worker.end method 247*795d594fSAndroid Build Coastguard Worker 248*795d594fSAndroid Build Coastguard Worker 249*795d594fSAndroid Build Coastguard Worker# Test catch-phi runtime support for 64-bit values stored in core registers. 250*795d594fSAndroid Build Coastguard Worker 251*795d594fSAndroid Build Coastguard Worker# Register pair (v0, v1) holds different long values at two throwing instructions. 252*795d594fSAndroid Build Coastguard Worker# Runtime is expected to find their location in the stack map and copy the value 253*795d594fSAndroid Build Coastguard Worker# to the location of the catch phi. The sum of the low and high 32 bits treated 254*795d594fSAndroid Build Coastguard Worker# as integers is returned to prove that both vregs were copied. 255*795d594fSAndroid Build Coastguard Worker 256*795d594fSAndroid Build Coastguard Worker# Note: values will be spilled on x86 because of too few callee-save core registers. 257*795d594fSAndroid Build Coastguard Worker 258*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Runtime.testCatchPhi_long(boolean, boolean) register (after) 259*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Val1:j\d+>> ArrayGet 260*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Val2:j\d+>> ArrayGet 261*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Phi [<<Val1>>,<<Val2>>] is_catch_phi:true 262*795d594fSAndroid Build Coastguard Worker 263*795d594fSAndroid Build Coastguard Worker.method public static testCatchPhi_long(ZZ)I 264*795d594fSAndroid Build Coastguard Worker .registers 10 265*795d594fSAndroid Build Coastguard Worker 266*795d594fSAndroid Build Coastguard Worker sget-object v0, LRuntime;->longArray:[J 267*795d594fSAndroid Build Coastguard Worker const/4 v2, 0 268*795d594fSAndroid Build Coastguard Worker aget-wide v2, v0, v2 269*795d594fSAndroid Build Coastguard Worker const/4 v4, 1 270*795d594fSAndroid Build Coastguard Worker aget-wide v4, v0, v4 271*795d594fSAndroid Build Coastguard Worker const/4 v6, 2 272*795d594fSAndroid Build Coastguard Worker aget-wide v6, v0, v6 273*795d594fSAndroid Build Coastguard Worker 274*795d594fSAndroid Build Coastguard Worker :try_start 275*795d594fSAndroid Build Coastguard Worker move-wide v0, v2 # Set catch phi value 276*795d594fSAndroid Build Coastguard Worker invoke-static {p0}, LRuntime;->$noinline$ThrowIfTrue(Z)V 277*795d594fSAndroid Build Coastguard Worker 278*795d594fSAndroid Build Coastguard Worker move-wide v0, v4 # Set catch phi value 279*795d594fSAndroid Build Coastguard Worker invoke-static {p1}, LRuntime;->$noinline$ThrowIfTrue(Z)V 280*795d594fSAndroid Build Coastguard Worker :try_end 281*795d594fSAndroid Build Coastguard Worker .catchall {:try_start .. :try_end} :catch_all 282*795d594fSAndroid Build Coastguard Worker 283*795d594fSAndroid Build Coastguard Worker const v2, 32 284*795d594fSAndroid Build Coastguard Worker ushr-long v2, v6, v2 285*795d594fSAndroid Build Coastguard Worker long-to-int v2, v2 286*795d594fSAndroid Build Coastguard Worker long-to-int v6, v6 287*795d594fSAndroid Build Coastguard Worker add-int/2addr v6, v2 288*795d594fSAndroid Build Coastguard Worker return v6 # Normal path return. 289*795d594fSAndroid Build Coastguard Worker 290*795d594fSAndroid Build Coastguard Worker :catch_all 291*795d594fSAndroid Build Coastguard Worker const v2, 32 292*795d594fSAndroid Build Coastguard Worker ushr-long v2, v0, v2 293*795d594fSAndroid Build Coastguard Worker long-to-int v2, v2 294*795d594fSAndroid Build Coastguard Worker long-to-int v0, v0 295*795d594fSAndroid Build Coastguard Worker add-int/2addr v0, v2 296*795d594fSAndroid Build Coastguard Worker return v0 # Exceptional path #1/#2 return. 297*795d594fSAndroid Build Coastguard Worker.end method 298*795d594fSAndroid Build Coastguard Worker 299*795d594fSAndroid Build Coastguard Worker 300*795d594fSAndroid Build Coastguard Worker# Test catch-phi runtime support for 32-bit values stored in FPU registers. 301*795d594fSAndroid Build Coastguard Worker 302*795d594fSAndroid Build Coastguard Worker# Register v0 holds different float values at two throwing instructions. Runtime 303*795d594fSAndroid Build Coastguard Worker# is expected to find their location in the stack map and copy the value to the 304*795d594fSAndroid Build Coastguard Worker# location of the catch phi. The value is converted to int and returned. 305*795d594fSAndroid Build Coastguard Worker 306*795d594fSAndroid Build Coastguard Worker# Note: values will be spilled on x86 as there are no callee-save FPU registers. 307*795d594fSAndroid Build Coastguard Worker 308*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Runtime.testCatchPhi_float(boolean, boolean) register (after) 309*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Val1:f\d+>> ArrayGet 310*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Val2:f\d+>> ArrayGet 311*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Phi [<<Val1>>,<<Val2>>] is_catch_phi:true 312*795d594fSAndroid Build Coastguard Worker 313*795d594fSAndroid Build Coastguard Worker.method public static testCatchPhi_float(ZZ)I 314*795d594fSAndroid Build Coastguard Worker .registers 6 315*795d594fSAndroid Build Coastguard Worker 316*795d594fSAndroid Build Coastguard Worker sget-object v0, LRuntime;->floatArray:[F 317*795d594fSAndroid Build Coastguard Worker const/4 v1, 0 318*795d594fSAndroid Build Coastguard Worker aget v1, v0, v1 319*795d594fSAndroid Build Coastguard Worker const/4 v2, 1 320*795d594fSAndroid Build Coastguard Worker aget v2, v0, v2 321*795d594fSAndroid Build Coastguard Worker const/4 v3, 2 322*795d594fSAndroid Build Coastguard Worker aget v3, v0, v3 323*795d594fSAndroid Build Coastguard Worker 324*795d594fSAndroid Build Coastguard Worker :try_start 325*795d594fSAndroid Build Coastguard Worker move v0, v1 # Set catch phi value 326*795d594fSAndroid Build Coastguard Worker invoke-static {p0}, LRuntime;->$noinline$ThrowIfTrue(Z)V 327*795d594fSAndroid Build Coastguard Worker 328*795d594fSAndroid Build Coastguard Worker move v0, v2 # Set catch phi value 329*795d594fSAndroid Build Coastguard Worker invoke-static {p1}, LRuntime;->$noinline$ThrowIfTrue(Z)V 330*795d594fSAndroid Build Coastguard Worker :try_end 331*795d594fSAndroid Build Coastguard Worker .catchall {:try_start .. :try_end} :catch_all 332*795d594fSAndroid Build Coastguard Worker 333*795d594fSAndroid Build Coastguard Worker float-to-int v3, v3 334*795d594fSAndroid Build Coastguard Worker return v3 # Normal path return. 335*795d594fSAndroid Build Coastguard Worker 336*795d594fSAndroid Build Coastguard Worker :catch_all 337*795d594fSAndroid Build Coastguard Worker float-to-int v0, v0 338*795d594fSAndroid Build Coastguard Worker return v0 # Exceptional path #1/#2 return. 339*795d594fSAndroid Build Coastguard Worker.end method 340*795d594fSAndroid Build Coastguard Worker 341*795d594fSAndroid Build Coastguard Worker 342*795d594fSAndroid Build Coastguard Worker# Test catch-phi runtime support for 64-bit values stored in FPU registers. 343*795d594fSAndroid Build Coastguard Worker 344*795d594fSAndroid Build Coastguard Worker# Register pair (v0, v1) holds different double values at two throwing instructions. 345*795d594fSAndroid Build Coastguard Worker# Runtime is expected to find their location in the stack map and copy the value 346*795d594fSAndroid Build Coastguard Worker# to the location of the catch phi. The value is converted to int and returned. 347*795d594fSAndroid Build Coastguard Worker# Values were chosen so that all 64 bits are used. 348*795d594fSAndroid Build Coastguard Worker 349*795d594fSAndroid Build Coastguard Worker# Note: values will be spilled on x86 as there are no callee-save FPU registers. 350*795d594fSAndroid Build Coastguard Worker 351*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Runtime.testCatchPhi_double(boolean, boolean) register (after) 352*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Val1:d\d+>> ArrayGet 353*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Val2:d\d+>> ArrayGet 354*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Phi [<<Val1>>,<<Val2>>] is_catch_phi:true 355*795d594fSAndroid Build Coastguard Worker 356*795d594fSAndroid Build Coastguard Worker.method public static testCatchPhi_double(ZZ)I 357*795d594fSAndroid Build Coastguard Worker .registers 10 358*795d594fSAndroid Build Coastguard Worker 359*795d594fSAndroid Build Coastguard Worker sget-object v0, LRuntime;->doubleArray:[D 360*795d594fSAndroid Build Coastguard Worker const/4 v2, 0 361*795d594fSAndroid Build Coastguard Worker aget-wide v2, v0, v2 362*795d594fSAndroid Build Coastguard Worker const/4 v4, 1 363*795d594fSAndroid Build Coastguard Worker aget-wide v4, v0, v4 364*795d594fSAndroid Build Coastguard Worker const/4 v6, 2 365*795d594fSAndroid Build Coastguard Worker aget-wide v6, v0, v6 366*795d594fSAndroid Build Coastguard Worker 367*795d594fSAndroid Build Coastguard Worker :try_start 368*795d594fSAndroid Build Coastguard Worker move-wide v0, v2 # Set catch phi value 369*795d594fSAndroid Build Coastguard Worker invoke-static {p0}, LRuntime;->$noinline$ThrowIfTrue(Z)V 370*795d594fSAndroid Build Coastguard Worker 371*795d594fSAndroid Build Coastguard Worker move-wide v0, v4 # Set catch phi value 372*795d594fSAndroid Build Coastguard Worker invoke-static {p1}, LRuntime;->$noinline$ThrowIfTrue(Z)V 373*795d594fSAndroid Build Coastguard Worker :try_end 374*795d594fSAndroid Build Coastguard Worker .catchall {:try_start .. :try_end} :catch_all 375*795d594fSAndroid Build Coastguard Worker 376*795d594fSAndroid Build Coastguard Worker double-to-int v6, v6 377*795d594fSAndroid Build Coastguard Worker return v6 378*795d594fSAndroid Build Coastguard Worker 379*795d594fSAndroid Build Coastguard Worker :catch_all 380*795d594fSAndroid Build Coastguard Worker double-to-int v0, v0 381*795d594fSAndroid Build Coastguard Worker return v0 382*795d594fSAndroid Build Coastguard Worker.end method 383*795d594fSAndroid Build Coastguard Worker 384*795d594fSAndroid Build Coastguard Worker# Test catch-phi runtime support for 32-bit values stored on the stack. 385*795d594fSAndroid Build Coastguard Worker 386*795d594fSAndroid Build Coastguard Worker# Register v0 holds different integer values at two throwing instructions. 387*795d594fSAndroid Build Coastguard Worker# These values were forced to spill by an always-throwing try/catch after their 388*795d594fSAndroid Build Coastguard Worker# definition. Runtime is expected to find their location in the stack map and 389*795d594fSAndroid Build Coastguard Worker# copy the value to the location of the catch phi. The value is then returned. 390*795d594fSAndroid Build Coastguard Worker 391*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Runtime.testCatchPhi_singleSlot(boolean, boolean) register (after) 392*795d594fSAndroid Build Coastguard Worker## CHECK: <<Val1:i\d+>> ArrayGet 393*795d594fSAndroid Build Coastguard Worker## CHECK-NEXT: ParallelMove moves:[{{.*->}}{{\d+}}(sp)] 394*795d594fSAndroid Build Coastguard Worker## CHECK: <<Val2:i\d+>> ArrayGet 395*795d594fSAndroid Build Coastguard Worker## CHECK-NEXT: ParallelMove moves:[{{.*->}}{{\d+}}(sp)] 396*795d594fSAndroid Build Coastguard Worker## CHECK: Phi [<<Val1>>,<<Val2>>] is_catch_phi:true 397*795d594fSAndroid Build Coastguard Worker 398*795d594fSAndroid Build Coastguard Worker.method public static testCatchPhi_singleSlot(ZZ)I 399*795d594fSAndroid Build Coastguard Worker .registers 6 400*795d594fSAndroid Build Coastguard Worker 401*795d594fSAndroid Build Coastguard Worker sget-object v0, LRuntime;->intArray:[I 402*795d594fSAndroid Build Coastguard Worker const/4 v1, 0 403*795d594fSAndroid Build Coastguard Worker aget v1, v0, v1 404*795d594fSAndroid Build Coastguard Worker const/4 v2, 1 405*795d594fSAndroid Build Coastguard Worker aget v2, v0, v2 406*795d594fSAndroid Build Coastguard Worker const/4 v3, 2 407*795d594fSAndroid Build Coastguard Worker aget v3, v0, v3 408*795d594fSAndroid Build Coastguard Worker 409*795d594fSAndroid Build Coastguard Worker # Insert a try/catch to force v1,v2,v3 to spill. 410*795d594fSAndroid Build Coastguard Worker :try_start_spill 411*795d594fSAndroid Build Coastguard Worker const/4 v0, 1 412*795d594fSAndroid Build Coastguard Worker invoke-static {v0}, LRuntime;->$noinline$ThrowIfTrue(Z)V 413*795d594fSAndroid Build Coastguard Worker :try_end_spill 414*795d594fSAndroid Build Coastguard Worker .catchall {:try_start_spill .. :try_end_spill} :catch_all_spill 415*795d594fSAndroid Build Coastguard Worker return v0 # Unreachable 416*795d594fSAndroid Build Coastguard Worker :catch_all_spill # Catch and continue 417*795d594fSAndroid Build Coastguard Worker 418*795d594fSAndroid Build Coastguard Worker :try_start 419*795d594fSAndroid Build Coastguard Worker move v0, v1 # Set catch phi value 420*795d594fSAndroid Build Coastguard Worker invoke-static {p0}, LRuntime;->$noinline$ThrowIfTrue(Z)V 421*795d594fSAndroid Build Coastguard Worker 422*795d594fSAndroid Build Coastguard Worker move v0, v2 # Set catch phi value 423*795d594fSAndroid Build Coastguard Worker invoke-static {p1}, LRuntime;->$noinline$ThrowIfTrue(Z)V 424*795d594fSAndroid Build Coastguard Worker :try_end 425*795d594fSAndroid Build Coastguard Worker .catchall {:try_start .. :try_end} :catch_all 426*795d594fSAndroid Build Coastguard Worker 427*795d594fSAndroid Build Coastguard Worker return v3 # Normal path return. 428*795d594fSAndroid Build Coastguard Worker 429*795d594fSAndroid Build Coastguard Worker :catch_all 430*795d594fSAndroid Build Coastguard Worker return v0 # Exceptional path #1/#2 return. 431*795d594fSAndroid Build Coastguard Worker.end method 432*795d594fSAndroid Build Coastguard Worker 433*795d594fSAndroid Build Coastguard Worker# Test catch-phi runtime support for 64-bit values stored on the stack. 434*795d594fSAndroid Build Coastguard Worker 435*795d594fSAndroid Build Coastguard Worker# Register pair (v0, v1) holds different double values at two throwing instructions. 436*795d594fSAndroid Build Coastguard Worker# These values were forced to spill by an always-throwing try/catch after their 437*795d594fSAndroid Build Coastguard Worker# definition. Runtime is expected to find their location in the stack map and 438*795d594fSAndroid Build Coastguard Worker# copy the value to the location of the catch phi. The value is converted to int 439*795d594fSAndroid Build Coastguard Worker# and returned. Values were chosen so that all 64 bits are used. 440*795d594fSAndroid Build Coastguard Worker 441*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Runtime.testCatchPhi_doubleSlot(boolean, boolean) register (after) 442*795d594fSAndroid Build Coastguard Worker## CHECK: <<Val1:d\d+>> ArrayGet 443*795d594fSAndroid Build Coastguard Worker## CHECK-NEXT: ParallelMove moves:[{{.*->}}2x{{\d+}}(sp)] 444*795d594fSAndroid Build Coastguard Worker## CHECK: <<Val2:d\d+>> ArrayGet 445*795d594fSAndroid Build Coastguard Worker## CHECK-NEXT: ParallelMove moves:[{{.*->}}2x{{\d+}}(sp)] 446*795d594fSAndroid Build Coastguard Worker## CHECK: Phi [<<Val1>>,<<Val2>>] is_catch_phi:true 447*795d594fSAndroid Build Coastguard Worker 448*795d594fSAndroid Build Coastguard Worker.method public static testCatchPhi_doubleSlot(ZZ)I 449*795d594fSAndroid Build Coastguard Worker .registers 10 450*795d594fSAndroid Build Coastguard Worker 451*795d594fSAndroid Build Coastguard Worker sget-object v0, LRuntime;->doubleArray:[D 452*795d594fSAndroid Build Coastguard Worker const/4 v2, 0 453*795d594fSAndroid Build Coastguard Worker aget-wide v2, v0, v2 454*795d594fSAndroid Build Coastguard Worker const/4 v4, 1 455*795d594fSAndroid Build Coastguard Worker aget-wide v4, v0, v4 456*795d594fSAndroid Build Coastguard Worker const/4 v6, 2 457*795d594fSAndroid Build Coastguard Worker aget-wide v6, v0, v6 458*795d594fSAndroid Build Coastguard Worker 459*795d594fSAndroid Build Coastguard Worker # Insert a try/catch to force (v2, v3), (v4, v5), (v6, v7) to spill. 460*795d594fSAndroid Build Coastguard Worker :try_start_spill 461*795d594fSAndroid Build Coastguard Worker const/4 v0, 1 462*795d594fSAndroid Build Coastguard Worker invoke-static {v0}, LRuntime;->$noinline$ThrowIfTrue(Z)V 463*795d594fSAndroid Build Coastguard Worker :try_end_spill 464*795d594fSAndroid Build Coastguard Worker .catchall {:try_start_spill .. :try_end_spill} :catch_all_spill 465*795d594fSAndroid Build Coastguard Worker return v0 # Unreachable 466*795d594fSAndroid Build Coastguard Worker :catch_all_spill # Catch and continue 467*795d594fSAndroid Build Coastguard Worker 468*795d594fSAndroid Build Coastguard Worker :try_start 469*795d594fSAndroid Build Coastguard Worker move-wide v0, v2 # Set catch phi value 470*795d594fSAndroid Build Coastguard Worker invoke-static {p0}, LRuntime;->$noinline$ThrowIfTrue(Z)V 471*795d594fSAndroid Build Coastguard Worker 472*795d594fSAndroid Build Coastguard Worker move-wide v0, v4 # Set catch phi value 473*795d594fSAndroid Build Coastguard Worker invoke-static {p1}, LRuntime;->$noinline$ThrowIfTrue(Z)V 474*795d594fSAndroid Build Coastguard Worker :try_end 475*795d594fSAndroid Build Coastguard Worker .catchall {:try_start .. :try_end} :catch_all 476*795d594fSAndroid Build Coastguard Worker 477*795d594fSAndroid Build Coastguard Worker double-to-int v6, v6 478*795d594fSAndroid Build Coastguard Worker return v6 # Normal path return. 479*795d594fSAndroid Build Coastguard Worker 480*795d594fSAndroid Build Coastguard Worker :catch_all 481*795d594fSAndroid Build Coastguard Worker double-to-int v0, v0 482*795d594fSAndroid Build Coastguard Worker return v0 # Exceptional path #1/#2 return. 483*795d594fSAndroid Build Coastguard Worker.end method 484*795d594fSAndroid Build Coastguard Worker 485*795d594fSAndroid Build Coastguard Worker 486*795d594fSAndroid Build Coastguard Worker 487*795d594fSAndroid Build Coastguard Worker# Helper methods and initialization. 488*795d594fSAndroid Build Coastguard Worker 489*795d594fSAndroid Build Coastguard Worker.method public static $noinline$ThrowIfTrue(Z)V 490*795d594fSAndroid Build Coastguard Worker .registers 2 491*795d594fSAndroid Build Coastguard Worker if-nez p0, :throw 492*795d594fSAndroid Build Coastguard Worker return-void 493*795d594fSAndroid Build Coastguard Worker 494*795d594fSAndroid Build Coastguard Worker :throw 495*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/Exception; 496*795d594fSAndroid Build Coastguard Worker invoke-direct {v0}, Ljava/lang/Exception;-><init>()V 497*795d594fSAndroid Build Coastguard Worker throw v0 498*795d594fSAndroid Build Coastguard Worker.end method 499*795d594fSAndroid Build Coastguard Worker 500*795d594fSAndroid Build Coastguard Worker.method public static constructor <clinit>()V 501*795d594fSAndroid Build Coastguard Worker .registers 2 502*795d594fSAndroid Build Coastguard Worker 503*795d594fSAndroid Build Coastguard Worker const/4 v1, 4 504*795d594fSAndroid Build Coastguard Worker 505*795d594fSAndroid Build Coastguard Worker new-array v0, v1, [I 506*795d594fSAndroid Build Coastguard Worker fill-array-data v0, :array_int 507*795d594fSAndroid Build Coastguard Worker sput-object v0, LRuntime;->intArray:[I 508*795d594fSAndroid Build Coastguard Worker 509*795d594fSAndroid Build Coastguard Worker new-array v0, v1, [J 510*795d594fSAndroid Build Coastguard Worker fill-array-data v0, :array_long 511*795d594fSAndroid Build Coastguard Worker sput-object v0, LRuntime;->longArray:[J 512*795d594fSAndroid Build Coastguard Worker 513*795d594fSAndroid Build Coastguard Worker new-array v0, v1, [F 514*795d594fSAndroid Build Coastguard Worker fill-array-data v0, :array_float 515*795d594fSAndroid Build Coastguard Worker sput-object v0, LRuntime;->floatArray:[F 516*795d594fSAndroid Build Coastguard Worker 517*795d594fSAndroid Build Coastguard Worker new-array v0, v1, [D 518*795d594fSAndroid Build Coastguard Worker fill-array-data v0, :array_double 519*795d594fSAndroid Build Coastguard Worker sput-object v0, LRuntime;->doubleArray:[D 520*795d594fSAndroid Build Coastguard Worker 521*795d594fSAndroid Build Coastguard Worker return-void 522*795d594fSAndroid Build Coastguard Worker 523*795d594fSAndroid Build Coastguard Worker:array_int 524*795d594fSAndroid Build Coastguard Worker.array-data 4 525*795d594fSAndroid Build Coastguard Worker 0x03 # int 3 526*795d594fSAndroid Build Coastguard Worker 0x08 # int 8 527*795d594fSAndroid Build Coastguard Worker 0x2a # int 42 528*795d594fSAndroid Build Coastguard Worker.end array-data 529*795d594fSAndroid Build Coastguard Worker 530*795d594fSAndroid Build Coastguard Worker:array_long 531*795d594fSAndroid Build Coastguard Worker.array-data 8 532*795d594fSAndroid Build Coastguard Worker 0x0000000100000002L # long (1 << 32) + 2 533*795d594fSAndroid Build Coastguard Worker 0x0000000500000003L # long (5 << 32) + 3 534*795d594fSAndroid Build Coastguard Worker 0x0000001e0000000cL # long (30 << 32) + 12 535*795d594fSAndroid Build Coastguard Worker.end array-data 536*795d594fSAndroid Build Coastguard Worker 537*795d594fSAndroid Build Coastguard Worker:array_float 538*795d594fSAndroid Build Coastguard Worker.array-data 4 539*795d594fSAndroid Build Coastguard Worker 0x40400000 # float 3 540*795d594fSAndroid Build Coastguard Worker 0x41000000 # float 8 541*795d594fSAndroid Build Coastguard Worker 0x42280000 # float 42 542*795d594fSAndroid Build Coastguard Worker.end array-data 543*795d594fSAndroid Build Coastguard Worker 544*795d594fSAndroid Build Coastguard Worker:array_double 545*795d594fSAndroid Build Coastguard Worker.array-data 8 546*795d594fSAndroid Build Coastguard Worker 0x400b333333333333L # double 3.4 547*795d594fSAndroid Build Coastguard Worker 0x4020cccccccccccdL # double 8.4 548*795d594fSAndroid Build Coastguard Worker 0x4045333333333333L # double 42.4 549*795d594fSAndroid Build Coastguard Worker.end array-data 550*795d594fSAndroid Build Coastguard Worker.end method 551*795d594fSAndroid Build Coastguard Worker 552*795d594fSAndroid Build Coastguard Worker 553*795d594fSAndroid Build Coastguard Worker## CHECK-START-{ARM,ARM64}: int Runtime.testIntAddressCatch(int, int[]) GVN$after_arch (after) 554*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Const1:i\d+>> IntConstant 1 555*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Offset:i\d+>> IntConstant 12 556*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<IndexParam:i\d+>> ParameterValue 557*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Array:l\d+>> ParameterValue 558*795d594fSAndroid Build Coastguard Worker 559*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<NullCh1:l\d+>> NullCheck [<<Array>>] 560*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Length:i\d+>> ArrayLength 561*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<BoundsCh1:i\d+>> BoundsCheck [<<IndexParam>>,<<Length>>] 562*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<IntAddr1:i\d+>> IntermediateAddress [<<NullCh1>>,<<Offset>>] 563*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: ArrayGet [<<IntAddr1>>,<<BoundsCh1>>] 564*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: TryBoundary 565*795d594fSAndroid Build Coastguard Worker 566*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Xplus1:i\d+>> Add [<<IndexParam>>,<<Const1>>] 567*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<BoundsCh2:i\d+>> BoundsCheck [<<Xplus1>>,<<Length>>] 568*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: ArrayGet [<<IntAddr1>>,<<BoundsCh2>>] 569*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: TryBoundary 570*795d594fSAndroid Build Coastguard Worker 571*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Phi:i\d+>> Phi [<<Xplus1>>] 572*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Phiplus1:i\d+>> Add [<<Phi>>,<<Const1>>] 573*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<BoundsCh3:i\d+>> BoundsCheck [<<Phiplus1>>,<<Length>>] 574*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<IntAddr3:i\d+>> IntermediateAddress [<<NullCh1>>,<<Offset>>] 575*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: ArrayGet [<<IntAddr3>>,<<BoundsCh3>>] 576*795d594fSAndroid Build Coastguard Worker 577*795d594fSAndroid Build Coastguard Worker## CHECK-START-{ARM,ARM64}: int Runtime.testIntAddressCatch(int, int[]) GVN$after_arch (after) 578*795d594fSAndroid Build Coastguard Worker## CHECK: NullCheck 579*795d594fSAndroid Build Coastguard Worker## CHECK-NOT: NullCheck 580*795d594fSAndroid Build Coastguard Worker 581*795d594fSAndroid Build Coastguard Worker## CHECK-START-{ARM,ARM64}: int Runtime.testIntAddressCatch(int, int[]) GVN$after_arch (after) 582*795d594fSAndroid Build Coastguard Worker## CHECK: IntermediateAddress 583*795d594fSAndroid Build Coastguard Worker## CHECK: IntermediateAddress 584*795d594fSAndroid Build Coastguard Worker## CHECK-NOT: IntermediateAddress 585*795d594fSAndroid Build Coastguard Worker 586*795d594fSAndroid Build Coastguard Worker## CHECK-START-{ARM,ARM64}: int Runtime.testIntAddressCatch(int, int[]) GVN$after_arch (after) 587*795d594fSAndroid Build Coastguard Worker## CHECK: BoundsCheck 588*795d594fSAndroid Build Coastguard Worker## CHECK: BoundsCheck 589*795d594fSAndroid Build Coastguard Worker## CHECK: BoundsCheck 590*795d594fSAndroid Build Coastguard Worker## CHECK-NOT: BoundsCheck 591*795d594fSAndroid Build Coastguard Worker 592*795d594fSAndroid Build Coastguard Worker## CHECK-START-{ARM,ARM64}: int Runtime.testIntAddressCatch(int, int[]) GVN$after_arch (after) 593*795d594fSAndroid Build Coastguard Worker## CHECK: ArrayGet 594*795d594fSAndroid Build Coastguard Worker## CHECK: ArrayGet 595*795d594fSAndroid Build Coastguard Worker## CHECK: ArrayGet 596*795d594fSAndroid Build Coastguard Worker## CHECK-NOT: ArrayGet 597*795d594fSAndroid Build Coastguard Worker.method public static testIntAddressCatch(I[I)I 598*795d594fSAndroid Build Coastguard Worker .registers 4 599*795d594fSAndroid Build Coastguard Worker aget v0, p1, p0 600*795d594fSAndroid Build Coastguard Worker add-int v1, v0, v0 601*795d594fSAndroid Build Coastguard Worker 602*795d594fSAndroid Build Coastguard Worker :try_start 603*795d594fSAndroid Build Coastguard Worker const/4 v0, 0x1 604*795d594fSAndroid Build Coastguard Worker add-int p0, p0, v0 605*795d594fSAndroid Build Coastguard Worker aget v0, p1, p0 606*795d594fSAndroid Build Coastguard Worker 607*795d594fSAndroid Build Coastguard Worker :try_end 608*795d594fSAndroid Build Coastguard Worker .catch Ljava/lang/ArithmException; {:try_start .. :try_end} :catch_block 609*795d594fSAndroid Build Coastguard Worker 610*795d594fSAndroid Build Coastguard Worker :return 611*795d594fSAndroid Build Coastguard Worker add-int v1, v1, v0 612*795d594fSAndroid Build Coastguard Worker return v1 613*795d594fSAndroid Build Coastguard Worker 614*795d594fSAndroid Build Coastguard Worker :catch_block 615*795d594fSAndroid Build Coastguard Worker const/4 v0, 0x1 616*795d594fSAndroid Build Coastguard Worker add-int p0, p0, v0 617*795d594fSAndroid Build Coastguard Worker aget v0, p1, p0 618*795d594fSAndroid Build Coastguard Worker 619*795d594fSAndroid Build Coastguard Worker goto :return 620*795d594fSAndroid Build Coastguard Worker.end method 621*795d594fSAndroid Build Coastguard Worker 622*795d594fSAndroid Build Coastguard Worker.field public static intArray:[I 623*795d594fSAndroid Build Coastguard Worker.field public static longArray:[J 624*795d594fSAndroid Build Coastguard Worker.field public static floatArray:[F 625*795d594fSAndroid Build Coastguard Worker.field public static doubleArray:[D 626