Skip to content

Commit 51d2633

Browse files
committed
[X86] Allow PSHUFD/PSHUFLW/PSHUFW intrinsics in constexpr
Summary: Implements InterpBuiltin support and adds CodeGen tests. Issue: #156611
1 parent 80beefa commit 51d2633

File tree

11 files changed

+2761
-2066
lines changed

11 files changed

+2761
-2066
lines changed

clang/include/clang/Basic/BuiltinsX86.td

Lines changed: 56 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,10 @@ let Features = "mmx", Header = "mmintrin.h", Attributes = [NoThrow, Const] in {
145145
def _m_prefetch : X86LibBuiltin<"void(void *)">;
146146
}
147147

148+
let Features = "mmx", Attributes = [NoThrow, Const, Constexpr] in {
149+
def pshufw : X86Builtin<"_Vector<4, short>(_Vector<4, short>, _Constant int)">;
150+
}
151+
148152
// PRFCHW
149153
let Features = "prfchw", Header = "intrin.h", Attributes = [NoThrow, Const] in {
150154
def _m_prefetchw : X86LibBuiltin<"void(void volatile const *)">;
@@ -217,10 +221,13 @@ let Features = "sse2", Attributes = [NoThrow] in {
217221
def movnti : X86Builtin<"void(int *, int)">;
218222
}
219223

220-
let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>] in {
221-
def pshufd : X86Builtin<"_Vector<4, int>(_Vector<4, int>, _Constant int)">;
224+
let Features = "sse2", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<128>] in {
222225
def pshuflw : X86Builtin<"_Vector<8, short>(_Vector<8, short>, _Constant int)">;
226+
def pshufd : X86Builtin<"_Vector<4, int>(_Vector<4, int>, _Constant int)">;
223227
def pshufhw : X86Builtin<"_Vector<8, short>(_Vector<8, short>, _Constant int)">;
228+
}
229+
230+
let Features = "sse2", Attributes = [NoThrow, Const, RequiredVectorWidth<128>] in {
224231
def psadbw128 : X86Builtin<"_Vector<2, long long int>(_Vector<16, char>, _Vector<16, char>)">;
225232
def sqrtpd : X86Builtin<"_Vector<2, double>(_Vector<2, double>)">;
226233
def sqrtsd : X86Builtin<"_Vector<2, double>(_Vector<2, double>)">;
@@ -569,6 +576,12 @@ let Features = "avx", Attributes = [NoThrow, Const, RequiredVectorWidth<256>] in
569576
def vec_set_v8si : X86Builtin<"_Vector<8, int>(_Vector<8, int>, int, _Constant int)">;
570577
}
571578

579+
let Features = "avx2", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<256>] in {
580+
def pshuflw256 : X86Builtin<"_Vector<16, short>(_Vector<16, short>, _Constant int)">;
581+
def pshufhw256 : X86Builtin<"_Vector<16, short>(_Vector<16, short>, _Constant int)">;
582+
def pshufd256 : X86Builtin<"_Vector<8, int>(_Vector<8, int>, _Constant int)">;
583+
}
584+
572585
let Features = "avx2", Attributes = [NoThrow, Const, RequiredVectorWidth<256>] in {
573586
def mpsadbw256 : X86Builtin<"_Vector<32, char>(_Vector<32, char>, _Vector<32, char>, _Constant char)">;
574587
def palignr256 : X86Builtin<"_Vector<32, char>(_Vector<32, char>, _Vector<32, char>, _Constant int)">;
@@ -584,9 +597,6 @@ let Features = "avx2", Attributes = [NoThrow, Const, RequiredVectorWidth<256>] i
584597
def pmulhrsw256 : X86Builtin<"_Vector<16, short>(_Vector<16, short>, _Vector<16, short>)">;
585598
def psadbw256 : X86Builtin<"_Vector<4, long long int>(_Vector<32, char>, _Vector<32, char>)">;
586599
def pshufb256 : X86Builtin<"_Vector<32, char>(_Vector<32, char>, _Vector<32, char>)">;
587-
def pshufd256 : X86Builtin<"_Vector<8, int>(_Vector<8, int>, _Constant int)">;
588-
def pshuflw256 : X86Builtin<"_Vector<16, short>(_Vector<16, short>, _Constant int)">;
589-
def pshufhw256 : X86Builtin<"_Vector<16, short>(_Vector<16, short>, _Constant int)">;
590600
def psignb256 : X86Builtin<"_Vector<32, char>(_Vector<32, char>, _Vector<32, char>)">;
591601
def psignw256 : X86Builtin<"_Vector<16, short>(_Vector<16, short>, _Vector<16, short>)">;
592602
def psignd256 : X86Builtin<"_Vector<8, int>(_Vector<8, int>, _Vector<8, int>)">;
@@ -1989,9 +1999,28 @@ let Features = "avx512vl", Attributes = [NoThrow, Const, Constexpr, RequiredVect
19891999
def prorq256 : X86Builtin<"_Vector<4, long long int>(_Vector<4, long long int>, _Constant int)">;
19902000
}
19912001

1992-
let Features = "avx512bw", Attributes = [NoThrow, Const, RequiredVectorWidth<512>] in {
2002+
let Features = "avx512bw", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<512>] in {
19932003
def pshufhw512 : X86Builtin<"_Vector<32, short>(_Vector<32, short>, _Constant int)">;
19942004
def pshuflw512 : X86Builtin<"_Vector<32, short>(_Vector<32, short>, _Constant int)">;
2005+
}
2006+
2007+
let Features = "avx512f", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<512>] in {
2008+
def pshufd512 : X86Builtin<"_Vector<16, int>(_Vector<16, int>, _Constant int)">;
2009+
def pshufd512_mask : X86Builtin<"_Vector<16, int>(_Vector<16, int>, _Constant int, _Vector<16, int>, unsigned short)">;
2010+
def pshufd512_maskz : X86Builtin<"_Vector<16, int>(_Vector<16, int>, _Constant int, unsigned short)">;
2011+
}
2012+
2013+
let Features = "avx512vl", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<256>] in {
2014+
def pshufd256_mask : X86Builtin<"_Vector<8, int>(_Vector<8, int>, _Constant int, _Vector<8, int>, unsigned char)">;
2015+
def pshufd256_maskz : X86Builtin<"_Vector<8, int>(_Vector<8, int>, _Constant int, unsigned char)">;
2016+
}
2017+
2018+
let Features = "avx512vl", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<128>] in {
2019+
def pshufd128_mask : X86Builtin<"_Vector<4, int>(_Vector<4, int>, _Constant int, _Vector<4, int>, unsigned char)">;
2020+
def pshufd128_maskz : X86Builtin<"_Vector<4, int>(_Vector<4, int>, _Constant int, unsigned char)">;
2021+
}
2022+
2023+
let Features = "avx512bw", Attributes = [NoThrow, Const, RequiredVectorWidth<512>] in {
19952024
def psllw512 : X86Builtin<"_Vector<32, short>(_Vector<32, short>, _Vector<8, short>)">;
19962025
}
19972026

@@ -3266,7 +3295,6 @@ let Features = "avx512f", Attributes = [NoThrow, Const, RequiredVectorWidth<128>
32663295
}
32673296

32683297
let Features = "avx512f", Attributes = [NoThrow, Const, RequiredVectorWidth<512>] in {
3269-
def pshufd512 : X86Builtin<"_Vector<16, int>(_Vector<16, int>, _Constant int)">;
32703298
def expanddf512_mask : X86Builtin<"_Vector<8, double>(_Vector<8, double>, _Vector<8, double>, unsigned char)">;
32713299
def expanddi512_mask : X86Builtin<"_Vector<8, long long int>(_Vector<8, long long int>, _Vector<8, long long int>, unsigned char)">;
32723300
}
@@ -5114,3 +5142,24 @@ let Features = "avx10.2", Attributes = [NoThrow, Const, RequiredVectorWidth<256>
51145142
let Features = "avx10.2", Attributes = [NoThrow, Const, RequiredVectorWidth<512>] in {
51155143
def vsqrtbf16512 : X86Builtin<"_Vector<32, __bf16>(_Vector<32, __bf16>)">;
51165144
}
5145+
5146+
let Features = "avx512bw", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<512>] in {
5147+
def pshuflw512_mask : X86Builtin<"_Vector<32, short>(_Vector<32, short>, _Constant int, _Vector<32, short>, unsigned int)">;
5148+
def pshuflw512_maskz : X86Builtin<"_Vector<32, short>(_Vector<32, short>, _Constant int, unsigned int)">;
5149+
def pshufhw512_mask : X86Builtin<"_Vector<32, short>(_Vector<32, short>, _Constant int, _Vector<32, short>, unsigned int)">;
5150+
def pshufhw512_maskz : X86Builtin<"_Vector<32, short>(_Vector<32, short>, _Constant int, unsigned int)">;
5151+
}
5152+
5153+
let Features = "avx512vl,avx512bw", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<256>] in {
5154+
def pshuflw256_mask : X86Builtin<"_Vector<16, short>(_Vector<16, short>, _Constant int, _Vector<16, short>, unsigned short)">;
5155+
def pshuflw256_maskz : X86Builtin<"_Vector<16, short>(_Vector<16, short>, _Constant int, unsigned short)">;
5156+
def pshufhw256_mask : X86Builtin<"_Vector<16, short>(_Vector<16, short>, _Constant int, _Vector<16, short>, unsigned short)">;
5157+
def pshufhw256_maskz : X86Builtin<"_Vector<16, short>(_Vector<16, short>, _Constant int, unsigned short)">;
5158+
}
5159+
5160+
let Features = "avx512vl,avx512bw", Attributes = [NoThrow, Const, Constexpr, RequiredVectorWidth<128>] in {
5161+
def pshuflw128_mask : X86Builtin<"_Vector<8, short>(_Vector<8, short>, _Constant int, _Vector<8, short>, unsigned char)">;
5162+
def pshuflw128_maskz : X86Builtin<"_Vector<8, short>(_Vector<8, short>, _Constant int, unsigned char)">;
5163+
def pshufhw128_mask : X86Builtin<"_Vector<8, short>(_Vector<8, short>, _Constant int, _Vector<8, short>, unsigned char)">;
5164+
def pshufhw128_maskz : X86Builtin<"_Vector<8, short>(_Vector<8, short>, _Constant int, unsigned char)">;
5165+
}

clang/lib/AST/ByteCode/InterpBuiltin.cpp

Lines changed: 245 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2862,6 +2862,218 @@ static bool interp__builtin_blend(InterpState &S, CodePtr OpPC,
28622862
return true;
28632863
}
28642864

2865+
static bool interp__builtin_ia32_pshuflw_common(InterpState &S, CodePtr OpPC,
2866+
const CallExpr *Call) {
2867+
const unsigned NumArgs = Call->getNumArgs();
2868+
assert(NumArgs == 2 || NumArgs == 3 || NumArgs == 4);
2869+
APSInt K;
2870+
Pointer SrcPT;
2871+
const bool HasMask = (NumArgs == 3) || (NumArgs == 4);
2872+
const bool IsMaskZ = (NumArgs == 3);
2873+
if (NumArgs == 4) {
2874+
K = popToAPSInt(S, Call->getArg(3));
2875+
SrcPT = S.Stk.pop<Pointer>();
2876+
} else if (NumArgs == 3) {
2877+
K = popToAPSInt(S, Call->getArg(2));
2878+
}
2879+
2880+
APSInt Imm = popToAPSInt(S, Call->getArg(1));
2881+
const Pointer &Src = S.Stk.pop<Pointer>();
2882+
const Pointer &Dst = S.Stk.peek<Pointer>();
2883+
const unsigned NumElems = Dst.getNumElems();
2884+
const PrimType ElemT = Dst.getFieldDesc()->getPrimType();
2885+
const unsigned ElemBits = 16;
2886+
const unsigned LaneElems = 128u / ElemBits;
2887+
const unsigned Half = 4;
2888+
assert(NumElems % LaneElems == 0 && "pshuflw expects 128-bit lanes");
2889+
const uint8_t Ctl = static_cast<uint8_t>(Imm.getZExtValue());
2890+
2891+
for (unsigned i = 0; i != NumElems; ++i) {
2892+
const unsigned laneBase = (i / LaneElems) * LaneElems;
2893+
const unsigned inLane = i % LaneElems;
2894+
2895+
unsigned srcIdx;
2896+
if (inLane < Half) {
2897+
const unsigned pos = inLane;
2898+
const unsigned sel = (Ctl >> (2 * pos)) & 0x3;
2899+
srcIdx = laneBase + sel;
2900+
} else {
2901+
srcIdx = i;
2902+
}
2903+
2904+
APSInt Chosen;
2905+
INT_TYPE_SWITCH(ElemT, { Chosen = Src.elem<T>(srcIdx).toAPSInt(); });
2906+
2907+
if (!HasMask) {
2908+
INT_TYPE_SWITCH_NO_BOOL(ElemT,
2909+
{ Dst.elem<T>(i) = static_cast<T>(Chosen); });
2910+
continue;
2911+
}
2912+
2913+
const bool Keep =
2914+
(i < static_cast<unsigned>(K.getBitWidth())) ? K[i] : false;
2915+
2916+
if (Keep) {
2917+
INT_TYPE_SWITCH_NO_BOOL(ElemT,
2918+
{ Dst.elem<T>(i) = static_cast<T>(Chosen); });
2919+
} else if (IsMaskZ) {
2920+
APSInt Zero(APInt(Chosen.getBitWidth(), 0));
2921+
Zero.setIsSigned(Chosen.isSigned());
2922+
INT_TYPE_SWITCH_NO_BOOL(ElemT,
2923+
{ Dst.elem<T>(i) = static_cast<T>(Zero); });
2924+
} else {
2925+
APSInt PT;
2926+
INT_TYPE_SWITCH(ElemT, { PT = SrcPT.elem<T>(i).toAPSInt(); });
2927+
INT_TYPE_SWITCH_NO_BOOL(ElemT, { Dst.elem<T>(i) = static_cast<T>(PT); });
2928+
}
2929+
}
2930+
2931+
Dst.initializeAllElements();
2932+
return true;
2933+
}
2934+
2935+
static bool interp__builtin_ia32_pshufhw_common(InterpState &S, CodePtr OpPC,
2936+
const CallExpr *Call) {
2937+
(void)OpPC;
2938+
const unsigned NumArgs = Call->getNumArgs();
2939+
assert(NumArgs == 2 || NumArgs == 3 || NumArgs == 4);
2940+
2941+
APSInt K;
2942+
Pointer SrcPT;
2943+
const bool HasMask = (NumArgs == 3) || (NumArgs == 4);
2944+
const bool IsMaskZ = (NumArgs == 3);
2945+
2946+
if (NumArgs == 4) {
2947+
K = popToAPSInt(S, Call->getArg(3));
2948+
SrcPT = S.Stk.pop<Pointer>();
2949+
} else if (NumArgs == 3) {
2950+
K = popToAPSInt(S, Call->getArg(2));
2951+
}
2952+
2953+
APSInt Imm = popToAPSInt(S, Call->getArg(1));
2954+
const Pointer &Src = S.Stk.pop<Pointer>();
2955+
const Pointer &Dst = S.Stk.peek<Pointer>();
2956+
2957+
const unsigned NumElems = Dst.getNumElems();
2958+
const PrimType ElemT = Dst.getFieldDesc()->getPrimType();
2959+
2960+
const unsigned ElemBits = 16;
2961+
const unsigned LaneElems = 128u / ElemBits;
2962+
const unsigned HalfBase = 4;
2963+
assert(NumElems % LaneElems == 0);
2964+
2965+
const uint8_t Ctl = static_cast<uint8_t>(Imm.getZExtValue());
2966+
2967+
for (unsigned i = 0; i != NumElems; ++i) {
2968+
const unsigned laneBase = (i / LaneElems) * LaneElems;
2969+
const unsigned inLane = i % LaneElems;
2970+
2971+
unsigned srcIdx;
2972+
if (inLane >= HalfBase) {
2973+
const unsigned pos = inLane - HalfBase;
2974+
const unsigned sel = (Ctl >> (2 * pos)) & 0x3;
2975+
srcIdx = laneBase + HalfBase + sel;
2976+
} else {
2977+
srcIdx = i;
2978+
}
2979+
2980+
APSInt Chosen;
2981+
INT_TYPE_SWITCH(ElemT, { Chosen = Src.elem<T>(srcIdx).toAPSInt(); });
2982+
2983+
if (!HasMask) {
2984+
INT_TYPE_SWITCH_NO_BOOL(ElemT,
2985+
{ Dst.elem<T>(i) = static_cast<T>(Chosen); });
2986+
continue;
2987+
}
2988+
2989+
const bool Keep =
2990+
(i < static_cast<unsigned>(K.getBitWidth())) ? K[i] : false;
2991+
if (Keep) {
2992+
INT_TYPE_SWITCH_NO_BOOL(ElemT,
2993+
{ Dst.elem<T>(i) = static_cast<T>(Chosen); });
2994+
} else if (IsMaskZ) {
2995+
APSInt Zero(APInt(Chosen.getBitWidth(), 0));
2996+
Zero.setIsSigned(Chosen.isSigned());
2997+
INT_TYPE_SWITCH_NO_BOOL(ElemT,
2998+
{ Dst.elem<T>(i) = static_cast<T>(Zero); });
2999+
} else {
3000+
APSInt PT;
3001+
INT_TYPE_SWITCH(ElemT, { PT = SrcPT.elem<T>(i).toAPSInt(); });
3002+
INT_TYPE_SWITCH_NO_BOOL(ElemT, { Dst.elem<T>(i) = static_cast<T>(PT); });
3003+
}
3004+
}
3005+
3006+
Dst.initializeAllElements();
3007+
return true;
3008+
}
3009+
3010+
static bool interp__builtin_ia32_pshufd_common(InterpState &S, CodePtr OpPC,
3011+
const CallExpr *Call) {
3012+
(void)OpPC;
3013+
const unsigned NumArgs = Call->getNumArgs();
3014+
assert(NumArgs == 2 || NumArgs == 3 || NumArgs == 4);
3015+
3016+
APSInt K;
3017+
Pointer SrcPT;
3018+
const bool HasMask = (NumArgs == 3) || (NumArgs == 4);
3019+
const bool IsMaskZ = (NumArgs == 3);
3020+
3021+
if (NumArgs == 4) {
3022+
K = popToAPSInt(S, Call->getArg(3));
3023+
SrcPT = S.Stk.pop<Pointer>();
3024+
} else if (NumArgs == 3) {
3025+
K = popToAPSInt(S, Call->getArg(2));
3026+
}
3027+
3028+
APSInt Imm = popToAPSInt(S, Call->getArg(1));
3029+
const Pointer &Src = S.Stk.pop<Pointer>();
3030+
const Pointer &Dst = S.Stk.peek<Pointer>();
3031+
3032+
const unsigned NumElems = Dst.getNumElems();
3033+
const PrimType ElemT = Dst.getFieldDesc()->getPrimType();
3034+
3035+
const unsigned ElemBits = 32;
3036+
const unsigned LaneElems = 128u / ElemBits;
3037+
assert(NumElems % LaneElems == 0);
3038+
3039+
const uint8_t Ctl = static_cast<uint8_t>(Imm.getZExtValue());
3040+
3041+
for (unsigned i = 0; i != NumElems; ++i) {
3042+
const unsigned laneBase = (i / LaneElems) * LaneElems;
3043+
const unsigned inLane = i % LaneElems;
3044+
const unsigned sel = (Ctl >> (2 * inLane)) & 0x3;
3045+
const unsigned srcIdx = laneBase + sel;
3046+
3047+
APSInt Chosen;
3048+
INT_TYPE_SWITCH(ElemT, { Chosen = Src.elem<T>(srcIdx).toAPSInt(); });
3049+
3050+
if (!HasMask) {
3051+
INT_TYPE_SWITCH_NO_BOOL(ElemT,
3052+
{ Dst.elem<T>(i) = static_cast<T>(Chosen); });
3053+
continue;
3054+
}
3055+
3056+
const bool Keep =
3057+
(i < static_cast<unsigned>(K.getBitWidth())) ? K[i] : false;
3058+
if (Keep) {
3059+
INT_TYPE_SWITCH_NO_BOOL(ElemT,
3060+
{ Dst.elem<T>(i) = static_cast<T>(Chosen); });
3061+
} else if (IsMaskZ) {
3062+
APSInt Zero(APInt(Chosen.getBitWidth(), 0));
3063+
Zero.setIsSigned(Chosen.isSigned());
3064+
INT_TYPE_SWITCH_NO_BOOL(ElemT,
3065+
{ Dst.elem<T>(i) = static_cast<T>(Zero); });
3066+
} else {
3067+
APSInt PT;
3068+
INT_TYPE_SWITCH(ElemT, { PT = SrcPT.elem<T>(i).toAPSInt(); });
3069+
INT_TYPE_SWITCH_NO_BOOL(ElemT, { Dst.elem<T>(i) = static_cast<T>(PT); });
3070+
}
3071+
}
3072+
3073+
Dst.initializeAllElements();
3074+
return true;
3075+
}
3076+
28653077
static bool interp__builtin_elementwise_triop(
28663078
InterpState &S, CodePtr OpPC, const CallExpr *Call,
28673079
llvm::function_ref<APInt(const APSInt &, const APSInt &, const APSInt &)>
@@ -3417,6 +3629,39 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
34173629
return interp__builtin_elementwise_int_binop(S, OpPC, Call,
34183630
llvm::APIntOps::mulhs);
34193631

3632+
case clang::X86::BI__builtin_ia32_pshuflw:
3633+
case clang::X86::BI__builtin_ia32_pshuflw256:
3634+
case clang::X86::BI__builtin_ia32_pshuflw512:
3635+
case clang::X86::BI__builtin_ia32_pshuflw128_mask:
3636+
case clang::X86::BI__builtin_ia32_pshuflw256_mask:
3637+
case clang::X86::BI__builtin_ia32_pshuflw512_mask:
3638+
case clang::X86::BI__builtin_ia32_pshuflw128_maskz:
3639+
case clang::X86::BI__builtin_ia32_pshuflw256_maskz:
3640+
case clang::X86::BI__builtin_ia32_pshuflw512_maskz:
3641+
return interp__builtin_ia32_pshuflw_common(S, OpPC, Call);
3642+
3643+
case clang::X86::BI__builtin_ia32_pshufhw:
3644+
case clang::X86::BI__builtin_ia32_pshufhw256:
3645+
case clang::X86::BI__builtin_ia32_pshufhw512:
3646+
case clang::X86::BI__builtin_ia32_pshufhw128_mask:
3647+
case clang::X86::BI__builtin_ia32_pshufhw256_mask:
3648+
case clang::X86::BI__builtin_ia32_pshufhw512_mask:
3649+
case clang::X86::BI__builtin_ia32_pshufhw128_maskz:
3650+
case clang::X86::BI__builtin_ia32_pshufhw256_maskz:
3651+
case clang::X86::BI__builtin_ia32_pshufhw512_maskz:
3652+
return interp__builtin_ia32_pshufhw_common(S, OpPC, Call);
3653+
3654+
case clang::X86::BI__builtin_ia32_pshufd:
3655+
case clang::X86::BI__builtin_ia32_pshufd256:
3656+
case clang::X86::BI__builtin_ia32_pshufd512:
3657+
case clang::X86::BI__builtin_ia32_pshufd128_mask:
3658+
case clang::X86::BI__builtin_ia32_pshufd256_mask:
3659+
case clang::X86::BI__builtin_ia32_pshufd512_mask:
3660+
case clang::X86::BI__builtin_ia32_pshufd128_maskz:
3661+
case clang::X86::BI__builtin_ia32_pshufd256_maskz:
3662+
case clang::X86::BI__builtin_ia32_pshufd512_maskz:
3663+
return interp__builtin_ia32_pshufd_common(S, OpPC, Call);
3664+
34203665
case clang::X86::BI__builtin_ia32_psllv2di:
34213666
case clang::X86::BI__builtin_ia32_psllv4di:
34223667
case clang::X86::BI__builtin_ia32_psllv4si:

0 commit comments

Comments
 (0)