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 LSmali; 16.super Ljava/lang/Object; 17 18## CHECK-START: double Smali.calcCircleAreaOrCircumference(double, boolean) load_store_elimination (before) 19## CHECK: NewInstance 20## CHECK: InstanceFieldSet 21## CHECK: ConstructorFence 22## CHECK: InstanceFieldGet 23 24## CHECK-START: double Smali.calcCircleAreaOrCircumference(double, boolean) load_store_elimination (after) 25## CHECK: NewInstance 26## CHECK-NOT: ConstructorFence 27 28# The object allocation will not be eliminated by LSE because of aliased stores. 29# However the object is still a singleton, so it never escapes the current thread. 30# There should not be a constructor fence here after LSE. 31 32.method public static calcCircleAreaOrCircumference(DZ)D 33 .registers 7 34 35 # CalcCircleAreaOrCircumference calc = 36 # new CalcCircleAreaOrCircumference( 37 # area_or_circumference ? CalcCircleAreaOrCircumference.TYPE_AREA : 38 # CalcCircleAreaOrCircumference.TYPE_CIRCUMFERENCE); 39 40 # if (area_or_circumference) { 41 # // Area 42 # calc.value = Math.PI * Math.PI * radius; 43 # } else { 44 # // Circumference 45 # calc.value = 2 * Math.PI * radius; 46 # } 47 48 # Please note that D8 would merge the iput togother which looks like : 49 50 # if (area_or_circumference) { 51 # // Area 52 # tmp = Math.PI * Math.PI * radius; 53 # } else { 54 # // Circumference 55 # tmp = 2 * Math.PI * radius; 56 # } 57 # calc.value = tmp; 58 59 # which makes the LSE valid and defeat the purpose of this test. 60 61 new-instance v0, LCalcCircleAreaOrCircumference; 62 63 if-eqz p2, :cond_15 64 65 const/4 v1, 0x0 66 67 :goto_5 68 invoke-direct {v0, v1}, LCalcCircleAreaOrCircumference;-><init>(I)V 69 70 if-eqz p2, :cond_17 71 72 const-wide v2, 0x4023bd3cc9be45deL # 9.869604401089358 73 74 mul-double/2addr v2, p0 75 76 iput-wide v2, v0, LCalcCircleAreaOrCircumference;->value:D 77 78 :goto_12 79 iget-wide v2, v0, LCalcCircleAreaOrCircumference;->value:D 80 81 return-wide v2 82 83 :cond_15 84 const/4 v1, 0x1 85 86 goto :goto_5 87 88 :cond_17 89 const-wide v2, 0x401921fb54442d18L # 6.283185307179586 90 91 mul-double/2addr v2, p0 92 93 iput-wide v2, v0, LCalcCircleAreaOrCircumference;->value:D 94 95 goto :goto_12 96.end method 97 98