RKSimon updated this revision to Diff 312979.
RKSimon added a comment.

missing newline


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D93597/new/

https://reviews.llvm.org/D93597

Files:
  clang/lib/Headers/xmmintrin.h
  clang/test/CodeGen/X86/sse-builtins.c

Index: clang/test/CodeGen/X86/sse-builtins.c
===================================================================
--- clang/test/CodeGen/X86/sse-builtins.c
+++ clang/test/CodeGen/X86/sse-builtins.c
@@ -1,6 +1,7 @@
-// RUN: %clang_cc1 -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse -emit-llvm -o - -Wall -Werror | FileCheck %s
-// RUN: %clang_cc1 -flax-vector-conversions=none -fms-extensions -fms-compatibility -ffreestanding %s -triple=x86_64-windows-msvc -target-feature +sse -emit-llvm -o - -Wall -Werror | FileCheck %s
-
+// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse -emit-llvm -o - -Wall -Werror | FileCheck %s
+// RUN: %clang_cc1 -x c -flax-vector-conversions=none -fms-extensions -fms-compatibility -ffreestanding %s -triple=x86_64-windows-msvc -target-feature +sse -emit-llvm -o - -Wall -Werror | FileCheck %s
+// RUN: %clang_cc1 -x c++ -std=c++11 -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +sse -emit-llvm -o - -Wall -Werror | FileCheck %s
+// RUN: %clang_cc1 -x c++ -std=c++11 -flax-vector-conversions=none -fms-extensions -fms-compatibility -ffreestanding %s -triple=x86_64-windows-msvc -target-feature +sse -emit-llvm -o - -Wall -Werror | FileCheck %s
 
 #include <immintrin.h>
 
@@ -807,3 +808,54 @@
   // CHECK: xor <4 x i32>
   return _mm_xor_ps(A, B);
 }
+
+// Test constexpr handling.
+#if defined(__cplusplus) && (__cplusplus >= 201103L)
+constexpr __m128 test_constexpr_mm_add_ps(__m128 A, __m128 B) {
+  return _mm_add_ps(A, B);
+}
+
+constexpr __m128 test_constexpr_mm_and_ps(__m128 A, __m128 B) {
+  return _mm_and_ps(A, B);
+}
+
+constexpr __m128 test_constexpr_mm_div_ps(__m128 A, __m128 B) {
+  return _mm_div_ps(A, B);
+}
+
+constexpr __m128 test_constexpr_mm_mul_ps(__m128 A, __m128 B) {
+  return _mm_mul_ps(A, B);
+}
+
+constexpr __m128 test_constexpr_mm_or_ps(__m128 A, __m128 B) {
+  return _mm_or_ps(A, B);
+}
+
+constexpr __m128 test_constexpr_mm_set_ss(float A) {
+  return _mm_set_ss(A);
+}
+
+constexpr __m128 test_constexpr_mm_set1_ps(float A) {
+  return _mm_set1_ps(A);
+}
+
+constexpr __m128 test_constexpr_mm_set_ps1(float A) {
+  return _mm_set_ps1(A);
+}
+
+constexpr __m128 test_constexpr_mm_set_ps(float A, float B, float C, float D) {
+  return _mm_set_ps(A, B, C, D);
+}
+
+constexpr __m128 test_constexpr_mm_setr_ps(float A, float B, float C, float D) {
+  return _mm_setr_ps(A, B, C, D);
+}
+
+constexpr __m128 test_constexpr_mm_setzero_ps() {
+  return _mm_setzero_ps();
+}
+
+constexpr __m128 test_constexpr_mm_xor_ps(__m128 A, __m128 B) {
+  return _mm_xor_ps(A, B);
+}
+#endif
Index: clang/lib/Headers/xmmintrin.h
===================================================================
--- clang/lib/Headers/xmmintrin.h
+++ clang/lib/Headers/xmmintrin.h
@@ -31,6 +31,12 @@
 #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("sse"), __min_vector_width__(128)))
 #define __DEFAULT_FN_ATTRS_MMX __attribute__((__always_inline__, __nodebug__, __target__("mmx,sse"), __min_vector_width__(64)))
 
+#if defined(__cplusplus) && (__cplusplus >= 201103L)
+#define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS constexpr
+#else
+#define __DEFAULT_FN_ATTRS_CONSTEXPR __DEFAULT_FN_ATTRS
+#endif
+
 /// Adds the 32-bit float values in the low-order bits of the operands.
 ///
 /// \headerfile <x86intrin.h>
@@ -66,7 +72,7 @@
 ///    A 128-bit vector of [4 x float] containing one of the source operands.
 /// \returns A 128-bit vector of [4 x float] containing the sums of both
 ///    operands.
-static __inline__ __m128 __DEFAULT_FN_ATTRS
+static __inline__ __m128 __DEFAULT_FN_ATTRS_CONSTEXPR
 _mm_add_ps(__m128 __a, __m128 __b)
 {
   return (__m128)((__v4sf)__a + (__v4sf)__b);
@@ -109,7 +115,7 @@
 ///    A 128-bit vector of [4 x float] containing the subtrahend.
 /// \returns A 128-bit vector of [4 x float] containing the differences between
 ///    both operands.
-static __inline__ __m128 __DEFAULT_FN_ATTRS
+static __inline__ __m128 __DEFAULT_FN_ATTRS_CONSTEXPR
 _mm_sub_ps(__m128 __a, __m128 __b)
 {
   return (__m128)((__v4sf)__a - (__v4sf)__b);
@@ -151,7 +157,7 @@
 ///    A 128-bit vector of [4 x float] containing one of the source operands.
 /// \returns A 128-bit vector of [4 x float] containing the products of both
 ///    operands.
-static __inline__ __m128 __DEFAULT_FN_ATTRS
+static __inline__ __m128 __DEFAULT_FN_ATTRS_CONSTEXPR
 _mm_mul_ps(__m128 __a, __m128 __b)
 {
   return (__m128)((__v4sf)__a * (__v4sf)__b);
@@ -192,7 +198,7 @@
 ///    A 128-bit vector of [4 x float] containing the divisor.
 /// \returns A 128-bit vector of [4 x float] containing the quotients of both
 ///    operands.
-static __inline__ __m128 __DEFAULT_FN_ATTRS
+static __inline__ __m128 __DEFAULT_FN_ATTRS_CONSTEXPR
 _mm_div_ps(__m128 __a, __m128 __b)
 {
   return (__m128)((__v4sf)__a / (__v4sf)__b);
@@ -400,7 +406,7 @@
 ///    A 128-bit vector containing one of the source operands.
 /// \returns A 128-bit vector of [4 x float] containing the bitwise AND of the
 ///    values between both operands.
-static __inline__ __m128 __DEFAULT_FN_ATTRS
+static __inline__ __m128 __DEFAULT_FN_ATTRS_CONSTEXPR
 _mm_and_ps(__m128 __a, __m128 __b)
 {
   return (__m128)((__v4su)__a & (__v4su)__b);
@@ -440,7 +446,7 @@
 ///    A 128-bit vector of [4 x float] containing one of the source operands.
 /// \returns A 128-bit vector of [4 x float] containing the bitwise OR of the
 ///    values between both operands.
-static __inline__ __m128 __DEFAULT_FN_ATTRS
+static __inline__ __m128 __DEFAULT_FN_ATTRS_CONSTEXPR
 _mm_or_ps(__m128 __a, __m128 __b)
 {
   return (__m128)((__v4su)__a | (__v4su)__b);
@@ -459,7 +465,7 @@
 ///    A 128-bit vector of [4 x float] containing one of the source operands.
 /// \returns A 128-bit vector of [4 x float] containing the bitwise exclusive OR
 ///    of the values between both operands.
-static __inline__ __m128 __DEFAULT_FN_ATTRS
+static __inline__ __m128 __DEFAULT_FN_ATTRS_CONSTEXPR
 _mm_xor_ps(__m128 __a, __m128 __b)
 {
   return (__m128)((__v4su)__a ^ (__v4su)__b);
@@ -1792,7 +1798,7 @@
 /// \returns An initialized 128-bit floating-point vector of [4 x float]. The
 ///    lower 32 bits contain the value provided in the source operand. The
 ///    upper 96 bits are set to zero.
-static __inline__ __m128 __DEFAULT_FN_ATTRS
+static __inline__ __m128 __DEFAULT_FN_ATTRS_CONSTEXPR
 _mm_set_ss(float __w)
 {
   return __extension__ (__m128){ __w, 0, 0, 0 };
@@ -1810,7 +1816,7 @@
 ///    A single-precision floating-point value used to initialize each vector
 ///    element of the result.
 /// \returns An initialized 128-bit floating-point vector of [4 x float].
-static __inline__ __m128 __DEFAULT_FN_ATTRS
+static __inline__ __m128 __DEFAULT_FN_ATTRS_CONSTEXPR
 _mm_set1_ps(float __w)
 {
   return __extension__ (__m128){ __w, __w, __w, __w };
@@ -1829,7 +1835,7 @@
 ///    A single-precision floating-point value used to initialize each vector
 ///    element of the result.
 /// \returns An initialized 128-bit floating-point vector of [4 x float].
-static __inline__ __m128 __DEFAULT_FN_ATTRS
+static __inline__ __m128 __DEFAULT_FN_ATTRS_CONSTEXPR
 _mm_set_ps1(float __w)
 {
     return _mm_set1_ps(__w);
@@ -1856,7 +1862,7 @@
 ///    A single-precision floating-point value used to initialize bits [31:0]
 ///    of the result.
 /// \returns An initialized 128-bit floating-point vector of [4 x float].
-static __inline__ __m128 __DEFAULT_FN_ATTRS
+static __inline__ __m128 __DEFAULT_FN_ATTRS_CONSTEXPR
 _mm_set_ps(float __z, float __y, float __x, float __w)
 {
   return __extension__ (__m128){ __w, __x, __y, __z };
@@ -1884,7 +1890,7 @@
 ///    A single-precision floating-point value used to initialize bits [127:96]
 ///    of the result.
 /// \returns An initialized 128-bit floating-point vector of [4 x float].
-static __inline__ __m128 __DEFAULT_FN_ATTRS
+static __inline__ __m128 __DEFAULT_FN_ATTRS_CONSTEXPR
 _mm_setr_ps(float __z, float __y, float __x, float __w)
 {
   return __extension__ (__m128){ __z, __y, __x, __w };
@@ -1899,7 +1905,7 @@
 ///
 /// \returns An initialized 128-bit floating-point vector of [4 x float] with
 ///    all elements set to zero.
-static __inline__ __m128 __DEFAULT_FN_ATTRS
+static __inline__ __m128 __DEFAULT_FN_ATTRS_CONSTEXPR
 _mm_setzero_ps(void)
 {
   return __extension__ (__m128){ 0, 0, 0, 0 };
@@ -2999,6 +3005,7 @@
 
 #undef __DEFAULT_FN_ATTRS
 #undef __DEFAULT_FN_ATTRS_MMX
+#undef __DEFAULT_FN_ATTRS_CONSTEXPR
 
 /* Ugly hack for backwards-compatibility (compatible with gcc) */
 #if defined(__SSE2__) && !__building_module(_Builtin_intrinsics)
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to