MaskRay created this revision.
MaskRay added reviewers: bkramer, hubert.reinterpretcast, mibintc, nsz.
Herald added subscribers: dexonsmith, kbarton, nemanjai, dschuff.
MaskRay requested review of this revision.
Herald added subscribers: cfe-commits, aheejin.
Herald added a project: clang.

This adds F128 <https://reviews.llvm.org/F128> literal on top of D40673 
<https://reviews.llvm.org/D40673>.

Note: rC321948 <https://reviews.llvm.org/rC321948> added some `__builtin_*f128` 
functions.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D111382

Files:
  clang/include/clang/Basic/TokenKinds.def
  clang/lib/Frontend/InitPreprocessor.cpp
  clang/lib/Lex/LiteralSupport.cpp
  clang/test/CodeGen/builtins-ppc-p9-f128.c
  clang/test/Preprocessor/init-x86.c
  clang/test/Preprocessor/init.c
  clang/test/Sema/_Float128.c

Index: clang/test/Sema/_Float128.c
===================================================================
--- /dev/null
+++ 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__)
Index: clang/test/Preprocessor/init.c
===================================================================
--- clang/test/Preprocessor/init.c
+++ 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
Index: clang/test/Preprocessor/init-x86.c
===================================================================
--- clang/test/Preprocessor/init-x86.c
+++ 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
Index: clang/test/CodeGen/builtins-ppc-p9-f128.c
===================================================================
--- clang/test/CodeGen/builtins-ppc-p9-f128.c
+++ 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);
Index: clang/lib/Lex/LiteralSupport.cpp
===================================================================
--- clang/lib/Lex/LiteralSupport.cpp
+++ 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"
Index: clang/lib/Frontend/InitPreprocessor.cpp
===================================================================
--- clang/lib/Frontend/InitPreprocessor.cpp
+++ 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__",
Index: clang/include/clang/Basic/TokenKinds.def
===================================================================
--- clang/include/clang/Basic/TokenKinds.def
+++ 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)
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to