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