xref: /aosp_15_r20/art/test/458-checker-instruct-simplification/smali/SmaliTests.smali (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2016 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 LSmaliTests;
16*795d594fSAndroid Build Coastguard Worker.super Ljava/lang/Object;
17*795d594fSAndroid Build Coastguard Worker
18*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.EqualTrueRhs(boolean) instruction_simplifier (before)
19*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>      ParameterValue
20*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
21*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Cond:z\d+>>     Equal [<<Arg>>,<<Const1>>]
22*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       If [<<Cond>>]
23*795d594fSAndroid Build Coastguard Worker
24*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.EqualTrueRhs(boolean) instruction_simplifier (after)
25*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>      ParameterValue
26*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       If [<<Arg>>]
27*795d594fSAndroid Build Coastguard Worker
28*795d594fSAndroid Build Coastguard Worker.method public static EqualTrueRhs(Z)I
29*795d594fSAndroid Build Coastguard Worker  .registers 3
30*795d594fSAndroid Build Coastguard Worker
31*795d594fSAndroid Build Coastguard Worker  const v0, 0x1
32*795d594fSAndroid Build Coastguard Worker  const v1, 0x5
33*795d594fSAndroid Build Coastguard Worker  if-eq p0, v0, :return
34*795d594fSAndroid Build Coastguard Worker  const v1, 0x3
35*795d594fSAndroid Build Coastguard Worker  :return
36*795d594fSAndroid Build Coastguard Worker  return v1
37*795d594fSAndroid Build Coastguard Worker
38*795d594fSAndroid Build Coastguard Worker.end method
39*795d594fSAndroid Build Coastguard Worker
40*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.EqualTrueLhs(boolean) instruction_simplifier (before)
41*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>      ParameterValue
42*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
43*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Cond:z\d+>>     Equal [<<Const1>>,<<Arg>>]
44*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       If [<<Cond>>]
45*795d594fSAndroid Build Coastguard Worker
46*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.EqualTrueLhs(boolean) instruction_simplifier (after)
47*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>      ParameterValue
48*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       If [<<Arg>>]
49*795d594fSAndroid Build Coastguard Worker
50*795d594fSAndroid Build Coastguard Worker.method public static EqualTrueLhs(Z)I
51*795d594fSAndroid Build Coastguard Worker  .registers 3
52*795d594fSAndroid Build Coastguard Worker
53*795d594fSAndroid Build Coastguard Worker  const v0, 0x1
54*795d594fSAndroid Build Coastguard Worker  const v1, 0x5
55*795d594fSAndroid Build Coastguard Worker  if-eq v0, p0, :return
56*795d594fSAndroid Build Coastguard Worker  const v1, 0x3
57*795d594fSAndroid Build Coastguard Worker  :return
58*795d594fSAndroid Build Coastguard Worker  return v1
59*795d594fSAndroid Build Coastguard Worker
60*795d594fSAndroid Build Coastguard Worker.end method
61*795d594fSAndroid Build Coastguard Worker
62*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.EqualFalseRhs(boolean) instruction_simplifier (before)
63*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>      ParameterValue
64*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
65*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Cond:z\d+>>     Equal [<<Arg>>,<<Const0>>]
66*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       If [<<Cond>>]
67*795d594fSAndroid Build Coastguard Worker
68*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.EqualFalseRhs(boolean) instruction_simplifier (after)
69*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>      ParameterValue
70*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       If [<<Arg>>]
71*795d594fSAndroid Build Coastguard Worker
72*795d594fSAndroid Build Coastguard Worker.method public static EqualFalseRhs(Z)I
73*795d594fSAndroid Build Coastguard Worker  .registers 3
74*795d594fSAndroid Build Coastguard Worker
75*795d594fSAndroid Build Coastguard Worker  const v0, 0x0
76*795d594fSAndroid Build Coastguard Worker  const v1, 0x3
77*795d594fSAndroid Build Coastguard Worker  if-eq p0, v0, :return
78*795d594fSAndroid Build Coastguard Worker  const v1, 0x5
79*795d594fSAndroid Build Coastguard Worker  :return
80*795d594fSAndroid Build Coastguard Worker  return v1
81*795d594fSAndroid Build Coastguard Worker
82*795d594fSAndroid Build Coastguard Worker.end method
83*795d594fSAndroid Build Coastguard Worker
84*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.EqualFalseLhs(boolean) instruction_simplifier (before)
85*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>      ParameterValue
86*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
87*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Cond:z\d+>>     Equal [<<Const0>>,<<Arg>>]
88*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       If [<<Cond>>]
89*795d594fSAndroid Build Coastguard Worker
90*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.EqualFalseLhs(boolean) instruction_simplifier (after)
91*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>      ParameterValue
92*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       If [<<Arg>>]
93*795d594fSAndroid Build Coastguard Worker
94*795d594fSAndroid Build Coastguard Worker.method public static EqualFalseLhs(Z)I
95*795d594fSAndroid Build Coastguard Worker  .registers 3
96*795d594fSAndroid Build Coastguard Worker
97*795d594fSAndroid Build Coastguard Worker  const v0, 0x0
98*795d594fSAndroid Build Coastguard Worker  const v1, 0x3
99*795d594fSAndroid Build Coastguard Worker  if-eq v0, p0, :return
100*795d594fSAndroid Build Coastguard Worker  const v1, 0x5
101*795d594fSAndroid Build Coastguard Worker  :return
102*795d594fSAndroid Build Coastguard Worker  return v1
103*795d594fSAndroid Build Coastguard Worker
104*795d594fSAndroid Build Coastguard Worker.end method
105*795d594fSAndroid Build Coastguard Worker
106*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.NotEqualTrueRhs(boolean) instruction_simplifier (before)
107*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>      ParameterValue
108*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
109*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Cond:z\d+>>     NotEqual [<<Arg>>,<<Const1>>]
110*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       If [<<Cond>>]
111*795d594fSAndroid Build Coastguard Worker
112*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.NotEqualTrueRhs(boolean) instruction_simplifier (after)
113*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>      ParameterValue
114*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       If [<<Arg>>]
115*795d594fSAndroid Build Coastguard Worker
116*795d594fSAndroid Build Coastguard Worker.method public static NotEqualTrueRhs(Z)I
117*795d594fSAndroid Build Coastguard Worker  .registers 3
118*795d594fSAndroid Build Coastguard Worker
119*795d594fSAndroid Build Coastguard Worker  const v0, 0x1
120*795d594fSAndroid Build Coastguard Worker  const v1, 0x3
121*795d594fSAndroid Build Coastguard Worker  if-ne p0, v0, :return
122*795d594fSAndroid Build Coastguard Worker  const v1, 0x5
123*795d594fSAndroid Build Coastguard Worker  :return
124*795d594fSAndroid Build Coastguard Worker  return v1
125*795d594fSAndroid Build Coastguard Worker
126*795d594fSAndroid Build Coastguard Worker.end method
127*795d594fSAndroid Build Coastguard Worker
128*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.NotEqualTrueLhs(boolean) instruction_simplifier (before)
129*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>      ParameterValue
130*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const1:i\d+>>   IntConstant 1
131*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Cond:z\d+>>     NotEqual [<<Const1>>,<<Arg>>]
132*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       If [<<Cond>>]
133*795d594fSAndroid Build Coastguard Worker
134*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.NotEqualTrueLhs(boolean) instruction_simplifier (after)
135*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>      ParameterValue
136*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       If [<<Arg>>]
137*795d594fSAndroid Build Coastguard Worker
138*795d594fSAndroid Build Coastguard Worker.method public static NotEqualTrueLhs(Z)I
139*795d594fSAndroid Build Coastguard Worker  .registers 3
140*795d594fSAndroid Build Coastguard Worker
141*795d594fSAndroid Build Coastguard Worker  const v0, 0x1
142*795d594fSAndroid Build Coastguard Worker  const v1, 0x3
143*795d594fSAndroid Build Coastguard Worker  if-ne v0, p0, :return
144*795d594fSAndroid Build Coastguard Worker  const v1, 0x5
145*795d594fSAndroid Build Coastguard Worker  :return
146*795d594fSAndroid Build Coastguard Worker  return v1
147*795d594fSAndroid Build Coastguard Worker
148*795d594fSAndroid Build Coastguard Worker.end method
149*795d594fSAndroid Build Coastguard Worker
150*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.NotEqualFalseRhs(boolean) instruction_simplifier (before)
151*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>      ParameterValue
152*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
153*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Cond:z\d+>>     NotEqual [<<Arg>>,<<Const0>>]
154*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       If [<<Cond>>]
155*795d594fSAndroid Build Coastguard Worker
156*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.NotEqualFalseRhs(boolean) instruction_simplifier (after)
157*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>      ParameterValue
158*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       If [<<Arg>>]
159*795d594fSAndroid Build Coastguard Worker
160*795d594fSAndroid Build Coastguard Worker.method public static NotEqualFalseRhs(Z)I
161*795d594fSAndroid Build Coastguard Worker  .registers 3
162*795d594fSAndroid Build Coastguard Worker
163*795d594fSAndroid Build Coastguard Worker  const v0, 0x0
164*795d594fSAndroid Build Coastguard Worker  const v1, 0x5
165*795d594fSAndroid Build Coastguard Worker  if-ne p0, v0, :return
166*795d594fSAndroid Build Coastguard Worker  const v1, 0x3
167*795d594fSAndroid Build Coastguard Worker  :return
168*795d594fSAndroid Build Coastguard Worker  return v1
169*795d594fSAndroid Build Coastguard Worker
170*795d594fSAndroid Build Coastguard Worker.end method
171*795d594fSAndroid Build Coastguard Worker
172*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.NotEqualFalseLhs(boolean) instruction_simplifier (before)
173*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>      ParameterValue
174*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const0:i\d+>>   IntConstant 0
175*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Cond:z\d+>>     NotEqual [<<Const0>>,<<Arg>>]
176*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       If [<<Cond>>]
177*795d594fSAndroid Build Coastguard Worker
178*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.NotEqualFalseLhs(boolean) instruction_simplifier (after)
179*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>      ParameterValue
180*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       If [<<Arg>>]
181*795d594fSAndroid Build Coastguard Worker
182*795d594fSAndroid Build Coastguard Worker.method public static NotEqualFalseLhs(Z)I
183*795d594fSAndroid Build Coastguard Worker  .registers 3
184*795d594fSAndroid Build Coastguard Worker
185*795d594fSAndroid Build Coastguard Worker  const v0, 0x0
186*795d594fSAndroid Build Coastguard Worker  const v1, 0x5
187*795d594fSAndroid Build Coastguard Worker  if-ne v0, p0, :return
188*795d594fSAndroid Build Coastguard Worker  const v1, 0x3
189*795d594fSAndroid Build Coastguard Worker  :return
190*795d594fSAndroid Build Coastguard Worker  return v1
191*795d594fSAndroid Build Coastguard Worker
192*795d594fSAndroid Build Coastguard Worker.end method
193*795d594fSAndroid Build Coastguard Worker
194*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.AddSubConst(int) instruction_simplifier (before)
195*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<ArgValue:i\d+>>  ParameterValue
196*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const7:i\d+>>    IntConstant 7
197*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const8:i\d+>>    IntConstant 8
198*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Add:i\d+>>       Add [<<ArgValue>>,<<Const7>>]
199*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Sub:i\d+>>       Sub [<<Add>>,<<Const8>>]
200*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                        Return [<<Sub>>]
201*795d594fSAndroid Build Coastguard Worker
202*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.AddSubConst(int) instruction_simplifier (after)
203*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<ArgValue:i\d+>>  ParameterValue
204*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<ConstM1:i\d+>>   IntConstant -1
205*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Add:i\d+>>       Add [<<ArgValue>>,<<ConstM1>>]
206*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                        Return [<<Add>>]
207*795d594fSAndroid Build Coastguard Worker
208*795d594fSAndroid Build Coastguard Worker.method public static AddSubConst(I)I
209*795d594fSAndroid Build Coastguard Worker    .registers 3
210*795d594fSAndroid Build Coastguard Worker
211*795d594fSAndroid Build Coastguard Worker    .prologue
212*795d594fSAndroid Build Coastguard Worker    add-int/lit8 v0, p0, 7
213*795d594fSAndroid Build Coastguard Worker
214*795d594fSAndroid Build Coastguard Worker    const/16 v1, 8
215*795d594fSAndroid Build Coastguard Worker
216*795d594fSAndroid Build Coastguard Worker    sub-int v0, v0, v1
217*795d594fSAndroid Build Coastguard Worker
218*795d594fSAndroid Build Coastguard Worker    return v0
219*795d594fSAndroid Build Coastguard Worker.end method
220*795d594fSAndroid Build Coastguard Worker
221*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.SubAddConst(int) instruction_simplifier (before)
222*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<ArgValue:i\d+>>  ParameterValue
223*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const3:i\d+>>    IntConstant 3
224*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const4:i\d+>>    IntConstant 4
225*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Sub:i\d+>>       Sub [<<ArgValue>>,<<Const3>>]
226*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Add:i\d+>>       Add [<<Sub>>,<<Const4>>]
227*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                        Return [<<Add>>]
228*795d594fSAndroid Build Coastguard Worker
229*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.SubAddConst(int) instruction_simplifier (after)
230*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<ArgValue:i\d+>>  ParameterValue
231*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const1:i\d+>>    IntConstant 1
232*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Add:i\d+>>       Add [<<ArgValue>>,<<Const1>>]
233*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                        Return [<<Add>>]
234*795d594fSAndroid Build Coastguard Worker
235*795d594fSAndroid Build Coastguard Worker.method public static SubAddConst(I)I
236*795d594fSAndroid Build Coastguard Worker    .registers 2
237*795d594fSAndroid Build Coastguard Worker
238*795d594fSAndroid Build Coastguard Worker    .prologue
239*795d594fSAndroid Build Coastguard Worker    const/4 v0, 3
240*795d594fSAndroid Build Coastguard Worker
241*795d594fSAndroid Build Coastguard Worker    sub-int v0, p0, v0
242*795d594fSAndroid Build Coastguard Worker
243*795d594fSAndroid Build Coastguard Worker    add-int/lit8 v0, v0, 4
244*795d594fSAndroid Build Coastguard Worker
245*795d594fSAndroid Build Coastguard Worker    return v0
246*795d594fSAndroid Build Coastguard Worker.end method
247*795d594fSAndroid Build Coastguard Worker
248*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.SubSubConst1(int) instruction_simplifier (before)
249*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<ArgValue:i\d+>>  ParameterValue
250*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const9:i\d+>>    IntConstant 9
251*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const10:i\d+>>   IntConstant 10
252*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Sub1:i\d+>>      Sub [<<ArgValue>>,<<Const9>>]
253*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Sub2:i\d+>>      Sub [<<Sub1>>,<<Const10>>]
254*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                        Return [<<Sub2>>]
255*795d594fSAndroid Build Coastguard Worker
256*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.SubSubConst1(int) instruction_simplifier (after)
257*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<ArgValue:i\d+>>  ParameterValue
258*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<ConstM19:i\d+>>  IntConstant -19
259*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Add:i\d+>>       Add [<<ArgValue>>,<<ConstM19>>]
260*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                        Return [<<Add>>]
261*795d594fSAndroid Build Coastguard Worker
262*795d594fSAndroid Build Coastguard Worker.method public static SubSubConst1(I)I
263*795d594fSAndroid Build Coastguard Worker    .registers 3
264*795d594fSAndroid Build Coastguard Worker
265*795d594fSAndroid Build Coastguard Worker    .prologue
266*795d594fSAndroid Build Coastguard Worker    const/16 v1, 9
267*795d594fSAndroid Build Coastguard Worker
268*795d594fSAndroid Build Coastguard Worker    sub-int v0, p0, v1
269*795d594fSAndroid Build Coastguard Worker
270*795d594fSAndroid Build Coastguard Worker    const/16 v1, 10
271*795d594fSAndroid Build Coastguard Worker
272*795d594fSAndroid Build Coastguard Worker    sub-int v0, v0, v1
273*795d594fSAndroid Build Coastguard Worker
274*795d594fSAndroid Build Coastguard Worker    return v0
275*795d594fSAndroid Build Coastguard Worker.end method
276*795d594fSAndroid Build Coastguard Worker
277*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.SubSubConst2(int) instruction_simplifier (before)
278*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<ArgValue:i\d+>>  ParameterValue
279*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const11:i\d+>>   IntConstant 11
280*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const12:i\d+>>   IntConstant 12
281*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Sub1:i\d+>>      Sub [<<Const11>>,<<ArgValue>>]
282*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Sub2:i\d+>>      Sub [<<Sub1>>,<<Const12>>]
283*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                        Return [<<Sub2>>]
284*795d594fSAndroid Build Coastguard Worker
285*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.SubSubConst2(int) instruction_simplifier (after)
286*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<ArgValue:i\d+>>  ParameterValue
287*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<ConstM1:i\d+>>   IntConstant -1
288*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Sub:i\d+>>       Sub [<<ConstM1>>,<<ArgValue>>]
289*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                        Return [<<Sub>>]
290*795d594fSAndroid Build Coastguard Worker
291*795d594fSAndroid Build Coastguard Worker.method public static SubSubConst2(I)I
292*795d594fSAndroid Build Coastguard Worker    .registers 3
293*795d594fSAndroid Build Coastguard Worker
294*795d594fSAndroid Build Coastguard Worker    .prologue
295*795d594fSAndroid Build Coastguard Worker    rsub-int/lit8 v0, p0, 11
296*795d594fSAndroid Build Coastguard Worker
297*795d594fSAndroid Build Coastguard Worker    const/16 v1, 12
298*795d594fSAndroid Build Coastguard Worker
299*795d594fSAndroid Build Coastguard Worker    sub-int v0, v0, v1
300*795d594fSAndroid Build Coastguard Worker
301*795d594fSAndroid Build Coastguard Worker    return v0
302*795d594fSAndroid Build Coastguard Worker.end method
303*795d594fSAndroid Build Coastguard Worker
304*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.SubSubConst3(int) instruction_simplifier (before)
305*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<ArgValue:i\d+>>  ParameterValue
306*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const15:i\d+>>   IntConstant 15
307*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const16:i\d+>>   IntConstant 16
308*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Sub1:i\d+>>      Sub [<<ArgValue>>,<<Const16>>]
309*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Sub2:i\d+>>      Sub [<<Const15>>,<<Sub1>>]
310*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                        Return [<<Sub2>>]
311*795d594fSAndroid Build Coastguard Worker
312*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.SubSubConst3(int) instruction_simplifier (after)
313*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<ArgValue:i\d+>>  ParameterValue
314*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const31:i\d+>>   IntConstant 31
315*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Sub:i\d+>>       Sub [<<Const31>>,<<ArgValue>>]
316*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                        Return [<<Sub>>]
317*795d594fSAndroid Build Coastguard Worker
318*795d594fSAndroid Build Coastguard Worker.method public static SubSubConst3(I)I
319*795d594fSAndroid Build Coastguard Worker    .registers 2
320*795d594fSAndroid Build Coastguard Worker
321*795d594fSAndroid Build Coastguard Worker    .prologue
322*795d594fSAndroid Build Coastguard Worker    const/16 v0, 16
323*795d594fSAndroid Build Coastguard Worker
324*795d594fSAndroid Build Coastguard Worker    sub-int v0, p0, v0
325*795d594fSAndroid Build Coastguard Worker
326*795d594fSAndroid Build Coastguard Worker    rsub-int/lit8 v0, v0, 15
327*795d594fSAndroid Build Coastguard Worker
328*795d594fSAndroid Build Coastguard Worker    return v0
329*795d594fSAndroid Build Coastguard Worker.end method
330*795d594fSAndroid Build Coastguard Worker
331*795d594fSAndroid Build Coastguard Worker# Test simplification of the `~~var` pattern.
332*795d594fSAndroid Build Coastguard Worker# The transformation tested is implemented in `InstructionSimplifierVisitor::VisitNot`.
333*795d594fSAndroid Build Coastguard Worker
334*795d594fSAndroid Build Coastguard Worker## CHECK-START: long SmaliTests.$noinline$NotNot1(long) instruction_simplifier (before)
335*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:j\d+>>      ParameterValue
336*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Not1:j\d+>>     Not [<<Arg>>]
337*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Not2:j\d+>>     Not [<<Not1>>]
338*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       Return [<<Not2>>]
339*795d594fSAndroid Build Coastguard Worker
340*795d594fSAndroid Build Coastguard Worker## CHECK-START: long SmaliTests.$noinline$NotNot1(long) instruction_simplifier (after)
341*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:j\d+>>      ParameterValue
342*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       Return [<<Arg>>]
343*795d594fSAndroid Build Coastguard Worker
344*795d594fSAndroid Build Coastguard Worker## CHECK-START: long SmaliTests.$noinline$NotNot1(long) instruction_simplifier (after)
345*795d594fSAndroid Build Coastguard Worker## CHECK-NOT:                       Not
346*795d594fSAndroid Build Coastguard Worker
347*795d594fSAndroid Build Coastguard Worker.method public static $noinline$NotNot1(J)J
348*795d594fSAndroid Build Coastguard Worker    .registers 4
349*795d594fSAndroid Build Coastguard Worker    .param p0, "arg"    # J
350*795d594fSAndroid Build Coastguard Worker
351*795d594fSAndroid Build Coastguard Worker    .prologue
352*795d594fSAndroid Build Coastguard Worker
353*795d594fSAndroid Build Coastguard Worker    # return ~~arg
354*795d594fSAndroid Build Coastguard Worker    not-long v0, p0
355*795d594fSAndroid Build Coastguard Worker    not-long v0, v0
356*795d594fSAndroid Build Coastguard Worker    return-wide v0
357*795d594fSAndroid Build Coastguard Worker.end method
358*795d594fSAndroid Build Coastguard Worker
359*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.$noinline$NotNot2(int) instruction_simplifier (before)
360*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:i\d+>>      ParameterValue
361*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Not1:i\d+>>     Not [<<Arg>>]
362*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Not2:i\d+>>     Not [<<Not1>>]
363*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Add:i\d+>>      Add [<<Not2>>,<<Not1>>]
364*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       Return [<<Add>>]
365*795d594fSAndroid Build Coastguard Worker
366*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.$noinline$NotNot2(int) instruction_simplifier (after)
367*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:i\d+>>      ParameterValue
368*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Not:i\d+>>      Not [<<Arg>>]
369*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Add:i\d+>>      Add [<<Arg>>,<<Not>>]
370*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                       Return [<<Add>>]
371*795d594fSAndroid Build Coastguard Worker
372*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.$noinline$NotNot2(int) instruction_simplifier (after)
373*795d594fSAndroid Build Coastguard Worker## CHECK:                           Not
374*795d594fSAndroid Build Coastguard Worker## CHECK-NOT:                       Not
375*795d594fSAndroid Build Coastguard Worker
376*795d594fSAndroid Build Coastguard Worker.method public static $noinline$NotNot2(I)I
377*795d594fSAndroid Build Coastguard Worker    .registers 3
378*795d594fSAndroid Build Coastguard Worker    .param p0, "arg"    # I
379*795d594fSAndroid Build Coastguard Worker
380*795d594fSAndroid Build Coastguard Worker    .prologue
381*795d594fSAndroid Build Coastguard Worker
382*795d594fSAndroid Build Coastguard Worker    # temp = ~arg; return temp + ~temp;
383*795d594fSAndroid Build Coastguard Worker    not-int v0, p0
384*795d594fSAndroid Build Coastguard Worker    not-int v1, v0
385*795d594fSAndroid Build Coastguard Worker    add-int/2addr v1, v0
386*795d594fSAndroid Build Coastguard Worker
387*795d594fSAndroid Build Coastguard Worker    return v1
388*795d594fSAndroid Build Coastguard Worker.end method
389*795d594fSAndroid Build Coastguard Worker
390*795d594fSAndroid Build Coastguard Worker# Test simplification of double Boolean negation. Note that sometimes
391*795d594fSAndroid Build Coastguard Worker# both negations can be removed but we only expect the simplifier to
392*795d594fSAndroid Build Coastguard Worker# remove the second.
393*795d594fSAndroid Build Coastguard Worker
394*795d594fSAndroid Build Coastguard Worker## CHECK-START: boolean SmaliTests.$noinline$NotNotBool(boolean) instruction_simplifier (before)
395*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>       ParameterValue
396*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Const1:i\d+>>    IntConstant 1
397*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Result:z\d+>>    InvokeStaticOrDirect
398*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<NotResult:i\d+>> Xor [<<Result>>,<<Const1>>]
399*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                        Return [<<NotResult>>]
400*795d594fSAndroid Build Coastguard Worker
401*795d594fSAndroid Build Coastguard Worker## CHECK-START: boolean SmaliTests.$noinline$NotNotBool(boolean) instruction_simplifier (after)
402*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>       ParameterValue
403*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Result:z\d+>>    InvokeStaticOrDirect
404*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<NotResult:z\d+>> BooleanNot [<<Result>>]
405*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                        Return [<<NotResult>>]
406*795d594fSAndroid Build Coastguard Worker
407*795d594fSAndroid Build Coastguard Worker## CHECK-START: boolean SmaliTests.$noinline$NotNotBool(boolean) instruction_simplifier$after_inlining (before)
408*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>       ParameterValue
409*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<NotArg:z\d+>>    BooleanNot [<<Arg>>]
410*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<NotNotArg:z\d+>> BooleanNot [<<NotArg>>]
411*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                        Return [<<NotNotArg>>]
412*795d594fSAndroid Build Coastguard Worker
413*795d594fSAndroid Build Coastguard Worker## CHECK-START: boolean SmaliTests.$noinline$NotNotBool(boolean) instruction_simplifier$after_inlining (after)
414*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>       ParameterValue
415*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<NotArg:z\d+>>    BooleanNot [<<Arg>>]
416*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                        Return [<<Arg>>]
417*795d594fSAndroid Build Coastguard Worker
418*795d594fSAndroid Build Coastguard Worker## CHECK-START: boolean SmaliTests.$noinline$NotNotBool(boolean) dead_code_elimination$before_codegen (after)
419*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:     <<Arg:z\d+>>       ParameterValue
420*795d594fSAndroid Build Coastguard Worker## CHECK-DAG:                        Return [<<Arg>>]
421*795d594fSAndroid Build Coastguard Worker
422*795d594fSAndroid Build Coastguard Worker.method public static NegateValue(Z)Z
423*795d594fSAndroid Build Coastguard Worker    .registers 2
424*795d594fSAndroid Build Coastguard Worker    .param p0, "arg"    # Z
425*795d594fSAndroid Build Coastguard Worker
426*795d594fSAndroid Build Coastguard Worker    .prologue
427*795d594fSAndroid Build Coastguard Worker
428*795d594fSAndroid Build Coastguard Worker    # return !arg
429*795d594fSAndroid Build Coastguard Worker    xor-int/lit8 v0, p0, 0x1
430*795d594fSAndroid Build Coastguard Worker    return v0
431*795d594fSAndroid Build Coastguard Worker.end method
432*795d594fSAndroid Build Coastguard Worker
433*795d594fSAndroid Build Coastguard Worker
434*795d594fSAndroid Build Coastguard Worker.method public static $noinline$NotNotBool(Z)Z
435*795d594fSAndroid Build Coastguard Worker    .registers 2
436*795d594fSAndroid Build Coastguard Worker    .param p0, "arg"    # Z
437*795d594fSAndroid Build Coastguard Worker
438*795d594fSAndroid Build Coastguard Worker    .prologue
439*795d594fSAndroid Build Coastguard Worker
440*795d594fSAndroid Build Coastguard Worker    # return !Negate(arg)
441*795d594fSAndroid Build Coastguard Worker    invoke-static {p0}, LSmaliTests;->NegateValue(Z)Z
442*795d594fSAndroid Build Coastguard Worker    move-result v0
443*795d594fSAndroid Build Coastguard Worker    xor-int/lit8 v0, v0, 0x1
444*795d594fSAndroid Build Coastguard Worker
445*795d594fSAndroid Build Coastguard Worker    return v0
446*795d594fSAndroid Build Coastguard Worker.end method
447