Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2018 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 public class Main {
     18 
     19   public static void assertIntEquals(int expected, int result) {
     20     if (expected != result) {
     21       throw new Error("Expected: " + expected + ", found: " + result);
     22     }
     23   }
     24 
     25   public static void assertLongEquals(long expected, long result) {
     26     if (expected != result) {
     27       throw new Error("Expected: " + expected + ", found: " + result);
     28     }
     29   }
     30 
     31   /// CHECK-START-X86_64: long Main.and_not_64(long, long) instruction_simplifier_x86_64 (before)
     32   /// CHECK-DAG:    Phi     loop:<<Loop:B\d+>> outer_loop:none
     33   /// CHECK-DAG:    Not     loop:<<Loop>>      outer_loop:none
     34   /// CHECK-DAG:    And     loop:<<Loop>>      outer_loop:none
     35   /// CHECK-DAG:    Not     loop:none
     36   /// CHECK-DAG:    And     loop:none
     37 
     38   // TODO:re-enable when checker supports isa features
     39   // CHECK-START-X86_64: long Main.and_not_64(long, long) instruction_simplifier_x86_64 (after)
     40   // CHECK-DAG:      X86AndNot loop:<<Loop:B\d+>> outer_loop:none
     41   // CHECK-DAG:      X86AndNot loop:none
     42 
     43   // TODO:re-enable when checker supports isa features
     44   // CHECK-START-X86_64: long Main.and_not_64(long, long) instruction_simplifier_x86_64 (after)
     45   // CHECK-NOT:      Not       loop:<<Loop>>      outer_loop:none
     46   // CHECK-NOT:      And       loop:<<Loop>>      outer_loop:none
     47   // CHECK-NOT:      Not       loop:none
     48   // CHECK-NOT:      And       loop:none
     49   public static long and_not_64( long x, long y) {
     50     long j = 1;
     51     long k = 2;
     52     for (long i = -64 ; i < 64; i++ ) {
     53       x = x & ~i;
     54       y = y | i;
     55     }
     56     return x & ~y;
     57   }
     58 
     59   /// CHECK-START-X86_64: int Main.and_not_32(int, int) instruction_simplifier_x86_64 (before)
     60   /// CHECK-DAG:    Phi     loop:<<Loop:B\d+>> outer_loop:none
     61   /// CHECK-DAG:    Not     loop:<<Loop>>      outer_loop:none
     62   /// CHECK-DAG:    And     loop:<<Loop>>      outer_loop:none
     63   /// CHECK-DAG:    Not     loop:<<Loop>>      outer_loop:none
     64   /// CHECK-DAG:    And     loop:<<Loop>>      outer_loop:none
     65   /// CHECK-DAG:    Not     loop:none
     66   /// CHECK-DAG:    And     loop:none
     67 
     68   // TODO:re-enable when checker supports isa features
     69   // CHECK-START-X86_64: int Main.and_not_32(int, int) instruction_simplifier_x86_64 (after)
     70   // CHECK-DAG:      X86AndNot loop:<<Loop:B\d+>> outer_loop:none
     71   // CHECK-DAG:      X86AndNot loop:<<Loop>>      outer_loop:none
     72   // CHECK-DAG:      X86AndNot loop:none
     73 
     74   // TODO:re-enable when checker supports isa features
     75   // CHECK-START-X86_64: int Main.and_not_32(int, int) instruction_simplifier_x86_64 (after)
     76   // CHECK-NOT:      Not       loop:<<Loop>>      outer_loop:none
     77   // CHECK-NOT:      And       loop:<<Loop>>      outer_loop:none
     78   // CHECK-NOT:      Not       loop:none
     79   // CHECK-NOT:      And       loop:none
     80   public static int and_not_32( int x, int y) {
     81     int j = 1;
     82     int k = 2;
     83     for (int i = -64 ; i < 64; i++ ) {
     84       x = x & ~i;
     85       y = y | i;
     86     }
     87     return x & ~y;
     88   }
     89 
     90   /// CHECK-START-X86_64: int Main.reset_lowest_set_bit_32(int) instruction_simplifier_x86_64 (before)
     91   /// CHECK-DAG:    Phi     loop:<<Loop:B\d+>> outer_loop:none
     92   /// CHECK-DAG:    Add     loop:<<Loop>>      outer_loop:none
     93   /// CHECK-DAG:    And     loop:<<Loop>>      outer_loop:none
     94   /// CHECK-DAG:    Add     loop:<<Loop>>      outer_loop:none
     95   /// CHECK-DAG:    And     loop:<<Loop>>      outer_loop:none
     96   /// CHECK-DAG:    Add     loop:<<Loop>>      outer_loop:none
     97   /// CHECK-DAG:    And     loop:<<Loop>>      outer_loop:none
     98   /// CHECK-DAG:    Add     loop:<<Loop>>      outer_loop:none
     99   /// CHECK-DAG:    And     loop:<<Loop>>      outer_loop:none
    100   /// CHECK-DAG:    Add     loop:<<Loop>>      outer_loop:none
    101   /// CHECK-DAG:    And     loop:<<Loop>>      outer_loop:none
    102   /// CHECK-DAG:    Add     loop:<<Loop>>      outer_loop:none
    103   /// CHECK-DAG:    And     loop:<<Loop>>      outer_loop:none
    104   /// CHECK-DAG:    Add     loop:<<Loop>>      outer_loop:none
    105   /// CHECK-DAG:    And     loop:<<Loop>>      outer_loop:none
    106   /// CHECK-DAG:    Add     loop:<<Loop>>      outer_loop:none
    107   /// CHECK-DAG:    And     loop:<<Loop>>      outer_loop:none
    108 
    109 
    110   // TODO:re-enable when checker supports isa features
    111   // CHECK-START-X86_64: int Main.reset_lowest_set_bit_32(int) instruction_simplifier_x86_64 (after)
    112   // CHECK-DAG:      X86MaskOrResetLeastSetBit  loop:<<Loop:B\d+>> outer_loop:none
    113   // CHECK-DAG:      X86MaskOrResetLeastSetBit  loop:<<Loop>> outer_loop:none
    114   // CHECK-DAG:      X86MaskOrResetLeastSetBit  loop:<<Loop>> outer_loop:none
    115   // CHECK-DAG:      X86MaskOrResetLeastSetBit  loop:<<Loop>> outer_loop:none
    116   // CHECK-DAG:      X86MaskOrResetLeastSetBit  loop:<<Loop>> outer_loop:none
    117   // CHECK-DAG:      X86MaskOrResetLeastSetBit  loop:<<Loop>> outer_loop:none
    118   // CHECK-DAG:      X86MaskOrResetLeastSetBit  loop:<<Loop>> outer_loop:none
    119   // CHECK-DAG:      X86MaskOrResetLeastSetBit  loop:<<Loop>> outer_loop:none
    120 
    121   // TODO:re-enable when checker supports isa features
    122   // CHECK-START-X86_64: int Main.reset_lowest_set_bit_32(int) instruction_simplifier_x86_64 (after)
    123   // CHECK-NOT:      And                        loop:<<Loop>> outer_loop:none
    124   public static int reset_lowest_set_bit_32(int x) {
    125     int y = x;
    126     int j = 5;
    127     int k = 10;
    128     int l = 20;
    129     for (int i = -64 ; i < 64; i++) {
    130       y = i & i-1;
    131       j += y;
    132       j = j & j-1;
    133       k +=j;
    134       k = k & k-1;
    135       l +=k;
    136       l = l & l-1;
    137     }
    138     return y + j + k + l;
    139   }
    140 
    141   /// CHECK-START-X86_64: long Main.reset_lowest_set_bit_64(long) instruction_simplifier_x86_64 (before)
    142   /// CHECK-DAG:    Phi     loop:<<Loop:B\d+>> outer_loop:none
    143   /// CHECK-DAG:    Sub     loop:<<Loop>>      outer_loop:none
    144   /// CHECK-DAG:    And     loop:<<Loop>>      outer_loop:none
    145   /// CHECK-DAG:    Sub     loop:<<Loop>>      outer_loop:none
    146   /// CHECK-DAG:    And     loop:<<Loop>>      outer_loop:none
    147   /// CHECK-DAG:    Sub     loop:<<Loop>>      outer_loop:none
    148   /// CHECK-DAG:    And     loop:<<Loop>>      outer_loop:none
    149   /// CHECK-DAG:    Sub     loop:<<Loop>>      outer_loop:none
    150   /// CHECK-DAG:    And     loop:<<Loop>>      outer_loop:none
    151 
    152   // TODO:re-enable when checker supports isa features
    153   // CHECK-START-X86_64: long Main.reset_lowest_set_bit_64(long) instruction_simplifier_x86_64 (after)
    154   // CHECK-DAG:      X86MaskOrResetLeastSetBit  loop:<<Loop:B\d+>> outer_loop:none
    155   // CHECK-DAG:      X86MaskOrResetLeastSetBit  loop:<<Loop>> outer_loop:none
    156   // CHECK-DAG:      X86MaskOrResetLeastSetBit  loop:<<Loop>> outer_loop:none
    157   // CHECK-DAG:      X86MaskOrResetLeastSetBit  loop:<<Loop>> outer_loop:none
    158 
    159   // TODO:re-enable when checker supports isa features
    160   // CHECK-START-X86_64: long Main.reset_lowest_set_bit_64(long) instruction_simplifier_x86_64 (after)
    161   // CHECK-NOT:      And                        loop:<<Loop>> outer_loop:none
    162   // CHECK-NOT:      Sub                        loop:<<Loop>> outer_loop:none
    163   public static long reset_lowest_set_bit_64(long x) {
    164     long y = x;
    165     long j = 5;
    166     long k = 10;
    167     long l = 20;
    168     for (long i = -64 ; i < 64; i++) {
    169       y = i & i-1;
    170       j += y;
    171       j = j & j-1;
    172       k +=j;
    173       k = k & k-1;
    174       l +=k;
    175       l = l & l-1;
    176     }
    177     return y + j + k + l;
    178   }
    179 
    180   /// CHECK-START-X86_64: int Main.get_mask_lowest_set_bit_32(int) instruction_simplifier_x86_64 (before)
    181   /// CHECK-DAG:    Add     loop:none
    182   /// CHECK-DAG:    Xor     loop:none
    183 
    184   // TODO:re-enable when checker supports isa features
    185   // CHECK-START-X86_64: int Main.get_mask_lowest_set_bit_32(int) instruction_simplifier_x86_64 (after)
    186   // CHECK-DAG:      X86MaskOrResetLeastSetBit  loop:none
    187 
    188   // TODO:re-enable when checker supports isa features
    189   // CHECK-START-X86_64: int Main.get_mask_lowest_set_bit_32(int) instruction_simplifier_x86_64 (after)
    190   // CHECK-NOT:      Add    loop:none
    191   // CHECK-NOT:      Xor    loop:none
    192   public static int get_mask_lowest_set_bit_32(int x) {
    193     return (x-1) ^ x;
    194   }
    195 
    196   /// CHECK-START-X86_64: long Main.get_mask_lowest_set_bit_64(long) instruction_simplifier_x86_64 (before)
    197   /// CHECK-DAG:    Sub     loop:none
    198   /// CHECK-DAG:    Xor     loop:none
    199 
    200   // TODO:re-enable when checker supports isa features
    201   // CHECK-START-X86_64: long Main.get_mask_lowest_set_bit_64(long) instruction_simplifier_x86_64 (after)
    202   // CHECK-DAG:      X86MaskOrResetLeastSetBit  loop:none
    203 
    204   // TODO:re-enable when checker supports isa features
    205   // CHECK-START-X86_64: long Main.get_mask_lowest_set_bit_64(long) instruction_simplifier_x86_64 (after)
    206   // CHECK-NOT:      Sub    loop:none
    207   // CHECK-NOT:      Xor    loop:none
    208   public static long get_mask_lowest_set_bit_64(long x) {
    209     return (x-1) ^ x;
    210   }
    211 
    212   public static void main(String[] args) {
    213     int x = 50;
    214     int y = x/2;
    215     long a = Long.MAX_VALUE;
    216     long b = Long.MAX_VALUE/2;
    217     assertIntEquals(0,and_not_32(x,y));
    218     assertLongEquals(0L, and_not_64(a,b));
    219     assertIntEquals(-20502606, reset_lowest_set_bit_32(x));
    220     assertLongEquals(-20502606L, reset_lowest_set_bit_64(a));
    221     assertLongEquals(-20502606L, reset_lowest_set_bit_64(b));
    222     assertIntEquals(1, get_mask_lowest_set_bit_32(y));
    223     assertLongEquals(1L, get_mask_lowest_set_bit_64(b));
    224   }
    225 }
    226