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.class public LSmali; 15.super Ljava/lang/Object; 16 17## CHECK-START: void Smali.test3Order1(boolean, int, int, int, int, int) register (after) 18## CHECK: name "B0" 19## CHECK-NOT: ParallelMove 20## CHECK: name "B1" 21## CHECK-NOT: end_block 22## CHECK: If 23## CHECK-NOT: ParallelMove 24## CHECK: name "B6" 25## CHECK-NOT: end_block 26## CHECK: InstanceFieldSet 27# We could check here that there is a parallel move, but it's only valid 28# for some architectures (for example x86), as other architectures may 29# not do move at all. 30## CHECK: end_block 31## CHECK-NOT: ParallelMove 32.method public static test3Order1(ZIIIII)V 33 .registers 14 34 35 sget v0, LMain;->live1:I 36 sget v1, LMain;->live2:I 37 sget v2, LMain;->live3:I 38 sget v5, LMain;->live0:I 39 if-eqz p0, :cond_13 40 41 sput v0, LMain;->live1:I 42 43 :goto_c 44 add-int v6, v0, v1 45 add-int/2addr v6, v2 46 add-int/2addr v6, v5 47 sput v6, LMain;->live1:I 48 49 return-void 50 51 :cond_13 52 sget-boolean v6, LMain;->y:Z 53 54 if-eqz v6, :cond_1a 55 sput v0, LMain;->live1:I 56 goto :goto_c 57 58 :cond_1a 59 sget v3, LMain;->live4:I 60 61 sget v4, LMain;->live5:I 62 sget-object v6, LMain;->foo:LMain$Foo; 63 add-int v7, v0, v4 64 add-int/2addr v7, v3 65 iput v7, v6, LMain$Foo;->field2:I 66 sget-object v6, LMain;->foo:LMain$Foo; 67 add-int v7, v1, v4 68 add-int/2addr v7, v3 69 iput v7, v6, LMain$Foo;->field3:I 70 sget-object v6, LMain;->foo:LMain$Foo; 71 add-int v7, v2, v4 72 add-int/2addr v7, v3 73 iput v7, v6, LMain$Foo;->field4:I 74 sget-object v6, LMain;->foo:LMain$Foo; 75 iput v3, v6, LMain$Foo;->field0:I 76 sget-object v6, LMain;->foo:LMain$Foo; 77 add-int v7, v4, v3 78 iput v7, v6, LMain$Foo;->field1:I 79 goto :goto_c 80.end method 81 82## CHECK-START: void Smali.test3Order2(boolean, int, int, int, int, int) register (after) 83## CHECK: name "B0" 84## CHECK-NOT: ParallelMove 85## CHECK: name "B1" 86## CHECK-NOT: end_block 87## CHECK: If 88## CHECK-NOT: ParallelMove 89## CHECK: name "B5" 90## CHECK-NOT: end_block 91## CHECK: InstanceFieldSet 92# We could check here that there is a parallel move, but it's only valid 93# for some architectures (for example x86), as other architectures may 94# not do move at all. 95## CHECK: end_block 96## CHECK-NOT: ParallelMove 97.method public static test3Order2(ZIIIII)V 98 .registers 14 99 100 sget v0, LMain;->live1:I 101 sget v1, LMain;->live2:I 102 sget v2, LMain;->live3:I 103 sget v3, LMain;->live0:I 104 if-eqz p0, :cond_d 105 106 sput v0, LMain;->live1:I 107 goto :goto_37 108 109 :cond_d 110 sget-boolean v4, LMain;->y:Z 111 if-eqz v4, :cond_14 112 113 sput v0, LMain;->live1:I 114 goto :goto_37 115 116 :cond_14 117 sget v4, LMain;->live4:I 118 sget v5, LMain;->live5:I 119 sget-object v6, LMain;->foo:LMain$Foo; 120 add-int v7, v0, v5 121 add-int/2addr v7, v4 122 iput v7, v6, LMain$Foo;->field2:I 123 sget-object v6, LMain;->foo:LMain$Foo; 124 add-int v7, v1, v5 125 add-int/2addr v7, v4 126 iput v7, v6, LMain$Foo;->field3:I 127 sget-object v6, LMain;->foo:LMain$Foo; 128 add-int v7, v2, v5 129 add-int/2addr v7, v4 130 iput v7, v6, LMain$Foo;->field4:I 131 sget-object v6, LMain;->foo:LMain$Foo; 132 iput v4, v6, LMain$Foo;->field0:I 133 sget-object v6, LMain;->foo:LMain$Foo; 134 add-int v7, v5, v4 135 iput v7, v6, LMain$Foo;->field1:I 136 :goto_37 137 138 add-int v4, v0, v1 139 add-int/2addr v4, v2 140 add-int/2addr v4, v3 141 sput v4, LMain;->live1:I 142 return-void 143.end method 144