Skip to content

Commit abb73c2

Browse files
moooriGeneraluseAI
authored andcommitted
[Clang] Allow AVX/AVX512 subvector shuffles in constexpr (llvm#168700)
Resolves llvm#160514 Enables usage of the following x86 intrinsics in `constexpr`: ``` _mm256_shuffle_i64x2 _mm256_mask_shuffle_i64x2 _mm256_maskz_shuffle_i64x2 _mm256_shuffle_f64x2 _mm256_mask_shuffle_f64x2 _mm256_maskz_shuffle_f64x2 _mm512_shuffle_i64x2 _mm512_mask_shuffle_i64x2 _mm512_maskz_shuffle_i64x2 _mm512_shuffle_f64x2 _mm512_mask_shuffle_f64x2 _mm512_maskz_shuffle_f64x2 _mm256_shuffle_i32x4 _mm256_mask_shuffle_i32x4 _mm256_maskz_shuffle_i32x4 _mm256_shuffle_f32x4 _mm256_mask_shuffle_f32x4 _mm256_maskz_shuffle_f32x4 _mm512_shuffle_i32x4 _mm512_mask_shuffle_i32x4 _mm512_maskz_shuffle_i32x4 _mm512_shuffle_f32x4 _mm512_mask_shuffle_f32x4 _mm512_maskz_shuffle_f32x4 ```
1 parent e80166c commit abb73c2

File tree

5 files changed

+112
-2
lines changed

5 files changed

+112
-2
lines changed

clang/include/clang/Basic/BuiltinsX86.td

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2371,7 +2371,8 @@ let Features = "avx512vl",
23712371
def pternlogq256_maskz : X86Builtin<"_Vector<4, long long int>(_Vector<4, long long int>, _Vector<4, long long int>, _Vector<4, long long int>, _Constant int, unsigned char)">;
23722372
}
23732373

2374-
let Features = "avx512f", Attributes = [NoThrow, Const, RequiredVectorWidth<512>] in {
2374+
let Features = "avx512f",
2375+
Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<512>] in {
23752376
def shuf_f32x4 : X86Builtin<"_Vector<16, float>(_Vector<16, float>, _Vector<16, float>, _Constant int)">;
23762377
def shuf_f64x2 : X86Builtin<"_Vector<8, double>(_Vector<8, double>, _Vector<8, double>, _Constant int)">;
23772378
def shuf_i32x4 : X86Builtin<"_Vector<16, int>(_Vector<16, int>, _Vector<16, int>, _Constant int)">;
@@ -2391,7 +2392,8 @@ let Features = "avx512f", Attributes = [NoThrow, Const, Constexpr, RequiredVecto
23912392
: X86Builtin<"_Vector<16, float>(_Vector<16, float>, _Vector<16, int>)">;
23922393
}
23932394

2394-
let Features = "avx512vl", Attributes = [NoThrow, Const, RequiredVectorWidth<256>] in {
2395+
let Features = "avx512vl",
2396+
Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<256>] in {
23952397
def shuf_f32x4_256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8, float>, _Constant int)">;
23962398
def shuf_f64x2_256 : X86Builtin<"_Vector<4, double>(_Vector<4, double>, _Vector<4, double>, _Constant int)">;
23972399
def shuf_i32x4_256 : X86Builtin<"_Vector<8, int>(_Vector<8, int>, _Vector<8, int>, _Constant int)">;

clang/lib/AST/ByteCode/InterpBuiltin.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4847,6 +4847,39 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
48474847
return interp__builtin_elementwise_triop(S, OpPC, Call,
48484848
llvm::APIntOps::fshr);
48494849

4850+
case X86::BI__builtin_ia32_shuf_f32x4_256:
4851+
case X86::BI__builtin_ia32_shuf_i32x4_256:
4852+
case X86::BI__builtin_ia32_shuf_f64x2_256:
4853+
case X86::BI__builtin_ia32_shuf_i64x2_256:
4854+
case X86::BI__builtin_ia32_shuf_f32x4:
4855+
case X86::BI__builtin_ia32_shuf_i32x4:
4856+
case X86::BI__builtin_ia32_shuf_f64x2:
4857+
case X86::BI__builtin_ia32_shuf_i64x2: {
4858+
// Destination and sources A, B all have the same type.
4859+
QualType VecQT = Call->getArg(0)->getType();
4860+
const auto *VecT = VecQT->castAs<VectorType>();
4861+
unsigned NumElems = VecT->getNumElements();
4862+
unsigned ElemBits = S.getASTContext().getTypeSize(VecT->getElementType());
4863+
unsigned LaneBits = 128u;
4864+
unsigned NumLanes = (NumElems * ElemBits) / LaneBits;
4865+
unsigned NumElemsPerLane = LaneBits / ElemBits;
4866+
4867+
return interp__builtin_ia32_shuffle_generic(
4868+
S, OpPC, Call,
4869+
[NumLanes, NumElemsPerLane](unsigned DstIdx, unsigned ShuffleMask) {
4870+
// DstIdx determines source. ShuffleMask selects lane in source.
4871+
unsigned BitsPerElem = NumLanes / 2;
4872+
unsigned IndexMask = (1u << BitsPerElem) - 1;
4873+
unsigned Lane = DstIdx / NumElemsPerLane;
4874+
unsigned SrcIdx = (Lane < NumLanes / 2) ? 0 : 1;
4875+
unsigned BitIdx = BitsPerElem * Lane;
4876+
unsigned SrcLaneIdx = (ShuffleMask >> BitIdx) & IndexMask;
4877+
unsigned ElemInLane = DstIdx % NumElemsPerLane;
4878+
unsigned IdxToPick = SrcLaneIdx * NumElemsPerLane + ElemInLane;
4879+
return std::pair<unsigned, int>{SrcIdx, IdxToPick};
4880+
});
4881+
}
4882+
48504883
case X86::BI__builtin_ia32_insertf32x4_256:
48514884
case X86::BI__builtin_ia32_inserti32x4_256:
48524885
case X86::BI__builtin_ia32_insertf64x2_256:

clang/lib/AST/ExprConstant.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13517,6 +13517,56 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) {
1351713517
return Success(APValue(ResultElements.data(), ResultElements.size()), E);
1351813518
}
1351913519

13520+
case X86::BI__builtin_ia32_shuf_f32x4_256:
13521+
case X86::BI__builtin_ia32_shuf_i32x4_256:
13522+
case X86::BI__builtin_ia32_shuf_f64x2_256:
13523+
case X86::BI__builtin_ia32_shuf_i64x2_256:
13524+
case X86::BI__builtin_ia32_shuf_f32x4:
13525+
case X86::BI__builtin_ia32_shuf_i32x4:
13526+
case X86::BI__builtin_ia32_shuf_f64x2:
13527+
case X86::BI__builtin_ia32_shuf_i64x2: {
13528+
APValue SourceA, SourceB;
13529+
if (!EvaluateAsRValue(Info, E->getArg(0), SourceA) ||
13530+
!EvaluateAsRValue(Info, E->getArg(1), SourceB))
13531+
return false;
13532+
13533+
APSInt Imm;
13534+
if (!EvaluateInteger(E->getArg(2), Imm, Info))
13535+
return false;
13536+
13537+
// Destination and sources A, B all have the same type.
13538+
unsigned NumElems = SourceA.getVectorLength();
13539+
const VectorType *VT = E->getArg(0)->getType()->castAs<VectorType>();
13540+
QualType ElemQT = VT->getElementType();
13541+
unsigned ElemBits = Info.Ctx.getTypeSize(ElemQT);
13542+
unsigned LaneBits = 128u;
13543+
unsigned NumLanes = (NumElems * ElemBits) / LaneBits;
13544+
unsigned NumElemsPerLane = LaneBits / ElemBits;
13545+
13546+
unsigned DstLen = SourceA.getVectorLength();
13547+
SmallVector<APValue, 16> ResultElements;
13548+
ResultElements.reserve(DstLen);
13549+
13550+
APValue R;
13551+
if (!evalShuffleGeneric(
13552+
Info, E, R,
13553+
[NumLanes, NumElemsPerLane](unsigned DstIdx, unsigned ShuffleMask)
13554+
-> std::pair<unsigned, int> {
13555+
// DstIdx determines source. ShuffleMask selects lane in source.
13556+
unsigned BitsPerElem = NumLanes / 2;
13557+
unsigned IndexMask = (1u << BitsPerElem) - 1;
13558+
unsigned Lane = DstIdx / NumElemsPerLane;
13559+
unsigned SrcIdx = (Lane < NumLanes / 2) ? 0 : 1;
13560+
unsigned BitIdx = BitsPerElem * Lane;
13561+
unsigned SrcLaneIdx = (ShuffleMask >> BitIdx) & IndexMask;
13562+
unsigned ElemInLane = DstIdx % NumElemsPerLane;
13563+
unsigned IdxToPick = SrcLaneIdx * NumElemsPerLane + ElemInLane;
13564+
return {SrcIdx, IdxToPick};
13565+
}))
13566+
return false;
13567+
return Success(R, E);
13568+
}
13569+
1352013570
case X86::BI__builtin_ia32_insertf32x4_256:
1352113571
case X86::BI__builtin_ia32_inserti32x4_256:
1352213572
case X86::BI__builtin_ia32_insertf64x2_256:

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6892,80 +6892,93 @@ __m512 test_mm512_shuffle_f32x4(__m512 __A, __m512 __B) {
68926892
// CHECK: shufflevector <16 x float> %{{.*}}, <16 x float> %{{.*}}, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 16, i32 17, i32 18, i32 19>
68936893
return _mm512_shuffle_f32x4(__A, __B, 4);
68946894
}
6895+
TEST_CONSTEXPR(match_m512(_mm512_shuffle_f32x4(((__m512){1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f}), ((__m512){10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0, 110.0, 120.0, 130.0, 140.0, 150.0, 160.0}), 0b11111111), 13.0f, 14.0f, 15.0f, 16.0f, 13.0f, 14.0f, 15.0f, 16.0f, 130.0, 140.0, 150.0, 160.0, 130.0, 140.0, 150.0, 160.0));
68956896

68966897
__m512 test_mm512_mask_shuffle_f32x4(__m512 __W, __mmask16 __U, __m512 __A, __m512 __B) {
68976898
// CHECK-LABEL: test_mm512_mask_shuffle_f32x4
68986899
// CHECK: shufflevector <16 x float> %{{.*}}, <16 x float> %{{.*}}, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 16, i32 17, i32 18, i32 19>
68996900
// CHECK: select <16 x i1> %{{.*}}, <16 x float> %{{.*}}, <16 x float> %{{.*}}
69006901
return _mm512_mask_shuffle_f32x4(__W, __U, __A, __B, 4);
69016902
}
6903+
TEST_CONSTEXPR(match_m512(_mm512_mask_shuffle_f32x4(((__m512){100.0f, 200.0f, 300.0f, 400.0f, 500.0f, 600.0f, 700.0f, 800.0f, 900.0f, 1000.0f, 1100.0f, 1200.0f, 1300.0f, 1400.0f, 1500.0f, 1600.0f}), 0b1111111111111110, ((__m512){1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f}), ((__m512){10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0, 110.0, 120.0, 130.0, 140.0, 150.0, 160.0}), 0b11111111), 100.0f, 14.0f, 15.0f, 16.0f, 13.0f, 14.0f, 15.0f, 16.0f, 130.0, 140.0, 150.0, 160.0, 130.0, 140.0, 150.0, 160.0));
69026904

69036905
__m512 test_mm512_maskz_shuffle_f32x4(__mmask16 __U, __m512 __A, __m512 __B) {
69046906
// CHECK-LABEL: test_mm512_maskz_shuffle_f32x4
69056907
// CHECK: shufflevector <16 x float> %{{.*}}, <16 x float> %{{.*}}, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 16, i32 17, i32 18, i32 19>
69066908
// CHECK: select <16 x i1> %{{.*}}, <16 x float> %{{.*}}, <16 x float> %{{.*}}
69076909
return _mm512_maskz_shuffle_f32x4(__U, __A, __B, 4);
69086910
}
6911+
TEST_CONSTEXPR(match_m512(_mm512_maskz_shuffle_f32x4(0b1111111111110111, ((__m512){1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f}), ((__m512){10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0, 110.0, 120.0, 130.0, 140.0, 150.0, 160.0}), 0b11111111), 13.0f, 14.0f, 15.0f, 0.0f, 13.0f, 14.0f, 15.0f, 16.0f, 130.0, 140.0, 150.0, 160.0, 130.0, 140.0, 150.0, 160.0));
69096912

69106913
__m512d test_mm512_shuffle_f64x2(__m512d __A, __m512d __B) {
69116914
// CHECK-LABEL: test_mm512_shuffle_f64x2
69126915
// CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> %{{.*}}, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 8, i32 9>
69136916
return _mm512_shuffle_f64x2(__A, __B, 4);
69146917
}
6918+
TEST_CONSTEXPR(match_m512d(_mm512_shuffle_f64x2(((__m512d){1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0}), ((__m512d){10.0,20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0}), 0b10101100), 1.0, 2.0, 7.0, 8.0, 50.0, 60.0, 50.0, 60.0));
69156919

69166920
__m512d test_mm512_mask_shuffle_f64x2(__m512d __W, __mmask8 __U, __m512d __A, __m512d __B) {
69176921
// CHECK-LABEL: test_mm512_mask_shuffle_f64x2
69186922
// CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> %{{.*}}, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 8, i32 9>
69196923
// CHECK: select <8 x i1> %{{.*}}, <8 x double> %{{.*}}, <8 x double> %{{.*}}
69206924
return _mm512_mask_shuffle_f64x2(__W, __U, __A, __B, 4);
69216925
}
6926+
TEST_CONSTEXPR(match_m512d(_mm512_mask_shuffle_f64x2(((__m512d){100.0, 200.0, 300.0, 400.0, 500.0, 600.0, 700.0, 800.0}), 0b11110000, ((__m512d){1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0}), ((__m512d){10.0,20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0}), 0b10101100), 100.0, 200.0, 300.0, 400.0, 50.0, 60.0, 50.0, 60.0));
69226927

69236928
__m512d test_mm512_maskz_shuffle_f64x2(__mmask8 __U, __m512d __A, __m512d __B) {
69246929
// CHECK-LABEL: test_mm512_maskz_shuffle_f64x2
69256930
// CHECK: shufflevector <8 x double> %{{.*}}, <8 x double> %{{.*}}, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 8, i32 9>
69266931
// CHECK: select <8 x i1> %{{.*}}, <8 x double> %{{.*}}, <8 x double> %{{.*}}
69276932
return _mm512_maskz_shuffle_f64x2(__U, __A, __B, 4);
69286933
}
6934+
TEST_CONSTEXPR(match_m512d(_mm512_maskz_shuffle_f64x2(0b11110100, ((__m512d){1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0}), ((__m512d){10.0,20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0}), 0b10101100), 0.0, 0.0, 7.0, 0.0, 50.0, 60.0, 50.0, 60.0));
69296935

69306936
__m512i test_mm512_shuffle_i32x4(__m512i __A, __m512i __B) {
69316937
// CHECK-LABEL: test_mm512_shuffle_i32x4
69326938
// CHECK: shufflevector <16 x i32> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 16, i32 17, i32 18, i32 19>
69336939
return _mm512_shuffle_i32x4(__A, __B, 4);
69346940
}
6941+
TEST_CONSTEXPR(match_v16si(_mm512_shuffle_i32x4(((__m512i)(__v16si){1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}), ((__m512i)(__v16si){10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160}), 0), 1, 2, 3, 4, 1, 2, 3, 4, 10, 20, 30, 40, 10, 20, 30, 40));
6942+
69356943

69366944
__m512i test_mm512_mask_shuffle_i32x4(__m512i __W, __mmask16 __U, __m512i __A, __m512i __B) {
69376945
// CHECK-LABEL: test_mm512_mask_shuffle_i32x4
69386946
// CHECK: shufflevector <16 x i32> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 16, i32 17, i32 18, i32 19>
69396947
// CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
69406948
return _mm512_mask_shuffle_i32x4(__W, __U, __A, __B, 4);
69416949
}
6950+
TEST_CONSTEXPR(match_v16si(_mm512_mask_shuffle_i32x4(((__m512i)(__v16si){100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600}), 0b1111111111111011, ((__m512i)(__v16si){1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}), ((__m512i)(__v16si){10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160}), 0), 1, 2, 300, 4, 1, 2, 3, 4, 10, 20, 30, 40, 10, 20, 30, 40));
69426951

69436952
__m512i test_mm512_maskz_shuffle_i32x4(__mmask16 __U, __m512i __A, __m512i __B) {
69446953
// CHECK-LABEL: test_mm512_maskz_shuffle_i32x4
69456954
// CHECK: shufflevector <16 x i32> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 16, i32 17, i32 18, i32 19>
69466955
// CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}
69476956
return _mm512_maskz_shuffle_i32x4(__U, __A, __B, 4);
69486957
}
6958+
TEST_CONSTEXPR(match_v16si(_mm512_maskz_shuffle_i32x4(0b1011111111111111, ((__m512i)(__v16si){1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}), ((__m512i)(__v16si){10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160}), 0), 1, 2, 3, 4, 1, 2, 3, 4, 10, 20, 30, 40, 10, 20, 0, 40));
69496959

69506960
__m512i test_mm512_shuffle_i64x2(__m512i __A, __m512i __B) {
69516961
// CHECK-LABEL: test_mm512_shuffle_i64x2
69526962
// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 8, i32 9>
69536963
return _mm512_shuffle_i64x2(__A, __B, 4);
69546964
}
6965+
TEST_CONSTEXPR(match_m512i(_mm512_shuffle_i64x2(((__m512i){1, 2, 3, 4, 5, 6, 7, 8}), ((__m512i){10, 20, 30, 40, 50, 60, 70, 80}), 0b11000110), 5, 6, 3, 4, 10, 20, 70, 80));
69556966

69566967
__m512i test_mm512_mask_shuffle_i64x2(__m512i __W, __mmask8 __U, __m512i __A, __m512i __B) {
69576968
// CHECK-LABEL: test_mm512_mask_shuffle_i64x2
69586969
// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 8, i32 9>
69596970
// CHECK: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}
69606971
return _mm512_mask_shuffle_i64x2(__W, __U, __A, __B, 4);
69616972
}
6973+
TEST_CONSTEXPR(match_m512i(_mm512_mask_shuffle_i64x2(((__m512i){100, 200, 300, 400, 500, 600, 700, 800}), 0b11111101, ((__m512i){1, 2, 3, 4, 5, 6, 7, 8}), ((__m512i){10, 20, 30, 40, 50, 60, 70, 80}), 0b11000110), 5, 200, 3, 4, 10, 20, 70, 80));
69626974

69636975
__m512i test_mm512_maskz_shuffle_i64x2(__mmask8 __U, __m512i __A, __m512i __B) {
69646976
// CHECK-LABEL: test_mm512_maskz_shuffle_i64x2
69656977
// CHECK: shufflevector <8 x i64> %{{.*}}, <8 x i64> %{{.*}}, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 8, i32 9>
69666978
// CHECK: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}
69676979
return _mm512_maskz_shuffle_i64x2(__U, __A, __B, 4);
69686980
}
6981+
TEST_CONSTEXPR(match_m512i(_mm512_maskz_shuffle_i64x2(0b00111101, ((__m512i){1, 2, 3, 4, 5, 6, 7, 8}), ((__m512i){10, 20, 30, 40, 50, 60, 70, 80}), 0b11000110), 5, 0, 3, 4, 10, 20, 0, 0));
69696982

69706983
__m512d test_mm512_shuffle_pd(__m512d __M, __m512d __V) {
69716984
// CHECK-LABEL: test_mm512_shuffle_pd

0 commit comments

Comments
 (0)