mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-26 23:21:11 +00:00
[builtins] Generate __multc3 for z/OS (#77554)
https://github.com/llvm/llvm-project/pull/68132 ended up removing __multc3 & __divtc3 from compiler-rt library builds that have QUAD_PRECISION but not TF_MODE due to missing int128 support. I added support for QUAD_PRECISION to use the native hex float long double representation. --------- Co-authored-by: Alexander Richardson <mail@alexrichardson.me>
This commit is contained in:
parent
3baedb4111
commit
cc0065a7d0
@ -13,7 +13,7 @@
|
||||
#define QUAD_PRECISION
|
||||
#include "fp_lib.h"
|
||||
|
||||
#if defined(CRT_HAS_TF_MODE)
|
||||
#if defined(CRT_HAS_F128)
|
||||
|
||||
// Returns: the quotient of (a + ib) / (c + id)
|
||||
|
||||
|
@ -188,6 +188,8 @@ static __inline void wideMultiply(rep_t a, rep_t b, rep_t *hi, rep_t *lo) {
|
||||
#undef Word_HiMask
|
||||
#undef Word_LoMask
|
||||
#undef Word_FullMask
|
||||
#else
|
||||
typedef long double fp_t;
|
||||
#endif // defined(CRT_HAS_TF_MODE)
|
||||
#else
|
||||
#error SINGLE_PRECISION, DOUBLE_PRECISION or QUAD_PRECISION must be defined.
|
||||
@ -374,10 +376,10 @@ static __inline fp_t __compiler_rt_fmax(fp_t x, fp_t y) {
|
||||
#endif
|
||||
}
|
||||
|
||||
#elif defined(QUAD_PRECISION) && defined(CRT_HAS_TF_MODE)
|
||||
#elif defined(QUAD_PRECISION)
|
||||
// The generic implementation only works for ieee754 floating point. For other
|
||||
// floating point types, continue to rely on the libm implementation for now.
|
||||
#if defined(CRT_HAS_IEEE_TF)
|
||||
#if defined(CRT_HAS_IEEE_TF) && defined(CRT_HAS_128BIT)
|
||||
static __inline tf_float __compiler_rt_logbtf(tf_float x) {
|
||||
return __compiler_rt_logbX(x);
|
||||
}
|
||||
@ -405,6 +407,8 @@ static __inline tf_float __compiler_rt_fmaxtf(tf_float x, tf_float y) {
|
||||
#define __compiler_rt_logbl crt_logbl
|
||||
#define __compiler_rt_scalbnl crt_scalbnl
|
||||
#define __compiler_rt_fmaxl crt_fmaxl
|
||||
#define crt_fabstf crt_fabsl
|
||||
#define crt_copysigntf crt_copysignl
|
||||
#else
|
||||
#error Unsupported TF mode type
|
||||
#endif
|
||||
|
@ -189,12 +189,16 @@ typedef long double tf_float;
|
||||
#define CRT_LDBL_IEEE_F128
|
||||
#endif
|
||||
#define TF_C(x) x##L
|
||||
#elif __LDBL_MANT_DIG__ == 113
|
||||
// Use long double instead of __float128 if it matches the IEEE 128-bit format.
|
||||
#elif __LDBL_MANT_DIG__ == 113 || \
|
||||
(__FLT_RADIX__ == 16 && __LDBL_MANT_DIG__ == 28)
|
||||
// Use long double instead of __float128 if it matches the IEEE 128-bit format
|
||||
// or the IBM hexadecimal format.
|
||||
#define CRT_LDBL_128BIT
|
||||
#define CRT_HAS_F128
|
||||
#if __LDBL_MANT_DIG__ == 113
|
||||
#define CRT_HAS_IEEE_TF
|
||||
#define CRT_LDBL_IEEE_F128
|
||||
#endif
|
||||
typedef long double tf_float;
|
||||
#define TF_C(x) x##L
|
||||
#elif defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)
|
||||
|
@ -15,7 +15,7 @@
|
||||
#include "int_lib.h"
|
||||
#include "int_math.h"
|
||||
|
||||
#if defined(CRT_HAS_TF_MODE)
|
||||
#if defined(CRT_HAS_F128)
|
||||
|
||||
// Returns: the product of a + ib and c + id
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user