diff --git a/src/lisp/e_atan2.c b/src/lisp/e_atan2.c
index 4e731baa3265d6c4276051d62f3253df28e955de..f4c1c123432ed96c42bba9f1d814926b9b76f842 100644
--- a/src/lisp/e_atan2.c
+++ b/src/lisp/e_atan2.c
@@ -63,11 +63,15 @@ pi_lo   = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */
 	double z;
 	int k,m,hx,hy,ix,iy;
 	unsigned lx,ly;
+	union { int i[2]; double d; } ux;
+	union { int i[2]; double d; } uy;
 
-	hx = __HI(x); ix = hx&0x7fffffff;
-	lx = __LO(x);
-	hy = __HI(y); iy = hy&0x7fffffff;
-	ly = __LO(y);
+        ux.d = x;
+	hx = ux.i[HIWORD]; ix = hx&0x7fffffff;
+	lx = ux.i[LOWORD];
+        uy.d = y;
+	hy = uy.i[HIWORD]; iy = hy&0x7fffffff;
+	ly = uy.i[LOWORD];
 	if(((ix|((lx|-lx)>>31))>0x7ff00000)||
 	   ((iy|((ly|-ly)>>31))>0x7ff00000))	/* x or y is NaN */
 	   return x+y;
@@ -114,7 +118,10 @@ pi_lo   = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */
 	else z=atan(fabs(y/x));		/* safe to do y/x */
 	switch (m) {
 	    case 0: return       z  ;	/* atan(+,+) */
-	    case 1: __HI(z) ^= 0x80000000;
+	    case 1: 
+                    ux.d = z;
+                    ux.i[HIWORD] ^= 0x80000000;
+                    z = ux.d;
 		    return       z  ;	/* atan(-,+) */
 	    case 2: return  pi-(z-pi_lo);/* atan(+,-) */
 	    default: /* case 3 */