Index: lib/Basic/Targets.cpp =================================================================== --- lib/Basic/Targets.cpp +++ lib/Basic/Targets.cpp @@ -4776,6 +4776,18 @@ // ACLE 6.4.6 Q (saturation) flag if (hasDSP || hasSAT) Builder.defineMacro("__ARM_FEATURE_QBIT", "1"); + + // ACLE 6.6 Floating-point model + if (Opts.FastMath || Opts.FiniteMathOnly) + Builder.defineMacro("__ARM_FP_FAST", "1"); + + if (Opts.C99 && !Opts.Freestanding) { + Builder.defineMacro("__ARM_FP_FENV_ROUNDING", "1"); + Builder.defineMacro("__STDC_IEC_559__", "1"); + } + + if (!Opts.C11) + Builder.defineMacro("__SUPPORT_SNAN__", "1"); } void getTargetBuiltins(const Builtin::Info *&Records, @@ -5229,7 +5241,7 @@ Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'"); Builder.defineMacro("__ARM_64BIT_STATE", "1"); - Builder.defineMacro("__ARM_PCS_AAPCS64"); + Builder.defineMacro("__ARM_PCS_AAPCS64", "1"); Builder.defineMacro("__ARM_ARCH_ISA_A64", "1"); Builder.defineMacro("__ARM_FEATURE_CLZ", "1"); @@ -5250,11 +5262,17 @@ Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1"); Builder.defineMacro("__ARM_FP16_ARGS", "1"); + // ACLE 6.6 Floating-point model if (Opts.FastMath || Opts.FiniteMathOnly) - Builder.defineMacro("__ARM_FP_FAST"); + Builder.defineMacro("__ARM_FP_FAST", "1"); + + if (Opts.C99 && !Opts.Freestanding) { + Builder.defineMacro("__ARM_FP_FENV_ROUNDING", "1"); + Builder.defineMacro("__STDC_IEC_559__", "1"); + } - if (Opts.C99 && !Opts.Freestanding) - Builder.defineMacro("__ARM_FP_FENV_ROUNDING"); + if (!Opts.C11) + Builder.defineMacro("__SUPPORT_SNAN__", "1"); Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4"); Index: test/Preprocessor/aarch64-target-features.c =================================================================== --- test/Preprocessor/aarch64-target-features.c +++ test/Preprocessor/aarch64-target-features.c @@ -34,12 +34,23 @@ // CHECK: __ARM_NEON 1 // CHECK: __ARM_NEON_FP 0xE // CHECK: __ARM_PCS_AAPCS64 1 +// CHECK-NOT: __ARM_PCS 1 +// CHECK-NOT: __ARM_PCS_VFP 1 // CHECK-NOT: __ARM_SIZEOF_MINIMAL_ENUM 1 // CHECK-NOT: __ARM_SIZEOF_WCHAR_T 2 +// CHECK: __STDC_IEC_559__ 1 // RUN: %clang -target aarch64_be-eabi -x c -E -dM %s -o - | FileCheck %s -check-prefix CHECK-BIGENDIAN // CHECK-BIGENDIAN: __ARM_BIG_ENDIAN 1 +// RUN: %clang -target aarch64-none-linux-gnu -std=c99 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-C99 %s +// RUN: %clang -target arm64-none-linux-gnu -std=c99 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-C99 %s +// CHECK-C99: __SUPPORT_SNAN__ 1 + +// RUN: %clang -target aarch64-none-linux-gnu -std=c11 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-C11 %s +// RUN: %clang -target arm64-none-linux-gnu -std=c11 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-C11 %s +// CHECK-C11-NOT: __SUPPORT_SNAN__ 1 + // RUN: %clang -target aarch64-none-linux-gnu -march=armv8-a+crypto -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-CRYPTO %s // RUN: %clang -target arm64-none-linux-gnu -march=armv8-a+crypto -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-CRYPTO %s // CHECK-CRYPTO: __ARM_FEATURE_CRYPTO 1 Index: test/Preprocessor/arm-target-features.c =================================================================== --- test/Preprocessor/arm-target-features.c +++ test/Preprocessor/arm-target-features.c @@ -32,6 +32,7 @@ // CHECK-V8-BAREHF: __ARM_FEATURE_DIRECTED_ROUNDING 1 // CHECK-V8-BAREHF: __ARM_FEATURE_NUMERIC_MAXMIN 1 // CHECK-V8-BAREHF: __ARM_NEON__ 1 +// CHECK-V8-BAREHF: __ARM_PCS_VFP 1 // CHECK-V8-BAREHF: __VFP_FP__ 1 // RUN: %clang -target armv8a -mfloat-abi=hard -mfpu=fp-armv8 -x c -E -dM %s | FileCheck --check-prefix=CHECK-V8-BAREHF-FP %s @@ -85,8 +86,20 @@ // THUMBV8A-EABI:#define __ARM_ARCH_EXT_IDIV__ 1 // RUN: %clang -target arm-none-linux-gnu -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-DEFS %s +// CHECK-DEFS:#define __ARM_FP_FENV_ROUNDING 1 +// CHECK-DEFS:#define __ARM_PCS 1 // CHECK-DEFS:#define __ARM_SIZEOF_MINIMAL_ENUM 4 // CHECK-DEFS:#define __ARM_SIZEOF_WCHAR_T 4 +// CHECK-DEFS:#define __STDC_IEC_559__ 1 + +// RUN: %clang -target arm-none-linux-gnu -std=c99 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-C99 %s +// CHECK-C99: __SUPPORT_SNAN__ 1 + +// RUN: %clang -target arm-none-linux-gnu -std=c11 -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-C11 %s +// CHECK-C11-NOT: __SUPPORT_SNAN__ 1 + +// RUN: %clang -target arm-none-linux-gnu -ffast-math -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-FASTMATH %s +// CHECK-FASTMATH: __ARM_FP_FAST 1 // RUN: %clang -target arm-none-linux-gnu -fshort-wchar -x c -E -dM %s -o - | FileCheck --check-prefix=CHECK-SHORTWCHAR %s // CHECK-SHORTWCHAR:#define __ARM_SIZEOF_WCHAR_T 2