mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-30 21:44:27 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			104 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| --- a/libc/sysdeps/linux/powerpc/Makefile.arch
 | |
| +++ b/libc/sysdeps/linux/powerpc/Makefile.arch
 | |
| @@ -5,7 +5,7 @@
 | |
|  # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
 | |
|  #
 | |
|  
 | |
| -CSRC := __syscall_error.c pread_write.c ioctl.c
 | |
| +CSRC := __syscall_error.c pread_write.c ioctl.c copysignl.c
 | |
|  
 | |
|  ifeq ($(UCLIBC_HAS_ADVANCED_REALTIME),y)
 | |
|  CSRC += posix_fadvise.c posix_fadvise64.c
 | |
| --- /dev/null
 | |
| +++ b/libc/sysdeps/linux/powerpc/copysignl.c
 | |
| @@ -0,0 +1,89 @@
 | |
| +/* s_copysignl.c -- long double version of s_copysign.c.
 | |
| + * Conversion to long double by Ulrich Drepper,
 | |
| + * Cygnus Support, drepper@cygnus.com.
 | |
| + */
 | |
| +
 | |
| +/*
 | |
| + * ====================================================
 | |
| + * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
 | |
| + *
 | |
| + * Developed at SunPro, a Sun Microsystems, Inc. business.
 | |
| + * Permission to use, copy, modify, and distribute this
 | |
| + * software is freely granted, provided that this notice
 | |
| + * is preserved.
 | |
| + * ====================================================
 | |
| + */
 | |
| +
 | |
| +/*
 | |
| + * copysignl(long double x, long double y)
 | |
| + * copysignl(x,y) returns a value with the magnitude of x and
 | |
| + * with the sign bit of y.
 | |
| + */
 | |
| +
 | |
| +#include <endian.h>
 | |
| +#include <stdint.h>
 | |
| +
 | |
| +#if __FLOAT_WORD_ORDER == BIG_ENDIAN
 | |
| +
 | |
| +typedef union
 | |
| +{
 | |
| +  long double value;
 | |
| +  struct
 | |
| +  {
 | |
| +    int sign_exponent:16;
 | |
| +    unsigned int empty:16;
 | |
| +    uint32_t msw;
 | |
| +    uint32_t lsw;
 | |
| +  } parts;
 | |
| +} ieee_long_double_shape_type;
 | |
| +
 | |
| +#endif
 | |
| +
 | |
| +#if __FLOAT_WORD_ORDER == LITTLE_ENDIAN
 | |
| +
 | |
| +typedef union
 | |
| +{
 | |
| +  long double value;
 | |
| +  struct
 | |
| +  {
 | |
| +    uint32_t lsw;
 | |
| +    uint32_t msw;
 | |
| +    int sign_exponent:16;
 | |
| +    unsigned int empty:16;
 | |
| +  } parts;
 | |
| +} ieee_long_double_shape_type;
 | |
| +
 | |
| +#endif
 | |
| +
 | |
| +/* Get int from the exponent of a long double.  */
 | |
| +
 | |
| +#define GET_LDOUBLE_EXP(exp,d)					\
 | |
| +do {								\
 | |
| +  ieee_long_double_shape_type ge_u;				\
 | |
| +  ge_u.value = (d);						\
 | |
| +  (exp) = ge_u.parts.sign_exponent;				\
 | |
| +} while (0)
 | |
| +
 | |
| +/* Set exponent of a long double from an int.  */
 | |
| +
 | |
| +#define SET_LDOUBLE_EXP(d,exp)					\
 | |
| +do {								\
 | |
| +  ieee_long_double_shape_type se_u;				\
 | |
| +  se_u.value = (d);						\
 | |
| +  se_u.parts.sign_exponent = (exp);				\
 | |
| +  (d) = se_u.value;						\
 | |
| +} while (0)
 | |
| +
 | |
| +long double copysignl(long double x, long double y);
 | |
| +libc_hidden_proto(copysignl);
 | |
| +
 | |
| +long double copysignl(long double x, long double y)
 | |
| +{
 | |
| +	uint32_t es1,es2;
 | |
| +	GET_LDOUBLE_EXP(es1,x);
 | |
| +	GET_LDOUBLE_EXP(es2,y);
 | |
| +	SET_LDOUBLE_EXP(x,(es1&0x7fff)|(es2&0x8000));
 | |
| +        return x;
 | |
| +}
 | |
| +
 | |
| +libc_hidden_def(copysignl);
 |