This is the mail archive of the gcc@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: builtin ffs vs. renamed ffs (vms-crtl.h)




Sent from my iPhone

On May 7, 2010, at 11:20 PM, Jay K <jay.krell@cornell.edu> wrote:


In gcc for VMS there is some mechanism to rename functions. See the files:

/src/gcc-4.5.0/gcc/config/vms/vms-crtl-64.h
/src/gcc-4.5.0/gcc/config/vms/vms-crtl.h


which are mostly just lists of function from/to.



As well in gcc there is a mechanism for optimizing various "builtin" functions, like ffs.

For builtins you should look at how PowerPC Darwin handles the long double builtins since they are renamed if long double is 128bit.


Thanks,
Andrew Pinski




These two mechanisms seem to conflict or be applied in the wrong order.
I didn't look at it deeply.



The symptom is that if you add ffs (to decc$ffs) to vms-crtl.h, the translation
is not done, and you end up with unresolved external ffs.



If you #if out the support for "builtin ffs", it works.



My local hack is below but obviously that's not the way.



I'll enter a bug.



Thanks, - Jay


diff -u /src/orig/gcc-4.5.0/gcc/builtins.c ./builtins.c
--- /src/orig/gcc-4.5.0/gcc/builtins.c 2010-04-13 06:47:11.000000000 -0700
+++ ./builtins.c 2010-05-07 23:11:30.000000000 -0700
@@ -51,6 +51,8 @@
#include "value-prof.h"
#include "diagnostic.h"


+#define DISABLE_FFS
+
 #ifndef SLOW_UNALIGNED_ACCESS
 #define SLOW_UNALIGNED_ACCESS(MODE, ALIGN) STRICT_ALIGNMENT
 #endif
@@ -5899,6 +5901,7 @@
     return target;
       break;

+#ifndef DISABLE_FFS
     CASE_INT_FN (BUILT_IN_FFS):
     case BUILT_IN_FFSIMAX:
       target = expand_builtin_unop (target_mode, exp, target,
@@ -5906,6 +5909,7 @@
       if (target)
     return target;
       break;
+#endif

CASE_INT_FN (BUILT_IN_CLZ):
case BUILT_IN_CLZIMAX:
@@ -13612,6 +13616,7 @@
case BUILT_IN_ABORT:
abort_libfunc = set_user_assembler_libfunc ("abort", asmspec);
break;
+#ifndef DISABLE_FFS
case BUILT_IN_FFS:
if (INT_TYPE_SIZE < BITS_PER_WORD)
{
@@ -13620,6 +13625,7 @@
MODE_INT, 0), "ffs");
}
break;
+#endif
default:
break;
}
diff -u /src/orig/gcc-4.5.0/gcc/optabs.c ./optabs.c
--- /src/orig/gcc-4.5.0/gcc/optabs.c 2010-03-19 12:45:01.000000000 -0700
+++ ./optabs.c 2010-05-07 23:11:36.000000000 -0700
@@ -45,6 +45,8 @@
#include "basic-block.h"
#include "target.h"


+#define DISABLE_FFS
+
 /* Each optab contains info on how this target machine
    can perform a particular operation
    for all sizes and kinds of operands.
@@ -3240,6 +3242,7 @@
     return temp;
     }

+#ifndef DISABLE_FFS
   /* Try implementing ffs (x) in terms of clz (x).  */
   if (unoptab == ffs_optab)
     {
@@ -3247,6 +3250,7 @@
       if (temp)
     return temp;
     }
+#endif

   /* Try implementing ctz (x) in terms of clz (x).  */
   if (unoptab == ctz_optab)
@@ -3268,7 +3272,11 @@

/* All of these functions return small values. Thus we choose to
have them return something that isn't a double-word. */
- if (unoptab == ffs_optab || unoptab == clz_optab || unoptab == ctz_optab
+ if (
+#ifndef DISABLE_FFS
+ unoptab == ffs_optab ||
+#endif
+ unoptab == clz_optab || unoptab == ctz_optab
|| unoptab == popcount_optab || unoptab == parity_optab)
outmode
= GET_MODE (hard_libcall_value (TYPE_MODE (integer_type_node),
@@ -6301,7 +6309,9 @@
init_optab (addcc_optab, UNKNOWN);
init_optab (one_cmpl_optab, NOT);
init_optab (bswap_optab, BSWAP);
+#ifndef DISABLE_FFS
init_optab (ffs_optab, FFS);
+#endif
init_optab (clz_optab, CLZ);
init_optab (ctz_optab, CTZ);
init_optab (popcount_optab, POPCOUNT);
@@ -6558,9 +6568,11 @@
one_cmpl_optab->libcall_basename = "one_cmpl";
one_cmpl_optab->libcall_suffix = '2';
one_cmpl_optab->libcall_gen = gen_int_libfunc;
+#ifndef DISABLE_FFS
ffs_optab->libcall_basename = "ffs";
ffs_optab->libcall_suffix = '2';
ffs_optab->libcall_gen = gen_int_libfunc;
+#endif
clz_optab->libcall_basename = "clz";
clz_optab->libcall_suffix = '2';
clz_optab->libcall_gen = gen_int_libfunc;
@@ -6643,11 +6655,13 @@
satfractuns_optab->libcall_basename = "satfractuns";
satfractuns_optab->libcall_gen = gen_satfractuns_conv_libfunc;


+#ifndef DISABLE_FFS
/* The ffs function operates on `int'. Fall back on it if we do not
have a libgcc2 function for that width. */
if (INT_TYPE_SIZE < BITS_PER_WORD)
set_optab_libfunc (ffs_optab, mode_for_size (INT_TYPE_SIZE, MODE_INT, 0),
"ffs");
+#endif


/* Explicitly initialize the bswap libfuncs since we need them to be
valid for things other than word_mode. */



Thanks, - Jay



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