@@ -21,23 +21,21 @@ let SVETargetGuard = InvalidMode in {
21
21
// Loads
22
22
23
23
multiclass ZALoad<string n_suffix, string t, string i_prefix, list<ImmCheck> ch> {
24
- let SMETargetGuard = "sme" in {
25
- def NAME # _H : MInst<"svld1_hor_" # n_suffix, "vimPQ", t,
26
- [IsLoad, IsOverloadNone, IsStreaming, IsInOutZA],
27
- MemEltTyDefault, i_prefix # "_horiz", ch>;
28
-
29
- def NAME # _H_VNUM : MInst<"svld1_hor_vnum_" # n_suffix, "vimPQl", t,
30
- [IsLoad, IsOverloadNone, IsStreaming, IsInOutZA],
31
- MemEltTyDefault, i_prefix # "_horiz", ch>;
32
-
33
- def NAME # _V : MInst<"svld1_ver_" # n_suffix, "vimPQ", t,
34
- [IsLoad, IsOverloadNone, IsStreaming, IsInOutZA],
35
- MemEltTyDefault, i_prefix # "_vert", ch>;
36
-
37
- def NAME # _V_VNUM : MInst<"svld1_ver_vnum_" # n_suffix, "vimPQl", t,
38
- [IsLoad, IsOverloadNone, IsStreaming, IsInOutZA],
39
- MemEltTyDefault, i_prefix # "_vert", ch>;
40
- }
24
+ def NAME # _H : MInst<"svld1_hor_" # n_suffix, "vimPQ", t,
25
+ [IsLoad, IsOverloadNone, IsStreaming, IsInOutZA],
26
+ MemEltTyDefault, i_prefix # "_horiz", ch>;
27
+
28
+ def NAME # _H_VNUM : MInst<"svld1_hor_vnum_" # n_suffix, "vimPQl", t,
29
+ [IsLoad, IsOverloadNone, IsStreaming, IsInOutZA],
30
+ MemEltTyDefault, i_prefix # "_horiz", ch>;
31
+
32
+ def NAME # _V : MInst<"svld1_ver_" # n_suffix, "vimPQ", t,
33
+ [IsLoad, IsOverloadNone, IsStreaming, IsInOutZA],
34
+ MemEltTyDefault, i_prefix # "_vert", ch>;
35
+
36
+ def NAME # _V_VNUM : MInst<"svld1_ver_vnum_" # n_suffix, "vimPQl", t,
37
+ [IsLoad, IsOverloadNone, IsStreaming, IsInOutZA],
38
+ MemEltTyDefault, i_prefix # "_vert", ch>;
41
39
}
42
40
43
41
defm SVLD1_ZA8 : ZALoad<"za8", "c", "aarch64_sme_ld1b", [ImmCheck<0, ImmCheck0_0>]>;
@@ -46,37 +44,33 @@ defm SVLD1_ZA32 : ZALoad<"za32", "i", "aarch64_sme_ld1w", [ImmCheck<0, ImmCheck0
46
44
defm SVLD1_ZA64 : ZALoad<"za64", "l", "aarch64_sme_ld1d", [ImmCheck<0, ImmCheck0_7>]>;
47
45
defm SVLD1_ZA128 : ZALoad<"za128", "q", "aarch64_sme_ld1q", [ImmCheck<0, ImmCheck0_15>]>;
48
46
49
- let SMETargetGuard = "sme" in {
50
47
def SVLDR_VNUM_ZA : MInst<"svldr_vnum_za", "vmQl", "",
51
48
[IsOverloadNone, IsStreamingCompatible, IsInOutZA],
52
49
MemEltTyDefault, "aarch64_sme_ldr">;
53
50
54
51
def SVLDR_ZA : MInst<"svldr_za", "vmQ", "",
55
52
[IsOverloadNone, IsStreamingCompatible, IsInOutZA],
56
53
MemEltTyDefault, "aarch64_sme_ldr", []>;
57
- }
58
54
59
55
////////////////////////////////////////////////////////////////////////////////
60
56
// Stores
61
57
62
58
multiclass ZAStore<string n_suffix, string t, string i_prefix, list<ImmCheck> ch> {
63
- let SMETargetGuard = "sme" in {
64
- def NAME # _H : MInst<"svst1_hor_" # n_suffix, "vimP%", t,
65
- [IsStore, IsOverloadNone, IsStreaming, IsInZA],
66
- MemEltTyDefault, i_prefix # "_horiz", ch>;
67
-
68
- def NAME # _H_VNUM : MInst<"svst1_hor_vnum_" # n_suffix, "vimP%l", t,
69
- [IsStore, IsOverloadNone, IsStreaming, IsInZA],
70
- MemEltTyDefault, i_prefix # "_horiz", ch>;
71
-
72
- def NAME # _V : MInst<"svst1_ver_" # n_suffix, "vimP%", t,
73
- [IsStore, IsOverloadNone, IsStreaming, IsInZA],
74
- MemEltTyDefault, i_prefix # "_vert", ch>;
75
-
76
- def NAME # _V_VNUM : MInst<"svst1_ver_vnum_" # n_suffix, "vimP%l", t,
77
- [IsStore, IsOverloadNone, IsStreaming, IsInZA],
78
- MemEltTyDefault, i_prefix # "_vert", ch>;
79
- }
59
+ def NAME # _H : MInst<"svst1_hor_" # n_suffix, "vimP%", t,
60
+ [IsStore, IsOverloadNone, IsStreaming, IsInZA],
61
+ MemEltTyDefault, i_prefix # "_horiz", ch>;
62
+
63
+ def NAME # _H_VNUM : MInst<"svst1_hor_vnum_" # n_suffix, "vimP%l", t,
64
+ [IsStore, IsOverloadNone, IsStreaming, IsInZA],
65
+ MemEltTyDefault, i_prefix # "_horiz", ch>;
66
+
67
+ def NAME # _V : MInst<"svst1_ver_" # n_suffix, "vimP%", t,
68
+ [IsStore, IsOverloadNone, IsStreaming, IsInZA],
69
+ MemEltTyDefault, i_prefix # "_vert", ch>;
70
+
71
+ def NAME # _V_VNUM : MInst<"svst1_ver_vnum_" # n_suffix, "vimP%l", t,
72
+ [IsStore, IsOverloadNone, IsStreaming, IsInZA],
73
+ MemEltTyDefault, i_prefix # "_vert", ch>;
80
74
}
81
75
82
76
defm SVST1_ZA8 : ZAStore<"za8", "c", "aarch64_sme_st1b", [ImmCheck<0, ImmCheck0_0>]>;
@@ -85,29 +79,25 @@ defm SVST1_ZA32 : ZAStore<"za32", "i", "aarch64_sme_st1w", [ImmCheck<0, ImmCheck
85
79
defm SVST1_ZA64 : ZAStore<"za64", "l", "aarch64_sme_st1d", [ImmCheck<0, ImmCheck0_7>]>;
86
80
defm SVST1_ZA128 : ZAStore<"za128", "q", "aarch64_sme_st1q", [ImmCheck<0, ImmCheck0_15>]>;
87
81
88
- let SMETargetGuard = "sme" in {
89
82
def SVSTR_VNUM_ZA : MInst<"svstr_vnum_za", "vm%l", "",
90
83
[IsOverloadNone, IsStreamingCompatible, IsInZA],
91
84
MemEltTyDefault, "aarch64_sme_str">;
92
85
93
86
def SVSTR_ZA : MInst<"svstr_za", "vm%", "",
94
87
[IsOverloadNone, IsStreamingCompatible, IsInZA],
95
88
MemEltTyDefault, "aarch64_sme_str", []>;
96
- }
97
89
98
90
////////////////////////////////////////////////////////////////////////////////
99
91
// Read horizontal/vertical ZA slices
100
92
101
93
multiclass ZARead<string n_suffix, string t, string i_prefix, list<ImmCheck> ch> {
102
- let SMETargetGuard = "sme" in {
103
- def NAME # _H : SInst<"svread_hor_" # n_suffix # "[_{d}]", "ddPim", t,
104
- MergeOp1, i_prefix # "_horiz",
105
- [IsReadZA, IsStreaming, IsInZA], ch>;
106
-
107
- def NAME # _V : SInst<"svread_ver_" # n_suffix # "[_{d}]", "ddPim", t,
108
- MergeOp1, i_prefix # "_vert",
109
- [IsReadZA, IsStreaming, IsInZA], ch>;
110
- }
94
+ def NAME # _H : SInst<"svread_hor_" # n_suffix # "[_{d}]", "ddPim", t,
95
+ MergeOp1, i_prefix # "_horiz",
96
+ [IsReadZA, IsStreaming, IsInZA], ch>;
97
+
98
+ def NAME # _V : SInst<"svread_ver_" # n_suffix # "[_{d}]", "ddPim", t,
99
+ MergeOp1, i_prefix # "_vert",
100
+ [IsReadZA, IsStreaming, IsInZA], ch>;
111
101
}
112
102
113
103
defm SVREAD_ZA8 : ZARead<"za8", "cUcm", "aarch64_sme_read", [ImmCheck<2, ImmCheck0_0>]>;
@@ -120,15 +110,13 @@ defm SVREAD_ZA128 : ZARead<"za128", "csilUcUsUiUlmhbfd", "aarch64_sme_readq", [I
120
110
// Write horizontal/vertical ZA slices
121
111
122
112
multiclass ZAWrite<string n_suffix, string t, string i_prefix, list<ImmCheck> ch> {
123
- let SMETargetGuard = "sme" in {
124
- def NAME # _H : SInst<"svwrite_hor_" # n_suffix # "[_{d}]", "vimPd", t,
125
- MergeOp1, i_prefix # "_horiz",
126
- [IsWriteZA, IsStreaming, IsInOutZA], ch>;
127
-
128
- def NAME # _V : SInst<"svwrite_ver_" # n_suffix # "[_{d}]", "vimPd", t,
129
- MergeOp1, i_prefix # "_vert",
130
- [IsWriteZA, IsStreaming, IsInOutZA], ch>;
131
- }
113
+ def NAME # _H : SInst<"svwrite_hor_" # n_suffix # "[_{d}]", "vimPd", t,
114
+ MergeOp1, i_prefix # "_horiz",
115
+ [IsWriteZA, IsStreaming, IsInOutZA], ch>;
116
+
117
+ def NAME # _V : SInst<"svwrite_ver_" # n_suffix # "[_{d}]", "vimPd", t,
118
+ MergeOp1, i_prefix # "_vert",
119
+ [IsWriteZA, IsStreaming, IsInOutZA], ch>;
132
120
}
133
121
134
122
defm SVWRITE_ZA8 : ZAWrite<"za8", "cUcm", "aarch64_sme_write", [ImmCheck<0, ImmCheck0_0>]>;
@@ -140,13 +128,11 @@ defm SVWRITE_ZA128 : ZAWrite<"za128", "csilUcUsUiUlmhbfd", "aarch64_sme_writeq",
140
128
////////////////////////////////////////////////////////////////////////////////
141
129
// SME - Zero
142
130
143
- let SMETargetGuard = "sme" in {
144
- def SVZERO_MASK_ZA : SInst<"svzero_mask_za", "vi", "", MergeNone, "aarch64_sme_zero",
145
- [IsOverloadNone, IsStreamingCompatible, IsInOutZA],
146
- [ImmCheck<0, ImmCheck0_255>]>;
147
- def SVZERO_ZA : SInst<"svzero_za", "vv", "", MergeNone, "aarch64_sme_zero",
148
- [IsOverloadNone, IsStreamingCompatible, IsOutZA]>;
149
- }
131
+ def SVZERO_MASK_ZA : SInst<"svzero_mask_za", "vi", "", MergeNone, "aarch64_sme_zero",
132
+ [IsOverloadNone, IsStreamingCompatible, IsInOutZA],
133
+ [ImmCheck<0, ImmCheck0_255>]>;
134
+ def SVZERO_ZA : SInst<"svzero_za", "vv", "", MergeNone, "aarch64_sme_zero",
135
+ [IsOverloadNone, IsStreamingCompatible, IsOutZA]>;
150
136
151
137
let SMETargetGuard = "sme2p1" in {
152
138
def SVZERO_ZA64_VG1x2 : SInst<"svzero_za64_vg1x2", "vm", "", MergeNone, "aarch64_sme_zero_za64_vg1x2",
@@ -171,11 +157,9 @@ let SMETargetGuard = "sme2p1" in {
171
157
// SME - Counting elements in a streaming vector
172
158
173
159
multiclass ZACount<string n_suffix> {
174
- let SMETargetGuard = "sme" in {
175
- def NAME : SInst<"sv" # n_suffix, "nv", "", MergeNone,
176
- "aarch64_sme_" # n_suffix,
177
- [IsOverloadNone, IsStreamingCompatible]>;
178
- }
160
+ def NAME : SInst<"sv" # n_suffix, "nv", "", MergeNone,
161
+ "aarch64_sme_" # n_suffix,
162
+ [IsOverloadNone, IsStreamingCompatible]>;
179
163
}
180
164
181
165
defm SVCNTSB : ZACount<"cntsb">;
@@ -187,11 +171,9 @@ defm SVCNTSD : ZACount<"cntsd">;
187
171
// SME - ADDHA/ADDVA
188
172
189
173
multiclass ZAAdd<string n_suffix> {
190
- let SMETargetGuard = "sme" in {
191
- def NAME # _ZA32: SInst<"sv" # n_suffix # "_za32[_{d}]", "viPPd", "iUi", MergeOp1,
192
- "aarch64_sme_" # n_suffix, [IsStreaming, IsInOutZA],
193
- [ImmCheck<0, ImmCheck0_3>]>;
194
- }
174
+ def NAME # _ZA32: SInst<"sv" # n_suffix # "_za32[_{d}]", "viPPd", "iUi", MergeOp1,
175
+ "aarch64_sme_" # n_suffix, [IsStreaming, IsInOutZA],
176
+ [ImmCheck<0, ImmCheck0_3>]>;
195
177
196
178
let SMETargetGuard = "sme-i16i64" in {
197
179
def NAME # _ZA64: SInst<"sv" # n_suffix # "_za64[_{d}]", "viPPd", "lUl", MergeOp1,
@@ -207,13 +189,11 @@ defm SVADDVA : ZAAdd<"addva">;
207
189
// SME - SMOPA, SMOPS, UMOPA, UMOPS
208
190
209
191
multiclass ZAIntOuterProd<string n_suffix1, string n_suffix2> {
210
- let SMETargetGuard = "sme" in {
211
- def NAME # _ZA32_B: SInst<"sv" # n_suffix2 # "_za32[_{d}]",
212
- "viPPdd", !cond(!eq(n_suffix1, "s") : "", true: "U") # "c",
213
- MergeOp1, "aarch64_sme_" # n_suffix1 # n_suffix2 # "_wide",
214
- [IsStreaming, IsInOutZA],
215
- [ImmCheck<0, ImmCheck0_3>]>;
216
- }
192
+ def NAME # _ZA32_B: SInst<"sv" # n_suffix2 # "_za32[_{d}]",
193
+ "viPPdd", !cond(!eq(n_suffix1, "s") : "", true: "U") # "c",
194
+ MergeOp1, "aarch64_sme_" # n_suffix1 # n_suffix2 # "_wide",
195
+ [IsStreaming, IsInOutZA],
196
+ [ImmCheck<0, ImmCheck0_3>]>;
217
197
218
198
let SMETargetGuard = "sme-i16i64" in {
219
199
def NAME # _ZA64_H: SInst<"sv" # n_suffix2 # "_za64[_{d}]",
@@ -233,14 +213,12 @@ defm SVUMOPS : ZAIntOuterProd<"u", "mops">;
233
213
// SME - SUMOPA, SUMOPS, USMOPA, USMOPS
234
214
235
215
multiclass ZAIntOuterProdMixedSigns<string n_suffix1, string n_suffix2> {
236
- let SMETargetGuard = "sme" in {
237
- def NAME # _ZA32_B: SInst<"sv" # n_suffix1 # n_suffix2 # "_za32[_{d}]",
238
- "viPPd" # !cond(!eq(n_suffix1, "su") : "u", true: "x"),
239
- !cond(!eq(n_suffix1, "su") : "", true: "U") # "c",
240
- MergeOp1, "aarch64_sme_" # n_suffix1 # n_suffix2 # "_wide",
241
- [IsStreaming, IsInOutZA],
242
- [ImmCheck<0, ImmCheck0_3>]>;
243
- }
216
+ def NAME # _ZA32_B: SInst<"sv" # n_suffix1 # n_suffix2 # "_za32[_{d}]",
217
+ "viPPd" # !cond(!eq(n_suffix1, "su") : "u", true: "x"),
218
+ !cond(!eq(n_suffix1, "su") : "", true: "U") # "c",
219
+ MergeOp1, "aarch64_sme_" # n_suffix1 # n_suffix2 # "_wide",
220
+ [IsStreaming, IsInOutZA],
221
+ [ImmCheck<0, ImmCheck0_3>]>;
244
222
245
223
let SMETargetGuard = "sme-i16i64" in {
246
224
def NAME # _ZA64_H: SInst<"sv" # n_suffix1 # n_suffix2 # "_za64[_{d}]",
@@ -261,22 +239,20 @@ defm SVUSMOPS : ZAIntOuterProdMixedSigns<"us", "mops">;
261
239
// SME - FMOPA, FMOPS
262
240
263
241
multiclass ZAFPOuterProd<string n_suffix> {
264
- let SMETargetGuard = "sme" in {
265
- def NAME # _ZA32_B: SInst<"sv" # n_suffix # "_za32[_{d}]", "viPPdd", "h",
266
- MergeOp1, "aarch64_sme_" # n_suffix # "_wide",
267
- [IsStreaming, IsInOutZA],
268
- [ImmCheck<0, ImmCheck0_3>]>;
242
+ def NAME # _ZA32_B: SInst<"sv" # n_suffix # "_za32[_{d}]", "viPPdd", "h",
243
+ MergeOp1, "aarch64_sme_" # n_suffix # "_wide",
244
+ [IsStreaming, IsInOutZA],
245
+ [ImmCheck<0, ImmCheck0_3>]>;
269
246
270
- def NAME # _ZA32_H: SInst<"sv" # n_suffix # "_za32[_{d}]", "viPPdd", "b",
271
- MergeOp1, "aarch64_sme_" # n_suffix # "_wide",
272
- [IsStreaming, IsInOutZA],
273
- [ImmCheck<0, ImmCheck0_3>]>;
247
+ def NAME # _ZA32_H: SInst<"sv" # n_suffix # "_za32[_{d}]", "viPPdd", "b",
248
+ MergeOp1, "aarch64_sme_" # n_suffix # "_wide",
249
+ [IsStreaming, IsInOutZA],
250
+ [ImmCheck<0, ImmCheck0_3>]>;
274
251
275
- def NAME # _ZA32_S: SInst<"sv" # n_suffix # "_za32[_{d}]", "viPPdd", "f",
276
- MergeOp1, "aarch64_sme_" # n_suffix,
277
- [IsStreaming, IsInOutZA],
278
- [ImmCheck<0, ImmCheck0_3>]>;
279
- }
252
+ def NAME # _ZA32_S: SInst<"sv" # n_suffix # "_za32[_{d}]", "viPPdd", "f",
253
+ MergeOp1, "aarch64_sme_" # n_suffix,
254
+ [IsStreaming, IsInOutZA],
255
+ [ImmCheck<0, ImmCheck0_3>]>;
280
256
281
257
let SMETargetGuard = "sme-f64f64" in {
282
258
def NAME # _ZA64_D: SInst<"sv" # n_suffix # "_za64[_{d}]", "viPPdd", "d",
0 commit comments