[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
This commit is contained in:
parent
f67a81a5e2
commit
0abcd6cc73
@ -1,3 +1,14 @@
|
||||
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>
|
||||
|
||||
PR libgcc/77519
|
||||
|
@ -414,8 +414,9 @@ lib2funcs = _muldi3 _negdi2 _lshrdi3 _ashldi3 _ashrdi3 _cmpdi2 _ucmpdi2 \
|
||||
_negvsi2 _negvdi2 _ctors _ffssi2 _ffsdi2 _clz _clzsi2 _clzdi2 \
|
||||
_ctzsi2 _ctzdi2 _popcount_tab _popcountsi2 _popcountdi2 \
|
||||
_paritysi2 _paritydi2 _powisf2 _powidf2 _powixf2 _powitf2 \
|
||||
_mulsc3 _muldc3 _mulxc3 _multc3 _divsc3 _divdc3 _divxc3 \
|
||||
_divtc3 _bswapsi2 _bswapdi2 _clrsbsi2 _clrsbdi2
|
||||
_mulhc3 _mulsc3 _muldc3 _mulxc3 _multc3 _divhc3 _divsc3 \
|
||||
_divdc3 _divxc3 _divtc3 _bswapsi2 _bswapdi2 _clrsbsi2 \
|
||||
_clrsbdi2
|
||||
|
||||
# The floating-point conversion routines that involve a single-word integer.
|
||||
# XX stands for the integer mode.
|
||||
|
@ -1852,7 +1852,8 @@ NAME (TYPE x, int m)
|
||||
|
||||
#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_mulxc3) || defined(L_divxc3)) && LIBGCC2_HAS_XF_MODE) \
|
||||
|| ((defined(L_multc3) || defined(L_divtc3)) && LIBGCC2_HAS_TF_MODE)
|
||||
@ -1861,7 +1862,13 @@ NAME (TYPE x, int m)
|
||||
#undef double
|
||||
#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 CTYPE SCtype
|
||||
# define MODE sc
|
||||
@ -1922,7 +1929,7 @@ extern void *compile_type_assert[sizeof(INFINITY) == sizeof(MTYPE) ? 1 : -1];
|
||||
# define TRUNC(x) __asm__ ("" : "=m"(x) : "m"(x))
|
||||
#endif
|
||||
|
||||
#if defined(L_mulsc3) || defined(L_muldc3) \
|
||||
#if defined(L_mulhc3) || defined(L_mulsc3) || defined(L_muldc3) \
|
||||
|| defined(L_mulxc3) || defined(L_multc3)
|
||||
|
||||
CTYPE
|
||||
@ -1992,7 +1999,7 @@ CONCAT3(__mul,MODE,3) (MTYPE a, MTYPE b, MTYPE c, MTYPE d)
|
||||
}
|
||||
#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)
|
||||
|
||||
CTYPE
|
||||
|
@ -34,6 +34,12 @@ extern void __clear_cache (char *, char *);
|
||||
extern void __eprintf (const char *, const char *, unsigned int, const char *)
|
||||
__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__
|
||||
#define LIBGCC2_HAS_SF_MODE 1
|
||||
#else
|
||||
@ -133,6 +139,10 @@ typedef unsigned int UTItype __attribute__ ((mode (TI)));
|
||||
#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
|
||||
typedef float SFtype __attribute__ ((mode (SF)));
|
||||
typedef _Complex float SCtype __attribute__ ((mode (SC)));
|
||||
@ -424,6 +434,10 @@ extern SItype __negvsi2 (SItype);
|
||||
#endif /* COMPAT_SIMODE_TRAPPING_ARITHMETIC */
|
||||
|
||||
#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
|
||||
extern DWtype __fixsfdi (SFtype);
|
||||
extern SFtype __floatdisf (DWtype);
|
||||
|
Loading…
Reference in New Issue
Block a user