[clang] [X86][Clang] Allow SSE/AVX COMI/UCOMI/CMPS/CMPP fp comparison intrinsics to be used in constexpr (PR #160876)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 26 04:45:39 PDT 2025
https://github.com/zeyi2 created https://github.com/llvm/llvm-project/pull/160876
**This PR is not ready for review yet.**
This patch adds constexpr evaluation support for scalar / vector comparison intrinsics.
Current status:
```
[x]_mm_comieq_ss [x]_mm_comieq_sd [x]_mm_comieq_sh
[x]_mm_comige_ss [x]_mm_comige_sd [x]_mm_comige_sh
[x]_mm_comigt_ss [x]_mm_comigt_sd [x]_mm_comigt_sh
[x]_mm_comile_ss [x]_mm_comile_sd [x]_mm_comile_sh
[x]_mm_comilt_ss [x]_mm_comilt_sd [x]_mm_comilt_sh
[x]_mm_comineq_ss [x]_mm_comineq_sd [x]_mm_comineq_sh
[x]_mm_ucomieq_ss [x]_mm_ucomieq_sd [x]_mm_ucomieq_sh
[x]_mm_ucomige_ss [x]_mm_ucomige_sd [x]_mm_ucomige_sh
[x]_mm_ucomigt_ss [x]_mm_ucomigt_sd [x]_mm_ucomigt_sh
[x]_mm_ucomile_ss [x]_mm_ucomile_sd [x]_mm_ucomile_sh
[x]_mm_ucomilt_ss [x]_mm_ucomilt_sd [x]_mm_ucomilt_sh
[x]_mm_ucomineq_ss [x]_mm_ucomineq_sd [x]_mm_ucomineq_sh
_mm_comi_sh
_mm_cmpeq_ss _mm_cmpeq_sd _mm_cmpeq_ps _mm_cmpeq_pd
_mm_cmpge_ss _mm_cmpge_sd _mm_cmpge_ps _mm_cmpge_pd
_mm_cmpgt_ss _mm_cmpgt_sd _mm_cmpgt_ps _mm_cmpgt_pd
_mm_cmple_ss _mm_cmple_sd _mm_cmple_ps _mm_cmple_pd
_mm_cmplt_ss _mm_cmplt_sd _mm_cmplt_ps _mm_cmplt_pd
_mm_cmpneq_ss _mm_cmpneq_sd _mm_cmpneq_ps _mm_cmpneq_pd
_mm_cmpnge_ss _mm_cmpnge_sd _mm_cmpnge_ps _mm_cmpnge_pd
_mm_cmpngt_ss _mm_cmpngt_sd _mm_cmpngt_ps _mm_cmpngt_pd
_mm_cmpnle_ss _mm_cmpnle_sd _mm_cmpnle_ps _mm_cmpnle_pd
_mm_cmpnlt_ss _mm_cmpnlt_sd _mm_cmpnlt_ps _mm_cmpnlt_pd
_mm_cmpord_ss _mm_cmpord_sd _mm_cmpord_ps _mm_cmpord_pd
_mm_cmpunord_ss _mm_cmpunord_sd _mm_cmpunord_ps _mm_cmpunord_pd
_mm_cmp_ss _mm_cmp_sd
_mm_cmp_ps _mm256_cmp_ps
_mm_cmp_pd _mm256_cmp_pd
```
>From 40cca74bc3ed9398b9d94bfe79103c74841eddd3 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Thu, 25 Sep 2025 22:43:12 +0800
Subject: [PATCH] [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
More information about the cfe-commits
mailing list