https://github.com/zeyi2 updated 
https://github.com/llvm/llvm-project/pull/160876

>From 40cca74bc3ed9398b9d94bfe79103c74841eddd3 Mon Sep 17 00:00:00 2001
From: mtx <[email protected]>
Date: Thu, 25 Sep 2025 22:43:12 +0800
Subject: [PATCH 1/2] [X86][Clang] Support `__builtin_ia32_(u)comi(sd)`

---
 clang/include/clang/Basic/BuiltinsX86.td     |   4 +-
 clang/lib/AST/ByteCode/InterpBuiltin.cpp     | 149 ++++++++++++++++++-
 clang/lib/AST/ExprConstant.cpp               | 144 +++++++++++++++++-
 clang/lib/Headers/avx512fp16intrin.h         |  48 +++---
 clang/lib/Headers/emmintrin.h                |  48 +++---
 clang/lib/Headers/xmmintrin.h                |  60 +++-----
 clang/test/CodeGen/X86/avx512fp16-builtins.c |  46 +++++-
 7 files changed, 408 insertions(+), 91 deletions(-)

diff --git a/clang/include/clang/Basic/BuiltinsX86.td 
b/clang/include/clang/Basic/BuiltinsX86.td
index b80f733066b65..ea45d4806905d 100644
--- a/clang/include/clang/Basic/BuiltinsX86.td
+++ b/clang/include/clang/Basic/BuiltinsX86.td
@@ -58,7 +58,7 @@ let Attributes = [NoThrow, Const, RequiredVectorWidth<64>], 
Features = "sse" in
 }
 
 // SSE intrinsics
-let Attributes = [Const, NoThrow, RequiredVectorWidth<128>] in {
+let Attributes = [Const, Constexpr, NoThrow, RequiredVectorWidth<128>] in {
   foreach Cmp = ["eq", "lt", "le", "gt", "ge", "neq"] in {
     let Features = "sse" in {
       def comi#Cmp : X86Builtin<"int(_Vector<4, float>, _Vector<4, float>)">;
@@ -3420,7 +3420,7 @@ let Features = "avx512vp2intersect,avx512vl", Attributes 
= [NoThrow, RequiredVec
   def vp2intersect_d_128 : X86Builtin<"void(_Vector<4, int>, _Vector<4, int>, 
unsigned char *, unsigned char *)">;
 }
 
-let Features = "avx512fp16", Attributes = [NoThrow, Const, 
RequiredVectorWidth<128>] in {
+let Features = "avx512fp16", Attributes = [NoThrow, Const, Constexpr, 
RequiredVectorWidth<128>] in {
   def vcomish : X86Builtin<"int(_Vector<8, _Float16>, _Vector<8, _Float16>, 
_Constant int, _Constant int)">;
 }
 
diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp 
b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index 5423d3ca73c81..99d8e036d9f2a 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -11,6 +11,7 @@
 #include "Interp.h"
 #include "InterpBuiltinBitCast.h"
 #include "PrimType.h"
+#include "immintrin.h"
 #include "clang/AST/OSLog.h"
 #include "clang/AST/RecordLayout.h"
 #include "clang/Basic/Builtins.h"
@@ -2948,6 +2949,122 @@ static bool 
interp__builtin_x86_insert_subvector(InterpState &S, CodePtr OpPC,
   return true;
 }
 
+static bool interp__builtin_x86_vcomish(InterpState &S, CodePtr OpPC,
+                                        const InterpFrame *Frame,
+                                        const CallExpr *Call) {
+  using CmpResult = llvm::APFloatBase::cmpResult;
+
+  llvm::APSInt R =
+      popToAPSInt(S.Stk, *S.getContext().classify(Call->getArg(3)));
+  llvm::APSInt P =
+      popToAPSInt(S.Stk, *S.getContext().classify(Call->getArg(2)));
+  const Pointer &VB = S.Stk.pop<Pointer>();
+  const Pointer &VA = S.Stk.pop<Pointer>();
+
+  llvm::APFloat A0 = VA.elem<Floating>(0).getAPFloat();
+  llvm::APFloat B0 = VB.elem<Floating>(0).getAPFloat();
+  CmpResult cmp = A0.compare(B0);
+
+  bool isEq = cmp == (CmpResult::cmpEqual);
+  bool isGt = cmp == (CmpResult::cmpGreaterThan);
+  bool isLt = cmp == (CmpResult::cmpLessThan);
+  bool result = false;
+
+  switch (P.getZExtValue()) {
+  case _CMP_EQ_OQ: /* _mm_ucomieq_sh */
+  case _CMP_EQ_OS: /* _mm_comieq_sh */
+    result = isEq && !A0.isNaN() && !B0.isNaN();
+    break;
+  case _CMP_NEQ_US: /* _mm_comineq_sh */
+  case _CMP_NEQ_UQ: /* _mm_ucomineq_sh */
+    result = !isEq || A0.isNaN() || B0.isNaN();
+    break;
+  case _CMP_GE_OS: /* _mm_comige_sh */
+  case _CMP_GE_OQ: /* _mm_ucomige_sh */
+    result = !isLt && !A0.isNaN() && !B0.isNaN();
+    break;
+  case _CMP_LT_OS: /* _mm_comilt_sh */
+  case _CMP_LT_OQ: /* _mm_ucomilt_sh */
+    result = isLt && !A0.isNaN() && !B0.isNaN();
+    break;
+  case _CMP_GT_OS: /* _mm_comigt_sh */
+  case _CMP_GT_OQ: /* _mm_ucomigt_sh */
+    result = isGt && !A0.isNaN() && !B0.isNaN();
+    break;
+  case _CMP_LE_OS: /* _mm_comile_sh */
+  case _CMP_LE_OQ: /*_mm_ucomile_sh */
+    result = !isGt && !A0.isNaN() && !B0.isNaN();
+    break;
+  default:
+    return false;
+  }
+
+  pushInteger(S, result ? 1 : 0, Call->getType());
+  return true;
+}
+
+static bool interp__builtin_x86_compare_scalar(InterpState &S, CodePtr OpPC,
+                                               const InterpFrame *Frame,
+                                               const CallExpr *Call,
+                                               unsigned ID) {
+  using CmpResult = llvm::APFloatBase::cmpResult;
+
+  const Pointer &VB = S.Stk.pop<Pointer>();
+  const Pointer &VA = S.Stk.pop<Pointer>();
+
+  llvm::APFloat A0 = VA.elem<Floating>(0).getAPFloat();
+  llvm::APFloat B0 = VB.elem<Floating>(0).getAPFloat();
+  CmpResult cmp = A0.compare(B0);
+
+  bool isEq = cmp == (CmpResult::cmpEqual);
+  bool isGt = cmp == (CmpResult::cmpGreaterThan);
+  bool isLt = cmp == (CmpResult::cmpLessThan);
+  bool result = false;
+
+  switch (ID) {
+  case X86::BI__builtin_ia32_comieq:
+  case X86::BI__builtin_ia32_ucomieq:
+  case X86::BI__builtin_ia32_comisdeq:
+  case X86::BI__builtin_ia32_ucomisdeq:
+    result = isEq && !A0.isNaN() && !B0.isNaN();
+    break;
+  case X86::BI__builtin_ia32_comineq:
+  case X86::BI__builtin_ia32_ucomineq:
+  case X86::BI__builtin_ia32_comisdneq:
+  case X86::BI__builtin_ia32_ucomisdneq:
+    result = !isEq || A0.isNaN() || B0.isNaN();
+    break;
+  case X86::BI__builtin_ia32_comige:
+  case X86::BI__builtin_ia32_ucomige:
+  case X86::BI__builtin_ia32_comisdge:
+  case X86::BI__builtin_ia32_ucomisdge:
+    result = !isLt && !A0.isNaN() && !B0.isNaN();
+    break;
+  case X86::BI__builtin_ia32_comilt:
+  case X86::BI__builtin_ia32_ucomilt:
+  case X86::BI__builtin_ia32_comisdlt:
+  case X86::BI__builtin_ia32_ucomisdlt:
+    result = isLt && !A0.isNaN() && !B0.isNaN();
+    break;
+  case X86::BI__builtin_ia32_comigt:
+  case X86::BI__builtin_ia32_ucomigt:
+  case X86::BI__builtin_ia32_comisdgt:
+  case X86::BI__builtin_ia32_ucomisdgt:
+    result = isGt && !A0.isNaN() && !B0.isNaN();
+    break;
+  case X86::BI__builtin_ia32_comile:
+  case X86::BI__builtin_ia32_ucomile:
+  case X86::BI__builtin_ia32_comisdle:
+  case X86::BI__builtin_ia32_ucomisdle:
+    result = !isGt && !A0.isNaN() && !B0.isNaN();
+    break;
+  default:
+    return false;
+  }
+  pushInteger(S, result ? 1 : 0, S.getASTContext().IntTy);
+  return true;
+}
+
 bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
                       uint32_t BuiltinID) {
   if (!S.getASTContext().BuiltinInfo.isConstantEvaluated(BuiltinID))
@@ -3685,6 +3802,34 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, 
const CallExpr *Call,
   case X86::BI__builtin_ia32_insert128i256:
     return interp__builtin_x86_insert_subvector(S, OpPC, Call, BuiltinID);
 
+  case X86::BI__builtin_ia32_vcomish:
+    return interp__builtin_x86_vcomish(S, OpPC, Frame, Call);
+  case X86::BI__builtin_ia32_comieq:
+  case X86::BI__builtin_ia32_ucomieq:
+  case X86::BI__builtin_ia32_comisdeq:
+  case X86::BI__builtin_ia32_ucomisdeq:
+  case X86::BI__builtin_ia32_comineq:
+  case X86::BI__builtin_ia32_ucomineq:
+  case X86::BI__builtin_ia32_comisdneq:
+  case X86::BI__builtin_ia32_ucomisdneq:
+  case X86::BI__builtin_ia32_comige:
+  case X86::BI__builtin_ia32_ucomige:
+  case X86::BI__builtin_ia32_comisdge:
+  case X86::BI__builtin_ia32_ucomisdge:
+  case X86::BI__builtin_ia32_comilt:
+  case X86::BI__builtin_ia32_ucomilt:
+  case X86::BI__builtin_ia32_comisdlt:
+  case X86::BI__builtin_ia32_ucomisdlt:
+  case X86::BI__builtin_ia32_comile:
+  case X86::BI__builtin_ia32_ucomile:
+  case X86::BI__builtin_ia32_comisdle:
+  case X86::BI__builtin_ia32_ucomisdle:
+  case X86::BI__builtin_ia32_comigt:
+  case X86::BI__builtin_ia32_ucomigt:
+  case X86::BI__builtin_ia32_comisdgt:
+  case X86::BI__builtin_ia32_ucomisdgt:
+    return interp__builtin_x86_compare_scalar(S, OpPC, Frame, Call, BuiltinID);
+
   default:
     S.FFDiag(S.Current->getLocation(OpPC),
              diag::note_invalid_subexpr_in_const_expr)
@@ -3721,8 +3866,8 @@ bool InterpretOffsetOf(InterpState &S, CodePtr OpPC, 
const OffsetOfExpr *E,
       break;
     }
     case OffsetOfNode::Array: {
-      // When generating bytecode, we put all the index expressions as Sint64 
on
-      // the stack.
+      // When generating bytecode, we put all the index expressions as Sint64
+      // on the stack.
       int64_t Index = ArrayIndices[ArrayIndex];
       const ArrayType *AT = S.getASTContext().getAsArrayType(CurrentType);
       if (!AT)
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index d10e2afeb2341..2eb5853036e02 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -36,6 +36,7 @@
 #include "ByteCode/Frame.h"
 #include "ByteCode/State.h"
 #include "ExprConstShared.h"
+#include "immintrin.h"
 #include "clang/AST/APValue.h"
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/ASTLambda.h"
@@ -11768,7 +11769,6 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr 
*E) {
       }
       return LHS.lshr(RHS.getZExtValue());
     });
-
   case clang::X86::BI__builtin_ia32_pmuldq128:
   case clang::X86::BI__builtin_ia32_pmuldq256:
   case clang::X86::BI__builtin_ia32_pmuldq512:
@@ -14760,6 +14760,148 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const 
CallExpr *E,
     return HandleMaskBinOp(
         [](const APSInt &LHS, const APSInt &RHS) { return LHS + RHS; });
   }
+  case X86::BI__builtin_ia32_vcomish: {
+    APSInt R, P;
+    if (!EvaluateInteger(E->getArg(3), R, Info))
+      return false;
+    if (!EvaluateInteger(E->getArg(2), P, Info))
+      return false;
+    APValue AV, BV;
+    if (!EvaluateVector(E->getArg(0), AV, Info) ||
+        !EvaluateVector(E->getArg(1), BV, Info))
+      return false;
+    if (!AV.isVector() || !BV.isVector() || AV.getVectorLength() == 0 ||
+        BV.getVectorLength() == 0)
+      return false;
+    const APValue &A0V = AV.getVectorElt(0);
+    const APValue &B0V = BV.getVectorElt(0);
+    if (!A0V.isFloat() || !B0V.isFloat())
+      return false;
+    const llvm::APFloat &A0 = A0V.getFloat();
+    const llvm::APFloat &B0 = B0V.getFloat();
+    auto Cmp = A0.compare(B0);
+
+    const bool IsEq = (Cmp == llvm::APFloatBase::cmpEqual);
+    const bool IsLt = (Cmp == llvm::APFloatBase::cmpLessThan);
+    const bool IsGt = (Cmp == llvm::APFloatBase::cmpGreaterThan);
+    bool Result = false;
+
+    switch (P.getExtValue()) {
+    case _CMP_EQ_OQ: /* _mm_ucomieq_sh */
+    case _CMP_EQ_OS: /* _mm_comieq_sh */
+      Result = IsEq && !A0.isNaN() && !B0.isNaN();
+      break;
+    case _CMP_NEQ_US: /* _mm_comineq_sh */
+    case _CMP_NEQ_UQ: /* _mm_ucomineq_sh */
+      Result = !IsEq || A0.isNaN() || B0.isNaN();
+      break;
+    case _CMP_GE_OS: /* _mm_comige_sh */
+    case _CMP_GE_OQ: /* _mm_ucomige_sh */
+      Result = !IsLt && !A0.isNaN() && !B0.isNaN();
+      break;
+    case _CMP_LT_OS: /* _mm_comilt_sh */
+    case _CMP_LT_OQ: /* _mm_ucomilt_sh */
+      Result = IsLt && !A0.isNaN() && !B0.isNaN();
+      break;
+    case _CMP_GT_OS: /* _mm_comigt_sh */
+    case _CMP_GT_OQ: /* _mm_ucomigt_sh */
+      Result = IsGt && !A0.isNaN() && !B0.isNaN();
+      break;
+    case _CMP_LE_OS: /* _mm_comile_sh */
+    case _CMP_LE_OQ: /*_mm_ucomile_sh */
+      Result = !IsGt && !A0.isNaN() && !B0.isNaN();
+      break;
+    default:
+      return false;
+    }
+    return Success(Result ? 1 : 0, E);
+  }
+  case X86::BI__builtin_ia32_comieq:
+  case X86::BI__builtin_ia32_ucomieq:
+  case X86::BI__builtin_ia32_comisdeq:
+  case X86::BI__builtin_ia32_ucomisdeq:
+  case X86::BI__builtin_ia32_comineq:
+  case X86::BI__builtin_ia32_ucomineq:
+  case X86::BI__builtin_ia32_comisdneq:
+  case X86::BI__builtin_ia32_ucomisdneq:
+  case X86::BI__builtin_ia32_comige:
+  case X86::BI__builtin_ia32_ucomige:
+  case X86::BI__builtin_ia32_comisdge:
+  case X86::BI__builtin_ia32_ucomisdge:
+  case X86::BI__builtin_ia32_comilt:
+  case X86::BI__builtin_ia32_ucomilt:
+  case X86::BI__builtin_ia32_comisdlt:
+  case X86::BI__builtin_ia32_ucomisdlt:
+  case X86::BI__builtin_ia32_comigt:
+  case X86::BI__builtin_ia32_ucomigt:
+  case X86::BI__builtin_ia32_comisdgt:
+  case X86::BI__builtin_ia32_ucomisdgt:
+  case X86::BI__builtin_ia32_comile:
+  case X86::BI__builtin_ia32_ucomile:
+  case X86::BI__builtin_ia32_comisdle:
+  case X86::BI__builtin_ia32_ucomisdle: {
+    APValue AV, BV;
+    if (!EvaluateVector(E->getArg(0), AV, Info) ||
+        !EvaluateVector(E->getArg(1), BV, Info))
+      return false;
+    if (!AV.isVector() || !BV.isVector() || AV.getVectorLength() == 0 ||
+        BV.getVectorLength() == 0)
+      return false;
+    const APValue &A0V = AV.getVectorElt(0);
+    const APValue &B0V = BV.getVectorElt(0);
+    if (!A0V.isFloat() || !B0V.isFloat())
+      return false;
+    const llvm::APFloat &A0 = A0V.getFloat();
+    const llvm::APFloat &B0 = B0V.getFloat();
+    auto Cmp = A0.compare(B0);
+
+    const bool IsEq = (Cmp == llvm::APFloatBase::cmpEqual);
+    const bool IsLt = (Cmp == llvm::APFloatBase::cmpLessThan);
+    const bool IsGt = (Cmp == llvm::APFloatBase::cmpGreaterThan);
+    bool Result = false;
+
+    switch (BuiltinOp) {
+    case X86::BI__builtin_ia32_comieq:
+    case X86::BI__builtin_ia32_ucomieq:
+    case X86::BI__builtin_ia32_comisdeq:
+    case X86::BI__builtin_ia32_ucomisdeq:
+      Result = IsEq && !A0.isNaN() && !B0.isNaN();
+      break;
+    case X86::BI__builtin_ia32_comineq:
+    case X86::BI__builtin_ia32_ucomineq:
+    case X86::BI__builtin_ia32_comisdneq:
+    case X86::BI__builtin_ia32_ucomisdneq:
+      Result = !IsEq || A0.isNaN() || B0.isNaN();
+      break;
+    case X86::BI__builtin_ia32_comige:
+    case X86::BI__builtin_ia32_ucomige:
+    case X86::BI__builtin_ia32_comisdge:
+    case X86::BI__builtin_ia32_ucomisdge:
+      Result = !IsLt && !A0.isNaN() && !B0.isNaN();
+      break;
+    case X86::BI__builtin_ia32_comilt:
+    case X86::BI__builtin_ia32_ucomilt:
+    case X86::BI__builtin_ia32_comisdlt:
+    case X86::BI__builtin_ia32_ucomisdlt:
+      Result = IsLt && !A0.isNaN() && !B0.isNaN();
+      break;
+    case X86::BI__builtin_ia32_comigt:
+    case X86::BI__builtin_ia32_ucomigt:
+    case X86::BI__builtin_ia32_comisdgt:
+    case X86::BI__builtin_ia32_ucomisdgt:
+      Result = IsGt && !A0.isNaN() && !B0.isNaN();
+      break;
+    case X86::BI__builtin_ia32_comile:
+    case X86::BI__builtin_ia32_ucomile:
+    case X86::BI__builtin_ia32_comisdle:
+    case X86::BI__builtin_ia32_ucomisdle:
+      Result = !IsGt && !A0.isNaN() && !B0.isNaN();
+      break;
+    default:
+      return false;
+    }
+    return Success(Result ? 1 : 0, E);
+  }
   }
 }
 
diff --git a/clang/lib/Headers/avx512fp16intrin.h 
b/clang/lib/Headers/avx512fp16intrin.h
index 4bd798129a25d..f09338533e9dd 100644
--- a/clang/lib/Headers/avx512fp16intrin.h
+++ b/clang/lib/Headers/avx512fp16intrin.h
@@ -298,74 +298,74 @@ _mm512_zextph256_ph512(__m256h __a) {
 #define _mm_comi_sh(A, B, pred)                                                
\
   _mm_comi_round_sh((A), (B), (pred), _MM_FROUND_CUR_DIRECTION)
 
-static __inline__ int __DEFAULT_FN_ATTRS128 _mm_comieq_sh(__m128h __A,
-                                                          __m128h __B) {
+static __inline__ int __DEFAULT_FN_ATTRS128_CONSTEXPR
+_mm_comieq_sh(__m128h __A, __m128h __B) {
   return __builtin_ia32_vcomish((__v8hf)__A, (__v8hf)__B, _CMP_EQ_OS,
                                 _MM_FROUND_CUR_DIRECTION);
 }
 
-static __inline__ int __DEFAULT_FN_ATTRS128 _mm_comilt_sh(__m128h __A,
-                                                          __m128h __B) {
+static __inline__ int __DEFAULT_FN_ATTRS128_CONSTEXPR
+_mm_comilt_sh(__m128h __A, __m128h __B) {
   return __builtin_ia32_vcomish((__v8hf)__A, (__v8hf)__B, _CMP_LT_OS,
                                 _MM_FROUND_CUR_DIRECTION);
 }
 
-static __inline__ int __DEFAULT_FN_ATTRS128 _mm_comile_sh(__m128h __A,
-                                                          __m128h __B) {
+static __inline__ int __DEFAULT_FN_ATTRS128_CONSTEXPR
+_mm_comile_sh(__m128h __A, __m128h __B) {
   return __builtin_ia32_vcomish((__v8hf)__A, (__v8hf)__B, _CMP_LE_OS,
                                 _MM_FROUND_CUR_DIRECTION);
 }
 
-static __inline__ int __DEFAULT_FN_ATTRS128 _mm_comigt_sh(__m128h __A,
-                                                          __m128h __B) {
+static __inline__ int __DEFAULT_FN_ATTRS128_CONSTEXPR
+_mm_comigt_sh(__m128h __A, __m128h __B) {
   return __builtin_ia32_vcomish((__v8hf)__A, (__v8hf)__B, _CMP_GT_OS,
                                 _MM_FROUND_CUR_DIRECTION);
 }
 
-static __inline__ int __DEFAULT_FN_ATTRS128 _mm_comige_sh(__m128h __A,
-                                                          __m128h __B) {
+static __inline__ int __DEFAULT_FN_ATTRS128_CONSTEXPR
+_mm_comige_sh(__m128h __A, __m128h __B) {
   return __builtin_ia32_vcomish((__v8hf)__A, (__v8hf)__B, _CMP_GE_OS,
                                 _MM_FROUND_CUR_DIRECTION);
 }
 
-static __inline__ int __DEFAULT_FN_ATTRS128 _mm_comineq_sh(__m128h __A,
-                                                           __m128h __B) {
+static __inline__ int __DEFAULT_FN_ATTRS128_CONSTEXPR
+_mm_comineq_sh(__m128h __A, __m128h __B) {
   return __builtin_ia32_vcomish((__v8hf)__A, (__v8hf)__B, _CMP_NEQ_US,
                                 _MM_FROUND_CUR_DIRECTION);
 }
 
-static __inline__ int __DEFAULT_FN_ATTRS128 _mm_ucomieq_sh(__m128h __A,
-                                                           __m128h __B) {
+static __inline__ int __DEFAULT_FN_ATTRS128_CONSTEXPR
+_mm_ucomieq_sh(__m128h __A, __m128h __B) {
   return __builtin_ia32_vcomish((__v8hf)__A, (__v8hf)__B, _CMP_EQ_OQ,
                                 _MM_FROUND_CUR_DIRECTION);
 }
 
-static __inline__ int __DEFAULT_FN_ATTRS128 _mm_ucomilt_sh(__m128h __A,
-                                                           __m128h __B) {
+static __inline__ int __DEFAULT_FN_ATTRS128_CONSTEXPR
+_mm_ucomilt_sh(__m128h __A, __m128h __B) {
   return __builtin_ia32_vcomish((__v8hf)__A, (__v8hf)__B, _CMP_LT_OQ,
                                 _MM_FROUND_CUR_DIRECTION);
 }
 
-static __inline__ int __DEFAULT_FN_ATTRS128 _mm_ucomile_sh(__m128h __A,
-                                                           __m128h __B) {
+static __inline__ int __DEFAULT_FN_ATTRS128_CONSTEXPR
+_mm_ucomile_sh(__m128h __A, __m128h __B) {
   return __builtin_ia32_vcomish((__v8hf)__A, (__v8hf)__B, _CMP_LE_OQ,
                                 _MM_FROUND_CUR_DIRECTION);
 }
 
-static __inline__ int __DEFAULT_FN_ATTRS128 _mm_ucomigt_sh(__m128h __A,
-                                                           __m128h __B) {
+static __inline__ int __DEFAULT_FN_ATTRS128_CONSTEXPR
+_mm_ucomigt_sh(__m128h __A, __m128h __B) {
   return __builtin_ia32_vcomish((__v8hf)__A, (__v8hf)__B, _CMP_GT_OQ,
                                 _MM_FROUND_CUR_DIRECTION);
 }
 
-static __inline__ int __DEFAULT_FN_ATTRS128 _mm_ucomige_sh(__m128h __A,
-                                                           __m128h __B) {
+static __inline__ int __DEFAULT_FN_ATTRS128_CONSTEXPR
+_mm_ucomige_sh(__m128h __A, __m128h __B) {
   return __builtin_ia32_vcomish((__v8hf)__A, (__v8hf)__B, _CMP_GE_OQ,
                                 _MM_FROUND_CUR_DIRECTION);
 }
 
-static __inline__ int __DEFAULT_FN_ATTRS128 _mm_ucomineq_sh(__m128h __A,
-                                                            __m128h __B) {
+static __inline__ int __DEFAULT_FN_ATTRS128_CONSTEXPR
+_mm_ucomineq_sh(__m128h __A, __m128h __B) {
   return __builtin_ia32_vcomish((__v8hf)__A, (__v8hf)__B, _CMP_NEQ_UQ,
                                 _MM_FROUND_CUR_DIRECTION);
 }
diff --git a/clang/lib/Headers/emmintrin.h b/clang/lib/Headers/emmintrin.h
index fca6229a065be..bfcec3c2ce905 100644
--- a/clang/lib/Headers/emmintrin.h
+++ b/clang/lib/Headers/emmintrin.h
@@ -999,8 +999,8 @@ static __inline__ __m128d __DEFAULT_FN_ATTRS 
_mm_cmpnge_sd(__m128d __a,
 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
 ///    compared to the lower double-precision value of \a __a.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS _mm_comieq_sd(__m128d __a,
-                                                       __m128d __b) {
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_comieq_sd(__m128d __a,
+                                                                 __m128d __b) {
   return __builtin_ia32_comisdeq((__v2df)__a, (__v2df)__b);
 }
 
@@ -1023,8 +1023,8 @@ static __inline__ int __DEFAULT_FN_ATTRS 
_mm_comieq_sd(__m128d __a,
 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
 ///    compared to the lower double-precision value of \a __a.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS _mm_comilt_sd(__m128d __a,
-                                                       __m128d __b) {
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_comilt_sd(__m128d __a,
+                                                                 __m128d __b) {
   return __builtin_ia32_comisdlt((__v2df)__a, (__v2df)__b);
 }
 
@@ -1047,8 +1047,8 @@ static __inline__ int __DEFAULT_FN_ATTRS 
_mm_comilt_sd(__m128d __a,
 ///     A 128-bit vector of [2 x double]. The lower double-precision value is
 ///     compared to the lower double-precision value of \a __a.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS _mm_comile_sd(__m128d __a,
-                                                       __m128d __b) {
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_comile_sd(__m128d __a,
+                                                                 __m128d __b) {
   return __builtin_ia32_comisdle((__v2df)__a, (__v2df)__b);
 }
 
@@ -1071,8 +1071,8 @@ static __inline__ int __DEFAULT_FN_ATTRS 
_mm_comile_sd(__m128d __a,
 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
 ///    compared to the lower double-precision value of \a __a.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS _mm_comigt_sd(__m128d __a,
-                                                       __m128d __b) {
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_comigt_sd(__m128d __a,
+                                                                 __m128d __b) {
   return __builtin_ia32_comisdgt((__v2df)__a, (__v2df)__b);
 }
 
@@ -1095,8 +1095,8 @@ static __inline__ int __DEFAULT_FN_ATTRS 
_mm_comigt_sd(__m128d __a,
 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
 ///    compared to the lower double-precision value of \a __a.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS _mm_comige_sd(__m128d __a,
-                                                       __m128d __b) {
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_comige_sd(__m128d __a,
+                                                                 __m128d __b) {
   return __builtin_ia32_comisdge((__v2df)__a, (__v2df)__b);
 }
 
@@ -1119,8 +1119,8 @@ static __inline__ int __DEFAULT_FN_ATTRS 
_mm_comige_sd(__m128d __a,
 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
 ///    compared to the lower double-precision value of \a __a.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS _mm_comineq_sd(__m128d __a,
-                                                        __m128d __b) {
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_comineq_sd(__m128d __a,
+                                                                  __m128d __b) 
{
   return __builtin_ia32_comisdneq((__v2df)__a, (__v2df)__b);
 }
 
@@ -1141,8 +1141,8 @@ static __inline__ int __DEFAULT_FN_ATTRS 
_mm_comineq_sd(__m128d __a,
 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
 ///    compared to the lower double-precision value of \a __a.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS _mm_ucomieq_sd(__m128d __a,
-                                                        __m128d __b) {
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_ucomieq_sd(__m128d __a,
+                                                                  __m128d __b) 
{
   return __builtin_ia32_ucomisdeq((__v2df)__a, (__v2df)__b);
 }
 
@@ -1165,8 +1165,8 @@ static __inline__ int __DEFAULT_FN_ATTRS 
_mm_ucomieq_sd(__m128d __a,
 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
 ///    compared to the lower double-precision value of \a __a.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS _mm_ucomilt_sd(__m128d __a,
-                                                        __m128d __b) {
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_ucomilt_sd(__m128d __a,
+                                                                  __m128d __b) 
{
   return __builtin_ia32_ucomisdlt((__v2df)__a, (__v2df)__b);
 }
 
@@ -1189,8 +1189,8 @@ static __inline__ int __DEFAULT_FN_ATTRS 
_mm_ucomilt_sd(__m128d __a,
 ///     A 128-bit vector of [2 x double]. The lower double-precision value is
 ///     compared to the lower double-precision value of \a __a.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS _mm_ucomile_sd(__m128d __a,
-                                                        __m128d __b) {
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_ucomile_sd(__m128d __a,
+                                                                  __m128d __b) 
{
   return __builtin_ia32_ucomisdle((__v2df)__a, (__v2df)__b);
 }
 
@@ -1213,8 +1213,8 @@ static __inline__ int __DEFAULT_FN_ATTRS 
_mm_ucomile_sd(__m128d __a,
 ///     A 128-bit vector of [2 x double]. The lower double-precision value is
 ///     compared to the lower double-precision value of \a __a.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS _mm_ucomigt_sd(__m128d __a,
-                                                        __m128d __b) {
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_ucomigt_sd(__m128d __a,
+                                                                  __m128d __b) 
{
   return __builtin_ia32_ucomisdgt((__v2df)__a, (__v2df)__b);
 }
 
@@ -1237,8 +1237,8 @@ static __inline__ int __DEFAULT_FN_ATTRS 
_mm_ucomigt_sd(__m128d __a,
 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
 ///    compared to the lower double-precision value of \a __a.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS _mm_ucomige_sd(__m128d __a,
-                                                        __m128d __b) {
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_ucomige_sd(__m128d __a,
+                                                                  __m128d __b) 
{
   return __builtin_ia32_ucomisdge((__v2df)__a, (__v2df)__b);
 }
 
@@ -1261,8 +1261,8 @@ static __inline__ int __DEFAULT_FN_ATTRS 
_mm_ucomige_sd(__m128d __a,
 ///    A 128-bit vector of [2 x double]. The lower double-precision value is
 ///    compared to the lower double-precision value of \a __a.
 /// \returns An integer containing the comparison result.
-static __inline__ int __DEFAULT_FN_ATTRS _mm_ucomineq_sd(__m128d __a,
-                                                         __m128d __b) {
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR
+_mm_ucomineq_sd(__m128d __a, __m128d __b) {
   return __builtin_ia32_ucomisdneq((__v2df)__a, (__v2df)__b);
 }
 
diff --git a/clang/lib/Headers/xmmintrin.h b/clang/lib/Headers/xmmintrin.h
index 4891e3ce077b5..777567adad2cd 100644
--- a/clang/lib/Headers/xmmintrin.h
+++ b/clang/lib/Headers/xmmintrin.h
@@ -1104,9 +1104,8 @@ _mm_cmpunord_ps(__m128 __a, __m128 __b)
 ///    A 128-bit vector of [4 x float]. The lower 32 bits of this operand are
 ///    used in the comparison.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS
-_mm_comieq_ss(__m128 __a, __m128 __b)
-{
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_comieq_ss(__m128 __a,
+                                                                 __m128 __b) {
   return __builtin_ia32_comieq((__v4sf)__a, (__v4sf)__b);
 }
 
@@ -1129,9 +1128,8 @@ _mm_comieq_ss(__m128 __a, __m128 __b)
 ///    A 128-bit vector of [4 x float]. The lower 32 bits of this operand are
 ///    used in the comparison.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS
-_mm_comilt_ss(__m128 __a, __m128 __b)
-{
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_comilt_ss(__m128 __a,
+                                                                 __m128 __b) {
   return __builtin_ia32_comilt((__v4sf)__a, (__v4sf)__b);
 }
 
@@ -1153,9 +1151,8 @@ _mm_comilt_ss(__m128 __a, __m128 __b)
 ///    A 128-bit vector of [4 x float]. The lower 32 bits of this operand are
 ///    used in the comparison.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS
-_mm_comile_ss(__m128 __a, __m128 __b)
-{
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_comile_ss(__m128 __a,
+                                                                 __m128 __b) {
   return __builtin_ia32_comile((__v4sf)__a, (__v4sf)__b);
 }
 
@@ -1177,9 +1174,8 @@ _mm_comile_ss(__m128 __a, __m128 __b)
 ///    A 128-bit vector of [4 x float]. The lower 32 bits of this operand are
 ///    used in the comparison.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS
-_mm_comigt_ss(__m128 __a, __m128 __b)
-{
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_comigt_ss(__m128 __a,
+                                                                 __m128 __b) {
   return __builtin_ia32_comigt((__v4sf)__a, (__v4sf)__b);
 }
 
@@ -1201,9 +1197,8 @@ _mm_comigt_ss(__m128 __a, __m128 __b)
 ///    A 128-bit vector of [4 x float]. The lower 32 bits of this operand are
 ///    used in the comparison.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS
-_mm_comige_ss(__m128 __a, __m128 __b)
-{
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_comige_ss(__m128 __a,
+                                                                 __m128 __b) {
   return __builtin_ia32_comige((__v4sf)__a, (__v4sf)__b);
 }
 
@@ -1225,9 +1220,8 @@ _mm_comige_ss(__m128 __a, __m128 __b)
 ///    A 128-bit vector of [4 x float]. The lower 32 bits of this operand are
 ///    used in the comparison.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS
-_mm_comineq_ss(__m128 __a, __m128 __b)
-{
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_comineq_ss(__m128 __a,
+                                                                  __m128 __b) {
   return __builtin_ia32_comineq((__v4sf)__a, (__v4sf)__b);
 }
 
@@ -1248,9 +1242,8 @@ _mm_comineq_ss(__m128 __a, __m128 __b)
 ///    A 128-bit vector of [4 x float]. The lower 32 bits of this operand are
 ///    used in the comparison.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS
-_mm_ucomieq_ss(__m128 __a, __m128 __b)
-{
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_ucomieq_ss(__m128 __a,
+                                                                  __m128 __b) {
   return __builtin_ia32_ucomieq((__v4sf)__a, (__v4sf)__b);
 }
 
@@ -1272,9 +1265,8 @@ _mm_ucomieq_ss(__m128 __a, __m128 __b)
 ///    A 128-bit vector of [4 x float]. The lower 32 bits of this operand are
 ///    used in the comparison.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS
-_mm_ucomilt_ss(__m128 __a, __m128 __b)
-{
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_ucomilt_ss(__m128 __a,
+                                                                  __m128 __b) {
   return __builtin_ia32_ucomilt((__v4sf)__a, (__v4sf)__b);
 }
 
@@ -1296,9 +1288,8 @@ _mm_ucomilt_ss(__m128 __a, __m128 __b)
 ///    A 128-bit vector of [4 x float]. The lower 32 bits of this operand are
 ///    used in the comparison.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS
-_mm_ucomile_ss(__m128 __a, __m128 __b)
-{
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_ucomile_ss(__m128 __a,
+                                                                  __m128 __b) {
   return __builtin_ia32_ucomile((__v4sf)__a, (__v4sf)__b);
 }
 
@@ -1320,9 +1311,8 @@ _mm_ucomile_ss(__m128 __a, __m128 __b)
 ///    A 128-bit vector of [4 x float]. The lower 32 bits of this operand are
 ///    used in the comparison.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS
-_mm_ucomigt_ss(__m128 __a, __m128 __b)
-{
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_ucomigt_ss(__m128 __a,
+                                                                  __m128 __b) {
   return __builtin_ia32_ucomigt((__v4sf)__a, (__v4sf)__b);
 }
 
@@ -1344,9 +1334,8 @@ _mm_ucomigt_ss(__m128 __a, __m128 __b)
 ///    A 128-bit vector of [4 x float]. The lower 32 bits of this operand are
 ///    used in the comparison.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS
-_mm_ucomige_ss(__m128 __a, __m128 __b)
-{
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_ucomige_ss(__m128 __a,
+                                                                  __m128 __b) {
   return __builtin_ia32_ucomige((__v4sf)__a, (__v4sf)__b);
 }
 
@@ -1367,9 +1356,8 @@ _mm_ucomige_ss(__m128 __a, __m128 __b)
 ///    A 128-bit vector of [4 x float]. The lower 32 bits of this operand are
 ///    used in the comparison.
 /// \returns An integer containing the comparison results.
-static __inline__ int __DEFAULT_FN_ATTRS
-_mm_ucomineq_ss(__m128 __a, __m128 __b)
-{
+static __inline__ int __DEFAULT_FN_ATTRS_CONSTEXPR _mm_ucomineq_ss(__m128 __a,
+                                                                   __m128 __b) 
{
   return __builtin_ia32_ucomineq((__v4sf)__a, (__v4sf)__b);
 }
 
diff --git a/clang/test/CodeGen/X86/avx512fp16-builtins.c 
b/clang/test/CodeGen/X86/avx512fp16-builtins.c
index 37443d584614d..58117dea34f61 100644
--- a/clang/test/CodeGen/X86/avx512fp16-builtins.c
+++ b/clang/test/CodeGen/X86/avx512fp16-builtins.c
@@ -354,7 +354,7 @@ __m256h test_mm512_castph512_ph256(__m512h __a) {
 
 __m256h test_mm256_castph128_ph256(__m128h __a) {
   // CHECK-LABEL: test_mm256_castph128_ph256
-  // CHECK: [[A:%.*]] = freeze <8 x half> poison 
+  // CHECK: [[A:%.*]] = freeze <8 x half> poison
   // CHECK: shufflevector <8 x half> %{{.*}}, <8 x half> [[A]], <16 x i32> 
<i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, 
i32 11, i32 12, i32 13, i32 14, i32 15>
   return _mm256_castph128_ph256(__a);
 }
@@ -372,7 +372,7 @@ __m512h test_mm512_castph128_ph512(__m128h __a) {
 
 __m512h test_mm512_castph256_ph512(__m256h __a) {
   // CHECK-LABEL: test_mm512_castph256_ph512
-  // CHECK: [[A:%.*]] = freeze <16 x half> poison 
+  // CHECK: [[A:%.*]] = freeze <16 x half> poison
   // CHECK: shufflevector <16 x half> %{{.*}}, <16 x half> [[A]], <32 x i32> 
<i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, 
i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, 
i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, 
i32 31>
   return _mm512_castph256_ph512(__a);
 }
@@ -415,72 +415,114 @@ int test_mm_comieq_sh(__m128h __A, __m128h __B) {
   // CHECK: @llvm.x86.avx512fp16.vcomi.sh(<8 x half> %{{.}}, <8 x half> 
%{{.}}, i32 16, i32 4)
   return _mm_comieq_sh(__A, __B);
 }
+TEST_CONSTEXPR(_mm_comieq_sh(_mm_set1_ph(1.0f16), _mm_set1_ph(1.0f16)) == 1);
+TEST_CONSTEXPR(_mm_comieq_sh(_mm_set1_ph(__builtin_nanf("")),
+                             _mm_set1_ph(1.0f16)) == 0);
 
 int test_mm_comilt_sh(__m128h __A, __m128h __B) {
   // CHECK-LABEL: test_mm_comilt_sh
   // CHECK: @llvm.x86.avx512fp16.vcomi.sh(<8 x half> %{{.}}, <8 x half> 
%{{.}}, i32 1, i32 4)
   return _mm_comilt_sh(__A, __B);
 }
+TEST_CONSTEXPR(_mm_comilt_sh(_mm_set1_ph(1.0f16), _mm_set1_ph(2.0f16)) == 1);
+TEST_CONSTEXPR(_mm_comilt_sh(_mm_set1_ph(2.0f16), _mm_set1_ph(1.0f16)) == 0);
+TEST_CONSTEXPR(_mm_comilt_sh(_mm_set1_ph(1.0f16), _mm_set1_ph(1.0f16)) == 0);
+TEST_CONSTEXPR(_mm_comilt_sh(_mm_set1_ph(__builtin_nanf("")), 
_mm_set1_ph(2.0f16)) == 0);
 
 int test_mm_comile_sh(__m128h __A, __m128h __B) {
   // CHECK-LABEL: test_mm_comile_sh
   // CHECK: @llvm.x86.avx512fp16.vcomi.sh(<8 x half> %{{.}}, <8 x half> 
%{{.}}, i32 2, i32 4)
   return _mm_comile_sh(__A, __B);
 }
+TEST_CONSTEXPR(_mm_comile_sh(_mm_set1_ph(1.0f16), _mm_set1_ph(1.0f16)) == 1);
+TEST_CONSTEXPR(_mm_comile_sh(_mm_set1_ph(1.0f16), _mm_set1_ph(2.0f16)) == 1);
+TEST_CONSTEXPR(_mm_comile_sh(_mm_set1_ph(2.0f16), _mm_set1_ph(1.0f16)) == 0);
+TEST_CONSTEXPR(_mm_comile_sh(_mm_set1_ph(__builtin_nanf("")), 
_mm_set1_ph(2.0f16)) == 0);
 
 int test_mm_comigt_sh(__m128h __A, __m128h __B) {
   // CHECK-LABEL: test_mm_comigt_sh
   // CHECK: @llvm.x86.avx512fp16.vcomi.sh(<8 x half> %{{.}}, <8 x half> 
%{{.}}, i32 14, i32 4)
   return _mm_comigt_sh(__A, __B);
 }
+TEST_CONSTEXPR(_mm_comigt_sh(_mm_set1_ph(3.0f16), _mm_set1_ph(2.0f16)) == 1);
+TEST_CONSTEXPR(_mm_comigt_sh(_mm_set1_ph(2.0f16), _mm_set1_ph(3.0f16)) == 0);
+TEST_CONSTEXPR(_mm_comigt_sh(_mm_set1_ph(2.0f16), _mm_set1_ph(2.0f16)) == 0);
+TEST_CONSTEXPR(_mm_comigt_sh(_mm_set1_ph(__builtin_nanf("")), 
_mm_set1_ph(2.0f16)) == 0);
 
 int test_mm_comige_sh(__m128h __A, __m128h __B) {
   // CHECK-LABEL: test_mm_comige_sh
   // CHECK: @llvm.x86.avx512fp16.vcomi.sh(<8 x half> %{{.}}, <8 x half> 
%{{.}}, i32 13, i32 4)
   return _mm_comige_sh(__A, __B);
 }
+TEST_CONSTEXPR(_mm_comige_sh(_mm_set1_ph(2.0f16), _mm_set1_ph(2.0f16)) == 1);
+TEST_CONSTEXPR(_mm_comige_sh(_mm_set1_ph(3.0f16), _mm_set1_ph(2.0f16)) == 1);
+TEST_CONSTEXPR(_mm_comige_sh(_mm_set1_ph(1.0f16), _mm_set1_ph(2.0f16)) == 0);
+TEST_CONSTEXPR(_mm_comige_sh(_mm_set1_ph(__builtin_nanf("")), 
_mm_set1_ph(2.0f16)) == 0);
 
 int test_mm_comineq_sh(__m128h __A, __m128h __B) {
   // CHECK-LABEL: test_mm_comineq_sh
   // CHECK: @llvm.x86.avx512fp16.vcomi.sh(<8 x half> %{{.}}, <8 x half> 
%{{.}}, i32 20, i32 4)
   return _mm_comineq_sh(__A, __B);
 }
+TEST_CONSTEXPR(_mm_comineq_sh(_mm_set1_ph(2.0f16), _mm_set1_ph(3.0f16)) == 1);
+TEST_CONSTEXPR(_mm_comineq_sh(_mm_set1_ph(__builtin_nanf("")), 
_mm_set1_ph(3.0f16)) == 1);
 
 int test_mm_ucomieq_sh(__m128h __A, __m128h __B) {
   // CHECK-LABEL: test_mm_ucomieq_sh
   // CHECK: @llvm.x86.avx512fp16.vcomi.sh(<8 x half> %{{.}}, <8 x half> 
%{{.}}, i32 0, i32 4)
   return _mm_ucomieq_sh(__A, __B);
 }
+TEST_CONSTEXPR(_mm_ucomieq_sh(_mm_set1_ph(4.0f16), _mm_set1_ph(4.0f16)) == 1);
+TEST_CONSTEXPR(_mm_ucomieq_sh(_mm_set1_ph(__builtin_nanf("")), 
_mm_set1_ph(4.0f16)) == 0);
 
 int test_mm_ucomilt_sh(__m128h __A, __m128h __B) {
   // CHECK-LABEL: test_mm_ucomilt_sh
   // CHECK: @llvm.x86.avx512fp16.vcomi.sh(<8 x half> %{{.}}, <8 x half> 
%{{.}}, i32 17, i32 4)
   return _mm_ucomilt_sh(__A, __B);
 }
+TEST_CONSTEXPR(_mm_ucomilt_sh(_mm_set1_ph(1.0f16), _mm_set1_ph(2.0f16)) == 1);
+TEST_CONSTEXPR(_mm_ucomilt_sh(_mm_set1_ph(2.0f16), _mm_set1_ph(1.0f16)) == 0);
+TEST_CONSTEXPR(_mm_ucomilt_sh(_mm_set1_ph(1.0f16), _mm_set1_ph(1.0f16)) == 0);
+TEST_CONSTEXPR(_mm_ucomilt_sh(_mm_set1_ph(__builtin_nanf("")), 
_mm_set1_ph(2.0f16)) == 0);
+TEST_CONSTEXPR(_mm_ucomilt_sh(_mm_set1_ph(2.0f16), 
_mm_set1_ph(__builtin_nanf(""))) == 0);
 
 int test_mm_ucomile_sh(__m128h __A, __m128h __B) {
   // CHECK-LABEL: test_mm_ucomile_sh
   // CHECK: @llvm.x86.avx512fp16.vcomi.sh(<8 x half> %{{.}}, <8 x half> 
%{{.}}, i32 18, i32 4)
   return _mm_ucomile_sh(__A, __B);
 }
+TEST_CONSTEXPR(_mm_ucomile_sh(_mm_set1_ph(1.0f16), _mm_set1_ph(1.0f16)) == 1);
+TEST_CONSTEXPR(_mm_ucomile_sh(_mm_set1_ph(1.0f16), _mm_set1_ph(2.0f16)) == 1);
+TEST_CONSTEXPR(_mm_ucomile_sh(_mm_set1_ph(2.0f16), _mm_set1_ph(1.0f16)) == 0);
+TEST_CONSTEXPR(_mm_ucomile_sh(_mm_set1_ph(__builtin_nanf("")), 
_mm_set1_ph(2.0f16)) == 0);
 
 int test_mm_ucomigt_sh(__m128h __A, __m128h __B) {
   // CHECK-LABEL: test_mm_ucomigt_sh
   // CHECK: @llvm.x86.avx512fp16.vcomi.sh(<8 x half> %{{.}}, <8 x half> 
%{{.}}, i32 30, i32 4)
   return _mm_ucomigt_sh(__A, __B);
 }
+TEST_CONSTEXPR(_mm_ucomigt_sh(_mm_set1_ph(2.0f16), _mm_set1_ph(1.0f16)) == 1);
+TEST_CONSTEXPR(_mm_ucomigt_sh(_mm_set1_ph(1.0f16), _mm_set1_ph(2.0f16)) == 0);
+TEST_CONSTEXPR(_mm_ucomigt_sh(_mm_set1_ph(1.0f16), _mm_set1_ph(1.0f16)) == 0);
+TEST_CONSTEXPR(_mm_ucomigt_sh(_mm_set1_ph(__builtin_nanf("")), 
_mm_set1_ph(1.0f16)) == 0);
 
 int test_mm_ucomige_sh(__m128h __A, __m128h __B) {
   // CHECK-LABEL: test_mm_ucomige_sh
   // CHECK: @llvm.x86.avx512fp16.vcomi.sh(<8 x half> %{{.}}, <8 x half> 
%{{.}}, i32 29, i32 4)
   return _mm_ucomige_sh(__A, __B);
 }
+TEST_CONSTEXPR(_mm_ucomige_sh(_mm_set1_ph(1.0f16), _mm_set1_ph(1.0f16)) == 1);
+TEST_CONSTEXPR(_mm_ucomige_sh(_mm_set1_ph(2.0f16), _mm_set1_ph(1.0f16)) == 1);
+TEST_CONSTEXPR(_mm_ucomige_sh(_mm_set1_ph(1.0f16), _mm_set1_ph(2.0f16)) == 0);
+TEST_CONSTEXPR(_mm_ucomige_sh(_mm_set1_ph(__builtin_nanf("")), 
_mm_set1_ph(1.0f16)) == 0);
 
 int test_mm_ucomineq_sh(__m128h __A, __m128h __B) {
   // CHECK-LABEL: test_mm_ucomineq_sh
   // CHECK: @llvm.x86.avx512fp16.vcomi.sh(<8 x half> %{{.}}, <8 x half> 
%{{.}}, i32 4, i32 4)
   return _mm_ucomineq_sh(__A, __B);
 }
+TEST_CONSTEXPR(_mm_ucomineq_sh(_mm_set1_ph(5.0f16), _mm_set1_ph(5.0f16)) == 0);
+TEST_CONSTEXPR(_mm_ucomineq_sh(_mm_set1_ph(__builtin_nanf("")), 
_mm_set1_ph(5.0f16)) == 1);
 
 __m512h test_mm512_add_ph(__m512h __A, __m512h __B) {
   // CHECK-LABEL: test_mm512_add_ph

>From 7500ccfbe45240db68b320ea11797df9ef0106dc Mon Sep 17 00:00:00 2001
From: mtx <[email protected]>
Date: Sat, 27 Sep 2025 12:11:21 +0800
Subject: [PATCH 2/2] Fix header file related issues

---
 clang/lib/AST/ByteCode/InterpBuiltin.cpp | 25 ++++++++++++------------
 clang/lib/AST/ExprConstant.cpp           | 25 ++++++++++++------------
 2 files changed, 24 insertions(+), 26 deletions(-)

diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp 
b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index 99d8e036d9f2a..29fbbe96790b2 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -11,7 +11,6 @@
 #include "Interp.h"
 #include "InterpBuiltinBitCast.h"
 #include "PrimType.h"
-#include "immintrin.h"
 #include "clang/AST/OSLog.h"
 #include "clang/AST/RecordLayout.h"
 #include "clang/Basic/Builtins.h"
@@ -2971,28 +2970,28 @@ static bool interp__builtin_x86_vcomish(InterpState &S, 
CodePtr OpPC,
   bool result = false;
 
   switch (P.getZExtValue()) {
-  case _CMP_EQ_OQ: /* _mm_ucomieq_sh */
-  case _CMP_EQ_OS: /* _mm_comieq_sh */
+  case 0x00: /* _CMP_EQ_OQ */
+  case 0x10: /* _CMP_EQ_OS */
     result = isEq && !A0.isNaN() && !B0.isNaN();
     break;
-  case _CMP_NEQ_US: /* _mm_comineq_sh */
-  case _CMP_NEQ_UQ: /* _mm_ucomineq_sh */
+  case 0x14: /* _CMP_NEQ_US */
+  case 0x04: /* _CMP_NEQ_UQ */
     result = !isEq || A0.isNaN() || B0.isNaN();
     break;
-  case _CMP_GE_OS: /* _mm_comige_sh */
-  case _CMP_GE_OQ: /* _mm_ucomige_sh */
+  case 0x0d: /* _CMP_GE_OS */
+  case 0x1d: /* _CMP_GE_OQ */
     result = !isLt && !A0.isNaN() && !B0.isNaN();
     break;
-  case _CMP_LT_OS: /* _mm_comilt_sh */
-  case _CMP_LT_OQ: /* _mm_ucomilt_sh */
+  case 0x01: /* _CMP_LT_OS */
+  case 0x11: /* _CMP_LT_OQ */
     result = isLt && !A0.isNaN() && !B0.isNaN();
     break;
-  case _CMP_GT_OS: /* _mm_comigt_sh */
-  case _CMP_GT_OQ: /* _mm_ucomigt_sh */
+  case 0x0e: /* _CMP_GT_OS */
+  case 0x1e: /* _CMP_GT_OQ */
     result = isGt && !A0.isNaN() && !B0.isNaN();
     break;
-  case _CMP_LE_OS: /* _mm_comile_sh */
-  case _CMP_LE_OQ: /*_mm_ucomile_sh */
+  case 0x02: /* _CMP_LE_OS */
+  case 0x12: /* _CMP_LE_OQ */
     result = !isGt && !A0.isNaN() && !B0.isNaN();
     break;
   default:
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 2eb5853036e02..365804ccaf622 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -36,7 +36,6 @@
 #include "ByteCode/Frame.h"
 #include "ByteCode/State.h"
 #include "ExprConstShared.h"
-#include "immintrin.h"
 #include "clang/AST/APValue.h"
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/ASTLambda.h"
@@ -14787,28 +14786,28 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const 
CallExpr *E,
     bool Result = false;
 
     switch (P.getExtValue()) {
-    case _CMP_EQ_OQ: /* _mm_ucomieq_sh */
-    case _CMP_EQ_OS: /* _mm_comieq_sh */
+    case 0x00: /* _CMP_EQ_OQ */
+    case 0x10: /* _CMP_EQ_OS */
       Result = IsEq && !A0.isNaN() && !B0.isNaN();
       break;
-    case _CMP_NEQ_US: /* _mm_comineq_sh */
-    case _CMP_NEQ_UQ: /* _mm_ucomineq_sh */
+    case 0x14: /* _CMP_NEQ_US */
+    case 0x04: /* _CMP_NEQ_UQ */
       Result = !IsEq || A0.isNaN() || B0.isNaN();
       break;
-    case _CMP_GE_OS: /* _mm_comige_sh */
-    case _CMP_GE_OQ: /* _mm_ucomige_sh */
+    case 0x0d: /* _CMP_GE_OS */
+    case 0x1d: /* _CMP_GE_OQ */
       Result = !IsLt && !A0.isNaN() && !B0.isNaN();
       break;
-    case _CMP_LT_OS: /* _mm_comilt_sh */
-    case _CMP_LT_OQ: /* _mm_ucomilt_sh */
+    case 0x01: /* _CMP_LT_OS */
+    case 0x11: /* _CMP_LT_OQ */
       Result = IsLt && !A0.isNaN() && !B0.isNaN();
       break;
-    case _CMP_GT_OS: /* _mm_comigt_sh */
-    case _CMP_GT_OQ: /* _mm_ucomigt_sh */
+    case 0x0e: /* _CMP_GT_OS */
+    case 0x1e: /* _CMP_GT_OQ */
       Result = IsGt && !A0.isNaN() && !B0.isNaN();
       break;
-    case _CMP_LE_OS: /* _mm_comile_sh */
-    case _CMP_LE_OQ: /*_mm_ucomile_sh */
+    case 0x02: /* _CMP_LE_OS */
+    case 0x12: /* _CMP_LE_OQ */
       Result = !IsGt && !A0.isNaN() && !B0.isNaN();
       break;
     default:

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to