-
Notifications
You must be signed in to change notification settings - Fork 12.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[builtins] Support building the 128-bit float functions on ld80 platforms #68132
[builtins] Support building the 128-bit float functions on ld80 platforms #68132
Conversation
You can test this locally with the following command:git-clang-format --diff e40b2d40a4404e756a401fa639d466550aa419fb 3518654bd8df736eee931de59d0914ab56232cab -- compiler-rt/lib/builtins/divtc3.c compiler-rt/lib/builtins/extenddftf2.c compiler-rt/lib/builtins/extendhftf2.c compiler-rt/lib/builtins/extendsftf2.c compiler-rt/lib/builtins/extendxftf2.c compiler-rt/lib/builtins/fp_extend.h compiler-rt/lib/builtins/fp_lib.h compiler-rt/lib/builtins/fp_trunc.h compiler-rt/lib/builtins/int_math.h compiler-rt/lib/builtins/int_to_fp.h compiler-rt/lib/builtins/int_types.h compiler-rt/lib/builtins/multc3.c compiler-rt/lib/builtins/powitf2.c compiler-rt/lib/builtins/trunctfdf2.c compiler-rt/lib/builtins/trunctfhf2.c compiler-rt/lib/builtins/trunctfsf2.c compiler-rt/lib/builtins/trunctfxf2.c compiler-rt/test/builtins/Unit/addtf3_test.c compiler-rt/test/builtins/Unit/compiler_rt_fmaxl_test.c compiler-rt/test/builtins/Unit/compiler_rt_logbl_test.c compiler-rt/test/builtins/Unit/compiler_rt_scalbnl_test.c compiler-rt/test/builtins/Unit/divtc3_test.c compiler-rt/test/builtins/Unit/divtf3_test.c compiler-rt/test/builtins/Unit/extendxftf2_test.c compiler-rt/test/builtins/Unit/floatditf_test.c compiler-rt/test/builtins/Unit/floattitf_test.c compiler-rt/test/builtins/Unit/floatunditf_test.c compiler-rt/test/builtins/Unit/floatunsitf_test.c compiler-rt/test/builtins/Unit/floatuntitf_test.c compiler-rt/test/builtins/Unit/fp_test.h compiler-rt/test/builtins/Unit/trunctfxf2_test.c View the diff from clang-format here.diff --git a/compiler-rt/test/builtins/Unit/fp_test.h b/compiler-rt/test/builtins/Unit/fp_test.h
index 4eb54b7425c1..ccf64090f09c 100644
--- a/compiler-rt/test/builtins/Unit/fp_test.h
+++ b/compiler-rt/test/builtins/Unit/fp_test.h
@@ -42,10 +42,10 @@ static inline double fromRep64(uint64_t x)
#if defined(CRT_HAS_TF_MODE)
static inline tf_float fromRep128(uint64_t hi, uint64_t lo) {
- __uint128_t x = ((__uint128_t)hi << 64) + lo;
- tf_float ret;
- memcpy(&ret, &x, 16);
- return ret;
+ __uint128_t x = ((__uint128_t)hi << 64) + lo;
+ tf_float ret;
+ memcpy(&ret, &x, 16);
+ return ret;
}
#endif
@@ -76,9 +76,9 @@ static inline uint64_t toRep64(double x)
#if defined(CRT_HAS_TF_MODE)
static inline __uint128_t toRep128(tf_float x) {
- __uint128_t ret;
- memcpy(&ret, &x, 16);
- return ret;
+ __uint128_t ret;
+ memcpy(&ret, &x, 16);
+ return ret;
}
#endif
@@ -142,21 +142,21 @@ static inline int compareResultD(double result,
// because 128-bit integer constant can't be assigned directly
static inline int compareResultF128(tf_float result, uint64_t expectedHi,
uint64_t expectedLo) {
- __uint128_t rep = toRep128(result);
- uint64_t hi = rep >> 64;
- uint64_t lo = rep;
-
- if (hi == expectedHi && lo == expectedLo) {
- return 0;
+ __uint128_t rep = toRep128(result);
+ uint64_t hi = rep >> 64;
+ uint64_t lo = rep;
+
+ if (hi == expectedHi && lo == expectedLo) {
+ return 0;
+ }
+ // test other possible NaN representation(signal NaN)
+ else if (expectedHi == 0x7fff800000000000UL && expectedLo == 0x0UL) {
+ if ((hi & 0x7fff000000000000UL) == 0x7fff000000000000UL &&
+ ((hi & 0xffffffffffffUL) > 0 || lo > 0)) {
+ return 0;
}
- // test other possible NaN representation(signal NaN)
- else if (expectedHi == 0x7fff800000000000UL && expectedLo == 0x0UL) {
- if ((hi & 0x7fff000000000000UL) == 0x7fff000000000000UL &&
- ((hi & 0xffffffffffffUL) > 0 || lo > 0)) {
- return 0;
- }
- }
- return 1;
+ }
+ return 1;
}
#endif
@@ -269,7 +269,7 @@ static inline long double makeInf80(void) {
#if defined(CRT_HAS_TF_MODE)
static inline tf_float makeQNaN128(void) {
- return fromRep128(0x7fff800000000000UL, 0x0UL);
+ return fromRep128(0x7fff800000000000UL, 0x0UL);
}
#endif
@@ -290,7 +290,7 @@ static inline double makeNaN64(uint64_t rand)
#if defined(CRT_HAS_TF_MODE)
static inline tf_float makeNaN128(uint64_t rand) {
- return fromRep128(0x7fff000000000000UL | (rand & 0xffffffffffffUL), 0x0UL);
+ return fromRep128(0x7fff000000000000UL | (rand & 0xffffffffffffUL), 0x0UL);
}
#endif
@@ -321,10 +321,10 @@ static inline double makeNegativeInf64(void)
#if defined(CRT_HAS_TF_MODE)
static inline tf_float makeInf128(void) {
- return fromRep128(0x7fff000000000000UL, 0x0UL);
+ return fromRep128(0x7fff000000000000UL, 0x0UL);
}
static inline tf_float makeNegativeInf128(void) {
- return fromRep128(0xffff000000000000UL, 0x0UL);
+ return fromRep128(0xffff000000000000UL, 0x0UL);
}
#endif
|
58742dd
to
5ed8d6f
Compare
@@ -6,7 +6,9 @@ | |||
#include <stdio.h> | |||
#include "fp_lib.h" | |||
|
|||
#if defined(CRT_HAS_TF_MODE) | |||
// TODO: This test currently only works if long double is the same as fp_t. | |||
// On x86_64 we get undefined references to __trunctfxf2 and __extendxftf2 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
jfyi - I'm working on __trunctfxf2 and __extendxftf2 (#66918)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I can drop this part of the diff if your change lands first.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's merged now. You can drop this part
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Seems like the tests fail if I enable them. Will need to debug this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we have more insights on these failures? extend and trunc functions that got introduced in #66918 may benefit from more testing. So there's a chance that these failures mean some bugs in this newly introduced extend/trunc implementations.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a mismatch in the upper bits of the extended value in at least one test case, I will try to get the log later today.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added ifdefs to skip the tests that can't work with non-IEEE 128 tf types
ping? |
5ed8d6f
to
96a6100
Compare
Aside: x86-64 Android uses a IEEE128 (binary128) long double, and I think it's already using compiler-rt's |
Ah that's interesting, was not aware of that. Updated the title to "ld80 platforms" instead. They should already work for platforms that use ieee128 long doubles. |
@@ -6,7 +6,9 @@ | |||
#include <stdio.h> | |||
#include "fp_lib.h" | |||
|
|||
#if defined(CRT_HAS_TF_MODE) | |||
// TODO: This test currently only works if long double is the same as fp_t. | |||
// On x86_64 we get undefined references to __trunctfxf2 and __extendxftf2 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's merged now. You can drop this part
Looks mostly good to me. Some tweaks are required after @alexander-shaposhnikov PR got merged: enabling tests, refactoring, etc. |
96a6100
to
c941112
Compare
dabe104
to
5482ddd
Compare
GCC provides these functions (e.g. __addtf3, etc.) in libgcc on x86_64. Since Clang supports float128, we can also enable the existing code by using float128 for fp_t if either __FLOAT128__ or __SIZEOF_FLOAT128__ is defined instead of only supporting these builtins for platforms with 128-bit IEEE long doubles. This commit defines a new tf_float typedef that matches a float with attribute((mode(TF)) on each given architecture. There are more tests that could be enabled for x86, but to keep the diff smaller, I restricted test changes to ones that started failing as part of this refactoring. This change has been tested on x86 (natively) and aarch64,powerpc64,riscv64 and sparc64 via qemu-user. This supersedes https://reviews.llvm.org/D98261.
5482ddd
to
3518654
Compare
Rebased and re-ran the testsuite. Should be ready to land now. If there are no further objections I plan to land this PR early next week. |
Sounds like a plan. Thanks for working on it. |
sounds good, thanks! |
Richard, I've discovered that this change regresses a build we have for the z/os platform. It might impact others too. The problem we've discovered is that __multc3 is no longer being defined for our builds. We have QUAD_PRECISION but don't have TF_MODE. This change is making multc3.cc empty unless CRT_HAS_TF_MODE is defined. That breaks z/os and I suspect some other platforms. This same problem impacts __divtc3. I'm not sure about the entire scope yet. |
@perry-ca Could you give me a dump of the compiler predefined macros? The builtins headers should define CRT_HAS_TF_MODE if you have both 128-bit floats and 128-bit integers. |
Hi Alex. Thanks for the quick reply. I have attached two sets of macros. We have two different representations of the floating point types on z/OS. We have the usual IEEE and another one called hexadecimal. See https://en.wikipedia.org/wiki/IBM_hexadecimal_floating-point for details if you are interested. I can answer questions too. We’ll have an RFC for adding this shortly too.
We compile the multc3.c source file twice and produce __multc3 for IEEE and __multhc3 for hexfloat. The same thing is done for the other floating point related source files including divtc3.c.
I have also attached a diff of changes I have been working with to get things building again. I suspect the change for ‘__LDBL_MANT_DIG__ == 113’ will need to be changed. I don’t think what I have works for float80.
Thanks
From: Alexander Richardson ***@***.***>
Sent: Thursday, January 4, 2024 2:04 PM
To: llvm/llvm-project ***@***.***>
Cc: Sean Perry ***@***.***>; Mention ***@***.***>
Subject: [EXTERNAL] Re: [llvm/llvm-project] [builtins] Support building the 128-bit float functions on ld80 platforms (PR #68132)
@perry-ca Could you give me a dump of the compiler predefined macros? The builtins headers should define CRT_HAS_TF_MODE if you have both 128-bit floats and 128-bit integers. — Reply to this email directly, view it on GitHub, or unsubscribe. You
ZjQcmQRYFpfptBannerStart
This Message Is From an External Sender
This message came from outside your organization.
Report Suspicious <https://us-phishalarm-ewt.proofpoint.com/EWT/v1/PjiDSg!2U-qSTa06VIRMu4YcIkOZYJv87-YdAlWKJZhcNecT-hiiTgHmoIuToy2_a0jfbevojb-VMr14u1vQvLxn_cy-KdLJ8OBGO7D_41h$>
ZjQcmQRYFpfptBannerEnd
@perry-ca<https://github.com/perry-ca> Could you give me a dump of the compiler predefined macros? The builtins headers should define CRT_HAS_TF_MODE if you have both 128-bit floats and 128-bit integers.
—
Reply to this email directly, view it on GitHub<#68132 (comment)>, or unsubscribe<https://github.com/notifications/unsubscribe-auth/AJQT7WANDSNP7FXDNRSLH7TYM34JNAVCNFSM6AAAAAA5RKX7RCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQNZXGYYTINBRGQ>.
You are receiving this because you were mentioned.Message ID: ***@***.******@***.***>>
#define _LONG_LONG 1
#define _LP64 1
#define _OPEN_DEFAULT 1
#define _UNIX03_WITHDRAWN 1
#define __370__ 1
#define __64BIT__ 1
#define __ARCH__ 10
#define __ATOMIC_ACQUIRE 2
#define __ATOMIC_ACQ_REL 4
#define __ATOMIC_CONSUME 1
#define __ATOMIC_RELAXED 0
#define __ATOMIC_RELEASE 3
#define __ATOMIC_SEQ_CST 5
#define __BIGGEST_ALIGNMENT__ 8
#define __BIG_ENDIAN__ 1
#define __BITINT_MAXWIDTH__ 128
#define __BOOL_WIDTH__ 8
#define __BOOL__ 1
#define __BYTE_ORDER__ __ORDER_BIG_ENDIAN__
#define __CHAR16_TYPE__ unsigned short
#define __CHAR32_TYPE__ unsigned int
#define __CHAR_BIT__ 8
#define __CHAR_UNSIGNED__ 1
#define __CLANG_ATOMIC_BOOL_LOCK_FREE 2
#define __CLANG_ATOMIC_CHAR16_T_LOCK_FREE 2
#define __CLANG_ATOMIC_CHAR32_T_LOCK_FREE 2
#define __CLANG_ATOMIC_CHAR_LOCK_FREE 2
#define __CLANG_ATOMIC_INT_LOCK_FREE 2
#define __CLANG_ATOMIC_LLONG_LOCK_FREE 2
#define __CLANG_ATOMIC_LONG_LOCK_FREE 2
#define __CLANG_ATOMIC_POINTER_LOCK_FREE 2
#define __CLANG_ATOMIC_SHORT_LOCK_FREE 2
#define __CLANG_ATOMIC_WCHAR_T_LOCK_FREE 2
#define __COMPILER_VER__ 0x50000000
#define __CONSTANT_CFSTRINGS__ 1
#define __DBL_DECIMAL_DIG__ 18
#define __DBL_DENORM_MIN__ 1.19850915e-94
#define __DBL_DIG__ 15
#define __DBL_EPSILON__ 2.2204460492503131e-16
#define __DBL_HAS_DENORM__ 1
#define __DBL_HAS_INFINITY__ 0
#define __DBL_HAS_QUIET_NAN__ 0
#define __DBL_MANT_DIG__ 14
#define __DBL_MAX_10_EXP__ 75
#define __DBL_MAX_EXP__ 63
#define __DBL_MAX__ 7.23700557733226210e+75
#define __DBL_MIN_10_EXP__ (-78)
#define __DBL_MIN_EXP__ (-64)
#define __DBL_MIN__ 5.3976053469340280e-79
#define __DECIMAL_DIG__ __LDBL_DECIMAL_DIG__
#define __FINITE_MATH_ONLY__ 0
#define __FLT_DECIMAL_DIG__ 9
#define __FLT_DENORM_MIN__ 5.1475576e-85F
#define __FLT_DIG__ 6
#define __FLT_EPSILON__ 9.53674316406250e-07F
#define __FLT_HAS_DENORM__ 1
#define __FLT_HAS_INFINITY__ 0
#define __FLT_HAS_QUIET_NAN__ 0
#define __FLT_MANT_DIG__ 6
#define __FLT_MAX_10_EXP__ 75
#define __FLT_MAX_EXP__ 63
#define __FLT_MAX__ 7.23700514597311600e+75F
#define __FLT_MIN_10_EXP__ (-78)
#define __FLT_MIN_EXP__ (-64)
#define __FLT_MIN__ 5.3976053469340280e-79F
#define __FLT_RADIX__ 16
#define __FPCLASS_NEGINF 0x0004
#define __FPCLASS_NEGNORMAL 0x0008
#define __FPCLASS_NEGSUBNORMAL 0x0010
#define __FPCLASS_NEGZERO 0x0020
#define __FPCLASS_POSINF 0x0200
#define __FPCLASS_POSNORMAL 0x0100
#define __FPCLASS_POSSUBNORMAL 0x0080
#define __FPCLASS_POSZERO 0x0040
#define __FPCLASS_QNAN 0x0002
#define __FPCLASS_SNAN 0x0001
#define __GCC_ATOMIC_BOOL_LOCK_FREE 2
#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
#define __GCC_ATOMIC_CHAR_LOCK_FREE 2
#define __GCC_ATOMIC_INT_LOCK_FREE 2
#define __GCC_ATOMIC_LLONG_LOCK_FREE 2
#define __GCC_ATOMIC_LONG_LOCK_FREE 2
#define __GCC_ATOMIC_POINTER_LOCK_FREE 2
#define __GCC_ATOMIC_SHORT_LOCK_FREE 2
#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
#define __GNUC_MINOR__ 2
#define __GNUC_PATCHLEVEL__ 1
#define __GNUC_STDC_INLINE__ 1
#define __GNUC__ 4
#define __GOFF__ 1
#define __GXX_ABI_VERSION 1002
#define __HTM__ 1
#define __INT16_C_SUFFIX__
#define __INT16_FMTd__ "hd"
#define __INT16_FMTi__ "hi"
#define __INT16_MAX__ 32767
#define __INT16_TYPE__ short
#define __INT32_C_SUFFIX__
#define __INT32_FMTd__ "d"
#define __INT32_FMTi__ "i"
#define __INT32_MAX__ 2147483647
#define __INT32_TYPE__ int
#define __INT64_C_SUFFIX__ L
#define __INT64_FMTd__ "ld"
#define __INT64_FMTi__ "li"
#define __INT64_MAX__ 9223372036854775807L
#define __INT64_TYPE__ long int
#define __INT8_C_SUFFIX__
#define __INT8_FMTd__ "hhd"
#define __INT8_FMTi__ "hhi"
#define __INT8_MAX__ 127
#define __INT8_TYPE__ signed char
#define __INTMAX_C_SUFFIX__ L
#define __INTMAX_FMTd__ "ld"
#define __INTMAX_FMTi__ "li"
#define __INTMAX_MAX__ 9223372036854775807L
#define __INTMAX_TYPE__ long int
#define __INTMAX_WIDTH__ 64
#define __INTPTR_FMTd__ "ld"
#define __INTPTR_FMTi__ "li"
#define __INTPTR_MAX__ 9223372036854775807L
#define __INTPTR_TYPE__ long int
#define __INTPTR_WIDTH__ 64
#define __INT_FAST16_FMTd__ "d"
#define __INT_FAST16_FMTi__ "i"
#define __INT_FAST16_MAX__ 2147483647
#define __INT_FAST16_TYPE__ int
#define __INT_FAST16_WIDTH__ 32
#define __INT_FAST32_FMTd__ "d"
#define __INT_FAST32_FMTi__ "i"
#define __INT_FAST32_MAX__ 2147483647
#define __INT_FAST32_TYPE__ int
#define __INT_FAST32_WIDTH__ 32
#define __INT_FAST64_FMTd__ "ld"
#define __INT_FAST64_FMTi__ "li"
#define __INT_FAST64_MAX__ 9223372036854775807L
#define __INT_FAST64_TYPE__ long int
#define __INT_FAST64_WIDTH__ 64
#define __INT_FAST8_FMTd__ "hhd"
#define __INT_FAST8_FMTi__ "hhi"
#define __INT_FAST8_MAX__ 127
#define __INT_FAST8_TYPE__ signed char
#define __INT_FAST8_WIDTH__ 8
#define __INT_LEAST16_FMTd__ "hd"
#define __INT_LEAST16_FMTi__ "hi"
#define __INT_LEAST16_MAX__ 32767
#define __INT_LEAST16_TYPE__ short
#define __INT_LEAST16_WIDTH__ 16
#define __INT_LEAST32_FMTd__ "d"
#define __INT_LEAST32_FMTi__ "i"
#define __INT_LEAST32_MAX__ 2147483647
#define __INT_LEAST32_TYPE__ int
#define __INT_LEAST32_WIDTH__ 32
#define __INT_LEAST64_FMTd__ "ld"
#define __INT_LEAST64_FMTi__ "li"
#define __INT_LEAST64_MAX__ 9223372036854775807L
#define __INT_LEAST64_TYPE__ long int
#define __INT_LEAST64_WIDTH__ 64
#define __INT_LEAST8_FMTd__ "hhd"
#define __INT_LEAST8_FMTi__ "hhi"
#define __INT_LEAST8_MAX__ 127
#define __INT_LEAST8_TYPE__ signed char
#define __INT_LEAST8_WIDTH__ 8
#define __INT_MAX__ 2147483647
#define __INT_WIDTH__ 32
#define __LDBL_DECIMAL_DIG__ 35
#define __LDBL_DENORM_MIN__ 1.663266e-111L
#define __LDBL_DIG__ 32
#define __LDBL_EPSILON__ 3.08148791101957736488956470813588500e-33L
#define __LDBL_HAS_DENORM__ 1
#define __LDBL_HAS_INFINITY__ 0
#define __LDBL_HAS_QUIET_NAN__ 0
#define __LDBL_MANT_DIG__ 28
#define __LDBL_MAX_10_EXP__ 75
#define __LDBL_MAX_EXP__ 63
#define __LDBL_MAX__ 7.2370055773322622139731865630429930e+75L
#define __LDBL_MIN_10_EXP__ (-78)
#define __LDBL_MIN_EXP__ (-64)
#define __LDBL_MIN__ 5.39760534693402789086646991425024930e-79L
#define __LLONG_WIDTH__ 64
#define __LONGNAME__ 1
#define __LONG_DOUBLE_128__ 1
#define __LONG_LONG_MAX__ 9223372036854775807LL
#define __LONG_MAX__ 9223372036854775807L
#define __LONG_WIDTH__ 64
#define __LP64__ 1
#define __MEMORY_SCOPE_DEVICE 1
#define __MEMORY_SCOPE_SINGLE 4
#define __MEMORY_SCOPE_SYSTEM 0
#define __MEMORY_SCOPE_WRKGRP 2
#define __MEMORY_SCOPE_WVFRNT 3
#define __MVS__ 1
#define __NO_INLINE__ 1
#define __OBJC_BOOL_IS_BOOL 0
#define __OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES 3
#define __OPENCL_MEMORY_SCOPE_DEVICE 2
#define __OPENCL_MEMORY_SCOPE_SUB_GROUP 4
#define __OPENCL_MEMORY_SCOPE_WORK_GROUP 1
#define __OPENCL_MEMORY_SCOPE_WORK_ITEM 0
#define __ORDER_BIG_ENDIAN__ 4321
#define __ORDER_LITTLE_ENDIAN__ 1234
#define __ORDER_PDP_ENDIAN__ 3412
#define __POINTER_WIDTH__ 64
#define __PRAGMA_REDEFINE_EXTNAME 1
#define __PTR32 1
#define __PTRDIFF_FMTd__ "ld"
#define __PTRDIFF_FMTi__ "li"
#define __PTRDIFF_MAX__ 9223372036854775807L
#define __PTRDIFF_TYPE__ long int
#define __PTRDIFF_WIDTH__ 64
#define __SCHAR_MAX__ 127
#define __SHRT_MAX__ 32767
#define __SHRT_WIDTH__ 16
#define __SIG_ATOMIC_MAX__ 2147483647
#define __SIG_ATOMIC_WIDTH__ 32
#define __SIZEOF_DOUBLE__ 8
#define __SIZEOF_FLOAT__ 4
#define __SIZEOF_INT__ 4
#define __SIZEOF_LONG_DOUBLE__ 16
#define __SIZEOF_LONG_LONG__ 8
#define __SIZEOF_LONG__ 8
#define __SIZEOF_POINTER__ 8
#define __SIZEOF_PTRDIFF_T__ 8
#define __SIZEOF_SHORT__ 2
#define __SIZEOF_SIZE_T__ 8
#define __SIZEOF_WCHAR_T__ 4
#define __SIZEOF_WINT_T__ 4
#define __SIZE_FMTX__ "lX"
#define __SIZE_FMTo__ "lo"
#define __SIZE_FMTu__ "lu"
#define __SIZE_FMTx__ "lx"
#define __SIZE_MAX__ 18446744073709551615UL
#define __SIZE_TYPE__ long unsigned int
#define __SIZE_WIDTH__ 64
#define __STDC_HOSTED__ 1
#define __STDC_UTF_16__ 1
#define __STDC_UTF_32__ 1
#define __STDC_VERSION__ 201710L
#define __STDC__ 1
#define __THW_370__ 1
#define __THW_BIG_ENDIAN__ 1
#define __TOS_390__ 1
#define __TOS_MVS__ 1
#define __UINT16_C_SUFFIX__
#define __UINT16_FMTX__ "hX"
#define __UINT16_FMTo__ "ho"
#define __UINT16_FMTu__ "hu"
#define __UINT16_FMTx__ "hx"
#define __UINT16_MAX__ 65535
#define __UINT16_TYPE__ unsigned short
#define __UINT32_C_SUFFIX__ U
#define __UINT32_FMTX__ "X"
#define __UINT32_FMTo__ "o"
#define __UINT32_FMTu__ "u"
#define __UINT32_FMTx__ "x"
#define __UINT32_MAX__ 4294967295U
#define __UINT32_TYPE__ unsigned int
#define __UINT64_C_SUFFIX__ UL
#define __UINT64_FMTX__ "lX"
#define __UINT64_FMTo__ "lo"
#define __UINT64_FMTu__ "lu"
#define __UINT64_FMTx__ "lx"
#define __UINT64_MAX__ 18446744073709551615UL
#define __UINT64_TYPE__ long unsigned int
#define __UINT8_C_SUFFIX__
#define __UINT8_FMTX__ "hhX"
#define __UINT8_FMTo__ "hho"
#define __UINT8_FMTu__ "hhu"
#define __UINT8_FMTx__ "hhx"
#define __UINT8_MAX__ 255
#define __UINT8_TYPE__ unsigned char
#define __UINTMAX_C_SUFFIX__ UL
#define __UINTMAX_FMTX__ "lX"
#define __UINTMAX_FMTo__ "lo"
#define __UINTMAX_FMTu__ "lu"
#define __UINTMAX_FMTx__ "lx"
#define __UINTMAX_MAX__ 18446744073709551615UL
#define __UINTMAX_TYPE__ long unsigned int
#define __UINTMAX_WIDTH__ 64
#define __UINTPTR_FMTX__ "lX"
#define __UINTPTR_FMTo__ "lo"
#define __UINTPTR_FMTu__ "lu"
#define __UINTPTR_FMTx__ "lx"
#define __UINTPTR_MAX__ 18446744073709551615UL
#define __UINTPTR_TYPE__ long unsigned int
#define __UINTPTR_WIDTH__ 64
#define __UINT_FAST16_FMTX__ "X"
#define __UINT_FAST16_FMTo__ "o"
#define __UINT_FAST16_FMTu__ "u"
#define __UINT_FAST16_FMTx__ "x"
#define __UINT_FAST16_MAX__ 4294967295U
#define __UINT_FAST16_TYPE__ unsigned int
#define __UINT_FAST32_FMTX__ "X"
#define __UINT_FAST32_FMTo__ "o"
#define __UINT_FAST32_FMTu__ "u"
#define __UINT_FAST32_FMTx__ "x"
#define __UINT_FAST32_MAX__ 4294967295U
#define __UINT_FAST32_TYPE__ unsigned int
#define __UINT_FAST64_FMTX__ "lX"
#define __UINT_FAST64_FMTo__ "lo"
#define __UINT_FAST64_FMTu__ "lu"
#define __UINT_FAST64_FMTx__ "lx"
#define __UINT_FAST64_MAX__ 18446744073709551615UL
#define __UINT_FAST64_TYPE__ long unsigned int
#define __UINT_FAST8_FMTX__ "hhX"
#define __UINT_FAST8_FMTo__ "hho"
#define __UINT_FAST8_FMTu__ "hhu"
#define __UINT_FAST8_FMTx__ "hhx"
#define __UINT_FAST8_MAX__ 255
#define __UINT_FAST8_TYPE__ unsigned char
#define __UINT_LEAST16_FMTX__ "hX"
#define __UINT_LEAST16_FMTo__ "ho"
#define __UINT_LEAST16_FMTu__ "hu"
#define __UINT_LEAST16_FMTx__ "hx"
#define __UINT_LEAST16_MAX__ 65535
#define __UINT_LEAST16_TYPE__ unsigned short
#define __UINT_LEAST32_FMTX__ "X"
#define __UINT_LEAST32_FMTo__ "o"
#define __UINT_LEAST32_FMTu__ "u"
#define __UINT_LEAST32_FMTx__ "x"
#define __UINT_LEAST32_MAX__ 4294967295U
#define __UINT_LEAST32_TYPE__ unsigned int
#define __UINT_LEAST64_FMTX__ "lX"
#define __UINT_LEAST64_FMTo__ "lo"
#define __UINT_LEAST64_FMTu__ "lu"
#define __UINT_LEAST64_FMTx__ "lx"
#define __UINT_LEAST64_MAX__ 18446744073709551615UL
#define __UINT_LEAST64_TYPE__ long unsigned int
#define __UINT_LEAST8_FMTX__ "hhX"
#define __UINT_LEAST8_FMTo__ "hho"
#define __UINT_LEAST8_FMTu__ "hhu"
#define __UINT_LEAST8_FMTx__ "hhx"
#define __UINT_LEAST8_MAX__ 255
#define __UINT_LEAST8_TYPE__ unsigned char
#define __USER_LABEL_PREFIX__
#define __VERSION__ "IBM Open XL C/C++ 1.Next for z/OS, version 2.1.0.0, Clang 18.0.0git ***@***.***:compiler/llvm-project.git 1a8e8b03cf973de8e071fec731dcb449324cb998)"
#define __WCHAR_MAX__ 4294967295U
#define __WCHAR_TYPE__ unsigned int
#define __WCHAR_UNSIGNED__ 1
#define __WCHAR_WIDTH__ 32
#define __WINT_MAX__ 2147483647
#define __WINT_TYPE__ int
#define __WINT_WIDTH__ 32
#define __XPLINK__ 1
#define __clang__ 1
#define __clang_major__ 18
#define __clang_minor__ 0
#define __clang_patchlevel__ 0
#define __clang_version__ "18.0.0git ***@***.***:compiler/llvm-project.git 1a8e8b03cf973de8e071fec731dcb449324cb998)"
#define __clang_wide_literal_encoding__ "UTF-32"
#define __llvm__ 1
#define __open_xl__ 1
#define __open_xl_modification__ 0
#define __open_xl_ptf_fix_level__ 0
#define __open_xl_release__ 1
#define __open_xl_ver__(v,r,m) ((unsigned int)(((v) << 24)|((r) << 16)|((m) << 8)))
#define __open_xl_version__ 2
#define __open_xl_vrm__ 0x02010000u
#define __ptr31__ __ptr32
#define __s390__ 1
#define __s390x__ 1
#define __static_assert static_assert
#define __zarch__ 1
diff --git a/compiler-rt/lib/builtins/divtc3.c b/compiler-rt/lib/builtins/divtc3.c
index 7d3185c9d71f..e970cef574b2 100644
--- a/compiler-rt/lib/builtins/divtc3.c
+++ b/compiler-rt/lib/builtins/divtc3.c
@@ -13,6 +13,8 @@
#define QUAD_PRECISION
#include "fp_lib.h"
+#if defined(CRT_HAS_TF_MODE)
+
// Returns: the quotient of (a + ib) / (c + id)
COMPILER_RT_ABI Qcomplex __divtc3(fp_t __a, fp_t __b, fp_t __c, fp_t __d) {
@@ -50,3 +52,5 @@ COMPILER_RT_ABI Qcomplex __divtc3(fp_t __a, fp_t __b, fp_t __c, fp_t __d) {
}
return z;
}
+
+#endif
diff --git a/compiler-rt/lib/builtins/fp_lib.h b/compiler-rt/lib/builtins/fp_lib.h
index b92e8b5b9f68..c78bfd0599a7 100644
--- a/compiler-rt/lib/builtins/fp_lib.h
+++ b/compiler-rt/lib/builtins/fp_lib.h
@@ -207,8 +207,6 @@ 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.
@@ -482,10 +480,10 @@ static __inline fp_t __compiler_rt_fmax(fp_t x, fp_t y) {
#endif
}
-#elif defined(QUAD_PRECISION)
+#elif defined(QUAD_PRECISION) && defined(CRT_HAS_TF_MODE)
// 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_TF_MODE) && defined(CRT_HAS_IEEE_TF)
+#if defined(CRT_HAS_IEEE_TF)
static __inline tf_float __compiler_rt_logbtf(tf_float x) {
return __compiler_rt_logbX(x);
}
@@ -513,11 +511,9 @@ 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 // CRT_HAS_IEEE_TF
+#endif
#endif // *_PRECISION
diff --git a/compiler-rt/lib/builtins/int_types.h b/compiler-rt/lib/builtins/int_types.h
index b35b07ff0f09..5dd0a4c3e668 100644
--- a/compiler-rt/lib/builtins/int_types.h
+++ b/compiler-rt/lib/builtins/int_types.h
@@ -192,7 +192,7 @@ typedef long double tf_float;
#define CRT_LDBL_IEEE_F128
#endif
#define TF_C(x) x##L
-#elif __SIZEOF_LONG_DOUBLE__ == 16
+#elif __LDBL_MANT_DIG__ == 113
// Use long double instead of __float128 if it matches the IEEE 128-bit format.
#define CRT_LDBL_128BIT
#define CRT_HAS_F128
diff --git a/compiler-rt/lib/builtins/multc3.c b/compiler-rt/lib/builtins/multc3.c
index 21c522d0330b..f20e53ccbf23 100644
--- a/compiler-rt/lib/builtins/multc3.c
+++ b/compiler-rt/lib/builtins/multc3.c
@@ -15,6 +15,8 @@
#include "int_lib.h"
#include "int_math.h"
+#if defined(CRT_HAS_TF_MODE)
+
// Returns: the product of a + ib and c + id
COMPILER_RT_ABI Qcomplex __multc3(fp_t a, fp_t b, fp_t c, fp_t d) {
@@ -64,3 +66,5 @@ COMPILER_RT_ABI Qcomplex __multc3(fp_t a, fp_t b, fp_t c, fp_t d) {
}
return z;
}
+
+#endif
#define _LONG_LONG 1
#define _LP64 1
#define _OPEN_DEFAULT 1
#define _UNIX03_WITHDRAWN 1
#define __370__ 1
#define __64BIT__ 1
#define __ARCH__ 10
#define __ATOMIC_ACQUIRE 2
#define __ATOMIC_ACQ_REL 4
#define __ATOMIC_CONSUME 1
#define __ATOMIC_RELAXED 0
#define __ATOMIC_RELEASE 3
#define __ATOMIC_SEQ_CST 5
#define __BFP__ 1
#define __BIGGEST_ALIGNMENT__ 8
#define __BIG_ENDIAN__ 1
#define __BITINT_MAXWIDTH__ 128
#define __BOOL_WIDTH__ 8
#define __BOOL__ 1
#define __BYTE_ORDER__ __ORDER_BIG_ENDIAN__
#define __CHAR16_TYPE__ unsigned short
#define __CHAR32_TYPE__ unsigned int
#define __CHAR_BIT__ 8
#define __CHAR_UNSIGNED__ 1
#define __CLANG_ATOMIC_BOOL_LOCK_FREE 2
#define __CLANG_ATOMIC_CHAR16_T_LOCK_FREE 2
#define __CLANG_ATOMIC_CHAR32_T_LOCK_FREE 2
#define __CLANG_ATOMIC_CHAR_LOCK_FREE 2
#define __CLANG_ATOMIC_INT_LOCK_FREE 2
#define __CLANG_ATOMIC_LLONG_LOCK_FREE 2
#define __CLANG_ATOMIC_LONG_LOCK_FREE 2
#define __CLANG_ATOMIC_POINTER_LOCK_FREE 2
#define __CLANG_ATOMIC_SHORT_LOCK_FREE 2
#define __CLANG_ATOMIC_WCHAR_T_LOCK_FREE 2
#define __COMPILER_VER__ 0x50000000
#define __CONSTANT_CFSTRINGS__ 1
#define __DBL_DECIMAL_DIG__ 17
#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
#define __DBL_DIG__ 15
#define __DBL_EPSILON__ 2.2204460492503131e-16
#define __DBL_HAS_DENORM__ 1
#define __DBL_HAS_INFINITY__ 1
#define __DBL_HAS_QUIET_NAN__ 1
#define __DBL_MANT_DIG__ 53
#define __DBL_MAX_10_EXP__ 308
#define __DBL_MAX_EXP__ 1024
#define __DBL_MAX__ 1.7976931348623157e+308
#define __DBL_MIN_10_EXP__ (-307)
#define __DBL_MIN_EXP__ (-1021)
#define __DBL_MIN__ 2.2250738585072014e-308
#define __DECIMAL_DIG__ __LDBL_DECIMAL_DIG__
#define __FINITE_MATH_ONLY__ 0
#define __FLT_DECIMAL_DIG__ 9
#define __FLT_DENORM_MIN__ 1.40129846e-45F
#define __FLT_DIG__ 6
#define __FLT_EPSILON__ 1.19209290e-7F
#define __FLT_HAS_DENORM__ 1
#define __FLT_HAS_INFINITY__ 1
#define __FLT_HAS_QUIET_NAN__ 1
#define __FLT_MANT_DIG__ 24
#define __FLT_MAX_10_EXP__ 38
#define __FLT_MAX_EXP__ 128
#define __FLT_MAX__ 3.40282347e+38F
#define __FLT_MIN_10_EXP__ (-37)
#define __FLT_MIN_EXP__ (-125)
#define __FLT_MIN__ 1.17549435e-38F
#define __FLT_RADIX__ 2
#define __FPCLASS_NEGINF 0x0004
#define __FPCLASS_NEGNORMAL 0x0008
#define __FPCLASS_NEGSUBNORMAL 0x0010
#define __FPCLASS_NEGZERO 0x0020
#define __FPCLASS_POSINF 0x0200
#define __FPCLASS_POSNORMAL 0x0100
#define __FPCLASS_POSSUBNORMAL 0x0080
#define __FPCLASS_POSZERO 0x0040
#define __FPCLASS_QNAN 0x0002
#define __FPCLASS_SNAN 0x0001
#define __GCC_ATOMIC_BOOL_LOCK_FREE 2
#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
#define __GCC_ATOMIC_CHAR_LOCK_FREE 2
#define __GCC_ATOMIC_INT_LOCK_FREE 2
#define __GCC_ATOMIC_LLONG_LOCK_FREE 2
#define __GCC_ATOMIC_LONG_LOCK_FREE 2
#define __GCC_ATOMIC_POINTER_LOCK_FREE 2
#define __GCC_ATOMIC_SHORT_LOCK_FREE 2
#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1
#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1
#define __GNUC_MINOR__ 2
#define __GNUC_PATCHLEVEL__ 1
#define __GNUC_STDC_INLINE__ 1
#define __GNUC__ 4
#define __GOFF__ 1
#define __GXX_ABI_VERSION 1002
#define __HTM__ 1
#define __INT16_C_SUFFIX__
#define __INT16_FMTd__ "hd"
#define __INT16_FMTi__ "hi"
#define __INT16_MAX__ 32767
#define __INT16_TYPE__ short
#define __INT32_C_SUFFIX__
#define __INT32_FMTd__ "d"
#define __INT32_FMTi__ "i"
#define __INT32_MAX__ 2147483647
#define __INT32_TYPE__ int
#define __INT64_C_SUFFIX__ L
#define __INT64_FMTd__ "ld"
#define __INT64_FMTi__ "li"
#define __INT64_MAX__ 9223372036854775807L
#define __INT64_TYPE__ long int
#define __INT8_C_SUFFIX__
#define __INT8_FMTd__ "hhd"
#define __INT8_FMTi__ "hhi"
#define __INT8_MAX__ 127
#define __INT8_TYPE__ signed char
#define __INTMAX_C_SUFFIX__ L
#define __INTMAX_FMTd__ "ld"
#define __INTMAX_FMTi__ "li"
#define __INTMAX_MAX__ 9223372036854775807L
#define __INTMAX_TYPE__ long int
#define __INTMAX_WIDTH__ 64
#define __INTPTR_FMTd__ "ld"
#define __INTPTR_FMTi__ "li"
#define __INTPTR_MAX__ 9223372036854775807L
#define __INTPTR_TYPE__ long int
#define __INTPTR_WIDTH__ 64
#define __INT_FAST16_FMTd__ "d"
#define __INT_FAST16_FMTi__ "i"
#define __INT_FAST16_MAX__ 2147483647
#define __INT_FAST16_TYPE__ int
#define __INT_FAST16_WIDTH__ 32
#define __INT_FAST32_FMTd__ "d"
#define __INT_FAST32_FMTi__ "i"
#define __INT_FAST32_MAX__ 2147483647
#define __INT_FAST32_TYPE__ int
#define __INT_FAST32_WIDTH__ 32
#define __INT_FAST64_FMTd__ "ld"
#define __INT_FAST64_FMTi__ "li"
#define __INT_FAST64_MAX__ 9223372036854775807L
#define __INT_FAST64_TYPE__ long int
#define __INT_FAST64_WIDTH__ 64
#define __INT_FAST8_FMTd__ "hhd"
#define __INT_FAST8_FMTi__ "hhi"
#define __INT_FAST8_MAX__ 127
#define __INT_FAST8_TYPE__ signed char
#define __INT_FAST8_WIDTH__ 8
#define __INT_LEAST16_FMTd__ "hd"
#define __INT_LEAST16_FMTi__ "hi"
#define __INT_LEAST16_MAX__ 32767
#define __INT_LEAST16_TYPE__ short
#define __INT_LEAST16_WIDTH__ 16
#define __INT_LEAST32_FMTd__ "d"
#define __INT_LEAST32_FMTi__ "i"
#define __INT_LEAST32_MAX__ 2147483647
#define __INT_LEAST32_TYPE__ int
#define __INT_LEAST32_WIDTH__ 32
#define __INT_LEAST64_FMTd__ "ld"
#define __INT_LEAST64_FMTi__ "li"
#define __INT_LEAST64_MAX__ 9223372036854775807L
#define __INT_LEAST64_TYPE__ long int
#define __INT_LEAST64_WIDTH__ 64
#define __INT_LEAST8_FMTd__ "hhd"
#define __INT_LEAST8_FMTi__ "hhi"
#define __INT_LEAST8_MAX__ 127
#define __INT_LEAST8_TYPE__ signed char
#define __INT_LEAST8_WIDTH__ 8
#define __INT_MAX__ 2147483647
#define __INT_WIDTH__ 32
#define __LDBL_DECIMAL_DIG__ 36
#define __LDBL_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966L
#define __LDBL_DIG__ 33
#define __LDBL_EPSILON__ 1.92592994438723585305597794258492732e-34L
#define __LDBL_HAS_DENORM__ 1
#define __LDBL_HAS_INFINITY__ 1
#define __LDBL_HAS_QUIET_NAN__ 1
#define __LDBL_MANT_DIG__ 113
#define __LDBL_MAX_10_EXP__ 4932
#define __LDBL_MAX_EXP__ 16384
#define __LDBL_MAX__ 1.18973149535723176508575932662800702e+4932L
#define __LDBL_MIN_10_EXP__ (-4931)
#define __LDBL_MIN_EXP__ (-16381)
#define __LDBL_MIN__ 3.36210314311209350626267781732175260e-4932L
#define __LLONG_WIDTH__ 64
#define __LONGNAME__ 1
#define __LONG_DOUBLE_128__ 1
#define __LONG_LONG_MAX__ 9223372036854775807LL
#define __LONG_MAX__ 9223372036854775807L
#define __LONG_WIDTH__ 64
#define __LP64__ 1
#define __MEMORY_SCOPE_DEVICE 1
#define __MEMORY_SCOPE_SINGLE 4
#define __MEMORY_SCOPE_SYSTEM 0
#define __MEMORY_SCOPE_WRKGRP 2
#define __MEMORY_SCOPE_WVFRNT 3
#define __MVS__ 1
#define __NO_INLINE__ 1
#define __OBJC_BOOL_IS_BOOL 0
#define __OPENCL_MEMORY_SCOPE_ALL_SVM_DEVICES 3
#define __OPENCL_MEMORY_SCOPE_DEVICE 2
#define __OPENCL_MEMORY_SCOPE_SUB_GROUP 4
#define __OPENCL_MEMORY_SCOPE_WORK_GROUP 1
#define __OPENCL_MEMORY_SCOPE_WORK_ITEM 0
#define __ORDER_BIG_ENDIAN__ 4321
#define __ORDER_LITTLE_ENDIAN__ 1234
#define __ORDER_PDP_ENDIAN__ 3412
#define __POINTER_WIDTH__ 64
#define __PRAGMA_REDEFINE_EXTNAME 1
#define __PTR32 1
#define __PTRDIFF_FMTd__ "ld"
#define __PTRDIFF_FMTi__ "li"
#define __PTRDIFF_MAX__ 9223372036854775807L
#define __PTRDIFF_TYPE__ long int
#define __PTRDIFF_WIDTH__ 64
#define __SCHAR_MAX__ 127
#define __SHRT_MAX__ 32767
#define __SHRT_WIDTH__ 16
#define __SIG_ATOMIC_MAX__ 2147483647
#define __SIG_ATOMIC_WIDTH__ 32
#define __SIZEOF_DOUBLE__ 8
#define __SIZEOF_FLOAT__ 4
#define __SIZEOF_INT__ 4
#define __SIZEOF_LONG_DOUBLE__ 16
#define __SIZEOF_LONG_LONG__ 8
#define __SIZEOF_LONG__ 8
#define __SIZEOF_POINTER__ 8
#define __SIZEOF_PTRDIFF_T__ 8
#define __SIZEOF_SHORT__ 2
#define __SIZEOF_SIZE_T__ 8
#define __SIZEOF_WCHAR_T__ 4
#define __SIZEOF_WINT_T__ 4
#define __SIZE_FMTX__ "lX"
#define __SIZE_FMTo__ "lo"
#define __SIZE_FMTu__ "lu"
#define __SIZE_FMTx__ "lx"
#define __SIZE_MAX__ 18446744073709551615UL
#define __SIZE_TYPE__ long unsigned int
#define __SIZE_WIDTH__ 64
#define __STDC_HOSTED__ 1
#define __STDC_UTF_16__ 1
#define __STDC_UTF_32__ 1
#define __STDC_VERSION__ 201710L
#define __STDC__ 1
#define __THW_370__ 1
#define __THW_BIG_ENDIAN__ 1
#define __TOS_390__ 1
#define __TOS_MVS__ 1
#define __UINT16_C_SUFFIX__
#define __UINT16_FMTX__ "hX"
#define __UINT16_FMTo__ "ho"
#define __UINT16_FMTu__ "hu"
#define __UINT16_FMTx__ "hx"
#define __UINT16_MAX__ 65535
#define __UINT16_TYPE__ unsigned short
#define __UINT32_C_SUFFIX__ U
#define __UINT32_FMTX__ "X"
#define __UINT32_FMTo__ "o"
#define __UINT32_FMTu__ "u"
#define __UINT32_FMTx__ "x"
#define __UINT32_MAX__ 4294967295U
#define __UINT32_TYPE__ unsigned int
#define __UINT64_C_SUFFIX__ UL
#define __UINT64_FMTX__ "lX"
#define __UINT64_FMTo__ "lo"
#define __UINT64_FMTu__ "lu"
#define __UINT64_FMTx__ "lx"
#define __UINT64_MAX__ 18446744073709551615UL
#define __UINT64_TYPE__ long unsigned int
#define __UINT8_C_SUFFIX__
#define __UINT8_FMTX__ "hhX"
#define __UINT8_FMTo__ "hho"
#define __UINT8_FMTu__ "hhu"
#define __UINT8_FMTx__ "hhx"
#define __UINT8_MAX__ 255
#define __UINT8_TYPE__ unsigned char
#define __UINTMAX_C_SUFFIX__ UL
#define __UINTMAX_FMTX__ "lX"
#define __UINTMAX_FMTo__ "lo"
#define __UINTMAX_FMTu__ "lu"
#define __UINTMAX_FMTx__ "lx"
#define __UINTMAX_MAX__ 18446744073709551615UL
#define __UINTMAX_TYPE__ long unsigned int
#define __UINTMAX_WIDTH__ 64
#define __UINTPTR_FMTX__ "lX"
#define __UINTPTR_FMTo__ "lo"
#define __UINTPTR_FMTu__ "lu"
#define __UINTPTR_FMTx__ "lx"
#define __UINTPTR_MAX__ 18446744073709551615UL
#define __UINTPTR_TYPE__ long unsigned int
#define __UINTPTR_WIDTH__ 64
#define __UINT_FAST16_FMTX__ "X"
#define __UINT_FAST16_FMTo__ "o"
#define __UINT_FAST16_FMTu__ "u"
#define __UINT_FAST16_FMTx__ "x"
#define __UINT_FAST16_MAX__ 4294967295U
#define __UINT_FAST16_TYPE__ unsigned int
#define __UINT_FAST32_FMTX__ "X"
#define __UINT_FAST32_FMTo__ "o"
#define __UINT_FAST32_FMTu__ "u"
#define __UINT_FAST32_FMTx__ "x"
#define __UINT_FAST32_MAX__ 4294967295U
#define __UINT_FAST32_TYPE__ unsigned int
#define __UINT_FAST64_FMTX__ "lX"
#define __UINT_FAST64_FMTo__ "lo"
#define __UINT_FAST64_FMTu__ "lu"
#define __UINT_FAST64_FMTx__ "lx"
#define __UINT_FAST64_MAX__ 18446744073709551615UL
#define __UINT_FAST64_TYPE__ long unsigned int
#define __UINT_FAST8_FMTX__ "hhX"
#define __UINT_FAST8_FMTo__ "hho"
#define __UINT_FAST8_FMTu__ "hhu"
#define __UINT_FAST8_FMTx__ "hhx"
#define __UINT_FAST8_MAX__ 255
#define __UINT_FAST8_TYPE__ unsigned char
#define __UINT_LEAST16_FMTX__ "hX"
#define __UINT_LEAST16_FMTo__ "ho"
#define __UINT_LEAST16_FMTu__ "hu"
#define __UINT_LEAST16_FMTx__ "hx"
#define __UINT_LEAST16_MAX__ 65535
#define __UINT_LEAST16_TYPE__ unsigned short
#define __UINT_LEAST32_FMTX__ "X"
#define __UINT_LEAST32_FMTo__ "o"
#define __UINT_LEAST32_FMTu__ "u"
#define __UINT_LEAST32_FMTx__ "x"
#define __UINT_LEAST32_MAX__ 4294967295U
#define __UINT_LEAST32_TYPE__ unsigned int
#define __UINT_LEAST64_FMTX__ "lX"
#define __UINT_LEAST64_FMTo__ "lo"
#define __UINT_LEAST64_FMTu__ "lu"
#define __UINT_LEAST64_FMTx__ "lx"
#define __UINT_LEAST64_MAX__ 18446744073709551615UL
#define __UINT_LEAST64_TYPE__ long unsigned int
#define __UINT_LEAST8_FMTX__ "hhX"
#define __UINT_LEAST8_FMTo__ "hho"
#define __UINT_LEAST8_FMTu__ "hhu"
#define __UINT_LEAST8_FMTx__ "hhx"
#define __UINT_LEAST8_MAX__ 255
#define __UINT_LEAST8_TYPE__ unsigned char
#define __USER_LABEL_PREFIX__
#define __VERSION__ "IBM Open XL C/C++ 1.Next for z/OS, version 2.1.0.0, Clang 18.0.0git ***@***.***:compiler/llvm-project.git 1a8e8b03cf973de8e071fec731dcb449324cb998)"
#define __WCHAR_MAX__ 4294967295U
#define __WCHAR_TYPE__ unsigned int
#define __WCHAR_UNSIGNED__ 1
#define __WCHAR_WIDTH__ 32
#define __WINT_MAX__ 2147483647
#define __WINT_TYPE__ int
#define __WINT_WIDTH__ 32
#define __XPLINK__ 1
#define __clang__ 1
#define __clang_major__ 18
#define __clang_minor__ 0
#define __clang_patchlevel__ 0
#define __clang_version__ "18.0.0git ***@***.***:compiler/llvm-project.git 1a8e8b03cf973de8e071fec731dcb449324cb998)"
#define __clang_wide_literal_encoding__ "UTF-32"
#define __llvm__ 1
#define __open_xl__ 1
#define __open_xl_modification__ 0
#define __open_xl_ptf_fix_level__ 0
#define __open_xl_release__ 1
#define __open_xl_ver__(v,r,m) ((unsigned int)(((v) << 24)|((r) << 16)|((m) << 8)))
#define __open_xl_version__ 2
#define __open_xl_vrm__ 0x02010000u
#define __ptr31__ __ptr32
#define __s390__ 1
#define __s390x__ 1
#define __static_assert static_assert
#define __zarch__ 1
|
It sounds to me like the easiest way forward here would be to add another |
Yeah. The code will be same, so I’d just use #elif __LDBL_MANT_DIG__ == 113 || (__FLT_RADIX__ == 16 && __LDBL_MANT_DIG__ == 28).
Are you good with the other changes?
From: Alexander Richardson ***@***.***>
Sent: Thursday, January 4, 2024 2:36 PM
To: llvm/llvm-project ***@***.***>
Cc: Sean Perry ***@***.***>; Mention ***@***.***>
Subject: [EXTERNAL] Re: [llvm/llvm-project] [builtins] Support building the 128-bit float functions on ld80 platforms (PR #68132)
It sounds to me like the easiest way forward here would be to add another #elif __FLT_RADIX__ == 16 && __LDBL_MANT_DIG__ == 28 just before #elif __LDBL_MANT_DIG__ == 113 that defines the require typedefs and macros? — Reply to
ZjQcmQRYFpfptBannerStart
This Message Is From an External Sender
This message came from outside your organization.
Report Suspicious <https://us-phishalarm-ewt.proofpoint.com/EWT/v1/PjiDSg!2U-qSTa06VIRMu4YcIkOZYJv87-YdAlWKJZhcNecT-hiiTgHmoKubkyWfa0jfbevUIuGUR7IYUdtspLTWJCll_uRjRWZQvrDjt4C$>
ZjQcmQRYFpfptBannerEnd
It sounds to me like the easiest way forward here would be to add another #elif __FLT_RADIX__ == 16 && __LDBL_MANT_DIG__ == 28 just before #elif __LDBL_MANT_DIG__ == 113 that defines the require typedefs and macros?
—
Reply to this email directly, view it on GitHub<#68132 (comment)>, or unsubscribe<https://github.com/notifications/unsubscribe-auth/AJQT7WGLWWXI66DGGCN3F5LYM4AAFAVCNFSM6AAAAAA5RKX7RCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQNZXGY2TKMRQGA>.
You are receiving this because you were mentioned.Message ID: ***@***.******@***.***>>
|
@perry-ca Could you open this as a pull request? The current diff is quite hard to read. I'm not sure about the changes to compiler-rt/lib/builtins/fp_lib.h but otherwise I think it looks sensible. |
I've created #77554 with the changes. Please review. Thanks |
Issue #47073 was recently marked as fixed. However, when looking at one of the affected tests ( AFAICS |
#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>
Hi Alex, I created #77981 to solve the problem we had with the other commit. It had an odd build failure with some dlopen tests. Can we restart the build? I suspect the failures are from some other change.
Thanks
From: Alexander Richardson ***@***.***>
Sent: Thursday, January 4, 2024 2:04 PM
To: llvm/llvm-project ***@***.***>
Cc: Sean Perry ***@***.***>; Mention ***@***.***>
Subject: [EXTERNAL] Re: [llvm/llvm-project] [builtins] Support building the 128-bit float functions on ld80 platforms (PR #68132)
@perry-ca Could you give me a dump of the compiler predefined macros? The builtins headers should define CRT_HAS_TF_MODE if you have both 128-bit floats and 128-bit integers. — Reply to this email directly, view it on GitHub, or unsubscribe. You
ZjQcmQRYFpfptBannerStart
This Message Is From an External Sender
This message came from outside your organization.
Report Suspicious <https://us-phishalarm-ewt.proofpoint.com/EWT/v1/PjiDSg!2U-qSTa06VIRMu4YcIkOZYJv87-YdAlWKJZhcNecT-hiiTgHmoIuToy2_a0jfbevojb-VMr14u1vQvLxn_cy-KdLJ8OBGO7D_41h$>
ZjQcmQRYFpfptBannerEnd
@perry-ca<https://github.com/perry-ca> Could you give me a dump of the compiler predefined macros? The builtins headers should define CRT_HAS_TF_MODE if you have both 128-bit floats and 128-bit integers.
—
Reply to this email directly, view it on GitHub<#68132 (comment)>, or unsubscribe<https://github.com/notifications/unsubscribe-auth/AJQT7WANDSNP7FXDNRSLH7TYM34JNAVCNFSM6AAAAAA5RKX7RCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQNZXGYYTINBRGQ>.
You are receiving this because you were mentioned.Message ID: ***@***.***>
|
llvm#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 re-lands cc0065a in a way that keeps existing targets working. --------- Original commit message: #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: Sean Perry <perry@ca.ibm.com>
This re-lands cc0065a in a way that keeps existing targets working. --------- Original commit message: llvm#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: Sean Perry <perry@ca.ibm.com> (cherry picked from commit 99c457d)
This re-lands cc0065a in a way that keeps existing targets working. --------- Original commit message: llvm#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: Sean Perry <perry@ca.ibm.com> (cherry picked from commit 99c457d)
GCC provides these functions (e.g. __addtf3, etc.) in libgcc on x86_64. Since Clang supports float128, we can also enable the existing code by using float128 for fp_t if either FLOAT128 or SIZEOF_FLOAT128 is defined instead of only supporting these builtins for platforms with 128-bit IEEE long doubles.
This commit defines a new tf_float typedef that matches a float with attribute((mode(TF)) on each given architecture.
There are more tests that could be enabled for x86, but to keep the diff smaller, I restricted test changes to ones that started failing as part of this refactoring.
This change has been tested on x86 (natively) and aarch64,powerpc64,riscv64 and sparc64 via qemu-user.
This supersedes https://reviews.llvm.org/D98261 and should also cover the changes from #68041.