xref: /openbmc/qemu/target/hexagon/gen_tcg_hvx.h (revision 762c280d)
1 /*
2  *  Copyright(c) 2019-2021 Qualcomm Innovation Center, Inc. All Rights Reserved.
3  *
4  *  This program is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU General Public License as published by
6  *  the Free Software Foundation; either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #ifndef HEXAGON_GEN_TCG_HVX_H
19 #define HEXAGON_GEN_TCG_HVX_H
20 
21 /*
22  * Histogram instructions
23  *
24  * Note that these instructions operate directly on the vector registers
25  * and therefore happen after commit.
26  *
27  * The generate_<tag> function is called twice
28  *     The first time is during the normal TCG generation
29  *         ctx->pre_commit is true
30  *         In the masked cases, we save the mask to the qtmp temporary
31  *         Otherwise, there is nothing to do
32  *     The second call is at the end of gen_commit_packet
33  *         ctx->pre_commit is false
34  *         Generate the call to the helper
35  */
36 
37 static inline void assert_vhist_tmp(DisasContext *ctx)
38 {
39     /* vhist instructions require exactly one .tmp to be defined */
40     g_assert(ctx->tmp_vregs_idx == 1);
41 }
42 
43 #define fGEN_TCG_V6_vhist(SHORTCODE) \
44     if (!ctx->pre_commit) { \
45         assert_vhist_tmp(ctx); \
46         gen_helper_vhist(cpu_env); \
47     }
48 #define fGEN_TCG_V6_vhistq(SHORTCODE) \
49     do { \
50         if (ctx->pre_commit) { \
51             intptr_t dstoff = offsetof(CPUHexagonState, qtmp); \
52             tcg_gen_gvec_mov(MO_64, dstoff, QvV_off, \
53                              sizeof(MMVector), sizeof(MMVector)); \
54         } else { \
55             assert_vhist_tmp(ctx); \
56             gen_helper_vhistq(cpu_env); \
57         } \
58     } while (0)
59 #define fGEN_TCG_V6_vwhist256(SHORTCODE) \
60     if (!ctx->pre_commit) { \
61         assert_vhist_tmp(ctx); \
62         gen_helper_vwhist256(cpu_env); \
63     }
64 #define fGEN_TCG_V6_vwhist256q(SHORTCODE) \
65     do { \
66         if (ctx->pre_commit) { \
67             intptr_t dstoff = offsetof(CPUHexagonState, qtmp); \
68             tcg_gen_gvec_mov(MO_64, dstoff, QvV_off, \
69                              sizeof(MMVector), sizeof(MMVector)); \
70         } else { \
71             assert_vhist_tmp(ctx); \
72             gen_helper_vwhist256q(cpu_env); \
73         } \
74     } while (0)
75 #define fGEN_TCG_V6_vwhist256_sat(SHORTCODE) \
76     if (!ctx->pre_commit) { \
77         assert_vhist_tmp(ctx); \
78         gen_helper_vwhist256_sat(cpu_env); \
79     }
80 #define fGEN_TCG_V6_vwhist256q_sat(SHORTCODE) \
81     do { \
82         if (ctx->pre_commit) { \
83             intptr_t dstoff = offsetof(CPUHexagonState, qtmp); \
84             tcg_gen_gvec_mov(MO_64, dstoff, QvV_off, \
85                              sizeof(MMVector), sizeof(MMVector)); \
86         } else { \
87             assert_vhist_tmp(ctx); \
88             gen_helper_vwhist256q_sat(cpu_env); \
89         } \
90     } while (0)
91 #define fGEN_TCG_V6_vwhist128(SHORTCODE) \
92     if (!ctx->pre_commit) { \
93         assert_vhist_tmp(ctx); \
94         gen_helper_vwhist128(cpu_env); \
95     }
96 #define fGEN_TCG_V6_vwhist128q(SHORTCODE) \
97     do { \
98         if (ctx->pre_commit) { \
99             intptr_t dstoff = offsetof(CPUHexagonState, qtmp); \
100             tcg_gen_gvec_mov(MO_64, dstoff, QvV_off, \
101                              sizeof(MMVector), sizeof(MMVector)); \
102         } else { \
103             assert_vhist_tmp(ctx); \
104             gen_helper_vwhist128q(cpu_env); \
105         } \
106     } while (0)
107 #define fGEN_TCG_V6_vwhist128m(SHORTCODE) \
108     if (!ctx->pre_commit) { \
109         TCGv tcgv_uiV = tcg_constant_tl(uiV); \
110         assert_vhist_tmp(ctx); \
111         gen_helper_vwhist128m(cpu_env, tcgv_uiV); \
112     }
113 #define fGEN_TCG_V6_vwhist128qm(SHORTCODE) \
114     do { \
115         if (ctx->pre_commit) { \
116             intptr_t dstoff = offsetof(CPUHexagonState, qtmp); \
117             tcg_gen_gvec_mov(MO_64, dstoff, QvV_off, \
118                              sizeof(MMVector), sizeof(MMVector)); \
119         } else { \
120             TCGv tcgv_uiV = tcg_constant_tl(uiV); \
121             assert_vhist_tmp(ctx); \
122             gen_helper_vwhist128qm(cpu_env, tcgv_uiV); \
123         } \
124     } while (0)
125 
126 
127 #define fGEN_TCG_V6_vassign(SHORTCODE) \
128     tcg_gen_gvec_mov(MO_64, VdV_off, VuV_off, \
129                      sizeof(MMVector), sizeof(MMVector))
130 
131 /* Vector conditional move */
132 #define fGEN_TCG_VEC_CMOV(PRED) \
133     do { \
134         TCGv lsb = tcg_temp_new(); \
135         TCGLabel *false_label = gen_new_label(); \
136         TCGLabel *end_label = gen_new_label(); \
137         tcg_gen_andi_tl(lsb, PsV, 1); \
138         tcg_gen_brcondi_tl(TCG_COND_NE, lsb, PRED, false_label); \
139         tcg_temp_free(lsb); \
140         tcg_gen_gvec_mov(MO_64, VdV_off, VuV_off, \
141                          sizeof(MMVector), sizeof(MMVector)); \
142         tcg_gen_br(end_label); \
143         gen_set_label(false_label); \
144         tcg_gen_ori_tl(hex_slot_cancelled, hex_slot_cancelled, \
145                        1 << insn->slot); \
146         gen_set_label(end_label); \
147     } while (0)
148 
149 
150 /* Vector conditional move (true) */
151 #define fGEN_TCG_V6_vcmov(SHORTCODE) \
152     fGEN_TCG_VEC_CMOV(1)
153 
154 /* Vector conditional move (false) */
155 #define fGEN_TCG_V6_vncmov(SHORTCODE) \
156     fGEN_TCG_VEC_CMOV(0)
157 
158 /* Vector add - various forms */
159 #define fGEN_TCG_V6_vaddb(SHORTCODE) \
160     tcg_gen_gvec_add(MO_8, VdV_off, VuV_off, VvV_off, \
161                      sizeof(MMVector), sizeof(MMVector))
162 
163 #define fGEN_TCG_V6_vaddh(SHORTCYDE) \
164     tcg_gen_gvec_add(MO_16, VdV_off, VuV_off, VvV_off, \
165                      sizeof(MMVector), sizeof(MMVector))
166 
167 #define fGEN_TCG_V6_vaddw(SHORTCODE) \
168     tcg_gen_gvec_add(MO_32, VdV_off, VuV_off, VvV_off, \
169                      sizeof(MMVector), sizeof(MMVector))
170 
171 #define fGEN_TCG_V6_vaddb_dv(SHORTCODE) \
172     tcg_gen_gvec_add(MO_8, VddV_off, VuuV_off, VvvV_off, \
173                      sizeof(MMVector) * 2, sizeof(MMVector) * 2)
174 
175 #define fGEN_TCG_V6_vaddh_dv(SHORTCYDE) \
176     tcg_gen_gvec_add(MO_16, VddV_off, VuuV_off, VvvV_off, \
177                      sizeof(MMVector) * 2, sizeof(MMVector) * 2)
178 
179 #define fGEN_TCG_V6_vaddw_dv(SHORTCODE) \
180     tcg_gen_gvec_add(MO_32, VddV_off, VuuV_off, VvvV_off, \
181                      sizeof(MMVector) * 2, sizeof(MMVector) * 2)
182 
183 /* Vector sub - various forms */
184 #define fGEN_TCG_V6_vsubb(SHORTCODE) \
185     tcg_gen_gvec_sub(MO_8, VdV_off, VuV_off, VvV_off, \
186                      sizeof(MMVector), sizeof(MMVector))
187 
188 #define fGEN_TCG_V6_vsubh(SHORTCODE) \
189     tcg_gen_gvec_sub(MO_16, VdV_off, VuV_off, VvV_off, \
190                      sizeof(MMVector), sizeof(MMVector))
191 
192 #define fGEN_TCG_V6_vsubw(SHORTCODE) \
193     tcg_gen_gvec_sub(MO_32, VdV_off, VuV_off, VvV_off, \
194                      sizeof(MMVector), sizeof(MMVector))
195 
196 #define fGEN_TCG_V6_vsubb_dv(SHORTCODE) \
197     tcg_gen_gvec_sub(MO_8, VddV_off, VuuV_off, VvvV_off, \
198                      sizeof(MMVector) * 2, sizeof(MMVector) * 2)
199 
200 #define fGEN_TCG_V6_vsubh_dv(SHORTCODE) \
201     tcg_gen_gvec_sub(MO_16, VddV_off, VuuV_off, VvvV_off, \
202                      sizeof(MMVector) * 2, sizeof(MMVector) * 2)
203 
204 #define fGEN_TCG_V6_vsubw_dv(SHORTCODE) \
205     tcg_gen_gvec_sub(MO_32, VddV_off, VuuV_off, VvvV_off, \
206                      sizeof(MMVector) * 2, sizeof(MMVector) * 2)
207 
208 /* Vector shift right - various forms */
209 #define fGEN_TCG_V6_vasrh(SHORTCODE) \
210     do { \
211         TCGv shift = tcg_temp_new(); \
212         tcg_gen_andi_tl(shift, RtV, 15); \
213         tcg_gen_gvec_sars(MO_16, VdV_off, VuV_off, shift, \
214                           sizeof(MMVector), sizeof(MMVector)); \
215         tcg_temp_free(shift); \
216     } while (0)
217 
218 #define fGEN_TCG_V6_vasrh_acc(SHORTCODE) \
219     do { \
220         intptr_t tmpoff = offsetof(CPUHexagonState, vtmp); \
221         TCGv shift = tcg_temp_new(); \
222         tcg_gen_andi_tl(shift, RtV, 15); \
223         tcg_gen_gvec_sars(MO_16, tmpoff, VuV_off, shift, \
224                           sizeof(MMVector), sizeof(MMVector)); \
225         tcg_gen_gvec_add(MO_16, VxV_off, VxV_off, tmpoff, \
226                          sizeof(MMVector), sizeof(MMVector)); \
227         tcg_temp_free(shift); \
228     } while (0)
229 
230 #define fGEN_TCG_V6_vasrw(SHORTCODE) \
231     do { \
232         TCGv shift = tcg_temp_new(); \
233         tcg_gen_andi_tl(shift, RtV, 31); \
234         tcg_gen_gvec_sars(MO_32, VdV_off, VuV_off, shift, \
235                           sizeof(MMVector), sizeof(MMVector)); \
236         tcg_temp_free(shift); \
237     } while (0)
238 
239 #define fGEN_TCG_V6_vasrw_acc(SHORTCODE) \
240     do { \
241         intptr_t tmpoff = offsetof(CPUHexagonState, vtmp); \
242         TCGv shift = tcg_temp_new(); \
243         tcg_gen_andi_tl(shift, RtV, 31); \
244         tcg_gen_gvec_sars(MO_32, tmpoff, VuV_off, shift, \
245                           sizeof(MMVector), sizeof(MMVector)); \
246         tcg_gen_gvec_add(MO_32, VxV_off, VxV_off, tmpoff, \
247                           sizeof(MMVector), sizeof(MMVector)); \
248         tcg_temp_free(shift); \
249     } while (0)
250 
251 #define fGEN_TCG_V6_vlsrb(SHORTCODE) \
252     do { \
253         TCGv shift = tcg_temp_new(); \
254         tcg_gen_andi_tl(shift, RtV, 7); \
255         tcg_gen_gvec_shrs(MO_8, VdV_off, VuV_off, shift, \
256                           sizeof(MMVector), sizeof(MMVector)); \
257         tcg_temp_free(shift); \
258     } while (0)
259 
260 #define fGEN_TCG_V6_vlsrh(SHORTCODE) \
261     do { \
262         TCGv shift = tcg_temp_new(); \
263         tcg_gen_andi_tl(shift, RtV, 15); \
264         tcg_gen_gvec_shrs(MO_16, VdV_off, VuV_off, shift, \
265                           sizeof(MMVector), sizeof(MMVector)); \
266         tcg_temp_free(shift); \
267     } while (0)
268 
269 #define fGEN_TCG_V6_vlsrw(SHORTCODE) \
270     do { \
271         TCGv shift = tcg_temp_new(); \
272         tcg_gen_andi_tl(shift, RtV, 31); \
273         tcg_gen_gvec_shrs(MO_32, VdV_off, VuV_off, shift, \
274                           sizeof(MMVector), sizeof(MMVector)); \
275         tcg_temp_free(shift); \
276     } while (0)
277 
278 /* Vector shift left - various forms */
279 #define fGEN_TCG_V6_vaslb(SHORTCODE) \
280     do { \
281         TCGv shift = tcg_temp_new(); \
282         tcg_gen_andi_tl(shift, RtV, 7); \
283         tcg_gen_gvec_shls(MO_8, VdV_off, VuV_off, shift, \
284                           sizeof(MMVector), sizeof(MMVector)); \
285         tcg_temp_free(shift); \
286     } while (0)
287 
288 #define fGEN_TCG_V6_vaslh(SHORTCODE) \
289     do { \
290         TCGv shift = tcg_temp_new(); \
291         tcg_gen_andi_tl(shift, RtV, 15); \
292         tcg_gen_gvec_shls(MO_16, VdV_off, VuV_off, shift, \
293                           sizeof(MMVector), sizeof(MMVector)); \
294         tcg_temp_free(shift); \
295     } while (0)
296 
297 #define fGEN_TCG_V6_vaslh_acc(SHORTCODE) \
298     do { \
299         intptr_t tmpoff = offsetof(CPUHexagonState, vtmp); \
300         TCGv shift = tcg_temp_new(); \
301         tcg_gen_andi_tl(shift, RtV, 15); \
302         tcg_gen_gvec_shls(MO_16, tmpoff, VuV_off, shift, \
303                           sizeof(MMVector), sizeof(MMVector)); \
304         tcg_gen_gvec_add(MO_16, VxV_off, VxV_off, tmpoff, \
305                          sizeof(MMVector), sizeof(MMVector)); \
306         tcg_temp_free(shift); \
307     } while (0)
308 
309 #define fGEN_TCG_V6_vaslw(SHORTCODE) \
310     do { \
311         TCGv shift = tcg_temp_new(); \
312         tcg_gen_andi_tl(shift, RtV, 31); \
313         tcg_gen_gvec_shls(MO_32, VdV_off, VuV_off, shift, \
314                           sizeof(MMVector), sizeof(MMVector)); \
315         tcg_temp_free(shift); \
316     } while (0)
317 
318 #define fGEN_TCG_V6_vaslw_acc(SHORTCODE) \
319     do { \
320         intptr_t tmpoff = offsetof(CPUHexagonState, vtmp); \
321         TCGv shift = tcg_temp_new(); \
322         tcg_gen_andi_tl(shift, RtV, 31); \
323         tcg_gen_gvec_shls(MO_32, tmpoff, VuV_off, shift, \
324                           sizeof(MMVector), sizeof(MMVector)); \
325         tcg_gen_gvec_add(MO_32, VxV_off, VxV_off, tmpoff, \
326                          sizeof(MMVector), sizeof(MMVector)); \
327         tcg_temp_free(shift); \
328     } while (0)
329 
330 /* Vector max - various forms */
331 #define fGEN_TCG_V6_vmaxw(SHORTCODE) \
332     tcg_gen_gvec_smax(MO_32, VdV_off, VuV_off, VvV_off, \
333                       sizeof(MMVector), sizeof(MMVector))
334 #define fGEN_TCG_V6_vmaxh(SHORTCODE) \
335     tcg_gen_gvec_smax(MO_16, VdV_off, VuV_off, VvV_off, \
336                       sizeof(MMVector), sizeof(MMVector))
337 #define fGEN_TCG_V6_vmaxuh(SHORTCODE) \
338     tcg_gen_gvec_umax(MO_16, VdV_off, VuV_off, VvV_off, \
339                       sizeof(MMVector), sizeof(MMVector))
340 #define fGEN_TCG_V6_vmaxb(SHORTCODE) \
341     tcg_gen_gvec_smax(MO_8, VdV_off, VuV_off, VvV_off, \
342                       sizeof(MMVector), sizeof(MMVector))
343 #define fGEN_TCG_V6_vmaxub(SHORTCODE) \
344     tcg_gen_gvec_umax(MO_8, VdV_off, VuV_off, VvV_off, \
345                       sizeof(MMVector), sizeof(MMVector))
346 
347 /* Vector min - various forms */
348 #define fGEN_TCG_V6_vminw(SHORTCODE) \
349     tcg_gen_gvec_smin(MO_32, VdV_off, VuV_off, VvV_off, \
350                       sizeof(MMVector), sizeof(MMVector))
351 #define fGEN_TCG_V6_vminh(SHORTCODE) \
352     tcg_gen_gvec_smin(MO_16, VdV_off, VuV_off, VvV_off, \
353                       sizeof(MMVector), sizeof(MMVector))
354 #define fGEN_TCG_V6_vminuh(SHORTCODE) \
355     tcg_gen_gvec_umin(MO_16, VdV_off, VuV_off, VvV_off, \
356                       sizeof(MMVector), sizeof(MMVector))
357 #define fGEN_TCG_V6_vminb(SHORTCODE) \
358     tcg_gen_gvec_smin(MO_8, VdV_off, VuV_off, VvV_off, \
359                       sizeof(MMVector), sizeof(MMVector))
360 #define fGEN_TCG_V6_vminub(SHORTCODE) \
361     tcg_gen_gvec_umin(MO_8, VdV_off, VuV_off, VvV_off, \
362                       sizeof(MMVector), sizeof(MMVector))
363 
364 /* Vector logical ops */
365 #define fGEN_TCG_V6_vxor(SHORTCODE) \
366     tcg_gen_gvec_xor(MO_64, VdV_off, VuV_off, VvV_off, \
367                      sizeof(MMVector), sizeof(MMVector))
368 
369 #define fGEN_TCG_V6_vand(SHORTCODE) \
370     tcg_gen_gvec_and(MO_64, VdV_off, VuV_off, VvV_off, \
371                      sizeof(MMVector), sizeof(MMVector))
372 
373 #define fGEN_TCG_V6_vor(SHORTCODE) \
374     tcg_gen_gvec_or(MO_64, VdV_off, VuV_off, VvV_off, \
375                     sizeof(MMVector), sizeof(MMVector))
376 
377 #define fGEN_TCG_V6_vnot(SHORTCODE) \
378     tcg_gen_gvec_not(MO_64, VdV_off, VuV_off, \
379                      sizeof(MMVector), sizeof(MMVector))
380 
381 /* Q register logical ops */
382 #define fGEN_TCG_V6_pred_or(SHORTCODE) \
383     tcg_gen_gvec_or(MO_64, QdV_off, QsV_off, QtV_off, \
384                     sizeof(MMQReg), sizeof(MMQReg))
385 
386 #define fGEN_TCG_V6_pred_and(SHORTCODE) \
387     tcg_gen_gvec_and(MO_64, QdV_off, QsV_off, QtV_off, \
388                      sizeof(MMQReg), sizeof(MMQReg))
389 
390 #define fGEN_TCG_V6_pred_xor(SHORTCODE) \
391     tcg_gen_gvec_xor(MO_64, QdV_off, QsV_off, QtV_off, \
392                      sizeof(MMQReg), sizeof(MMQReg))
393 
394 #define fGEN_TCG_V6_pred_or_n(SHORTCODE) \
395     tcg_gen_gvec_orc(MO_64, QdV_off, QsV_off, QtV_off, \
396                      sizeof(MMQReg), sizeof(MMQReg))
397 
398 #define fGEN_TCG_V6_pred_and_n(SHORTCODE) \
399     tcg_gen_gvec_andc(MO_64, QdV_off, QsV_off, QtV_off, \
400                       sizeof(MMQReg), sizeof(MMQReg))
401 
402 #define fGEN_TCG_V6_pred_not(SHORTCODE) \
403     tcg_gen_gvec_not(MO_64, QdV_off, QsV_off, \
404                      sizeof(MMQReg), sizeof(MMQReg))
405 
406 /* Vector compares */
407 #define fGEN_TCG_VEC_CMP(COND, TYPE, SIZE) \
408     do { \
409         intptr_t tmpoff = offsetof(CPUHexagonState, vtmp); \
410         tcg_gen_gvec_cmp(COND, TYPE, tmpoff, VuV_off, VvV_off, \
411                          sizeof(MMVector), sizeof(MMVector)); \
412         vec_to_qvec(SIZE, QdV_off, tmpoff); \
413     } while (0)
414 
415 #define fGEN_TCG_V6_vgtw(SHORTCODE) \
416     fGEN_TCG_VEC_CMP(TCG_COND_GT, MO_32, 4)
417 #define fGEN_TCG_V6_vgth(SHORTCODE) \
418     fGEN_TCG_VEC_CMP(TCG_COND_GT, MO_16, 2)
419 #define fGEN_TCG_V6_vgtb(SHORTCODE) \
420     fGEN_TCG_VEC_CMP(TCG_COND_GT, MO_8, 1)
421 
422 #define fGEN_TCG_V6_vgtuw(SHORTCODE) \
423     fGEN_TCG_VEC_CMP(TCG_COND_GTU, MO_32, 4)
424 #define fGEN_TCG_V6_vgtuh(SHORTCODE) \
425     fGEN_TCG_VEC_CMP(TCG_COND_GTU, MO_16, 2)
426 #define fGEN_TCG_V6_vgtub(SHORTCODE) \
427     fGEN_TCG_VEC_CMP(TCG_COND_GTU, MO_8, 1)
428 
429 #define fGEN_TCG_V6_veqw(SHORTCODE) \
430     fGEN_TCG_VEC_CMP(TCG_COND_EQ, MO_32, 4)
431 #define fGEN_TCG_V6_veqh(SHORTCODE) \
432     fGEN_TCG_VEC_CMP(TCG_COND_EQ, MO_16, 2)
433 #define fGEN_TCG_V6_veqb(SHORTCODE) \
434     fGEN_TCG_VEC_CMP(TCG_COND_EQ, MO_8, 1)
435 
436 #define fGEN_TCG_VEC_CMP_OP(COND, TYPE, SIZE, OP) \
437     do { \
438         intptr_t tmpoff = offsetof(CPUHexagonState, vtmp); \
439         intptr_t qoff = offsetof(CPUHexagonState, qtmp); \
440         tcg_gen_gvec_cmp(COND, TYPE, tmpoff, VuV_off, VvV_off, \
441                          sizeof(MMVector), sizeof(MMVector)); \
442         vec_to_qvec(SIZE, qoff, tmpoff); \
443         OP(MO_64, QxV_off, QxV_off, qoff, sizeof(MMQReg), sizeof(MMQReg)); \
444     } while (0)
445 
446 #define fGEN_TCG_V6_vgtw_and(SHORTCODE) \
447     fGEN_TCG_VEC_CMP_OP(TCG_COND_GT, MO_32, 4, tcg_gen_gvec_and)
448 #define fGEN_TCG_V6_vgtw_or(SHORTCODE) \
449     fGEN_TCG_VEC_CMP_OP(TCG_COND_GT, MO_32, 4, tcg_gen_gvec_or)
450 #define fGEN_TCG_V6_vgtw_xor(SHORTCODE) \
451     fGEN_TCG_VEC_CMP_OP(TCG_COND_GT, MO_32, 4, tcg_gen_gvec_xor)
452 
453 #define fGEN_TCG_V6_vgtuw_and(SHORTCODE) \
454     fGEN_TCG_VEC_CMP_OP(TCG_COND_GTU, MO_32, 4, tcg_gen_gvec_and)
455 #define fGEN_TCG_V6_vgtuw_or(SHORTCODE) \
456     fGEN_TCG_VEC_CMP_OP(TCG_COND_GTU, MO_32, 4, tcg_gen_gvec_or)
457 #define fGEN_TCG_V6_vgtuw_xor(SHORTCODE) \
458     fGEN_TCG_VEC_CMP_OP(TCG_COND_GTU, MO_32, 4, tcg_gen_gvec_xor)
459 
460 #define fGEN_TCG_V6_vgth_and(SHORTCODE) \
461     fGEN_TCG_VEC_CMP_OP(TCG_COND_GT, MO_16, 2, tcg_gen_gvec_and)
462 #define fGEN_TCG_V6_vgth_or(SHORTCODE) \
463     fGEN_TCG_VEC_CMP_OP(TCG_COND_GT, MO_16, 2, tcg_gen_gvec_or)
464 #define fGEN_TCG_V6_vgth_xor(SHORTCODE) \
465     fGEN_TCG_VEC_CMP_OP(TCG_COND_GT, MO_16, 2, tcg_gen_gvec_xor)
466 
467 #define fGEN_TCG_V6_vgtuh_and(SHORTCODE) \
468     fGEN_TCG_VEC_CMP_OP(TCG_COND_GTU, MO_16, 2, tcg_gen_gvec_and)
469 #define fGEN_TCG_V6_vgtuh_or(SHORTCODE) \
470     fGEN_TCG_VEC_CMP_OP(TCG_COND_GTU, MO_16, 2, tcg_gen_gvec_or)
471 #define fGEN_TCG_V6_vgtuh_xor(SHORTCODE) \
472     fGEN_TCG_VEC_CMP_OP(TCG_COND_GTU, MO_16, 2, tcg_gen_gvec_xor)
473 
474 #define fGEN_TCG_V6_vgtb_and(SHORTCODE) \
475     fGEN_TCG_VEC_CMP_OP(TCG_COND_GT, MO_8, 1, tcg_gen_gvec_and)
476 #define fGEN_TCG_V6_vgtb_or(SHORTCODE) \
477     fGEN_TCG_VEC_CMP_OP(TCG_COND_GT, MO_8, 1, tcg_gen_gvec_or)
478 #define fGEN_TCG_V6_vgtb_xor(SHORTCODE) \
479     fGEN_TCG_VEC_CMP_OP(TCG_COND_GT, MO_8, 1, tcg_gen_gvec_xor)
480 
481 #define fGEN_TCG_V6_vgtub_and(SHORTCODE) \
482     fGEN_TCG_VEC_CMP_OP(TCG_COND_GTU, MO_8, 1, tcg_gen_gvec_and)
483 #define fGEN_TCG_V6_vgtub_or(SHORTCODE) \
484     fGEN_TCG_VEC_CMP_OP(TCG_COND_GTU, MO_8, 1, tcg_gen_gvec_or)
485 #define fGEN_TCG_V6_vgtub_xor(SHORTCODE) \
486     fGEN_TCG_VEC_CMP_OP(TCG_COND_GTU, MO_8, 1, tcg_gen_gvec_xor)
487 
488 #define fGEN_TCG_V6_veqw_and(SHORTCODE) \
489     fGEN_TCG_VEC_CMP_OP(TCG_COND_EQ, MO_32, 4, tcg_gen_gvec_and)
490 #define fGEN_TCG_V6_veqw_or(SHORTCODE) \
491     fGEN_TCG_VEC_CMP_OP(TCG_COND_EQ, MO_32, 4, tcg_gen_gvec_or)
492 #define fGEN_TCG_V6_veqw_xor(SHORTCODE) \
493     fGEN_TCG_VEC_CMP_OP(TCG_COND_EQ, MO_32, 4, tcg_gen_gvec_xor)
494 
495 #define fGEN_TCG_V6_veqh_and(SHORTCODE) \
496     fGEN_TCG_VEC_CMP_OP(TCG_COND_EQ, MO_16, 2, tcg_gen_gvec_and)
497 #define fGEN_TCG_V6_veqh_or(SHORTCODE) \
498     fGEN_TCG_VEC_CMP_OP(TCG_COND_EQ, MO_16, 2, tcg_gen_gvec_or)
499 #define fGEN_TCG_V6_veqh_xor(SHORTCODE) \
500     fGEN_TCG_VEC_CMP_OP(TCG_COND_EQ, MO_16, 2, tcg_gen_gvec_xor)
501 
502 #define fGEN_TCG_V6_veqb_and(SHORTCODE) \
503     fGEN_TCG_VEC_CMP_OP(TCG_COND_EQ, MO_8, 1, tcg_gen_gvec_and)
504 #define fGEN_TCG_V6_veqb_or(SHORTCODE) \
505     fGEN_TCG_VEC_CMP_OP(TCG_COND_EQ, MO_8, 1, tcg_gen_gvec_or)
506 #define fGEN_TCG_V6_veqb_xor(SHORTCODE) \
507     fGEN_TCG_VEC_CMP_OP(TCG_COND_EQ, MO_8, 1, tcg_gen_gvec_xor)
508 
509 /* Vector splat - various forms */
510 #define fGEN_TCG_V6_lvsplatw(SHORTCODE) \
511     tcg_gen_gvec_dup_i32(MO_32, VdV_off, \
512                          sizeof(MMVector), sizeof(MMVector), RtV)
513 
514 #define fGEN_TCG_V6_lvsplath(SHORTCODE) \
515     tcg_gen_gvec_dup_i32(MO_16, VdV_off, \
516                          sizeof(MMVector), sizeof(MMVector), RtV)
517 
518 #define fGEN_TCG_V6_lvsplatb(SHORTCODE) \
519     tcg_gen_gvec_dup_i32(MO_8, VdV_off, \
520                          sizeof(MMVector), sizeof(MMVector), RtV)
521 
522 /* Vector absolute value - various forms */
523 #define fGEN_TCG_V6_vabsb(SHORTCODE) \
524     tcg_gen_gvec_abs(MO_8, VdV_off, VuV_off, \
525                      sizeof(MMVector), sizeof(MMVector))
526 
527 #define fGEN_TCG_V6_vabsh(SHORTCODE) \
528     tcg_gen_gvec_abs(MO_16, VdV_off, VuV_off, \
529                      sizeof(MMVector), sizeof(MMVector))
530 
531 #define fGEN_TCG_V6_vabsw(SHORTCODE) \
532     tcg_gen_gvec_abs(MO_32, VdV_off, VuV_off, \
533                      sizeof(MMVector), sizeof(MMVector))
534 
535 /* Vector loads */
536 #define fGEN_TCG_V6_vL32b_pi(SHORTCODE)                    SHORTCODE
537 #define fGEN_TCG_V6_vL32Ub_pi(SHORTCODE)                   SHORTCODE
538 #define fGEN_TCG_V6_vL32b_cur_pi(SHORTCODE)                SHORTCODE
539 #define fGEN_TCG_V6_vL32b_tmp_pi(SHORTCODE)                SHORTCODE
540 #define fGEN_TCG_V6_vL32b_nt_pi(SHORTCODE)                 SHORTCODE
541 #define fGEN_TCG_V6_vL32b_nt_cur_pi(SHORTCODE)             SHORTCODE
542 #define fGEN_TCG_V6_vL32b_nt_tmp_pi(SHORTCODE)             SHORTCODE
543 #define fGEN_TCG_V6_vL32b_ai(SHORTCODE)                    SHORTCODE
544 #define fGEN_TCG_V6_vL32Ub_ai(SHORTCODE)                   SHORTCODE
545 #define fGEN_TCG_V6_vL32b_cur_ai(SHORTCODE)                SHORTCODE
546 #define fGEN_TCG_V6_vL32b_tmp_ai(SHORTCODE)                SHORTCODE
547 #define fGEN_TCG_V6_vL32b_nt_ai(SHORTCODE)                 SHORTCODE
548 #define fGEN_TCG_V6_vL32b_nt_cur_ai(SHORTCODE)             SHORTCODE
549 #define fGEN_TCG_V6_vL32b_nt_tmp_ai(SHORTCODE)             SHORTCODE
550 #define fGEN_TCG_V6_vL32b_ppu(SHORTCODE)                   SHORTCODE
551 #define fGEN_TCG_V6_vL32Ub_ppu(SHORTCODE)                  SHORTCODE
552 #define fGEN_TCG_V6_vL32b_cur_ppu(SHORTCODE)               SHORTCODE
553 #define fGEN_TCG_V6_vL32b_tmp_ppu(SHORTCODE)               SHORTCODE
554 #define fGEN_TCG_V6_vL32b_nt_ppu(SHORTCODE)                SHORTCODE
555 #define fGEN_TCG_V6_vL32b_nt_cur_ppu(SHORTCODE)            SHORTCODE
556 #define fGEN_TCG_V6_vL32b_nt_tmp_ppu(SHORTCODE)            SHORTCODE
557 
558 /* Predicated vector loads */
559 #define fGEN_TCG_PRED_VEC_LOAD(GET_EA, PRED, DSTOFF, INC) \
560     do { \
561         TCGv LSB = tcg_temp_new(); \
562         TCGLabel *false_label = gen_new_label(); \
563         TCGLabel *end_label = gen_new_label(); \
564         GET_EA; \
565         PRED; \
566         tcg_gen_brcondi_tl(TCG_COND_EQ, LSB, 0, false_label); \
567         tcg_temp_free(LSB); \
568         gen_vreg_load(ctx, DSTOFF, EA, true); \
569         INC; \
570         tcg_gen_br(end_label); \
571         gen_set_label(false_label); \
572         tcg_gen_ori_tl(hex_slot_cancelled, hex_slot_cancelled, \
573                        1 << insn->slot); \
574         gen_set_label(end_label); \
575     } while (0)
576 
577 #define fGEN_TCG_PRED_VEC_LOAD_pred_pi \
578     fGEN_TCG_PRED_VEC_LOAD(fLSBOLD(PvV), \
579                            fEA_REG(RxV), \
580                            VdV_off, \
581                            fPM_I(RxV, siV * sizeof(MMVector)))
582 #define fGEN_TCG_PRED_VEC_LOAD_npred_pi \
583     fGEN_TCG_PRED_VEC_LOAD(fLSBOLDNOT(PvV), \
584                            fEA_REG(RxV), \
585                            VdV_off, \
586                            fPM_I(RxV, siV * sizeof(MMVector)))
587 
588 #define fGEN_TCG_V6_vL32b_pred_pi(SHORTCODE) \
589     fGEN_TCG_PRED_VEC_LOAD_pred_pi
590 #define fGEN_TCG_V6_vL32b_npred_pi(SHORTCODE) \
591     fGEN_TCG_PRED_VEC_LOAD_npred_pi
592 #define fGEN_TCG_V6_vL32b_cur_pred_pi(SHORTCODE) \
593     fGEN_TCG_PRED_VEC_LOAD_pred_pi
594 #define fGEN_TCG_V6_vL32b_cur_npred_pi(SHORTCODE) \
595     fGEN_TCG_PRED_VEC_LOAD_npred_pi
596 #define fGEN_TCG_V6_vL32b_tmp_pred_pi(SHORTCODE) \
597     fGEN_TCG_PRED_VEC_LOAD_pred_pi
598 #define fGEN_TCG_V6_vL32b_tmp_npred_pi(SHORTCODE) \
599     fGEN_TCG_PRED_VEC_LOAD_npred_pi
600 #define fGEN_TCG_V6_vL32b_nt_pred_pi(SHORTCODE) \
601     fGEN_TCG_PRED_VEC_LOAD_pred_pi
602 #define fGEN_TCG_V6_vL32b_nt_npred_pi(SHORTCODE) \
603     fGEN_TCG_PRED_VEC_LOAD_npred_pi
604 #define fGEN_TCG_V6_vL32b_nt_cur_pred_pi(SHORTCODE) \
605     fGEN_TCG_PRED_VEC_LOAD_pred_pi
606 #define fGEN_TCG_V6_vL32b_nt_cur_npred_pi(SHORTCODE) \
607     fGEN_TCG_PRED_VEC_LOAD_npred_pi
608 #define fGEN_TCG_V6_vL32b_nt_tmp_pred_pi(SHORTCODE) \
609     fGEN_TCG_PRED_VEC_LOAD_pred_pi
610 #define fGEN_TCG_V6_vL32b_nt_tmp_npred_pi(SHORTCODE) \
611     fGEN_TCG_PRED_VEC_LOAD_npred_pi
612 
613 #define fGEN_TCG_PRED_VEC_LOAD_pred_ai \
614     fGEN_TCG_PRED_VEC_LOAD(fLSBOLD(PvV), \
615                            fEA_RI(RtV, siV * sizeof(MMVector)), \
616                            VdV_off, \
617                            do {} while (0))
618 #define fGEN_TCG_PRED_VEC_LOAD_npred_ai \
619     fGEN_TCG_PRED_VEC_LOAD(fLSBOLDNOT(PvV), \
620                            fEA_RI(RtV, siV * sizeof(MMVector)), \
621                            VdV_off, \
622                            do {} while (0))
623 
624 #define fGEN_TCG_V6_vL32b_pred_ai(SHORTCODE) \
625     fGEN_TCG_PRED_VEC_LOAD_pred_ai
626 #define fGEN_TCG_V6_vL32b_npred_ai(SHORTCODE) \
627     fGEN_TCG_PRED_VEC_LOAD_npred_ai
628 #define fGEN_TCG_V6_vL32b_cur_pred_ai(SHORTCODE) \
629     fGEN_TCG_PRED_VEC_LOAD_pred_ai
630 #define fGEN_TCG_V6_vL32b_cur_npred_ai(SHORTCODE) \
631     fGEN_TCG_PRED_VEC_LOAD_npred_ai
632 #define fGEN_TCG_V6_vL32b_tmp_pred_ai(SHORTCODE) \
633     fGEN_TCG_PRED_VEC_LOAD_pred_ai
634 #define fGEN_TCG_V6_vL32b_tmp_npred_ai(SHORTCODE) \
635     fGEN_TCG_PRED_VEC_LOAD_npred_ai
636 #define fGEN_TCG_V6_vL32b_nt_pred_ai(SHORTCODE) \
637     fGEN_TCG_PRED_VEC_LOAD_pred_ai
638 #define fGEN_TCG_V6_vL32b_nt_npred_ai(SHORTCODE) \
639     fGEN_TCG_PRED_VEC_LOAD_npred_ai
640 #define fGEN_TCG_V6_vL32b_nt_cur_pred_ai(SHORTCODE) \
641     fGEN_TCG_PRED_VEC_LOAD_pred_ai
642 #define fGEN_TCG_V6_vL32b_nt_cur_npred_ai(SHORTCODE) \
643     fGEN_TCG_PRED_VEC_LOAD_npred_ai
644 #define fGEN_TCG_V6_vL32b_nt_tmp_pred_ai(SHORTCODE) \
645     fGEN_TCG_PRED_VEC_LOAD_pred_ai
646 #define fGEN_TCG_V6_vL32b_nt_tmp_npred_ai(SHORTCODE) \
647     fGEN_TCG_PRED_VEC_LOAD_npred_ai
648 
649 #define fGEN_TCG_PRED_VEC_LOAD_pred_ppu \
650     fGEN_TCG_PRED_VEC_LOAD(fLSBOLD(PvV), \
651                            fEA_REG(RxV), \
652                            VdV_off, \
653                            fPM_M(RxV, MuV))
654 #define fGEN_TCG_PRED_VEC_LOAD_npred_ppu \
655     fGEN_TCG_PRED_VEC_LOAD(fLSBOLDNOT(PvV), \
656                            fEA_REG(RxV), \
657                            VdV_off, \
658                            fPM_M(RxV, MuV))
659 
660 #define fGEN_TCG_V6_vL32b_pred_ppu(SHORTCODE) \
661     fGEN_TCG_PRED_VEC_LOAD_pred_ppu
662 #define fGEN_TCG_V6_vL32b_npred_ppu(SHORTCODE) \
663     fGEN_TCG_PRED_VEC_LOAD_npred_ppu
664 #define fGEN_TCG_V6_vL32b_cur_pred_ppu(SHORTCODE) \
665     fGEN_TCG_PRED_VEC_LOAD_pred_ppu
666 #define fGEN_TCG_V6_vL32b_cur_npred_ppu(SHORTCODE) \
667     fGEN_TCG_PRED_VEC_LOAD_npred_ppu
668 #define fGEN_TCG_V6_vL32b_tmp_pred_ppu(SHORTCODE) \
669     fGEN_TCG_PRED_VEC_LOAD_pred_ppu
670 #define fGEN_TCG_V6_vL32b_tmp_npred_ppu(SHORTCODE) \
671     fGEN_TCG_PRED_VEC_LOAD_npred_ppu
672 #define fGEN_TCG_V6_vL32b_nt_pred_ppu(SHORTCODE) \
673     fGEN_TCG_PRED_VEC_LOAD_pred_ppu
674 #define fGEN_TCG_V6_vL32b_nt_npred_ppu(SHORTCODE) \
675     fGEN_TCG_PRED_VEC_LOAD_npred_ppu
676 #define fGEN_TCG_V6_vL32b_nt_cur_pred_ppu(SHORTCODE) \
677     fGEN_TCG_PRED_VEC_LOAD_pred_ppu
678 #define fGEN_TCG_V6_vL32b_nt_cur_npred_ppu(SHORTCODE) \
679     fGEN_TCG_PRED_VEC_LOAD_npred_ppu
680 #define fGEN_TCG_V6_vL32b_nt_tmp_pred_ppu(SHORTCODE) \
681     fGEN_TCG_PRED_VEC_LOAD_pred_ppu
682 #define fGEN_TCG_V6_vL32b_nt_tmp_npred_ppu(SHORTCODE) \
683     fGEN_TCG_PRED_VEC_LOAD_npred_ppu
684 
685 /* Vector stores */
686 #define fGEN_TCG_V6_vS32b_pi(SHORTCODE)                    SHORTCODE
687 #define fGEN_TCG_V6_vS32Ub_pi(SHORTCODE)                   SHORTCODE
688 #define fGEN_TCG_V6_vS32b_nt_pi(SHORTCODE)                 SHORTCODE
689 #define fGEN_TCG_V6_vS32b_ai(SHORTCODE)                    SHORTCODE
690 #define fGEN_TCG_V6_vS32Ub_ai(SHORTCODE)                   SHORTCODE
691 #define fGEN_TCG_V6_vS32b_nt_ai(SHORTCODE)                 SHORTCODE
692 #define fGEN_TCG_V6_vS32b_ppu(SHORTCODE)                   SHORTCODE
693 #define fGEN_TCG_V6_vS32Ub_ppu(SHORTCODE)                  SHORTCODE
694 #define fGEN_TCG_V6_vS32b_nt_ppu(SHORTCODE)                SHORTCODE
695 
696 /* New value vector stores */
697 #define fGEN_TCG_NEWVAL_VEC_STORE(GET_EA, INC) \
698     do { \
699         GET_EA; \
700         gen_vreg_store(ctx, insn, pkt, EA, OsN_off, insn->slot, true); \
701         INC; \
702     } while (0)
703 
704 #define fGEN_TCG_NEWVAL_VEC_STORE_pi \
705     fGEN_TCG_NEWVAL_VEC_STORE(fEA_REG(RxV), fPM_I(RxV, siV * sizeof(MMVector)))
706 
707 #define fGEN_TCG_V6_vS32b_new_pi(SHORTCODE) \
708     fGEN_TCG_NEWVAL_VEC_STORE_pi
709 #define fGEN_TCG_V6_vS32b_nt_new_pi(SHORTCODE) \
710     fGEN_TCG_NEWVAL_VEC_STORE_pi
711 
712 #define fGEN_TCG_NEWVAL_VEC_STORE_ai \
713     fGEN_TCG_NEWVAL_VEC_STORE(fEA_RI(RtV, siV * sizeof(MMVector)), \
714                               do { } while (0))
715 
716 #define fGEN_TCG_V6_vS32b_new_ai(SHORTCODE) \
717     fGEN_TCG_NEWVAL_VEC_STORE_ai
718 #define fGEN_TCG_V6_vS32b_nt_new_ai(SHORTCODE) \
719     fGEN_TCG_NEWVAL_VEC_STORE_ai
720 
721 #define fGEN_TCG_NEWVAL_VEC_STORE_ppu \
722     fGEN_TCG_NEWVAL_VEC_STORE(fEA_REG(RxV), fPM_M(RxV, MuV))
723 
724 #define fGEN_TCG_V6_vS32b_new_ppu(SHORTCODE) \
725     fGEN_TCG_NEWVAL_VEC_STORE_ppu
726 #define fGEN_TCG_V6_vS32b_nt_new_ppu(SHORTCODE) \
727     fGEN_TCG_NEWVAL_VEC_STORE_ppu
728 
729 /* Predicated vector stores */
730 #define fGEN_TCG_PRED_VEC_STORE(GET_EA, PRED, SRCOFF, ALIGN, INC) \
731     do { \
732         TCGv LSB = tcg_temp_new(); \
733         TCGLabel *false_label = gen_new_label(); \
734         TCGLabel *end_label = gen_new_label(); \
735         GET_EA; \
736         PRED; \
737         tcg_gen_brcondi_tl(TCG_COND_EQ, LSB, 0, false_label); \
738         tcg_temp_free(LSB); \
739         gen_vreg_store(ctx, insn, pkt, EA, SRCOFF, insn->slot, ALIGN); \
740         INC; \
741         tcg_gen_br(end_label); \
742         gen_set_label(false_label); \
743         tcg_gen_ori_tl(hex_slot_cancelled, hex_slot_cancelled, \
744                        1 << insn->slot); \
745         gen_set_label(end_label); \
746     } while (0)
747 
748 #define fGEN_TCG_PRED_VEC_STORE_pred_pi(ALIGN) \
749     fGEN_TCG_PRED_VEC_STORE(fLSBOLD(PvV), \
750                             fEA_REG(RxV), \
751                             VsV_off, ALIGN, \
752                             fPM_I(RxV, siV * sizeof(MMVector)))
753 #define fGEN_TCG_PRED_VEC_STORE_npred_pi(ALIGN) \
754     fGEN_TCG_PRED_VEC_STORE(fLSBOLDNOT(PvV), \
755                             fEA_REG(RxV), \
756                             VsV_off, ALIGN, \
757                             fPM_I(RxV, siV * sizeof(MMVector)))
758 #define fGEN_TCG_PRED_VEC_STORE_new_pred_pi \
759     fGEN_TCG_PRED_VEC_STORE(fLSBOLD(PvV), \
760                             fEA_REG(RxV), \
761                             OsN_off, true, \
762                             fPM_I(RxV, siV * sizeof(MMVector)))
763 #define fGEN_TCG_PRED_VEC_STORE_new_npred_pi \
764     fGEN_TCG_PRED_VEC_STORE(fLSBOLDNOT(PvV), \
765                             fEA_REG(RxV), \
766                             OsN_off, true, \
767                             fPM_I(RxV, siV * sizeof(MMVector)))
768 
769 #define fGEN_TCG_V6_vS32b_pred_pi(SHORTCODE) \
770     fGEN_TCG_PRED_VEC_STORE_pred_pi(true)
771 #define fGEN_TCG_V6_vS32b_npred_pi(SHORTCODE) \
772     fGEN_TCG_PRED_VEC_STORE_npred_pi(true)
773 #define fGEN_TCG_V6_vS32Ub_pred_pi(SHORTCODE) \
774     fGEN_TCG_PRED_VEC_STORE_pred_pi(false)
775 #define fGEN_TCG_V6_vS32Ub_npred_pi(SHORTCODE) \
776     fGEN_TCG_PRED_VEC_STORE_npred_pi(false)
777 #define fGEN_TCG_V6_vS32b_nt_pred_pi(SHORTCODE) \
778     fGEN_TCG_PRED_VEC_STORE_pred_pi(true)
779 #define fGEN_TCG_V6_vS32b_nt_npred_pi(SHORTCODE) \
780     fGEN_TCG_PRED_VEC_STORE_npred_pi(true)
781 #define fGEN_TCG_V6_vS32b_new_pred_pi(SHORTCODE) \
782     fGEN_TCG_PRED_VEC_STORE_new_pred_pi
783 #define fGEN_TCG_V6_vS32b_new_npred_pi(SHORTCODE) \
784     fGEN_TCG_PRED_VEC_STORE_new_npred_pi
785 #define fGEN_TCG_V6_vS32b_nt_new_pred_pi(SHORTCODE) \
786     fGEN_TCG_PRED_VEC_STORE_new_pred_pi
787 #define fGEN_TCG_V6_vS32b_nt_new_npred_pi(SHORTCODE) \
788     fGEN_TCG_PRED_VEC_STORE_new_npred_pi
789 
790 #define fGEN_TCG_PRED_VEC_STORE_pred_ai(ALIGN) \
791     fGEN_TCG_PRED_VEC_STORE(fLSBOLD(PvV), \
792                             fEA_RI(RtV, siV * sizeof(MMVector)), \
793                             VsV_off, ALIGN, \
794                             do { } while (0))
795 #define fGEN_TCG_PRED_VEC_STORE_npred_ai(ALIGN) \
796     fGEN_TCG_PRED_VEC_STORE(fLSBOLDNOT(PvV), \
797                             fEA_RI(RtV, siV * sizeof(MMVector)), \
798                             VsV_off, ALIGN, \
799                             do { } while (0))
800 #define fGEN_TCG_PRED_VEC_STORE_new_pred_ai \
801     fGEN_TCG_PRED_VEC_STORE(fLSBOLD(PvV), \
802                             fEA_RI(RtV, siV * sizeof(MMVector)), \
803                             OsN_off, true, \
804                             do { } while (0))
805 #define fGEN_TCG_PRED_VEC_STORE_new_npred_ai \
806     fGEN_TCG_PRED_VEC_STORE(fLSBOLDNOT(PvV), \
807                             fEA_RI(RtV, siV * sizeof(MMVector)), \
808                             OsN_off, true, \
809                             do { } while (0))
810 
811 #define fGEN_TCG_V6_vS32b_pred_ai(SHORTCODE) \
812     fGEN_TCG_PRED_VEC_STORE_pred_ai(true)
813 #define fGEN_TCG_V6_vS32b_npred_ai(SHORTCODE) \
814     fGEN_TCG_PRED_VEC_STORE_npred_ai(true)
815 #define fGEN_TCG_V6_vS32Ub_pred_ai(SHORTCODE) \
816     fGEN_TCG_PRED_VEC_STORE_pred_ai(false)
817 #define fGEN_TCG_V6_vS32Ub_npred_ai(SHORTCODE) \
818     fGEN_TCG_PRED_VEC_STORE_npred_ai(false)
819 #define fGEN_TCG_V6_vS32b_nt_pred_ai(SHORTCODE) \
820     fGEN_TCG_PRED_VEC_STORE_pred_ai(true)
821 #define fGEN_TCG_V6_vS32b_nt_npred_ai(SHORTCODE) \
822     fGEN_TCG_PRED_VEC_STORE_npred_ai(true)
823 #define fGEN_TCG_V6_vS32b_new_pred_ai(SHORTCODE) \
824     fGEN_TCG_PRED_VEC_STORE_new_pred_ai
825 #define fGEN_TCG_V6_vS32b_new_npred_ai(SHORTCODE) \
826     fGEN_TCG_PRED_VEC_STORE_new_npred_ai
827 #define fGEN_TCG_V6_vS32b_nt_new_pred_ai(SHORTCODE) \
828     fGEN_TCG_PRED_VEC_STORE_new_pred_ai
829 #define fGEN_TCG_V6_vS32b_nt_new_npred_ai(SHORTCODE) \
830     fGEN_TCG_PRED_VEC_STORE_new_npred_ai
831 
832 #define fGEN_TCG_PRED_VEC_STORE_pred_ppu(ALIGN) \
833     fGEN_TCG_PRED_VEC_STORE(fLSBOLD(PvV), \
834                             fEA_REG(RxV), \
835                             VsV_off, ALIGN, \
836                             fPM_M(RxV, MuV))
837 #define fGEN_TCG_PRED_VEC_STORE_npred_ppu(ALIGN) \
838     fGEN_TCG_PRED_VEC_STORE(fLSBOLDNOT(PvV), \
839                             fEA_REG(RxV), \
840                             VsV_off, ALIGN, \
841                             fPM_M(RxV, MuV))
842 #define fGEN_TCG_PRED_VEC_STORE_new_pred_ppu \
843     fGEN_TCG_PRED_VEC_STORE(fLSBOLD(PvV), \
844                             fEA_REG(RxV), \
845                             OsN_off, true, \
846                             fPM_M(RxV, MuV))
847 #define fGEN_TCG_PRED_VEC_STORE_new_npred_ppu \
848     fGEN_TCG_PRED_VEC_STORE(fLSBOLDNOT(PvV), \
849                             fEA_REG(RxV), \
850                             OsN_off, true, \
851                             fPM_M(RxV, MuV))
852 
853 #define fGEN_TCG_V6_vS32b_pred_ppu(SHORTCODE) \
854     fGEN_TCG_PRED_VEC_STORE_pred_ppu(true)
855 #define fGEN_TCG_V6_vS32b_npred_ppu(SHORTCODE) \
856     fGEN_TCG_PRED_VEC_STORE_npred_ppu(true)
857 #define fGEN_TCG_V6_vS32Ub_pred_ppu(SHORTCODE) \
858     fGEN_TCG_PRED_VEC_STORE_pred_ppu(false)
859 #define fGEN_TCG_V6_vS32Ub_npred_ppu(SHORTCODE) \
860     fGEN_TCG_PRED_VEC_STORE_npred_ppu(false)
861 #define fGEN_TCG_V6_vS32b_nt_pred_ppu(SHORTCODE) \
862     fGEN_TCG_PRED_VEC_STORE_pred_ppu(true)
863 #define fGEN_TCG_V6_vS32b_nt_npred_ppu(SHORTCODE) \
864     fGEN_TCG_PRED_VEC_STORE_npred_ppu(true)
865 #define fGEN_TCG_V6_vS32b_new_pred_ppu(SHORTCODE) \
866     fGEN_TCG_PRED_VEC_STORE_new_pred_ppu
867 #define fGEN_TCG_V6_vS32b_new_npred_ppu(SHORTCODE) \
868     fGEN_TCG_PRED_VEC_STORE_new_npred_ppu
869 #define fGEN_TCG_V6_vS32b_nt_new_pred_ppu(SHORTCODE) \
870     fGEN_TCG_PRED_VEC_STORE_new_pred_ppu
871 #define fGEN_TCG_V6_vS32b_nt_new_npred_ppu(SHORTCODE) \
872     fGEN_TCG_PRED_VEC_STORE_new_npred_ppu
873 
874 /* Masked vector stores */
875 #define fGEN_TCG_V6_vS32b_qpred_pi(SHORTCODE)              SHORTCODE
876 #define fGEN_TCG_V6_vS32b_nt_qpred_pi(SHORTCODE)           SHORTCODE
877 #define fGEN_TCG_V6_vS32b_qpred_ai(SHORTCODE)              SHORTCODE
878 #define fGEN_TCG_V6_vS32b_nt_qpred_ai(SHORTCODE)           SHORTCODE
879 #define fGEN_TCG_V6_vS32b_qpred_ppu(SHORTCODE)             SHORTCODE
880 #define fGEN_TCG_V6_vS32b_nt_qpred_ppu(SHORTCODE)          SHORTCODE
881 #define fGEN_TCG_V6_vS32b_nqpred_pi(SHORTCODE)             SHORTCODE
882 #define fGEN_TCG_V6_vS32b_nt_nqpred_pi(SHORTCODE)          SHORTCODE
883 #define fGEN_TCG_V6_vS32b_nqpred_ai(SHORTCODE)             SHORTCODE
884 #define fGEN_TCG_V6_vS32b_nt_nqpred_ai(SHORTCODE)          SHORTCODE
885 #define fGEN_TCG_V6_vS32b_nqpred_ppu(SHORTCODE)            SHORTCODE
886 #define fGEN_TCG_V6_vS32b_nt_nqpred_ppu(SHORTCODE)         SHORTCODE
887 
888 /* Store release not modelled in qemu, but need to suppress compiler warnings */
889 #define fGEN_TCG_V6_vS32b_srls_pi(SHORTCODE) \
890     do { \
891         siV = siV; \
892     } while (0)
893 #define fGEN_TCG_V6_vS32b_srls_ai(SHORTCODE) \
894     do { \
895         RtV = RtV; \
896         siV = siV; \
897     } while (0)
898 #define fGEN_TCG_V6_vS32b_srls_ppu(SHORTCODE) \
899     do { \
900         MuV = MuV; \
901     } while (0)
902 
903 #endif
904