1*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2017 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# static fields 19*795d594fSAndroid Build Coastguard Worker.field public static booleanField:Z 20*795d594fSAndroid Build Coastguard Worker 21*795d594fSAndroid Build Coastguard Worker.method static constructor <clinit>()V 22*795d594fSAndroid Build Coastguard Worker .registers 1 23*795d594fSAndroid Build Coastguard Worker 24*795d594fSAndroid Build Coastguard Worker .prologue 25*795d594fSAndroid Build Coastguard Worker const/4 v0, 0x1 26*795d594fSAndroid Build Coastguard Worker 27*795d594fSAndroid Build Coastguard Worker # booleanField = true 28*795d594fSAndroid Build Coastguard Worker sput-boolean v0, LSmaliTests;->booleanField:Z 29*795d594fSAndroid Build Coastguard Worker 30*795d594fSAndroid Build Coastguard Worker return-void 31*795d594fSAndroid Build Coastguard Worker.end method 32*795d594fSAndroid Build Coastguard Worker 33*795d594fSAndroid Build Coastguard Worker## CHECK-START: byte SmaliTests.booleanToByte(boolean) builder (after) 34*795d594fSAndroid Build Coastguard Worker## CHECK: <<Arg:z\d+>> ParameterValue 35*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 36*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<One:i\d+>> IntConstant 1 37*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cond:z\d+>> Equal [<<Arg>>,<<Zero>>] 38*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<Cond>>] 39*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Phi:i\d+>> Phi [<<One>>,<<Zero>>] 40*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<IToS:b\d+>> TypeConversion [<<Phi>>] 41*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<IToS>>] 42*795d594fSAndroid Build Coastguard Worker 43*795d594fSAndroid Build Coastguard Worker## CHECK-START: byte SmaliTests.booleanToByte(boolean) select_generator (after) 44*795d594fSAndroid Build Coastguard Worker## CHECK: <<Arg:z\d+>> ParameterValue 45*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 46*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<One:i\d+>> IntConstant 1 47*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Sel:i\d+>> Select [<<Zero>>,<<One>>,<<Arg>>] 48*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<IToS:b\d+>> TypeConversion [<<Sel>>] 49*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<IToS>>] 50*795d594fSAndroid Build Coastguard Worker 51*795d594fSAndroid Build Coastguard Worker## CHECK-START: byte SmaliTests.booleanToByte(boolean) instruction_simplifier$before_codegen (after) 52*795d594fSAndroid Build Coastguard Worker## CHECK: <<Arg:z\d+>> ParameterValue 53*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<Arg>>] 54*795d594fSAndroid Build Coastguard Worker.method static booleanToByte(Z)B 55*795d594fSAndroid Build Coastguard Worker .registers 2 56*795d594fSAndroid Build Coastguard Worker if-eqz p0, :cond_5 57*795d594fSAndroid Build Coastguard Worker const/4 v0, 0x1 58*795d594fSAndroid Build Coastguard Worker 59*795d594fSAndroid Build Coastguard Worker :goto_3 60*795d594fSAndroid Build Coastguard Worker int-to-byte v0, v0 61*795d594fSAndroid Build Coastguard Worker return v0 62*795d594fSAndroid Build Coastguard Worker 63*795d594fSAndroid Build Coastguard Worker :cond_5 64*795d594fSAndroid Build Coastguard Worker const/4 v0, 0x0 65*795d594fSAndroid Build Coastguard Worker goto :goto_3 66*795d594fSAndroid Build Coastguard Worker.end method 67*795d594fSAndroid Build Coastguard Worker 68*795d594fSAndroid Build Coastguard Worker## CHECK-START: short SmaliTests.booleanToShort(boolean) builder (after) 69*795d594fSAndroid Build Coastguard Worker## CHECK: <<Arg:z\d+>> ParameterValue 70*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 71*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<One:i\d+>> IntConstant 1 72*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cond:z\d+>> Equal [<<Arg>>,<<Zero>>] 73*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<Cond>>] 74*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Phi:i\d+>> Phi [<<One>>,<<Zero>>] 75*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<IToS:s\d+>> TypeConversion [<<Phi>>] 76*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<IToS>>] 77*795d594fSAndroid Build Coastguard Worker 78*795d594fSAndroid Build Coastguard Worker## CHECK-START: short SmaliTests.booleanToShort(boolean) select_generator (after) 79*795d594fSAndroid Build Coastguard Worker## CHECK: <<Arg:z\d+>> ParameterValue 80*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 81*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<One:i\d+>> IntConstant 1 82*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Sel:i\d+>> Select [<<Zero>>,<<One>>,<<Arg>>] 83*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<IToS:s\d+>> TypeConversion [<<Sel>>] 84*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<IToS>>] 85*795d594fSAndroid Build Coastguard Worker 86*795d594fSAndroid Build Coastguard Worker## CHECK-START: short SmaliTests.booleanToShort(boolean) instruction_simplifier$before_codegen (after) 87*795d594fSAndroid Build Coastguard Worker## CHECK: <<Arg:z\d+>> ParameterValue 88*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<Arg>>] 89*795d594fSAndroid Build Coastguard Worker.method static booleanToShort(Z)S 90*795d594fSAndroid Build Coastguard Worker .registers 2 91*795d594fSAndroid Build Coastguard Worker if-eqz p0, :cond_5 92*795d594fSAndroid Build Coastguard Worker const/4 v0, 0x1 93*795d594fSAndroid Build Coastguard Worker 94*795d594fSAndroid Build Coastguard Worker :goto_3 95*795d594fSAndroid Build Coastguard Worker int-to-short v0, v0 96*795d594fSAndroid Build Coastguard Worker return v0 97*795d594fSAndroid Build Coastguard Worker 98*795d594fSAndroid Build Coastguard Worker :cond_5 99*795d594fSAndroid Build Coastguard Worker const/4 v0, 0x0 100*795d594fSAndroid Build Coastguard Worker goto :goto_3 101*795d594fSAndroid Build Coastguard Worker.end method 102*795d594fSAndroid Build Coastguard Worker 103*795d594fSAndroid Build Coastguard Worker## CHECK-START: char SmaliTests.booleanToChar(boolean) builder (after) 104*795d594fSAndroid Build Coastguard Worker## CHECK: <<Arg:z\d+>> ParameterValue 105*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 106*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<One:i\d+>> IntConstant 1 107*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cond:z\d+>> Equal [<<Arg>>,<<Zero>>] 108*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<Cond>>] 109*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Phi:i\d+>> Phi [<<One>>,<<Zero>>] 110*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<IToC:c\d+>> TypeConversion [<<Phi>>] 111*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<IToC>>] 112*795d594fSAndroid Build Coastguard Worker 113*795d594fSAndroid Build Coastguard Worker## CHECK-START: char SmaliTests.booleanToChar(boolean) select_generator (after) 114*795d594fSAndroid Build Coastguard Worker## CHECK: <<Arg:z\d+>> ParameterValue 115*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 116*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<One:i\d+>> IntConstant 1 117*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Sel:i\d+>> Select [<<Zero>>,<<One>>,<<Arg>>] 118*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<IToC:c\d+>> TypeConversion [<<Sel>>] 119*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<IToC>>] 120*795d594fSAndroid Build Coastguard Worker 121*795d594fSAndroid Build Coastguard Worker## CHECK-START: char SmaliTests.booleanToChar(boolean) instruction_simplifier$before_codegen (after) 122*795d594fSAndroid Build Coastguard Worker## CHECK: <<Arg:z\d+>> ParameterValue 123*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<Arg>>] 124*795d594fSAndroid Build Coastguard Worker.method static booleanToChar(Z)C 125*795d594fSAndroid Build Coastguard Worker .registers 2 126*795d594fSAndroid Build Coastguard Worker if-eqz p0, :cond_5 127*795d594fSAndroid Build Coastguard Worker const/4 v0, 0x1 128*795d594fSAndroid Build Coastguard Worker 129*795d594fSAndroid Build Coastguard Worker :goto_3 130*795d594fSAndroid Build Coastguard Worker int-to-char v0, v0 131*795d594fSAndroid Build Coastguard Worker return v0 132*795d594fSAndroid Build Coastguard Worker 133*795d594fSAndroid Build Coastguard Worker :cond_5 134*795d594fSAndroid Build Coastguard Worker const/4 v0, 0x0 135*795d594fSAndroid Build Coastguard Worker goto :goto_3 136*795d594fSAndroid Build Coastguard Worker.end method 137*795d594fSAndroid Build Coastguard Worker 138*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.booleanToInt(boolean) builder (after) 139*795d594fSAndroid Build Coastguard Worker## CHECK: <<Arg:z\d+>> ParameterValue 140*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 141*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<One:i\d+>> IntConstant 1 142*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cond:z\d+>> Equal [<<Arg>>,<<Zero>>] 143*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<Cond>>] 144*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Phi:i\d+>> Phi [<<One>>,<<Zero>>] 145*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<Phi>>] 146*795d594fSAndroid Build Coastguard Worker 147*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.booleanToInt(boolean) select_generator (after) 148*795d594fSAndroid Build Coastguard Worker## CHECK: <<Arg:z\d+>> ParameterValue 149*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 150*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<One:i\d+>> IntConstant 1 151*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Sel:i\d+>> Select [<<Zero>>,<<One>>,<<Arg>>] 152*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<Sel>>] 153*795d594fSAndroid Build Coastguard Worker 154*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.booleanToInt(boolean) instruction_simplifier$before_codegen (after) 155*795d594fSAndroid Build Coastguard Worker## CHECK: <<Arg:z\d+>> ParameterValue 156*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<Arg>>] 157*795d594fSAndroid Build Coastguard Worker.method static booleanToInt(Z)I 158*795d594fSAndroid Build Coastguard Worker .registers 2 159*795d594fSAndroid Build Coastguard Worker if-eqz p0, :cond_4 160*795d594fSAndroid Build Coastguard Worker const/4 v0, 0x1 161*795d594fSAndroid Build Coastguard Worker 162*795d594fSAndroid Build Coastguard Worker :goto_3 163*795d594fSAndroid Build Coastguard Worker return v0 164*795d594fSAndroid Build Coastguard Worker 165*795d594fSAndroid Build Coastguard Worker :cond_4 166*795d594fSAndroid Build Coastguard Worker const/4 v0, 0x0 167*795d594fSAndroid Build Coastguard Worker goto :goto_3 168*795d594fSAndroid Build Coastguard Worker.end method 169*795d594fSAndroid Build Coastguard Worker 170*795d594fSAndroid Build Coastguard Worker## CHECK-START: long SmaliTests.booleanToLong(boolean) builder (after) 171*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Arg:z\d+>> ParameterValue 172*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 173*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<One:i\d+>> IntConstant 1 174*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Cond:z\d+>> Equal [<<Arg>>,<<Zero>>] 175*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<Cond>>] 176*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Phi:i\d+>> Phi [<<One>>,<<Zero>>] 177*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<IToJ:j\d+>> TypeConversion [<<Phi>>] 178*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<IToJ>>] 179*795d594fSAndroid Build Coastguard Worker 180*795d594fSAndroid Build Coastguard Worker## CHECK-START: long SmaliTests.booleanToLong(boolean) select_generator (after) 181*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Arg:z\d+>> ParameterValue 182*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 183*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<One:i\d+>> IntConstant 1 184*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Sel:i\d+>> Select [<<Zero>>,<<One>>,<<Arg>>] 185*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<IToJ:j\d+>> TypeConversion [<<Sel>>] 186*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<IToJ>>] 187*795d594fSAndroid Build Coastguard Worker 188*795d594fSAndroid Build Coastguard Worker## CHECK-START: long SmaliTests.booleanToLong(boolean) instruction_simplifier$before_codegen (after) 189*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Arg:z\d+>> ParameterValue 190*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Zero:j\d+>> LongConstant 0 191*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<One:j\d+>> LongConstant 1 192*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Sel:j\d+>> Select [<<Zero>>,<<One>>,<<Arg>>] 193*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<Sel>>] 194*795d594fSAndroid Build Coastguard Worker.method public static booleanToLong(Z)J 195*795d594fSAndroid Build Coastguard Worker .registers 3 196*795d594fSAndroid Build Coastguard Worker .param p0, "b" # Z 197*795d594fSAndroid Build Coastguard Worker .prologue 198*795d594fSAndroid Build Coastguard Worker 199*795d594fSAndroid Build Coastguard Worker # return b ? 1 : 0; 200*795d594fSAndroid Build Coastguard Worker if-eqz p0, :b_is_zero 201*795d594fSAndroid Build Coastguard Worker 202*795d594fSAndroid Build Coastguard Worker# :b_is_one 203*795d594fSAndroid Build Coastguard Worker const/4 v0, 0x1 204*795d594fSAndroid Build Coastguard Worker 205*795d594fSAndroid Build Coastguard Worker :l_return 206*795d594fSAndroid Build Coastguard Worker int-to-long v0, v0 207*795d594fSAndroid Build Coastguard Worker return-wide v0 208*795d594fSAndroid Build Coastguard Worker 209*795d594fSAndroid Build Coastguard Worker :b_is_zero 210*795d594fSAndroid Build Coastguard Worker const/4 v0, 0x0 211*795d594fSAndroid Build Coastguard Worker goto :l_return 212*795d594fSAndroid Build Coastguard Worker.end method 213*795d594fSAndroid Build Coastguard Worker 214*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.longToIntOfBoolean() builder (after) 215*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Sget:z\d+>> StaticFieldGet 216*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<ZToJ:j\d+>> InvokeStaticOrDirect [<<Sget>>{{(,[ij]\d+)?}}] 217*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<JToI:i\d+>> TypeConversion [<<ZToJ>>] 218*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<JToI>>] 219*795d594fSAndroid Build Coastguard Worker 220*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.longToIntOfBoolean() inliner (after) 221*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 222*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<One:i\d+>> IntConstant 1 223*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Sget:z\d+>> StaticFieldGet 224*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: If [<<Sget>>] 225*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Phi:i\d+>> Phi [<<One>>,<<Zero>>] 226*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<IToJ:j\d+>> TypeConversion [<<Phi>>] 227*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<JToI:i\d+>> TypeConversion [<<IToJ>>] 228*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<JToI>>] 229*795d594fSAndroid Build Coastguard Worker 230*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.longToIntOfBoolean() select_generator (after) 231*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 232*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<One:i\d+>> IntConstant 1 233*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Sget:z\d+>> StaticFieldGet 234*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Sel:i\d+>> Select [<<Zero>>,<<One>>,<<Sget>>] 235*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<Sel>>] 236*795d594fSAndroid Build Coastguard Worker 237*795d594fSAndroid Build Coastguard Worker## CHECK-START: int SmaliTests.longToIntOfBoolean() instruction_simplifier$before_codegen (after) 238*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Sget:z\d+>> StaticFieldGet 239*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: Return [<<Sget>>] 240*795d594fSAndroid Build Coastguard Worker.method public static longToIntOfBoolean()I 241*795d594fSAndroid Build Coastguard Worker .registers 3 242*795d594fSAndroid Build Coastguard Worker .prologue 243*795d594fSAndroid Build Coastguard Worker 244*795d594fSAndroid Build Coastguard Worker # long l = booleanToLong(booleanField); 245*795d594fSAndroid Build Coastguard Worker sget-boolean v2, LSmaliTests;->booleanField:Z 246*795d594fSAndroid Build Coastguard Worker invoke-static {v2}, LSmaliTests;->booleanToLong(Z)J 247*795d594fSAndroid Build Coastguard Worker move-result-wide v0 248*795d594fSAndroid Build Coastguard Worker 249*795d594fSAndroid Build Coastguard Worker # return (int) l; 250*795d594fSAndroid Build Coastguard Worker long-to-int v2, v0 251*795d594fSAndroid Build Coastguard Worker return v2 252*795d594fSAndroid Build Coastguard Worker.end method 253