This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] Move the popcnt intrinsics to a separate file


On Tue, Dec 1, 2009 at 09:40, Richard Henderson <rth@redhat.com> wrote:
>> Â Â Â Â* config/i386/abmintrin.h (__lzcnt16): New.
>> Â Â Â Â(__lzcnt): New.
>> Â Â Â Â(__lzcnt64): New.
>
> Ok, with modifications...
>
>> Â Â Â Â* config/i386/i386-builtin-types.def (UINT16_FTYPE_UINT16): New.
>> Â Â Â Â(UINT_FTYPE_UINT): New.
>> Â Â Â Â(UINT64_FTYPE_UINT64): New.
>> Â Â Â Â* config/i386/i386.c (IX86_BUILTIN_LZCNT16): New.
>> Â Â Â Â(IX86_BUILTIN_LZCNT32): New.
>> Â Â Â Â(IX86_BUILTIN_LZCNT64): New.
>> Â Â Â Â(bdesc_special_args): Add __builtin_lzcnt16, __builtin_lzcnt32,
>> Â Â Â Âand __builtin_lzcnt64.
>> Â Â Â Â(ix86_expand_args_builtin): Handle UINT16_FTYPE_UINT16,
>> Â Â Â ÂUINT_FTYPE_UINT, and UINT64_FTYPE_UINT64.
>
> Not ok. ÂThese builtins are exactly __builtin_clz et al.
>

I see only these builtins:

DEF_GCC_BUILTIN        (BUILT_IN_CLZ, "clz", BT_FN_INT_UINT,
ATTR_CONST_NOTHROW_LIST)
DEF_GCC_BUILTIN        (BUILT_IN_CLZIMAX, "clzimax",
BT_FN_INT_UINTMAX, ATTR_CONST_NOTHROW_LIST)
DEF_GCC_BUILTIN        (BUILT_IN_CLZL, "clzl", BT_FN_INT_ULONG,
ATTR_CONST_NOTHROW_LIST)
DEF_GCC_BUILTIN        (BUILT_IN_CLZLL, "clzll", BT_FN_INT_ULONGLONG,
ATTR_CONST_NOTHROW_LIST)

and I could use __builtin_clz to implement __lzcnt
and __builtin_clzl to implement __lzcnt64

but there is no equivalent for __lzcnt16: i.e.

extern __inline unsigned short __attribute__((__gnu_inline__,
__always_inline__, __artificial__))
__lzcnt16 (unsigned short __X)

If I'm implementing this with a

  return __builtin_clz (__X);

then the input type size would be unsigned int instead of unsigned
short.  Would then the attached patch be ok?

	* 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.

Thanks,
Sebastian
From 7c1232d789b58a75cb94588c2c9bb5b48c31e76b Mon Sep 17 00:00:00 2001
From: Sebastian Pop <sebpop@gmail.com>
Date: Mon, 30 Nov 2009 22:39:00 -0600
Subject: [PATCH] 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.
---
 gcc/config/i386/abmintrin.h            |   19 +++++++++++++++++++
 gcc/config/i386/i386-builtin-types.def |    1 +
 gcc/config/i386/i386.c                 |    5 +++++
 3 files changed, 25 insertions(+), 0 deletions(-)

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..e9e4d0c 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 be8f38b..4e39199 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -21241,6 +21241,8 @@ enum ix86_builtins
   IX86_BUILTIN_LWPINS32,
   IX86_BUILTIN_LWPINS64,
 
+  IX86_BUILTIN_CLZS,
+
   IX86_BUILTIN_MAX
 };
 
@@ -21522,6 +21524,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.  */
@@ -23346,6 +23350,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:
-- 
1.6.0.4


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]