Commit 0abcd6cc by James Greenhalgh Committed by James Greenhalgh

[Patch libgcc] Enable HCmode multiply and divide (mulhc3/divhc3)

This patch arranges for half-precision complex multiply and divide
routines to be built if __LIBGCC_HAS_HF_MODE__.  This will be true
if the target supports the _Float16 type.

libgcc/

	PR target/63250
	*  Makefile.in (lib2funcs): Build _mulhc3 and _divhc3.
	* libgcc2.h (LIBGCC_HAS_HF_MODE): Conditionally define.
	(HFtype): Likewise.
	(HCtype): Likewise.
	(__divhc3): Likewise.
	(__mulhc3): Likewise.
	* libgcc2.c: Support _mulhc3 and _divhc3.

From-SVN: r240043
parent f67a81a5
2016-09-09 James Greenhalgh <james.greenhalgh@arm.com>
PR target/63250
* Makefile.in (lib2funcs): Build _mulhc3 and _divhc3.
* libgcc2.h (LIBGCC_HAS_HF_MODE): Conditionally define.
(HFtype): Likewise.
(HCtype): Likewise.
(__divhc3): Likewise.
(__mulhc3): Likewise.
* libgcc2.c: Support _mulhc3 and _divhc3.
2016-09-07 Joseph Myers <joseph@codesourcery.com> 2016-09-07 Joseph Myers <joseph@codesourcery.com>
PR libgcc/77519 PR libgcc/77519
......
...@@ -414,8 +414,9 @@ lib2funcs = _muldi3 _negdi2 _lshrdi3 _ashldi3 _ashrdi3 _cmpdi2 _ucmpdi2 \ ...@@ -414,8 +414,9 @@ lib2funcs = _muldi3 _negdi2 _lshrdi3 _ashldi3 _ashrdi3 _cmpdi2 _ucmpdi2 \
_negvsi2 _negvdi2 _ctors _ffssi2 _ffsdi2 _clz _clzsi2 _clzdi2 \ _negvsi2 _negvdi2 _ctors _ffssi2 _ffsdi2 _clz _clzsi2 _clzdi2 \
_ctzsi2 _ctzdi2 _popcount_tab _popcountsi2 _popcountdi2 \ _ctzsi2 _ctzdi2 _popcount_tab _popcountsi2 _popcountdi2 \
_paritysi2 _paritydi2 _powisf2 _powidf2 _powixf2 _powitf2 \ _paritysi2 _paritydi2 _powisf2 _powidf2 _powixf2 _powitf2 \
_mulsc3 _muldc3 _mulxc3 _multc3 _divsc3 _divdc3 _divxc3 \ _mulhc3 _mulsc3 _muldc3 _mulxc3 _multc3 _divhc3 _divsc3 \
_divtc3 _bswapsi2 _bswapdi2 _clrsbsi2 _clrsbdi2 _divdc3 _divxc3 _divtc3 _bswapsi2 _bswapdi2 _clrsbsi2 \
_clrsbdi2
# The floating-point conversion routines that involve a single-word integer. # The floating-point conversion routines that involve a single-word integer.
# XX stands for the integer mode. # XX stands for the integer mode.
......
...@@ -1852,7 +1852,8 @@ NAME (TYPE x, int m) ...@@ -1852,7 +1852,8 @@ NAME (TYPE x, int m)
#endif #endif
#if ((defined(L_mulsc3) || defined(L_divsc3)) && LIBGCC2_HAS_SF_MODE) \ #if((defined(L_mulhc3) || defined(L_divhc3)) && LIBGCC2_HAS_HF_MODE) \
|| ((defined(L_mulsc3) || defined(L_divsc3)) && LIBGCC2_HAS_SF_MODE) \
|| ((defined(L_muldc3) || defined(L_divdc3)) && LIBGCC2_HAS_DF_MODE) \ || ((defined(L_muldc3) || defined(L_divdc3)) && LIBGCC2_HAS_DF_MODE) \
|| ((defined(L_mulxc3) || defined(L_divxc3)) && LIBGCC2_HAS_XF_MODE) \ || ((defined(L_mulxc3) || defined(L_divxc3)) && LIBGCC2_HAS_XF_MODE) \
|| ((defined(L_multc3) || defined(L_divtc3)) && LIBGCC2_HAS_TF_MODE) || ((defined(L_multc3) || defined(L_divtc3)) && LIBGCC2_HAS_TF_MODE)
...@@ -1861,7 +1862,13 @@ NAME (TYPE x, int m) ...@@ -1861,7 +1862,13 @@ NAME (TYPE x, int m)
#undef double #undef double
#undef long #undef long
#if defined(L_mulsc3) || defined(L_divsc3) #if defined(L_mulhc3) || defined(L_divhc3)
# define MTYPE HFtype
# define CTYPE HCtype
# define MODE hc
# define CEXT __LIBGCC_HF_FUNC_EXT__
# define NOTRUNC (!__LIBGCC_HF_EXCESS_PRECISION__)
#elif defined(L_mulsc3) || defined(L_divsc3)
# define MTYPE SFtype # define MTYPE SFtype
# define CTYPE SCtype # define CTYPE SCtype
# define MODE sc # define MODE sc
...@@ -1922,7 +1929,7 @@ extern void *compile_type_assert[sizeof(INFINITY) == sizeof(MTYPE) ? 1 : -1]; ...@@ -1922,7 +1929,7 @@ extern void *compile_type_assert[sizeof(INFINITY) == sizeof(MTYPE) ? 1 : -1];
# define TRUNC(x) __asm__ ("" : "=m"(x) : "m"(x)) # define TRUNC(x) __asm__ ("" : "=m"(x) : "m"(x))
#endif #endif
#if defined(L_mulsc3) || defined(L_muldc3) \ #if defined(L_mulhc3) || defined(L_mulsc3) || defined(L_muldc3) \
|| defined(L_mulxc3) || defined(L_multc3) || defined(L_mulxc3) || defined(L_multc3)
CTYPE CTYPE
...@@ -1992,7 +1999,7 @@ CONCAT3(__mul,MODE,3) (MTYPE a, MTYPE b, MTYPE c, MTYPE d) ...@@ -1992,7 +1999,7 @@ CONCAT3(__mul,MODE,3) (MTYPE a, MTYPE b, MTYPE c, MTYPE d)
} }
#endif /* complex multiply */ #endif /* complex multiply */
#if defined(L_divsc3) || defined(L_divdc3) \ #if defined(L_divhc3) || defined(L_divsc3) || defined(L_divdc3) \
|| defined(L_divxc3) || defined(L_divtc3) || defined(L_divxc3) || defined(L_divtc3)
CTYPE CTYPE
......
...@@ -34,6 +34,12 @@ extern void __clear_cache (char *, char *); ...@@ -34,6 +34,12 @@ extern void __clear_cache (char *, char *);
extern void __eprintf (const char *, const char *, unsigned int, const char *) extern void __eprintf (const char *, const char *, unsigned int, const char *)
__attribute__ ((__noreturn__)); __attribute__ ((__noreturn__));
#ifdef __LIBGCC_HAS_HF_MODE__
#define LIBGCC2_HAS_HF_MODE 1
#else
#define LIBGCC2_HAS_HF_MODE 0
#endif
#ifdef __LIBGCC_HAS_SF_MODE__ #ifdef __LIBGCC_HAS_SF_MODE__
#define LIBGCC2_HAS_SF_MODE 1 #define LIBGCC2_HAS_SF_MODE 1
#else #else
...@@ -133,6 +139,10 @@ typedef unsigned int UTItype __attribute__ ((mode (TI))); ...@@ -133,6 +139,10 @@ typedef unsigned int UTItype __attribute__ ((mode (TI)));
#endif #endif
#endif #endif
#if LIBGCC2_HAS_HF_MODE
typedef float HFtype __attribute__ ((mode (HF)));
typedef _Complex float HCtype __attribute__ ((mode (HC)));
#endif
#if LIBGCC2_HAS_SF_MODE #if LIBGCC2_HAS_SF_MODE
typedef float SFtype __attribute__ ((mode (SF))); typedef float SFtype __attribute__ ((mode (SF)));
typedef _Complex float SCtype __attribute__ ((mode (SC))); typedef _Complex float SCtype __attribute__ ((mode (SC)));
...@@ -424,6 +434,10 @@ extern SItype __negvsi2 (SItype); ...@@ -424,6 +434,10 @@ extern SItype __negvsi2 (SItype);
#endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */ #endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
#undef int #undef int
#if LIBGCC2_HAS_HF_MODE
extern HCtype __divhc3 (HFtype, HFtype, HFtype, HFtype);
extern HCtype __mulhc3 (HFtype, HFtype, HFtype, HFtype);
#endif
#if LIBGCC2_HAS_SF_MODE #if LIBGCC2_HAS_SF_MODE
extern DWtype __fixsfdi (SFtype); extern DWtype __fixsfdi (SFtype);
extern SFtype __floatdisf (DWtype); extern SFtype __floatdisf (DWtype);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment