summaryrefslogtreecommitdiff
path: root/libm/powerpc/s_copysign.c
diff options
context:
space:
mode:
Diffstat (limited to 'libm/powerpc/s_copysign.c')
-rw-r--r--libm/powerpc/s_copysign.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/libm/powerpc/s_copysign.c b/libm/powerpc/s_copysign.c
new file mode 100644
index 000000000..18e91998a
--- /dev/null
+++ b/libm/powerpc/s_copysign.c
@@ -0,0 +1,56 @@
+/*******************************************************************************
+* *
+* File sign.c, *
+* Functions copysign and __signbitd. *
+* For PowerPC based machines. *
+* *
+* Copyright © 1991, 2001 Apple Computer, Inc. All rights reserved. *
+* *
+* Written by Ali Sazegari, started on June 1991. *
+* *
+* August 26 1991: no CFront Version 1.1d17 warnings. *
+* September 06 1991: passes the test suite with invalid raised on *
+* signaling nans. sane rom code behaves the same. *
+* September 24 1992: took the ̉#include support.hÓ out. *
+* Dcember 02 1992: PowerPC port. *
+* July 20 1994: __fabs added *
+* July 21 1994: deleted unnecessary functions: neg, COPYSIGNnew, *
+* and SIGNNUMnew. *
+* April 11 2001: first port to os x using gcc. *
+* removed fabs and deffered to gcc for direct *
+* instruction generation. *
+* *
+*******************************************************************************/
+
+#include "../fp_private.h"
+
+/*******************************************************************************
+* *
+* Function copysign. *
+* Implementation of copysign for the PowerPC. *
+* *
+********************************************************************************
+* Note: The order of the operands in this function is reversed from that *
+* suggested in the IEEE standard 754. *
+*******************************************************************************/
+
+double copysign ( double arg2, double arg1 )
+ {
+ union
+ {
+ dHexParts hex;
+ double dbl;
+ } x, y;
+
+/*******************************************************************************
+* No need to flush NaNs out. *
+*******************************************************************************/
+
+ x.dbl = arg1;
+ y.dbl = arg2;
+
+ y.hex.high = y.hex.high & 0x7FFFFFFF;
+ y.hex.high = ( y.hex.high | ( x.hex.high & dSgnMask ) );
+
+ return y.dbl;
+ }