1*795d594fSAndroid Build Coastguard Worker# 2*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2017 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker# 4*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker# 8*795d594fSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker# 10*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker# limitations under the License. 15*795d594fSAndroid Build Coastguard Worker 16*795d594fSAndroid Build Coastguard Worker.class public LSmali; 17*795d594fSAndroid Build Coastguard Worker.super Ljava/lang/Object; 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Smali.bufferLen2() builder (after) 20*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<New:l\d+>> NewInstance 21*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String1:l\d+>> LoadString 22*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBufferAppend 23*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String2:l\d+>> LoadString 24*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<Append1>>,<<String2>>] intrinsic:StringBufferAppend 25*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: InvokeVirtual [<<Append2>>] intrinsic:StringBufferLength 26*795d594fSAndroid Build Coastguard Worker.method public static bufferLen2()I 27*795d594fSAndroid Build Coastguard Worker .registers 3 28*795d594fSAndroid Build Coastguard Worker 29*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/StringBuffer; 30*795d594fSAndroid Build Coastguard Worker 31*795d594fSAndroid Build Coastguard Worker invoke-direct {v0}, Ljava/lang/StringBuffer;-><init>()V 32*795d594fSAndroid Build Coastguard Worker 33*795d594fSAndroid Build Coastguard Worker const-string v1, "x" 34*795d594fSAndroid Build Coastguard Worker invoke-virtual {v0, v1}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer; 35*795d594fSAndroid Build Coastguard Worker move-result-object v1 36*795d594fSAndroid Build Coastguard Worker 37*795d594fSAndroid Build Coastguard Worker const-string v2, "y" 38*795d594fSAndroid Build Coastguard Worker invoke-virtual {v1, v2}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer; 39*795d594fSAndroid Build Coastguard Worker move-result-object v1 40*795d594fSAndroid Build Coastguard Worker 41*795d594fSAndroid Build Coastguard Worker invoke-virtual {v1}, Ljava/lang/StringBuffer;->length()I 42*795d594fSAndroid Build Coastguard Worker move-result v1 43*795d594fSAndroid Build Coastguard Worker 44*795d594fSAndroid Build Coastguard Worker return v1 45*795d594fSAndroid Build Coastguard Worker.end method 46*795d594fSAndroid Build Coastguard Worker 47*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Smali.builderLen2() instruction_simplifier (before) 48*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<New:l\d+>> NewInstance 49*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String1:l\d+>> LoadString 50*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBuilderAppendString 51*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String2:l\d+>> LoadString 52*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<Append1>>,<<String2>>] intrinsic:StringBuilderAppendString 53*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: InvokeVirtual [<<Append2>>] intrinsic:StringBuilderLength 54*795d594fSAndroid Build Coastguard Worker 55*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Smali.builderLen2() instruction_simplifier (after) 56*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<New:l\d+>> NewInstance 57*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String1:l\d+>> LoadString 58*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBuilderAppendString 59*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String2:l\d+>> LoadString 60*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<New>>,<<String2>>] intrinsic:StringBuilderAppendString 61*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: InvokeVirtual [<<New>>] intrinsic:StringBuilderLength 62*795d594fSAndroid Build Coastguard Worker.method public static builderLen2()I 63*795d594fSAndroid Build Coastguard Worker .registers 3 64*795d594fSAndroid Build Coastguard Worker 65*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/StringBuilder; 66*795d594fSAndroid Build Coastguard Worker 67*795d594fSAndroid Build Coastguard Worker invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V 68*795d594fSAndroid Build Coastguard Worker 69*795d594fSAndroid Build Coastguard Worker const-string v1, "x" 70*795d594fSAndroid Build Coastguard Worker invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; 71*795d594fSAndroid Build Coastguard Worker move-result-object v1 72*795d594fSAndroid Build Coastguard Worker 73*795d594fSAndroid Build Coastguard Worker const-string v2, "y" 74*795d594fSAndroid Build Coastguard Worker invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; 75*795d594fSAndroid Build Coastguard Worker move-result-object v1 76*795d594fSAndroid Build Coastguard Worker 77*795d594fSAndroid Build Coastguard Worker invoke-virtual {v1}, Ljava/lang/StringBuilder;->length()I 78*795d594fSAndroid Build Coastguard Worker move-result v1 79*795d594fSAndroid Build Coastguard Worker 80*795d594fSAndroid Build Coastguard Worker return v1 81*795d594fSAndroid Build Coastguard Worker.end method 82*795d594fSAndroid Build Coastguard Worker 83*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Smali.bufferLoopAppender() instruction_simplifier (before) 84*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<New:l\d+>> NewInstance loop:none 85*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String1:l\d+>> LoadString loop:<<Loop:B\d+>> 86*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Null1:l\d+>> NullCheck [<<New>>] loop:<<Loop>> 87*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<Null1>>,<<String1>>] intrinsic:StringBufferAppend loop:<<Loop>> 88*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String2:l\d+>> LoadString loop:<<Loop>> 89*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<Append1>>,<<String2>>] intrinsic:StringBufferAppend loop:<<Loop>> 90*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String3:l\d+>> LoadString loop:<<Loop>> 91*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [<<Append2>>,<<String3>>] intrinsic:StringBufferAppend loop:<<Loop>> 92*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Null4:l\d+>> NullCheck [<<New>>] loop:none 93*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: InvokeVirtual [<<Null4>>] intrinsic:StringBufferLength loop:none 94*795d594fSAndroid Build Coastguard Worker 95*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Smali.bufferLoopAppender() instruction_simplifier (after) 96*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<New:l\d+>> NewInstance loop:none 97*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String1:l\d+>> LoadString loop:<<Loop:B\d+>> 98*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBufferAppend loop:<<Loop>> 99*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String2:l\d+>> LoadString loop:<<Loop>> 100*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<New>>,<<String2>>] intrinsic:StringBufferAppend loop:<<Loop>> 101*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String3:l\d+>> LoadString loop:<<Loop>> 102*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [<<New>>,<<String3>>] intrinsic:StringBufferAppend loop:<<Loop>> 103*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: InvokeVirtual [<<New>>] intrinsic:StringBufferLength loop:none 104*795d594fSAndroid Build Coastguard Worker.method public static bufferLoopAppender()I 105*795d594fSAndroid Build Coastguard Worker .registers 4 106*795d594fSAndroid Build Coastguard Worker 107*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/StringBuffer; 108*795d594fSAndroid Build Coastguard Worker 109*795d594fSAndroid Build Coastguard Worker invoke-direct {v0}, Ljava/lang/StringBuffer;-><init>()V 110*795d594fSAndroid Build Coastguard Worker 111*795d594fSAndroid Build Coastguard Worker const/4 v1, 0x0 112*795d594fSAndroid Build Coastguard Worker 113*795d594fSAndroid Build Coastguard Worker :goto_6 114*795d594fSAndroid Build Coastguard Worker const/16 v2, 0xa 115*795d594fSAndroid Build Coastguard Worker 116*795d594fSAndroid Build Coastguard Worker if-ge v1, v2, :cond_1e 117*795d594fSAndroid Build Coastguard Worker 118*795d594fSAndroid Build Coastguard Worker const-string v2, "x" 119*795d594fSAndroid Build Coastguard Worker invoke-virtual {v0, v2}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer; 120*795d594fSAndroid Build Coastguard Worker move-result-object v2 121*795d594fSAndroid Build Coastguard Worker 122*795d594fSAndroid Build Coastguard Worker const-string v3, "y" 123*795d594fSAndroid Build Coastguard Worker invoke-virtual {v2, v3}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer; 124*795d594fSAndroid Build Coastguard Worker move-result-object v2 125*795d594fSAndroid Build Coastguard Worker 126*795d594fSAndroid Build Coastguard Worker const-string v3, "z" 127*795d594fSAndroid Build Coastguard Worker invoke-virtual {v2, v3}, Ljava/lang/StringBuffer;->append(Ljava/lang/String;)Ljava/lang/StringBuffer; 128*795d594fSAndroid Build Coastguard Worker 129*795d594fSAndroid Build Coastguard Worker add-int/lit8 v1, v1, 0x1 130*795d594fSAndroid Build Coastguard Worker goto :goto_6 131*795d594fSAndroid Build Coastguard Worker 132*795d594fSAndroid Build Coastguard Worker :cond_1e 133*795d594fSAndroid Build Coastguard Worker invoke-virtual {v0}, Ljava/lang/StringBuffer;->length()I 134*795d594fSAndroid Build Coastguard Worker 135*795d594fSAndroid Build Coastguard Worker move-result v2 136*795d594fSAndroid Build Coastguard Worker 137*795d594fSAndroid Build Coastguard Worker return v2 138*795d594fSAndroid Build Coastguard Worker.end method 139*795d594fSAndroid Build Coastguard Worker 140*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Smali.builderLoopAppender() instruction_simplifier (before) 141*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<New:l\d+>> NewInstance loop:none 142*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String1:l\d+>> LoadString loop:<<Loop:B\d+>> 143*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Null1:l\d+>> NullCheck [<<New>>] loop:<<Loop>> 144*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<Null1>>,<<String1>>] intrinsic:StringBuilderAppendString loop:<<Loop>> 145*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String2:l\d+>> LoadString loop:<<Loop>> 146*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<Append1>>,<<String2>>] intrinsic:StringBuilderAppendString loop:<<Loop>> 147*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String3:l\d+>> LoadString loop:<<Loop>> 148*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [<<Append2>>,<<String3>>] intrinsic:StringBuilderAppendString loop:<<Loop>> 149*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Null4:l\d+>> NullCheck [<<New>>] loop:none 150*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: InvokeVirtual [<<Null4>>] intrinsic:StringBuilderLength loop:none 151*795d594fSAndroid Build Coastguard Worker 152*795d594fSAndroid Build Coastguard Worker## CHECK-START: int Smali.builderLoopAppender() instruction_simplifier (after) 153*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<New:l\d+>> NewInstance loop:none 154*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String1:l\d+>> LoadString loop:<<Loop:B\d+>> 155*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Append1:l\d+>> InvokeVirtual [<<New>>,<<String1>>] intrinsic:StringBuilderAppendString loop:<<Loop>> 156*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String2:l\d+>> LoadString loop:<<Loop>> 157*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Append2:l\d+>> InvokeVirtual [<<New>>,<<String2>>] intrinsic:StringBuilderAppendString loop:<<Loop>> 158*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<String3:l\d+>> LoadString loop:<<Loop>> 159*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: <<Append3:l\d+>> InvokeVirtual [<<New>>,<<String3>>] intrinsic:StringBuilderAppendString loop:<<Loop>> 160*795d594fSAndroid Build Coastguard Worker## CHECK-DAG: InvokeVirtual [<<New>>] intrinsic:StringBuilderLength loop:none 161*795d594fSAndroid Build Coastguard Worker.method public static builderLoopAppender()I 162*795d594fSAndroid Build Coastguard Worker .registers 4 163*795d594fSAndroid Build Coastguard Worker 164*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/StringBuilder; 165*795d594fSAndroid Build Coastguard Worker 166*795d594fSAndroid Build Coastguard Worker invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V 167*795d594fSAndroid Build Coastguard Worker 168*795d594fSAndroid Build Coastguard Worker const/4 v1, 0x0 169*795d594fSAndroid Build Coastguard Worker 170*795d594fSAndroid Build Coastguard Worker :goto_6 171*795d594fSAndroid Build Coastguard Worker const/16 v2, 0xa 172*795d594fSAndroid Build Coastguard Worker 173*795d594fSAndroid Build Coastguard Worker if-ge v1, v2, :cond_1e 174*795d594fSAndroid Build Coastguard Worker 175*795d594fSAndroid Build Coastguard Worker const-string v2, "x" 176*795d594fSAndroid Build Coastguard Worker 177*795d594fSAndroid Build Coastguard Worker invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; 178*795d594fSAndroid Build Coastguard Worker move-result-object v2 179*795d594fSAndroid Build Coastguard Worker const-string v3, "y" 180*795d594fSAndroid Build Coastguard Worker 181*795d594fSAndroid Build Coastguard Worker invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; 182*795d594fSAndroid Build Coastguard Worker move-result-object v2 183*795d594fSAndroid Build Coastguard Worker const-string v3, "z" 184*795d594fSAndroid Build Coastguard Worker 185*795d594fSAndroid Build Coastguard Worker invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder; 186*795d594fSAndroid Build Coastguard Worker add-int/lit8 v1, v1, 0x1 187*795d594fSAndroid Build Coastguard Worker 188*795d594fSAndroid Build Coastguard Worker goto :goto_6 189*795d594fSAndroid Build Coastguard Worker 190*795d594fSAndroid Build Coastguard Worker :cond_1e 191*795d594fSAndroid Build Coastguard Worker invoke-virtual {v0}, Ljava/lang/StringBuilder;->length()I 192*795d594fSAndroid Build Coastguard Worker 193*795d594fSAndroid Build Coastguard Worker move-result v2 194*795d594fSAndroid Build Coastguard Worker 195*795d594fSAndroid Build Coastguard Worker return v2 196*795d594fSAndroid Build Coastguard Worker.end method 197