xref: /aosp_15_r20/art/test/510-checker-try-catch/smali/Runtime.smali (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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