Skip to content

Commit dbcb924

Browse files
committed
[X86][Clang] VectorExprEvaluator::VisitCallExpr / InterpretBuiltin - add AVX512 integer comparison intrinsics to be used in constexpr
1 parent 8fe71e0 commit dbcb924

File tree

5 files changed

+210
-22
lines changed

5 files changed

+210
-22
lines changed

clang/include/clang/Basic/BuiltinsX86.td

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1272,81 +1272,81 @@ let Features = "avx512bw", Attributes = [NoThrow, Const, Constexpr] in {
12721272
def knotdi : X86Builtin<"unsigned long long int(unsigned long long int)">;
12731273
}
12741274

1275-
let Features = "avx512vl,avx512bw", Attributes = [NoThrow, Const, RequiredVectorWidth<128>] in {
1275+
let Features = "avx512vl,avx512bw", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<128>] in {
12761276
def cmpb128_mask : X86Builtin<"unsigned short(_Vector<16, char>, _Vector<16, char>, _Constant int, unsigned short)">;
12771277
}
12781278

1279-
let Features = "avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<128>] in {
1279+
let Features = "avx512vl", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<128>] in {
12801280
def cmpd128_mask : X86Builtin<"unsigned char(_Vector<4, int>, _Vector<4, int>, _Constant int, unsigned char)">;
12811281
def cmpq128_mask : X86Builtin<"unsigned char(_Vector<2, long long int>, _Vector<2, long long int>, _Constant int, unsigned char)">;
12821282
}
12831283

1284-
let Features = "avx512vl,avx512bw", Attributes = [NoThrow, Const, RequiredVectorWidth<128>] in {
1284+
let Features = "avx512vl,avx512bw", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<128>] in {
12851285
def cmpw128_mask : X86Builtin<"unsigned char(_Vector<8, short>, _Vector<8, short>, _Constant int, unsigned char)">;
12861286
}
12871287

1288-
let Features = "avx512vl,avx512bw", Attributes = [NoThrow, Const, RequiredVectorWidth<256>] in {
1288+
let Features = "avx512vl,avx512bw", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<256>] in {
12891289
def cmpb256_mask : X86Builtin<"unsigned int(_Vector<32, char>, _Vector<32, char>, _Constant int, unsigned int)">;
12901290
}
12911291

1292-
let Features = "avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<256>] in {
1292+
let Features = "avx512vl", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<256>] in {
12931293
def cmpd256_mask : X86Builtin<"unsigned char(_Vector<8, int>, _Vector<8, int>, _Constant int, unsigned char)">;
12941294
def cmpq256_mask : X86Builtin<"unsigned char(_Vector<4, long long int>, _Vector<4, long long int>, _Constant int, unsigned char)">;
12951295
}
12961296

1297-
let Features = "avx512vl,avx512bw", Attributes = [NoThrow, Const, RequiredVectorWidth<256>] in {
1297+
let Features = "avx512vl,avx512bw", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<256>] in {
12981298
def cmpw256_mask : X86Builtin<"unsigned short(_Vector<16, short>, _Vector<16, short>, _Constant int, unsigned short)">;
12991299
}
13001300

1301-
let Features = "avx512bw", Attributes = [NoThrow, Const, RequiredVectorWidth<512>] in {
1301+
let Features = "avx512bw", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<512>] in {
13021302
def cmpb512_mask : X86Builtin<"unsigned long long int(_Vector<64, char>, _Vector<64, char>, _Constant int, unsigned long long int)">;
13031303
}
13041304

1305-
let Features = "avx512f", Attributes = [NoThrow, Const, RequiredVectorWidth<512>] in {
1305+
let Features = "avx512f", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<512>] in {
13061306
def cmpd512_mask : X86Builtin<"unsigned short(_Vector<16, int>, _Vector<16, int>, _Constant int, unsigned short)">;
13071307
def cmpq512_mask : X86Builtin<"unsigned char(_Vector<8, long long int>, _Vector<8, long long int>, _Constant int, unsigned char)">;
13081308
}
13091309

1310-
let Features = "avx512bw", Attributes = [NoThrow, Const, RequiredVectorWidth<512>] in {
1310+
let Features = "avx512bw", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<512>] in {
13111311
def cmpw512_mask : X86Builtin<"unsigned int(_Vector<32, short>, _Vector<32, short>, _Constant int, unsigned int)">;
13121312
}
13131313

1314-
let Features = "avx512vl,avx512bw", Attributes = [NoThrow, Const, RequiredVectorWidth<128>] in {
1314+
let Features = "avx512vl,avx512bw", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<128>] in {
13151315
def ucmpb128_mask : X86Builtin<"unsigned short(_Vector<16, char>, _Vector<16, char>, _Constant int, unsigned short)">;
13161316
}
13171317

1318-
let Features = "avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<128>] in {
1318+
let Features = "avx512vl", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<128>] in {
13191319
def ucmpd128_mask : X86Builtin<"unsigned char(_Vector<4, int>, _Vector<4, int>, _Constant int, unsigned char)">;
13201320
def ucmpq128_mask : X86Builtin<"unsigned char(_Vector<2, long long int>, _Vector<2, long long int>, _Constant int, unsigned char)">;
13211321
}
13221322

1323-
let Features = "avx512vl,avx512bw", Attributes = [NoThrow, Const, RequiredVectorWidth<128>] in {
1323+
let Features = "avx512vl,avx512bw", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<128>] in {
13241324
def ucmpw128_mask : X86Builtin<"unsigned char(_Vector<8, short>, _Vector<8, short>, _Constant int, unsigned char)">;
13251325
}
13261326

1327-
let Features = "avx512vl,avx512bw", Attributes = [NoThrow, Const, RequiredVectorWidth<256>] in {
1327+
let Features = "avx512vl,avx512bw", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<256>] in {
13281328
def ucmpb256_mask : X86Builtin<"unsigned int(_Vector<32, char>, _Vector<32, char>, _Constant int, unsigned int)">;
13291329
}
13301330

1331-
let Features = "avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<256>] in {
1331+
let Features = "avx512vl", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<256>] in {
13321332
def ucmpd256_mask : X86Builtin<"unsigned char(_Vector<8, int>, _Vector<8, int>, _Constant int, unsigned char)">;
13331333
def ucmpq256_mask : X86Builtin<"unsigned char(_Vector<4, long long int>, _Vector<4, long long int>, _Constant int, unsigned char)">;
13341334
}
13351335

1336-
let Features = "avx512vl,avx512bw", Attributes = [NoThrow, Const, RequiredVectorWidth<256>] in {
1336+
let Features = "avx512vl,avx512bw", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<256>] in {
13371337
def ucmpw256_mask : X86Builtin<"unsigned short(_Vector<16, short>, _Vector<16, short>, _Constant int, unsigned short)">;
13381338
}
13391339

1340-
let Features = "avx512bw", Attributes = [NoThrow, Const, RequiredVectorWidth<512>] in {
1340+
let Features = "avx512bw", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<512>] in {
13411341
def ucmpb512_mask : X86Builtin<"unsigned long long int(_Vector<64, char>, _Vector<64, char>, _Constant int, unsigned long long int)">;
13421342
}
13431343

1344-
let Features = "avx512f", Attributes = [NoThrow, Const, RequiredVectorWidth<512>] in {
1344+
let Features = "avx512f", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<512>] in {
13451345
def ucmpd512_mask : X86Builtin<"unsigned short(_Vector<16, int>, _Vector<16, int>, _Constant int, unsigned short)">;
13461346
def ucmpq512_mask : X86Builtin<"unsigned char(_Vector<8, long long int>, _Vector<8, long long int>, _Constant int, unsigned char)">;
13471347
}
13481348

1349-
let Features = "avx512bw", Attributes = [NoThrow, Const, RequiredVectorWidth<512>] in {
1349+
let Features = "avx512bw", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<512>] in {
13501350
def ucmpw512_mask : X86Builtin<"unsigned int(_Vector<32, short>, _Vector<32, short>, _Constant int, unsigned int)">;
13511351
}
13521352

clang/lib/AST/ByteCode/InterpBuiltin.cpp

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3101,6 +3101,62 @@ static bool interp__builtin_vec_set(InterpState &S, CodePtr OpPC,
31013101
return true;
31023102
}
31033103

3104+
static bool interp__builtin_cmp_mask(InterpState &S, CodePtr OpPC,
3105+
const CallExpr *Call, unsigned ID,
3106+
bool IsUnsigned) {
3107+
assert(Call->getNumArgs() == 4);
3108+
3109+
APSInt Mask = popToAPSInt(S, Call->getArg(3));
3110+
APSInt Opcode = popToAPSInt(S, Call->getArg(2));
3111+
const Pointer &LHS = S.Stk.pop<Pointer>();
3112+
const Pointer &RHS = S.Stk.pop<Pointer>();
3113+
3114+
assert(LHS.getNumElems() == RHS.getNumElems());
3115+
3116+
APInt RetMask = APInt::getZero(LHS.getNumElems());
3117+
unsigned VectorLen = LHS.getNumElems();
3118+
PrimType ElemT = LHS.getFieldDesc()->getPrimType();
3119+
3120+
INT_TYPE_SWITCH_NO_BOOL(ElemT, {
3121+
for (unsigned ElemNum = 0; ElemNum < VectorLen; ++ElemNum) {
3122+
APSInt A = LHS.elem<T>(ElemNum).toAPSInt();
3123+
APSInt B = RHS.elem<T>(ElemNum).toAPSInt();
3124+
bool result = false;
3125+
switch (Opcode.getExtValue() & 0x7) {
3126+
case 0x00: // _MM_CMPINT_EQ
3127+
result = (A == B);
3128+
break;
3129+
case 0x01: // _MM_CMPINT_LT
3130+
result = IsUnsigned ? A.ult(B) : A.slt(B);
3131+
break;
3132+
case 0x02: // _MM_CMPINT_LE
3133+
result = IsUnsigned ? A.ule(B) : A.sle(B);
3134+
break;
3135+
case 0x03: // _MM_CMPINT_FALSE
3136+
result = false;
3137+
break;
3138+
case 0x04: // _MM_CMPINT_NE
3139+
result = (A != B);
3140+
break;
3141+
case 0x05: // _MM_CMPINT_NLT (>=)
3142+
result = IsUnsigned ? A.uge(B) : A.sge(B);
3143+
break;
3144+
case 0x06: // _MM_CMPINT_NLE (>)
3145+
result = IsUnsigned ? A.ugt(B) : A.sgt(B);
3146+
break;
3147+
case 0x07: // _MM_CMPINT_TRUE
3148+
result = true;
3149+
break;
3150+
}
3151+
3152+
RetMask.setBitVal(ElemNum, Mask[ElemNum] && result);
3153+
}
3154+
});
3155+
3156+
pushInteger(S, RetMask, Call->getType());
3157+
return true;
3158+
}
3159+
31043160
static bool interp__builtin_ia32_vpconflict(InterpState &S, CodePtr OpPC,
31053161
const CallExpr *Call) {
31063162
assert(Call->getNumArgs() == 1);
@@ -4141,6 +4197,34 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
41414197
case X86::BI__builtin_ia32_vec_set_v4di:
41424198
return interp__builtin_vec_set(S, OpPC, Call, BuiltinID);
41434199

4200+
case X86::BI__builtin_ia32_cmpb128_mask:
4201+
case X86::BI__builtin_ia32_cmpw128_mask:
4202+
case X86::BI__builtin_ia32_cmpd128_mask:
4203+
case X86::BI__builtin_ia32_cmpq128_mask:
4204+
case X86::BI__builtin_ia32_cmpb256_mask:
4205+
case X86::BI__builtin_ia32_cmpw256_mask:
4206+
case X86::BI__builtin_ia32_cmpd256_mask:
4207+
case X86::BI__builtin_ia32_cmpq256_mask:
4208+
case X86::BI__builtin_ia32_cmpb512_mask:
4209+
case X86::BI__builtin_ia32_cmpw512_mask:
4210+
case X86::BI__builtin_ia32_cmpd512_mask:
4211+
case X86::BI__builtin_ia32_cmpq512_mask:
4212+
return interp__builtin_cmp_mask(S, OpPC, Call, BuiltinID, /*IsUnsigned*/false);
4213+
4214+
case X86::BI__builtin_ia32_ucmpb128_mask:
4215+
case X86::BI__builtin_ia32_ucmpw128_mask:
4216+
case X86::BI__builtin_ia32_ucmpd128_mask:
4217+
case X86::BI__builtin_ia32_ucmpq128_mask:
4218+
case X86::BI__builtin_ia32_ucmpb256_mask:
4219+
case X86::BI__builtin_ia32_ucmpw256_mask:
4220+
case X86::BI__builtin_ia32_ucmpd256_mask:
4221+
case X86::BI__builtin_ia32_ucmpq256_mask:
4222+
case X86::BI__builtin_ia32_ucmpb512_mask:
4223+
case X86::BI__builtin_ia32_ucmpw512_mask:
4224+
case X86::BI__builtin_ia32_ucmpd512_mask:
4225+
case X86::BI__builtin_ia32_ucmpq512_mask:
4226+
return interp__builtin_cmp_mask(S, OpPC, Call, BuiltinID, /*IsUnsigned*/true);
4227+
41444228
default:
41454229
S.FFDiag(S.Current->getLocation(OpPC),
41464230
diag::note_invalid_subexpr_in_const_expr)

clang/lib/AST/ExprConstant.cpp

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15449,6 +15449,87 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E,
1544915449
unsigned Idx = static_cast<unsigned>(IdxAPS.getZExtValue() & (N - 1));
1545015450
return Success(Vec.getVectorElt(Idx).getInt(), E);
1545115451
}
15452+
15453+
case clang::X86::BI__builtin_ia32_cmpb128_mask:
15454+
case clang::X86::BI__builtin_ia32_cmpw128_mask:
15455+
case clang::X86::BI__builtin_ia32_cmpd128_mask:
15456+
case clang::X86::BI__builtin_ia32_cmpq128_mask:
15457+
case clang::X86::BI__builtin_ia32_cmpb256_mask:
15458+
case clang::X86::BI__builtin_ia32_cmpw256_mask:
15459+
case clang::X86::BI__builtin_ia32_cmpd256_mask:
15460+
case clang::X86::BI__builtin_ia32_cmpq256_mask:
15461+
case clang::X86::BI__builtin_ia32_cmpb512_mask:
15462+
case clang::X86::BI__builtin_ia32_cmpw512_mask:
15463+
case clang::X86::BI__builtin_ia32_cmpd512_mask:
15464+
case clang::X86::BI__builtin_ia32_cmpq512_mask:
15465+
case clang::X86::BI__builtin_ia32_ucmpb128_mask:
15466+
case clang::X86::BI__builtin_ia32_ucmpw128_mask:
15467+
case clang::X86::BI__builtin_ia32_ucmpd128_mask:
15468+
case clang::X86::BI__builtin_ia32_ucmpq128_mask:
15469+
case clang::X86::BI__builtin_ia32_ucmpb256_mask:
15470+
case clang::X86::BI__builtin_ia32_ucmpw256_mask:
15471+
case clang::X86::BI__builtin_ia32_ucmpd256_mask:
15472+
case clang::X86::BI__builtin_ia32_ucmpq256_mask:
15473+
case clang::X86::BI__builtin_ia32_ucmpb512_mask:
15474+
case clang::X86::BI__builtin_ia32_ucmpw512_mask:
15475+
case clang::X86::BI__builtin_ia32_ucmpd512_mask:
15476+
case clang::X86::BI__builtin_ia32_ucmpq512_mask: {
15477+
assert(E->getNumArgs() == 4);
15478+
15479+
bool IsUnsigned = (BuiltinOp >= clang::X86::BI__builtin_ia32_ucmpb128_mask &&
15480+
BuiltinOp <= clang::X86::BI__builtin_ia32_ucmpq512_mask);
15481+
15482+
APValue LHS, RHS;
15483+
APSInt Mask, Opcode;
15484+
if (!EvaluateVector(E->getArg(0), LHS, Info) ||
15485+
!EvaluateVector(E->getArg(1), RHS, Info) ||
15486+
!EvaluateInteger(E->getArg(2), Opcode, Info) ||
15487+
!EvaluateInteger(E->getArg(3), Mask, Info))
15488+
return false;
15489+
15490+
assert(LHS.getVectorLength() == RHS.getVectorLength());
15491+
15492+
APSInt RetMask = APSInt::getUnsigned(0);
15493+
unsigned VectorLen = LHS.getVectorLength();
15494+
15495+
for (unsigned ElemNum = 0; ElemNum < VectorLen; ++ElemNum) {
15496+
APSInt A = LHS.getVectorElt(ElemNum).getInt();
15497+
APSInt B = RHS.getVectorElt(ElemNum).getInt();
15498+
bool result = false;
15499+
15500+
switch (Opcode.getExtValue() & 0x7) {
15501+
case 0: // _MM_CMPINT_EQ
15502+
result = (A == B);
15503+
break;
15504+
case 1: // _MM_CMPINT_LT
15505+
result = IsUnsigned ? A.ult(B) : A.slt(B);
15506+
break;
15507+
case 2: // _MM_CMPINT_LE
15508+
result = IsUnsigned ? A.ule(B) : A.sle(B);
15509+
break;
15510+
case 3: // _MM_CMPINT_FALSE
15511+
result = false;
15512+
break;
15513+
case 4: // _MM_CMPINT_NE
15514+
result = (A != B);
15515+
break;
15516+
case 5: // _MM_CMPINT_NLT (>=)
15517+
result = IsUnsigned ? A.uge(B) : A.sge(B);
15518+
break;
15519+
case 6: // _MM_CMPINT_NLE (>)
15520+
result = IsUnsigned ? A.ugt(B) : A.sgt(B);
15521+
break;
15522+
case 7: // _MM_CMPINT_TRUE
15523+
result = true;
15524+
break;
15525+
}
15526+
15527+
RetMask.setBitVal(ElemNum, Mask[ElemNum] && result);
15528+
}
15529+
15530+
RetMask.setIsUnsigned(true);
15531+
return Success(APValue(RetMask), E);
15532+
}
1545215533
}
1545315534
}
1545415535

clang/lib/Headers/avx512vlbwintrin.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2385,20 +2385,20 @@ _mm256_mask_storeu_epi8 (void *__P, __mmask32 __U, __m256i __A)
23852385
(__mmask32) __U);
23862386
}
23872387

2388-
static __inline__ __mmask16 __DEFAULT_FN_ATTRS128
2388+
static __inline__ __mmask16 __DEFAULT_FN_ATTRS128_CONSTEXPR
23892389
_mm_test_epi8_mask (__m128i __A, __m128i __B)
23902390
{
23912391
return _mm_cmpneq_epi8_mask (_mm_and_si128(__A, __B), _mm_setzero_si128());
23922392
}
23932393

2394-
static __inline__ __mmask16 __DEFAULT_FN_ATTRS128
2394+
static __inline__ __mmask16 __DEFAULT_FN_ATTRS128_CONSTEXPR
23952395
_mm_mask_test_epi8_mask (__mmask16 __U, __m128i __A, __m128i __B)
23962396
{
23972397
return _mm_mask_cmpneq_epi8_mask (__U, _mm_and_si128 (__A, __B),
23982398
_mm_setzero_si128());
23992399
}
24002400

2401-
static __inline__ __mmask32 __DEFAULT_FN_ATTRS256
2401+
static __inline__ __mmask32 __DEFAULT_FN_ATTRS256_CONSTEXPR
24022402
_mm256_test_epi8_mask (__m256i __A, __m256i __B)
24032403
{
24042404
return _mm256_cmpneq_epi8_mask (_mm256_and_si256(__A, __B),
@@ -2439,7 +2439,7 @@ _mm256_mask_test_epi16_mask (__mmask16 __U, __m256i __A, __m256i __B)
24392439
_mm256_setzero_si256());
24402440
}
24412441

2442-
static __inline__ __mmask16 __DEFAULT_FN_ATTRS128
2442+
static __inline__ __mmask16 __DEFAULT_FN_ATTRS128_CONSTEXPR
24432443
_mm_testn_epi8_mask (__m128i __A, __m128i __B)
24442444
{
24452445
return _mm_cmpeq_epi8_mask (_mm_and_si128 (__A, __B), _mm_setzero_si128());

clang/test/CodeGen/X86/avx512vlbw-builtins.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2890,20 +2890,37 @@ __mmask16 test_mm_test_epi8_mask(__m128i __A, __m128i __B) {
28902890
return _mm_test_epi8_mask(__A, __B);
28912891
}
28922892

2893+
TEST_CONSTEXPR(_mm_test_epi8_mask(
2894+
(__m128i)(__v16qi){1, 2, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16},
2895+
(__m128i)(__v16qi){1, 2, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
2896+
)
2897+
== (__mmask16)0xfffb);
2898+
28932899
__mmask16 test_mm_mask_test_epi8_mask(__mmask16 __U, __m128i __A, __m128i __B) {
28942900
// CHECK-LABEL: test_mm_mask_test_epi8_mask
28952901
// CHECK: and <2 x i64> %{{.*}}, %{{.*}}
28962902
// CHECK: icmp ne <16 x i8> %{{.*}}, %{{.*}}
28972903
// CHECK: and <16 x i1> %{{.*}}, %{{.*}}
28982904
return _mm_mask_test_epi8_mask(__U, __A, __B);
28992905
}
2906+
TEST_CONSTEXPR(_mm_mask_test_epi8_mask(
2907+
0xFFFF,
2908+
(__m128i)(__v16qi){1, 2, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16},
2909+
(__m128i)(__v16qi){1, 2, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
2910+
)
2911+
== (__mmask16)0xfffb);
29002912

29012913
__mmask32 test_mm256_test_epi8_mask(__m256i __A, __m256i __B) {
29022914
// CHECK-LABEL: test_mm256_test_epi8_mask
29032915
// CHECK: and <4 x i64> %{{.*}}, %{{.*}}
29042916
// CHECK: icmp ne <32 x i8> %{{.*}}, %{{.*}}
29052917
return _mm256_test_epi8_mask(__A, __B);
29062918
}
2919+
TEST_CONSTEXPR(_mm256_test_epi8_mask(
2920+
(__m256i)(__v32qi){1, 2, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16},
2921+
(__m256i)(__v32qi){1, 2, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
2922+
)
2923+
== (__mmask32)0xfffbfffb);
29072924

29082925
__mmask32 test_mm256_mask_test_epi8_mask(__mmask32 __U, __m256i __A, __m256i __B) {
29092926
// CHECK-LABEL: test_mm256_mask_test_epi8_mask
@@ -2950,6 +2967,12 @@ __mmask16 test_mm_testn_epi8_mask(__m128i __A, __m128i __B) {
29502967
return _mm_testn_epi8_mask(__A, __B);
29512968
}
29522969

2970+
TEST_CONSTEXPR(_mm_testn_epi8_mask(
2971+
(__m128i)(__v16qi){1, 2, 77, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1, 16, 16},
2972+
(__m128i)(__v16qi){2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15}
2973+
)
2974+
== (__mmask16)0xe001);
2975+
29532976
__mmask16 test_mm_mask_testn_epi8_mask(__mmask16 __U, __m128i __A, __m128i __B) {
29542977
// CHECK-LABEL: test_mm_mask_testn_epi8_mask
29552978
// CHECK: and <2 x i64> %{{.*}}, %{{.*}}

0 commit comments

Comments
 (0)