Home | History | Annotate | Download | only in smali
      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