NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: lib/57021: libc __trunctfdf2 conflicts with libgcc on aarch64



The following reply was made to PR lib/57021; it has been noted by GNATS.

From: nia <nia%NetBSD.org@localhost>
To: gnats-bugs%netbsd.org@localhost
Cc: 
Subject: Re: lib/57021: libc __trunctfdf2 conflicts with libgcc on aarch64
Date: Mon, 3 Oct 2022 13:58:22 +0000

 --i5uHp3FnpYo+Tghf
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
 
 On Mon, Oct 03, 2022 at 01:05:02PM +0000, nia wrote:
 >  On Mon, Sep 26, 2022 at 11:40:02AM +0000, Taylor R Campbell wrote:
 >  >  joerg@ says this can be fixed by defining each function in a separate
 >  >  file, which can also be done by enabling the compiler-rt versions of
 >  >  each function in libc instead of using qp.c (which would incidentally
 >  >  allow us to delete some code!).
 >  >  
 >  
 >  I tried this out, and built an aarch64 image using the compiler_rt
 >  versions. Instead of failing for other reasons, the test program
 >  now fails with undefined reference to "__floattidf", which seems
 >  to be a GCC-specific function unavailable in compiler-rt.
 >  
 
 Never mind, this works.
 
 --i5uHp3FnpYo+Tghf
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: attachment; filename="softfloat.diff"
 
 Index: lib/libc/compiler_rt/Makefile.inc
 ===================================================================
 RCS file: /cvsroot/src/lib/libc/compiler_rt/Makefile.inc,v
 retrieving revision 1.40
 diff -u -p -u -r1.40 Makefile.inc
 --- lib/libc/compiler_rt/Makefile.inc	16 Jun 2021 05:21:08 -0000	1.40
 +++ lib/libc/compiler_rt/Makefile.inc	3 Oct 2022 13:57:06 -0000
 @@ -133,7 +133,11 @@ GENERIC_SRCS+= \
  .endif
  
  
 -.if ${MACHINE_CPU} != "aarch64"
 +.if ${MACHINE_CPU} == "aarch64"
 +GENERIC_SRCS+= \
 +	comparetf2.c
 +.endif
 +
  GENERIC_SRCS+= \
  	fixunsdfti.c \
  	fixunssfti.c \
 @@ -145,10 +149,6 @@ GENERIC_SRCS+= \
  	floatuntidf.c \
  	floatuntisf.c \
  	floatuntixf.c
 -.else
 -GENERIC_SRCS+= \
 -	comparetf2.c
 -.endif
  
  # These have h/w instructions which are always used.
  .if ${LIBC_MACHINE_ARCH} != "alpha" && ${LIBC_MACHINE_CPU} != "aarch64" \
 @@ -250,7 +250,22 @@ GENERIC_SRCS+= \
  
  .if ${LIBC_MACHINE_CPU} == "aarch64"
  GENERIC_SRCS+= \
 -	clear_cache.c
 +	clear_cache.c \
 +	addtf3.c \
 +	divtf3.c \
 +	multf3.c \
 +	subtf3.c \
 +	trunctfsf2.c \
 +	trunctfdf2.c \
 +	fixdfti.c \
 +	fixtfsi.c \
 +	fixtfdi.c \
 +	extendsftf2.c \
 +	extenddftf2.c \
 +	floatunsitf.c \
 +	floatunditf.c \
 +	floatsitf.c \
 +	floatditf.c
  .endif
  
  .if ${LIBC_MACHINE_ARCH} == "powerpc" || ${LIBC_MACHINE_ARCH} == "powerpc64"
 Index: lib/libc/arch/aarch64/softfloat/qp.c
 ===================================================================
 RCS file: /cvsroot/src/lib/libc/arch/aarch64/softfloat/qp.c,v
 retrieving revision 1.3
 diff -u -p -u -r1.3 qp.c
 --- lib/libc/arch/aarch64/softfloat/qp.c	27 Aug 2018 16:46:13 -0000	1.3
 +++ lib/libc/arch/aarch64/softfloat/qp.c	3 Oct 2022 13:57:06 -0000
 @@ -38,39 +38,12 @@
   * invoke them directly since long double arguments are passed in FP/SIMD
   * as well as being returned in them while float128 arguments are passed
   * in normal registers.
 + *
 + * XXX: we're using compiler_rt for this now. Only one function remains
 + * that is missing from compiler_rt.
   */
  
 -long double __addtf3(long double, long double);
 -long double __divtf3(long double, long double);
 -long double __modtf3(long double, long double);
 -long double __multf3(long double, long double);
  long double __negtf2(long double);
 -long double __subtf3(long double, long double);
 -
 -double __trunctfdf2(long double);
 -float __trunctfsf2(long double);
 -
 -long double __extendsftf2(float);
 -long double __extenddftf2(double);
 -
 -long double __floatsitf(int32_t);
 -long double __floatditf(int64_t);
 -
 -long double __floatunsitf(uint32_t);
 -long double __floatunditf(uint64_t);
 -
 -int32_t __fixtfsi(long double);
 -int64_t __fixtfdi(long double);
 -
 -uint32_t __fixuntfsi(long double);
 -uint64_t __fixuntfdi(long double);
 -
 -#if 0
 -long double __floattitf(int128_t);
 -long double __floatuntitf(uint128_t);
 -int128_t __fixtfti(long double);
 -uint128_t __fixuntfti(long double);
 -#endif
  
  union sf_ieee_flt_u {
  	float fltu_f;
 @@ -88,42 +61,6 @@ union sf_ieee_ldbl_u {
  };
  
  long double
 -__addtf3(long double ld_a, long double ld_b)
 -{
 -	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
 -	const union sf_ieee_ldbl_u b = { .ldblu_ld = ld_b };
 -	const union sf_ieee_ldbl_u c = {
 -	    .ldblu_f128 = float128_add(a.ldblu_f128, b.ldblu_f128)
 -	};
 -
 -	return c.ldblu_ld;
 -}
 -
 -long double
 -__divtf3(long double ld_a, long double ld_b)
 -{
 -	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
 -	const union sf_ieee_ldbl_u b = { .ldblu_ld = ld_b };
 -	const union sf_ieee_ldbl_u c = {
 -	    .ldblu_f128 = float128_div(a.ldblu_f128, b.ldblu_f128)
 -	};
 -
 -	return c.ldblu_ld;
 -}
 -
 -long double
 -__multf3(long double ld_a, long double ld_b)
 -{
 -	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
 -	const union sf_ieee_ldbl_u b = { .ldblu_ld = ld_b };
 -	const union sf_ieee_ldbl_u c = {
 -	    .ldblu_f128 = float128_mul(a.ldblu_f128, b.ldblu_f128)
 -	};
 -
 -	return c.ldblu_ld;
 -}
 -
 -long double
  __negtf2(long double ld_a)
  {
  	const union sf_ieee_ldbl_u zero = { .ldblu_ld = 0.0 };
 @@ -134,168 +71,3 @@ __negtf2(long double ld_a)
  
  	return b.ldblu_ld;
  }
 -
 -long double
 -__subtf3(long double ld_a, long double ld_b)
 -{
 -	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
 -	const union sf_ieee_ldbl_u b = { .ldblu_ld = ld_b };
 -	const union sf_ieee_ldbl_u c = {
 -	    .ldblu_f128 = float128_sub(a.ldblu_f128, b.ldblu_f128)
 -	};
 -
 -	return c.ldblu_ld;
 -}
 -
 -#if 0
 -int
 -__cmptf3(float128 *a, float128 *b)
 -{
 -	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
 -	const union sf_ieee_ldbl_u b = { .ldblu_ld = ld_b };
 -
 -	if (float128_eq(*a, *b))
 -		return 0;
 -
 -	if (float128_le(*a, *b))
 -		return 1;
 -
 -	return 2;
 -}
 -
 -
 -/*
 - * XXX 
 - */
 -int
 -_Qp_cmpe(float128 *a, float128 *b)
 -{
 -	return _Qp_cmp(a, b);
 -}
 -#endif
 -
 -float
 -__trunctfsf2(long double ld_a)
 -{
 -	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
 -	const union sf_ieee_flt_u c = {
 -		.fltu_f32 = float128_to_float32(a.ldblu_f128),
 -	};
 -
 -	return c.fltu_f;
 -}
 -
 -double
 -__trunctfdf2(long double ld_a)
 -{
 -	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
 -	const union sf_ieee_dbl_u c = {
 -		.dblu_f64 = float128_to_float64(a.ldblu_f128),
 -	};
 -
 -	return c.dblu_d;
 -}
 -
 -int32_t
 -__fixtfsi(long double ld_a)
 -{
 -	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
 -	return float128_to_int32_round_to_zero(a.ldblu_f128);
 -}
 -
 -int64_t
 -__fixtfdi(long double ld_a)
 -{
 -	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
 -
 -	return float128_to_int64_round_to_zero(a.ldblu_f128);
 -}
 -
 -#if 0
 -uint32_t
 -__fixuntfsi(long double ld_a)
 -{
 -	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
 -
 -	return float128_to_uint32_round_to_zero(a.ldblu_f128);
 -}
 -
 -uint64_t
 -__fixuntfdi(long double ld_a)
 -{
 -	const union sf_ieee_ldbl_u a = { .ldblu_ld = ld_a };
 -
 -	return float128_to_uint64_round_to_zero(a.ldblu_f128);
 -}
 -#endif
 -
 -long double
 -__extendsftf2(float f_a)
 -{
 -	const union sf_ieee_flt_u a = { .fltu_f = f_a };
 -	const union sf_ieee_ldbl_u c = {
 -		.ldblu_f128 = float32_to_float128(a.fltu_f32)
 -	};
 -
 -	return c.ldblu_ld;
 -}
 -
 -long double
 -__extenddftf2(double d_a)
 -{
 -	const union sf_ieee_dbl_u a = { .dblu_d = d_a };
 -	const union sf_ieee_ldbl_u c = {
 -		.ldblu_f128 = float64_to_float128(a.dblu_f64)
 -	};
 -
 -	return c.ldblu_ld;
 -}
 -
 -long double
 -__floatunsitf(uint32_t a)
 -{
 -	const union sf_ieee_ldbl_u c = {
 -		.ldblu_f128 = int64_to_float128(a)
 -	};
 -
 -	return c.ldblu_ld;
 -}
 -
 -long double
 -__floatunditf(uint64_t a)
 -{
 -	union sf_ieee_ldbl_u c;
 -	const uint64_t msb64 = 1LL << 63;
 -
 -	if (a & msb64) {
 -		static const union sf_ieee_ldbl_u two63 = {
 -			.ldblu_ld = 0x1.0p63
 -		};
 -		
 -		c.ldblu_f128 = int64_to_float128(a ^ msb64);
 -		c.ldblu_f128 = float128_add(c.ldblu_f128, two63.ldblu_f128);
 -	} else {
 -		c.ldblu_f128 = int64_to_float128(a);
 -	}
 -	return c.ldblu_ld;
 -}
 -
 -long double
 -__floatsitf(int32_t a)
 -{
 -	const union sf_ieee_ldbl_u c = {
 -		.ldblu_f128 = int64_to_float128(a)
 -	};
 -
 -	return c.ldblu_ld;
 -}
 -
 -long double
 -__floatditf(int64_t a)
 -{
 -	const union sf_ieee_ldbl_u c = {
 -		.ldblu_f128 = int64_to_float128(a)
 -	};
 -
 -	return c.ldblu_ld;
 -}
 
 --i5uHp3FnpYo+Tghf--
 


Home | Main Index | Thread Index | Old Index