mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-14 14:56:47 +00:00
This adds the _Float16 preprocessor macro definitions.
Differential Revision: https://reviews.llvm.org/D34695 llvm-svn: 313152
This commit is contained in:
parent
1958083d35
commit
c05609ca36
@ -110,9 +110,11 @@ static void AddImplicitIncludePCH(MacroBuilder &Builder, Preprocessor &PP,
|
||||
/// PickFP - This is used to pick a value based on the FP semantics of the
|
||||
/// specified FP model.
|
||||
template <typename T>
|
||||
static T PickFP(const llvm::fltSemantics *Sem, T IEEESingleVal,
|
||||
static T PickFP(const llvm::fltSemantics *Sem, T IEEEHalfVal, T IEEESingleVal,
|
||||
T IEEEDoubleVal, T X87DoubleExtendedVal, T PPCDoubleDoubleVal,
|
||||
T IEEEQuadVal) {
|
||||
if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEhalf())
|
||||
return IEEEHalfVal;
|
||||
if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEsingle())
|
||||
return IEEESingleVal;
|
||||
if (Sem == (const llvm::fltSemantics*)&llvm::APFloat::IEEEdouble())
|
||||
@ -128,26 +130,26 @@ static T PickFP(const llvm::fltSemantics *Sem, T IEEESingleVal,
|
||||
static void DefineFloatMacros(MacroBuilder &Builder, StringRef Prefix,
|
||||
const llvm::fltSemantics *Sem, StringRef Ext) {
|
||||
const char *DenormMin, *Epsilon, *Max, *Min;
|
||||
DenormMin = PickFP(Sem, "1.40129846e-45", "4.9406564584124654e-324",
|
||||
"3.64519953188247460253e-4951",
|
||||
DenormMin = PickFP(Sem, "5.9604644775390625e-8", "1.40129846e-45",
|
||||
"4.9406564584124654e-324", "3.64519953188247460253e-4951",
|
||||
"4.94065645841246544176568792868221e-324",
|
||||
"6.47517511943802511092443895822764655e-4966");
|
||||
int Digits = PickFP(Sem, 6, 15, 18, 31, 33);
|
||||
int DecimalDigits = PickFP(Sem, 9, 17, 21, 33, 36);
|
||||
Epsilon = PickFP(Sem, "1.19209290e-7", "2.2204460492503131e-16",
|
||||
"1.08420217248550443401e-19",
|
||||
int Digits = PickFP(Sem, 3, 6, 15, 18, 31, 33);
|
||||
int DecimalDigits = PickFP(Sem, 5, 9, 17, 21, 33, 36);
|
||||
Epsilon = PickFP(Sem, "9.765625e-4", "1.19209290e-7",
|
||||
"2.2204460492503131e-16", "1.08420217248550443401e-19",
|
||||
"4.94065645841246544176568792868221e-324",
|
||||
"1.92592994438723585305597794258492732e-34");
|
||||
int MantissaDigits = PickFP(Sem, 24, 53, 64, 106, 113);
|
||||
int Min10Exp = PickFP(Sem, -37, -307, -4931, -291, -4931);
|
||||
int Max10Exp = PickFP(Sem, 38, 308, 4932, 308, 4932);
|
||||
int MinExp = PickFP(Sem, -125, -1021, -16381, -968, -16381);
|
||||
int MaxExp = PickFP(Sem, 128, 1024, 16384, 1024, 16384);
|
||||
Min = PickFP(Sem, "1.17549435e-38", "2.2250738585072014e-308",
|
||||
int MantissaDigits = PickFP(Sem, 11, 24, 53, 64, 106, 113);
|
||||
int Min10Exp = PickFP(Sem, -13, -37, -307, -4931, -291, -4931);
|
||||
int Max10Exp = PickFP(Sem, 4, 38, 308, 4932, 308, 4932);
|
||||
int MinExp = PickFP(Sem, -14, -125, -1021, -16381, -968, -16381);
|
||||
int MaxExp = PickFP(Sem, 15, 128, 1024, 16384, 1024, 16384);
|
||||
Min = PickFP(Sem, "6.103515625e-5", "1.17549435e-38", "2.2250738585072014e-308",
|
||||
"3.36210314311209350626e-4932",
|
||||
"2.00416836000897277799610805135016e-292",
|
||||
"3.36210314311209350626267781732175260e-4932");
|
||||
Max = PickFP(Sem, "3.40282347e+38", "1.7976931348623157e+308",
|
||||
Max = PickFP(Sem, "6.5504e+4", "3.40282347e+38", "1.7976931348623157e+308",
|
||||
"1.18973149535723176502e+4932",
|
||||
"1.79769313486231580793728971405301e+308",
|
||||
"1.18973149535723176508575932662800702e+4932");
|
||||
@ -802,6 +804,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI,
|
||||
DefineFmt("__UINTPTR", TI.getUIntPtrType(), TI, Builder);
|
||||
DefineTypeWidth("__UINTPTR_WIDTH__", TI.getUIntPtrType(), TI, Builder);
|
||||
|
||||
DefineFloatMacros(Builder, "FLT16", &TI.getHalfFormat(), "F16");
|
||||
DefineFloatMacros(Builder, "FLT", &TI.getFloatFormat(), "F");
|
||||
DefineFloatMacros(Builder, "DBL", &TI.getDoubleFormat(), "");
|
||||
DefineFloatMacros(Builder, "LDBL", &TI.getLongDoubleFormat(), "L");
|
||||
|
@ -143,4 +143,18 @@
|
||||
# define LDBL_DECIMAL_DIG __LDBL_DECIMAL_DIG__
|
||||
#endif
|
||||
|
||||
#ifdef __STDC_WANT_IEC_60559_TYPES_EXT__
|
||||
# define FLT16_MANT_DIG __FLT16_MANT_DIG__
|
||||
# define FLT16_DECIMAL_DIG __FLT16_DECIMAL_DIG__
|
||||
# define FLT16_DIG __FLT16_DIG__
|
||||
# define FLT16_MIN_EXP __FLT16_MIN_EXP__
|
||||
# define FLT16_MIN_10_EXP __FLT16_MIN_10_EXP__
|
||||
# define FLT16_MAX_EXP __FLT16_MAX_EXP__
|
||||
# define FLT16_MAX_10_EXP __FLT16_MAX_10_EXP__
|
||||
# define FLT16_MAX __FLT16_MAX__
|
||||
# define FLT16_EPSILON __FLT16_EPSILON__
|
||||
# define FLT16_MIN __FLT16_MIN__
|
||||
# define FLT16_TRUE_MIN __FLT16_TRUE_MIN__
|
||||
#endif /* __STDC_WANT_IEC_60559_TYPES_EXT__ */
|
||||
|
||||
#endif /* __FLOAT_H */
|
||||
|
65
clang/test/Headers/float16.c
Normal file
65
clang/test/Headers/float16.c
Normal file
@ -0,0 +1,65 @@
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c89 -ffreestanding %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c99 -ffreestanding %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c11 -ffreestanding %s
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -x c++ -ffreestanding %s
|
||||
// expected-no-diagnostics
|
||||
|
||||
#define __STDC_WANT_IEC_60559_TYPES_EXT__
|
||||
#include <float.h>
|
||||
|
||||
#ifndef FLT16_MIN_10_EXP
|
||||
#error "Macro FLT16_MIN_10_EXP is missing."
|
||||
#elif FLT16_MIN_10_EXP > -13
|
||||
#error "Macro FLT16_MIN_10_EXP is invalid."
|
||||
#endif
|
||||
|
||||
_Static_assert(FLT16_MIN_10_EXP == __FLT16_MIN_10_EXP__, "");
|
||||
|
||||
#ifndef FLT16_MIN_EXP
|
||||
#error "Macro FLT16_MIN_EXP is missing."
|
||||
#elif FLT16_MIN_EXP > -14
|
||||
#error "Macro FLT16_MIN_EXP is invalid."
|
||||
#endif
|
||||
|
||||
_Static_assert(FLT16_MIN_EXP == __FLT16_MIN_EXP__, "");
|
||||
|
||||
#ifndef FLT16_MAX_10_EXP
|
||||
#error "Macro FLT16_MAX_10_EXP is missing."
|
||||
#elif FLT16_MAX_10_EXP < 4
|
||||
#error "Macro FLT16_MAX_10_EXP is invalid."
|
||||
#endif
|
||||
|
||||
_Static_assert(FLT16_MAX_10_EXP == __FLT16_MAX_10_EXP__, "");
|
||||
|
||||
#ifndef FLT16_MAX_EXP
|
||||
#error "Macro FLT16_MAX_EXP is missing."
|
||||
#elif FLT16_MAX_EXP < 15
|
||||
#error "Macro FLT16_MAX_EXP is invalid."
|
||||
#endif
|
||||
|
||||
_Static_assert(FLT16_MAX_EXP == __FLT16_MAX_EXP__, "");
|
||||
|
||||
#ifndef FLT16_DECIMAL_DIG
|
||||
#error "Macro FLT16_DECIMAL_DIG is missing."
|
||||
#elif FLT16_DECIMAL_DIG < 5
|
||||
#error "Macro FLT16_DECIMAL_DIG is invalid."
|
||||
#endif
|
||||
|
||||
_Static_assert(FLT16_DECIMAL_DIG == __FLT16_DECIMAL_DIG__, "");
|
||||
|
||||
#ifndef FLT16_DIG
|
||||
#error "Macro FLT16_DIG is missing."
|
||||
#elif FLT16_DIG < 3
|
||||
#error "Macro FLT16_DIG is invalid."
|
||||
#endif
|
||||
|
||||
_Static_assert(FLT16_DIG == __FLT16_DIG__, "");
|
||||
|
||||
#ifndef FLT16_MANT_DIG
|
||||
#error "Macro FLT16_MANT_DIG is missing."
|
||||
#elif FLT16_MANT_DIG < 11
|
||||
#error "Macro FLT16_MANT_DIG is invalid."
|
||||
#endif
|
||||
|
||||
_Static_assert(FLT16_MANT_DIG == __FLT16_MANT_DIG__, "");
|
||||
|
@ -301,6 +301,20 @@
|
||||
// AARCH64:#define __DBL_MIN_EXP__ (-1021)
|
||||
// AARCH64:#define __DBL_MIN__ 2.2250738585072014e-308
|
||||
// AARCH64:#define __DECIMAL_DIG__ __LDBL_DECIMAL_DIG__
|
||||
// AARCH64:#define __FLT16_DECIMAL_DIG__ 5
|
||||
// AARCH64:#define __FLT16_DENORM_MIN__ 5.9604644775390625e-8F16
|
||||
// AARCH64:#define __FLT16_DIG__ 3
|
||||
// AARCH64:#define __FLT16_EPSILON__ 9.765625e-4F16
|
||||
// AARCH64:#define __FLT16_HAS_DENORM__ 1
|
||||
// AARCH64:#define __FLT16_HAS_INFINITY__ 1
|
||||
// AARCH64:#define __FLT16_HAS_QUIET_NAN__ 1
|
||||
// AARCH64:#define __FLT16_MANT_DIG__ 11
|
||||
// AARCH64:#define __FLT16_MAX_10_EXP__ 4
|
||||
// AARCH64:#define __FLT16_MAX_EXP__ 15
|
||||
// AARCH64:#define __FLT16_MAX__ 6.5504e+4F16
|
||||
// AARCH64:#define __FLT16_MIN_10_EXP__ (-13)
|
||||
// AARCH64:#define __FLT16_MIN_EXP__ (-14)
|
||||
// AARCH64:#define __FLT16_MIN__ 6.103515625e-5F16
|
||||
// AARCH64:#define __FLT_DENORM_MIN__ 1.40129846e-45F
|
||||
// AARCH64:#define __FLT_DIG__ 6
|
||||
// AARCH64:#define __FLT_EPSILON__ 1.19209290e-7F
|
||||
@ -9071,7 +9085,7 @@
|
||||
// WEBASSEMBLY32-NEXT:#define __DECIMAL_DIG__ __LDBL_DECIMAL_DIG__
|
||||
// WEBASSEMBLY32-NOT:#define __ELF__
|
||||
// WEBASSEMBLY32-NEXT:#define __FINITE_MATH_ONLY__ 0
|
||||
// WEBASSEMBLY32-NEXT:#define __FLT_DECIMAL_DIG__ 9
|
||||
// WEBASSEMBLY32:#define __FLT_DECIMAL_DIG__ 9
|
||||
// WEBASSEMBLY32-NEXT:#define __FLT_DENORM_MIN__ 1.40129846e-45F
|
||||
// WEBASSEMBLY32-NEXT:#define __FLT_DIG__ 6
|
||||
// WEBASSEMBLY32-NEXT:#define __FLT_EPSILON__ 1.19209290e-7F
|
||||
@ -9402,7 +9416,7 @@
|
||||
// WEBASSEMBLY64-NEXT:#define __DECIMAL_DIG__ __LDBL_DECIMAL_DIG__
|
||||
// WEBASSEMBLY64-NOT:#define __ELF__
|
||||
// WEBASSEMBLY64-NEXT:#define __FINITE_MATH_ONLY__ 0
|
||||
// WEBASSEMBLY64-NEXT:#define __FLT_DECIMAL_DIG__ 9
|
||||
// WEBASSEMBLY64:#define __FLT_DECIMAL_DIG__ 9
|
||||
// WEBASSEMBLY64-NEXT:#define __FLT_DENORM_MIN__ 1.40129846e-45F
|
||||
// WEBASSEMBLY64-NEXT:#define __FLT_DIG__ 6
|
||||
// WEBASSEMBLY64-NEXT:#define __FLT_EPSILON__ 1.19209290e-7F
|
||||
|
Loading…
x
Reference in New Issue
Block a user