diff --git a/clang/include/clang/Basic/TokenKinds.def b/clang/include/clang/Basic/TokenKinds.def --- a/clang/include/clang/Basic/TokenKinds.def +++ b/clang/include/clang/Basic/TokenKinds.def @@ -438,6 +438,7 @@ KEYWORD(__builtin_va_arg , KEYALL) KEYWORD(__extension__ , KEYALL) KEYWORD(__float128 , KEYALL) +ALIAS("_Float128", __float128 , KEYNOCXX) KEYWORD(__ibm128 , KEYALL) KEYWORD(__imag , KEYALL) KEYWORD(__int128 , KEYALL) diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -946,6 +946,8 @@ DefineFloatMacros(Builder, "FLT", &TI.getFloatFormat(), "F"); DefineFloatMacros(Builder, "DBL", &TI.getDoubleFormat(), ""); DefineFloatMacros(Builder, "LDBL", &TI.getLongDoubleFormat(), "L"); + if (TI.hasFloat128Type()) + DefineFloatMacros(Builder, "FLT128", &TI.getFloat128Format(), "F128"); // Define a __POINTER_WIDTH__ macro for stdint.h. Builder.defineMacro("__POINTER_WIDTH__", diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -801,6 +801,13 @@ continue; } + if (Target.hasFloat128Type() && s + 3 < ThisTokEnd && + memcmp(s + 1, "128", 3) == 0) { + s += 3; + isFloat128 = true; + continue; + } + isFloat = true; continue; // Success. case 'q': // FP Suffix for "__float128" diff --git a/clang/test/CodeGen/builtins-ppc-p9-f128.c b/clang/test/CodeGen/builtins-ppc-p9-f128.c --- a/clang/test/CodeGen/builtins-ppc-p9-f128.c +++ b/clang/test/CodeGen/builtins-ppc-p9-f128.c @@ -5,6 +5,10 @@ __float128 B; __float128 C; +_Float128 f128_1 = 1.0f128; +_Float128 f128_2 = 2.0F128; +// CHECK: @f128_1 ={{.*}} global fp128 0xL00000000000000003FFF000000000000, align 16 +// CHECK: @f128_2 ={{.*}} global fp128 0xL00000000000000004000000000000000, align 16 __float128 testSqrtOdd() { return __builtin_sqrtf128_round_to_odd(A); diff --git a/clang/test/Preprocessor/init-x86.c b/clang/test/Preprocessor/init-x86.c --- a/clang/test/Preprocessor/init-x86.c +++ b/clang/test/Preprocessor/init-x86.c @@ -1338,6 +1338,20 @@ // X86_64-LINUX:#define __DBL_MIN_EXP__ (-1021) // X86_64-LINUX:#define __DBL_MIN__ 2.2250738585072014e-308 // X86_64-LINUX:#define __DECIMAL_DIG__ __LDBL_DECIMAL_DIG__ +// X86_64-LINUX:#define __FLT128_DECIMAL_DIG__ 36 +// X86_64-LINUX:#define __FLT128_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966F128 +// X86_64-LINUX:#define __FLT128_DIG__ 33 +// X86_64-LINUX:#define __FLT128_EPSILON__ 1.92592994438723585305597794258492732e-34F128 +// X86_64-LINUX:#define __FLT128_HAS_DENORM__ 1 +// X86_64-LINUX:#define __FLT128_HAS_INFINITY__ 1 +// X86_64-LINUX:#define __FLT128_HAS_QUIET_NAN__ 1 +// X86_64-LINUX:#define __FLT128_MANT_DIG__ 113 +// X86_64-LINUX:#define __FLT128_MAX_10_EXP__ 4932 +// X86_64-LINUX:#define __FLT128_MAX_EXP__ 16384 +// X86_64-LINUX:#define __FLT128_MAX__ 1.18973149535723176508575932662800702e+4932F128 +// X86_64-LINUX:#define __FLT128_MIN_10_EXP__ (-4931) +// X86_64-LINUX:#define __FLT128_MIN_EXP__ (-16381) +// X86_64-LINUX:#define __FLT128_MIN__ 3.36210314311209350626267781732175260e-4932F128 // X86_64-LINUX:#define __FLT_DENORM_MIN__ 1.40129846e-45F // X86_64-LINUX:#define __FLT_DIG__ 6 // X86_64-LINUX:#define __FLT_EPSILON__ 1.19209290e-7F @@ -1456,6 +1470,7 @@ // X86_64-LINUX:#define __SIG_ATOMIC_MAX__ 2147483647 // X86_64-LINUX:#define __SIG_ATOMIC_WIDTH__ 32 // X86_64-LINUX:#define __SIZEOF_DOUBLE__ 8 +// X86_64-LINUX:#define __SIZEOF_FLOAT128__ 16 // X86_64-LINUX:#define __SIZEOF_FLOAT__ 4 // X86_64-LINUX:#define __SIZEOF_INT__ 4 // X86_64-LINUX:#define __SIZEOF_LONG_DOUBLE__ 16 diff --git a/clang/test/Preprocessor/init.c b/clang/test/Preprocessor/init.c --- a/clang/test/Preprocessor/init.c +++ b/clang/test/Preprocessor/init.c @@ -1570,6 +1570,20 @@ // WEBASSEMBLY-NOT:#define __FLT16_MIN_10_EXP__ // WEBASSEMBLY-NOT:#define __FLT16_MIN_EXP__ // WEBASSEMBLY-NOT:#define __FLT16_MIN__ +// WEBASSEMBLY-NEXT:#define __FLT128_DECIMAL_DIG__ 36 +// WEBASSEMBLY-NEXT:#define __FLT128_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966F128 +// WEBASSEMBLY-NEXT:#define __FLT128_DIG__ 33 +// WEBASSEMBLY-NEXT:#define __FLT128_EPSILON__ 1.92592994438723585305597794258492732e-34F128 +// WEBASSEMBLY-NEXT:#define __FLT128_HAS_DENORM__ 1 +// WEBASSEMBLY-NEXT:#define __FLT128_HAS_INFINITY__ 1 +// WEBASSEMBLY-NEXT:#define __FLT128_HAS_QUIET_NAN__ 1 +// WEBASSEMBLY-NEXT:#define __FLT128_MANT_DIG__ 113 +// WEBASSEMBLY-NEXT:#define __FLT128_MAX_10_EXP__ 4932 +// WEBASSEMBLY-NEXT:#define __FLT128_MAX_EXP__ 16384 +// WEBASSEMBLY-NEXT:#define __FLT128_MAX__ 1.18973149535723176508575932662800702e+4932F128 +// WEBASSEMBLY-NEXT:#define __FLT128_MIN_10_EXP__ (-4931) +// WEBASSEMBLY-NEXT:#define __FLT128_MIN_EXP__ (-16381) +// WEBASSEMBLY-NEXT:#define __FLT128_MIN__ 3.36210314311209350626267781732175260e-4932F128 // WEBASSEMBLY-NEXT:#define __FLT_DECIMAL_DIG__ 9 // WEBASSEMBLY-NEXT:#define __FLT_DENORM_MIN__ 1.40129846e-45F // WEBASSEMBLY-NEXT:#define __FLT_DIG__ 6 diff --git a/clang/test/Sema/_Float128.c b/clang/test/Sema/_Float128.c new file mode 100644 --- /dev/null +++ b/clang/test/Sema/_Float128.c @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -triple powerpc64-linux -verify %s +// RUN: %clang_cc1 -triple i686-windows-gnu -verify %s +// RUN: %clang_cc1 -triple powerpc64-linux -verify=cxx -xc++ %s + +#ifdef __cplusplus +_Float128 f; // cxx-error {{unknown type name '_Float128'}} + +#elif defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__) +// expected-no-diagnostics +_Float128 f; +_Float128 epsilon = __FLT128_EPSILON__; + +#else +_Float128 f; // expected-error {{__float128 is not supported on this target}} +float epsilon = __FLT128_EPSILON__; // expected-error {{use of undeclared identifier}} + +#endif // defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)