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