]> git.proxmox.com Git - mirror_qemu.git/blob - target/hexagon/gen_tcg_hvx.h
Merge tag 'pull-xen-20230306' of https://xenbits.xen.org/git-http/people/aperard...
[mirror_qemu.git] / target / hexagon / gen_tcg_hvx.h
1 /*
2 * Copyright(c) 2019-2022 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_gen_gvec_mov(MO_64, VdV_off, VuV_off, \
140 sizeof(MMVector), sizeof(MMVector)); \
141 tcg_gen_br(end_label); \
142 gen_set_label(false_label); \
143 tcg_gen_ori_tl(hex_slot_cancelled, hex_slot_cancelled, \
144 1 << insn->slot); \
145 gen_set_label(end_label); \
146 } while (0)
147
148
149 /* Vector conditional move (true) */
150 #define fGEN_TCG_V6_vcmov(SHORTCODE) \
151 fGEN_TCG_VEC_CMOV(1)
152
153 /* Vector conditional move (false) */
154 #define fGEN_TCG_V6_vncmov(SHORTCODE) \
155 fGEN_TCG_VEC_CMOV(0)
156
157 /* Vector add - various forms */
158 #define fGEN_TCG_V6_vaddb(SHORTCODE) \
159 tcg_gen_gvec_add(MO_8, VdV_off, VuV_off, VvV_off, \
160 sizeof(MMVector), sizeof(MMVector))
161
162 #define fGEN_TCG_V6_vaddh(SHORTCYDE) \
163 tcg_gen_gvec_add(MO_16, VdV_off, VuV_off, VvV_off, \
164 sizeof(MMVector), sizeof(MMVector))
165
166 #define fGEN_TCG_V6_vaddw(SHORTCODE) \
167 tcg_gen_gvec_add(MO_32, VdV_off, VuV_off, VvV_off, \
168 sizeof(MMVector), sizeof(MMVector))
169
170 #define fGEN_TCG_V6_vaddb_dv(SHORTCODE) \
171 tcg_gen_gvec_add(MO_8, VddV_off, VuuV_off, VvvV_off, \
172 sizeof(MMVector) * 2, sizeof(MMVector) * 2)
173
174 #define fGEN_TCG_V6_vaddh_dv(SHORTCYDE) \
175 tcg_gen_gvec_add(MO_16, VddV_off, VuuV_off, VvvV_off, \
176 sizeof(MMVector) * 2, sizeof(MMVector) * 2)
177
178 #define fGEN_TCG_V6_vaddw_dv(SHORTCODE) \
179 tcg_gen_gvec_add(MO_32, VddV_off, VuuV_off, VvvV_off, \
180 sizeof(MMVector) * 2, sizeof(MMVector) * 2)
181
182 /* Vector sub - various forms */
183 #define fGEN_TCG_V6_vsubb(SHORTCODE) \
184 tcg_gen_gvec_sub(MO_8, VdV_off, VuV_off, VvV_off, \
185 sizeof(MMVector), sizeof(MMVector))
186
187 #define fGEN_TCG_V6_vsubh(SHORTCODE) \
188 tcg_gen_gvec_sub(MO_16, VdV_off, VuV_off, VvV_off, \
189 sizeof(MMVector), sizeof(MMVector))
190
191 #define fGEN_TCG_V6_vsubw(SHORTCODE) \
192 tcg_gen_gvec_sub(MO_32, VdV_off, VuV_off, VvV_off, \
193 sizeof(MMVector), sizeof(MMVector))
194
195 #define fGEN_TCG_V6_vsubb_dv(SHORTCODE) \
196 tcg_gen_gvec_sub(MO_8, VddV_off, VuuV_off, VvvV_off, \
197 sizeof(MMVector) * 2, sizeof(MMVector) * 2)
198
199 #define fGEN_TCG_V6_vsubh_dv(SHORTCODE) \
200 tcg_gen_gvec_sub(MO_16, VddV_off, VuuV_off, VvvV_off, \
201 sizeof(MMVector) * 2, sizeof(MMVector) * 2)
202
203 #define fGEN_TCG_V6_vsubw_dv(SHORTCODE) \
204 tcg_gen_gvec_sub(MO_32, VddV_off, VuuV_off, VvvV_off, \
205 sizeof(MMVector) * 2, sizeof(MMVector) * 2)
206
207 /* Vector shift right - various forms */
208 #define fGEN_TCG_V6_vasrh(SHORTCODE) \
209 do { \
210 TCGv shift = tcg_temp_new(); \
211 tcg_gen_andi_tl(shift, RtV, 15); \
212 tcg_gen_gvec_sars(MO_16, VdV_off, VuV_off, shift, \
213 sizeof(MMVector), sizeof(MMVector)); \
214 } while (0)
215
216 #define fGEN_TCG_V6_vasrh_acc(SHORTCODE) \
217 do { \
218 intptr_t tmpoff = offsetof(CPUHexagonState, vtmp); \
219 TCGv shift = tcg_temp_new(); \
220 tcg_gen_andi_tl(shift, RtV, 15); \
221 tcg_gen_gvec_sars(MO_16, tmpoff, VuV_off, shift, \
222 sizeof(MMVector), sizeof(MMVector)); \
223 tcg_gen_gvec_add(MO_16, VxV_off, VxV_off, tmpoff, \
224 sizeof(MMVector), sizeof(MMVector)); \
225 } while (0)
226
227 #define fGEN_TCG_V6_vasrw(SHORTCODE) \
228 do { \
229 TCGv shift = tcg_temp_new(); \
230 tcg_gen_andi_tl(shift, RtV, 31); \
231 tcg_gen_gvec_sars(MO_32, VdV_off, VuV_off, shift, \
232 sizeof(MMVector), sizeof(MMVector)); \
233 } while (0)
234
235 #define fGEN_TCG_V6_vasrw_acc(SHORTCODE) \
236 do { \
237 intptr_t tmpoff = offsetof(CPUHexagonState, vtmp); \
238 TCGv shift = tcg_temp_new(); \
239 tcg_gen_andi_tl(shift, RtV, 31); \
240 tcg_gen_gvec_sars(MO_32, tmpoff, VuV_off, shift, \
241 sizeof(MMVector), sizeof(MMVector)); \
242 tcg_gen_gvec_add(MO_32, VxV_off, VxV_off, tmpoff, \
243 sizeof(MMVector), sizeof(MMVector)); \
244 } while (0)
245
246 #define fGEN_TCG_V6_vlsrb(SHORTCODE) \
247 do { \
248 TCGv shift = tcg_temp_new(); \
249 tcg_gen_andi_tl(shift, RtV, 7); \
250 tcg_gen_gvec_shrs(MO_8, VdV_off, VuV_off, shift, \
251 sizeof(MMVector), sizeof(MMVector)); \
252 } while (0)
253
254 #define fGEN_TCG_V6_vlsrh(SHORTCODE) \
255 do { \
256 TCGv shift = tcg_temp_new(); \
257 tcg_gen_andi_tl(shift, RtV, 15); \
258 tcg_gen_gvec_shrs(MO_16, VdV_off, VuV_off, shift, \
259 sizeof(MMVector), sizeof(MMVector)); \
260 } while (0)
261
262 #define fGEN_TCG_V6_vlsrw(SHORTCODE) \
263 do { \
264 TCGv shift = tcg_temp_new(); \
265 tcg_gen_andi_tl(shift, RtV, 31); \
266 tcg_gen_gvec_shrs(MO_32, VdV_off, VuV_off, shift, \
267 sizeof(MMVector), sizeof(MMVector)); \
268 } while (0)
269
270 /* Vector shift left - various forms */
271 #define fGEN_TCG_V6_vaslb(SHORTCODE) \
272 do { \
273 TCGv shift = tcg_temp_new(); \
274 tcg_gen_andi_tl(shift, RtV, 7); \
275 tcg_gen_gvec_shls(MO_8, VdV_off, VuV_off, shift, \
276 sizeof(MMVector), sizeof(MMVector)); \
277 } while (0)
278
279 #define fGEN_TCG_V6_vaslh(SHORTCODE) \
280 do { \
281 TCGv shift = tcg_temp_new(); \
282 tcg_gen_andi_tl(shift, RtV, 15); \
283 tcg_gen_gvec_shls(MO_16, VdV_off, VuV_off, shift, \
284 sizeof(MMVector), sizeof(MMVector)); \
285 } while (0)
286
287 #define fGEN_TCG_V6_vaslh_acc(SHORTCODE) \
288 do { \
289 intptr_t tmpoff = offsetof(CPUHexagonState, vtmp); \
290 TCGv shift = tcg_temp_new(); \
291 tcg_gen_andi_tl(shift, RtV, 15); \
292 tcg_gen_gvec_shls(MO_16, tmpoff, VuV_off, shift, \
293 sizeof(MMVector), sizeof(MMVector)); \
294 tcg_gen_gvec_add(MO_16, VxV_off, VxV_off, tmpoff, \
295 sizeof(MMVector), sizeof(MMVector)); \
296 } while (0)
297
298 #define fGEN_TCG_V6_vaslw(SHORTCODE) \
299 do { \
300 TCGv shift = tcg_temp_new(); \
301 tcg_gen_andi_tl(shift, RtV, 31); \
302 tcg_gen_gvec_shls(MO_32, VdV_off, VuV_off, shift, \
303 sizeof(MMVector), sizeof(MMVector)); \
304 } while (0)
305
306 #define fGEN_TCG_V6_vaslw_acc(SHORTCODE) \
307 do { \
308 intptr_t tmpoff = offsetof(CPUHexagonState, vtmp); \
309 TCGv shift = tcg_temp_new(); \
310 tcg_gen_andi_tl(shift, RtV, 31); \
311 tcg_gen_gvec_shls(MO_32, tmpoff, VuV_off, shift, \
312 sizeof(MMVector), sizeof(MMVector)); \
313 tcg_gen_gvec_add(MO_32, VxV_off, VxV_off, tmpoff, \
314 sizeof(MMVector), sizeof(MMVector)); \
315 } while (0)
316
317 /* Vector max - various forms */
318 #define fGEN_TCG_V6_vmaxw(SHORTCODE) \
319 tcg_gen_gvec_smax(MO_32, VdV_off, VuV_off, VvV_off, \
320 sizeof(MMVector), sizeof(MMVector))
321 #define fGEN_TCG_V6_vmaxh(SHORTCODE) \
322 tcg_gen_gvec_smax(MO_16, VdV_off, VuV_off, VvV_off, \
323 sizeof(MMVector), sizeof(MMVector))
324 #define fGEN_TCG_V6_vmaxuh(SHORTCODE) \
325 tcg_gen_gvec_umax(MO_16, VdV_off, VuV_off, VvV_off, \
326 sizeof(MMVector), sizeof(MMVector))
327 #define fGEN_TCG_V6_vmaxb(SHORTCODE) \
328 tcg_gen_gvec_smax(MO_8, VdV_off, VuV_off, VvV_off, \
329 sizeof(MMVector), sizeof(MMVector))
330 #define fGEN_TCG_V6_vmaxub(SHORTCODE) \
331 tcg_gen_gvec_umax(MO_8, VdV_off, VuV_off, VvV_off, \
332 sizeof(MMVector), sizeof(MMVector))
333
334 /* Vector min - various forms */
335 #define fGEN_TCG_V6_vminw(SHORTCODE) \
336 tcg_gen_gvec_smin(MO_32, VdV_off, VuV_off, VvV_off, \
337 sizeof(MMVector), sizeof(MMVector))
338 #define fGEN_TCG_V6_vminh(SHORTCODE) \
339 tcg_gen_gvec_smin(MO_16, VdV_off, VuV_off, VvV_off, \
340 sizeof(MMVector), sizeof(MMVector))
341 #define fGEN_TCG_V6_vminuh(SHORTCODE) \
342 tcg_gen_gvec_umin(MO_16, VdV_off, VuV_off, VvV_off, \
343 sizeof(MMVector), sizeof(MMVector))
344 #define fGEN_TCG_V6_vminb(SHORTCODE) \
345 tcg_gen_gvec_smin(MO_8, VdV_off, VuV_off, VvV_off, \
346 sizeof(MMVector), sizeof(MMVector))
347 #define fGEN_TCG_V6_vminub(SHORTCODE) \
348 tcg_gen_gvec_umin(MO_8, VdV_off, VuV_off, VvV_off, \
349 sizeof(MMVector), sizeof(MMVector))
350
351 /* Vector logical ops */
352 #define fGEN_TCG_V6_vxor(SHORTCODE) \
353 tcg_gen_gvec_xor(MO_64, VdV_off, VuV_off, VvV_off, \
354 sizeof(MMVector), sizeof(MMVector))
355
356 #define fGEN_TCG_V6_vand(SHORTCODE) \
357 tcg_gen_gvec_and(MO_64, VdV_off, VuV_off, VvV_off, \
358 sizeof(MMVector), sizeof(MMVector))
359
360 #define fGEN_TCG_V6_vor(SHORTCODE) \
361 tcg_gen_gvec_or(MO_64, VdV_off, VuV_off, VvV_off, \
362 sizeof(MMVector), sizeof(MMVector))
363
364 #define fGEN_TCG_V6_vnot(SHORTCODE) \
365 tcg_gen_gvec_not(MO_64, VdV_off, VuV_off, \
366 sizeof(MMVector), sizeof(MMVector))
367
368 /* Q register logical ops */
369 #define fGEN_TCG_V6_pred_or(SHORTCODE) \
370 tcg_gen_gvec_or(MO_64, QdV_off, QsV_off, QtV_off, \
371 sizeof(MMQReg), sizeof(MMQReg))
372
373 #define fGEN_TCG_V6_pred_and(SHORTCODE) \
374 tcg_gen_gvec_and(MO_64, QdV_off, QsV_off, QtV_off, \
375 sizeof(MMQReg), sizeof(MMQReg))
376
377 #define fGEN_TCG_V6_pred_xor(SHORTCODE) \
378 tcg_gen_gvec_xor(MO_64, QdV_off, QsV_off, QtV_off, \
379 sizeof(MMQReg), sizeof(MMQReg))
380
381 #define fGEN_TCG_V6_pred_or_n(SHORTCODE) \
382 tcg_gen_gvec_orc(MO_64, QdV_off, QsV_off, QtV_off, \
383 sizeof(MMQReg), sizeof(MMQReg))
384
385 #define fGEN_TCG_V6_pred_and_n(SHORTCODE) \
386 tcg_gen_gvec_andc(MO_64, QdV_off, QsV_off, QtV_off, \
387 sizeof(MMQReg), sizeof(MMQReg))
388
389 #define fGEN_TCG_V6_pred_not(SHORTCODE) \
390 tcg_gen_gvec_not(MO_64, QdV_off, QsV_off, \
391 sizeof(MMQReg), sizeof(MMQReg))
392
393 /* Vector compares */
394 #define fGEN_TCG_VEC_CMP(COND, TYPE, SIZE) \
395 do { \
396 intptr_t tmpoff = offsetof(CPUHexagonState, vtmp); \
397 tcg_gen_gvec_cmp(COND, TYPE, tmpoff, VuV_off, VvV_off, \
398 sizeof(MMVector), sizeof(MMVector)); \
399 vec_to_qvec(SIZE, QdV_off, tmpoff); \
400 } while (0)
401
402 #define fGEN_TCG_V6_vgtw(SHORTCODE) \
403 fGEN_TCG_VEC_CMP(TCG_COND_GT, MO_32, 4)
404 #define fGEN_TCG_V6_vgth(SHORTCODE) \
405 fGEN_TCG_VEC_CMP(TCG_COND_GT, MO_16, 2)
406 #define fGEN_TCG_V6_vgtb(SHORTCODE) \
407 fGEN_TCG_VEC_CMP(TCG_COND_GT, MO_8, 1)
408
409 #define fGEN_TCG_V6_vgtuw(SHORTCODE) \
410 fGEN_TCG_VEC_CMP(TCG_COND_GTU, MO_32, 4)
411 #define fGEN_TCG_V6_vgtuh(SHORTCODE) \
412 fGEN_TCG_VEC_CMP(TCG_COND_GTU, MO_16, 2)
413 #define fGEN_TCG_V6_vgtub(SHORTCODE) \
414 fGEN_TCG_VEC_CMP(TCG_COND_GTU, MO_8, 1)
415
416 #define fGEN_TCG_V6_veqw(SHORTCODE) \
417 fGEN_TCG_VEC_CMP(TCG_COND_EQ, MO_32, 4)
418 #define fGEN_TCG_V6_veqh(SHORTCODE) \
419 fGEN_TCG_VEC_CMP(TCG_COND_EQ, MO_16, 2)
420 #define fGEN_TCG_V6_veqb(SHORTCODE) \
421 fGEN_TCG_VEC_CMP(TCG_COND_EQ, MO_8, 1)
422
423 #define fGEN_TCG_VEC_CMP_OP(COND, TYPE, SIZE, OP) \
424 do { \
425 intptr_t tmpoff = offsetof(CPUHexagonState, vtmp); \
426 intptr_t qoff = offsetof(CPUHexagonState, qtmp); \
427 tcg_gen_gvec_cmp(COND, TYPE, tmpoff, VuV_off, VvV_off, \
428 sizeof(MMVector), sizeof(MMVector)); \
429 vec_to_qvec(SIZE, qoff, tmpoff); \
430 OP(MO_64, QxV_off, QxV_off, qoff, sizeof(MMQReg), sizeof(MMQReg)); \
431 } while (0)
432
433 #define fGEN_TCG_V6_vgtw_and(SHORTCODE) \
434 fGEN_TCG_VEC_CMP_OP(TCG_COND_GT, MO_32, 4, tcg_gen_gvec_and)
435 #define fGEN_TCG_V6_vgtw_or(SHORTCODE) \
436 fGEN_TCG_VEC_CMP_OP(TCG_COND_GT, MO_32, 4, tcg_gen_gvec_or)
437 #define fGEN_TCG_V6_vgtw_xor(SHORTCODE) \
438 fGEN_TCG_VEC_CMP_OP(TCG_COND_GT, MO_32, 4, tcg_gen_gvec_xor)
439
440 #define fGEN_TCG_V6_vgtuw_and(SHORTCODE) \
441 fGEN_TCG_VEC_CMP_OP(TCG_COND_GTU, MO_32, 4, tcg_gen_gvec_and)
442 #define fGEN_TCG_V6_vgtuw_or(SHORTCODE) \
443 fGEN_TCG_VEC_CMP_OP(TCG_COND_GTU, MO_32, 4, tcg_gen_gvec_or)
444 #define fGEN_TCG_V6_vgtuw_xor(SHORTCODE) \
445 fGEN_TCG_VEC_CMP_OP(TCG_COND_GTU, MO_32, 4, tcg_gen_gvec_xor)
446
447 #define fGEN_TCG_V6_vgth_and(SHORTCODE) \
448 fGEN_TCG_VEC_CMP_OP(TCG_COND_GT, MO_16, 2, tcg_gen_gvec_and)
449 #define fGEN_TCG_V6_vgth_or(SHORTCODE) \
450 fGEN_TCG_VEC_CMP_OP(TCG_COND_GT, MO_16, 2, tcg_gen_gvec_or)
451 #define fGEN_TCG_V6_vgth_xor(SHORTCODE) \
452 fGEN_TCG_VEC_CMP_OP(TCG_COND_GT, MO_16, 2, tcg_gen_gvec_xor)
453
454 #define fGEN_TCG_V6_vgtuh_and(SHORTCODE) \
455 fGEN_TCG_VEC_CMP_OP(TCG_COND_GTU, MO_16, 2, tcg_gen_gvec_and)
456 #define fGEN_TCG_V6_vgtuh_or(SHORTCODE) \
457 fGEN_TCG_VEC_CMP_OP(TCG_COND_GTU, MO_16, 2, tcg_gen_gvec_or)
458 #define fGEN_TCG_V6_vgtuh_xor(SHORTCODE) \
459 fGEN_TCG_VEC_CMP_OP(TCG_COND_GTU, MO_16, 2, tcg_gen_gvec_xor)
460
461 #define fGEN_TCG_V6_vgtb_and(SHORTCODE) \
462 fGEN_TCG_VEC_CMP_OP(TCG_COND_GT, MO_8, 1, tcg_gen_gvec_and)
463 #define fGEN_TCG_V6_vgtb_or(SHORTCODE) \
464 fGEN_TCG_VEC_CMP_OP(TCG_COND_GT, MO_8, 1, tcg_gen_gvec_or)
465 #define fGEN_TCG_V6_vgtb_xor(SHORTCODE) \
466 fGEN_TCG_VEC_CMP_OP(TCG_COND_GT, MO_8, 1, tcg_gen_gvec_xor)
467
468 #define fGEN_TCG_V6_vgtub_and(SHORTCODE) \
469 fGEN_TCG_VEC_CMP_OP(TCG_COND_GTU, MO_8, 1, tcg_gen_gvec_and)
470 #define fGEN_TCG_V6_vgtub_or(SHORTCODE) \
471 fGEN_TCG_VEC_CMP_OP(TCG_COND_GTU, MO_8, 1, tcg_gen_gvec_or)
472 #define fGEN_TCG_V6_vgtub_xor(SHORTCODE) \
473 fGEN_TCG_VEC_CMP_OP(TCG_COND_GTU, MO_8, 1, tcg_gen_gvec_xor)
474
475 #define fGEN_TCG_V6_veqw_and(SHORTCODE) \
476 fGEN_TCG_VEC_CMP_OP(TCG_COND_EQ, MO_32, 4, tcg_gen_gvec_and)
477 #define fGEN_TCG_V6_veqw_or(SHORTCODE) \
478 fGEN_TCG_VEC_CMP_OP(TCG_COND_EQ, MO_32, 4, tcg_gen_gvec_or)
479 #define fGEN_TCG_V6_veqw_xor(SHORTCODE) \
480 fGEN_TCG_VEC_CMP_OP(TCG_COND_EQ, MO_32, 4, tcg_gen_gvec_xor)
481
482 #define fGEN_TCG_V6_veqh_and(SHORTCODE) \
483 fGEN_TCG_VEC_CMP_OP(TCG_COND_EQ, MO_16, 2, tcg_gen_gvec_and)
484 #define fGEN_TCG_V6_veqh_or(SHORTCODE) \
485 fGEN_TCG_VEC_CMP_OP(TCG_COND_EQ, MO_16, 2, tcg_gen_gvec_or)
486 #define fGEN_TCG_V6_veqh_xor(SHORTCODE) \
487 fGEN_TCG_VEC_CMP_OP(TCG_COND_EQ, MO_16, 2, tcg_gen_gvec_xor)
488
489 #define fGEN_TCG_V6_veqb_and(SHORTCODE) \
490 fGEN_TCG_VEC_CMP_OP(TCG_COND_EQ, MO_8, 1, tcg_gen_gvec_and)
491 #define fGEN_TCG_V6_veqb_or(SHORTCODE) \
492 fGEN_TCG_VEC_CMP_OP(TCG_COND_EQ, MO_8, 1, tcg_gen_gvec_or)
493 #define fGEN_TCG_V6_veqb_xor(SHORTCODE) \
494 fGEN_TCG_VEC_CMP_OP(TCG_COND_EQ, MO_8, 1, tcg_gen_gvec_xor)
495
496 /* Vector splat - various forms */
497 #define fGEN_TCG_V6_lvsplatw(SHORTCODE) \
498 tcg_gen_gvec_dup_i32(MO_32, VdV_off, \
499 sizeof(MMVector), sizeof(MMVector), RtV)
500
501 #define fGEN_TCG_V6_lvsplath(SHORTCODE) \
502 tcg_gen_gvec_dup_i32(MO_16, VdV_off, \
503 sizeof(MMVector), sizeof(MMVector), RtV)
504
505 #define fGEN_TCG_V6_lvsplatb(SHORTCODE) \
506 tcg_gen_gvec_dup_i32(MO_8, VdV_off, \
507 sizeof(MMVector), sizeof(MMVector), RtV)
508
509 /* Vector absolute value - various forms */
510 #define fGEN_TCG_V6_vabsb(SHORTCODE) \
511 tcg_gen_gvec_abs(MO_8, VdV_off, VuV_off, \
512 sizeof(MMVector), sizeof(MMVector))
513
514 #define fGEN_TCG_V6_vabsh(SHORTCODE) \
515 tcg_gen_gvec_abs(MO_16, VdV_off, VuV_off, \
516 sizeof(MMVector), sizeof(MMVector))
517
518 #define fGEN_TCG_V6_vabsw(SHORTCODE) \
519 tcg_gen_gvec_abs(MO_32, VdV_off, VuV_off, \
520 sizeof(MMVector), sizeof(MMVector))
521
522 /* Vector loads */
523 #define fGEN_TCG_V6_vL32b_pi(SHORTCODE) SHORTCODE
524 #define fGEN_TCG_V6_vL32Ub_pi(SHORTCODE) SHORTCODE
525 #define fGEN_TCG_V6_vL32b_cur_pi(SHORTCODE) SHORTCODE
526 #define fGEN_TCG_V6_vL32b_tmp_pi(SHORTCODE) SHORTCODE
527 #define fGEN_TCG_V6_vL32b_nt_pi(SHORTCODE) SHORTCODE
528 #define fGEN_TCG_V6_vL32b_nt_cur_pi(SHORTCODE) SHORTCODE
529 #define fGEN_TCG_V6_vL32b_nt_tmp_pi(SHORTCODE) SHORTCODE
530 #define fGEN_TCG_V6_vL32b_ai(SHORTCODE) SHORTCODE
531 #define fGEN_TCG_V6_vL32Ub_ai(SHORTCODE) SHORTCODE
532 #define fGEN_TCG_V6_vL32b_cur_ai(SHORTCODE) SHORTCODE
533 #define fGEN_TCG_V6_vL32b_tmp_ai(SHORTCODE) SHORTCODE
534 #define fGEN_TCG_V6_vL32b_nt_ai(SHORTCODE) SHORTCODE
535 #define fGEN_TCG_V6_vL32b_nt_cur_ai(SHORTCODE) SHORTCODE
536 #define fGEN_TCG_V6_vL32b_nt_tmp_ai(SHORTCODE) SHORTCODE
537 #define fGEN_TCG_V6_vL32b_ppu(SHORTCODE) SHORTCODE
538 #define fGEN_TCG_V6_vL32Ub_ppu(SHORTCODE) SHORTCODE
539 #define fGEN_TCG_V6_vL32b_cur_ppu(SHORTCODE) SHORTCODE
540 #define fGEN_TCG_V6_vL32b_tmp_ppu(SHORTCODE) SHORTCODE
541 #define fGEN_TCG_V6_vL32b_nt_ppu(SHORTCODE) SHORTCODE
542 #define fGEN_TCG_V6_vL32b_nt_cur_ppu(SHORTCODE) SHORTCODE
543 #define fGEN_TCG_V6_vL32b_nt_tmp_ppu(SHORTCODE) SHORTCODE
544
545 /* Predicated vector loads */
546 #define fGEN_TCG_PRED_VEC_LOAD(GET_EA, PRED, DSTOFF, INC) \
547 do { \
548 TCGv LSB = tcg_temp_new(); \
549 TCGLabel *false_label = gen_new_label(); \
550 TCGLabel *end_label = gen_new_label(); \
551 GET_EA; \
552 PRED; \
553 tcg_gen_brcondi_tl(TCG_COND_EQ, LSB, 0, false_label); \
554 gen_vreg_load(ctx, DSTOFF, EA, true); \
555 INC; \
556 tcg_gen_br(end_label); \
557 gen_set_label(false_label); \
558 tcg_gen_ori_tl(hex_slot_cancelled, hex_slot_cancelled, \
559 1 << insn->slot); \
560 gen_set_label(end_label); \
561 } while (0)
562
563 #define fGEN_TCG_PRED_VEC_LOAD_pred_pi \
564 fGEN_TCG_PRED_VEC_LOAD(fLSBOLD(PvV), \
565 fEA_REG(RxV), \
566 VdV_off, \
567 fPM_I(RxV, siV * sizeof(MMVector)))
568 #define fGEN_TCG_PRED_VEC_LOAD_npred_pi \
569 fGEN_TCG_PRED_VEC_LOAD(fLSBOLDNOT(PvV), \
570 fEA_REG(RxV), \
571 VdV_off, \
572 fPM_I(RxV, siV * sizeof(MMVector)))
573
574 #define fGEN_TCG_V6_vL32b_pred_pi(SHORTCODE) \
575 fGEN_TCG_PRED_VEC_LOAD_pred_pi
576 #define fGEN_TCG_V6_vL32b_npred_pi(SHORTCODE) \
577 fGEN_TCG_PRED_VEC_LOAD_npred_pi
578 #define fGEN_TCG_V6_vL32b_cur_pred_pi(SHORTCODE) \
579 fGEN_TCG_PRED_VEC_LOAD_pred_pi
580 #define fGEN_TCG_V6_vL32b_cur_npred_pi(SHORTCODE) \
581 fGEN_TCG_PRED_VEC_LOAD_npred_pi
582 #define fGEN_TCG_V6_vL32b_tmp_pred_pi(SHORTCODE) \
583 fGEN_TCG_PRED_VEC_LOAD_pred_pi
584 #define fGEN_TCG_V6_vL32b_tmp_npred_pi(SHORTCODE) \
585 fGEN_TCG_PRED_VEC_LOAD_npred_pi
586 #define fGEN_TCG_V6_vL32b_nt_pred_pi(SHORTCODE) \
587 fGEN_TCG_PRED_VEC_LOAD_pred_pi
588 #define fGEN_TCG_V6_vL32b_nt_npred_pi(SHORTCODE) \
589 fGEN_TCG_PRED_VEC_LOAD_npred_pi
590 #define fGEN_TCG_V6_vL32b_nt_cur_pred_pi(SHORTCODE) \
591 fGEN_TCG_PRED_VEC_LOAD_pred_pi
592 #define fGEN_TCG_V6_vL32b_nt_cur_npred_pi(SHORTCODE) \
593 fGEN_TCG_PRED_VEC_LOAD_npred_pi
594 #define fGEN_TCG_V6_vL32b_nt_tmp_pred_pi(SHORTCODE) \
595 fGEN_TCG_PRED_VEC_LOAD_pred_pi
596 #define fGEN_TCG_V6_vL32b_nt_tmp_npred_pi(SHORTCODE) \
597 fGEN_TCG_PRED_VEC_LOAD_npred_pi
598
599 #define fGEN_TCG_PRED_VEC_LOAD_pred_ai \
600 fGEN_TCG_PRED_VEC_LOAD(fLSBOLD(PvV), \
601 fEA_RI(RtV, siV * sizeof(MMVector)), \
602 VdV_off, \
603 do {} while (0))
604 #define fGEN_TCG_PRED_VEC_LOAD_npred_ai \
605 fGEN_TCG_PRED_VEC_LOAD(fLSBOLDNOT(PvV), \
606 fEA_RI(RtV, siV * sizeof(MMVector)), \
607 VdV_off, \
608 do {} while (0))
609
610 #define fGEN_TCG_V6_vL32b_pred_ai(SHORTCODE) \
611 fGEN_TCG_PRED_VEC_LOAD_pred_ai
612 #define fGEN_TCG_V6_vL32b_npred_ai(SHORTCODE) \
613 fGEN_TCG_PRED_VEC_LOAD_npred_ai
614 #define fGEN_TCG_V6_vL32b_cur_pred_ai(SHORTCODE) \
615 fGEN_TCG_PRED_VEC_LOAD_pred_ai
616 #define fGEN_TCG_V6_vL32b_cur_npred_ai(SHORTCODE) \
617 fGEN_TCG_PRED_VEC_LOAD_npred_ai
618 #define fGEN_TCG_V6_vL32b_tmp_pred_ai(SHORTCODE) \
619 fGEN_TCG_PRED_VEC_LOAD_pred_ai
620 #define fGEN_TCG_V6_vL32b_tmp_npred_ai(SHORTCODE) \
621 fGEN_TCG_PRED_VEC_LOAD_npred_ai
622 #define fGEN_TCG_V6_vL32b_nt_pred_ai(SHORTCODE) \
623 fGEN_TCG_PRED_VEC_LOAD_pred_ai
624 #define fGEN_TCG_V6_vL32b_nt_npred_ai(SHORTCODE) \
625 fGEN_TCG_PRED_VEC_LOAD_npred_ai
626 #define fGEN_TCG_V6_vL32b_nt_cur_pred_ai(SHORTCODE) \
627 fGEN_TCG_PRED_VEC_LOAD_pred_ai
628 #define fGEN_TCG_V6_vL32b_nt_cur_npred_ai(SHORTCODE) \
629 fGEN_TCG_PRED_VEC_LOAD_npred_ai
630 #define fGEN_TCG_V6_vL32b_nt_tmp_pred_ai(SHORTCODE) \
631 fGEN_TCG_PRED_VEC_LOAD_pred_ai
632 #define fGEN_TCG_V6_vL32b_nt_tmp_npred_ai(SHORTCODE) \
633 fGEN_TCG_PRED_VEC_LOAD_npred_ai
634
635 #define fGEN_TCG_PRED_VEC_LOAD_pred_ppu \
636 fGEN_TCG_PRED_VEC_LOAD(fLSBOLD(PvV), \
637 fEA_REG(RxV), \
638 VdV_off, \
639 fPM_M(RxV, MuV))
640 #define fGEN_TCG_PRED_VEC_LOAD_npred_ppu \
641 fGEN_TCG_PRED_VEC_LOAD(fLSBOLDNOT(PvV), \
642 fEA_REG(RxV), \
643 VdV_off, \
644 fPM_M(RxV, MuV))
645
646 #define fGEN_TCG_V6_vL32b_pred_ppu(SHORTCODE) \
647 fGEN_TCG_PRED_VEC_LOAD_pred_ppu
648 #define fGEN_TCG_V6_vL32b_npred_ppu(SHORTCODE) \
649 fGEN_TCG_PRED_VEC_LOAD_npred_ppu
650 #define fGEN_TCG_V6_vL32b_cur_pred_ppu(SHORTCODE) \
651 fGEN_TCG_PRED_VEC_LOAD_pred_ppu
652 #define fGEN_TCG_V6_vL32b_cur_npred_ppu(SHORTCODE) \
653 fGEN_TCG_PRED_VEC_LOAD_npred_ppu
654 #define fGEN_TCG_V6_vL32b_tmp_pred_ppu(SHORTCODE) \
655 fGEN_TCG_PRED_VEC_LOAD_pred_ppu
656 #define fGEN_TCG_V6_vL32b_tmp_npred_ppu(SHORTCODE) \
657 fGEN_TCG_PRED_VEC_LOAD_npred_ppu
658 #define fGEN_TCG_V6_vL32b_nt_pred_ppu(SHORTCODE) \
659 fGEN_TCG_PRED_VEC_LOAD_pred_ppu
660 #define fGEN_TCG_V6_vL32b_nt_npred_ppu(SHORTCODE) \
661 fGEN_TCG_PRED_VEC_LOAD_npred_ppu
662 #define fGEN_TCG_V6_vL32b_nt_cur_pred_ppu(SHORTCODE) \
663 fGEN_TCG_PRED_VEC_LOAD_pred_ppu
664 #define fGEN_TCG_V6_vL32b_nt_cur_npred_ppu(SHORTCODE) \
665 fGEN_TCG_PRED_VEC_LOAD_npred_ppu
666 #define fGEN_TCG_V6_vL32b_nt_tmp_pred_ppu(SHORTCODE) \
667 fGEN_TCG_PRED_VEC_LOAD_pred_ppu
668 #define fGEN_TCG_V6_vL32b_nt_tmp_npred_ppu(SHORTCODE) \
669 fGEN_TCG_PRED_VEC_LOAD_npred_ppu
670
671 /* Vector stores */
672 #define fGEN_TCG_V6_vS32b_pi(SHORTCODE) SHORTCODE
673 #define fGEN_TCG_V6_vS32Ub_pi(SHORTCODE) SHORTCODE
674 #define fGEN_TCG_V6_vS32b_nt_pi(SHORTCODE) SHORTCODE
675 #define fGEN_TCG_V6_vS32b_ai(SHORTCODE) SHORTCODE
676 #define fGEN_TCG_V6_vS32Ub_ai(SHORTCODE) SHORTCODE
677 #define fGEN_TCG_V6_vS32b_nt_ai(SHORTCODE) SHORTCODE
678 #define fGEN_TCG_V6_vS32b_ppu(SHORTCODE) SHORTCODE
679 #define fGEN_TCG_V6_vS32Ub_ppu(SHORTCODE) SHORTCODE
680 #define fGEN_TCG_V6_vS32b_nt_ppu(SHORTCODE) SHORTCODE
681
682 /* New value vector stores */
683 #define fGEN_TCG_NEWVAL_VEC_STORE(GET_EA, INC) \
684 do { \
685 GET_EA; \
686 gen_vreg_store(ctx, EA, OsN_off, insn->slot, true); \
687 INC; \
688 } while (0)
689
690 #define fGEN_TCG_NEWVAL_VEC_STORE_pi \
691 fGEN_TCG_NEWVAL_VEC_STORE(fEA_REG(RxV), fPM_I(RxV, siV * sizeof(MMVector)))
692
693 #define fGEN_TCG_V6_vS32b_new_pi(SHORTCODE) \
694 fGEN_TCG_NEWVAL_VEC_STORE_pi
695 #define fGEN_TCG_V6_vS32b_nt_new_pi(SHORTCODE) \
696 fGEN_TCG_NEWVAL_VEC_STORE_pi
697
698 #define fGEN_TCG_NEWVAL_VEC_STORE_ai \
699 fGEN_TCG_NEWVAL_VEC_STORE(fEA_RI(RtV, siV * sizeof(MMVector)), \
700 do { } while (0))
701
702 #define fGEN_TCG_V6_vS32b_new_ai(SHORTCODE) \
703 fGEN_TCG_NEWVAL_VEC_STORE_ai
704 #define fGEN_TCG_V6_vS32b_nt_new_ai(SHORTCODE) \
705 fGEN_TCG_NEWVAL_VEC_STORE_ai
706
707 #define fGEN_TCG_NEWVAL_VEC_STORE_ppu \
708 fGEN_TCG_NEWVAL_VEC_STORE(fEA_REG(RxV), fPM_M(RxV, MuV))
709
710 #define fGEN_TCG_V6_vS32b_new_ppu(SHORTCODE) \
711 fGEN_TCG_NEWVAL_VEC_STORE_ppu
712 #define fGEN_TCG_V6_vS32b_nt_new_ppu(SHORTCODE) \
713 fGEN_TCG_NEWVAL_VEC_STORE_ppu
714
715 /* Predicated vector stores */
716 #define fGEN_TCG_PRED_VEC_STORE(GET_EA, PRED, SRCOFF, ALIGN, INC) \
717 do { \
718 TCGv LSB = tcg_temp_new(); \
719 TCGLabel *false_label = gen_new_label(); \
720 TCGLabel *end_label = gen_new_label(); \
721 GET_EA; \
722 PRED; \
723 tcg_gen_brcondi_tl(TCG_COND_EQ, LSB, 0, false_label); \
724 gen_vreg_store(ctx, EA, SRCOFF, insn->slot, ALIGN); \
725 INC; \
726 tcg_gen_br(end_label); \
727 gen_set_label(false_label); \
728 tcg_gen_ori_tl(hex_slot_cancelled, hex_slot_cancelled, \
729 1 << insn->slot); \
730 gen_set_label(end_label); \
731 } while (0)
732
733 #define fGEN_TCG_PRED_VEC_STORE_pred_pi(ALIGN) \
734 fGEN_TCG_PRED_VEC_STORE(fLSBOLD(PvV), \
735 fEA_REG(RxV), \
736 VsV_off, ALIGN, \
737 fPM_I(RxV, siV * sizeof(MMVector)))
738 #define fGEN_TCG_PRED_VEC_STORE_npred_pi(ALIGN) \
739 fGEN_TCG_PRED_VEC_STORE(fLSBOLDNOT(PvV), \
740 fEA_REG(RxV), \
741 VsV_off, ALIGN, \
742 fPM_I(RxV, siV * sizeof(MMVector)))
743 #define fGEN_TCG_PRED_VEC_STORE_new_pred_pi \
744 fGEN_TCG_PRED_VEC_STORE(fLSBOLD(PvV), \
745 fEA_REG(RxV), \
746 OsN_off, true, \
747 fPM_I(RxV, siV * sizeof(MMVector)))
748 #define fGEN_TCG_PRED_VEC_STORE_new_npred_pi \
749 fGEN_TCG_PRED_VEC_STORE(fLSBOLDNOT(PvV), \
750 fEA_REG(RxV), \
751 OsN_off, true, \
752 fPM_I(RxV, siV * sizeof(MMVector)))
753
754 #define fGEN_TCG_V6_vS32b_pred_pi(SHORTCODE) \
755 fGEN_TCG_PRED_VEC_STORE_pred_pi(true)
756 #define fGEN_TCG_V6_vS32b_npred_pi(SHORTCODE) \
757 fGEN_TCG_PRED_VEC_STORE_npred_pi(true)
758 #define fGEN_TCG_V6_vS32Ub_pred_pi(SHORTCODE) \
759 fGEN_TCG_PRED_VEC_STORE_pred_pi(false)
760 #define fGEN_TCG_V6_vS32Ub_npred_pi(SHORTCODE) \
761 fGEN_TCG_PRED_VEC_STORE_npred_pi(false)
762 #define fGEN_TCG_V6_vS32b_nt_pred_pi(SHORTCODE) \
763 fGEN_TCG_PRED_VEC_STORE_pred_pi(true)
764 #define fGEN_TCG_V6_vS32b_nt_npred_pi(SHORTCODE) \
765 fGEN_TCG_PRED_VEC_STORE_npred_pi(true)
766 #define fGEN_TCG_V6_vS32b_new_pred_pi(SHORTCODE) \
767 fGEN_TCG_PRED_VEC_STORE_new_pred_pi
768 #define fGEN_TCG_V6_vS32b_new_npred_pi(SHORTCODE) \
769 fGEN_TCG_PRED_VEC_STORE_new_npred_pi
770 #define fGEN_TCG_V6_vS32b_nt_new_pred_pi(SHORTCODE) \
771 fGEN_TCG_PRED_VEC_STORE_new_pred_pi
772 #define fGEN_TCG_V6_vS32b_nt_new_npred_pi(SHORTCODE) \
773 fGEN_TCG_PRED_VEC_STORE_new_npred_pi
774
775 #define fGEN_TCG_PRED_VEC_STORE_pred_ai(ALIGN) \
776 fGEN_TCG_PRED_VEC_STORE(fLSBOLD(PvV), \
777 fEA_RI(RtV, siV * sizeof(MMVector)), \
778 VsV_off, ALIGN, \
779 do { } while (0))
780 #define fGEN_TCG_PRED_VEC_STORE_npred_ai(ALIGN) \
781 fGEN_TCG_PRED_VEC_STORE(fLSBOLDNOT(PvV), \
782 fEA_RI(RtV, siV * sizeof(MMVector)), \
783 VsV_off, ALIGN, \
784 do { } while (0))
785 #define fGEN_TCG_PRED_VEC_STORE_new_pred_ai \
786 fGEN_TCG_PRED_VEC_STORE(fLSBOLD(PvV), \
787 fEA_RI(RtV, siV * sizeof(MMVector)), \
788 OsN_off, true, \
789 do { } while (0))
790 #define fGEN_TCG_PRED_VEC_STORE_new_npred_ai \
791 fGEN_TCG_PRED_VEC_STORE(fLSBOLDNOT(PvV), \
792 fEA_RI(RtV, siV * sizeof(MMVector)), \
793 OsN_off, true, \
794 do { } while (0))
795
796 #define fGEN_TCG_V6_vS32b_pred_ai(SHORTCODE) \
797 fGEN_TCG_PRED_VEC_STORE_pred_ai(true)
798 #define fGEN_TCG_V6_vS32b_npred_ai(SHORTCODE) \
799 fGEN_TCG_PRED_VEC_STORE_npred_ai(true)
800 #define fGEN_TCG_V6_vS32Ub_pred_ai(SHORTCODE) \
801 fGEN_TCG_PRED_VEC_STORE_pred_ai(false)
802 #define fGEN_TCG_V6_vS32Ub_npred_ai(SHORTCODE) \
803 fGEN_TCG_PRED_VEC_STORE_npred_ai(false)
804 #define fGEN_TCG_V6_vS32b_nt_pred_ai(SHORTCODE) \
805 fGEN_TCG_PRED_VEC_STORE_pred_ai(true)
806 #define fGEN_TCG_V6_vS32b_nt_npred_ai(SHORTCODE) \
807 fGEN_TCG_PRED_VEC_STORE_npred_ai(true)
808 #define fGEN_TCG_V6_vS32b_new_pred_ai(SHORTCODE) \
809 fGEN_TCG_PRED_VEC_STORE_new_pred_ai
810 #define fGEN_TCG_V6_vS32b_new_npred_ai(SHORTCODE) \
811 fGEN_TCG_PRED_VEC_STORE_new_npred_ai
812 #define fGEN_TCG_V6_vS32b_nt_new_pred_ai(SHORTCODE) \
813 fGEN_TCG_PRED_VEC_STORE_new_pred_ai
814 #define fGEN_TCG_V6_vS32b_nt_new_npred_ai(SHORTCODE) \
815 fGEN_TCG_PRED_VEC_STORE_new_npred_ai
816
817 #define fGEN_TCG_PRED_VEC_STORE_pred_ppu(ALIGN) \
818 fGEN_TCG_PRED_VEC_STORE(fLSBOLD(PvV), \
819 fEA_REG(RxV), \
820 VsV_off, ALIGN, \
821 fPM_M(RxV, MuV))
822 #define fGEN_TCG_PRED_VEC_STORE_npred_ppu(ALIGN) \
823 fGEN_TCG_PRED_VEC_STORE(fLSBOLDNOT(PvV), \
824 fEA_REG(RxV), \
825 VsV_off, ALIGN, \
826 fPM_M(RxV, MuV))
827 #define fGEN_TCG_PRED_VEC_STORE_new_pred_ppu \
828 fGEN_TCG_PRED_VEC_STORE(fLSBOLD(PvV), \
829 fEA_REG(RxV), \
830 OsN_off, true, \
831 fPM_M(RxV, MuV))
832 #define fGEN_TCG_PRED_VEC_STORE_new_npred_ppu \
833 fGEN_TCG_PRED_VEC_STORE(fLSBOLDNOT(PvV), \
834 fEA_REG(RxV), \
835 OsN_off, true, \
836 fPM_M(RxV, MuV))
837
838 #define fGEN_TCG_V6_vS32b_pred_ppu(SHORTCODE) \
839 fGEN_TCG_PRED_VEC_STORE_pred_ppu(true)
840 #define fGEN_TCG_V6_vS32b_npred_ppu(SHORTCODE) \
841 fGEN_TCG_PRED_VEC_STORE_npred_ppu(true)
842 #define fGEN_TCG_V6_vS32Ub_pred_ppu(SHORTCODE) \
843 fGEN_TCG_PRED_VEC_STORE_pred_ppu(false)
844 #define fGEN_TCG_V6_vS32Ub_npred_ppu(SHORTCODE) \
845 fGEN_TCG_PRED_VEC_STORE_npred_ppu(false)
846 #define fGEN_TCG_V6_vS32b_nt_pred_ppu(SHORTCODE) \
847 fGEN_TCG_PRED_VEC_STORE_pred_ppu(true)
848 #define fGEN_TCG_V6_vS32b_nt_npred_ppu(SHORTCODE) \
849 fGEN_TCG_PRED_VEC_STORE_npred_ppu(true)
850 #define fGEN_TCG_V6_vS32b_new_pred_ppu(SHORTCODE) \
851 fGEN_TCG_PRED_VEC_STORE_new_pred_ppu
852 #define fGEN_TCG_V6_vS32b_new_npred_ppu(SHORTCODE) \
853 fGEN_TCG_PRED_VEC_STORE_new_npred_ppu
854 #define fGEN_TCG_V6_vS32b_nt_new_pred_ppu(SHORTCODE) \
855 fGEN_TCG_PRED_VEC_STORE_new_pred_ppu
856 #define fGEN_TCG_V6_vS32b_nt_new_npred_ppu(SHORTCODE) \
857 fGEN_TCG_PRED_VEC_STORE_new_npred_ppu
858
859 /* Masked vector stores */
860 #define fGEN_TCG_V6_vS32b_qpred_pi(SHORTCODE) SHORTCODE
861 #define fGEN_TCG_V6_vS32b_nt_qpred_pi(SHORTCODE) SHORTCODE
862 #define fGEN_TCG_V6_vS32b_qpred_ai(SHORTCODE) SHORTCODE
863 #define fGEN_TCG_V6_vS32b_nt_qpred_ai(SHORTCODE) SHORTCODE
864 #define fGEN_TCG_V6_vS32b_qpred_ppu(SHORTCODE) SHORTCODE
865 #define fGEN_TCG_V6_vS32b_nt_qpred_ppu(SHORTCODE) SHORTCODE
866 #define fGEN_TCG_V6_vS32b_nqpred_pi(SHORTCODE) SHORTCODE
867 #define fGEN_TCG_V6_vS32b_nt_nqpred_pi(SHORTCODE) SHORTCODE
868 #define fGEN_TCG_V6_vS32b_nqpred_ai(SHORTCODE) SHORTCODE
869 #define fGEN_TCG_V6_vS32b_nt_nqpred_ai(SHORTCODE) SHORTCODE
870 #define fGEN_TCG_V6_vS32b_nqpred_ppu(SHORTCODE) SHORTCODE
871 #define fGEN_TCG_V6_vS32b_nt_nqpred_ppu(SHORTCODE) SHORTCODE
872
873 /* Store release not modelled in qemu, but need to suppress compiler warnings */
874 #define fGEN_TCG_V6_vS32b_srls_pi(SHORTCODE) \
875 do { \
876 siV = siV; \
877 } while (0)
878 #define fGEN_TCG_V6_vS32b_srls_ai(SHORTCODE) \
879 do { \
880 RtV = RtV; \
881 siV = siV; \
882 } while (0)
883 #define fGEN_TCG_V6_vS32b_srls_ppu(SHORTCODE) \
884 do { \
885 MuV = MuV; \
886 } while (0)
887
888 #endif