s_copysign.c 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. /*******************************************************************************
  2. * *
  3. * File sign.c, *
  4. * Functions copysign and __signbitd. *
  5. * For PowerPC based machines. *
  6. * *
  7. * Copyright © 1991, 2001 Apple Computer, Inc. All rights reserved. *
  8. * *
  9. * Written by Ali Sazegari, started on June 1991. *
  10. * *
  11. * August 26 1991: no CFront Version 1.1d17 warnings. *
  12. * September 06 1991: passes the test suite with invalid raised on *
  13. * signaling nans. sane rom code behaves the same. *
  14. * September 24 1992: took the Ò#include support.hÓ out. *
  15. * Dcember 02 1992: PowerPC port. *
  16. * July 20 1994: __fabs added *
  17. * July 21 1994: deleted unnecessary functions: neg, COPYSIGNnew, *
  18. * and SIGNNUMnew. *
  19. * April 11 2001: first port to os x using gcc. *
  20. * removed fabs and deffered to gcc for direct *
  21. * instruction generation. *
  22. * *
  23. *******************************************************************************/
  24. #include "../fp_private.h"
  25. /*******************************************************************************
  26. * *
  27. * Function copysign. *
  28. * Implementation of copysign for the PowerPC. *
  29. * *
  30. ********************************************************************************
  31. * Note: The order of the operands in this function is reversed from that *
  32. * suggested in the IEEE standard 754. *
  33. *******************************************************************************/
  34. double copysign ( double arg2, double arg1 )
  35. {
  36. union
  37. {
  38. dHexParts hex;
  39. double dbl;
  40. } x, y;
  41. /*******************************************************************************
  42. * No need to flush NaNs out. *
  43. *******************************************************************************/
  44. x.dbl = arg1;
  45. y.dbl = arg2;
  46. y.hex.high = y.hex.high & 0x7FFFFFFF;
  47. y.hex.high = ( y.hex.high | ( x.hex.high & dSgnMask ) );
  48. return y.dbl;
  49. }