aboutsummaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
Diffstat (limited to 'libgcc')
-rw-r--r--libgcc/config/i386/sfp-machine.h20
1 files changed, 17 insertions, 3 deletions
diff --git a/libgcc/config/i386/sfp-machine.h b/libgcc/config/i386/sfp-machine.h
index f15d29d..172ebc7 100644
--- a/libgcc/config/i386/sfp-machine.h
+++ b/libgcc/config/i386/sfp-machine.h
@@ -75,10 +75,24 @@ void __sfp_handle_exceptions (int);
/* Define ALIASNAME as a strong alias for NAME. */
#if defined __MACH__
-/* Mach-O doesn't support aliasing. If these functions ever return
- anything but CMPtype we need to revisit this... */
+/* Mach-O doesn't support aliasing, so we build a secondary function for
+ the alias - we need to do a bit of a dance to find out what the type of
+ the arguments is and then apply that to the secondary function.
+ If these functions ever return anything but CMPtype we need to revisit
+ this... */
+typedef float alias_HFtype __attribute__ ((mode (HF)));
+typedef float alias_SFtype __attribute__ ((mode (SF)));
+typedef float alias_DFtype __attribute__ ((mode (DF)));
+typedef float alias_TFtype __attribute__ ((mode (TF)));
+#define ALIAS_SELECTOR \
+ CMPtype (*) (alias_HFtype, alias_HFtype): (alias_HFtype) 0, \
+ CMPtype (*) (alias_SFtype, alias_SFtype): (alias_SFtype) 0, \
+ CMPtype (*) (alias_DFtype, alias_DFtype): (alias_DFtype) 0, \
+ CMPtype (*) (alias_TFtype, alias_TFtype): (alias_TFtype) 0
#define strong_alias(name, aliasname) \
- CMPtype aliasname (TFtype a, TFtype b) { return name(a, b); }
+ CMPtype aliasname (__typeof (_Generic (name, ALIAS_SELECTOR)) a, \
+ __typeof (_Generic (name, ALIAS_SELECTOR)) b) \
+ { return name (a, b); }
#else
# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
# define _strong_alias(name, aliasname) \