bmiintrin.h (_bextr_u32): New.
authorKirill Yukhin <kyukhin@gcc.gnu.org>
Fri, 28 Jun 2013 09:02:46 +0000 (09:02 +0000)
committerKirill Yukhin <kyukhin@gcc.gnu.org>
Fri, 28 Jun 2013 09:02:46 +0000 (09:02 +0000)
ChangeLog:
* config/i386/bmiintrin.h (_bextr_u32): New.
(_bextr_u64): Ditto.

testsuite/ChangeLog:
* gcc.target/i386/bmi-1.c: Extend with new instrinsic.
Fix scan patterns.
* gcc.target/i386/bmi-1.c: Ditto.
* gcc.target/i386/bmi-bextr-4.c: New.
* gcc.target/i386/bmi-bextr-5.c: Ditto.

From-SVN: r200505

gcc/ChangeLog
gcc/config/i386/bmiintrin.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/bmi-1.c
gcc/testsuite/gcc.target/i386/bmi-2.c
gcc/testsuite/gcc.target/i386/bmi-bextr-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/bmi-bextr-5.c [new file with mode: 0644]

index 37eacf446b677d554163a7614425599b779b6236..251de55c578c01a66b1439fdcc98d5db3f8846bd 100644 (file)
@@ -1,3 +1,8 @@
+2013-06-28  Kirill Yukhin  <kirill.yukhin@intel.com>
+
+       * config/i386/bmiintrin.h (_bextr_u32): New.
+       (_bextr_u64): Ditto.
+
 2013-06-27  Richard Sandiford  <rdsandiford@googlemail.com>
 
        * config.gcc (mips*-mti-elf*, mips*-sde-elf*, mips64r5900-*-elf*)
@@ -19,7 +24,7 @@
        * config/mips/mips.h (BASE_DRIVER_SELF_SPECS): m14ke* implies
        -mdspr2.
        * doc/invoke.texi: Add -m14kc.
+
 2013-06-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/57623
index cb6ffa556ff928dd5fb7d7afebeb67bea1a99b04..281ebaaf4f299af71e9fe7b5c17cee0147dc5a44 100644 (file)
@@ -53,6 +53,12 @@ __bextr_u32 (unsigned int __X, unsigned int __Y)
   return __builtin_ia32_bextr_u32 (__X, __Y);
 }
 
+extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_bextr_u32 (unsigned int __X, unsigned int __Y, unsigned __Z)
+{
+  return __builtin_ia32_bextr_u32 (__X, ((__Y & 0xff) | ((__Z & 0xff) << 8)));
+}
+
 extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
 __blsi_u32 (unsigned int __X)
 {
@@ -92,6 +98,12 @@ __bextr_u64 (unsigned long long __X, unsigned long long __Y)
   return __builtin_ia32_bextr_u64 (__X, __Y);
 }
 
+extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_bextr_u64 (unsigned long long __X, unsigned int __Y, unsigned int __Z)
+{
+  return __builtin_ia32_bextr_u64 (__X, ((__Y & 0xff) | ((__Z & 0xff) << 8)));
+}
+
 extern __inline unsigned long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
 __blsi_u64 (unsigned long long __X)
 {
index 2c2443f6a1e8bc3216542a411186681bf51358b2..e810fbe4ab73f2a01c6b6514645b5e6d89a9bf72 100644 (file)
@@ -1,3 +1,11 @@
+2013-06-28  Kirill Yukhin  <kirill.yukhin@intel.com>
+
+        * gcc.target/i386/bmi-1.c: Extend with new instrinsic.
+        Fix scan patterns.
+        * gcc.target/i386/bmi-1.c: Ditto.
+        * gcc.target/i386/bmi-bextr-4.c: New.
+        * gcc.target/i386/bmi-bextr-5.c: Ditto.
+
 2013-06-28  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/57682
        * g++.dg/cilk-plus/AN/postincr_test.cc: Likewise.
        * g++.dg/cilk-plus/cilk-plus.exp: New script.
        * gcc/testsuite/g++.dg/dg.exp: Included Cilk Plus C++ tests in the list.
-       
+
 2013-06-21  Joseph Myers  <joseph@codesourcery.com>
 
        PR other/53317
 
        PR c/57563
        * c-c++-common/cilk-plus/AN/builtin_fn_mutating.c (main): Fixed a bug
-       in how we check __sec_reduce_mutating function's result.        
+       in how we check __sec_reduce_mutating function's result.
 
 2013-06-10  Michael Meissner  <meissner@linux.vnet.ibm.com>
            Pat Haugen <pthaugen@us.ibm.com>
        * c-c++-common/cilk-plus/AN/if_test_errors.c (main): New testcase.
        * c-c++-common/cilk-plus/AN/rank_mismatch.c: Added a '-w' option to
        dg-option and an header comment.
-       
+
 2013-06-03  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/57419
index dc964ba3d9234e81779ec578747c9183c4fb5e26..a05cb275adc0086ff468c75f07cce29aed0c6977 100644 (file)
@@ -1,11 +1,11 @@
 /* { dg-do compile } */
 /* { dg-options "-O2 -mbmi " } */
-/* { dg-final { scan-assembler "andn\[^\\n]*(%|)eax" } } */
-/* { dg-final { scan-assembler "bextr\[^\\n]*(%|)eax" } } */
-/* { dg-final { scan-assembler "blsi\[^\\n]*(%|)eax" } } */
-/* { dg-final { scan-assembler "blsmsk\[^\\n]*(%|)eax" } } */
-/* { dg-final { scan-assembler "blsr\[^\\n]*(%|)eax" } } */
-/* { dg-final { scan-assembler "tzcntl\[^\\n]*(%|)eax" } } */
+/* { dg-final { scan-assembler "andn\[^\\n]*eax" } } */
+/* { dg-final { scan-assembler-times "bextr\[ \\t]+\[^\\n]*eax" 2 } } */
+/* { dg-final { scan-assembler "blsi\[^\\n]*eax" } } */
+/* { dg-final { scan-assembler "blsmsk\[^\\n]*eax" } } */
+/* { dg-final { scan-assembler "blsr\[^\\n]*eax" } } */
+/* { dg-final { scan-assembler "tzcntl\[^\\n]*eax" } } */
 
 #include <x86intrin.h>
 
@@ -21,6 +21,14 @@ func_bextr32 (unsigned int X, unsigned int Y)
   return __bextr_u32(X, Y);
 }
 
+unsigned int
+func_bextr32_3args (unsigned int X,
+                   unsigned int Y,
+                   unsigned int Z)
+{
+  return _bextr_u32(X, Y, Z);
+}
+
 unsigned int
 func_blsi32 (unsigned int X)
 {
index 56f73876d0c4c44eab8121c1495c30db5b52c778..68d06a20540fba77c5d321ca7d82217bf3a96739 100644 (file)
@@ -1,11 +1,11 @@
 /* { dg-do compile { target { ! { ia32 }  } } } */
 /* { dg-options "-O2 -mbmi " } */
-/* { dg-final { scan-assembler "andn\[^\\n]*(%|)rax" } } */
-/* { dg-final { scan-assembler "bextr\[^\\n]*(%|)rax" } } */
-/* { dg-final { scan-assembler "blsi\[^\\n]*(%|)rax" } } */
-/* { dg-final { scan-assembler "blsmsk\[^\\n]*(%|)rax" } } */
-/* { dg-final { scan-assembler "blsr\[^\\n]*(%|)rax" } } */
-/* { dg-final { scan-assembler "tzcntq\[^\\n]*(%|)rax" } } */
+/* { dg-final { scan-assembler "andn\[^\\n]*rax" } } */
+/* { dg-final { scan-assembler-times "bextr\[ \\t]+\[^\\n]*rax" 2 } } */
+/* { dg-final { scan-assembler "blsi\[^\\n]*rax" } } */
+/* { dg-final { scan-assembler "blsmsk\[^\\n]*rax" } } */
+/* { dg-final { scan-assembler "blsr\[^\\n]*rax" } } */
+/* { dg-final { scan-assembler "tzcntq\[^\\n]*rax" } } */
 
 #include <x86intrin.h>
 
@@ -21,6 +21,14 @@ func_bextr64 (unsigned long long X, unsigned long long Y)
   return __bextr_u64 (X, Y);
 }
 
+unsigned long long
+func_bextr64_3args (unsigned long long X,
+                   unsigned long long Y,
+                   unsigned long long Z)
+{
+  return _bextr_u64 (X, Y, Z);
+}
+
 unsigned long long
 func_blsi64 (unsigned long long X)
 {
diff --git a/gcc/testsuite/gcc.target/i386/bmi-bextr-4.c b/gcc/testsuite/gcc.target/i386/bmi-bextr-4.c
new file mode 100644 (file)
index 0000000..2318847
--- /dev/null
@@ -0,0 +1,49 @@
+/* { dg-do run { target { bmi } } } */
+/* { dg-require-effective-target bmi  } */
+/* { dg-options "-O2 -mbmi -fno-inline" } */
+
+#include <x86intrin.h>
+
+#include "bmi-check.h"
+
+unsigned calc_bextr_u32 (unsigned src1, unsigned src2)
+{
+  unsigned res = 0;
+  unsigned char start = (src2 & 0xff);
+  unsigned char len = (int) ((src2 >> 8) & 0xff);
+  if (start < 32) {
+    unsigned i;
+    unsigned last = (start+len) < 32 ? start+len : 32;
+
+    src1 >>= start;
+    for (i=start; i<last; ++i) {
+      res |= (src1 & 1) << (i-start);
+      src1 >>= 1;
+    }
+  }
+
+  return res;
+}
+
+static void
+bmi_test ()
+{
+  unsigned i;
+  unsigned char start, len;
+  unsigned src1 = 0xfacec0ff;
+  unsigned res, res_ref, src2;
+
+  for (i=0; i<5; ++i) {
+    start = i * 4;
+    len = i * 4;
+
+    src1 = src1 * 3;
+    src2 = (start & 0xff) | ((len & 0xff) << 8);
+
+    res_ref = calc_bextr_u32 (src1, src2);
+    res = _bextr_u32 (src1, start, len);
+
+    if (res != res_ref)
+      abort();
+  }
+}
diff --git a/gcc/testsuite/gcc.target/i386/bmi-bextr-5.c b/gcc/testsuite/gcc.target/i386/bmi-bextr-5.c
new file mode 100644 (file)
index 0000000..fd6e362
--- /dev/null
@@ -0,0 +1,48 @@
+/* { dg-do run { target { bmi && { ! ia32 } } } } */
+/* { dg-options "-O2 -mbmi -fno-inline" } */
+
+#include <x86intrin.h>
+
+#include "bmi-check.h"
+
+long long calc_bextr_u64 (unsigned long long src1,
+                         unsigned long long src2)
+{
+  long long res = 0;
+  unsigned char start = (src2 & 0xff);
+  unsigned char len = (int) ((src2 >> 8) & 0xff);
+  if (start < 64) {
+    unsigned i;
+    unsigned last = (start+len) < 64 ? start+len : 64;
+
+    src1 >>= start;
+    for (i=start; i<last; ++i) {
+      res |= (src1 & 1) << (i-start);
+      src1 >>= 1;
+    }
+  }
+
+  return res;
+}
+
+static void
+bmi_test ()
+{
+  unsigned i;
+  unsigned char start, len;
+  unsigned long long src1 = 0xfacec0ffeefacec0;
+  unsigned long long res, res_ref, src2;
+
+  for (i=0; i<5; ++i) {
+    start = i * 4;
+    len = i * 3;
+    src1 = src1 * 3;
+    src2 = (start & 0xff) | ((len & 0xff) << 8);
+
+    res_ref = calc_bextr_u64 (src1, src2);
+    res = _bextr_u64 (src1, start, len);
+
+    if (res != res_ref)
+      abort();
+  }
+}