Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 14 Mar 2009 18:24:15 +0000 (UTC)
From:      David Schultz <das@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r189803 - head/lib/msun/src
Message-ID:  <200903141824.n2EIOFGJ003860@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: das
Date: Sat Mar 14 18:24:15 2009
New Revision: 189803
URL: http://svn.freebsd.org/changeset/base/189803

Log:
  Eliminate __real__ and __imag__ gccisms.

Modified:
  head/lib/msun/src/math_private.h
  head/lib/msun/src/s_cimag.c
  head/lib/msun/src/s_cimagf.c
  head/lib/msun/src/s_cimagl.c

Modified: head/lib/msun/src/math_private.h
==============================================================================
--- head/lib/msun/src/math_private.h	Sat Mar 14 18:19:50 2009	(r189802)
+++ head/lib/msun/src/math_private.h	Sat Mar 14 18:24:15 2009	(r189803)
@@ -190,6 +190,27 @@ do {								\
 void _scan_nan(uint32_t *__words, int __num_words, const char *__s);
 
 #ifdef _COMPLEX_H
+
+/*
+ * C99 specifies that complex numbers have the same representation as
+ * an array of two elements, where the first element is the real part
+ * and the second element is the imaginary part.
+ */
+typedef union {
+	float complex f;
+	float a[2];
+} float_complex;
+typedef union {
+	double complex f;
+	double a[2];
+} double_complex;
+typedef union {
+	long double complex f;
+	long double a[2];
+} long_double_complex;
+#define	REALPART(z)	((z).a[0])
+#define	IMAGPART(z)	((z).a[1])
+
 /*
  * Inline functions that can be used to construct complex values.
  *
@@ -203,31 +224,31 @@ void _scan_nan(uint32_t *__words, int __
 static __inline float complex
 cpackf(float x, float y)
 {
-	float complex z;
+	float_complex z;
 
-	__real__ z = x;
-	__imag__ z = y;
-	return (z);
+	REALPART(z) = x;
+	IMAGPART(z) = y;
+	return (z.f);
 }
 
 static __inline double complex
 cpack(double x, double y)
 {
-	double complex z;
+	double_complex z;
 
-	__real__ z = x;
-	__imag__ z = y;
-	return (z);
+	REALPART(z) = x;
+	IMAGPART(z) = y;
+	return (z.f);
 }
 
 static __inline long double complex
 cpackl(long double x, long double y)
 {
-	long double complex z;
+	long_double_complex z;
 
-	__real__ z = x;
-	__imag__ z = y;
-	return (z);
+	REALPART(z) = x;
+	IMAGPART(z) = y;
+	return (z.f);
 }
 #endif /* _COMPLEX_H */
  

Modified: head/lib/msun/src/s_cimag.c
==============================================================================
--- head/lib/msun/src/s_cimag.c	Sat Mar 14 18:19:50 2009	(r189802)
+++ head/lib/msun/src/s_cimag.c	Sat Mar 14 18:24:15 2009	(r189803)
@@ -27,10 +27,12 @@
  */
 
 #include <complex.h>
+#include "math_private.h"
 
 double
 cimag(double complex z)
 {
+	const double_complex z1 = { .f = z };
 
-	return (__imag__ z);
+	return (IMAGPART(z1));
 }

Modified: head/lib/msun/src/s_cimagf.c
==============================================================================
--- head/lib/msun/src/s_cimagf.c	Sat Mar 14 18:19:50 2009	(r189802)
+++ head/lib/msun/src/s_cimagf.c	Sat Mar 14 18:24:15 2009	(r189803)
@@ -27,10 +27,12 @@
  */
 
 #include <complex.h>
+#include "math_private.h"
 
 float
 cimagf(float complex z)
 {
+	const float_complex z1 = { .f = z };
 
-	return (__imag__ z);
+	return (IMAGPART(z1));
 }

Modified: head/lib/msun/src/s_cimagl.c
==============================================================================
--- head/lib/msun/src/s_cimagl.c	Sat Mar 14 18:19:50 2009	(r189802)
+++ head/lib/msun/src/s_cimagl.c	Sat Mar 14 18:24:15 2009	(r189803)
@@ -27,10 +27,12 @@
  */
 
 #include <complex.h>
+#include "math_private.h"
 
 long double
 cimagl(long double complex z)
 {
+	const long_double_complex z1 = { .f = z };
 
-    return (__imag__ z);
+	return (IMAGPART(z1));
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200903141824.n2EIOFGJ003860>