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 
assertIntEquals(int expected, int result)19   public static void assertIntEquals(int expected, int result) {
20     if (expected != result) {
21       throw new Error("Expected: " + expected + ", found: " + result);
22     }
23   }
24 
assertLongEquals(long expected, long result)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
and_not_64( long x, long y)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
and_not_32( int x, int y)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
reset_lowest_set_bit_32(int x)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
reset_lowest_set_bit_64(long x)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
get_mask_lowest_set_bit_32(int x)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
get_mask_lowest_set_bit_64(long x)208   public static long get_mask_lowest_set_bit_64(long x) {
209     return (x-1) ^ x;
210   }
211 
main(String[] args)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