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