1 /*
   2  * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /*
  25  * @test
  26  * @bug 8031321
  27  * @summary Support BMI1 instructions on x86/x64
  28  * @run main/othervm -server -Xbatch -XX:-TieredCompilation -XX:CompileCommand=compileonly,BMITests.* BMI1
  29  *
  30  */
  31 
  32 class MemI {
  33   public int x;
  34   public MemI(int x) { this.x = x; }
  35 }
  36 
  37 class MemL {
  38   public long x;
  39   public MemL(long x) { this.x = x; }
  40 }
  41 
  42 class BMITests {
  43   static int andnl(int src1, int src2) {
  44     return ~src1 & src2;
  45   }
  46   static long andnq(long src1, long src2) {
  47     return ~src1 & src2;
  48   }
  49   static int andnl(int src1, MemI src2) {
  50     return ~src1 & src2.x;
  51   }
  52   static long andnq(long src1, MemL src2) {
  53     return ~src1 & src2.x;
  54   }
  55   static int blsil(int src1) {
  56     return src1 & -src1;
  57   }
  58   static long blsiq(long src1) {
  59     return src1 & -src1;
  60   }
  61   static int blsil(MemI src1) {
  62     return src1.x & -src1.x;
  63   }
  64   static long blsiq(MemL src1) {
  65     return src1.x & -src1.x;
  66   }
  67   static int blsmskl(int src1) {
  68     return (src1 - 1) ^ src1;
  69   }
  70   static long blsmskq(long src1) {
  71     return (src1 - 1) ^ src1;
  72   }
  73   static int blsmskl(MemI src1) {
  74     return (src1.x - 1) ^ src1.x;
  75   }
  76   static long blsmskq(MemL src1) {
  77     return (src1.x - 1) ^ src1.x;
  78   }
  79   static int blsrl(int src1) {
  80     return (src1 - 1) & src1;
  81   }
  82   static long blsrq(long src1) {
  83     return (src1 - 1) & src1;
  84   }
  85   static int blsrl(MemI src1) {
  86     return (src1.x - 1) & src1.x;
  87   }
  88   static long blsrq(MemL src1) {
  89     return (src1.x - 1) & src1.x;
  90   }
  91   static int lzcntl(int src1) {
  92     return Integer.numberOfLeadingZeros(src1);
  93   }
  94   static int lzcntq(long src1) {
  95     return Long.numberOfLeadingZeros(src1);
  96   }
  97   static int tzcntl(int src1) {
  98     return Integer.numberOfTrailingZeros(src1);
  99   }
 100   static int tzcntq(long src1) {
 101     return Long.numberOfTrailingZeros(src1);
 102   }
 103 }
 104 
 105 public class BMI1 {
 106   private static void fail() {
 107     System.out.println("FAILED");
 108     System.exit(97);
 109   }
 110   private final static int ITERATIONS = 1000000;
 111 
 112   public static void main(String[] args) {
 113     int ix = 0x01234567;
 114     int iy = 0x89abcdef;
 115     MemI imy = new MemI(iy);
 116     long lx = 0x0123456701234567L;
 117     long ly = 0x89abcdef89abcdefL;
 118     MemL lmy = new MemL(ly);
 119 
 120     { // match(Set dst (AndI (XorI src1 minus_1) src2))
 121       int z = BMITests.andnl(ix, iy);
 122       for (int i = 0; i < ITERATIONS; i++) {
 123         int ii = BMITests.andnl(ix, iy);
 124         if (ii != z) {
 125           fail();
 126         }
 127       }
 128     }
 129     { // match(Set dst (AndL (XorL src1 minus_1) src2))
 130       long z = BMITests.andnq(lx, ly);
 131       for (int i = 0; i < ITERATIONS; i++) {
 132         long ll = BMITests.andnq(lx, ly);
 133         if (ll != z) {
 134           fail();
 135         }
 136       }
 137     }
 138     { // match(Set dst (AndI (XorI src1 minus_1) (LoadI src2)))
 139       int z = BMITests.andnl(ix, imy);
 140       for (int i = 0; i < ITERATIONS; i++) {
 141         int ii = BMITests.andnl(ix, imy);
 142         if (ii != z) {
 143           fail();
 144         }
 145       }
 146     }
 147     { // match(Set dst (AndL (XorL src1 minus_1) (LoadL src2)))
 148       long z = BMITests.andnq(lx, lmy);
 149       for (int i = 0; i < ITERATIONS; i++) {
 150         long ll = BMITests.andnq(lx, lmy);
 151         if (ll != z) {
 152           fail();
 153         }
 154       }
 155     }
 156     { // match(Set dst (AndI (SubI imm_zero src) src))
 157       int z = BMITests.blsil(ix);
 158       for (int i = 0; i < ITERATIONS; i++) {
 159         int ii = BMITests.blsil(ix);
 160         if (ii != z) {
 161           fail();
 162         }
 163       }
 164     }
 165     { // match(Set dst (AndL (SubL imm_zero src) src))
 166       long z = BMITests.blsiq(lx);
 167       for (int i = 0; i < ITERATIONS; i++) {
 168         long ll = BMITests.blsiq(lx);
 169         if (ll != z) {
 170           fail();
 171         }
 172       }
 173     }
 174     { // match(Set dst (AndI (SubI imm_zero (LoadI src) ) (LoadI src) ))
 175       int z = BMITests.blsil(imy);
 176       for (int i = 0; i < ITERATIONS; i++) {
 177         int ii = BMITests.blsil(imy);
 178         if (ii != z) {
 179           fail();
 180         }
 181       }
 182     }
 183     { // match(Set dst (AndL (SubL imm_zero (LoadL src) ) (LoadL src) ))
 184       long z = BMITests.blsiq(lmy);
 185       for (int i = 0; i < ITERATIONS; i++) {
 186         long ll = BMITests.blsiq(lmy);
 187         if (ll != z) {
 188           fail();
 189         }
 190       }
 191     }
 192 
 193     { // match(Set dst (XorI (AddI src minus_1) src))
 194       int z = BMITests.blsmskl(ix);
 195       for (int i = 0; i < ITERATIONS; i++) {
 196         int ii = BMITests.blsmskl(ix);
 197         if (ii != z) {
 198           fail();
 199         }
 200       }
 201     }
 202     { // match(Set dst (XorL (AddL src minus_1) src))
 203       long z = BMITests.blsmskq(lx);
 204       for (int i = 0; i < ITERATIONS; i++) {
 205         long ll = BMITests.blsmskq(lx);
 206         if (ll != z) {
 207           fail();
 208         }
 209       }
 210     }
 211     { // match(Set dst (XorI (AddI (LoadI src) minus_1) (LoadI src) ) )
 212       int z = BMITests.blsmskl(imy);
 213       for (int i = 0; i < ITERATIONS; i++) {
 214         int ii = BMITests.blsmskl(imy);
 215         if (ii != z) {
 216           fail();
 217         }
 218       }
 219     }
 220     {  // match(Set dst (XorL (AddL (LoadL src) minus_1) (LoadL src) ) )
 221       long z = BMITests.blsmskq(lmy);
 222       for (int i = 0; i < ITERATIONS; i++) {
 223         long ll = BMITests.blsmskq(lmy);
 224         if (ll != z) {
 225           fail();
 226         }
 227       }
 228     }
 229 
 230     { //  match(Set dst (AndI (AddI src minus_1) src) )
 231       int z = BMITests.blsrl(ix);
 232       for (int i = 0; i < ITERATIONS; i++) {
 233         int ii = BMITests.blsrl(ix);
 234         if (ii != z) {
 235           fail();
 236         }
 237       }
 238     }
 239     { // match(Set dst (AndL (AddL src minus_1) src) )
 240       long z = BMITests.blsrq(lx);
 241       for (int i = 0; i < ITERATIONS; i++) {
 242         long ll = BMITests.blsrq(lx);
 243         if (ll != z) {
 244           fail();
 245         }
 246       }
 247     }
 248     { // match(Set dst (AndI (AddI (LoadI src) minus_1) (LoadI src) ) )
 249       int z = BMITests.blsrl(imy);
 250       for (int i = 0; i < ITERATIONS; i++) {
 251         int ii = BMITests.blsrl(imy);
 252         if (ii != z) {
 253           fail();
 254         }
 255       }
 256     }
 257     { // match(Set dst (AndL (AddL (LoadL src) minus_1) (LoadL src)) )
 258       long z = BMITests.blsrq(lmy);
 259       for (int i = 0; i < ITERATIONS; i++) {
 260         long ll = BMITests.blsrq(lmy);
 261         if (ll != z) {
 262           fail();
 263         }
 264       }
 265     }
 266 
 267     {
 268       int z = BMITests.lzcntl(ix);
 269       for (int i = 0; i < ITERATIONS; i++) {
 270         int ii = BMITests.lzcntl(ix);
 271         if (ii != z) {
 272           fail();
 273         }
 274       }
 275     }
 276     {
 277       int z = BMITests.lzcntq(lx);
 278       for (int i = 0; i < ITERATIONS; i++) {
 279         int ii = BMITests.lzcntq(lx);
 280         if (ii != z) {
 281           fail();
 282         }
 283       }
 284     }
 285 
 286     {
 287       int z = BMITests.tzcntl(ix);
 288       for (int i = 0; i < ITERATIONS; i++) {
 289         int ii = BMITests.tzcntl(ix);
 290         if (ii != z) {
 291           fail();
 292         }
 293       }
 294     }
 295     {
 296       int z = BMITests.tzcntq(lx);
 297       for (int i = 0; i < ITERATIONS; i++) {
 298         int ii = BMITests.tzcntq(lx);
 299         if (ii != z) {
 300           fail();
 301         }
 302       }
 303     }
 304   }
 305 }