Skip to content

Commit 5082638

Browse files
authored
[Clang] Start moving X86Builtins.def to X86Builtins.td (#106005)
This starts moving `X86Builtins.def` to be a tablegen file. It's quite large, so I think it'd be good to move things in multiple steps to avoid a bunch of merge conflicts due to the amount of time this takes to complete.
1 parent 602f436 commit 5082638

File tree

7 files changed

+160
-129
lines changed

7 files changed

+160
-129
lines changed

clang/include/clang/Basic/BuiltinsBase.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ def ConstIgnoringExceptions : Attribute<"g">;
6060
// This function requires a specific header or an explicit declaration.
6161
def RequireDeclaration : Attribute<"h">;
6262

63+
// FIXME: Why is this not simply the min_vector_width attribute?
64+
// Vector has to be at least N bits wide.
65+
class RequiredVectorWidth<int N> : IndexedAttribute<"V", N>;
66+
6367
class PrintfFormat<int I> : IndexedAttribute<"p", I>;
6468
class VPrintfFormat<int I> : IndexedAttribute<"P", I>;
6569
class ScanfFormat<int I> : IndexedAttribute<"s", I>;

clang/include/clang/Basic/BuiltinsX86.def

Lines changed: 0 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,6 @@
2626
# define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANG, FEATURE) BUILTIN(ID, TYPE, ATTRS)
2727
#endif
2828

29-
// Undefined Values
30-
//
31-
TARGET_BUILTIN(__builtin_ia32_undef128, "V2d", "ncV:128:", "")
32-
TARGET_BUILTIN(__builtin_ia32_undef256, "V4d", "ncV:256:", "")
33-
TARGET_BUILTIN(__builtin_ia32_undef512, "V8d", "ncV:512:", "")
34-
35-
// FLAGS
36-
//
37-
TARGET_BUILTIN(__builtin_ia32_readeflags_u32, "Ui", "n", "")
38-
TARGET_BUILTIN(__builtin_ia32_writeeflags_u32, "vUi", "n", "")
39-
4029
// MMX
4130
//
4231
// All MMX instructions will be generated via builtins. Any MMX vector
@@ -46,113 +35,8 @@ TARGET_BUILTIN(__builtin_ia32_writeeflags_u32, "vUi", "n", "")
4635
// argument and our prior approach of using a #define to the current built-in
4736
// doesn't work in the presence of re-declaration of _mm_prefetch for windows.
4837
TARGET_BUILTIN(_mm_prefetch, "vcC*i", "nc", "mmx")
49-
TARGET_BUILTIN(__builtin_ia32_emms, "v", "n", "mmx")
50-
TARGET_BUILTIN(__builtin_ia32_vec_ext_v4hi, "sV4sIi", "ncV:64:", "sse")
51-
TARGET_BUILTIN(__builtin_ia32_vec_set_v4hi, "V4sV4ssIi", "ncV:64:", "sse")
5238

5339
// SSE intrinsics.
54-
TARGET_BUILTIN(__builtin_ia32_comieq, "iV4fV4f", "ncV:128:", "sse")
55-
TARGET_BUILTIN(__builtin_ia32_comilt, "iV4fV4f", "ncV:128:", "sse")
56-
TARGET_BUILTIN(__builtin_ia32_comile, "iV4fV4f", "ncV:128:", "sse")
57-
TARGET_BUILTIN(__builtin_ia32_comigt, "iV4fV4f", "ncV:128:", "sse")
58-
TARGET_BUILTIN(__builtin_ia32_comige, "iV4fV4f", "ncV:128:", "sse")
59-
TARGET_BUILTIN(__builtin_ia32_comineq, "iV4fV4f", "ncV:128:", "sse")
60-
TARGET_BUILTIN(__builtin_ia32_ucomieq, "iV4fV4f", "ncV:128:", "sse")
61-
TARGET_BUILTIN(__builtin_ia32_ucomilt, "iV4fV4f", "ncV:128:", "sse")
62-
TARGET_BUILTIN(__builtin_ia32_ucomile, "iV4fV4f", "ncV:128:", "sse")
63-
TARGET_BUILTIN(__builtin_ia32_ucomigt, "iV4fV4f", "ncV:128:", "sse")
64-
TARGET_BUILTIN(__builtin_ia32_ucomige, "iV4fV4f", "ncV:128:", "sse")
65-
TARGET_BUILTIN(__builtin_ia32_ucomineq, "iV4fV4f", "ncV:128:", "sse")
66-
67-
TARGET_BUILTIN(__builtin_ia32_comisdeq, "iV2dV2d", "ncV:128:", "sse2")
68-
TARGET_BUILTIN(__builtin_ia32_comisdlt, "iV2dV2d", "ncV:128:", "sse2")
69-
TARGET_BUILTIN(__builtin_ia32_comisdle, "iV2dV2d", "ncV:128:", "sse2")
70-
TARGET_BUILTIN(__builtin_ia32_comisdgt, "iV2dV2d", "ncV:128:", "sse2")
71-
TARGET_BUILTIN(__builtin_ia32_comisdge, "iV2dV2d", "ncV:128:", "sse2")
72-
TARGET_BUILTIN(__builtin_ia32_comisdneq, "iV2dV2d", "ncV:128:", "sse2")
73-
TARGET_BUILTIN(__builtin_ia32_ucomisdeq, "iV2dV2d", "ncV:128:", "sse2")
74-
TARGET_BUILTIN(__builtin_ia32_ucomisdlt, "iV2dV2d", "ncV:128:", "sse2")
75-
TARGET_BUILTIN(__builtin_ia32_ucomisdle, "iV2dV2d", "ncV:128:", "sse2")
76-
TARGET_BUILTIN(__builtin_ia32_ucomisdgt, "iV2dV2d", "ncV:128:", "sse2")
77-
TARGET_BUILTIN(__builtin_ia32_ucomisdge, "iV2dV2d", "ncV:128:", "sse2")
78-
TARGET_BUILTIN(__builtin_ia32_ucomisdneq, "iV2dV2d", "ncV:128:", "sse2")
79-
80-
TARGET_BUILTIN(__builtin_ia32_cmpeqps, "V4fV4fV4f", "ncV:128:", "sse")
81-
TARGET_BUILTIN(__builtin_ia32_cmpltps, "V4fV4fV4f", "ncV:128:", "sse")
82-
TARGET_BUILTIN(__builtin_ia32_cmpleps, "V4fV4fV4f", "ncV:128:", "sse")
83-
TARGET_BUILTIN(__builtin_ia32_cmpunordps, "V4fV4fV4f", "ncV:128:", "sse")
84-
TARGET_BUILTIN(__builtin_ia32_cmpneqps, "V4fV4fV4f", "ncV:128:", "sse")
85-
TARGET_BUILTIN(__builtin_ia32_cmpnltps, "V4fV4fV4f", "ncV:128:", "sse")
86-
TARGET_BUILTIN(__builtin_ia32_cmpnleps, "V4fV4fV4f", "ncV:128:", "sse")
87-
TARGET_BUILTIN(__builtin_ia32_cmpordps, "V4fV4fV4f", "ncV:128:", "sse")
88-
TARGET_BUILTIN(__builtin_ia32_cmpeqss, "V4fV4fV4f", "ncV:128:", "sse")
89-
TARGET_BUILTIN(__builtin_ia32_cmpltss, "V4fV4fV4f", "ncV:128:", "sse")
90-
TARGET_BUILTIN(__builtin_ia32_cmpless, "V4fV4fV4f", "ncV:128:", "sse")
91-
TARGET_BUILTIN(__builtin_ia32_cmpunordss, "V4fV4fV4f", "ncV:128:", "sse")
92-
TARGET_BUILTIN(__builtin_ia32_cmpneqss, "V4fV4fV4f", "ncV:128:", "sse")
93-
TARGET_BUILTIN(__builtin_ia32_cmpnltss, "V4fV4fV4f", "ncV:128:", "sse")
94-
TARGET_BUILTIN(__builtin_ia32_cmpnless, "V4fV4fV4f", "ncV:128:", "sse")
95-
TARGET_BUILTIN(__builtin_ia32_cmpordss, "V4fV4fV4f", "ncV:128:", "sse")
96-
TARGET_BUILTIN(__builtin_ia32_minps, "V4fV4fV4f", "ncV:128:", "sse")
97-
TARGET_BUILTIN(__builtin_ia32_maxps, "V4fV4fV4f", "ncV:128:", "sse")
98-
TARGET_BUILTIN(__builtin_ia32_minss, "V4fV4fV4f", "ncV:128:", "sse")
99-
TARGET_BUILTIN(__builtin_ia32_maxss, "V4fV4fV4f", "ncV:128:", "sse")
100-
TARGET_BUILTIN(__builtin_ia32_cmpps, "V4fV4fV4fIc", "ncV:128:", "sse")
101-
TARGET_BUILTIN(__builtin_ia32_cmpss, "V4fV4fV4fIc", "ncV:128:", "sse")
102-
103-
TARGET_BUILTIN(__builtin_ia32_cmpeqpd, "V2dV2dV2d", "ncV:128:", "sse2")
104-
TARGET_BUILTIN(__builtin_ia32_cmpltpd, "V2dV2dV2d", "ncV:128:", "sse2")
105-
TARGET_BUILTIN(__builtin_ia32_cmplepd, "V2dV2dV2d", "ncV:128:", "sse2")
106-
TARGET_BUILTIN(__builtin_ia32_cmpunordpd, "V2dV2dV2d", "ncV:128:", "sse2")
107-
TARGET_BUILTIN(__builtin_ia32_cmpneqpd, "V2dV2dV2d", "ncV:128:", "sse2")
108-
TARGET_BUILTIN(__builtin_ia32_cmpnltpd, "V2dV2dV2d", "ncV:128:", "sse2")
109-
TARGET_BUILTIN(__builtin_ia32_cmpnlepd, "V2dV2dV2d", "ncV:128:", "sse2")
110-
TARGET_BUILTIN(__builtin_ia32_cmpordpd, "V2dV2dV2d", "ncV:128:", "sse2")
111-
TARGET_BUILTIN(__builtin_ia32_cmpeqsd, "V2dV2dV2d", "ncV:128:", "sse2")
112-
TARGET_BUILTIN(__builtin_ia32_cmpltsd, "V2dV2dV2d", "ncV:128:", "sse2")
113-
TARGET_BUILTIN(__builtin_ia32_cmplesd, "V2dV2dV2d", "ncV:128:", "sse2")
114-
TARGET_BUILTIN(__builtin_ia32_cmpunordsd, "V2dV2dV2d", "ncV:128:", "sse2")
115-
TARGET_BUILTIN(__builtin_ia32_cmpneqsd, "V2dV2dV2d", "ncV:128:", "sse2")
116-
TARGET_BUILTIN(__builtin_ia32_cmpnltsd, "V2dV2dV2d", "ncV:128:", "sse2")
117-
TARGET_BUILTIN(__builtin_ia32_cmpnlesd, "V2dV2dV2d", "ncV:128:", "sse2")
118-
TARGET_BUILTIN(__builtin_ia32_cmpordsd, "V2dV2dV2d", "ncV:128:", "sse2")
119-
TARGET_BUILTIN(__builtin_ia32_cmpsd, "V2dV2dV2dIc", "ncV:128:", "sse2")
120-
TARGET_BUILTIN(__builtin_ia32_cmppd, "V2dV2dV2dIc", "ncV:128:", "sse2")
121-
TARGET_BUILTIN(__builtin_ia32_minpd, "V2dV2dV2d", "ncV:128:", "sse2")
122-
TARGET_BUILTIN(__builtin_ia32_maxpd, "V2dV2dV2d", "ncV:128:", "sse2")
123-
TARGET_BUILTIN(__builtin_ia32_minsd, "V2dV2dV2d", "ncV:128:", "sse2")
124-
TARGET_BUILTIN(__builtin_ia32_maxsd, "V2dV2dV2d", "ncV:128:", "sse2")
125-
TARGET_BUILTIN(__builtin_ia32_pmulhw128, "V8sV8sV8s", "ncV:128:", "sse2")
126-
TARGET_BUILTIN(__builtin_ia32_pavgb128, "V16cV16cV16c", "ncV:128:", "sse2")
127-
TARGET_BUILTIN(__builtin_ia32_pavgw128, "V8sV8sV8s", "ncV:128:", "sse2")
128-
TARGET_BUILTIN(__builtin_ia32_packsswb128, "V16cV8sV8s", "ncV:128:", "sse2")
129-
TARGET_BUILTIN(__builtin_ia32_packssdw128, "V8sV4iV4i", "ncV:128:", "sse2")
130-
TARGET_BUILTIN(__builtin_ia32_packuswb128, "V16cV8sV8s", "ncV:128:", "sse2")
131-
TARGET_BUILTIN(__builtin_ia32_pmulhuw128, "V8sV8sV8s", "ncV:128:", "sse2")
132-
TARGET_BUILTIN(__builtin_ia32_vec_ext_v2di, "OiV2OiIi", "ncV:128:", "sse2")
133-
TARGET_BUILTIN(__builtin_ia32_vec_ext_v4si, "iV4iIi", "ncV:128:", "sse2")
134-
TARGET_BUILTIN(__builtin_ia32_vec_ext_v4sf, "fV4fIi", "ncV:128:", "sse2")
135-
TARGET_BUILTIN(__builtin_ia32_vec_ext_v8hi, "sV8sIi", "ncV:128:", "sse2")
136-
TARGET_BUILTIN(__builtin_ia32_vec_set_v8hi, "V8sV8ssIi", "ncV:128:", "sse2")
137-
138-
TARGET_BUILTIN(__builtin_ia32_addsubps, "V4fV4fV4f", "ncV:128:", "sse3")
139-
TARGET_BUILTIN(__builtin_ia32_addsubpd, "V2dV2dV2d", "ncV:128:", "sse3")
140-
TARGET_BUILTIN(__builtin_ia32_haddps, "V4fV4fV4f", "ncV:128:", "sse3")
141-
TARGET_BUILTIN(__builtin_ia32_haddpd, "V2dV2dV2d", "ncV:128:", "sse3")
142-
TARGET_BUILTIN(__builtin_ia32_hsubps, "V4fV4fV4f", "ncV:128:", "sse3")
143-
TARGET_BUILTIN(__builtin_ia32_hsubpd, "V2dV2dV2d", "ncV:128:", "sse3")
144-
TARGET_BUILTIN(__builtin_ia32_phaddw128, "V8sV8sV8s", "ncV:128:", "ssse3")
145-
TARGET_BUILTIN(__builtin_ia32_phaddd128, "V4iV4iV4i", "ncV:128:", "ssse3")
146-
TARGET_BUILTIN(__builtin_ia32_phaddsw128, "V8sV8sV8s", "ncV:128:", "ssse3")
147-
TARGET_BUILTIN(__builtin_ia32_phsubw128, "V8sV8sV8s", "ncV:128:", "ssse3")
148-
TARGET_BUILTIN(__builtin_ia32_phsubd128, "V4iV4iV4i", "ncV:128:", "ssse3")
149-
TARGET_BUILTIN(__builtin_ia32_phsubsw128, "V8sV8sV8s", "ncV:128:", "ssse3")
150-
TARGET_BUILTIN(__builtin_ia32_pmaddubsw128, "V8sV16cV16c", "ncV:128:", "ssse3")
151-
TARGET_BUILTIN(__builtin_ia32_pmulhrsw128, "V8sV8sV8s", "ncV:128:", "ssse3")
152-
TARGET_BUILTIN(__builtin_ia32_pshufb128, "V16cV16cV16c", "ncV:128:", "ssse3")
153-
TARGET_BUILTIN(__builtin_ia32_psignb128, "V16cV16cV16c", "ncV:128:", "ssse3")
154-
TARGET_BUILTIN(__builtin_ia32_psignw128, "V8sV8sV8s", "ncV:128:", "ssse3")
155-
TARGET_BUILTIN(__builtin_ia32_psignd128, "V4iV4iV4i", "ncV:128:", "ssse3")
15640

15741
TARGET_BUILTIN(__builtin_ia32_ldmxcsr, "vUi", "n", "sse")
15842
TARGET_HEADER_BUILTIN(_mm_setcsr, "vUi", "nh",XMMINTRIN_H, ALL_LANGUAGES, "sse")
@@ -316,16 +200,6 @@ TARGET_BUILTIN(__builtin_ia32_pclmulqdq256, "V4OiV4OiV4OiIc", "ncV:256:", "vpclm
316200
TARGET_BUILTIN(__builtin_ia32_pclmulqdq512, "V8OiV8OiV8OiIc", "ncV:512:", "avx512f,evex512,vpclmulqdq")
317201

318202
// AVX
319-
TARGET_BUILTIN(__builtin_ia32_addsubpd256, "V4dV4dV4d", "ncV:256:", "avx")
320-
TARGET_BUILTIN(__builtin_ia32_addsubps256, "V8fV8fV8f", "ncV:256:", "avx")
321-
TARGET_BUILTIN(__builtin_ia32_haddpd256, "V4dV4dV4d", "ncV:256:", "avx")
322-
TARGET_BUILTIN(__builtin_ia32_hsubps256, "V8fV8fV8f", "ncV:256:", "avx")
323-
TARGET_BUILTIN(__builtin_ia32_hsubpd256, "V4dV4dV4d", "ncV:256:", "avx")
324-
TARGET_BUILTIN(__builtin_ia32_haddps256, "V8fV8fV8f", "ncV:256:", "avx")
325-
TARGET_BUILTIN(__builtin_ia32_maxpd256, "V4dV4dV4d", "ncV:256:", "avx")
326-
TARGET_BUILTIN(__builtin_ia32_maxps256, "V8fV8fV8f", "ncV:256:", "avx")
327-
TARGET_BUILTIN(__builtin_ia32_minpd256, "V4dV4dV4d", "ncV:256:", "avx")
328-
TARGET_BUILTIN(__builtin_ia32_minps256, "V8fV8fV8f", "ncV:256:", "avx")
329203
TARGET_BUILTIN(__builtin_ia32_vpermilvarpd, "V2dV2dV2Oi", "ncV:256:", "avx")
330204
TARGET_BUILTIN(__builtin_ia32_vpermilvarps, "V4fV4fV4i", "ncV:256:", "avx")
331205
TARGET_BUILTIN(__builtin_ia32_vpermilvarpd256, "V4dV4dV4Oi", "ncV:256:", "avx")
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
//===--- BuiltinsX86.td - X86 Builtin function database ---------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// This file defines the X86-specific builtin function database.
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
include "clang/Basic/BuiltinsBase.td"
14+
15+
class X86Builtin<string prototype> : TargetBuiltin {
16+
let Spellings = ["__builtin_ia32_" # NAME];
17+
let Prototype = prototype;
18+
}
19+
20+
// Undefined Values
21+
def undef128 : X86Builtin<"_Vector<2, double>()"> {
22+
let Attributes = [Const, NoThrow, RequiredVectorWidth<128>];
23+
}
24+
25+
def undef256 : X86Builtin<"_Vector<4, double>()"> {
26+
let Attributes = [Const, NoThrow, RequiredVectorWidth<256>];
27+
}
28+
29+
def undef512 : X86Builtin<"_Vector<8, double>()"> {
30+
let Attributes = [Const, NoThrow, RequiredVectorWidth<512>];
31+
}
32+
33+
// FLAGS
34+
def readeflags_u32 : X86Builtin<"unsigned int()"> {
35+
let Attributes = [NoThrow];
36+
}
37+
38+
def writeeflags_u32 : X86Builtin<"void(unsigned int)"> {
39+
let Attributes = [NoThrow];
40+
}
41+
42+
// MMX
43+
//
44+
// All MMX instructions will be generated via builtins. Any MMX vector
45+
// types (<1 x i64>, <2 x i32>, etc.) that aren't used by these builtins will be
46+
// expanded by the back-end.
47+
48+
def emms : X86Builtin<"void()"> {
49+
let Attributes = [NoThrow];
50+
let Features = "mmx";
51+
}
52+
53+
let Attributes = [NoThrow, Const, RequiredVectorWidth<64>], Features = "sse" in {
54+
def vec_ext_v4hi : X86Builtin<"short(_Vector<4, short>, _Constant int)">;
55+
def vec_set_v4hi : X86Builtin<"_Vector<4, short>(_Vector<4, short>, short, _Constant int)">;
56+
}
57+
58+
// SSE intrinsics
59+
let Attributes = [Const, NoThrow, RequiredVectorWidth<128>] in {
60+
foreach Cmp = ["eq", "lt", "le", "gt", "ge", "neq"] in {
61+
let Features = "sse" in {
62+
def comi#Cmp : X86Builtin<"int(_Vector<4, float>, _Vector<4, float>)">;
63+
def ucomi#Cmp : X86Builtin<"int(_Vector<4, float>, _Vector<4, float>)">;
64+
}
65+
let Features = "sse2" in {
66+
def comisd#Cmp : X86Builtin<"int(_Vector<2, double>, _Vector<2, double>)">;
67+
def ucomisd#Cmp : X86Builtin<"int(_Vector<2, double>, _Vector<2, double>)">;
68+
}
69+
}
70+
71+
foreach Cmp = ["cmpeq", "cmplt", "cmple", "cmpunord", "cmpneq", "cmpnlt",
72+
"cmpnle", "cmpord", "min", "max"] in {
73+
let Features = "sse" in {
74+
def Cmp#ps : X86Builtin<"_Vector<4, float>(_Vector<4, float>, _Vector<4, float>)">;
75+
def Cmp#ss : X86Builtin<"_Vector<4, float>(_Vector<4, float>, _Vector<4, float>)">;
76+
}
77+
let Features = "sse2" in {
78+
def Cmp#pd : X86Builtin<"_Vector<2, double>(_Vector<2, double>, _Vector<2, double>)">;
79+
def Cmp#sd : X86Builtin<"_Vector<2, double>(_Vector<2, double>, _Vector<2, double>)">;
80+
}
81+
}
82+
83+
let Features = "sse" in {
84+
def cmpps : X86Builtin<"_Vector<4, float>(_Vector<4, float>, _Vector<4, float>, _Constant char)">;
85+
def cmpss : X86Builtin<"_Vector<4, float>(_Vector<4, float>, _Vector<4, float>, _Constant char)">;
86+
}
87+
88+
let Features = "sse2" in {
89+
def cmppd : X86Builtin<"_Vector<2, double>(_Vector<2, double>, _Vector<2, double>, _Constant char)">;
90+
def cmpsd : X86Builtin<"_Vector<2, double>(_Vector<2, double>, _Vector<2, double>, _Constant char)">;
91+
}
92+
93+
let Features = "sse2" in {
94+
def pmulhw128 : X86Builtin<"_Vector<8, short>(_Vector<8, short>, _Vector<8, short>)">;
95+
def pavgb128 : X86Builtin<"_Vector<16, char>(_Vector<16, char>, _Vector<16, char>)">;
96+
def pavgw128 : X86Builtin<"_Vector<8, short>(_Vector<8, short>, _Vector<8, short>)">;
97+
def packsswb128 : X86Builtin<"_Vector<16, char>(_Vector<8, short>, _Vector<8, short>)">;
98+
def packssdw128 : X86Builtin<"_Vector<8, short>(_Vector<4, int>, _Vector<4, int>)">;
99+
def packuswb128 : X86Builtin<"_Vector<16, char>(_Vector<8, short>, _Vector<8, short>)">;
100+
def pmulhuw128 : X86Builtin<"_Vector<8, short>(_Vector<8, short>, _Vector<8, short>)">;
101+
def vec_ext_v2di : X86Builtin<"long long int(_Vector<2, long long int>, _Constant int)">;
102+
def vec_ext_v4si : X86Builtin<"int(_Vector<4, int>, _Constant int)">;
103+
def vec_ext_v4sf : X86Builtin<"float(_Vector<4, float>, _Constant int)">;
104+
def vec_ext_v8hi : X86Builtin<"short(_Vector<8, short>, _Constant int)">;
105+
def vec_set_v8hi : X86Builtin<"_Vector<8, short>(_Vector<8, short>, short, _Constant int)">;
106+
}
107+
108+
let Features = "sse3" in {
109+
foreach Op = ["addsub", "hadd", "hsub"] in {
110+
def Op#ps : X86Builtin<"_Vector<4, float>(_Vector<4, float>, _Vector<4, float>)">;
111+
def Op#pd : X86Builtin<"_Vector<2, double>(_Vector<2, double>, _Vector<2, double>)">;
112+
}
113+
}
114+
115+
let Features = "ssse3" in {
116+
foreach Op = ["phadd", "phsub"] in {
117+
def Op#w128 : X86Builtin<"_Vector<8, short>(_Vector<8, short>, _Vector<8, short>)">;
118+
def Op#sw128 : X86Builtin<"_Vector<8, short>(_Vector<8, short>, _Vector<8, short>)">;
119+
def Op#d128 : X86Builtin<"_Vector<4, int>(_Vector<4, int>, _Vector<4, int>)">;
120+
}
121+
122+
def pmaddubsw128 : X86Builtin<"_Vector<8, short>(_Vector<16, char>, _Vector<16, char>)">;
123+
def pmulhrsw128 : X86Builtin<"_Vector<8, short>(_Vector<8, short>, _Vector<8, short>)">;
124+
def pshufb128 : X86Builtin<"_Vector<16, char>(_Vector<16, char>, _Vector<16, char>)">;
125+
def psignb128 : X86Builtin<"_Vector<16, char>(_Vector<16, char>, _Vector<16, char>)">;
126+
def psignw128 : X86Builtin<"_Vector<8, short>(_Vector<8, short>, _Vector<8, short>)">;
127+
def psignd128 : X86Builtin<"_Vector<4, int>(_Vector<4, int>, _Vector<4, int>)">;
128+
}
129+
}
130+
131+
// AVX
132+
let Attributes = [Const, NoThrow, RequiredVectorWidth<256>], Features = "avx" in {
133+
foreach Op = ["addsub", "hadd", "hsub", "max", "min"] in {
134+
def Op#pd256 : X86Builtin<"_Vector<4, double>(_Vector<4, double>, _Vector<4, double>)">;
135+
def Op#ps256 : X86Builtin<"_Vector<8, float>(_Vector<8, float>, _Vector<8, float>)">;
136+
}
137+
}

clang/include/clang/Basic/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ clang_tablegen(BuiltinsRISCV.inc -gen-clang-builtins
6060
SOURCE BuiltinsRISCV.td
6161
TARGET ClangBuiltinsRISCV)
6262

63+
clang_tablegen(BuiltinsX86.inc -gen-clang-builtins
64+
SOURCE BuiltinsX86.td
65+
TARGET ClangBuiltinsX86)
66+
6367
# ARM NEON and MVE
6468
clang_tablegen(arm_neon.inc -gen-arm-neon-sema
6569
SOURCE arm_neon.td

clang/include/clang/Basic/TargetBuiltins.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ namespace clang {
125125
LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
126126
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
127127
#include "clang/Basic/BuiltinsX86.def"
128+
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,
129+
#include "clang/Basic/BuiltinsX86.inc"
128130
FirstX86_64Builtin,
129131
LastX86CommonBuiltin = FirstX86_64Builtin - 1,
130132
#define BUILTIN(ID, TYPE, ATTRS) BI##ID,

clang/lib/Basic/Targets/X86.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ static constexpr Builtin::Info BuiltinInfoX86[] = {
3232
{#ID, TYPE, ATTRS, FEATURE, HeaderDesc::HEADER, LANGS},
3333
#include "clang/Basic/BuiltinsX86.def"
3434

35+
#define BUILTIN(ID, TYPE, ATTRS) \
36+
{#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
37+
#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
38+
{#ID, TYPE, ATTRS, FEATURE, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
39+
#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
40+
{#ID, TYPE, ATTRS, FEATURE, HeaderDesc::HEADER, LANGS},
41+
#include "clang/Basic/BuiltinsX86.inc"
42+
3543
#define BUILTIN(ID, TYPE, ATTRS) \
3644
{#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
3745
#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \

clang/utils/TableGen/ClangBuiltinsEmitter.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ class PrototypeParser {
6464
// detecting the comma of the template class as a separator for
6565
// the parameters of the prototype. Note: the assumption is that
6666
// we cannot have nested _ExtVector.
67-
if (Current.starts_with("_ExtVector<")) {
67+
if (Current.starts_with("_ExtVector<") ||
68+
Current.starts_with("_Vector<")) {
6869
const size_t EndTemplate = Current.find('>', 0);
6970
ParseType(Current.substr(0, EndTemplate + 1));
7071
// Move the prototype beyond _ExtVector<...>
@@ -123,7 +124,8 @@ class PrototypeParser {
123124
if (Substitution.empty())
124125
PrintFatalError(Loc, "Not a template");
125126
ParseType(Substitution);
126-
} else if (T.consume_front("_ExtVector")) {
127+
} else if (auto IsExt = T.consume_front("_ExtVector");
128+
IsExt || T.consume_front("_Vector")) {
127129
// Clang extended vector types are mangled as follows:
128130
//
129131
// '_ExtVector<' <lanes> ',' <scalar type> '>'
@@ -135,7 +137,7 @@ class PrototypeParser {
135137
unsigned long long Lanes;
136138
if (consumeUnsignedInteger(T, 10, Lanes))
137139
PrintFatalError(Loc, "Expected number of lanes after '_ExtVector<'");
138-
Type += "E" + std::to_string(Lanes);
140+
Type += (IsExt ? "E" : "V") + std::to_string(Lanes);
139141
if (!T.consume_front(","))
140142
PrintFatalError(Loc,
141143
"Expected ',' after number of lanes in '_ExtVector<'");

0 commit comments

Comments
 (0)