diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 73d70a782b8..e46a0604085 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2011-02-07 Mike Stump + + PR target/47558 + Add __ieee_divdc3 entry point. + * config/i386/darwin.h (DECLARE_LIBRARY_RENAMES): Retain ___divdc3 + entry point. + (SUBTARGET_INIT_BUILTINS): Call darwin_rename_builtins. + * config/i386/i386.c (TARGET_INIT_LIBFUNCS): Likewise. + * config/darwin.c (darwin_rename_builtins): Add. + * config/darwin-protos.h (darwin_rename_builtins): Add. + 2011-02-07 Michael Meissner PR target/47636 diff --git a/gcc/config/darwin-protos.h b/gcc/config/darwin-protos.h index bf81ed97c4c..00230994ad5 100644 --- a/gcc/config/darwin-protos.h +++ b/gcc/config/darwin-protos.h @@ -124,3 +124,4 @@ extern bool darwin_use_anchors_for_symbol_p (const_rtx symbol); extern bool darwin_kextabi_p (void); extern void darwin_override_options (void); extern void darwin_patch_builtins (void); +extern void darwin_rename_builtins (void); diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c index cd6a815a483..8ccf18c4426 100644 --- a/gcc/config/darwin.c +++ b/gcc/config/darwin.c @@ -2823,6 +2823,34 @@ darwin_fold_builtin (tree fndecl, int n_args, tree *argp, return NULL_TREE; } +void +darwin_rename_builtins (void) +{ + /* The system ___divdc3 routine in libSystem on darwin10 is not + accurate to 1ulp, ours is, so we avoid ever using the system name + for this routine and instead install a non-conflicting name that + is accurate. + + When -ffast-math or -funsafe-math-optimizations is given, we can + use the faster version. */ + if (!flag_unsafe_math_optimizations) + { + int dcode = (BUILT_IN_COMPLEX_DIV_MIN + + DCmode - MIN_MODE_COMPLEX_FLOAT); + tree fn = built_in_decls[dcode]; + /* Fortran and c call TARGET_INIT_BUILTINS and + TARGET_INIT_LIBFUNCS at different times, so we have to put a + call into each to ensure that at least one of them is called + after build_common_builtin_nodes. A better fix is to add a + new hook to run after build_common_builtin_nodes runs. */ + if (fn) + set_user_assembler_name (fn, "___ieee_divdc3"); + fn = implicit_built_in_decls[dcode]; + if (fn) + set_user_assembler_name (fn, "___ieee_divdc3"); + } +} + static hashval_t cfstring_hash (const void *ptr) { diff --git a/gcc/config/i386/darwin.h b/gcc/config/i386/darwin.h index a9a2da4040e..9cf51e32600 100644 --- a/gcc/config/i386/darwin.h +++ b/gcc/config/i386/darwin.h @@ -309,5 +309,14 @@ do { \ #define SUBTARGET_INIT_BUILTINS \ do { \ darwin_init_cfstring_builtins ((unsigned) (IX86_BUILTIN_MAX));\ + darwin_rename_builtins (); \ } while(0) +/* The system ___divdc3 routine in libSystem on darwin10 is not + accurate to 1ulp, ours is, so we avoid ever using the system name + for this routine and instead install a non-conflicting name that is + accurate. See darwin_rename_builtins. */ +#ifdef L_divdc3 +#define DECLARE_LIBRARY_RENAMES \ + asm(".text; ___divdc3: jmp ___ieee_divdc3 ; .globl ___divdc3"); +#endif diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 4d927c2b259..12c7062e5ae 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -35040,6 +35040,11 @@ ix86_autovectorize_vector_sizes (void) #undef TARGET_CONDITIONAL_REGISTER_USAGE #define TARGET_CONDITIONAL_REGISTER_USAGE ix86_conditional_register_usage +#if TARGET_MACHO +#undef TARGET_INIT_LIBFUNCS +#define TARGET_INIT_LIBFUNCS darwin_rename_builtins +#endif + struct gcc_target targetm = TARGET_INITIALIZER; #include "gt-i386.h"