Commit ebf8f0ea by Kirill Yukhin

bmiintrin.h (_bextr_u32): New.

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
parent 7350faad
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
......
......@@ -54,6 +54,12 @@ __bextr_u32 (unsigned int __X, unsigned int __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)
{
return __X & -__X;
......@@ -93,6 +99,12 @@ __bextr_u64 (unsigned long long __X, unsigned long long __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)
{
return __X & -__X;
......
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
......@@ -152,7 +160,7 @@
* 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
......@@ -442,7 +450,7 @@
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>
......@@ -810,7 +818,7 @@
* 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
......
/* { 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>
......@@ -22,6 +22,14 @@ func_bextr32 (unsigned int X, unsigned int 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)
{
return __blsi_u32(X);
......
/* { 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>
......@@ -22,6 +22,14 @@ func_bextr64 (unsigned long long X, unsigned long long 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)
{
return __blsi_u64 (X);
......
/* { 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();
}
}
/* { 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();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment