1# Copyright (C) 2017 The Android Open Source Project 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14 15.class public LSmaliTests; 16.super Ljava/lang/Object; 17 18# static fields 19.field public static booleanField:Z 20 21.method static constructor <clinit>()V 22 .registers 1 23 24 .prologue 25 const/4 v0, 0x1 26 27 # booleanField = true 28 sput-boolean v0, LSmaliTests;->booleanField:Z 29 30 return-void 31.end method 32 33## CHECK-START: byte SmaliTests.booleanToByte(boolean) builder (after) 34## CHECK: <<Arg:z\d+>> ParameterValue 35## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 36## CHECK-DAG: <<One:i\d+>> IntConstant 1 37## CHECK-DAG: <<Cond:z\d+>> Equal [<<Arg>>,<<Zero>>] 38## CHECK-DAG: If [<<Cond>>] 39## CHECK-DAG: <<Phi:i\d+>> Phi [<<One>>,<<Zero>>] 40## CHECK-DAG: <<IToS:b\d+>> TypeConversion [<<Phi>>] 41## CHECK-DAG: Return [<<IToS>>] 42 43## CHECK-START: byte SmaliTests.booleanToByte(boolean) select_generator (after) 44## CHECK: <<Arg:z\d+>> ParameterValue 45## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 46## CHECK-DAG: <<One:i\d+>> IntConstant 1 47## CHECK-DAG: <<Sel:i\d+>> Select [<<Zero>>,<<One>>,<<Arg>>] 48## CHECK-DAG: <<IToS:b\d+>> TypeConversion [<<Sel>>] 49## CHECK-DAG: Return [<<IToS>>] 50 51## CHECK-START: byte SmaliTests.booleanToByte(boolean) instruction_simplifier$before_codegen (after) 52## CHECK: <<Arg:z\d+>> ParameterValue 53## CHECK-DAG: Return [<<Arg>>] 54.method static booleanToByte(Z)B 55 .registers 2 56 if-eqz p0, :cond_5 57 const/4 v0, 0x1 58 59 :goto_3 60 int-to-byte v0, v0 61 return v0 62 63 :cond_5 64 const/4 v0, 0x0 65 goto :goto_3 66.end method 67 68## CHECK-START: short SmaliTests.booleanToShort(boolean) builder (after) 69## CHECK: <<Arg:z\d+>> ParameterValue 70## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 71## CHECK-DAG: <<One:i\d+>> IntConstant 1 72## CHECK-DAG: <<Cond:z\d+>> Equal [<<Arg>>,<<Zero>>] 73## CHECK-DAG: If [<<Cond>>] 74## CHECK-DAG: <<Phi:i\d+>> Phi [<<One>>,<<Zero>>] 75## CHECK-DAG: <<IToS:s\d+>> TypeConversion [<<Phi>>] 76## CHECK-DAG: Return [<<IToS>>] 77 78## CHECK-START: short SmaliTests.booleanToShort(boolean) select_generator (after) 79## CHECK: <<Arg:z\d+>> ParameterValue 80## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 81## CHECK-DAG: <<One:i\d+>> IntConstant 1 82## CHECK-DAG: <<Sel:i\d+>> Select [<<Zero>>,<<One>>,<<Arg>>] 83## CHECK-DAG: <<IToS:s\d+>> TypeConversion [<<Sel>>] 84## CHECK-DAG: Return [<<IToS>>] 85 86## CHECK-START: short SmaliTests.booleanToShort(boolean) instruction_simplifier$before_codegen (after) 87## CHECK: <<Arg:z\d+>> ParameterValue 88## CHECK-DAG: Return [<<Arg>>] 89.method static booleanToShort(Z)S 90 .registers 2 91 if-eqz p0, :cond_5 92 const/4 v0, 0x1 93 94 :goto_3 95 int-to-short v0, v0 96 return v0 97 98 :cond_5 99 const/4 v0, 0x0 100 goto :goto_3 101.end method 102 103## CHECK-START: char SmaliTests.booleanToChar(boolean) builder (after) 104## CHECK: <<Arg:z\d+>> ParameterValue 105## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 106## CHECK-DAG: <<One:i\d+>> IntConstant 1 107## CHECK-DAG: <<Cond:z\d+>> Equal [<<Arg>>,<<Zero>>] 108## CHECK-DAG: If [<<Cond>>] 109## CHECK-DAG: <<Phi:i\d+>> Phi [<<One>>,<<Zero>>] 110## CHECK-DAG: <<IToC:c\d+>> TypeConversion [<<Phi>>] 111## CHECK-DAG: Return [<<IToC>>] 112 113## CHECK-START: char SmaliTests.booleanToChar(boolean) select_generator (after) 114## CHECK: <<Arg:z\d+>> ParameterValue 115## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 116## CHECK-DAG: <<One:i\d+>> IntConstant 1 117## CHECK-DAG: <<Sel:i\d+>> Select [<<Zero>>,<<One>>,<<Arg>>] 118## CHECK-DAG: <<IToC:c\d+>> TypeConversion [<<Sel>>] 119## CHECK-DAG: Return [<<IToC>>] 120 121## CHECK-START: char SmaliTests.booleanToChar(boolean) instruction_simplifier$before_codegen (after) 122## CHECK: <<Arg:z\d+>> ParameterValue 123## CHECK-DAG: Return [<<Arg>>] 124.method static booleanToChar(Z)C 125 .registers 2 126 if-eqz p0, :cond_5 127 const/4 v0, 0x1 128 129 :goto_3 130 int-to-char v0, v0 131 return v0 132 133 :cond_5 134 const/4 v0, 0x0 135 goto :goto_3 136.end method 137 138## CHECK-START: int SmaliTests.booleanToInt(boolean) builder (after) 139## CHECK: <<Arg:z\d+>> ParameterValue 140## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 141## CHECK-DAG: <<One:i\d+>> IntConstant 1 142## CHECK-DAG: <<Cond:z\d+>> Equal [<<Arg>>,<<Zero>>] 143## CHECK-DAG: If [<<Cond>>] 144## CHECK-DAG: <<Phi:i\d+>> Phi [<<One>>,<<Zero>>] 145## CHECK-DAG: Return [<<Phi>>] 146 147## CHECK-START: int SmaliTests.booleanToInt(boolean) select_generator (after) 148## CHECK: <<Arg:z\d+>> ParameterValue 149## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 150## CHECK-DAG: <<One:i\d+>> IntConstant 1 151## CHECK-DAG: <<Sel:i\d+>> Select [<<Zero>>,<<One>>,<<Arg>>] 152## CHECK-DAG: Return [<<Sel>>] 153 154## CHECK-START: int SmaliTests.booleanToInt(boolean) instruction_simplifier$before_codegen (after) 155## CHECK: <<Arg:z\d+>> ParameterValue 156## CHECK-DAG: Return [<<Arg>>] 157.method static booleanToInt(Z)I 158 .registers 2 159 if-eqz p0, :cond_4 160 const/4 v0, 0x1 161 162 :goto_3 163 return v0 164 165 :cond_4 166 const/4 v0, 0x0 167 goto :goto_3 168.end method 169 170## CHECK-START: long SmaliTests.booleanToLong(boolean) builder (after) 171## CHECK-DAG: <<Arg:z\d+>> ParameterValue 172## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 173## CHECK-DAG: <<One:i\d+>> IntConstant 1 174## CHECK-DAG: <<Cond:z\d+>> Equal [<<Arg>>,<<Zero>>] 175## CHECK-DAG: If [<<Cond>>] 176## CHECK-DAG: <<Phi:i\d+>> Phi [<<One>>,<<Zero>>] 177## CHECK-DAG: <<IToJ:j\d+>> TypeConversion [<<Phi>>] 178## CHECK-DAG: Return [<<IToJ>>] 179 180## CHECK-START: long SmaliTests.booleanToLong(boolean) select_generator (after) 181## CHECK-DAG: <<Arg:z\d+>> ParameterValue 182## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 183## CHECK-DAG: <<One:i\d+>> IntConstant 1 184## CHECK-DAG: <<Sel:i\d+>> Select [<<Zero>>,<<One>>,<<Arg>>] 185## CHECK-DAG: <<IToJ:j\d+>> TypeConversion [<<Sel>>] 186## CHECK-DAG: Return [<<IToJ>>] 187 188## CHECK-START: long SmaliTests.booleanToLong(boolean) instruction_simplifier$before_codegen (after) 189## CHECK-DAG: <<Arg:z\d+>> ParameterValue 190## CHECK-DAG: <<Zero:j\d+>> LongConstant 0 191## CHECK-DAG: <<One:j\d+>> LongConstant 1 192## CHECK-DAG: <<Sel:j\d+>> Select [<<Zero>>,<<One>>,<<Arg>>] 193## CHECK-DAG: Return [<<Sel>>] 194.method public static booleanToLong(Z)J 195 .registers 3 196 .param p0, "b" # Z 197 .prologue 198 199 # return b ? 1 : 0; 200 if-eqz p0, :b_is_zero 201 202# :b_is_one 203 const/4 v0, 0x1 204 205 :l_return 206 int-to-long v0, v0 207 return-wide v0 208 209 :b_is_zero 210 const/4 v0, 0x0 211 goto :l_return 212.end method 213 214## CHECK-START: int SmaliTests.longToIntOfBoolean() builder (after) 215## CHECK-DAG: <<Sget:z\d+>> StaticFieldGet 216## CHECK-DAG: <<ZToJ:j\d+>> InvokeStaticOrDirect [<<Sget>>{{(,[ij]\d+)?}}] 217## CHECK-DAG: <<JToI:i\d+>> TypeConversion [<<ZToJ>>] 218## CHECK-DAG: Return [<<JToI>>] 219 220## CHECK-START: int SmaliTests.longToIntOfBoolean() inliner (after) 221## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 222## CHECK-DAG: <<One:i\d+>> IntConstant 1 223## CHECK-DAG: <<Sget:z\d+>> StaticFieldGet 224## CHECK-DAG: If [<<Sget>>] 225## CHECK-DAG: <<Phi:i\d+>> Phi [<<One>>,<<Zero>>] 226## CHECK-DAG: <<IToJ:j\d+>> TypeConversion [<<Phi>>] 227## CHECK-DAG: <<JToI:i\d+>> TypeConversion [<<IToJ>>] 228## CHECK-DAG: Return [<<JToI>>] 229 230## CHECK-START: int SmaliTests.longToIntOfBoolean() select_generator (after) 231## CHECK-DAG: <<Zero:i\d+>> IntConstant 0 232## CHECK-DAG: <<One:i\d+>> IntConstant 1 233## CHECK-DAG: <<Sget:z\d+>> StaticFieldGet 234## CHECK-DAG: <<Sel:i\d+>> Select [<<Zero>>,<<One>>,<<Sget>>] 235## CHECK-DAG: Return [<<Sel>>] 236 237## CHECK-START: int SmaliTests.longToIntOfBoolean() instruction_simplifier$before_codegen (after) 238## CHECK-DAG: <<Sget:z\d+>> StaticFieldGet 239## CHECK-DAG: Return [<<Sget>>] 240.method public static longToIntOfBoolean()I 241 .registers 3 242 .prologue 243 244 # long l = booleanToLong(booleanField); 245 sget-boolean v2, LSmaliTests;->booleanField:Z 246 invoke-static {v2}, LSmaliTests;->booleanToLong(Z)J 247 move-result-wide v0 248 249 # return (int) l; 250 long-to-int v2, v0 251 return v2 252.end method 253