aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSebastian Pop <sebastian.pop@amd.com>2009-12-02 05:49:34 +0000
committerSebastian Pop <spop@gcc.gnu.org>2009-12-02 05:49:34 +0000
commitab0e4a354d3024397df0238a44dfeff5f37e5e49 (patch)
tree9e6cf71e5c3021a217f2803f6ece40e4083a4c53 /gcc
parent6a72cb46b22baf7fbb3f5c2eff0b44b37da1487c (diff)
downloadgcc-ab0e4a354d3024397df0238a44dfeff5f37e5e49.zip
gcc-ab0e4a354d3024397df0238a44dfeff5f37e5e49.tar.gz
gcc-ab0e4a354d3024397df0238a44dfeff5f37e5e49.tar.bz2
lzcount intrinsics.
* config/i386/abmintrin.h (__lzcnt16): New. (__lzcnt): New. (__lzcnt64): New. * config/i386/i386-builtin-types.def (UINT16_FTYPE_UINT16): New. * config/i386/i386.c (IX86_BUILTIN_CLZS): New. (bdesc_special_args): Add __builtin_clzs. (ix86_expand_args_builtin): Handle UINT16_FTYPE_UINT16. From-SVN: r154895
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/i386/abmintrin.h19
-rw-r--r--gcc/config/i386/i386-builtin-types.def1
-rw-r--r--gcc/config/i386/i386.c5
4 files changed, 35 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d04fb61..a28fc61 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,15 @@
2009-12-01 Sebastian Pop <sebastian.pop@amd.com>
+ * config/i386/abmintrin.h (__lzcnt16): New.
+ (__lzcnt): New.
+ (__lzcnt64): New.
+ * config/i386/i386-builtin-types.def (UINT16_FTYPE_UINT16): New.
+ * config/i386/i386.c (IX86_BUILTIN_CLZS): New.
+ (bdesc_special_args): Add __builtin_clzs.
+ (ix86_expand_args_builtin): Handle UINT16_FTYPE_UINT16.
+
+2009-12-01 Sebastian Pop <sebastian.pop@amd.com>
+
* config/i386/abmintrin.h (_mm_popcnt_u32): New.
(_mm_popcnt_u64): New.
diff --git a/gcc/config/i386/abmintrin.h b/gcc/config/i386/abmintrin.h
index 317bb98..b85bdb7 100644
--- a/gcc/config/i386/abmintrin.h
+++ b/gcc/config/i386/abmintrin.h
@@ -32,6 +32,25 @@
#ifndef _ABMINTRIN_H_INCLUDED
#define _ABMINTRIN_H_INCLUDED
+extern __inline unsigned short __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+__lzcnt16 (unsigned short __X)
+{
+ return __builtin_clzs (__X);
+}
+
+extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+__lzcnt (unsigned int __X)
+{
+ return __builtin_clz (__X);
+}
+
+#ifdef __x86_64__
+extern __inline unsigned long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+__lzcnt64 (unsigned long __X)
+{
+ return __builtin_clzl (__X);
+}
+#endif
/* Calculate a number of bits set to 1. */
extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
diff --git a/gcc/config/i386/i386-builtin-types.def b/gcc/config/i386/i386-builtin-types.def
index 0843d4c..e9e4d0c4 100644
--- a/gcc/config/i386/i386-builtin-types.def
+++ b/gcc/config/i386/i386-builtin-types.def
@@ -142,6 +142,7 @@ DEF_FUNCTION_TYPE (INT64, INT64)
DEF_FUNCTION_TYPE (INT64, V2DF)
DEF_FUNCTION_TYPE (INT64, V4SF)
DEF_FUNCTION_TYPE (UINT64, INT)
+DEF_FUNCTION_TYPE (UINT16, UINT16)
DEF_FUNCTION_TYPE (UINT64, PUNSIGNED)
DEF_FUNCTION_TYPE (V16QI, PCCHAR)
DEF_FUNCTION_TYPE (V16QI, V16QI)
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 21be89f..462f2d5 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -21254,6 +21254,8 @@ enum ix86_builtins
IX86_BUILTIN_LWPINS32,
IX86_BUILTIN_LWPINS64,
+ IX86_BUILTIN_CLZS,
+
IX86_BUILTIN_MAX
};
@@ -21535,6 +21537,8 @@ static const struct builtin_description bdesc_special_args[] =
{ OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinssi3, "__builtin_ia32_lwpins32", IX86_BUILTIN_LWPINS64, UNKNOWN, (int) UCHAR_FTYPE_UINT_UINT_UINT },
{ OPTION_MASK_ISA_LWP, CODE_FOR_lwp_lwpinsdi3, "__builtin_ia32_lwpins64", IX86_BUILTIN_LWPINS64, UNKNOWN, (int) UCHAR_FTYPE_UINT64_UINT_UINT },
+ { OPTION_MASK_ISA_ABM, CODE_FOR_clzhi2_abm, "__builtin_clzs", IX86_BUILTIN_CLZS, UNKNOWN, (int) UINT16_FTYPE_UINT16 },
+
};
/* Builtins with variable number of arguments. */
@@ -23359,6 +23363,7 @@ ix86_expand_args_builtin (const struct builtin_description *d,
case FLOAT_FTYPE_FLOAT:
case INT_FTYPE_INT:
case UINT64_FTYPE_INT:
+ case UINT16_FTYPE_UINT16:
case INT64_FTYPE_INT64:
case INT64_FTYPE_V4SF:
case INT64_FTYPE_V2DF: