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 /// CHECK-START-X86_64: long Main.and_not_64(long, long) instruction_simplifier_x86_64 (after) 39 /// CHECK-IF: hasIsaFeature('avx') or hasIsaFeature('avx2') 40 /// CHECK-DAG: X86AndNot loop:<<Loop:B\d+>> outer_loop:none 41 /// CHECK-DAG: X86AndNot loop:none 42 /// CHECK-FI: 43 44 /// CHECK-START-X86_64: long Main.and_not_64(long, long) instruction_simplifier_x86_64 (after) 45 /// CHECK-IF: hasIsaFeature('avx') or hasIsaFeature('avx2') 46 /// CHECK-NOT: Not loop:<<Loop>> outer_loop:none 47 /// CHECK-NOT: And loop:<<Loop>> outer_loop:none 48 /// CHECK-NOT: Not loop:none 49 /// CHECK-NOT: And loop:none 50 /// CHECK-FI: and_not_64( long x, long y)51 public static long and_not_64( long x, long y) { 52 long j = 1; 53 long k = 2; 54 for (long i = -64 ; i < 64; i++ ) { 55 x = x & ~i; 56 y = y | i; 57 } 58 return x & ~y; 59 } 60 61 /// CHECK-START-X86_64: int Main.and_not_32(int, int) instruction_simplifier_x86_64 (before) 62 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> 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:<<Loop>> outer_loop:none 66 /// CHECK-DAG: And loop:<<Loop>> outer_loop:none 67 /// CHECK-DAG: Not loop:none 68 /// CHECK-DAG: And loop:none 69 70 /// CHECK-START-X86_64: int Main.and_not_32(int, int) instruction_simplifier_x86_64 (after) 71 /// CHECK-IF: hasIsaFeature('avx') or hasIsaFeature('avx2') 72 /// CHECK-DAG: X86AndNot loop:<<Loop:B\d+>> outer_loop:none 73 /// CHECK-DAG: X86AndNot loop:<<Loop>> outer_loop:none 74 /// CHECK-DAG: X86AndNot loop:none 75 /// CHECK-FI: 76 77 /// CHECK-START-X86_64: int Main.and_not_32(int, int) instruction_simplifier_x86_64 (after) 78 /// CHECK-IF: hasIsaFeature('avx') or hasIsaFeature('avx2') 79 /// CHECK-NOT: Not loop:<<Loop>> outer_loop:none 80 /// CHECK-NOT: And loop:<<Loop>> outer_loop:none 81 /// CHECK-NOT: Not loop:none 82 /// CHECK-NOT: And loop:none 83 /// CHECK-FI: and_not_32( int x, int y)84 public static int and_not_32( int x, int y) { 85 int j = 1; 86 int k = 2; 87 for (int i = -64 ; i < 64; i++ ) { 88 x = x & ~i; 89 y = y | i; 90 } 91 return x & ~y; 92 } 93 94 /// CHECK-START-X86_64: int Main.reset_lowest_set_bit_32(int) instruction_simplifier_x86_64 (before) 95 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> 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 /// CHECK-DAG: Add loop:<<Loop>> outer_loop:none 109 /// CHECK-DAG: And loop:<<Loop>> outer_loop:none 110 /// CHECK-DAG: Add loop:<<Loop>> outer_loop:none 111 /// CHECK-DAG: And loop:<<Loop>> outer_loop:none 112 113 114 /// CHECK-START-X86_64: int Main.reset_lowest_set_bit_32(int) instruction_simplifier_x86_64 (after) 115 /// CHECK-IF: hasIsaFeature('avx') or hasIsaFeature('avx2') 116 /// CHECK-DAG: X86MaskOrResetLeastSetBit loop:<<Loop:B\d+>> 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 /// CHECK-DAG: X86MaskOrResetLeastSetBit loop:<<Loop>> outer_loop:none 121 /// CHECK-DAG: X86MaskOrResetLeastSetBit loop:<<Loop>> outer_loop:none 122 /// CHECK-DAG: X86MaskOrResetLeastSetBit loop:<<Loop>> outer_loop:none 123 /// CHECK-DAG: X86MaskOrResetLeastSetBit loop:<<Loop>> outer_loop:none 124 /// CHECK-FI: 125 126 /// CHECK-START-X86_64: int Main.reset_lowest_set_bit_32(int) instruction_simplifier_x86_64 (after) 127 /// CHECK-IF: hasIsaFeature('avx') or hasIsaFeature('avx2') 128 /// CHECK-NOT: And loop:<<Loop>> outer_loop:none 129 /// CHECK-FI: reset_lowest_set_bit_32(int x)130 public static int reset_lowest_set_bit_32(int x) { 131 int y = x; 132 int j = 5; 133 int k = 10; 134 int l = 20; 135 for (int i = -64 ; i < 64; i++) { 136 y = i & i-1; 137 j += y; 138 j = j & j-1; 139 k +=j; 140 k = k & k-1; 141 l +=k; 142 l = l & l-1; 143 } 144 return y + j + k + l; 145 } 146 147 /// CHECK-START-X86_64: long Main.reset_lowest_set_bit_64(long) instruction_simplifier_x86_64 (before) 148 /// CHECK-DAG: Phi loop:<<Loop:B\d+>> outer_loop:none 149 /// CHECK-DAG: Sub loop:<<Loop>> outer_loop:none 150 /// CHECK-DAG: And loop:<<Loop>> outer_loop:none 151 /// CHECK-DAG: Sub loop:<<Loop>> outer_loop:none 152 /// CHECK-DAG: And loop:<<Loop>> outer_loop:none 153 /// CHECK-DAG: Sub loop:<<Loop>> outer_loop:none 154 /// CHECK-DAG: And loop:<<Loop>> outer_loop:none 155 /// CHECK-DAG: Sub loop:<<Loop>> outer_loop:none 156 /// CHECK-DAG: And loop:<<Loop>> outer_loop:none 157 158 /// CHECK-START-X86_64: long Main.reset_lowest_set_bit_64(long) instruction_simplifier_x86_64 (after) 159 /// CHECK-IF: hasIsaFeature('avx') or hasIsaFeature('avx2') 160 /// CHECK-DAG: X86MaskOrResetLeastSetBit loop:<<Loop:B\d+>> outer_loop:none 161 /// CHECK-DAG: X86MaskOrResetLeastSetBit loop:<<Loop>> outer_loop:none 162 /// CHECK-DAG: X86MaskOrResetLeastSetBit loop:<<Loop>> outer_loop:none 163 /// CHECK-DAG: X86MaskOrResetLeastSetBit loop:<<Loop>> outer_loop:none 164 /// CHECK-FI: 165 166 /// CHECK-START-X86_64: long Main.reset_lowest_set_bit_64(long) instruction_simplifier_x86_64 (after) 167 /// CHECK-IF: hasIsaFeature('avx') or hasIsaFeature('avx2') 168 /// CHECK-NOT: And loop:<<Loop>> outer_loop:none 169 /// CHECK-NOT: Sub loop:<<Loop>> outer_loop:none 170 /// CHECK-FI: reset_lowest_set_bit_64(long x)171 public static long reset_lowest_set_bit_64(long x) { 172 long y = x; 173 long j = 5; 174 long k = 10; 175 long l = 20; 176 for (long i = -64 ; i < 64; i++) { 177 y = i & i-1; 178 j += y; 179 j = j & j-1; 180 k +=j; 181 k = k & k-1; 182 l +=k; 183 l = l & l-1; 184 } 185 return y + j + k + l; 186 } 187 188 /// CHECK-START-X86_64: int Main.get_mask_lowest_set_bit_32(int) instruction_simplifier_x86_64 (before) 189 /// CHECK-DAG: Add loop:none 190 /// CHECK-DAG: Xor loop:none 191 192 /// CHECK-START-X86_64: int Main.get_mask_lowest_set_bit_32(int) instruction_simplifier_x86_64 (after) 193 /// CHECK-IF: hasIsaFeature('avx') or hasIsaFeature('avx2') 194 /// CHECK-DAG: X86MaskOrResetLeastSetBit loop:none 195 /// CHECK-FI: 196 197 /// CHECK-START-X86_64: int Main.get_mask_lowest_set_bit_32(int) instruction_simplifier_x86_64 (after) 198 /// CHECK-IF: hasIsaFeature('avx') or hasIsaFeature('avx2') 199 /// CHECK-NOT: Add loop:none 200 /// CHECK-NOT: Xor loop:none 201 /// CHECK-FI: get_mask_lowest_set_bit_32(int x)202 public static int get_mask_lowest_set_bit_32(int x) { 203 return (x-1) ^ x; 204 } 205 206 /// CHECK-START-X86_64: long Main.get_mask_lowest_set_bit_64(long) instruction_simplifier_x86_64 (before) 207 /// CHECK-DAG: Sub loop:none 208 /// CHECK-DAG: Xor loop:none 209 210 /// CHECK-START-X86_64: long Main.get_mask_lowest_set_bit_64(long) instruction_simplifier_x86_64 (after) 211 /// CHECK-IF: hasIsaFeature('avx') or hasIsaFeature('avx2') 212 /// CHECK-DAG: X86MaskOrResetLeastSetBit loop:none 213 /// CHECK-FI: 214 215 /// CHECK-START-X86_64: long Main.get_mask_lowest_set_bit_64(long) instruction_simplifier_x86_64 (after) 216 /// CHECK-IF: hasIsaFeature('avx') or hasIsaFeature('avx2') 217 /// CHECK-NOT: Sub loop:none 218 /// CHECK-NOT: Xor loop:none 219 /// CHECK-FI: get_mask_lowest_set_bit_64(long x)220 public static long get_mask_lowest_set_bit_64(long x) { 221 return (x-1) ^ x; 222 } 223 main(String[] args)224 public static void main(String[] args) { 225 int x = 50; 226 int y = x/2; 227 long a = Long.MAX_VALUE; 228 long b = Long.MAX_VALUE/2; 229 assertIntEquals(0,and_not_32(x,y)); 230 assertLongEquals(0L, and_not_64(a,b)); 231 assertIntEquals(-20502606, reset_lowest_set_bit_32(x)); 232 assertLongEquals(-20502606L, reset_lowest_set_bit_64(a)); 233 assertLongEquals(-20502606L, reset_lowest_set_bit_64(b)); 234 assertIntEquals(1, get_mask_lowest_set_bit_32(y)); 235 assertLongEquals(1L, get_mask_lowest_set_bit_64(b)); 236 } 237 } 238