Skip to content

Commit 5053a4e

Browse files
committed
[Clang] Add __builtin_selectvector
1 parent 09327ef commit 5053a4e

38 files changed

+5371
-5525
lines changed

clang/docs/LanguageExtensions.rst

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3019,6 +3019,26 @@ C-style cast applied to each element of the first argument.
30193019
30203020
Query for this feature with ``__has_builtin(__builtin_convertvector)``.
30213021
3022+
``__builtin_selectvector``
3023+
--------------------------
3024+
3025+
``__builtin_selectvector`` is used to express generic vector element selection.
3026+
3027+
**Signature**:
3028+
3029+
.. code-block:: c++
3030+
3031+
template <class T, size_t N>
3032+
simd_vec<T, N> __builtin_selectvector(simd_vec<T, N> lhs, simd_vec<T, N> rhs,
3033+
simd_vec<bool, N> cond)
3034+
3035+
**Description**:
3036+
3037+
The returned vector is equivalent to
3038+
``simd_vec<T, N>{cond[0] ? rhs[0] : lhs[0], ..., cond[N - 1] ? rhs[N - 1] : lhs[N - 1]}``.
3039+
3040+
Query for this feature with ``__has_builtin(__builtin_selectvector)``.
3041+
30223042
``__builtin_bitreverse``
30233043
------------------------
30243044

clang/include/clang/Basic/Builtins.td

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,6 +1176,12 @@ def ConvertVector : Builtin {
11761176
let Prototype = "void(...)";
11771177
}
11781178

1179+
def SelectVector : Builtin {
1180+
let Spellings = ["__builtin_selectvector"];
1181+
let Attributes = [NoThrow, Const, CustomTypeChecking];
1182+
let Prototype = "void(...)";
1183+
}
1184+
11791185
def AllocaUninitialized : Builtin {
11801186
let Spellings = ["__builtin_alloca_uninitialized"];
11811187
let Attributes = [FunctionWithBuiltinPrefix, NoThrow];

clang/include/clang/Basic/BuiltinsX86.def

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1973,30 +1973,6 @@ TARGET_BUILTIN(__builtin_ia32_vfcmulcph256_mask, "V8fV8fV8fV8fUc", "ncV:256:",
19731973
TARGET_BUILTIN(__builtin_ia32_vfcmulcph512_mask, "V16fV16fV16fV16fUsIi", "ncV:512:", "avx512fp16,evex512")
19741974

19751975
// generic select intrinsics
1976-
TARGET_BUILTIN(__builtin_ia32_selectb_128, "V16cUsV16cV16c", "ncV:128:", "avx512bw,avx512vl")
1977-
TARGET_BUILTIN(__builtin_ia32_selectb_256, "V32cUiV32cV32c", "ncV:256:", "avx512bw,avx512vl")
1978-
TARGET_BUILTIN(__builtin_ia32_selectb_512, "V64cUOiV64cV64c", "ncV:512:", "avx512bw,evex512")
1979-
TARGET_BUILTIN(__builtin_ia32_selectw_128, "V8sUcV8sV8s", "ncV:128:", "avx512bw,avx512vl")
1980-
TARGET_BUILTIN(__builtin_ia32_selectw_256, "V16sUsV16sV16s", "ncV:256:", "avx512bw,avx512vl")
1981-
TARGET_BUILTIN(__builtin_ia32_selectw_512, "V32sUiV32sV32s", "ncV:512:", "avx512bw,evex512")
1982-
TARGET_BUILTIN(__builtin_ia32_selectd_128, "V4iUcV4iV4i", "ncV:128:", "avx512vl")
1983-
TARGET_BUILTIN(__builtin_ia32_selectd_256, "V8iUcV8iV8i", "ncV:256:", "avx512vl")
1984-
TARGET_BUILTIN(__builtin_ia32_selectd_512, "V16iUsV16iV16i", "ncV:512:", "avx512f,evex512")
1985-
TARGET_BUILTIN(__builtin_ia32_selectph_128, "V8xUcV8xV8x", "ncV:128:", "avx512fp16,avx512vl")
1986-
TARGET_BUILTIN(__builtin_ia32_selectph_256, "V16xUsV16xV16x", "ncV:256:", "avx512fp16,avx512vl")
1987-
TARGET_BUILTIN(__builtin_ia32_selectph_512, "V32xUiV32xV32x", "ncV:512:", "avx512fp16,evex512")
1988-
TARGET_BUILTIN(__builtin_ia32_selectpbf_128, "V8yUcV8yV8y", "ncV:128:", "avx512bf16,avx512vl")
1989-
TARGET_BUILTIN(__builtin_ia32_selectpbf_256, "V16yUsV16yV16y", "ncV:256:", "avx512bf16,avx512vl")
1990-
TARGET_BUILTIN(__builtin_ia32_selectpbf_512, "V32yUiV32yV32y", "ncV:512:", "avx512bf16,evex512")
1991-
TARGET_BUILTIN(__builtin_ia32_selectq_128, "V2OiUcV2OiV2Oi", "ncV:128:", "avx512vl")
1992-
TARGET_BUILTIN(__builtin_ia32_selectq_256, "V4OiUcV4OiV4Oi", "ncV:256:", "avx512vl")
1993-
TARGET_BUILTIN(__builtin_ia32_selectq_512, "V8OiUcV8OiV8Oi", "ncV:512:", "avx512f,evex512")
1994-
TARGET_BUILTIN(__builtin_ia32_selectps_128, "V4fUcV4fV4f", "ncV:128:", "avx512vl")
1995-
TARGET_BUILTIN(__builtin_ia32_selectps_256, "V8fUcV8fV8f", "ncV:256:", "avx512vl")
1996-
TARGET_BUILTIN(__builtin_ia32_selectps_512, "V16fUsV16fV16f", "ncV:512:", "avx512f,evex512")
1997-
TARGET_BUILTIN(__builtin_ia32_selectpd_128, "V2dUcV2dV2d", "ncV:128:", "avx512vl")
1998-
TARGET_BUILTIN(__builtin_ia32_selectpd_256, "V4dUcV4dV4d", "ncV:256:", "avx512vl")
1999-
TARGET_BUILTIN(__builtin_ia32_selectpd_512, "V8dUcV8dV8d", "ncV:512:", "avx512f,evex512")
20001976
TARGET_BUILTIN(__builtin_ia32_selectsh_128, "V8xUcV8xV8x", "ncV:128:", "avx512fp16")
20011977
TARGET_BUILTIN(__builtin_ia32_selectsbf_128, "V8yUcV8yV8y", "ncV:128:", "avx512bf16")
20021978
TARGET_BUILTIN(__builtin_ia32_selectss_128, "V4fUcV4fV4f", "ncV:128:", "avx512f")

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12035,7 +12035,9 @@ def err_builtin_invalid_arg_type: Error <
1203512035
"a floating point type|"
1203612036
"a vector of integers|"
1203712037
"an unsigned integer|"
12038-
"an 'int'}1 (was %2)">;
12038+
"an 'int'|"
12039+
"a vector of bools"
12040+
"}1 (was %2)">;
1203912041

1204012042
def err_builtin_matrix_disabled: Error<
1204112043
"matrix types extension is disabled. Pass -fenable-matrix to enable it">;

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 6 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3744,6 +3744,12 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
37443744
return RValue::get(Result);
37453745
}
37463746

3747+
case Builtin::BI__builtin_selectvector: {
3748+
return RValue::get(Builder.CreateSelect(EmitScalarExpr(E->getArg(2)),
3749+
EmitScalarExpr(E->getArg(0)),
3750+
EmitScalarExpr(E->getArg(1))));
3751+
}
3752+
37473753
case Builtin::BI__builtin_elementwise_abs: {
37483754
Value *Result;
37493755
QualType QT = E->getArg(0)->getType();
@@ -15513,31 +15519,6 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
1551315519
case X86::BI__builtin_ia32_prorvq256:
1551415520
case X86::BI__builtin_ia32_prorvq512:
1551515521
return EmitX86FunnelShift(*this, Ops[0], Ops[0], Ops[1], true);
15516-
case X86::BI__builtin_ia32_selectb_128:
15517-
case X86::BI__builtin_ia32_selectb_256:
15518-
case X86::BI__builtin_ia32_selectb_512:
15519-
case X86::BI__builtin_ia32_selectw_128:
15520-
case X86::BI__builtin_ia32_selectw_256:
15521-
case X86::BI__builtin_ia32_selectw_512:
15522-
case X86::BI__builtin_ia32_selectd_128:
15523-
case X86::BI__builtin_ia32_selectd_256:
15524-
case X86::BI__builtin_ia32_selectd_512:
15525-
case X86::BI__builtin_ia32_selectq_128:
15526-
case X86::BI__builtin_ia32_selectq_256:
15527-
case X86::BI__builtin_ia32_selectq_512:
15528-
case X86::BI__builtin_ia32_selectph_128:
15529-
case X86::BI__builtin_ia32_selectph_256:
15530-
case X86::BI__builtin_ia32_selectph_512:
15531-
case X86::BI__builtin_ia32_selectpbf_128:
15532-
case X86::BI__builtin_ia32_selectpbf_256:
15533-
case X86::BI__builtin_ia32_selectpbf_512:
15534-
case X86::BI__builtin_ia32_selectps_128:
15535-
case X86::BI__builtin_ia32_selectps_256:
15536-
case X86::BI__builtin_ia32_selectps_512:
15537-
case X86::BI__builtin_ia32_selectpd_128:
15538-
case X86::BI__builtin_ia32_selectpd_256:
15539-
case X86::BI__builtin_ia32_selectpd_512:
15540-
return EmitX86Select(*this, Ops[0], Ops[1], Ops[2]);
1554115522
case X86::BI__builtin_ia32_selectsh_128:
1554215523
case X86::BI__builtin_ia32_selectsbf_128:
1554315524
case X86::BI__builtin_ia32_selectss_128:

clang/lib/Headers/avx512bf16intrin.h

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,9 @@ _mm512_cvtne2ps_pbh(__m512 __A, __m512 __B) {
7777
/// conversion of __B, and higher 256 bits come from conversion of __A.
7878
static __inline__ __m512bh __DEFAULT_FN_ATTRS512
7979
_mm512_mask_cvtne2ps_pbh(__m512bh __W, __mmask32 __U, __m512 __A, __m512 __B) {
80-
return (__m512bh)__builtin_ia32_selectpbf_512((__mmask32)__U,
81-
(__v32bf)_mm512_cvtne2ps_pbh(__A, __B),
82-
(__v32bf)__W);
80+
return (__m512bh)__builtin_selectvector(
81+
(__v32bf)_mm512_cvtne2ps_pbh(__A, __B), (__v32bf)__W,
82+
__builtin_bit_cast(__vecmask32, __U));
8383
}
8484

8585
/// Convert Two Packed Single Data to One Packed BF16 Data.
@@ -99,9 +99,9 @@ _mm512_mask_cvtne2ps_pbh(__m512bh __W, __mmask32 __U, __m512 __A, __m512 __B) {
9999
/// conversion of __B, and higher 256 bits come from conversion of __A.
100100
static __inline__ __m512bh __DEFAULT_FN_ATTRS512
101101
_mm512_maskz_cvtne2ps_pbh(__mmask32 __U, __m512 __A, __m512 __B) {
102-
return (__m512bh)__builtin_ia32_selectpbf_512((__mmask32)__U,
103-
(__v32bf)_mm512_cvtne2ps_pbh(__A, __B),
104-
(__v32bf)_mm512_setzero_si512());
102+
return (__m512bh)__builtin_selectvector(
103+
(__v32bf)_mm512_cvtne2ps_pbh(__A, __B), (__v32bf)_mm512_setzero_si512(),
104+
__builtin_bit_cast(__vecmask32, __U));
105105
}
106106

107107
/// Convert Packed Single Data to Packed BF16 Data.
@@ -200,9 +200,9 @@ _mm512_dpbf16_ps(__m512 __D, __m512bh __A, __m512bh __B) {
200200
/// __A, __B and __D
201201
static __inline__ __m512 __DEFAULT_FN_ATTRS512
202202
_mm512_mask_dpbf16_ps(__m512 __D, __mmask16 __U, __m512bh __A, __m512bh __B) {
203-
return (__m512)__builtin_ia32_selectps_512((__mmask16)__U,
204-
(__v16sf)_mm512_dpbf16_ps(__D, __A, __B),
205-
(__v16sf)__D);
203+
return (__m512)__builtin_selectvector(
204+
(__v16sf)_mm512_dpbf16_ps(__D, __A, __B), (__v16sf)__D,
205+
__builtin_bit_cast(__vecmask16, __U));
206206
}
207207

208208
/// Dot Product of BF16 Pairs Accumulated into Packed Single Precision.
@@ -224,9 +224,9 @@ _mm512_mask_dpbf16_ps(__m512 __D, __mmask16 __U, __m512bh __A, __m512bh __B) {
224224
/// __A, __B and __D
225225
static __inline__ __m512 __DEFAULT_FN_ATTRS512
226226
_mm512_maskz_dpbf16_ps(__mmask16 __U, __m512 __D, __m512bh __A, __m512bh __B) {
227-
return (__m512)__builtin_ia32_selectps_512((__mmask16)__U,
228-
(__v16sf)_mm512_dpbf16_ps(__D, __A, __B),
229-
(__v16sf)_mm512_setzero_si512());
227+
return (__m512)__builtin_selectvector(
228+
(__v16sf)_mm512_dpbf16_ps(__D, __A, __B), (__v16sf)_mm512_setzero_si512(),
229+
__builtin_bit_cast(__vecmask16, __U));
230230
}
231231

232232
/// Convert Packed BF16 Data to Packed float Data.

clang/lib/Headers/avx512bitalgintrin.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ _mm512_popcnt_epi16(__m512i __A)
2929
static __inline__ __m512i __DEFAULT_FN_ATTRS
3030
_mm512_mask_popcnt_epi16(__m512i __A, __mmask32 __U, __m512i __B)
3131
{
32-
return (__m512i) __builtin_ia32_selectw_512((__mmask32) __U,
33-
(__v32hi) _mm512_popcnt_epi16(__B),
34-
(__v32hi) __A);
32+
return (__m512i)__builtin_selectvector((__v32hi)_mm512_popcnt_epi16(__B),
33+
(__v32hi)__A,
34+
__builtin_bit_cast(__vecmask32, __U));
3535
}
3636

3737
static __inline__ __m512i __DEFAULT_FN_ATTRS
@@ -51,9 +51,9 @@ _mm512_popcnt_epi8(__m512i __A)
5151
static __inline__ __m512i __DEFAULT_FN_ATTRS
5252
_mm512_mask_popcnt_epi8(__m512i __A, __mmask64 __U, __m512i __B)
5353
{
54-
return (__m512i) __builtin_ia32_selectb_512((__mmask64) __U,
55-
(__v64qi) _mm512_popcnt_epi8(__B),
56-
(__v64qi) __A);
54+
return (__m512i)__builtin_selectvector((__v64qi)_mm512_popcnt_epi8(__B),
55+
(__v64qi)__A,
56+
__builtin_bit_cast(__vecmask64, __U));
5757
}
5858

5959
static __inline__ __m512i __DEFAULT_FN_ATTRS

0 commit comments

Comments
 (0)