2 * MIPS SIMD Architecture Module Instruction emulation helpers for QEMU.
4 * Copyright (c) 2014 Imagination Technologies
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
20 #include "qemu/osdep.h"
23 #include "exec/exec-all.h"
24 #include "exec/helper-proto.h"
25 #include "fpu/softfloat.h"
27 /* Data format min and max values */
28 #define DF_BITS(df) (1 << ((df) + 3))
30 #define DF_MAX_INT(df) (int64_t)((1LL << (DF_BITS(df) - 1)) - 1)
31 #define M_MAX_INT(m) (int64_t)((1LL << ((m) - 1)) - 1)
33 #define DF_MIN_INT(df) (int64_t)(-(1LL << (DF_BITS(df) - 1)))
34 #define M_MIN_INT(m) (int64_t)(-(1LL << ((m) - 1)))
36 #define DF_MAX_UINT(df) (uint64_t)(-1ULL >> (64 - DF_BITS(df)))
37 #define M_MAX_UINT(m) (uint64_t)(-1ULL >> (64 - (m)))
39 #define UNSIGNED(x, df) ((x) & DF_MAX_UINT(df))
40 #define SIGNED(x, df) \
41 ((((int64_t)x) << (64 - DF_BITS(df))) >> (64 - DF_BITS(df)))
43 /* Element-by-element access macros */
44 #define DF_ELEMENTS(df) (MSA_WRLEN / DF_BITS(df))
52 * +---------------+----------------------------------------------------------+
53 * | NLOC.B | Vector Leading Ones Count (byte) |
54 * | NLOC.H | Vector Leading Ones Count (halfword) |
55 * | NLOC.W | Vector Leading Ones Count (word) |
56 * | NLOC.D | Vector Leading Ones Count (doubleword) |
57 * | NLZC.B | Vector Leading Zeros Count (byte) |
58 * | NLZC.H | Vector Leading Zeros Count (halfword) |
59 * | NLZC.W | Vector Leading Zeros Count (word) |
60 * | NLZC.D | Vector Leading Zeros Count (doubleword) |
61 * | PCNT.B | Vector Population Count (byte) |
62 * | PCNT.H | Vector Population Count (halfword) |
63 * | PCNT.W | Vector Population Count (word) |
64 * | PCNT.D | Vector Population Count (doubleword) |
65 * +---------------+----------------------------------------------------------+
68 static inline int64_t msa_nlzc_df(uint32_t df, int64_t arg)
73 x = UNSIGNED(arg, df);
89 static inline int64_t msa_nloc_df(uint32_t df, int64_t arg)
91 return msa_nlzc_df(df, UNSIGNED((~arg), df));
94 void helper_msa_nloc_b(CPUMIPSState *env, uint32_t wd, uint32_t ws)
96 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
97 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
99 pwd->b[0] = msa_nloc_df(DF_BYTE, pws->b[0]);
100 pwd->b[1] = msa_nloc_df(DF_BYTE, pws->b[1]);
101 pwd->b[2] = msa_nloc_df(DF_BYTE, pws->b[2]);
102 pwd->b[3] = msa_nloc_df(DF_BYTE, pws->b[3]);
103 pwd->b[4] = msa_nloc_df(DF_BYTE, pws->b[4]);
104 pwd->b[5] = msa_nloc_df(DF_BYTE, pws->b[5]);
105 pwd->b[6] = msa_nloc_df(DF_BYTE, pws->b[6]);
106 pwd->b[7] = msa_nloc_df(DF_BYTE, pws->b[7]);
107 pwd->b[8] = msa_nloc_df(DF_BYTE, pws->b[8]);
108 pwd->b[9] = msa_nloc_df(DF_BYTE, pws->b[9]);
109 pwd->b[10] = msa_nloc_df(DF_BYTE, pws->b[10]);
110 pwd->b[11] = msa_nloc_df(DF_BYTE, pws->b[11]);
111 pwd->b[12] = msa_nloc_df(DF_BYTE, pws->b[12]);
112 pwd->b[13] = msa_nloc_df(DF_BYTE, pws->b[13]);
113 pwd->b[14] = msa_nloc_df(DF_BYTE, pws->b[14]);
114 pwd->b[15] = msa_nloc_df(DF_BYTE, pws->b[15]);
117 void helper_msa_nloc_h(CPUMIPSState *env, uint32_t wd, uint32_t ws)
119 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
120 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
122 pwd->h[0] = msa_nloc_df(DF_HALF, pws->h[0]);
123 pwd->h[1] = msa_nloc_df(DF_HALF, pws->h[1]);
124 pwd->h[2] = msa_nloc_df(DF_HALF, pws->h[2]);
125 pwd->h[3] = msa_nloc_df(DF_HALF, pws->h[3]);
126 pwd->h[4] = msa_nloc_df(DF_HALF, pws->h[4]);
127 pwd->h[5] = msa_nloc_df(DF_HALF, pws->h[5]);
128 pwd->h[6] = msa_nloc_df(DF_HALF, pws->h[6]);
129 pwd->h[7] = msa_nloc_df(DF_HALF, pws->h[7]);
132 void helper_msa_nloc_w(CPUMIPSState *env, uint32_t wd, uint32_t ws)
134 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
135 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
137 pwd->w[0] = msa_nloc_df(DF_WORD, pws->w[0]);
138 pwd->w[1] = msa_nloc_df(DF_WORD, pws->w[1]);
139 pwd->w[2] = msa_nloc_df(DF_WORD, pws->w[2]);
140 pwd->w[3] = msa_nloc_df(DF_WORD, pws->w[3]);
143 void helper_msa_nloc_d(CPUMIPSState *env, uint32_t wd, uint32_t ws)
145 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
146 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
148 pwd->d[0] = msa_nloc_df(DF_DOUBLE, pws->d[0]);
149 pwd->d[1] = msa_nloc_df(DF_DOUBLE, pws->d[1]);
152 void helper_msa_nlzc_b(CPUMIPSState *env, uint32_t wd, uint32_t ws)
154 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
155 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
157 pwd->b[0] = msa_nlzc_df(DF_BYTE, pws->b[0]);
158 pwd->b[1] = msa_nlzc_df(DF_BYTE, pws->b[1]);
159 pwd->b[2] = msa_nlzc_df(DF_BYTE, pws->b[2]);
160 pwd->b[3] = msa_nlzc_df(DF_BYTE, pws->b[3]);
161 pwd->b[4] = msa_nlzc_df(DF_BYTE, pws->b[4]);
162 pwd->b[5] = msa_nlzc_df(DF_BYTE, pws->b[5]);
163 pwd->b[6] = msa_nlzc_df(DF_BYTE, pws->b[6]);
164 pwd->b[7] = msa_nlzc_df(DF_BYTE, pws->b[7]);
165 pwd->b[8] = msa_nlzc_df(DF_BYTE, pws->b[8]);
166 pwd->b[9] = msa_nlzc_df(DF_BYTE, pws->b[9]);
167 pwd->b[10] = msa_nlzc_df(DF_BYTE, pws->b[10]);
168 pwd->b[11] = msa_nlzc_df(DF_BYTE, pws->b[11]);
169 pwd->b[12] = msa_nlzc_df(DF_BYTE, pws->b[12]);
170 pwd->b[13] = msa_nlzc_df(DF_BYTE, pws->b[13]);
171 pwd->b[14] = msa_nlzc_df(DF_BYTE, pws->b[14]);
172 pwd->b[15] = msa_nlzc_df(DF_BYTE, pws->b[15]);
175 void helper_msa_nlzc_h(CPUMIPSState *env, uint32_t wd, uint32_t ws)
177 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
178 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
180 pwd->h[0] = msa_nlzc_df(DF_HALF, pws->h[0]);
181 pwd->h[1] = msa_nlzc_df(DF_HALF, pws->h[1]);
182 pwd->h[2] = msa_nlzc_df(DF_HALF, pws->h[2]);
183 pwd->h[3] = msa_nlzc_df(DF_HALF, pws->h[3]);
184 pwd->h[4] = msa_nlzc_df(DF_HALF, pws->h[4]);
185 pwd->h[5] = msa_nlzc_df(DF_HALF, pws->h[5]);
186 pwd->h[6] = msa_nlzc_df(DF_HALF, pws->h[6]);
187 pwd->h[7] = msa_nlzc_df(DF_HALF, pws->h[7]);
190 void helper_msa_nlzc_w(CPUMIPSState *env, uint32_t wd, uint32_t ws)
192 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
193 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
195 pwd->w[0] = msa_nlzc_df(DF_WORD, pws->w[0]);
196 pwd->w[1] = msa_nlzc_df(DF_WORD, pws->w[1]);
197 pwd->w[2] = msa_nlzc_df(DF_WORD, pws->w[2]);
198 pwd->w[3] = msa_nlzc_df(DF_WORD, pws->w[3]);
201 void helper_msa_nlzc_d(CPUMIPSState *env, uint32_t wd, uint32_t ws)
203 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
204 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
206 pwd->d[0] = msa_nlzc_df(DF_DOUBLE, pws->d[0]);
207 pwd->d[1] = msa_nlzc_df(DF_DOUBLE, pws->d[1]);
210 static inline int64_t msa_pcnt_df(uint32_t df, int64_t arg)
214 x = UNSIGNED(arg, df);
216 x = (x & 0x5555555555555555ULL) + ((x >> 1) & 0x5555555555555555ULL);
217 x = (x & 0x3333333333333333ULL) + ((x >> 2) & 0x3333333333333333ULL);
218 x = (x & 0x0F0F0F0F0F0F0F0FULL) + ((x >> 4) & 0x0F0F0F0F0F0F0F0FULL);
219 x = (x & 0x00FF00FF00FF00FFULL) + ((x >> 8) & 0x00FF00FF00FF00FFULL);
220 x = (x & 0x0000FFFF0000FFFFULL) + ((x >> 16) & 0x0000FFFF0000FFFFULL);
221 x = (x & 0x00000000FFFFFFFFULL) + ((x >> 32));
226 void helper_msa_pcnt_b(CPUMIPSState *env, uint32_t wd, uint32_t ws)
228 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
229 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
231 pwd->b[0] = msa_pcnt_df(DF_BYTE, pws->b[0]);
232 pwd->b[1] = msa_pcnt_df(DF_BYTE, pws->b[1]);
233 pwd->b[2] = msa_pcnt_df(DF_BYTE, pws->b[2]);
234 pwd->b[3] = msa_pcnt_df(DF_BYTE, pws->b[3]);
235 pwd->b[4] = msa_pcnt_df(DF_BYTE, pws->b[4]);
236 pwd->b[5] = msa_pcnt_df(DF_BYTE, pws->b[5]);
237 pwd->b[6] = msa_pcnt_df(DF_BYTE, pws->b[6]);
238 pwd->b[7] = msa_pcnt_df(DF_BYTE, pws->b[7]);
239 pwd->b[8] = msa_pcnt_df(DF_BYTE, pws->b[8]);
240 pwd->b[9] = msa_pcnt_df(DF_BYTE, pws->b[9]);
241 pwd->b[10] = msa_pcnt_df(DF_BYTE, pws->b[10]);
242 pwd->b[11] = msa_pcnt_df(DF_BYTE, pws->b[11]);
243 pwd->b[12] = msa_pcnt_df(DF_BYTE, pws->b[12]);
244 pwd->b[13] = msa_pcnt_df(DF_BYTE, pws->b[13]);
245 pwd->b[14] = msa_pcnt_df(DF_BYTE, pws->b[14]);
246 pwd->b[15] = msa_pcnt_df(DF_BYTE, pws->b[15]);
249 void helper_msa_pcnt_h(CPUMIPSState *env, uint32_t wd, uint32_t ws)
251 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
252 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
254 pwd->h[0] = msa_pcnt_df(DF_HALF, pws->h[0]);
255 pwd->h[1] = msa_pcnt_df(DF_HALF, pws->h[1]);
256 pwd->h[2] = msa_pcnt_df(DF_HALF, pws->h[2]);
257 pwd->h[3] = msa_pcnt_df(DF_HALF, pws->h[3]);
258 pwd->h[4] = msa_pcnt_df(DF_HALF, pws->h[4]);
259 pwd->h[5] = msa_pcnt_df(DF_HALF, pws->h[5]);
260 pwd->h[6] = msa_pcnt_df(DF_HALF, pws->h[6]);
261 pwd->h[7] = msa_pcnt_df(DF_HALF, pws->h[7]);
264 void helper_msa_pcnt_w(CPUMIPSState *env, uint32_t wd, uint32_t ws)
266 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
267 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
269 pwd->w[0] = msa_pcnt_df(DF_WORD, pws->w[0]);
270 pwd->w[1] = msa_pcnt_df(DF_WORD, pws->w[1]);
271 pwd->w[2] = msa_pcnt_df(DF_WORD, pws->w[2]);
272 pwd->w[3] = msa_pcnt_df(DF_WORD, pws->w[3]);
275 void helper_msa_pcnt_d(CPUMIPSState *env, uint32_t wd, uint32_t ws)
277 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
278 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
280 pwd->d[0] = msa_pcnt_df(DF_DOUBLE, pws->d[0]);
281 pwd->d[1] = msa_pcnt_df(DF_DOUBLE, pws->d[1]);
289 * +---------------+----------------------------------------------------------+
290 * | BINSL.B | Vector Bit Insert Left (byte) |
291 * | BINSL.H | Vector Bit Insert Left (halfword) |
292 * | BINSL.W | Vector Bit Insert Left (word) |
293 * | BINSL.D | Vector Bit Insert Left (doubleword) |
294 * | BINSR.B | Vector Bit Insert Right (byte) |
295 * | BINSR.H | Vector Bit Insert Right (halfword) |
296 * | BINSR.W | Vector Bit Insert Right (word) |
297 * | BINSR.D | Vector Bit Insert Right (doubleword) |
298 * | BMNZ.V | Vector Bit Move If Not Zero |
299 * | BMZ.V | Vector Bit Move If Zero |
300 * | BSEL.V | Vector Bit Select |
301 * +---------------+----------------------------------------------------------+
304 /* Data format bit position and unsigned values */
305 #define BIT_POSITION(x, df) ((uint64_t)(x) % DF_BITS(df))
307 static inline int64_t msa_binsl_df(uint32_t df,
308 int64_t dest, int64_t arg1, int64_t arg2)
310 uint64_t u_arg1 = UNSIGNED(arg1, df);
311 uint64_t u_dest = UNSIGNED(dest, df);
312 int32_t sh_d = BIT_POSITION(arg2, df) + 1;
313 int32_t sh_a = DF_BITS(df) - sh_d;
314 if (sh_d == DF_BITS(df)) {
317 return UNSIGNED(UNSIGNED(u_dest << sh_d, df) >> sh_d, df) |
318 UNSIGNED(UNSIGNED(u_arg1 >> sh_a, df) << sh_a, df);
322 void helper_msa_binsl_b(CPUMIPSState *env,
323 uint32_t wd, uint32_t ws, uint32_t wt)
325 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
326 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
327 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
329 pwd->b[0] = msa_binsl_df(DF_BYTE, pwd->b[0], pws->b[0], pwt->b[0]);
330 pwd->b[1] = msa_binsl_df(DF_BYTE, pwd->b[1], pws->b[1], pwt->b[1]);
331 pwd->b[2] = msa_binsl_df(DF_BYTE, pwd->b[2], pws->b[2], pwt->b[2]);
332 pwd->b[3] = msa_binsl_df(DF_BYTE, pwd->b[3], pws->b[3], pwt->b[3]);
333 pwd->b[4] = msa_binsl_df(DF_BYTE, pwd->b[4], pws->b[4], pwt->b[4]);
334 pwd->b[5] = msa_binsl_df(DF_BYTE, pwd->b[5], pws->b[5], pwt->b[5]);
335 pwd->b[6] = msa_binsl_df(DF_BYTE, pwd->b[6], pws->b[6], pwt->b[6]);
336 pwd->b[7] = msa_binsl_df(DF_BYTE, pwd->b[7], pws->b[7], pwt->b[7]);
337 pwd->b[8] = msa_binsl_df(DF_BYTE, pwd->b[8], pws->b[8], pwt->b[8]);
338 pwd->b[9] = msa_binsl_df(DF_BYTE, pwd->b[9], pws->b[9], pwt->b[9]);
339 pwd->b[10] = msa_binsl_df(DF_BYTE, pwd->b[10], pws->b[10], pwt->b[10]);
340 pwd->b[11] = msa_binsl_df(DF_BYTE, pwd->b[11], pws->b[11], pwt->b[11]);
341 pwd->b[12] = msa_binsl_df(DF_BYTE, pwd->b[12], pws->b[12], pwt->b[12]);
342 pwd->b[13] = msa_binsl_df(DF_BYTE, pwd->b[13], pws->b[13], pwt->b[13]);
343 pwd->b[14] = msa_binsl_df(DF_BYTE, pwd->b[14], pws->b[14], pwt->b[14]);
344 pwd->b[15] = msa_binsl_df(DF_BYTE, pwd->b[15], pws->b[15], pwt->b[15]);
347 void helper_msa_binsl_h(CPUMIPSState *env,
348 uint32_t wd, uint32_t ws, uint32_t wt)
350 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
351 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
352 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
354 pwd->h[0] = msa_binsl_df(DF_HALF, pwd->h[0], pws->h[0], pwt->h[0]);
355 pwd->h[1] = msa_binsl_df(DF_HALF, pwd->h[1], pws->h[1], pwt->h[1]);
356 pwd->h[2] = msa_binsl_df(DF_HALF, pwd->h[2], pws->h[2], pwt->h[2]);
357 pwd->h[3] = msa_binsl_df(DF_HALF, pwd->h[3], pws->h[3], pwt->h[3]);
358 pwd->h[4] = msa_binsl_df(DF_HALF, pwd->h[4], pws->h[4], pwt->h[4]);
359 pwd->h[5] = msa_binsl_df(DF_HALF, pwd->h[5], pws->h[5], pwt->h[5]);
360 pwd->h[6] = msa_binsl_df(DF_HALF, pwd->h[6], pws->h[6], pwt->h[6]);
361 pwd->h[7] = msa_binsl_df(DF_HALF, pwd->h[7], pws->h[7], pwt->h[7]);
364 void helper_msa_binsl_w(CPUMIPSState *env,
365 uint32_t wd, uint32_t ws, uint32_t wt)
367 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
368 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
369 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
371 pwd->w[0] = msa_binsl_df(DF_WORD, pwd->w[0], pws->w[0], pwt->w[0]);
372 pwd->w[1] = msa_binsl_df(DF_WORD, pwd->w[1], pws->w[1], pwt->w[1]);
373 pwd->w[2] = msa_binsl_df(DF_WORD, pwd->w[2], pws->w[2], pwt->w[2]);
374 pwd->w[3] = msa_binsl_df(DF_WORD, pwd->w[3], pws->w[3], pwt->w[3]);
377 void helper_msa_binsl_d(CPUMIPSState *env,
378 uint32_t wd, uint32_t ws, uint32_t wt)
380 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
381 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
382 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
384 pwd->d[0] = msa_binsl_df(DF_DOUBLE, pwd->d[0], pws->d[0], pwt->d[0]);
385 pwd->d[1] = msa_binsl_df(DF_DOUBLE, pwd->d[1], pws->d[1], pwt->d[1]);
388 static inline int64_t msa_binsr_df(uint32_t df,
389 int64_t dest, int64_t arg1, int64_t arg2)
391 uint64_t u_arg1 = UNSIGNED(arg1, df);
392 uint64_t u_dest = UNSIGNED(dest, df);
393 int32_t sh_d = BIT_POSITION(arg2, df) + 1;
394 int32_t sh_a = DF_BITS(df) - sh_d;
395 if (sh_d == DF_BITS(df)) {
398 return UNSIGNED(UNSIGNED(u_dest >> sh_d, df) << sh_d, df) |
399 UNSIGNED(UNSIGNED(u_arg1 << sh_a, df) >> sh_a, df);
403 void helper_msa_binsr_b(CPUMIPSState *env,
404 uint32_t wd, uint32_t ws, uint32_t wt)
406 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
407 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
408 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
410 pwd->b[0] = msa_binsr_df(DF_BYTE, pwd->b[0], pws->b[0], pwt->b[0]);
411 pwd->b[1] = msa_binsr_df(DF_BYTE, pwd->b[1], pws->b[1], pwt->b[1]);
412 pwd->b[2] = msa_binsr_df(DF_BYTE, pwd->b[2], pws->b[2], pwt->b[2]);
413 pwd->b[3] = msa_binsr_df(DF_BYTE, pwd->b[3], pws->b[3], pwt->b[3]);
414 pwd->b[4] = msa_binsr_df(DF_BYTE, pwd->b[4], pws->b[4], pwt->b[4]);
415 pwd->b[5] = msa_binsr_df(DF_BYTE, pwd->b[5], pws->b[5], pwt->b[5]);
416 pwd->b[6] = msa_binsr_df(DF_BYTE, pwd->b[6], pws->b[6], pwt->b[6]);
417 pwd->b[7] = msa_binsr_df(DF_BYTE, pwd->b[7], pws->b[7], pwt->b[7]);
418 pwd->b[8] = msa_binsr_df(DF_BYTE, pwd->b[8], pws->b[8], pwt->b[8]);
419 pwd->b[9] = msa_binsr_df(DF_BYTE, pwd->b[9], pws->b[9], pwt->b[9]);
420 pwd->b[10] = msa_binsr_df(DF_BYTE, pwd->b[10], pws->b[10], pwt->b[10]);
421 pwd->b[11] = msa_binsr_df(DF_BYTE, pwd->b[11], pws->b[11], pwt->b[11]);
422 pwd->b[12] = msa_binsr_df(DF_BYTE, pwd->b[12], pws->b[12], pwt->b[12]);
423 pwd->b[13] = msa_binsr_df(DF_BYTE, pwd->b[13], pws->b[13], pwt->b[13]);
424 pwd->b[14] = msa_binsr_df(DF_BYTE, pwd->b[14], pws->b[14], pwt->b[14]);
425 pwd->b[15] = msa_binsr_df(DF_BYTE, pwd->b[15], pws->b[15], pwt->b[15]);
428 void helper_msa_binsr_h(CPUMIPSState *env,
429 uint32_t wd, uint32_t ws, uint32_t wt)
431 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
432 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
433 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
435 pwd->h[0] = msa_binsr_df(DF_HALF, pwd->h[0], pws->h[0], pwt->h[0]);
436 pwd->h[1] = msa_binsr_df(DF_HALF, pwd->h[1], pws->h[1], pwt->h[1]);
437 pwd->h[2] = msa_binsr_df(DF_HALF, pwd->h[2], pws->h[2], pwt->h[2]);
438 pwd->h[3] = msa_binsr_df(DF_HALF, pwd->h[3], pws->h[3], pwt->h[3]);
439 pwd->h[4] = msa_binsr_df(DF_HALF, pwd->h[4], pws->h[4], pwt->h[4]);
440 pwd->h[5] = msa_binsr_df(DF_HALF, pwd->h[5], pws->h[5], pwt->h[5]);
441 pwd->h[6] = msa_binsr_df(DF_HALF, pwd->h[6], pws->h[6], pwt->h[6]);
442 pwd->h[7] = msa_binsr_df(DF_HALF, pwd->h[7], pws->h[7], pwt->h[7]);
445 void helper_msa_binsr_w(CPUMIPSState *env,
446 uint32_t wd, uint32_t ws, uint32_t wt)
448 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
449 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
450 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
452 pwd->w[0] = msa_binsr_df(DF_WORD, pwd->w[0], pws->w[0], pwt->w[0]);
453 pwd->w[1] = msa_binsr_df(DF_WORD, pwd->w[1], pws->w[1], pwt->w[1]);
454 pwd->w[2] = msa_binsr_df(DF_WORD, pwd->w[2], pws->w[2], pwt->w[2]);
455 pwd->w[3] = msa_binsr_df(DF_WORD, pwd->w[3], pws->w[3], pwt->w[3]);
458 void helper_msa_binsr_d(CPUMIPSState *env,
459 uint32_t wd, uint32_t ws, uint32_t wt)
461 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
462 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
463 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
465 pwd->d[0] = msa_binsr_df(DF_DOUBLE, pwd->d[0], pws->d[0], pwt->d[0]);
466 pwd->d[1] = msa_binsr_df(DF_DOUBLE, pwd->d[1], pws->d[1], pwt->d[1]);
469 void helper_msa_bmnz_v(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
471 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
472 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
473 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
475 pwd->d[0] = UNSIGNED( \
476 ((pwd->d[0] & (~pwt->d[0])) | (pws->d[0] & pwt->d[0])), DF_DOUBLE);
477 pwd->d[1] = UNSIGNED( \
478 ((pwd->d[1] & (~pwt->d[1])) | (pws->d[1] & pwt->d[1])), DF_DOUBLE);
481 void helper_msa_bmz_v(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
483 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
484 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
485 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
487 pwd->d[0] = UNSIGNED( \
488 ((pwd->d[0] & pwt->d[0]) | (pws->d[0] & (~pwt->d[0]))), DF_DOUBLE);
489 pwd->d[1] = UNSIGNED( \
490 ((pwd->d[1] & pwt->d[1]) | (pws->d[1] & (~pwt->d[1]))), DF_DOUBLE);
493 void helper_msa_bsel_v(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
495 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
496 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
497 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
499 pwd->d[0] = UNSIGNED( \
500 (pws->d[0] & (~pwd->d[0])) | (pwt->d[0] & pwd->d[0]), DF_DOUBLE);
501 pwd->d[1] = UNSIGNED( \
502 (pws->d[1] & (~pwd->d[1])) | (pwt->d[1] & pwd->d[1]), DF_DOUBLE);
510 * +---------------+----------------------------------------------------------+
511 * | BCLR.B | Vector Bit Clear (byte) |
512 * | BCLR.H | Vector Bit Clear (halfword) |
513 * | BCLR.W | Vector Bit Clear (word) |
514 * | BCLR.D | Vector Bit Clear (doubleword) |
515 * | BNEG.B | Vector Bit Negate (byte) |
516 * | BNEG.H | Vector Bit Negate (halfword) |
517 * | BNEG.W | Vector Bit Negate (word) |
518 * | BNEG.D | Vector Bit Negate (doubleword) |
519 * | BSET.B | Vector Bit Set (byte) |
520 * | BSET.H | Vector Bit Set (halfword) |
521 * | BSET.W | Vector Bit Set (word) |
522 * | BSET.D | Vector Bit Set (doubleword) |
523 * +---------------+----------------------------------------------------------+
526 static inline int64_t msa_bclr_df(uint32_t df, int64_t arg1, int64_t arg2)
528 int32_t b_arg2 = BIT_POSITION(arg2, df);
529 return UNSIGNED(arg1 & (~(1LL << b_arg2)), df);
532 void helper_msa_bclr_b(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
534 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
535 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
536 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
538 pwd->b[0] = msa_bclr_df(DF_BYTE, pws->b[0], pwt->b[0]);
539 pwd->b[1] = msa_bclr_df(DF_BYTE, pws->b[1], pwt->b[1]);
540 pwd->b[2] = msa_bclr_df(DF_BYTE, pws->b[2], pwt->b[2]);
541 pwd->b[3] = msa_bclr_df(DF_BYTE, pws->b[3], pwt->b[3]);
542 pwd->b[4] = msa_bclr_df(DF_BYTE, pws->b[4], pwt->b[4]);
543 pwd->b[5] = msa_bclr_df(DF_BYTE, pws->b[5], pwt->b[5]);
544 pwd->b[6] = msa_bclr_df(DF_BYTE, pws->b[6], pwt->b[6]);
545 pwd->b[7] = msa_bclr_df(DF_BYTE, pws->b[7], pwt->b[7]);
546 pwd->b[8] = msa_bclr_df(DF_BYTE, pws->b[8], pwt->b[8]);
547 pwd->b[9] = msa_bclr_df(DF_BYTE, pws->b[9], pwt->b[9]);
548 pwd->b[10] = msa_bclr_df(DF_BYTE, pws->b[10], pwt->b[10]);
549 pwd->b[11] = msa_bclr_df(DF_BYTE, pws->b[11], pwt->b[11]);
550 pwd->b[12] = msa_bclr_df(DF_BYTE, pws->b[12], pwt->b[12]);
551 pwd->b[13] = msa_bclr_df(DF_BYTE, pws->b[13], pwt->b[13]);
552 pwd->b[14] = msa_bclr_df(DF_BYTE, pws->b[14], pwt->b[14]);
553 pwd->b[15] = msa_bclr_df(DF_BYTE, pws->b[15], pwt->b[15]);
556 void helper_msa_bclr_h(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
558 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
559 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
560 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
562 pwd->h[0] = msa_bclr_df(DF_HALF, pws->h[0], pwt->h[0]);
563 pwd->h[1] = msa_bclr_df(DF_HALF, pws->h[1], pwt->h[1]);
564 pwd->h[2] = msa_bclr_df(DF_HALF, pws->h[2], pwt->h[2]);
565 pwd->h[3] = msa_bclr_df(DF_HALF, pws->h[3], pwt->h[3]);
566 pwd->h[4] = msa_bclr_df(DF_HALF, pws->h[4], pwt->h[4]);
567 pwd->h[5] = msa_bclr_df(DF_HALF, pws->h[5], pwt->h[5]);
568 pwd->h[6] = msa_bclr_df(DF_HALF, pws->h[6], pwt->h[6]);
569 pwd->h[7] = msa_bclr_df(DF_HALF, pws->h[7], pwt->h[7]);
572 void helper_msa_bclr_w(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
574 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
575 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
576 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
578 pwd->w[0] = msa_bclr_df(DF_WORD, pws->w[0], pwt->w[0]);
579 pwd->w[1] = msa_bclr_df(DF_WORD, pws->w[1], pwt->w[1]);
580 pwd->w[2] = msa_bclr_df(DF_WORD, pws->w[2], pwt->w[2]);
581 pwd->w[3] = msa_bclr_df(DF_WORD, pws->w[3], pwt->w[3]);
584 void helper_msa_bclr_d(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
586 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
587 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
588 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
590 pwd->d[0] = msa_bclr_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
591 pwd->d[1] = msa_bclr_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
594 static inline int64_t msa_bneg_df(uint32_t df, int64_t arg1, int64_t arg2)
596 int32_t b_arg2 = BIT_POSITION(arg2, df);
597 return UNSIGNED(arg1 ^ (1LL << b_arg2), df);
600 void helper_msa_bneg_b(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
602 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
603 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
604 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
606 pwd->b[0] = msa_bneg_df(DF_BYTE, pws->b[0], pwt->b[0]);
607 pwd->b[1] = msa_bneg_df(DF_BYTE, pws->b[1], pwt->b[1]);
608 pwd->b[2] = msa_bneg_df(DF_BYTE, pws->b[2], pwt->b[2]);
609 pwd->b[3] = msa_bneg_df(DF_BYTE, pws->b[3], pwt->b[3]);
610 pwd->b[4] = msa_bneg_df(DF_BYTE, pws->b[4], pwt->b[4]);
611 pwd->b[5] = msa_bneg_df(DF_BYTE, pws->b[5], pwt->b[5]);
612 pwd->b[6] = msa_bneg_df(DF_BYTE, pws->b[6], pwt->b[6]);
613 pwd->b[7] = msa_bneg_df(DF_BYTE, pws->b[7], pwt->b[7]);
614 pwd->b[8] = msa_bneg_df(DF_BYTE, pws->b[8], pwt->b[8]);
615 pwd->b[9] = msa_bneg_df(DF_BYTE, pws->b[9], pwt->b[9]);
616 pwd->b[10] = msa_bneg_df(DF_BYTE, pws->b[10], pwt->b[10]);
617 pwd->b[11] = msa_bneg_df(DF_BYTE, pws->b[11], pwt->b[11]);
618 pwd->b[12] = msa_bneg_df(DF_BYTE, pws->b[12], pwt->b[12]);
619 pwd->b[13] = msa_bneg_df(DF_BYTE, pws->b[13], pwt->b[13]);
620 pwd->b[14] = msa_bneg_df(DF_BYTE, pws->b[14], pwt->b[14]);
621 pwd->b[15] = msa_bneg_df(DF_BYTE, pws->b[15], pwt->b[15]);
624 void helper_msa_bneg_h(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
626 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
627 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
628 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
630 pwd->h[0] = msa_bneg_df(DF_HALF, pws->h[0], pwt->h[0]);
631 pwd->h[1] = msa_bneg_df(DF_HALF, pws->h[1], pwt->h[1]);
632 pwd->h[2] = msa_bneg_df(DF_HALF, pws->h[2], pwt->h[2]);
633 pwd->h[3] = msa_bneg_df(DF_HALF, pws->h[3], pwt->h[3]);
634 pwd->h[4] = msa_bneg_df(DF_HALF, pws->h[4], pwt->h[4]);
635 pwd->h[5] = msa_bneg_df(DF_HALF, pws->h[5], pwt->h[5]);
636 pwd->h[6] = msa_bneg_df(DF_HALF, pws->h[6], pwt->h[6]);
637 pwd->h[7] = msa_bneg_df(DF_HALF, pws->h[7], pwt->h[7]);
640 void helper_msa_bneg_w(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
642 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
643 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
644 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
646 pwd->w[0] = msa_bneg_df(DF_WORD, pws->w[0], pwt->w[0]);
647 pwd->w[1] = msa_bneg_df(DF_WORD, pws->w[1], pwt->w[1]);
648 pwd->w[2] = msa_bneg_df(DF_WORD, pws->w[2], pwt->w[2]);
649 pwd->w[3] = msa_bneg_df(DF_WORD, pws->w[3], pwt->w[3]);
652 void helper_msa_bneg_d(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
654 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
655 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
656 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
658 pwd->d[0] = msa_bneg_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
659 pwd->d[1] = msa_bneg_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
662 static inline int64_t msa_bset_df(uint32_t df, int64_t arg1,
665 int32_t b_arg2 = BIT_POSITION(arg2, df);
666 return UNSIGNED(arg1 | (1LL << b_arg2), df);
669 void helper_msa_bset_b(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
671 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
672 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
673 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
675 pwd->b[0] = msa_bset_df(DF_BYTE, pws->b[0], pwt->b[0]);
676 pwd->b[1] = msa_bset_df(DF_BYTE, pws->b[1], pwt->b[1]);
677 pwd->b[2] = msa_bset_df(DF_BYTE, pws->b[2], pwt->b[2]);
678 pwd->b[3] = msa_bset_df(DF_BYTE, pws->b[3], pwt->b[3]);
679 pwd->b[4] = msa_bset_df(DF_BYTE, pws->b[4], pwt->b[4]);
680 pwd->b[5] = msa_bset_df(DF_BYTE, pws->b[5], pwt->b[5]);
681 pwd->b[6] = msa_bset_df(DF_BYTE, pws->b[6], pwt->b[6]);
682 pwd->b[7] = msa_bset_df(DF_BYTE, pws->b[7], pwt->b[7]);
683 pwd->b[8] = msa_bset_df(DF_BYTE, pws->b[8], pwt->b[8]);
684 pwd->b[9] = msa_bset_df(DF_BYTE, pws->b[9], pwt->b[9]);
685 pwd->b[10] = msa_bset_df(DF_BYTE, pws->b[10], pwt->b[10]);
686 pwd->b[11] = msa_bset_df(DF_BYTE, pws->b[11], pwt->b[11]);
687 pwd->b[12] = msa_bset_df(DF_BYTE, pws->b[12], pwt->b[12]);
688 pwd->b[13] = msa_bset_df(DF_BYTE, pws->b[13], pwt->b[13]);
689 pwd->b[14] = msa_bset_df(DF_BYTE, pws->b[14], pwt->b[14]);
690 pwd->b[15] = msa_bset_df(DF_BYTE, pws->b[15], pwt->b[15]);
693 void helper_msa_bset_h(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
695 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
696 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
697 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
699 pwd->h[0] = msa_bset_df(DF_HALF, pws->h[0], pwt->h[0]);
700 pwd->h[1] = msa_bset_df(DF_HALF, pws->h[1], pwt->h[1]);
701 pwd->h[2] = msa_bset_df(DF_HALF, pws->h[2], pwt->h[2]);
702 pwd->h[3] = msa_bset_df(DF_HALF, pws->h[3], pwt->h[3]);
703 pwd->h[4] = msa_bset_df(DF_HALF, pws->h[4], pwt->h[4]);
704 pwd->h[5] = msa_bset_df(DF_HALF, pws->h[5], pwt->h[5]);
705 pwd->h[6] = msa_bset_df(DF_HALF, pws->h[6], pwt->h[6]);
706 pwd->h[7] = msa_bset_df(DF_HALF, pws->h[7], pwt->h[7]);
709 void helper_msa_bset_w(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
711 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
712 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
713 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
715 pwd->w[0] = msa_bset_df(DF_WORD, pws->w[0], pwt->w[0]);
716 pwd->w[1] = msa_bset_df(DF_WORD, pws->w[1], pwt->w[1]);
717 pwd->w[2] = msa_bset_df(DF_WORD, pws->w[2], pwt->w[2]);
718 pwd->w[3] = msa_bset_df(DF_WORD, pws->w[3], pwt->w[3]);
721 void helper_msa_bset_d(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
723 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
724 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
725 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
727 pwd->d[0] = msa_bset_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
728 pwd->d[1] = msa_bset_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
736 * +---------------+----------------------------------------------------------+
737 * | MADD_Q.H | Vector Fixed-Point Multiply and Add (halfword) |
738 * | MADD_Q.W | Vector Fixed-Point Multiply and Add (word) |
739 * | MADDR_Q.H | Vector Fixed-Point Multiply and Add Rounded (halfword) |
740 * | MADDR_Q.W | Vector Fixed-Point Multiply and Add Rounded (word) |
741 * | MSUB_Q.H | Vector Fixed-Point Multiply and Subtr. (halfword) |
742 * | MSUB_Q.W | Vector Fixed-Point Multiply and Subtr. (word) |
743 * | MSUBR_Q.H | Vector Fixed-Point Multiply and Subtr. Rounded (halfword)|
744 * | MSUBR_Q.W | Vector Fixed-Point Multiply and Subtr. Rounded (word) |
745 * | MUL_Q.H | Vector Fixed-Point Multiply (halfword) |
746 * | MUL_Q.W | Vector Fixed-Point Multiply (word) |
747 * | MULR_Q.H | Vector Fixed-Point Multiply Rounded (halfword) |
748 * | MULR_Q.W | Vector Fixed-Point Multiply Rounded (word) |
749 * +---------------+----------------------------------------------------------+
752 /* TODO: insert Fixed Multiply group helpers here */
759 * +---------------+----------------------------------------------------------+
760 * | FMAX_A.W | Vector Floating-Point Maximum (Absolute) (word) |
761 * | FMAX_A.D | Vector Floating-Point Maximum (Absolute) (doubleword) |
762 * | FMAX.W | Vector Floating-Point Maximum (word) |
763 * | FMAX.D | Vector Floating-Point Maximum (doubleword) |
764 * | FMIN_A.W | Vector Floating-Point Minimum (Absolute) (word) |
765 * | FMIN_A.D | Vector Floating-Point Minimum (Absolute) (doubleword) |
766 * | FMIN.W | Vector Floating-Point Minimum (word) |
767 * | FMIN.D | Vector Floating-Point Minimum (doubleword) |
768 * +---------------+----------------------------------------------------------+
771 /* TODO: insert Float Max Min group helpers here */
778 * +---------------+----------------------------------------------------------+
779 * | ADD_A.B | Vector Add Absolute Values (byte) |
780 * | ADD_A.H | Vector Add Absolute Values (halfword) |
781 * | ADD_A.W | Vector Add Absolute Values (word) |
782 * | ADD_A.D | Vector Add Absolute Values (doubleword) |
783 * | ADDS_A.B | Vector Signed Saturated Add (of Absolute) (byte) |
784 * | ADDS_A.H | Vector Signed Saturated Add (of Absolute) (halfword) |
785 * | ADDS_A.W | Vector Signed Saturated Add (of Absolute) (word) |
786 * | ADDS_A.D | Vector Signed Saturated Add (of Absolute) (doubleword) |
787 * | ADDS_S.B | Vector Signed Saturated Add (of Signed) (byte) |
788 * | ADDS_S.H | Vector Signed Saturated Add (of Signed) (halfword) |
789 * | ADDS_S.W | Vector Signed Saturated Add (of Signed) (word) |
790 * | ADDS_S.D | Vector Signed Saturated Add (of Signed) (doubleword) |
791 * | ADDS_U.B | Vector Unsigned Saturated Add (of Unsigned) (byte) |
792 * | ADDS_U.H | Vector Unsigned Saturated Add (of Unsigned) (halfword) |
793 * | ADDS_U.W | Vector Unsigned Saturated Add (of Unsigned) (word) |
794 * | ADDS_U.D | Vector Unsigned Saturated Add (of Unsigned) (doubleword) |
795 * | ADDV.B | Vector Add (byte) |
796 * | ADDV.H | Vector Add (halfword) |
797 * | ADDV.W | Vector Add (word) |
798 * | ADDV.D | Vector Add (doubleword) |
799 * | HADD_S.H | Vector Signed Horizontal Add (halfword) |
800 * | HADD_S.W | Vector Signed Horizontal Add (word) |
801 * | HADD_S.D | Vector Signed Horizontal Add (doubleword) |
802 * | HADD_U.H | Vector Unigned Horizontal Add (halfword) |
803 * | HADD_U.W | Vector Unigned Horizontal Add (word) |
804 * | HADD_U.D | Vector Unigned Horizontal Add (doubleword) |
805 * +---------------+----------------------------------------------------------+
809 static inline int64_t msa_add_a_df(uint32_t df, int64_t arg1, int64_t arg2)
811 uint64_t abs_arg1 = arg1 >= 0 ? arg1 : -arg1;
812 uint64_t abs_arg2 = arg2 >= 0 ? arg2 : -arg2;
813 return abs_arg1 + abs_arg2;
816 void helper_msa_add_a_b(CPUMIPSState *env,
817 uint32_t wd, uint32_t ws, uint32_t wt)
819 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
820 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
821 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
823 pwd->b[0] = msa_add_a_df(DF_BYTE, pws->b[0], pwt->b[0]);
824 pwd->b[1] = msa_add_a_df(DF_BYTE, pws->b[1], pwt->b[1]);
825 pwd->b[2] = msa_add_a_df(DF_BYTE, pws->b[2], pwt->b[2]);
826 pwd->b[3] = msa_add_a_df(DF_BYTE, pws->b[3], pwt->b[3]);
827 pwd->b[4] = msa_add_a_df(DF_BYTE, pws->b[4], pwt->b[4]);
828 pwd->b[5] = msa_add_a_df(DF_BYTE, pws->b[5], pwt->b[5]);
829 pwd->b[6] = msa_add_a_df(DF_BYTE, pws->b[6], pwt->b[6]);
830 pwd->b[7] = msa_add_a_df(DF_BYTE, pws->b[7], pwt->b[7]);
831 pwd->b[8] = msa_add_a_df(DF_BYTE, pws->b[8], pwt->b[8]);
832 pwd->b[9] = msa_add_a_df(DF_BYTE, pws->b[9], pwt->b[9]);
833 pwd->b[10] = msa_add_a_df(DF_BYTE, pws->b[10], pwt->b[10]);
834 pwd->b[11] = msa_add_a_df(DF_BYTE, pws->b[11], pwt->b[11]);
835 pwd->b[12] = msa_add_a_df(DF_BYTE, pws->b[12], pwt->b[12]);
836 pwd->b[13] = msa_add_a_df(DF_BYTE, pws->b[13], pwt->b[13]);
837 pwd->b[14] = msa_add_a_df(DF_BYTE, pws->b[14], pwt->b[14]);
838 pwd->b[15] = msa_add_a_df(DF_BYTE, pws->b[15], pwt->b[15]);
841 void helper_msa_add_a_h(CPUMIPSState *env,
842 uint32_t wd, uint32_t ws, uint32_t wt)
844 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
845 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
846 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
848 pwd->h[0] = msa_add_a_df(DF_HALF, pws->h[0], pwt->h[0]);
849 pwd->h[1] = msa_add_a_df(DF_HALF, pws->h[1], pwt->h[1]);
850 pwd->h[2] = msa_add_a_df(DF_HALF, pws->h[2], pwt->h[2]);
851 pwd->h[3] = msa_add_a_df(DF_HALF, pws->h[3], pwt->h[3]);
852 pwd->h[4] = msa_add_a_df(DF_HALF, pws->h[4], pwt->h[4]);
853 pwd->h[5] = msa_add_a_df(DF_HALF, pws->h[5], pwt->h[5]);
854 pwd->h[6] = msa_add_a_df(DF_HALF, pws->h[6], pwt->h[6]);
855 pwd->h[7] = msa_add_a_df(DF_HALF, pws->h[7], pwt->h[7]);
858 void helper_msa_add_a_w(CPUMIPSState *env,
859 uint32_t wd, uint32_t ws, uint32_t wt)
861 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
862 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
863 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
865 pwd->w[0] = msa_add_a_df(DF_WORD, pws->w[0], pwt->w[0]);
866 pwd->w[1] = msa_add_a_df(DF_WORD, pws->w[1], pwt->w[1]);
867 pwd->w[2] = msa_add_a_df(DF_WORD, pws->w[2], pwt->w[2]);
868 pwd->w[3] = msa_add_a_df(DF_WORD, pws->w[3], pwt->w[3]);
871 void helper_msa_add_a_d(CPUMIPSState *env,
872 uint32_t wd, uint32_t ws, uint32_t wt)
874 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
875 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
876 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
878 pwd->d[0] = msa_add_a_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
879 pwd->d[1] = msa_add_a_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
883 static inline int64_t msa_adds_a_df(uint32_t df, int64_t arg1, int64_t arg2)
885 uint64_t max_int = (uint64_t)DF_MAX_INT(df);
886 uint64_t abs_arg1 = arg1 >= 0 ? arg1 : -arg1;
887 uint64_t abs_arg2 = arg2 >= 0 ? arg2 : -arg2;
888 if (abs_arg1 > max_int || abs_arg2 > max_int) {
889 return (int64_t)max_int;
891 return (abs_arg1 < max_int - abs_arg2) ? abs_arg1 + abs_arg2 : max_int;
895 void helper_msa_adds_a_b(CPUMIPSState *env,
896 uint32_t wd, uint32_t ws, uint32_t wt)
898 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
899 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
900 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
902 pwd->b[0] = msa_adds_a_df(DF_BYTE, pws->b[0], pwt->b[0]);
903 pwd->b[1] = msa_adds_a_df(DF_BYTE, pws->b[1], pwt->b[1]);
904 pwd->b[2] = msa_adds_a_df(DF_BYTE, pws->b[2], pwt->b[2]);
905 pwd->b[3] = msa_adds_a_df(DF_BYTE, pws->b[3], pwt->b[3]);
906 pwd->b[4] = msa_adds_a_df(DF_BYTE, pws->b[4], pwt->b[4]);
907 pwd->b[5] = msa_adds_a_df(DF_BYTE, pws->b[5], pwt->b[5]);
908 pwd->b[6] = msa_adds_a_df(DF_BYTE, pws->b[6], pwt->b[6]);
909 pwd->b[7] = msa_adds_a_df(DF_BYTE, pws->b[7], pwt->b[7]);
910 pwd->b[8] = msa_adds_a_df(DF_BYTE, pws->b[8], pwt->b[8]);
911 pwd->b[9] = msa_adds_a_df(DF_BYTE, pws->b[9], pwt->b[9]);
912 pwd->b[10] = msa_adds_a_df(DF_BYTE, pws->b[10], pwt->b[10]);
913 pwd->b[11] = msa_adds_a_df(DF_BYTE, pws->b[11], pwt->b[11]);
914 pwd->b[12] = msa_adds_a_df(DF_BYTE, pws->b[12], pwt->b[12]);
915 pwd->b[13] = msa_adds_a_df(DF_BYTE, pws->b[13], pwt->b[13]);
916 pwd->b[14] = msa_adds_a_df(DF_BYTE, pws->b[14], pwt->b[14]);
917 pwd->b[15] = msa_adds_a_df(DF_BYTE, pws->b[15], pwt->b[15]);
920 void helper_msa_adds_a_h(CPUMIPSState *env,
921 uint32_t wd, uint32_t ws, uint32_t wt)
923 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
924 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
925 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
927 pwd->h[0] = msa_adds_a_df(DF_HALF, pws->h[0], pwt->h[0]);
928 pwd->h[1] = msa_adds_a_df(DF_HALF, pws->h[1], pwt->h[1]);
929 pwd->h[2] = msa_adds_a_df(DF_HALF, pws->h[2], pwt->h[2]);
930 pwd->h[3] = msa_adds_a_df(DF_HALF, pws->h[3], pwt->h[3]);
931 pwd->h[4] = msa_adds_a_df(DF_HALF, pws->h[4], pwt->h[4]);
932 pwd->h[5] = msa_adds_a_df(DF_HALF, pws->h[5], pwt->h[5]);
933 pwd->h[6] = msa_adds_a_df(DF_HALF, pws->h[6], pwt->h[6]);
934 pwd->h[7] = msa_adds_a_df(DF_HALF, pws->h[7], pwt->h[7]);
937 void helper_msa_adds_a_w(CPUMIPSState *env,
938 uint32_t wd, uint32_t ws, uint32_t wt)
940 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
941 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
942 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
944 pwd->w[0] = msa_adds_a_df(DF_WORD, pws->w[0], pwt->w[0]);
945 pwd->w[1] = msa_adds_a_df(DF_WORD, pws->w[1], pwt->w[1]);
946 pwd->w[2] = msa_adds_a_df(DF_WORD, pws->w[2], pwt->w[2]);
947 pwd->w[3] = msa_adds_a_df(DF_WORD, pws->w[3], pwt->w[3]);
950 void helper_msa_adds_a_d(CPUMIPSState *env,
951 uint32_t wd, uint32_t ws, uint32_t wt)
953 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
954 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
955 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
957 pwd->d[0] = msa_adds_a_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
958 pwd->d[1] = msa_adds_a_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
962 static inline int64_t msa_adds_s_df(uint32_t df, int64_t arg1, int64_t arg2)
964 int64_t max_int = DF_MAX_INT(df);
965 int64_t min_int = DF_MIN_INT(df);
967 return (min_int - arg1 < arg2) ? arg1 + arg2 : min_int;
969 return (arg2 < max_int - arg1) ? arg1 + arg2 : max_int;
973 void helper_msa_adds_s_b(CPUMIPSState *env,
974 uint32_t wd, uint32_t ws, uint32_t wt)
976 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
977 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
978 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
980 pwd->b[0] = msa_adds_s_df(DF_BYTE, pws->b[0], pwt->b[0]);
981 pwd->b[1] = msa_adds_s_df(DF_BYTE, pws->b[1], pwt->b[1]);
982 pwd->b[2] = msa_adds_s_df(DF_BYTE, pws->b[2], pwt->b[2]);
983 pwd->b[3] = msa_adds_s_df(DF_BYTE, pws->b[3], pwt->b[3]);
984 pwd->b[4] = msa_adds_s_df(DF_BYTE, pws->b[4], pwt->b[4]);
985 pwd->b[5] = msa_adds_s_df(DF_BYTE, pws->b[5], pwt->b[5]);
986 pwd->b[6] = msa_adds_s_df(DF_BYTE, pws->b[6], pwt->b[6]);
987 pwd->b[7] = msa_adds_s_df(DF_BYTE, pws->b[7], pwt->b[7]);
988 pwd->b[8] = msa_adds_s_df(DF_BYTE, pws->b[8], pwt->b[8]);
989 pwd->b[9] = msa_adds_s_df(DF_BYTE, pws->b[9], pwt->b[9]);
990 pwd->b[10] = msa_adds_s_df(DF_BYTE, pws->b[10], pwt->b[10]);
991 pwd->b[11] = msa_adds_s_df(DF_BYTE, pws->b[11], pwt->b[11]);
992 pwd->b[12] = msa_adds_s_df(DF_BYTE, pws->b[12], pwt->b[12]);
993 pwd->b[13] = msa_adds_s_df(DF_BYTE, pws->b[13], pwt->b[13]);
994 pwd->b[14] = msa_adds_s_df(DF_BYTE, pws->b[14], pwt->b[14]);
995 pwd->b[15] = msa_adds_s_df(DF_BYTE, pws->b[15], pwt->b[15]);
998 void helper_msa_adds_s_h(CPUMIPSState *env,
999 uint32_t wd, uint32_t ws, uint32_t wt)
1001 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1002 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1003 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1005 pwd->h[0] = msa_adds_s_df(DF_HALF, pws->h[0], pwt->h[0]);
1006 pwd->h[1] = msa_adds_s_df(DF_HALF, pws->h[1], pwt->h[1]);
1007 pwd->h[2] = msa_adds_s_df(DF_HALF, pws->h[2], pwt->h[2]);
1008 pwd->h[3] = msa_adds_s_df(DF_HALF, pws->h[3], pwt->h[3]);
1009 pwd->h[4] = msa_adds_s_df(DF_HALF, pws->h[4], pwt->h[4]);
1010 pwd->h[5] = msa_adds_s_df(DF_HALF, pws->h[5], pwt->h[5]);
1011 pwd->h[6] = msa_adds_s_df(DF_HALF, pws->h[6], pwt->h[6]);
1012 pwd->h[7] = msa_adds_s_df(DF_HALF, pws->h[7], pwt->h[7]);
1015 void helper_msa_adds_s_w(CPUMIPSState *env,
1016 uint32_t wd, uint32_t ws, uint32_t wt)
1018 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1019 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1020 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1022 pwd->w[0] = msa_adds_s_df(DF_WORD, pws->w[0], pwt->w[0]);
1023 pwd->w[1] = msa_adds_s_df(DF_WORD, pws->w[1], pwt->w[1]);
1024 pwd->w[2] = msa_adds_s_df(DF_WORD, pws->w[2], pwt->w[2]);
1025 pwd->w[3] = msa_adds_s_df(DF_WORD, pws->w[3], pwt->w[3]);
1028 void helper_msa_adds_s_d(CPUMIPSState *env,
1029 uint32_t wd, uint32_t ws, uint32_t wt)
1031 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1032 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1033 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1035 pwd->d[0] = msa_adds_s_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
1036 pwd->d[1] = msa_adds_s_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
1040 static inline uint64_t msa_adds_u_df(uint32_t df, uint64_t arg1, uint64_t arg2)
1042 uint64_t max_uint = DF_MAX_UINT(df);
1043 uint64_t u_arg1 = UNSIGNED(arg1, df);
1044 uint64_t u_arg2 = UNSIGNED(arg2, df);
1045 return (u_arg1 < max_uint - u_arg2) ? u_arg1 + u_arg2 : max_uint;
1048 void helper_msa_adds_u_b(CPUMIPSState *env,
1049 uint32_t wd, uint32_t ws, uint32_t wt)
1051 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1052 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1053 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1055 pwd->b[0] = msa_adds_u_df(DF_BYTE, pws->b[0], pwt->b[0]);
1056 pwd->b[1] = msa_adds_u_df(DF_BYTE, pws->b[1], pwt->b[1]);
1057 pwd->b[2] = msa_adds_u_df(DF_BYTE, pws->b[2], pwt->b[2]);
1058 pwd->b[3] = msa_adds_u_df(DF_BYTE, pws->b[3], pwt->b[3]);
1059 pwd->b[4] = msa_adds_u_df(DF_BYTE, pws->b[4], pwt->b[4]);
1060 pwd->b[5] = msa_adds_u_df(DF_BYTE, pws->b[5], pwt->b[5]);
1061 pwd->b[6] = msa_adds_u_df(DF_BYTE, pws->b[6], pwt->b[6]);
1062 pwd->b[7] = msa_adds_u_df(DF_BYTE, pws->b[7], pwt->b[7]);
1063 pwd->b[8] = msa_adds_u_df(DF_BYTE, pws->b[8], pwt->b[8]);
1064 pwd->b[9] = msa_adds_u_df(DF_BYTE, pws->b[9], pwt->b[9]);
1065 pwd->b[10] = msa_adds_u_df(DF_BYTE, pws->b[10], pwt->b[10]);
1066 pwd->b[11] = msa_adds_u_df(DF_BYTE, pws->b[11], pwt->b[11]);
1067 pwd->b[12] = msa_adds_u_df(DF_BYTE, pws->b[12], pwt->b[12]);
1068 pwd->b[13] = msa_adds_u_df(DF_BYTE, pws->b[13], pwt->b[13]);
1069 pwd->b[14] = msa_adds_u_df(DF_BYTE, pws->b[14], pwt->b[14]);
1070 pwd->b[15] = msa_adds_u_df(DF_BYTE, pws->b[15], pwt->b[15]);
1073 void helper_msa_adds_u_h(CPUMIPSState *env,
1074 uint32_t wd, uint32_t ws, uint32_t wt)
1076 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1077 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1078 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1080 pwd->h[0] = msa_adds_u_df(DF_HALF, pws->h[0], pwt->h[0]);
1081 pwd->h[1] = msa_adds_u_df(DF_HALF, pws->h[1], pwt->h[1]);
1082 pwd->h[2] = msa_adds_u_df(DF_HALF, pws->h[2], pwt->h[2]);
1083 pwd->h[3] = msa_adds_u_df(DF_HALF, pws->h[3], pwt->h[3]);
1084 pwd->h[4] = msa_adds_u_df(DF_HALF, pws->h[4], pwt->h[4]);
1085 pwd->h[5] = msa_adds_u_df(DF_HALF, pws->h[5], pwt->h[5]);
1086 pwd->h[6] = msa_adds_u_df(DF_HALF, pws->h[6], pwt->h[6]);
1087 pwd->h[7] = msa_adds_u_df(DF_HALF, pws->h[7], pwt->h[7]);
1090 void helper_msa_adds_u_w(CPUMIPSState *env,
1091 uint32_t wd, uint32_t ws, uint32_t wt)
1093 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1094 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1095 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1097 pwd->w[0] = msa_adds_u_df(DF_WORD, pws->w[0], pwt->w[0]);
1098 pwd->w[1] = msa_adds_u_df(DF_WORD, pws->w[1], pwt->w[1]);
1099 pwd->w[2] = msa_adds_u_df(DF_WORD, pws->w[2], pwt->w[2]);
1100 pwd->w[3] = msa_adds_u_df(DF_WORD, pws->w[3], pwt->w[3]);
1103 void helper_msa_adds_u_d(CPUMIPSState *env,
1104 uint32_t wd, uint32_t ws, uint32_t wt)
1106 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1107 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1108 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1110 pwd->d[0] = msa_adds_u_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
1111 pwd->d[1] = msa_adds_u_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
1115 static inline int64_t msa_addv_df(uint32_t df, int64_t arg1, int64_t arg2)
1120 void helper_msa_addv_b(CPUMIPSState *env,
1121 uint32_t wd, uint32_t ws, uint32_t wt)
1123 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1124 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1125 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1127 pwd->b[0] = msa_addv_df(DF_BYTE, pws->b[0], pwt->b[0]);
1128 pwd->b[1] = msa_addv_df(DF_BYTE, pws->b[1], pwt->b[1]);
1129 pwd->b[2] = msa_addv_df(DF_BYTE, pws->b[2], pwt->b[2]);
1130 pwd->b[3] = msa_addv_df(DF_BYTE, pws->b[3], pwt->b[3]);
1131 pwd->b[4] = msa_addv_df(DF_BYTE, pws->b[4], pwt->b[4]);
1132 pwd->b[5] = msa_addv_df(DF_BYTE, pws->b[5], pwt->b[5]);
1133 pwd->b[6] = msa_addv_df(DF_BYTE, pws->b[6], pwt->b[6]);
1134 pwd->b[7] = msa_addv_df(DF_BYTE, pws->b[7], pwt->b[7]);
1135 pwd->b[8] = msa_addv_df(DF_BYTE, pws->b[8], pwt->b[8]);
1136 pwd->b[9] = msa_addv_df(DF_BYTE, pws->b[9], pwt->b[9]);
1137 pwd->b[10] = msa_addv_df(DF_BYTE, pws->b[10], pwt->b[10]);
1138 pwd->b[11] = msa_addv_df(DF_BYTE, pws->b[11], pwt->b[11]);
1139 pwd->b[12] = msa_addv_df(DF_BYTE, pws->b[12], pwt->b[12]);
1140 pwd->b[13] = msa_addv_df(DF_BYTE, pws->b[13], pwt->b[13]);
1141 pwd->b[14] = msa_addv_df(DF_BYTE, pws->b[14], pwt->b[14]);
1142 pwd->b[15] = msa_addv_df(DF_BYTE, pws->b[15], pwt->b[15]);
1145 void helper_msa_addv_h(CPUMIPSState *env,
1146 uint32_t wd, uint32_t ws, uint32_t wt)
1148 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1149 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1150 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1152 pwd->h[0] = msa_addv_df(DF_HALF, pws->h[0], pwt->h[0]);
1153 pwd->h[1] = msa_addv_df(DF_HALF, pws->h[1], pwt->h[1]);
1154 pwd->h[2] = msa_addv_df(DF_HALF, pws->h[2], pwt->h[2]);
1155 pwd->h[3] = msa_addv_df(DF_HALF, pws->h[3], pwt->h[3]);
1156 pwd->h[4] = msa_addv_df(DF_HALF, pws->h[4], pwt->h[4]);
1157 pwd->h[5] = msa_addv_df(DF_HALF, pws->h[5], pwt->h[5]);
1158 pwd->h[6] = msa_addv_df(DF_HALF, pws->h[6], pwt->h[6]);
1159 pwd->h[7] = msa_addv_df(DF_HALF, pws->h[7], pwt->h[7]);
1162 void helper_msa_addv_w(CPUMIPSState *env,
1163 uint32_t wd, uint32_t ws, uint32_t wt)
1165 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1166 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1167 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1169 pwd->w[0] = msa_addv_df(DF_WORD, pws->w[0], pwt->w[0]);
1170 pwd->w[1] = msa_addv_df(DF_WORD, pws->w[1], pwt->w[1]);
1171 pwd->w[2] = msa_addv_df(DF_WORD, pws->w[2], pwt->w[2]);
1172 pwd->w[3] = msa_addv_df(DF_WORD, pws->w[3], pwt->w[3]);
1175 void helper_msa_addv_d(CPUMIPSState *env,
1176 uint32_t wd, uint32_t ws, uint32_t wt)
1178 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1179 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1180 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1182 pwd->d[0] = msa_addv_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
1183 pwd->d[1] = msa_addv_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
1191 * +---------------+----------------------------------------------------------+
1192 * | AVE_S.B | Vector Signed Average (byte) |
1193 * | AVE_S.H | Vector Signed Average (halfword) |
1194 * | AVE_S.W | Vector Signed Average (word) |
1195 * | AVE_S.D | Vector Signed Average (doubleword) |
1196 * | AVE_U.B | Vector Unsigned Average (byte) |
1197 * | AVE_U.H | Vector Unsigned Average (halfword) |
1198 * | AVE_U.W | Vector Unsigned Average (word) |
1199 * | AVE_U.D | Vector Unsigned Average (doubleword) |
1200 * | AVER_S.B | Vector Signed Average Rounded (byte) |
1201 * | AVER_S.H | Vector Signed Average Rounded (halfword) |
1202 * | AVER_S.W | Vector Signed Average Rounded (word) |
1203 * | AVER_S.D | Vector Signed Average Rounded (doubleword) |
1204 * | AVER_U.B | Vector Unsigned Average Rounded (byte) |
1205 * | AVER_U.H | Vector Unsigned Average Rounded (halfword) |
1206 * | AVER_U.W | Vector Unsigned Average Rounded (word) |
1207 * | AVER_U.D | Vector Unsigned Average Rounded (doubleword) |
1208 * +---------------+----------------------------------------------------------+
1211 static inline int64_t msa_ave_s_df(uint32_t df, int64_t arg1, int64_t arg2)
1214 return (arg1 >> 1) + (arg2 >> 1) + (arg1 & arg2 & 1);
1217 void helper_msa_ave_s_b(CPUMIPSState *env,
1218 uint32_t wd, uint32_t ws, uint32_t wt)
1220 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1221 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1222 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1224 pwd->b[0] = msa_ave_s_df(DF_BYTE, pws->b[0], pwt->b[0]);
1225 pwd->b[1] = msa_ave_s_df(DF_BYTE, pws->b[1], pwt->b[1]);
1226 pwd->b[2] = msa_ave_s_df(DF_BYTE, pws->b[2], pwt->b[2]);
1227 pwd->b[3] = msa_ave_s_df(DF_BYTE, pws->b[3], pwt->b[3]);
1228 pwd->b[4] = msa_ave_s_df(DF_BYTE, pws->b[4], pwt->b[4]);
1229 pwd->b[5] = msa_ave_s_df(DF_BYTE, pws->b[5], pwt->b[5]);
1230 pwd->b[6] = msa_ave_s_df(DF_BYTE, pws->b[6], pwt->b[6]);
1231 pwd->b[7] = msa_ave_s_df(DF_BYTE, pws->b[7], pwt->b[7]);
1232 pwd->b[8] = msa_ave_s_df(DF_BYTE, pws->b[8], pwt->b[8]);
1233 pwd->b[9] = msa_ave_s_df(DF_BYTE, pws->b[9], pwt->b[9]);
1234 pwd->b[10] = msa_ave_s_df(DF_BYTE, pws->b[10], pwt->b[10]);
1235 pwd->b[11] = msa_ave_s_df(DF_BYTE, pws->b[11], pwt->b[11]);
1236 pwd->b[12] = msa_ave_s_df(DF_BYTE, pws->b[12], pwt->b[12]);
1237 pwd->b[13] = msa_ave_s_df(DF_BYTE, pws->b[13], pwt->b[13]);
1238 pwd->b[14] = msa_ave_s_df(DF_BYTE, pws->b[14], pwt->b[14]);
1239 pwd->b[15] = msa_ave_s_df(DF_BYTE, pws->b[15], pwt->b[15]);
1242 void helper_msa_ave_s_h(CPUMIPSState *env,
1243 uint32_t wd, uint32_t ws, uint32_t wt)
1245 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1246 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1247 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1249 pwd->h[0] = msa_ave_s_df(DF_HALF, pws->h[0], pwt->h[0]);
1250 pwd->h[1] = msa_ave_s_df(DF_HALF, pws->h[1], pwt->h[1]);
1251 pwd->h[2] = msa_ave_s_df(DF_HALF, pws->h[2], pwt->h[2]);
1252 pwd->h[3] = msa_ave_s_df(DF_HALF, pws->h[3], pwt->h[3]);
1253 pwd->h[4] = msa_ave_s_df(DF_HALF, pws->h[4], pwt->h[4]);
1254 pwd->h[5] = msa_ave_s_df(DF_HALF, pws->h[5], pwt->h[5]);
1255 pwd->h[6] = msa_ave_s_df(DF_HALF, pws->h[6], pwt->h[6]);
1256 pwd->h[7] = msa_ave_s_df(DF_HALF, pws->h[7], pwt->h[7]);
1259 void helper_msa_ave_s_w(CPUMIPSState *env,
1260 uint32_t wd, uint32_t ws, uint32_t wt)
1262 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1263 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1264 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1266 pwd->w[0] = msa_ave_s_df(DF_WORD, pws->w[0], pwt->w[0]);
1267 pwd->w[1] = msa_ave_s_df(DF_WORD, pws->w[1], pwt->w[1]);
1268 pwd->w[2] = msa_ave_s_df(DF_WORD, pws->w[2], pwt->w[2]);
1269 pwd->w[3] = msa_ave_s_df(DF_WORD, pws->w[3], pwt->w[3]);
1272 void helper_msa_ave_s_d(CPUMIPSState *env,
1273 uint32_t wd, uint32_t ws, uint32_t wt)
1275 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1276 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1277 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1279 pwd->d[0] = msa_ave_s_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
1280 pwd->d[1] = msa_ave_s_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
1283 static inline uint64_t msa_ave_u_df(uint32_t df, uint64_t arg1, uint64_t arg2)
1285 uint64_t u_arg1 = UNSIGNED(arg1, df);
1286 uint64_t u_arg2 = UNSIGNED(arg2, df);
1287 /* unsigned shift */
1288 return (u_arg1 >> 1) + (u_arg2 >> 1) + (u_arg1 & u_arg2 & 1);
1291 void helper_msa_ave_u_b(CPUMIPSState *env,
1292 uint32_t wd, uint32_t ws, uint32_t wt)
1294 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1295 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1296 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1298 pwd->b[0] = msa_ave_u_df(DF_BYTE, pws->b[0], pwt->b[0]);
1299 pwd->b[1] = msa_ave_u_df(DF_BYTE, pws->b[1], pwt->b[1]);
1300 pwd->b[2] = msa_ave_u_df(DF_BYTE, pws->b[2], pwt->b[2]);
1301 pwd->b[3] = msa_ave_u_df(DF_BYTE, pws->b[3], pwt->b[3]);
1302 pwd->b[4] = msa_ave_u_df(DF_BYTE, pws->b[4], pwt->b[4]);
1303 pwd->b[5] = msa_ave_u_df(DF_BYTE, pws->b[5], pwt->b[5]);
1304 pwd->b[6] = msa_ave_u_df(DF_BYTE, pws->b[6], pwt->b[6]);
1305 pwd->b[7] = msa_ave_u_df(DF_BYTE, pws->b[7], pwt->b[7]);
1306 pwd->b[8] = msa_ave_u_df(DF_BYTE, pws->b[8], pwt->b[8]);
1307 pwd->b[9] = msa_ave_u_df(DF_BYTE, pws->b[9], pwt->b[9]);
1308 pwd->b[10] = msa_ave_u_df(DF_BYTE, pws->b[10], pwt->b[10]);
1309 pwd->b[11] = msa_ave_u_df(DF_BYTE, pws->b[11], pwt->b[11]);
1310 pwd->b[12] = msa_ave_u_df(DF_BYTE, pws->b[12], pwt->b[12]);
1311 pwd->b[13] = msa_ave_u_df(DF_BYTE, pws->b[13], pwt->b[13]);
1312 pwd->b[14] = msa_ave_u_df(DF_BYTE, pws->b[14], pwt->b[14]);
1313 pwd->b[15] = msa_ave_u_df(DF_BYTE, pws->b[15], pwt->b[15]);
1316 void helper_msa_ave_u_h(CPUMIPSState *env,
1317 uint32_t wd, uint32_t ws, uint32_t wt)
1319 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1320 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1321 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1323 pwd->h[0] = msa_ave_u_df(DF_HALF, pws->h[0], pwt->h[0]);
1324 pwd->h[1] = msa_ave_u_df(DF_HALF, pws->h[1], pwt->h[1]);
1325 pwd->h[2] = msa_ave_u_df(DF_HALF, pws->h[2], pwt->h[2]);
1326 pwd->h[3] = msa_ave_u_df(DF_HALF, pws->h[3], pwt->h[3]);
1327 pwd->h[4] = msa_ave_u_df(DF_HALF, pws->h[4], pwt->h[4]);
1328 pwd->h[5] = msa_ave_u_df(DF_HALF, pws->h[5], pwt->h[5]);
1329 pwd->h[6] = msa_ave_u_df(DF_HALF, pws->h[6], pwt->h[6]);
1330 pwd->h[7] = msa_ave_u_df(DF_HALF, pws->h[7], pwt->h[7]);
1333 void helper_msa_ave_u_w(CPUMIPSState *env,
1334 uint32_t wd, uint32_t ws, uint32_t wt)
1336 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1337 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1338 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1340 pwd->w[0] = msa_ave_u_df(DF_WORD, pws->w[0], pwt->w[0]);
1341 pwd->w[1] = msa_ave_u_df(DF_WORD, pws->w[1], pwt->w[1]);
1342 pwd->w[2] = msa_ave_u_df(DF_WORD, pws->w[2], pwt->w[2]);
1343 pwd->w[3] = msa_ave_u_df(DF_WORD, pws->w[3], pwt->w[3]);
1346 void helper_msa_ave_u_d(CPUMIPSState *env,
1347 uint32_t wd, uint32_t ws, uint32_t wt)
1349 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1350 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1351 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1353 pwd->d[0] = msa_ave_u_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
1354 pwd->d[1] = msa_ave_u_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
1357 static inline int64_t msa_aver_s_df(uint32_t df, int64_t arg1, int64_t arg2)
1360 return (arg1 >> 1) + (arg2 >> 1) + ((arg1 | arg2) & 1);
1363 void helper_msa_aver_s_b(CPUMIPSState *env,
1364 uint32_t wd, uint32_t ws, uint32_t wt)
1366 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1367 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1368 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1370 pwd->b[0] = msa_aver_s_df(DF_BYTE, pws->b[0], pwt->b[0]);
1371 pwd->b[1] = msa_aver_s_df(DF_BYTE, pws->b[1], pwt->b[1]);
1372 pwd->b[2] = msa_aver_s_df(DF_BYTE, pws->b[2], pwt->b[2]);
1373 pwd->b[3] = msa_aver_s_df(DF_BYTE, pws->b[3], pwt->b[3]);
1374 pwd->b[4] = msa_aver_s_df(DF_BYTE, pws->b[4], pwt->b[4]);
1375 pwd->b[5] = msa_aver_s_df(DF_BYTE, pws->b[5], pwt->b[5]);
1376 pwd->b[6] = msa_aver_s_df(DF_BYTE, pws->b[6], pwt->b[6]);
1377 pwd->b[7] = msa_aver_s_df(DF_BYTE, pws->b[7], pwt->b[7]);
1378 pwd->b[8] = msa_aver_s_df(DF_BYTE, pws->b[8], pwt->b[8]);
1379 pwd->b[9] = msa_aver_s_df(DF_BYTE, pws->b[9], pwt->b[9]);
1380 pwd->b[10] = msa_aver_s_df(DF_BYTE, pws->b[10], pwt->b[10]);
1381 pwd->b[11] = msa_aver_s_df(DF_BYTE, pws->b[11], pwt->b[11]);
1382 pwd->b[12] = msa_aver_s_df(DF_BYTE, pws->b[12], pwt->b[12]);
1383 pwd->b[13] = msa_aver_s_df(DF_BYTE, pws->b[13], pwt->b[13]);
1384 pwd->b[14] = msa_aver_s_df(DF_BYTE, pws->b[14], pwt->b[14]);
1385 pwd->b[15] = msa_aver_s_df(DF_BYTE, pws->b[15], pwt->b[15]);
1388 void helper_msa_aver_s_h(CPUMIPSState *env,
1389 uint32_t wd, uint32_t ws, uint32_t wt)
1391 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1392 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1393 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1395 pwd->h[0] = msa_aver_s_df(DF_HALF, pws->h[0], pwt->h[0]);
1396 pwd->h[1] = msa_aver_s_df(DF_HALF, pws->h[1], pwt->h[1]);
1397 pwd->h[2] = msa_aver_s_df(DF_HALF, pws->h[2], pwt->h[2]);
1398 pwd->h[3] = msa_aver_s_df(DF_HALF, pws->h[3], pwt->h[3]);
1399 pwd->h[4] = msa_aver_s_df(DF_HALF, pws->h[4], pwt->h[4]);
1400 pwd->h[5] = msa_aver_s_df(DF_HALF, pws->h[5], pwt->h[5]);
1401 pwd->h[6] = msa_aver_s_df(DF_HALF, pws->h[6], pwt->h[6]);
1402 pwd->h[7] = msa_aver_s_df(DF_HALF, pws->h[7], pwt->h[7]);
1405 void helper_msa_aver_s_w(CPUMIPSState *env,
1406 uint32_t wd, uint32_t ws, uint32_t wt)
1408 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1409 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1410 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1412 pwd->w[0] = msa_aver_s_df(DF_WORD, pws->w[0], pwt->w[0]);
1413 pwd->w[1] = msa_aver_s_df(DF_WORD, pws->w[1], pwt->w[1]);
1414 pwd->w[2] = msa_aver_s_df(DF_WORD, pws->w[2], pwt->w[2]);
1415 pwd->w[3] = msa_aver_s_df(DF_WORD, pws->w[3], pwt->w[3]);
1418 void helper_msa_aver_s_d(CPUMIPSState *env,
1419 uint32_t wd, uint32_t ws, uint32_t wt)
1421 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1422 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1423 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1425 pwd->d[0] = msa_aver_s_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
1426 pwd->d[1] = msa_aver_s_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
1429 static inline uint64_t msa_aver_u_df(uint32_t df, uint64_t arg1, uint64_t arg2)
1431 uint64_t u_arg1 = UNSIGNED(arg1, df);
1432 uint64_t u_arg2 = UNSIGNED(arg2, df);
1433 /* unsigned shift */
1434 return (u_arg1 >> 1) + (u_arg2 >> 1) + ((u_arg1 | u_arg2) & 1);
1437 void helper_msa_aver_u_b(CPUMIPSState *env,
1438 uint32_t wd, uint32_t ws, uint32_t wt)
1440 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1441 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1442 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1444 pwd->b[0] = msa_aver_u_df(DF_BYTE, pws->b[0], pwt->b[0]);
1445 pwd->b[1] = msa_aver_u_df(DF_BYTE, pws->b[1], pwt->b[1]);
1446 pwd->b[2] = msa_aver_u_df(DF_BYTE, pws->b[2], pwt->b[2]);
1447 pwd->b[3] = msa_aver_u_df(DF_BYTE, pws->b[3], pwt->b[3]);
1448 pwd->b[4] = msa_aver_u_df(DF_BYTE, pws->b[4], pwt->b[4]);
1449 pwd->b[5] = msa_aver_u_df(DF_BYTE, pws->b[5], pwt->b[5]);
1450 pwd->b[6] = msa_aver_u_df(DF_BYTE, pws->b[6], pwt->b[6]);
1451 pwd->b[7] = msa_aver_u_df(DF_BYTE, pws->b[7], pwt->b[7]);
1452 pwd->b[8] = msa_aver_u_df(DF_BYTE, pws->b[8], pwt->b[8]);
1453 pwd->b[9] = msa_aver_u_df(DF_BYTE, pws->b[9], pwt->b[9]);
1454 pwd->b[10] = msa_aver_u_df(DF_BYTE, pws->b[10], pwt->b[10]);
1455 pwd->b[11] = msa_aver_u_df(DF_BYTE, pws->b[11], pwt->b[11]);
1456 pwd->b[12] = msa_aver_u_df(DF_BYTE, pws->b[12], pwt->b[12]);
1457 pwd->b[13] = msa_aver_u_df(DF_BYTE, pws->b[13], pwt->b[13]);
1458 pwd->b[14] = msa_aver_u_df(DF_BYTE, pws->b[14], pwt->b[14]);
1459 pwd->b[15] = msa_aver_u_df(DF_BYTE, pws->b[15], pwt->b[15]);
1462 void helper_msa_aver_u_h(CPUMIPSState *env,
1463 uint32_t wd, uint32_t ws, uint32_t wt)
1465 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1466 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1467 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1469 pwd->h[0] = msa_aver_u_df(DF_HALF, pws->h[0], pwt->h[0]);
1470 pwd->h[1] = msa_aver_u_df(DF_HALF, pws->h[1], pwt->h[1]);
1471 pwd->h[2] = msa_aver_u_df(DF_HALF, pws->h[2], pwt->h[2]);
1472 pwd->h[3] = msa_aver_u_df(DF_HALF, pws->h[3], pwt->h[3]);
1473 pwd->h[4] = msa_aver_u_df(DF_HALF, pws->h[4], pwt->h[4]);
1474 pwd->h[5] = msa_aver_u_df(DF_HALF, pws->h[5], pwt->h[5]);
1475 pwd->h[6] = msa_aver_u_df(DF_HALF, pws->h[6], pwt->h[6]);
1476 pwd->h[7] = msa_aver_u_df(DF_HALF, pws->h[7], pwt->h[7]);
1479 void helper_msa_aver_u_w(CPUMIPSState *env,
1480 uint32_t wd, uint32_t ws, uint32_t wt)
1482 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1483 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1484 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1486 pwd->w[0] = msa_aver_u_df(DF_WORD, pws->w[0], pwt->w[0]);
1487 pwd->w[1] = msa_aver_u_df(DF_WORD, pws->w[1], pwt->w[1]);
1488 pwd->w[2] = msa_aver_u_df(DF_WORD, pws->w[2], pwt->w[2]);
1489 pwd->w[3] = msa_aver_u_df(DF_WORD, pws->w[3], pwt->w[3]);
1492 void helper_msa_aver_u_d(CPUMIPSState *env,
1493 uint32_t wd, uint32_t ws, uint32_t wt)
1495 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1496 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1497 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1499 pwd->d[0] = msa_aver_u_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
1500 pwd->d[1] = msa_aver_u_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
1508 * +---------------+----------------------------------------------------------+
1509 * | CEQ.B | Vector Compare Equal (byte) |
1510 * | CEQ.H | Vector Compare Equal (halfword) |
1511 * | CEQ.W | Vector Compare Equal (word) |
1512 * | CEQ.D | Vector Compare Equal (doubleword) |
1513 * | CLE_S.B | Vector Compare Signed Less Than or Equal (byte) |
1514 * | CLE_S.H | Vector Compare Signed Less Than or Equal (halfword) |
1515 * | CLE_S.W | Vector Compare Signed Less Than or Equal (word) |
1516 * | CLE_S.D | Vector Compare Signed Less Than or Equal (doubleword) |
1517 * | CLE_U.B | Vector Compare Unsigned Less Than or Equal (byte) |
1518 * | CLE_U.H | Vector Compare Unsigned Less Than or Equal (halfword) |
1519 * | CLE_U.W | Vector Compare Unsigned Less Than or Equal (word) |
1520 * | CLE_U.D | Vector Compare Unsigned Less Than or Equal (doubleword) |
1521 * | CLT_S.B | Vector Compare Signed Less Than (byte) |
1522 * | CLT_S.H | Vector Compare Signed Less Than (halfword) |
1523 * | CLT_S.W | Vector Compare Signed Less Than (word) |
1524 * | CLT_S.D | Vector Compare Signed Less Than (doubleword) |
1525 * | CLT_U.B | Vector Compare Unsigned Less Than (byte) |
1526 * | CLT_U.H | Vector Compare Unsigned Less Than (halfword) |
1527 * | CLT_U.W | Vector Compare Unsigned Less Than (word) |
1528 * | CLT_U.D | Vector Compare Unsigned Less Than (doubleword) |
1529 * +---------------+----------------------------------------------------------+
1532 static inline int64_t msa_ceq_df(uint32_t df, int64_t arg1, int64_t arg2)
1534 return arg1 == arg2 ? -1 : 0;
1537 void helper_msa_ceq_b(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
1539 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1540 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1541 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1543 pwd->b[0] = msa_ceq_df(DF_BYTE, pws->b[0], pwt->b[0]);
1544 pwd->b[1] = msa_ceq_df(DF_BYTE, pws->b[1], pwt->b[1]);
1545 pwd->b[2] = msa_ceq_df(DF_BYTE, pws->b[2], pwt->b[2]);
1546 pwd->b[3] = msa_ceq_df(DF_BYTE, pws->b[3], pwt->b[3]);
1547 pwd->b[4] = msa_ceq_df(DF_BYTE, pws->b[4], pwt->b[4]);
1548 pwd->b[5] = msa_ceq_df(DF_BYTE, pws->b[5], pwt->b[5]);
1549 pwd->b[6] = msa_ceq_df(DF_BYTE, pws->b[6], pwt->b[6]);
1550 pwd->b[7] = msa_ceq_df(DF_BYTE, pws->b[7], pwt->b[7]);
1551 pwd->b[8] = msa_ceq_df(DF_BYTE, pws->b[8], pwt->b[8]);
1552 pwd->b[9] = msa_ceq_df(DF_BYTE, pws->b[9], pwt->b[9]);
1553 pwd->b[10] = msa_ceq_df(DF_BYTE, pws->b[10], pwt->b[10]);
1554 pwd->b[11] = msa_ceq_df(DF_BYTE, pws->b[11], pwt->b[11]);
1555 pwd->b[12] = msa_ceq_df(DF_BYTE, pws->b[12], pwt->b[12]);
1556 pwd->b[13] = msa_ceq_df(DF_BYTE, pws->b[13], pwt->b[13]);
1557 pwd->b[14] = msa_ceq_df(DF_BYTE, pws->b[14], pwt->b[14]);
1558 pwd->b[15] = msa_ceq_df(DF_BYTE, pws->b[15], pwt->b[15]);
1561 void helper_msa_ceq_h(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
1563 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1564 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1565 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1567 pwd->h[0] = msa_ceq_df(DF_HALF, pws->h[0], pwt->h[0]);
1568 pwd->h[1] = msa_ceq_df(DF_HALF, pws->h[1], pwt->h[1]);
1569 pwd->h[2] = msa_ceq_df(DF_HALF, pws->h[2], pwt->h[2]);
1570 pwd->h[3] = msa_ceq_df(DF_HALF, pws->h[3], pwt->h[3]);
1571 pwd->h[4] = msa_ceq_df(DF_HALF, pws->h[4], pwt->h[4]);
1572 pwd->h[5] = msa_ceq_df(DF_HALF, pws->h[5], pwt->h[5]);
1573 pwd->h[6] = msa_ceq_df(DF_HALF, pws->h[6], pwt->h[6]);
1574 pwd->h[7] = msa_ceq_df(DF_HALF, pws->h[7], pwt->h[7]);
1577 void helper_msa_ceq_w(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
1579 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1580 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1581 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1583 pwd->w[0] = msa_ceq_df(DF_WORD, pws->w[0], pwt->w[0]);
1584 pwd->w[1] = msa_ceq_df(DF_WORD, pws->w[1], pwt->w[1]);
1585 pwd->w[2] = msa_ceq_df(DF_WORD, pws->w[2], pwt->w[2]);
1586 pwd->w[3] = msa_ceq_df(DF_WORD, pws->w[3], pwt->w[3]);
1589 void helper_msa_ceq_d(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
1591 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1592 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1593 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1595 pwd->d[0] = msa_ceq_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
1596 pwd->d[1] = msa_ceq_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
1599 static inline int64_t msa_cle_s_df(uint32_t df, int64_t arg1, int64_t arg2)
1601 return arg1 <= arg2 ? -1 : 0;
1604 void helper_msa_cle_s_b(CPUMIPSState *env,
1605 uint32_t wd, uint32_t ws, uint32_t wt)
1607 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1608 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1609 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1611 pwd->b[0] = msa_cle_s_df(DF_BYTE, pws->b[0], pwt->b[0]);
1612 pwd->b[1] = msa_cle_s_df(DF_BYTE, pws->b[1], pwt->b[1]);
1613 pwd->b[2] = msa_cle_s_df(DF_BYTE, pws->b[2], pwt->b[2]);
1614 pwd->b[3] = msa_cle_s_df(DF_BYTE, pws->b[3], pwt->b[3]);
1615 pwd->b[4] = msa_cle_s_df(DF_BYTE, pws->b[4], pwt->b[4]);
1616 pwd->b[5] = msa_cle_s_df(DF_BYTE, pws->b[5], pwt->b[5]);
1617 pwd->b[6] = msa_cle_s_df(DF_BYTE, pws->b[6], pwt->b[6]);
1618 pwd->b[7] = msa_cle_s_df(DF_BYTE, pws->b[7], pwt->b[7]);
1619 pwd->b[8] = msa_cle_s_df(DF_BYTE, pws->b[8], pwt->b[8]);
1620 pwd->b[9] = msa_cle_s_df(DF_BYTE, pws->b[9], pwt->b[9]);
1621 pwd->b[10] = msa_cle_s_df(DF_BYTE, pws->b[10], pwt->b[10]);
1622 pwd->b[11] = msa_cle_s_df(DF_BYTE, pws->b[11], pwt->b[11]);
1623 pwd->b[12] = msa_cle_s_df(DF_BYTE, pws->b[12], pwt->b[12]);
1624 pwd->b[13] = msa_cle_s_df(DF_BYTE, pws->b[13], pwt->b[13]);
1625 pwd->b[14] = msa_cle_s_df(DF_BYTE, pws->b[14], pwt->b[14]);
1626 pwd->b[15] = msa_cle_s_df(DF_BYTE, pws->b[15], pwt->b[15]);
1629 void helper_msa_cle_s_h(CPUMIPSState *env,
1630 uint32_t wd, uint32_t ws, uint32_t wt)
1632 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1633 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1634 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1636 pwd->h[0] = msa_cle_s_df(DF_HALF, pws->h[0], pwt->h[0]);
1637 pwd->h[1] = msa_cle_s_df(DF_HALF, pws->h[1], pwt->h[1]);
1638 pwd->h[2] = msa_cle_s_df(DF_HALF, pws->h[2], pwt->h[2]);
1639 pwd->h[3] = msa_cle_s_df(DF_HALF, pws->h[3], pwt->h[3]);
1640 pwd->h[4] = msa_cle_s_df(DF_HALF, pws->h[4], pwt->h[4]);
1641 pwd->h[5] = msa_cle_s_df(DF_HALF, pws->h[5], pwt->h[5]);
1642 pwd->h[6] = msa_cle_s_df(DF_HALF, pws->h[6], pwt->h[6]);
1643 pwd->h[7] = msa_cle_s_df(DF_HALF, pws->h[7], pwt->h[7]);
1646 void helper_msa_cle_s_w(CPUMIPSState *env,
1647 uint32_t wd, uint32_t ws, uint32_t wt)
1649 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1650 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1651 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1653 pwd->w[0] = msa_cle_s_df(DF_WORD, pws->w[0], pwt->w[0]);
1654 pwd->w[1] = msa_cle_s_df(DF_WORD, pws->w[1], pwt->w[1]);
1655 pwd->w[2] = msa_cle_s_df(DF_WORD, pws->w[2], pwt->w[2]);
1656 pwd->w[3] = msa_cle_s_df(DF_WORD, pws->w[3], pwt->w[3]);
1659 void helper_msa_cle_s_d(CPUMIPSState *env,
1660 uint32_t wd, uint32_t ws, uint32_t wt)
1662 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1663 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1664 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1666 pwd->d[0] = msa_cle_s_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
1667 pwd->d[1] = msa_cle_s_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
1670 static inline int64_t msa_cle_u_df(uint32_t df, int64_t arg1, int64_t arg2)
1672 uint64_t u_arg1 = UNSIGNED(arg1, df);
1673 uint64_t u_arg2 = UNSIGNED(arg2, df);
1674 return u_arg1 <= u_arg2 ? -1 : 0;
1677 void helper_msa_cle_u_b(CPUMIPSState *env,
1678 uint32_t wd, uint32_t ws, uint32_t wt)
1680 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1681 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1682 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1684 pwd->b[0] = msa_cle_u_df(DF_BYTE, pws->b[0], pwt->b[0]);
1685 pwd->b[1] = msa_cle_u_df(DF_BYTE, pws->b[1], pwt->b[1]);
1686 pwd->b[2] = msa_cle_u_df(DF_BYTE, pws->b[2], pwt->b[2]);
1687 pwd->b[3] = msa_cle_u_df(DF_BYTE, pws->b[3], pwt->b[3]);
1688 pwd->b[4] = msa_cle_u_df(DF_BYTE, pws->b[4], pwt->b[4]);
1689 pwd->b[5] = msa_cle_u_df(DF_BYTE, pws->b[5], pwt->b[5]);
1690 pwd->b[6] = msa_cle_u_df(DF_BYTE, pws->b[6], pwt->b[6]);
1691 pwd->b[7] = msa_cle_u_df(DF_BYTE, pws->b[7], pwt->b[7]);
1692 pwd->b[8] = msa_cle_u_df(DF_BYTE, pws->b[8], pwt->b[8]);
1693 pwd->b[9] = msa_cle_u_df(DF_BYTE, pws->b[9], pwt->b[9]);
1694 pwd->b[10] = msa_cle_u_df(DF_BYTE, pws->b[10], pwt->b[10]);
1695 pwd->b[11] = msa_cle_u_df(DF_BYTE, pws->b[11], pwt->b[11]);
1696 pwd->b[12] = msa_cle_u_df(DF_BYTE, pws->b[12], pwt->b[12]);
1697 pwd->b[13] = msa_cle_u_df(DF_BYTE, pws->b[13], pwt->b[13]);
1698 pwd->b[14] = msa_cle_u_df(DF_BYTE, pws->b[14], pwt->b[14]);
1699 pwd->b[15] = msa_cle_u_df(DF_BYTE, pws->b[15], pwt->b[15]);
1702 void helper_msa_cle_u_h(CPUMIPSState *env,
1703 uint32_t wd, uint32_t ws, uint32_t wt)
1705 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1706 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1707 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1709 pwd->h[0] = msa_cle_u_df(DF_HALF, pws->h[0], pwt->h[0]);
1710 pwd->h[1] = msa_cle_u_df(DF_HALF, pws->h[1], pwt->h[1]);
1711 pwd->h[2] = msa_cle_u_df(DF_HALF, pws->h[2], pwt->h[2]);
1712 pwd->h[3] = msa_cle_u_df(DF_HALF, pws->h[3], pwt->h[3]);
1713 pwd->h[4] = msa_cle_u_df(DF_HALF, pws->h[4], pwt->h[4]);
1714 pwd->h[5] = msa_cle_u_df(DF_HALF, pws->h[5], pwt->h[5]);
1715 pwd->h[6] = msa_cle_u_df(DF_HALF, pws->h[6], pwt->h[6]);
1716 pwd->h[7] = msa_cle_u_df(DF_HALF, pws->h[7], pwt->h[7]);
1719 void helper_msa_cle_u_w(CPUMIPSState *env,
1720 uint32_t wd, uint32_t ws, uint32_t wt)
1722 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1723 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1724 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1726 pwd->w[0] = msa_cle_u_df(DF_WORD, pws->w[0], pwt->w[0]);
1727 pwd->w[1] = msa_cle_u_df(DF_WORD, pws->w[1], pwt->w[1]);
1728 pwd->w[2] = msa_cle_u_df(DF_WORD, pws->w[2], pwt->w[2]);
1729 pwd->w[3] = msa_cle_u_df(DF_WORD, pws->w[3], pwt->w[3]);
1732 void helper_msa_cle_u_d(CPUMIPSState *env,
1733 uint32_t wd, uint32_t ws, uint32_t wt)
1735 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1736 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1737 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1739 pwd->d[0] = msa_cle_u_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
1740 pwd->d[1] = msa_cle_u_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
1743 static inline int64_t msa_clt_s_df(uint32_t df, int64_t arg1, int64_t arg2)
1745 return arg1 < arg2 ? -1 : 0;
1748 void helper_msa_clt_s_b(CPUMIPSState *env,
1749 uint32_t wd, uint32_t ws, uint32_t wt)
1751 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1752 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1753 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1755 pwd->b[0] = msa_clt_s_df(DF_BYTE, pws->b[0], pwt->b[0]);
1756 pwd->b[1] = msa_clt_s_df(DF_BYTE, pws->b[1], pwt->b[1]);
1757 pwd->b[2] = msa_clt_s_df(DF_BYTE, pws->b[2], pwt->b[2]);
1758 pwd->b[3] = msa_clt_s_df(DF_BYTE, pws->b[3], pwt->b[3]);
1759 pwd->b[4] = msa_clt_s_df(DF_BYTE, pws->b[4], pwt->b[4]);
1760 pwd->b[5] = msa_clt_s_df(DF_BYTE, pws->b[5], pwt->b[5]);
1761 pwd->b[6] = msa_clt_s_df(DF_BYTE, pws->b[6], pwt->b[6]);
1762 pwd->b[7] = msa_clt_s_df(DF_BYTE, pws->b[7], pwt->b[7]);
1763 pwd->b[8] = msa_clt_s_df(DF_BYTE, pws->b[8], pwt->b[8]);
1764 pwd->b[9] = msa_clt_s_df(DF_BYTE, pws->b[9], pwt->b[9]);
1765 pwd->b[10] = msa_clt_s_df(DF_BYTE, pws->b[10], pwt->b[10]);
1766 pwd->b[11] = msa_clt_s_df(DF_BYTE, pws->b[11], pwt->b[11]);
1767 pwd->b[12] = msa_clt_s_df(DF_BYTE, pws->b[12], pwt->b[12]);
1768 pwd->b[13] = msa_clt_s_df(DF_BYTE, pws->b[13], pwt->b[13]);
1769 pwd->b[14] = msa_clt_s_df(DF_BYTE, pws->b[14], pwt->b[14]);
1770 pwd->b[15] = msa_clt_s_df(DF_BYTE, pws->b[15], pwt->b[15]);
1773 void helper_msa_clt_s_h(CPUMIPSState *env,
1774 uint32_t wd, uint32_t ws, uint32_t wt)
1776 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1777 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1778 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1780 pwd->h[0] = msa_clt_s_df(DF_HALF, pws->h[0], pwt->h[0]);
1781 pwd->h[1] = msa_clt_s_df(DF_HALF, pws->h[1], pwt->h[1]);
1782 pwd->h[2] = msa_clt_s_df(DF_HALF, pws->h[2], pwt->h[2]);
1783 pwd->h[3] = msa_clt_s_df(DF_HALF, pws->h[3], pwt->h[3]);
1784 pwd->h[4] = msa_clt_s_df(DF_HALF, pws->h[4], pwt->h[4]);
1785 pwd->h[5] = msa_clt_s_df(DF_HALF, pws->h[5], pwt->h[5]);
1786 pwd->h[6] = msa_clt_s_df(DF_HALF, pws->h[6], pwt->h[6]);
1787 pwd->h[7] = msa_clt_s_df(DF_HALF, pws->h[7], pwt->h[7]);
1790 void helper_msa_clt_s_w(CPUMIPSState *env,
1791 uint32_t wd, uint32_t ws, uint32_t wt)
1793 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1794 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1795 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1797 pwd->w[0] = msa_clt_s_df(DF_WORD, pws->w[0], pwt->w[0]);
1798 pwd->w[1] = msa_clt_s_df(DF_WORD, pws->w[1], pwt->w[1]);
1799 pwd->w[2] = msa_clt_s_df(DF_WORD, pws->w[2], pwt->w[2]);
1800 pwd->w[3] = msa_clt_s_df(DF_WORD, pws->w[3], pwt->w[3]);
1803 void helper_msa_clt_s_d(CPUMIPSState *env,
1804 uint32_t wd, uint32_t ws, uint32_t wt)
1806 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1807 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1808 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1810 pwd->d[0] = msa_clt_s_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
1811 pwd->d[1] = msa_clt_s_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
1814 static inline int64_t msa_clt_u_df(uint32_t df, int64_t arg1, int64_t arg2)
1816 uint64_t u_arg1 = UNSIGNED(arg1, df);
1817 uint64_t u_arg2 = UNSIGNED(arg2, df);
1818 return u_arg1 < u_arg2 ? -1 : 0;
1821 void helper_msa_clt_u_b(CPUMIPSState *env,
1822 uint32_t wd, uint32_t ws, uint32_t wt)
1824 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1825 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1826 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1828 pwd->b[0] = msa_clt_u_df(DF_BYTE, pws->b[0], pwt->b[0]);
1829 pwd->b[1] = msa_clt_u_df(DF_BYTE, pws->b[1], pwt->b[1]);
1830 pwd->b[2] = msa_clt_u_df(DF_BYTE, pws->b[2], pwt->b[2]);
1831 pwd->b[3] = msa_clt_u_df(DF_BYTE, pws->b[3], pwt->b[3]);
1832 pwd->b[4] = msa_clt_u_df(DF_BYTE, pws->b[4], pwt->b[4]);
1833 pwd->b[5] = msa_clt_u_df(DF_BYTE, pws->b[5], pwt->b[5]);
1834 pwd->b[6] = msa_clt_u_df(DF_BYTE, pws->b[6], pwt->b[6]);
1835 pwd->b[7] = msa_clt_u_df(DF_BYTE, pws->b[7], pwt->b[7]);
1836 pwd->b[8] = msa_clt_u_df(DF_BYTE, pws->b[8], pwt->b[8]);
1837 pwd->b[9] = msa_clt_u_df(DF_BYTE, pws->b[9], pwt->b[9]);
1838 pwd->b[10] = msa_clt_u_df(DF_BYTE, pws->b[10], pwt->b[10]);
1839 pwd->b[11] = msa_clt_u_df(DF_BYTE, pws->b[11], pwt->b[11]);
1840 pwd->b[12] = msa_clt_u_df(DF_BYTE, pws->b[12], pwt->b[12]);
1841 pwd->b[13] = msa_clt_u_df(DF_BYTE, pws->b[13], pwt->b[13]);
1842 pwd->b[14] = msa_clt_u_df(DF_BYTE, pws->b[14], pwt->b[14]);
1843 pwd->b[15] = msa_clt_u_df(DF_BYTE, pws->b[15], pwt->b[15]);
1846 void helper_msa_clt_u_h(CPUMIPSState *env,
1847 uint32_t wd, uint32_t ws, uint32_t wt)
1849 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1850 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1851 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1853 pwd->h[0] = msa_clt_u_df(DF_HALF, pws->h[0], pwt->h[0]);
1854 pwd->h[1] = msa_clt_u_df(DF_HALF, pws->h[1], pwt->h[1]);
1855 pwd->h[2] = msa_clt_u_df(DF_HALF, pws->h[2], pwt->h[2]);
1856 pwd->h[3] = msa_clt_u_df(DF_HALF, pws->h[3], pwt->h[3]);
1857 pwd->h[4] = msa_clt_u_df(DF_HALF, pws->h[4], pwt->h[4]);
1858 pwd->h[5] = msa_clt_u_df(DF_HALF, pws->h[5], pwt->h[5]);
1859 pwd->h[6] = msa_clt_u_df(DF_HALF, pws->h[6], pwt->h[6]);
1860 pwd->h[7] = msa_clt_u_df(DF_HALF, pws->h[7], pwt->h[7]);
1863 void helper_msa_clt_u_w(CPUMIPSState *env,
1864 uint32_t wd, uint32_t ws, uint32_t wt)
1866 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1867 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1868 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1870 pwd->w[0] = msa_clt_u_df(DF_WORD, pws->w[0], pwt->w[0]);
1871 pwd->w[1] = msa_clt_u_df(DF_WORD, pws->w[1], pwt->w[1]);
1872 pwd->w[2] = msa_clt_u_df(DF_WORD, pws->w[2], pwt->w[2]);
1873 pwd->w[3] = msa_clt_u_df(DF_WORD, pws->w[3], pwt->w[3]);
1876 void helper_msa_clt_u_d(CPUMIPSState *env,
1877 uint32_t wd, uint32_t ws, uint32_t wt)
1879 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1880 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1881 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1883 pwd->d[0] = msa_clt_u_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
1884 pwd->d[1] = msa_clt_u_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
1892 * +---------------+----------------------------------------------------------+
1893 * | DIV_S.B | Vector Signed Divide (byte) |
1894 * | DIV_S.H | Vector Signed Divide (halfword) |
1895 * | DIV_S.W | Vector Signed Divide (word) |
1896 * | DIV_S.D | Vector Signed Divide (doubleword) |
1897 * | DIV_U.B | Vector Unsigned Divide (byte) |
1898 * | DIV_U.H | Vector Unsigned Divide (halfword) |
1899 * | DIV_U.W | Vector Unsigned Divide (word) |
1900 * | DIV_U.D | Vector Unsigned Divide (doubleword) |
1901 * +---------------+----------------------------------------------------------+
1905 static inline int64_t msa_div_s_df(uint32_t df, int64_t arg1, int64_t arg2)
1907 if (arg1 == DF_MIN_INT(df) && arg2 == -1) {
1908 return DF_MIN_INT(df);
1910 return arg2 ? arg1 / arg2
1911 : arg1 >= 0 ? -1 : 1;
1914 void helper_msa_div_s_b(CPUMIPSState *env,
1915 uint32_t wd, uint32_t ws, uint32_t wt)
1917 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1918 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1919 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1921 pwd->b[0] = msa_div_s_df(DF_BYTE, pws->b[0], pwt->b[0]);
1922 pwd->b[1] = msa_div_s_df(DF_BYTE, pws->b[1], pwt->b[1]);
1923 pwd->b[2] = msa_div_s_df(DF_BYTE, pws->b[2], pwt->b[2]);
1924 pwd->b[3] = msa_div_s_df(DF_BYTE, pws->b[3], pwt->b[3]);
1925 pwd->b[4] = msa_div_s_df(DF_BYTE, pws->b[4], pwt->b[4]);
1926 pwd->b[5] = msa_div_s_df(DF_BYTE, pws->b[5], pwt->b[5]);
1927 pwd->b[6] = msa_div_s_df(DF_BYTE, pws->b[6], pwt->b[6]);
1928 pwd->b[7] = msa_div_s_df(DF_BYTE, pws->b[7], pwt->b[7]);
1929 pwd->b[8] = msa_div_s_df(DF_BYTE, pws->b[8], pwt->b[8]);
1930 pwd->b[9] = msa_div_s_df(DF_BYTE, pws->b[9], pwt->b[9]);
1931 pwd->b[10] = msa_div_s_df(DF_BYTE, pws->b[10], pwt->b[10]);
1932 pwd->b[11] = msa_div_s_df(DF_BYTE, pws->b[11], pwt->b[11]);
1933 pwd->b[12] = msa_div_s_df(DF_BYTE, pws->b[12], pwt->b[12]);
1934 pwd->b[13] = msa_div_s_df(DF_BYTE, pws->b[13], pwt->b[13]);
1935 pwd->b[14] = msa_div_s_df(DF_BYTE, pws->b[14], pwt->b[14]);
1936 pwd->b[15] = msa_div_s_df(DF_BYTE, pws->b[15], pwt->b[15]);
1939 void helper_msa_div_s_h(CPUMIPSState *env,
1940 uint32_t wd, uint32_t ws, uint32_t wt)
1942 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1943 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1944 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1946 pwd->h[0] = msa_div_s_df(DF_HALF, pws->h[0], pwt->h[0]);
1947 pwd->h[1] = msa_div_s_df(DF_HALF, pws->h[1], pwt->h[1]);
1948 pwd->h[2] = msa_div_s_df(DF_HALF, pws->h[2], pwt->h[2]);
1949 pwd->h[3] = msa_div_s_df(DF_HALF, pws->h[3], pwt->h[3]);
1950 pwd->h[4] = msa_div_s_df(DF_HALF, pws->h[4], pwt->h[4]);
1951 pwd->h[5] = msa_div_s_df(DF_HALF, pws->h[5], pwt->h[5]);
1952 pwd->h[6] = msa_div_s_df(DF_HALF, pws->h[6], pwt->h[6]);
1953 pwd->h[7] = msa_div_s_df(DF_HALF, pws->h[7], pwt->h[7]);
1956 void helper_msa_div_s_w(CPUMIPSState *env,
1957 uint32_t wd, uint32_t ws, uint32_t wt)
1959 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1960 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1961 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1963 pwd->w[0] = msa_div_s_df(DF_WORD, pws->w[0], pwt->w[0]);
1964 pwd->w[1] = msa_div_s_df(DF_WORD, pws->w[1], pwt->w[1]);
1965 pwd->w[2] = msa_div_s_df(DF_WORD, pws->w[2], pwt->w[2]);
1966 pwd->w[3] = msa_div_s_df(DF_WORD, pws->w[3], pwt->w[3]);
1969 void helper_msa_div_s_d(CPUMIPSState *env,
1970 uint32_t wd, uint32_t ws, uint32_t wt)
1972 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1973 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1974 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1976 pwd->d[0] = msa_div_s_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
1977 pwd->d[1] = msa_div_s_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
1980 static inline int64_t msa_div_u_df(uint32_t df, int64_t arg1, int64_t arg2)
1982 uint64_t u_arg1 = UNSIGNED(arg1, df);
1983 uint64_t u_arg2 = UNSIGNED(arg2, df);
1984 return arg2 ? u_arg1 / u_arg2 : -1;
1987 void helper_msa_div_u_b(CPUMIPSState *env,
1988 uint32_t wd, uint32_t ws, uint32_t wt)
1990 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
1991 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
1992 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
1994 pwd->b[0] = msa_div_u_df(DF_BYTE, pws->b[0], pwt->b[0]);
1995 pwd->b[1] = msa_div_u_df(DF_BYTE, pws->b[1], pwt->b[1]);
1996 pwd->b[2] = msa_div_u_df(DF_BYTE, pws->b[2], pwt->b[2]);
1997 pwd->b[3] = msa_div_u_df(DF_BYTE, pws->b[3], pwt->b[3]);
1998 pwd->b[4] = msa_div_u_df(DF_BYTE, pws->b[4], pwt->b[4]);
1999 pwd->b[5] = msa_div_u_df(DF_BYTE, pws->b[5], pwt->b[5]);
2000 pwd->b[6] = msa_div_u_df(DF_BYTE, pws->b[6], pwt->b[6]);
2001 pwd->b[7] = msa_div_u_df(DF_BYTE, pws->b[7], pwt->b[7]);
2002 pwd->b[8] = msa_div_u_df(DF_BYTE, pws->b[8], pwt->b[8]);
2003 pwd->b[9] = msa_div_u_df(DF_BYTE, pws->b[9], pwt->b[9]);
2004 pwd->b[10] = msa_div_u_df(DF_BYTE, pws->b[10], pwt->b[10]);
2005 pwd->b[11] = msa_div_u_df(DF_BYTE, pws->b[11], pwt->b[11]);
2006 pwd->b[12] = msa_div_u_df(DF_BYTE, pws->b[12], pwt->b[12]);
2007 pwd->b[13] = msa_div_u_df(DF_BYTE, pws->b[13], pwt->b[13]);
2008 pwd->b[14] = msa_div_u_df(DF_BYTE, pws->b[14], pwt->b[14]);
2009 pwd->b[15] = msa_div_u_df(DF_BYTE, pws->b[15], pwt->b[15]);
2012 void helper_msa_div_u_h(CPUMIPSState *env,
2013 uint32_t wd, uint32_t ws, uint32_t wt)
2015 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2016 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2017 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2019 pwd->h[0] = msa_div_u_df(DF_HALF, pws->h[0], pwt->h[0]);
2020 pwd->h[1] = msa_div_u_df(DF_HALF, pws->h[1], pwt->h[1]);
2021 pwd->h[2] = msa_div_u_df(DF_HALF, pws->h[2], pwt->h[2]);
2022 pwd->h[3] = msa_div_u_df(DF_HALF, pws->h[3], pwt->h[3]);
2023 pwd->h[4] = msa_div_u_df(DF_HALF, pws->h[4], pwt->h[4]);
2024 pwd->h[5] = msa_div_u_df(DF_HALF, pws->h[5], pwt->h[5]);
2025 pwd->h[6] = msa_div_u_df(DF_HALF, pws->h[6], pwt->h[6]);
2026 pwd->h[7] = msa_div_u_df(DF_HALF, pws->h[7], pwt->h[7]);
2029 void helper_msa_div_u_w(CPUMIPSState *env,
2030 uint32_t wd, uint32_t ws, uint32_t wt)
2032 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2033 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2034 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2036 pwd->w[0] = msa_div_u_df(DF_WORD, pws->w[0], pwt->w[0]);
2037 pwd->w[1] = msa_div_u_df(DF_WORD, pws->w[1], pwt->w[1]);
2038 pwd->w[2] = msa_div_u_df(DF_WORD, pws->w[2], pwt->w[2]);
2039 pwd->w[3] = msa_div_u_df(DF_WORD, pws->w[3], pwt->w[3]);
2042 void helper_msa_div_u_d(CPUMIPSState *env,
2043 uint32_t wd, uint32_t ws, uint32_t wt)
2045 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2046 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2047 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2049 pwd->d[0] = msa_div_u_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
2050 pwd->d[1] = msa_div_u_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
2058 * +---------------+----------------------------------------------------------+
2059 * | DOTP_S.H | Vector Signed Dot Product (halfword) |
2060 * | DOTP_S.W | Vector Signed Dot Product (word) |
2061 * | DOTP_S.D | Vector Signed Dot Product (doubleword) |
2062 * | DOTP_U.H | Vector Unsigned Dot Product (halfword) |
2063 * | DOTP_U.W | Vector Unsigned Dot Product (word) |
2064 * | DOTP_U.D | Vector Unsigned Dot Product (doubleword) |
2065 * | DPADD_S.H | Vector Signed Dot Product (halfword) |
2066 * | DPADD_S.W | Vector Signed Dot Product (word) |
2067 * | DPADD_S.D | Vector Signed Dot Product (doubleword) |
2068 * | DPADD_U.H | Vector Unsigned Dot Product (halfword) |
2069 * | DPADD_U.W | Vector Unsigned Dot Product (word) |
2070 * | DPADD_U.D | Vector Unsigned Dot Product (doubleword) |
2071 * | DPSUB_S.H | Vector Signed Dot Product (halfword) |
2072 * | DPSUB_S.W | Vector Signed Dot Product (word) |
2073 * | DPSUB_S.D | Vector Signed Dot Product (doubleword) |
2074 * | DPSUB_U.H | Vector Unsigned Dot Product (halfword) |
2075 * | DPSUB_U.W | Vector Unsigned Dot Product (word) |
2076 * | DPSUB_U.D | Vector Unsigned Dot Product (doubleword) |
2077 * +---------------+----------------------------------------------------------+
2080 /* TODO: insert Int Dot Product group helpers here */
2087 * +---------------+----------------------------------------------------------+
2088 * | MAX_A.B | Vector Maximum Based on Absolute Value (byte) |
2089 * | MAX_A.H | Vector Maximum Based on Absolute Value (halfword) |
2090 * | MAX_A.W | Vector Maximum Based on Absolute Value (word) |
2091 * | MAX_A.D | Vector Maximum Based on Absolute Value (doubleword) |
2092 * | MAX_S.B | Vector Signed Maximum (byte) |
2093 * | MAX_S.H | Vector Signed Maximum (halfword) |
2094 * | MAX_S.W | Vector Signed Maximum (word) |
2095 * | MAX_S.D | Vector Signed Maximum (doubleword) |
2096 * | MAX_U.B | Vector Unsigned Maximum (byte) |
2097 * | MAX_U.H | Vector Unsigned Maximum (halfword) |
2098 * | MAX_U.W | Vector Unsigned Maximum (word) |
2099 * | MAX_U.D | Vector Unsigned Maximum (doubleword) |
2100 * | MIN_A.B | Vector Minimum Based on Absolute Value (byte) |
2101 * | MIN_A.H | Vector Minimum Based on Absolute Value (halfword) |
2102 * | MIN_A.W | Vector Minimum Based on Absolute Value (word) |
2103 * | MIN_A.D | Vector Minimum Based on Absolute Value (doubleword) |
2104 * | MIN_S.B | Vector Signed Minimum (byte) |
2105 * | MIN_S.H | Vector Signed Minimum (halfword) |
2106 * | MIN_S.W | Vector Signed Minimum (word) |
2107 * | MIN_S.D | Vector Signed Minimum (doubleword) |
2108 * | MIN_U.B | Vector Unsigned Minimum (byte) |
2109 * | MIN_U.H | Vector Unsigned Minimum (halfword) |
2110 * | MIN_U.W | Vector Unsigned Minimum (word) |
2111 * | MIN_U.D | Vector Unsigned Minimum (doubleword) |
2112 * +---------------+----------------------------------------------------------+
2115 static inline int64_t msa_max_a_df(uint32_t df, int64_t arg1, int64_t arg2)
2117 uint64_t abs_arg1 = arg1 >= 0 ? arg1 : -arg1;
2118 uint64_t abs_arg2 = arg2 >= 0 ? arg2 : -arg2;
2119 return abs_arg1 > abs_arg2 ? arg1 : arg2;
2122 void helper_msa_max_a_b(CPUMIPSState *env,
2123 uint32_t wd, uint32_t ws, uint32_t wt)
2125 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2126 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2127 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2129 pwd->b[0] = msa_max_a_df(DF_BYTE, pws->b[0], pwt->b[0]);
2130 pwd->b[1] = msa_max_a_df(DF_BYTE, pws->b[1], pwt->b[1]);
2131 pwd->b[2] = msa_max_a_df(DF_BYTE, pws->b[2], pwt->b[2]);
2132 pwd->b[3] = msa_max_a_df(DF_BYTE, pws->b[3], pwt->b[3]);
2133 pwd->b[4] = msa_max_a_df(DF_BYTE, pws->b[4], pwt->b[4]);
2134 pwd->b[5] = msa_max_a_df(DF_BYTE, pws->b[5], pwt->b[5]);
2135 pwd->b[6] = msa_max_a_df(DF_BYTE, pws->b[6], pwt->b[6]);
2136 pwd->b[7] = msa_max_a_df(DF_BYTE, pws->b[7], pwt->b[7]);
2137 pwd->b[8] = msa_max_a_df(DF_BYTE, pws->b[8], pwt->b[8]);
2138 pwd->b[9] = msa_max_a_df(DF_BYTE, pws->b[9], pwt->b[9]);
2139 pwd->b[10] = msa_max_a_df(DF_BYTE, pws->b[10], pwt->b[10]);
2140 pwd->b[11] = msa_max_a_df(DF_BYTE, pws->b[11], pwt->b[11]);
2141 pwd->b[12] = msa_max_a_df(DF_BYTE, pws->b[12], pwt->b[12]);
2142 pwd->b[13] = msa_max_a_df(DF_BYTE, pws->b[13], pwt->b[13]);
2143 pwd->b[14] = msa_max_a_df(DF_BYTE, pws->b[14], pwt->b[14]);
2144 pwd->b[15] = msa_max_a_df(DF_BYTE, pws->b[15], pwt->b[15]);
2147 void helper_msa_max_a_h(CPUMIPSState *env,
2148 uint32_t wd, uint32_t ws, uint32_t wt)
2150 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2151 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2152 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2154 pwd->h[0] = msa_max_a_df(DF_HALF, pws->h[0], pwt->h[0]);
2155 pwd->h[1] = msa_max_a_df(DF_HALF, pws->h[1], pwt->h[1]);
2156 pwd->h[2] = msa_max_a_df(DF_HALF, pws->h[2], pwt->h[2]);
2157 pwd->h[3] = msa_max_a_df(DF_HALF, pws->h[3], pwt->h[3]);
2158 pwd->h[4] = msa_max_a_df(DF_HALF, pws->h[4], pwt->h[4]);
2159 pwd->h[5] = msa_max_a_df(DF_HALF, pws->h[5], pwt->h[5]);
2160 pwd->h[6] = msa_max_a_df(DF_HALF, pws->h[6], pwt->h[6]);
2161 pwd->h[7] = msa_max_a_df(DF_HALF, pws->h[7], pwt->h[7]);
2164 void helper_msa_max_a_w(CPUMIPSState *env,
2165 uint32_t wd, uint32_t ws, uint32_t wt)
2167 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2168 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2169 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2171 pwd->w[0] = msa_max_a_df(DF_WORD, pws->w[0], pwt->w[0]);
2172 pwd->w[1] = msa_max_a_df(DF_WORD, pws->w[1], pwt->w[1]);
2173 pwd->w[2] = msa_max_a_df(DF_WORD, pws->w[2], pwt->w[2]);
2174 pwd->w[3] = msa_max_a_df(DF_WORD, pws->w[3], pwt->w[3]);
2177 void helper_msa_max_a_d(CPUMIPSState *env,
2178 uint32_t wd, uint32_t ws, uint32_t wt)
2180 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2181 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2182 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2184 pwd->d[0] = msa_max_a_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
2185 pwd->d[1] = msa_max_a_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
2189 static inline int64_t msa_max_s_df(uint32_t df, int64_t arg1, int64_t arg2)
2191 return arg1 > arg2 ? arg1 : arg2;
2194 void helper_msa_max_s_b(CPUMIPSState *env,
2195 uint32_t wd, uint32_t ws, uint32_t wt)
2197 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2198 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2199 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2201 pwd->b[0] = msa_max_s_df(DF_BYTE, pws->b[0], pwt->b[0]);
2202 pwd->b[1] = msa_max_s_df(DF_BYTE, pws->b[1], pwt->b[1]);
2203 pwd->b[2] = msa_max_s_df(DF_BYTE, pws->b[2], pwt->b[2]);
2204 pwd->b[3] = msa_max_s_df(DF_BYTE, pws->b[3], pwt->b[3]);
2205 pwd->b[4] = msa_max_s_df(DF_BYTE, pws->b[4], pwt->b[4]);
2206 pwd->b[5] = msa_max_s_df(DF_BYTE, pws->b[5], pwt->b[5]);
2207 pwd->b[6] = msa_max_s_df(DF_BYTE, pws->b[6], pwt->b[6]);
2208 pwd->b[7] = msa_max_s_df(DF_BYTE, pws->b[7], pwt->b[7]);
2209 pwd->b[8] = msa_max_s_df(DF_BYTE, pws->b[8], pwt->b[8]);
2210 pwd->b[9] = msa_max_s_df(DF_BYTE, pws->b[9], pwt->b[9]);
2211 pwd->b[10] = msa_max_s_df(DF_BYTE, pws->b[10], pwt->b[10]);
2212 pwd->b[11] = msa_max_s_df(DF_BYTE, pws->b[11], pwt->b[11]);
2213 pwd->b[12] = msa_max_s_df(DF_BYTE, pws->b[12], pwt->b[12]);
2214 pwd->b[13] = msa_max_s_df(DF_BYTE, pws->b[13], pwt->b[13]);
2215 pwd->b[14] = msa_max_s_df(DF_BYTE, pws->b[14], pwt->b[14]);
2216 pwd->b[15] = msa_max_s_df(DF_BYTE, pws->b[15], pwt->b[15]);
2219 void helper_msa_max_s_h(CPUMIPSState *env,
2220 uint32_t wd, uint32_t ws, uint32_t wt)
2222 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2223 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2224 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2226 pwd->h[0] = msa_max_s_df(DF_HALF, pws->h[0], pwt->h[0]);
2227 pwd->h[1] = msa_max_s_df(DF_HALF, pws->h[1], pwt->h[1]);
2228 pwd->h[2] = msa_max_s_df(DF_HALF, pws->h[2], pwt->h[2]);
2229 pwd->h[3] = msa_max_s_df(DF_HALF, pws->h[3], pwt->h[3]);
2230 pwd->h[4] = msa_max_s_df(DF_HALF, pws->h[4], pwt->h[4]);
2231 pwd->h[5] = msa_max_s_df(DF_HALF, pws->h[5], pwt->h[5]);
2232 pwd->h[6] = msa_max_s_df(DF_HALF, pws->h[6], pwt->h[6]);
2233 pwd->h[7] = msa_max_s_df(DF_HALF, pws->h[7], pwt->h[7]);
2236 void helper_msa_max_s_w(CPUMIPSState *env,
2237 uint32_t wd, uint32_t ws, uint32_t wt)
2239 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2240 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2241 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2243 pwd->w[0] = msa_max_s_df(DF_WORD, pws->w[0], pwt->w[0]);
2244 pwd->w[1] = msa_max_s_df(DF_WORD, pws->w[1], pwt->w[1]);
2245 pwd->w[2] = msa_max_s_df(DF_WORD, pws->w[2], pwt->w[2]);
2246 pwd->w[3] = msa_max_s_df(DF_WORD, pws->w[3], pwt->w[3]);
2249 void helper_msa_max_s_d(CPUMIPSState *env,
2250 uint32_t wd, uint32_t ws, uint32_t wt)
2252 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2253 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2254 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2256 pwd->d[0] = msa_max_s_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
2257 pwd->d[1] = msa_max_s_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
2261 static inline int64_t msa_max_u_df(uint32_t df, int64_t arg1, int64_t arg2)
2263 uint64_t u_arg1 = UNSIGNED(arg1, df);
2264 uint64_t u_arg2 = UNSIGNED(arg2, df);
2265 return u_arg1 > u_arg2 ? arg1 : arg2;
2268 void helper_msa_max_u_b(CPUMIPSState *env,
2269 uint32_t wd, uint32_t ws, uint32_t wt)
2271 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2272 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2273 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2275 pwd->b[0] = msa_max_u_df(DF_BYTE, pws->b[0], pwt->b[0]);
2276 pwd->b[1] = msa_max_u_df(DF_BYTE, pws->b[1], pwt->b[1]);
2277 pwd->b[2] = msa_max_u_df(DF_BYTE, pws->b[2], pwt->b[2]);
2278 pwd->b[3] = msa_max_u_df(DF_BYTE, pws->b[3], pwt->b[3]);
2279 pwd->b[4] = msa_max_u_df(DF_BYTE, pws->b[4], pwt->b[4]);
2280 pwd->b[5] = msa_max_u_df(DF_BYTE, pws->b[5], pwt->b[5]);
2281 pwd->b[6] = msa_max_u_df(DF_BYTE, pws->b[6], pwt->b[6]);
2282 pwd->b[7] = msa_max_u_df(DF_BYTE, pws->b[7], pwt->b[7]);
2283 pwd->b[8] = msa_max_u_df(DF_BYTE, pws->b[8], pwt->b[8]);
2284 pwd->b[9] = msa_max_u_df(DF_BYTE, pws->b[9], pwt->b[9]);
2285 pwd->b[10] = msa_max_u_df(DF_BYTE, pws->b[10], pwt->b[10]);
2286 pwd->b[11] = msa_max_u_df(DF_BYTE, pws->b[11], pwt->b[11]);
2287 pwd->b[12] = msa_max_u_df(DF_BYTE, pws->b[12], pwt->b[12]);
2288 pwd->b[13] = msa_max_u_df(DF_BYTE, pws->b[13], pwt->b[13]);
2289 pwd->b[14] = msa_max_u_df(DF_BYTE, pws->b[14], pwt->b[14]);
2290 pwd->b[15] = msa_max_u_df(DF_BYTE, pws->b[15], pwt->b[15]);
2293 void helper_msa_max_u_h(CPUMIPSState *env,
2294 uint32_t wd, uint32_t ws, uint32_t wt)
2296 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2297 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2298 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2300 pwd->h[0] = msa_max_u_df(DF_HALF, pws->h[0], pwt->h[0]);
2301 pwd->h[1] = msa_max_u_df(DF_HALF, pws->h[1], pwt->h[1]);
2302 pwd->h[2] = msa_max_u_df(DF_HALF, pws->h[2], pwt->h[2]);
2303 pwd->h[3] = msa_max_u_df(DF_HALF, pws->h[3], pwt->h[3]);
2304 pwd->h[4] = msa_max_u_df(DF_HALF, pws->h[4], pwt->h[4]);
2305 pwd->h[5] = msa_max_u_df(DF_HALF, pws->h[5], pwt->h[5]);
2306 pwd->h[6] = msa_max_u_df(DF_HALF, pws->h[6], pwt->h[6]);
2307 pwd->h[7] = msa_max_u_df(DF_HALF, pws->h[7], pwt->h[7]);
2310 void helper_msa_max_u_w(CPUMIPSState *env,
2311 uint32_t wd, uint32_t ws, uint32_t wt)
2313 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2314 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2315 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2317 pwd->w[0] = msa_max_u_df(DF_WORD, pws->w[0], pwt->w[0]);
2318 pwd->w[1] = msa_max_u_df(DF_WORD, pws->w[1], pwt->w[1]);
2319 pwd->w[2] = msa_max_u_df(DF_WORD, pws->w[2], pwt->w[2]);
2320 pwd->w[3] = msa_max_u_df(DF_WORD, pws->w[3], pwt->w[3]);
2323 void helper_msa_max_u_d(CPUMIPSState *env,
2324 uint32_t wd, uint32_t ws, uint32_t wt)
2326 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2327 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2328 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2330 pwd->d[0] = msa_max_u_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
2331 pwd->d[1] = msa_max_u_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
2335 static inline int64_t msa_min_a_df(uint32_t df, int64_t arg1, int64_t arg2)
2337 uint64_t abs_arg1 = arg1 >= 0 ? arg1 : -arg1;
2338 uint64_t abs_arg2 = arg2 >= 0 ? arg2 : -arg2;
2339 return abs_arg1 < abs_arg2 ? arg1 : arg2;
2342 void helper_msa_min_a_b(CPUMIPSState *env,
2343 uint32_t wd, uint32_t ws, uint32_t wt)
2345 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2346 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2347 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2349 pwd->b[0] = msa_min_a_df(DF_BYTE, pws->b[0], pwt->b[0]);
2350 pwd->b[1] = msa_min_a_df(DF_BYTE, pws->b[1], pwt->b[1]);
2351 pwd->b[2] = msa_min_a_df(DF_BYTE, pws->b[2], pwt->b[2]);
2352 pwd->b[3] = msa_min_a_df(DF_BYTE, pws->b[3], pwt->b[3]);
2353 pwd->b[4] = msa_min_a_df(DF_BYTE, pws->b[4], pwt->b[4]);
2354 pwd->b[5] = msa_min_a_df(DF_BYTE, pws->b[5], pwt->b[5]);
2355 pwd->b[6] = msa_min_a_df(DF_BYTE, pws->b[6], pwt->b[6]);
2356 pwd->b[7] = msa_min_a_df(DF_BYTE, pws->b[7], pwt->b[7]);
2357 pwd->b[8] = msa_min_a_df(DF_BYTE, pws->b[8], pwt->b[8]);
2358 pwd->b[9] = msa_min_a_df(DF_BYTE, pws->b[9], pwt->b[9]);
2359 pwd->b[10] = msa_min_a_df(DF_BYTE, pws->b[10], pwt->b[10]);
2360 pwd->b[11] = msa_min_a_df(DF_BYTE, pws->b[11], pwt->b[11]);
2361 pwd->b[12] = msa_min_a_df(DF_BYTE, pws->b[12], pwt->b[12]);
2362 pwd->b[13] = msa_min_a_df(DF_BYTE, pws->b[13], pwt->b[13]);
2363 pwd->b[14] = msa_min_a_df(DF_BYTE, pws->b[14], pwt->b[14]);
2364 pwd->b[15] = msa_min_a_df(DF_BYTE, pws->b[15], pwt->b[15]);
2367 void helper_msa_min_a_h(CPUMIPSState *env,
2368 uint32_t wd, uint32_t ws, uint32_t wt)
2370 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2371 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2372 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2374 pwd->h[0] = msa_min_a_df(DF_HALF, pws->h[0], pwt->h[0]);
2375 pwd->h[1] = msa_min_a_df(DF_HALF, pws->h[1], pwt->h[1]);
2376 pwd->h[2] = msa_min_a_df(DF_HALF, pws->h[2], pwt->h[2]);
2377 pwd->h[3] = msa_min_a_df(DF_HALF, pws->h[3], pwt->h[3]);
2378 pwd->h[4] = msa_min_a_df(DF_HALF, pws->h[4], pwt->h[4]);
2379 pwd->h[5] = msa_min_a_df(DF_HALF, pws->h[5], pwt->h[5]);
2380 pwd->h[6] = msa_min_a_df(DF_HALF, pws->h[6], pwt->h[6]);
2381 pwd->h[7] = msa_min_a_df(DF_HALF, pws->h[7], pwt->h[7]);
2384 void helper_msa_min_a_w(CPUMIPSState *env,
2385 uint32_t wd, uint32_t ws, uint32_t wt)
2387 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2388 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2389 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2391 pwd->w[0] = msa_min_a_df(DF_WORD, pws->w[0], pwt->w[0]);
2392 pwd->w[1] = msa_min_a_df(DF_WORD, pws->w[1], pwt->w[1]);
2393 pwd->w[2] = msa_min_a_df(DF_WORD, pws->w[2], pwt->w[2]);
2394 pwd->w[3] = msa_min_a_df(DF_WORD, pws->w[3], pwt->w[3]);
2397 void helper_msa_min_a_d(CPUMIPSState *env,
2398 uint32_t wd, uint32_t ws, uint32_t wt)
2400 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2401 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2402 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2404 pwd->d[0] = msa_min_a_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
2405 pwd->d[1] = msa_min_a_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
2409 static inline int64_t msa_min_s_df(uint32_t df, int64_t arg1, int64_t arg2)
2411 return arg1 < arg2 ? arg1 : arg2;
2414 void helper_msa_min_s_b(CPUMIPSState *env,
2415 uint32_t wd, uint32_t ws, uint32_t wt)
2417 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2418 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2419 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2421 pwd->b[0] = msa_min_s_df(DF_BYTE, pws->b[0], pwt->b[0]);
2422 pwd->b[1] = msa_min_s_df(DF_BYTE, pws->b[1], pwt->b[1]);
2423 pwd->b[2] = msa_min_s_df(DF_BYTE, pws->b[2], pwt->b[2]);
2424 pwd->b[3] = msa_min_s_df(DF_BYTE, pws->b[3], pwt->b[3]);
2425 pwd->b[4] = msa_min_s_df(DF_BYTE, pws->b[4], pwt->b[4]);
2426 pwd->b[5] = msa_min_s_df(DF_BYTE, pws->b[5], pwt->b[5]);
2427 pwd->b[6] = msa_min_s_df(DF_BYTE, pws->b[6], pwt->b[6]);
2428 pwd->b[7] = msa_min_s_df(DF_BYTE, pws->b[7], pwt->b[7]);
2429 pwd->b[8] = msa_min_s_df(DF_BYTE, pws->b[8], pwt->b[8]);
2430 pwd->b[9] = msa_min_s_df(DF_BYTE, pws->b[9], pwt->b[9]);
2431 pwd->b[10] = msa_min_s_df(DF_BYTE, pws->b[10], pwt->b[10]);
2432 pwd->b[11] = msa_min_s_df(DF_BYTE, pws->b[11], pwt->b[11]);
2433 pwd->b[12] = msa_min_s_df(DF_BYTE, pws->b[12], pwt->b[12]);
2434 pwd->b[13] = msa_min_s_df(DF_BYTE, pws->b[13], pwt->b[13]);
2435 pwd->b[14] = msa_min_s_df(DF_BYTE, pws->b[14], pwt->b[14]);
2436 pwd->b[15] = msa_min_s_df(DF_BYTE, pws->b[15], pwt->b[15]);
2439 void helper_msa_min_s_h(CPUMIPSState *env,
2440 uint32_t wd, uint32_t ws, uint32_t wt)
2442 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2443 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2444 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2446 pwd->h[0] = msa_min_s_df(DF_HALF, pws->h[0], pwt->h[0]);
2447 pwd->h[1] = msa_min_s_df(DF_HALF, pws->h[1], pwt->h[1]);
2448 pwd->h[2] = msa_min_s_df(DF_HALF, pws->h[2], pwt->h[2]);
2449 pwd->h[3] = msa_min_s_df(DF_HALF, pws->h[3], pwt->h[3]);
2450 pwd->h[4] = msa_min_s_df(DF_HALF, pws->h[4], pwt->h[4]);
2451 pwd->h[5] = msa_min_s_df(DF_HALF, pws->h[5], pwt->h[5]);
2452 pwd->h[6] = msa_min_s_df(DF_HALF, pws->h[6], pwt->h[6]);
2453 pwd->h[7] = msa_min_s_df(DF_HALF, pws->h[7], pwt->h[7]);
2456 void helper_msa_min_s_w(CPUMIPSState *env,
2457 uint32_t wd, uint32_t ws, uint32_t wt)
2459 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2460 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2461 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2463 pwd->w[0] = msa_min_s_df(DF_WORD, pws->w[0], pwt->w[0]);
2464 pwd->w[1] = msa_min_s_df(DF_WORD, pws->w[1], pwt->w[1]);
2465 pwd->w[2] = msa_min_s_df(DF_WORD, pws->w[2], pwt->w[2]);
2466 pwd->w[3] = msa_min_s_df(DF_WORD, pws->w[3], pwt->w[3]);
2469 void helper_msa_min_s_d(CPUMIPSState *env,
2470 uint32_t wd, uint32_t ws, uint32_t wt)
2472 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2473 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2474 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2476 pwd->d[0] = msa_min_s_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
2477 pwd->d[1] = msa_min_s_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
2481 static inline int64_t msa_min_u_df(uint32_t df, int64_t arg1, int64_t arg2)
2483 uint64_t u_arg1 = UNSIGNED(arg1, df);
2484 uint64_t u_arg2 = UNSIGNED(arg2, df);
2485 return u_arg1 < u_arg2 ? arg1 : arg2;
2488 void helper_msa_min_u_b(CPUMIPSState *env,
2489 uint32_t wd, uint32_t ws, uint32_t wt)
2491 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2492 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2493 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2495 pwd->b[0] = msa_min_u_df(DF_BYTE, pws->b[0], pwt->b[0]);
2496 pwd->b[1] = msa_min_u_df(DF_BYTE, pws->b[1], pwt->b[1]);
2497 pwd->b[2] = msa_min_u_df(DF_BYTE, pws->b[2], pwt->b[2]);
2498 pwd->b[3] = msa_min_u_df(DF_BYTE, pws->b[3], pwt->b[3]);
2499 pwd->b[4] = msa_min_u_df(DF_BYTE, pws->b[4], pwt->b[4]);
2500 pwd->b[5] = msa_min_u_df(DF_BYTE, pws->b[5], pwt->b[5]);
2501 pwd->b[6] = msa_min_u_df(DF_BYTE, pws->b[6], pwt->b[6]);
2502 pwd->b[7] = msa_min_u_df(DF_BYTE, pws->b[7], pwt->b[7]);
2503 pwd->b[8] = msa_min_u_df(DF_BYTE, pws->b[8], pwt->b[8]);
2504 pwd->b[9] = msa_min_u_df(DF_BYTE, pws->b[9], pwt->b[9]);
2505 pwd->b[10] = msa_min_u_df(DF_BYTE, pws->b[10], pwt->b[10]);
2506 pwd->b[11] = msa_min_u_df(DF_BYTE, pws->b[11], pwt->b[11]);
2507 pwd->b[12] = msa_min_u_df(DF_BYTE, pws->b[12], pwt->b[12]);
2508 pwd->b[13] = msa_min_u_df(DF_BYTE, pws->b[13], pwt->b[13]);
2509 pwd->b[14] = msa_min_u_df(DF_BYTE, pws->b[14], pwt->b[14]);
2510 pwd->b[15] = msa_min_u_df(DF_BYTE, pws->b[15], pwt->b[15]);
2513 void helper_msa_min_u_h(CPUMIPSState *env,
2514 uint32_t wd, uint32_t ws, uint32_t wt)
2516 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2517 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2518 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2520 pwd->h[0] = msa_min_u_df(DF_HALF, pws->h[0], pwt->h[0]);
2521 pwd->h[1] = msa_min_u_df(DF_HALF, pws->h[1], pwt->h[1]);
2522 pwd->h[2] = msa_min_u_df(DF_HALF, pws->h[2], pwt->h[2]);
2523 pwd->h[3] = msa_min_u_df(DF_HALF, pws->h[3], pwt->h[3]);
2524 pwd->h[4] = msa_min_u_df(DF_HALF, pws->h[4], pwt->h[4]);
2525 pwd->h[5] = msa_min_u_df(DF_HALF, pws->h[5], pwt->h[5]);
2526 pwd->h[6] = msa_min_u_df(DF_HALF, pws->h[6], pwt->h[6]);
2527 pwd->h[7] = msa_min_u_df(DF_HALF, pws->h[7], pwt->h[7]);
2530 void helper_msa_min_u_w(CPUMIPSState *env,
2531 uint32_t wd, uint32_t ws, uint32_t wt)
2533 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2534 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2535 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2537 pwd->w[0] = msa_min_u_df(DF_WORD, pws->w[0], pwt->w[0]);
2538 pwd->w[1] = msa_min_u_df(DF_WORD, pws->w[1], pwt->w[1]);
2539 pwd->w[2] = msa_min_u_df(DF_WORD, pws->w[2], pwt->w[2]);
2540 pwd->w[3] = msa_min_u_df(DF_WORD, pws->w[3], pwt->w[3]);
2543 void helper_msa_min_u_d(CPUMIPSState *env,
2544 uint32_t wd, uint32_t ws, uint32_t wt)
2546 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2547 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2548 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2550 pwd->d[0] = msa_min_u_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
2551 pwd->d[1] = msa_min_u_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
2559 * +---------------+----------------------------------------------------------+
2560 * | MOD_S.B | Vector Signed Modulo (byte) |
2561 * | MOD_S.H | Vector Signed Modulo (halfword) |
2562 * | MOD_S.W | Vector Signed Modulo (word) |
2563 * | MOD_S.D | Vector Signed Modulo (doubleword) |
2564 * | MOD_U.B | Vector Unsigned Modulo (byte) |
2565 * | MOD_U.H | Vector Unsigned Modulo (halfword) |
2566 * | MOD_U.W | Vector Unsigned Modulo (word) |
2567 * | MOD_U.D | Vector Unsigned Modulo (doubleword) |
2568 * +---------------+----------------------------------------------------------+
2571 static inline int64_t msa_mod_s_df(uint32_t df, int64_t arg1, int64_t arg2)
2573 if (arg1 == DF_MIN_INT(df) && arg2 == -1) {
2576 return arg2 ? arg1 % arg2 : arg1;
2579 void helper_msa_mod_s_b(CPUMIPSState *env,
2580 uint32_t wd, uint32_t ws, uint32_t wt)
2582 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2583 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2584 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2586 pwd->b[0] = msa_mod_s_df(DF_BYTE, pws->b[0], pwt->b[0]);
2587 pwd->b[1] = msa_mod_s_df(DF_BYTE, pws->b[1], pwt->b[1]);
2588 pwd->b[2] = msa_mod_s_df(DF_BYTE, pws->b[2], pwt->b[2]);
2589 pwd->b[3] = msa_mod_s_df(DF_BYTE, pws->b[3], pwt->b[3]);
2590 pwd->b[4] = msa_mod_s_df(DF_BYTE, pws->b[4], pwt->b[4]);
2591 pwd->b[5] = msa_mod_s_df(DF_BYTE, pws->b[5], pwt->b[5]);
2592 pwd->b[6] = msa_mod_s_df(DF_BYTE, pws->b[6], pwt->b[6]);
2593 pwd->b[7] = msa_mod_s_df(DF_BYTE, pws->b[7], pwt->b[7]);
2594 pwd->b[8] = msa_mod_s_df(DF_BYTE, pws->b[8], pwt->b[8]);
2595 pwd->b[9] = msa_mod_s_df(DF_BYTE, pws->b[9], pwt->b[9]);
2596 pwd->b[10] = msa_mod_s_df(DF_BYTE, pws->b[10], pwt->b[10]);
2597 pwd->b[11] = msa_mod_s_df(DF_BYTE, pws->b[11], pwt->b[11]);
2598 pwd->b[12] = msa_mod_s_df(DF_BYTE, pws->b[12], pwt->b[12]);
2599 pwd->b[13] = msa_mod_s_df(DF_BYTE, pws->b[13], pwt->b[13]);
2600 pwd->b[14] = msa_mod_s_df(DF_BYTE, pws->b[14], pwt->b[14]);
2601 pwd->b[15] = msa_mod_s_df(DF_BYTE, pws->b[15], pwt->b[15]);
2604 void helper_msa_mod_s_h(CPUMIPSState *env,
2605 uint32_t wd, uint32_t ws, uint32_t wt)
2607 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2608 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2609 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2611 pwd->h[0] = msa_mod_s_df(DF_HALF, pws->h[0], pwt->h[0]);
2612 pwd->h[1] = msa_mod_s_df(DF_HALF, pws->h[1], pwt->h[1]);
2613 pwd->h[2] = msa_mod_s_df(DF_HALF, pws->h[2], pwt->h[2]);
2614 pwd->h[3] = msa_mod_s_df(DF_HALF, pws->h[3], pwt->h[3]);
2615 pwd->h[4] = msa_mod_s_df(DF_HALF, pws->h[4], pwt->h[4]);
2616 pwd->h[5] = msa_mod_s_df(DF_HALF, pws->h[5], pwt->h[5]);
2617 pwd->h[6] = msa_mod_s_df(DF_HALF, pws->h[6], pwt->h[6]);
2618 pwd->h[7] = msa_mod_s_df(DF_HALF, pws->h[7], pwt->h[7]);
2621 void helper_msa_mod_s_w(CPUMIPSState *env,
2622 uint32_t wd, uint32_t ws, uint32_t wt)
2624 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2625 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2626 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2628 pwd->w[0] = msa_mod_s_df(DF_WORD, pws->w[0], pwt->w[0]);
2629 pwd->w[1] = msa_mod_s_df(DF_WORD, pws->w[1], pwt->w[1]);
2630 pwd->w[2] = msa_mod_s_df(DF_WORD, pws->w[2], pwt->w[2]);
2631 pwd->w[3] = msa_mod_s_df(DF_WORD, pws->w[3], pwt->w[3]);
2634 void helper_msa_mod_s_d(CPUMIPSState *env,
2635 uint32_t wd, uint32_t ws, uint32_t wt)
2637 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2638 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2639 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2641 pwd->d[0] = msa_mod_s_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
2642 pwd->d[1] = msa_mod_s_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
2645 static inline int64_t msa_mod_u_df(uint32_t df, int64_t arg1, int64_t arg2)
2647 uint64_t u_arg1 = UNSIGNED(arg1, df);
2648 uint64_t u_arg2 = UNSIGNED(arg2, df);
2649 return u_arg2 ? u_arg1 % u_arg2 : u_arg1;
2652 void helper_msa_mod_u_b(CPUMIPSState *env,
2653 uint32_t wd, uint32_t ws, uint32_t wt)
2655 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2656 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2657 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2659 pwd->b[0] = msa_mod_u_df(DF_BYTE, pws->b[0], pwt->b[0]);
2660 pwd->b[1] = msa_mod_u_df(DF_BYTE, pws->b[1], pwt->b[1]);
2661 pwd->b[2] = msa_mod_u_df(DF_BYTE, pws->b[2], pwt->b[2]);
2662 pwd->b[3] = msa_mod_u_df(DF_BYTE, pws->b[3], pwt->b[3]);
2663 pwd->b[4] = msa_mod_u_df(DF_BYTE, pws->b[4], pwt->b[4]);
2664 pwd->b[5] = msa_mod_u_df(DF_BYTE, pws->b[5], pwt->b[5]);
2665 pwd->b[6] = msa_mod_u_df(DF_BYTE, pws->b[6], pwt->b[6]);
2666 pwd->b[7] = msa_mod_u_df(DF_BYTE, pws->b[7], pwt->b[7]);
2667 pwd->b[8] = msa_mod_u_df(DF_BYTE, pws->b[8], pwt->b[8]);
2668 pwd->b[9] = msa_mod_u_df(DF_BYTE, pws->b[9], pwt->b[9]);
2669 pwd->b[10] = msa_mod_u_df(DF_BYTE, pws->b[10], pwt->b[10]);
2670 pwd->b[11] = msa_mod_u_df(DF_BYTE, pws->b[11], pwt->b[11]);
2671 pwd->b[12] = msa_mod_u_df(DF_BYTE, pws->b[12], pwt->b[12]);
2672 pwd->b[13] = msa_mod_u_df(DF_BYTE, pws->b[13], pwt->b[13]);
2673 pwd->b[14] = msa_mod_u_df(DF_BYTE, pws->b[14], pwt->b[14]);
2674 pwd->b[15] = msa_mod_u_df(DF_BYTE, pws->b[15], pwt->b[15]);
2677 void helper_msa_mod_u_h(CPUMIPSState *env,
2678 uint32_t wd, uint32_t ws, uint32_t wt)
2680 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2681 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2682 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2684 pwd->h[0] = msa_mod_u_df(DF_HALF, pws->h[0], pwt->h[0]);
2685 pwd->h[1] = msa_mod_u_df(DF_HALF, pws->h[1], pwt->h[1]);
2686 pwd->h[2] = msa_mod_u_df(DF_HALF, pws->h[2], pwt->h[2]);
2687 pwd->h[3] = msa_mod_u_df(DF_HALF, pws->h[3], pwt->h[3]);
2688 pwd->h[4] = msa_mod_u_df(DF_HALF, pws->h[4], pwt->h[4]);
2689 pwd->h[5] = msa_mod_u_df(DF_HALF, pws->h[5], pwt->h[5]);
2690 pwd->h[6] = msa_mod_u_df(DF_HALF, pws->h[6], pwt->h[6]);
2691 pwd->h[7] = msa_mod_u_df(DF_HALF, pws->h[7], pwt->h[7]);
2694 void helper_msa_mod_u_w(CPUMIPSState *env,
2695 uint32_t wd, uint32_t ws, uint32_t wt)
2697 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2698 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2699 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2701 pwd->w[0] = msa_mod_u_df(DF_WORD, pws->w[0], pwt->w[0]);
2702 pwd->w[1] = msa_mod_u_df(DF_WORD, pws->w[1], pwt->w[1]);
2703 pwd->w[2] = msa_mod_u_df(DF_WORD, pws->w[2], pwt->w[2]);
2704 pwd->w[3] = msa_mod_u_df(DF_WORD, pws->w[3], pwt->w[3]);
2707 void helper_msa_mod_u_d(CPUMIPSState *env,
2708 uint32_t wd, uint32_t ws, uint32_t wt)
2710 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2711 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2712 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2714 pwd->d[0] = msa_mod_u_df(DF_DOUBLE, pws->d[0], pwt->d[0]);
2715 pwd->d[1] = msa_mod_u_df(DF_DOUBLE, pws->d[1], pwt->d[1]);
2723 * +---------------+----------------------------------------------------------+
2724 * | MADDV.B | Vector Multiply and Add (byte) |
2725 * | MADDV.H | Vector Multiply and Add (halfword) |
2726 * | MADDV.W | Vector Multiply and Add (word) |
2727 * | MADDV.D | Vector Multiply and Add (doubleword) |
2728 * | MSUBV.B | Vector Multiply and Subtract (byte) |
2729 * | MSUBV.H | Vector Multiply and Subtract (halfword) |
2730 * | MSUBV.W | Vector Multiply and Subtract (word) |
2731 * | MSUBV.D | Vector Multiply and Subtract (doubleword) |
2732 * | MULV.B | Vector Multiply (byte) |
2733 * | MULV.H | Vector Multiply (halfword) |
2734 * | MULV.W | Vector Multiply (word) |
2735 * | MULV.D | Vector Multiply (doubleword) |
2736 * +---------------+----------------------------------------------------------+
2739 /* TODO: insert Int Multiply group helpers here */
2746 * +---------------+----------------------------------------------------------+
2747 * | ASUB_S.B | Vector Absolute Values of Signed Subtract (byte) |
2748 * | ASUB_S.H | Vector Absolute Values of Signed Subtract (halfword) |
2749 * | ASUB_S.W | Vector Absolute Values of Signed Subtract (word) |
2750 * | ASUB_S.D | Vector Absolute Values of Signed Subtract (doubleword) |
2751 * | ASUB_U.B | Vector Absolute Values of Unsigned Subtract (byte) |
2752 * | ASUB_U.H | Vector Absolute Values of Unsigned Subtract (halfword) |
2753 * | ASUB_U.W | Vector Absolute Values of Unsigned Subtract (word) |
2754 * | ASUB_U.D | Vector Absolute Values of Unsigned Subtract (doubleword) |
2755 * | HSUB_S.H | Vector Signed Horizontal Subtract (halfword) |
2756 * | HSUB_S.W | Vector Signed Horizontal Subtract (word) |
2757 * | HSUB_S.D | Vector Signed Horizontal Subtract (doubleword) |
2758 * | HSUB_U.H | Vector Unigned Horizontal Subtract (halfword) |
2759 * | HSUB_U.W | Vector Unigned Horizontal Subtract (word) |
2760 * | HSUB_U.D | Vector Unigned Horizontal Subtract (doubleword) |
2761 * | SUBS_S.B | Vector Signed Saturated Subtract (of Signed) (byte) |
2762 * | SUBS_S.H | Vector Signed Saturated Subtract (of Signed) (halfword) |
2763 * | SUBS_S.W | Vector Signed Saturated Subtract (of Signed) (word) |
2764 * | SUBS_S.D | Vector Signed Saturated Subtract (of Signed) (doubleword)|
2765 * | SUBS_U.B | Vector Unsigned Saturated Subtract (of Uns.) (byte) |
2766 * | SUBS_U.H | Vector Unsigned Saturated Subtract (of Uns.) (halfword) |
2767 * | SUBS_U.W | Vector Unsigned Saturated Subtract (of Uns.) (word) |
2768 * | SUBS_U.D | Vector Unsigned Saturated Subtract (of Uns.) (doubleword)|
2769 * | SUBSUS_U.B | Vector Uns. Sat. Subtract (of S. from Uns.) (byte) |
2770 * | SUBSUS_U.H | Vector Uns. Sat. Subtract (of S. from Uns.) (halfword) |
2771 * | SUBSUS_U.W | Vector Uns. Sat. Subtract (of S. from Uns.) (word) |
2772 * | SUBSUS_U.D | Vector Uns. Sat. Subtract (of S. from Uns.) (doubleword) |
2773 * | SUBSUU_S.B | Vector Signed Saturated Subtract (of Uns.) (byte) |
2774 * | SUBSUU_S.H | Vector Signed Saturated Subtract (of Uns.) (halfword) |
2775 * | SUBSUU_S.W | Vector Signed Saturated Subtract (of Uns.) (word) |
2776 * | SUBSUU_S.D | Vector Signed Saturated Subtract (of Uns.) (doubleword) |
2777 * | SUBV.B | Vector Subtract (byte) |
2778 * | SUBV.H | Vector Subtract (halfword) |
2779 * | SUBV.W | Vector Subtract (word) |
2780 * | SUBV.D | Vector Subtract (doubleword) |
2781 * +---------------+----------------------------------------------------------+
2784 /* TODO: insert Int Subtract group helpers here */
2791 * +---------------+----------------------------------------------------------+
2792 * | ILVEV.B | Vector Interleave Even (byte) |
2793 * | ILVEV.H | Vector Interleave Even (halfword) |
2794 * | ILVEV.W | Vector Interleave Even (word) |
2795 * | ILVEV.D | Vector Interleave Even (doubleword) |
2796 * | ILVOD.B | Vector Interleave Odd (byte) |
2797 * | ILVOD.H | Vector Interleave Odd (halfword) |
2798 * | ILVOD.W | Vector Interleave Odd (word) |
2799 * | ILVOD.D | Vector Interleave Odd (doubleword) |
2800 * | ILVL.B | Vector Interleave Left (byte) |
2801 * | ILVL.H | Vector Interleave Left (halfword) |
2802 * | ILVL.W | Vector Interleave Left (word) |
2803 * | ILVL.D | Vector Interleave Left (doubleword) |
2804 * | ILVR.B | Vector Interleave Right (byte) |
2805 * | ILVR.H | Vector Interleave Right (halfword) |
2806 * | ILVR.W | Vector Interleave Right (word) |
2807 * | ILVR.D | Vector Interleave Right (doubleword) |
2808 * +---------------+----------------------------------------------------------+
2812 void helper_msa_ilvev_b(CPUMIPSState *env,
2813 uint32_t wd, uint32_t ws, uint32_t wt)
2815 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2816 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2817 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2819 #if defined(HOST_WORDS_BIGENDIAN)
2820 pwd->b[8] = pws->b[9];
2821 pwd->b[9] = pwt->b[9];
2822 pwd->b[10] = pws->b[11];
2823 pwd->b[11] = pwt->b[11];
2824 pwd->b[12] = pws->b[13];
2825 pwd->b[13] = pwt->b[13];
2826 pwd->b[14] = pws->b[15];
2827 pwd->b[15] = pwt->b[15];
2828 pwd->b[0] = pws->b[1];
2829 pwd->b[1] = pwt->b[1];
2830 pwd->b[2] = pws->b[3];
2831 pwd->b[3] = pwt->b[3];
2832 pwd->b[4] = pws->b[5];
2833 pwd->b[5] = pwt->b[5];
2834 pwd->b[6] = pws->b[7];
2835 pwd->b[7] = pwt->b[7];
2837 pwd->b[15] = pws->b[14];
2838 pwd->b[14] = pwt->b[14];
2839 pwd->b[13] = pws->b[12];
2840 pwd->b[12] = pwt->b[12];
2841 pwd->b[11] = pws->b[10];
2842 pwd->b[10] = pwt->b[10];
2843 pwd->b[9] = pws->b[8];
2844 pwd->b[8] = pwt->b[8];
2845 pwd->b[7] = pws->b[6];
2846 pwd->b[6] = pwt->b[6];
2847 pwd->b[5] = pws->b[4];
2848 pwd->b[4] = pwt->b[4];
2849 pwd->b[3] = pws->b[2];
2850 pwd->b[2] = pwt->b[2];
2851 pwd->b[1] = pws->b[0];
2852 pwd->b[0] = pwt->b[0];
2856 void helper_msa_ilvev_h(CPUMIPSState *env,
2857 uint32_t wd, uint32_t ws, uint32_t wt)
2859 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2860 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2861 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2863 #if defined(HOST_WORDS_BIGENDIAN)
2864 pwd->h[4] = pws->h[5];
2865 pwd->h[5] = pwt->h[5];
2866 pwd->h[6] = pws->h[7];
2867 pwd->h[7] = pwt->h[7];
2868 pwd->h[0] = pws->h[1];
2869 pwd->h[1] = pwt->h[1];
2870 pwd->h[2] = pws->h[3];
2871 pwd->h[3] = pwt->h[3];
2873 pwd->h[7] = pws->h[6];
2874 pwd->h[6] = pwt->h[6];
2875 pwd->h[5] = pws->h[4];
2876 pwd->h[4] = pwt->h[4];
2877 pwd->h[3] = pws->h[2];
2878 pwd->h[2] = pwt->h[2];
2879 pwd->h[1] = pws->h[0];
2880 pwd->h[0] = pwt->h[0];
2884 void helper_msa_ilvev_w(CPUMIPSState *env,
2885 uint32_t wd, uint32_t ws, uint32_t wt)
2887 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2888 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2889 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2891 #if defined(HOST_WORDS_BIGENDIAN)
2892 pwd->w[2] = pws->w[3];
2893 pwd->w[3] = pwt->w[3];
2894 pwd->w[0] = pws->w[1];
2895 pwd->w[1] = pwt->w[1];
2897 pwd->w[3] = pws->w[2];
2898 pwd->w[2] = pwt->w[2];
2899 pwd->w[1] = pws->w[0];
2900 pwd->w[0] = pwt->w[0];
2904 void helper_msa_ilvev_d(CPUMIPSState *env,
2905 uint32_t wd, uint32_t ws, uint32_t wt)
2907 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2908 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2909 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2911 pwd->d[1] = pws->d[0];
2912 pwd->d[0] = pwt->d[0];
2916 void helper_msa_ilvod_b(CPUMIPSState *env,
2917 uint32_t wd, uint32_t ws, uint32_t wt)
2919 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2920 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2921 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2923 #if defined(HOST_WORDS_BIGENDIAN)
2924 pwd->b[7] = pwt->b[6];
2925 pwd->b[6] = pws->b[6];
2926 pwd->b[5] = pwt->b[4];
2927 pwd->b[4] = pws->b[4];
2928 pwd->b[3] = pwt->b[2];
2929 pwd->b[2] = pws->b[2];
2930 pwd->b[1] = pwt->b[0];
2931 pwd->b[0] = pws->b[0];
2932 pwd->b[15] = pwt->b[14];
2933 pwd->b[14] = pws->b[14];
2934 pwd->b[13] = pwt->b[12];
2935 pwd->b[12] = pws->b[12];
2936 pwd->b[11] = pwt->b[10];
2937 pwd->b[10] = pws->b[10];
2938 pwd->b[9] = pwt->b[8];
2939 pwd->b[8] = pws->b[8];
2941 pwd->b[0] = pwt->b[1];
2942 pwd->b[1] = pws->b[1];
2943 pwd->b[2] = pwt->b[3];
2944 pwd->b[3] = pws->b[3];
2945 pwd->b[4] = pwt->b[5];
2946 pwd->b[5] = pws->b[5];
2947 pwd->b[6] = pwt->b[7];
2948 pwd->b[7] = pws->b[7];
2949 pwd->b[8] = pwt->b[9];
2950 pwd->b[9] = pws->b[9];
2951 pwd->b[10] = pwt->b[11];
2952 pwd->b[11] = pws->b[11];
2953 pwd->b[12] = pwt->b[13];
2954 pwd->b[13] = pws->b[13];
2955 pwd->b[14] = pwt->b[15];
2956 pwd->b[15] = pws->b[15];
2960 void helper_msa_ilvod_h(CPUMIPSState *env,
2961 uint32_t wd, uint32_t ws, uint32_t wt)
2963 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2964 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2965 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2967 #if defined(HOST_WORDS_BIGENDIAN)
2968 pwd->h[3] = pwt->h[2];
2969 pwd->h[2] = pws->h[2];
2970 pwd->h[1] = pwt->h[0];
2971 pwd->h[0] = pws->h[0];
2972 pwd->h[7] = pwt->h[6];
2973 pwd->h[6] = pws->h[6];
2974 pwd->h[5] = pwt->h[4];
2975 pwd->h[4] = pws->h[4];
2977 pwd->h[0] = pwt->h[1];
2978 pwd->h[1] = pws->h[1];
2979 pwd->h[2] = pwt->h[3];
2980 pwd->h[3] = pws->h[3];
2981 pwd->h[4] = pwt->h[5];
2982 pwd->h[5] = pws->h[5];
2983 pwd->h[6] = pwt->h[7];
2984 pwd->h[7] = pws->h[7];
2988 void helper_msa_ilvod_w(CPUMIPSState *env,
2989 uint32_t wd, uint32_t ws, uint32_t wt)
2991 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
2992 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
2993 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
2995 #if defined(HOST_WORDS_BIGENDIAN)
2996 pwd->w[1] = pwt->w[0];
2997 pwd->w[0] = pws->w[0];
2998 pwd->w[3] = pwt->w[2];
2999 pwd->w[2] = pws->w[2];
3001 pwd->w[0] = pwt->w[1];
3002 pwd->w[1] = pws->w[1];
3003 pwd->w[2] = pwt->w[3];
3004 pwd->w[3] = pws->w[3];
3008 void helper_msa_ilvod_d(CPUMIPSState *env,
3009 uint32_t wd, uint32_t ws, uint32_t wt)
3011 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
3012 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
3013 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
3015 pwd->d[0] = pwt->d[1];
3016 pwd->d[1] = pws->d[1];
3020 void helper_msa_ilvl_b(CPUMIPSState *env,
3021 uint32_t wd, uint32_t ws, uint32_t wt)
3023 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
3024 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
3025 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
3027 #if defined(HOST_WORDS_BIGENDIAN)
3028 pwd->b[7] = pwt->b[15];
3029 pwd->b[6] = pws->b[15];
3030 pwd->b[5] = pwt->b[14];
3031 pwd->b[4] = pws->b[14];
3032 pwd->b[3] = pwt->b[13];
3033 pwd->b[2] = pws->b[13];
3034 pwd->b[1] = pwt->b[12];
3035 pwd->b[0] = pws->b[12];
3036 pwd->b[15] = pwt->b[11];
3037 pwd->b[14] = pws->b[11];
3038 pwd->b[13] = pwt->b[10];
3039 pwd->b[12] = pws->b[10];
3040 pwd->b[11] = pwt->b[9];
3041 pwd->b[10] = pws->b[9];
3042 pwd->b[9] = pwt->b[8];
3043 pwd->b[8] = pws->b[8];
3045 pwd->b[0] = pwt->b[8];
3046 pwd->b[1] = pws->b[8];
3047 pwd->b[2] = pwt->b[9];
3048 pwd->b[3] = pws->b[9];
3049 pwd->b[4] = pwt->b[10];
3050 pwd->b[5] = pws->b[10];
3051 pwd->b[6] = pwt->b[11];
3052 pwd->b[7] = pws->b[11];
3053 pwd->b[8] = pwt->b[12];
3054 pwd->b[9] = pws->b[12];
3055 pwd->b[10] = pwt->b[13];
3056 pwd->b[11] = pws->b[13];
3057 pwd->b[12] = pwt->b[14];
3058 pwd->b[13] = pws->b[14];
3059 pwd->b[14] = pwt->b[15];
3060 pwd->b[15] = pws->b[15];
3064 void helper_msa_ilvl_h(CPUMIPSState *env,
3065 uint32_t wd, uint32_t ws, uint32_t wt)
3067 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
3068 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
3069 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
3071 #if defined(HOST_WORDS_BIGENDIAN)
3072 pwd->h[3] = pwt->h[7];
3073 pwd->h[2] = pws->h[7];
3074 pwd->h[1] = pwt->h[6];
3075 pwd->h[0] = pws->h[6];
3076 pwd->h[7] = pwt->h[5];
3077 pwd->h[6] = pws->h[5];
3078 pwd->h[5] = pwt->h[4];
3079 pwd->h[4] = pws->h[4];
3081 pwd->h[0] = pwt->h[4];
3082 pwd->h[1] = pws->h[4];
3083 pwd->h[2] = pwt->h[5];
3084 pwd->h[3] = pws->h[5];
3085 pwd->h[4] = pwt->h[6];
3086 pwd->h[5] = pws->h[6];
3087 pwd->h[6] = pwt->h[7];
3088 pwd->h[7] = pws->h[7];
3092 void helper_msa_ilvl_w(CPUMIPSState *env,
3093 uint32_t wd, uint32_t ws, uint32_t wt)
3095 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
3096 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
3097 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
3099 #if defined(HOST_WORDS_BIGENDIAN)
3100 pwd->w[1] = pwt->w[3];
3101 pwd->w[0] = pws->w[3];
3102 pwd->w[3] = pwt->w[2];
3103 pwd->w[2] = pws->w[2];
3105 pwd->w[0] = pwt->w[2];
3106 pwd->w[1] = pws->w[2];
3107 pwd->w[2] = pwt->w[3];
3108 pwd->w[3] = pws->w[3];
3112 void helper_msa_ilvl_d(CPUMIPSState *env,
3113 uint32_t wd, uint32_t ws, uint32_t wt)
3115 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
3116 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
3117 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
3119 pwd->d[0] = pwt->d[1];
3120 pwd->d[1] = pws->d[1];
3124 void helper_msa_ilvr_b(CPUMIPSState *env,
3125 uint32_t wd, uint32_t ws, uint32_t wt)
3127 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
3128 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
3129 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
3131 #if defined(HOST_WORDS_BIGENDIAN)
3132 pwd->b[8] = pws->b[0];
3133 pwd->b[9] = pwt->b[0];
3134 pwd->b[10] = pws->b[1];
3135 pwd->b[11] = pwt->b[1];
3136 pwd->b[12] = pws->b[2];
3137 pwd->b[13] = pwt->b[2];
3138 pwd->b[14] = pws->b[3];
3139 pwd->b[15] = pwt->b[3];
3140 pwd->b[0] = pws->b[4];
3141 pwd->b[1] = pwt->b[4];
3142 pwd->b[2] = pws->b[5];
3143 pwd->b[3] = pwt->b[5];
3144 pwd->b[4] = pws->b[6];
3145 pwd->b[5] = pwt->b[6];
3146 pwd->b[6] = pws->b[7];
3147 pwd->b[7] = pwt->b[7];
3149 pwd->b[15] = pws->b[7];
3150 pwd->b[14] = pwt->b[7];
3151 pwd->b[13] = pws->b[6];
3152 pwd->b[12] = pwt->b[6];
3153 pwd->b[11] = pws->b[5];
3154 pwd->b[10] = pwt->b[5];
3155 pwd->b[9] = pws->b[4];
3156 pwd->b[8] = pwt->b[4];
3157 pwd->b[7] = pws->b[3];
3158 pwd->b[6] = pwt->b[3];
3159 pwd->b[5] = pws->b[2];
3160 pwd->b[4] = pwt->b[2];
3161 pwd->b[3] = pws->b[1];
3162 pwd->b[2] = pwt->b[1];
3163 pwd->b[1] = pws->b[0];
3164 pwd->b[0] = pwt->b[0];
3168 void helper_msa_ilvr_h(CPUMIPSState *env,
3169 uint32_t wd, uint32_t ws, uint32_t wt)
3171 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
3172 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
3173 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
3175 #if defined(HOST_WORDS_BIGENDIAN)
3176 pwd->h[4] = pws->h[0];
3177 pwd->h[5] = pwt->h[0];
3178 pwd->h[6] = pws->h[1];
3179 pwd->h[7] = pwt->h[1];
3180 pwd->h[0] = pws->h[2];
3181 pwd->h[1] = pwt->h[2];
3182 pwd->h[2] = pws->h[3];
3183 pwd->h[3] = pwt->h[3];
3185 pwd->h[7] = pws->h[3];
3186 pwd->h[6] = pwt->h[3];
3187 pwd->h[5] = pws->h[2];
3188 pwd->h[4] = pwt->h[2];
3189 pwd->h[3] = pws->h[1];
3190 pwd->h[2] = pwt->h[1];
3191 pwd->h[1] = pws->h[0];
3192 pwd->h[0] = pwt->h[0];
3196 void helper_msa_ilvr_w(CPUMIPSState *env,
3197 uint32_t wd, uint32_t ws, uint32_t wt)
3199 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
3200 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
3201 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
3203 #if defined(HOST_WORDS_BIGENDIAN)
3204 pwd->w[2] = pws->w[0];
3205 pwd->w[3] = pwt->w[0];
3206 pwd->w[0] = pws->w[1];
3207 pwd->w[1] = pwt->w[1];
3209 pwd->w[3] = pws->w[1];
3210 pwd->w[2] = pwt->w[1];
3211 pwd->w[1] = pws->w[0];
3212 pwd->w[0] = pwt->w[0];
3216 void helper_msa_ilvr_d(CPUMIPSState *env,
3217 uint32_t wd, uint32_t ws, uint32_t wt)
3219 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
3220 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
3221 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
3223 pwd->d[1] = pws->d[0];
3224 pwd->d[0] = pwt->d[0];
3232 * +---------------+----------------------------------------------------------+
3233 * | AND.V | Vector Logical And |
3234 * | NOR.V | Vector Logical Negated Or |
3235 * | OR.V | Vector Logical Or |
3236 * | XOR.V | Vector Logical Exclusive Or |
3237 * +---------------+----------------------------------------------------------+
3241 void helper_msa_and_v(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
3243 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
3244 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
3245 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
3247 pwd->d[0] = pws->d[0] & pwt->d[0];
3248 pwd->d[1] = pws->d[1] & pwt->d[1];
3251 void helper_msa_nor_v(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
3253 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
3254 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
3255 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
3257 pwd->d[0] = ~(pws->d[0] | pwt->d[0]);
3258 pwd->d[1] = ~(pws->d[1] | pwt->d[1]);
3261 void helper_msa_or_v(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
3263 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
3264 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
3265 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
3267 pwd->d[0] = pws->d[0] | pwt->d[0];
3268 pwd->d[1] = pws->d[1] | pwt->d[1];
3271 void helper_msa_xor_v(CPUMIPSState *env, uint32_t wd, uint32_t ws, uint32_t wt)
3273 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
3274 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
3275 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
3277 pwd->d[0] = pws->d[0] ^ pwt->d[0];
3278 pwd->d[1] = pws->d[1] ^ pwt->d[1];
3286 * +---------------+----------------------------------------------------------+
3287 * | MOVE.V | Vector Move |
3288 * +---------------+----------------------------------------------------------+
3291 static inline void msa_move_v(wr_t *pwd, wr_t *pws)
3293 pwd->d[0] = pws->d[0];
3294 pwd->d[1] = pws->d[1];
3297 void helper_msa_move_v(CPUMIPSState *env, uint32_t wd, uint32_t ws)
3299 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
3300 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
3302 msa_move_v(pwd, pws);
3310 * +---------------+----------------------------------------------------------+
3311 * | PCKEV.B | Vector Pack Even (byte) |
3312 * | PCKEV.H | Vector Pack Even (halfword) |
3313 * | PCKEV.W | Vector Pack Even (word) |
3314 * | PCKEV.D | Vector Pack Even (doubleword) |
3315 * | PCKOD.B | Vector Pack Odd (byte) |
3316 * | PCKOD.H | Vector Pack Odd (halfword) |
3317 * | PCKOD.W | Vector Pack Odd (word) |
3318 * | PCKOD.D | Vector Pack Odd (doubleword) |
3319 * | VSHF.B | Vector Data Preserving Shuffle (byte) |
3320 * | VSHF.H | Vector Data Preserving Shuffle (halfword) |
3321 * | VSHF.W | Vector Data Preserving Shuffle (word) |
3322 * | VSHF.D | Vector Data Preserving Shuffle (doubleword) |
3323 * +---------------+----------------------------------------------------------+
3326 /* TODO: insert Pack group helpers here */
3333 * +---------------+----------------------------------------------------------+
3334 * | SLL.B | Vector Shift Left (byte) |
3335 * | SLL.H | Vector Shift Left (halfword) |
3336 * | SLL.W | Vector Shift Left (word) |
3337 * | SLL.D | Vector Shift Left (doubleword) |
3338 * | SRA.B | Vector Shift Right Arithmetic (byte) |
3339 * | SRA.H | Vector Shift Right Arithmetic (halfword) |
3340 * | SRA.W | Vector Shift Right Arithmetic (word) |
3341 * | SRA.D | Vector Shift Right Arithmetic (doubleword) |
3342 * | SRAR.B | Vector Shift Right Arithmetic Rounded (byte) |
3343 * | SRAR.H | Vector Shift Right Arithmetic Rounded (halfword) |
3344 * | SRAR.W | Vector Shift Right Arithmetic Rounded (word) |
3345 * | SRAR.D | Vector Shift Right Arithmetic Rounded (doubleword) |
3346 * | SRL.B | Vector Shift Right Logical (byte) |
3347 * | SRL.H | Vector Shift Right Logical (halfword) |
3348 * | SRL.W | Vector Shift Right Logical (word) |
3349 * | SRL.D | Vector Shift Right Logical (doubleword) |
3350 * | SRLR.B | Vector Shift Right Logical Rounded (byte) |
3351 * | SRLR.H | Vector Shift Right Logical Rounded (halfword) |
3352 * | SRLR.W | Vector Shift Right Logical Rounded (word) |
3353 * | SRLR.D | Vector Shift Right Logical Rounded (doubleword) |
3354 * +---------------+----------------------------------------------------------+
3357 /* TODO: insert Shift group helpers here */
3360 #define MSA_FN_IMM8(FUNC, DEST, OPERATION) \
3361 void helper_msa_ ## FUNC(CPUMIPSState *env, uint32_t wd, uint32_t ws, \
3364 wr_t *pwd = &(env->active_fpu.fpr[wd].wr); \
3365 wr_t *pws = &(env->active_fpu.fpr[ws].wr); \
3367 for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) { \
3372 MSA_FN_IMM8(andi_b, pwd->b[i], pws->b[i] & i8)
3373 MSA_FN_IMM8(ori_b, pwd->b[i], pws->b[i] | i8)
3374 MSA_FN_IMM8(nori_b, pwd->b[i], ~(pws->b[i] | i8))
3375 MSA_FN_IMM8(xori_b, pwd->b[i], pws->b[i] ^ i8)
3377 #define BIT_MOVE_IF_NOT_ZERO(dest, arg1, arg2, df) \
3378 UNSIGNED(((dest & (~arg2)) | (arg1 & arg2)), df)
3379 MSA_FN_IMM8(bmnzi_b, pwd->b[i],
3380 BIT_MOVE_IF_NOT_ZERO(pwd->b[i], pws->b[i], i8, DF_BYTE))
3382 #define BIT_MOVE_IF_ZERO(dest, arg1, arg2, df) \
3383 UNSIGNED((dest & arg2) | (arg1 & (~arg2)), df)
3384 MSA_FN_IMM8(bmzi_b, pwd->b[i],
3385 BIT_MOVE_IF_ZERO(pwd->b[i], pws->b[i], i8, DF_BYTE))
3387 #define BIT_SELECT(dest, arg1, arg2, df) \
3388 UNSIGNED((arg1 & (~dest)) | (arg2 & dest), df)
3389 MSA_FN_IMM8(bseli_b, pwd->b[i],
3390 BIT_SELECT(pwd->b[i], pws->b[i], i8, DF_BYTE))
3393 #undef BIT_MOVE_IF_ZERO
3394 #undef BIT_MOVE_IF_NOT_ZERO
3397 #define SHF_POS(i, imm) (((i) & 0xfc) + (((imm) >> (2 * ((i) & 0x03))) & 0x03))
3399 void helper_msa_shf_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
3400 uint32_t ws, uint32_t imm)
3402 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
3403 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
3404 wr_t wx, *pwx = &wx;
3409 for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) {
3410 pwx->b[i] = pws->b[SHF_POS(i, imm)];
3414 for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) {
3415 pwx->h[i] = pws->h[SHF_POS(i, imm)];
3419 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
3420 pwx->w[i] = pws->w[SHF_POS(i, imm)];
3426 msa_move_v(pwd, pwx);
3429 static inline int64_t msa_subv_df(uint32_t df, int64_t arg1, int64_t arg2)
3434 #define MSA_BINOP_IMM_DF(helper, func) \
3435 void helper_msa_ ## helper ## _df(CPUMIPSState *env, uint32_t df, \
3436 uint32_t wd, uint32_t ws, int32_t u5) \
3438 wr_t *pwd = &(env->active_fpu.fpr[wd].wr); \
3439 wr_t *pws = &(env->active_fpu.fpr[ws].wr); \
3444 for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) { \
3445 pwd->b[i] = msa_ ## func ## _df(df, pws->b[i], u5); \
3449 for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) { \
3450 pwd->h[i] = msa_ ## func ## _df(df, pws->h[i], u5); \
3454 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { \
3455 pwd->w[i] = msa_ ## func ## _df(df, pws->w[i], u5); \
3459 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { \
3460 pwd->d[i] = msa_ ## func ## _df(df, pws->d[i], u5); \
3468 MSA_BINOP_IMM_DF(addvi, addv)
3469 MSA_BINOP_IMM_DF(subvi, subv)
3470 MSA_BINOP_IMM_DF(ceqi, ceq)
3471 MSA_BINOP_IMM_DF(clei_s, cle_s)
3472 MSA_BINOP_IMM_DF(clei_u, cle_u)
3473 MSA_BINOP_IMM_DF(clti_s, clt_s)
3474 MSA_BINOP_IMM_DF(clti_u, clt_u)
3475 MSA_BINOP_IMM_DF(maxi_s, max_s)
3476 MSA_BINOP_IMM_DF(maxi_u, max_u)
3477 MSA_BINOP_IMM_DF(mini_s, min_s)
3478 MSA_BINOP_IMM_DF(mini_u, min_u)
3479 #undef MSA_BINOP_IMM_DF
3481 void helper_msa_ldi_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
3484 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
3489 for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) {
3490 pwd->b[i] = (int8_t)s10;
3494 for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) {
3495 pwd->h[i] = (int16_t)s10;
3499 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
3500 pwd->w[i] = (int32_t)s10;
3504 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
3505 pwd->d[i] = (int64_t)s10;
3513 static inline int64_t msa_sll_df(uint32_t df, int64_t arg1, int64_t arg2)
3515 int32_t b_arg2 = BIT_POSITION(arg2, df);
3516 return arg1 << b_arg2;
3519 static inline int64_t msa_sra_df(uint32_t df, int64_t arg1, int64_t arg2)
3521 int32_t b_arg2 = BIT_POSITION(arg2, df);
3522 return arg1 >> b_arg2;
3525 static inline int64_t msa_srl_df(uint32_t df, int64_t arg1, int64_t arg2)
3527 uint64_t u_arg1 = UNSIGNED(arg1, df);
3528 int32_t b_arg2 = BIT_POSITION(arg2, df);
3529 return u_arg1 >> b_arg2;
3532 static inline int64_t msa_sat_s_df(uint32_t df, int64_t arg, uint32_t m)
3534 return arg < M_MIN_INT(m + 1) ? M_MIN_INT(m + 1) :
3535 arg > M_MAX_INT(m + 1) ? M_MAX_INT(m + 1) :
3539 static inline int64_t msa_sat_u_df(uint32_t df, int64_t arg, uint32_t m)
3541 uint64_t u_arg = UNSIGNED(arg, df);
3542 return u_arg < M_MAX_UINT(m + 1) ? u_arg :
3546 static inline int64_t msa_srar_df(uint32_t df, int64_t arg1, int64_t arg2)
3548 int32_t b_arg2 = BIT_POSITION(arg2, df);
3552 int64_t r_bit = (arg1 >> (b_arg2 - 1)) & 1;
3553 return (arg1 >> b_arg2) + r_bit;
3557 static inline int64_t msa_srlr_df(uint32_t df, int64_t arg1, int64_t arg2)
3559 uint64_t u_arg1 = UNSIGNED(arg1, df);
3560 int32_t b_arg2 = BIT_POSITION(arg2, df);
3564 uint64_t r_bit = (u_arg1 >> (b_arg2 - 1)) & 1;
3565 return (u_arg1 >> b_arg2) + r_bit;
3569 #define MSA_BINOP_IMMU_DF(helper, func) \
3570 void helper_msa_ ## helper ## _df(CPUMIPSState *env, uint32_t df, uint32_t wd, \
3571 uint32_t ws, uint32_t u5) \
3573 wr_t *pwd = &(env->active_fpu.fpr[wd].wr); \
3574 wr_t *pws = &(env->active_fpu.fpr[ws].wr); \
3579 for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) { \
3580 pwd->b[i] = msa_ ## func ## _df(df, pws->b[i], u5); \
3584 for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) { \
3585 pwd->h[i] = msa_ ## func ## _df(df, pws->h[i], u5); \
3589 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { \
3590 pwd->w[i] = msa_ ## func ## _df(df, pws->w[i], u5); \
3594 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { \
3595 pwd->d[i] = msa_ ## func ## _df(df, pws->d[i], u5); \
3603 MSA_BINOP_IMMU_DF(slli, sll)
3604 MSA_BINOP_IMMU_DF(srai, sra)
3605 MSA_BINOP_IMMU_DF(srli, srl)
3606 MSA_BINOP_IMMU_DF(bclri, bclr)
3607 MSA_BINOP_IMMU_DF(bseti, bset)
3608 MSA_BINOP_IMMU_DF(bnegi, bneg)
3609 MSA_BINOP_IMMU_DF(sat_s, sat_s)
3610 MSA_BINOP_IMMU_DF(sat_u, sat_u)
3611 MSA_BINOP_IMMU_DF(srari, srar)
3612 MSA_BINOP_IMMU_DF(srlri, srlr)
3613 #undef MSA_BINOP_IMMU_DF
3615 #define MSA_TEROP_IMMU_DF(helper, func) \
3616 void helper_msa_ ## helper ## _df(CPUMIPSState *env, uint32_t df, \
3617 uint32_t wd, uint32_t ws, uint32_t u5) \
3619 wr_t *pwd = &(env->active_fpu.fpr[wd].wr); \
3620 wr_t *pws = &(env->active_fpu.fpr[ws].wr); \
3625 for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) { \
3626 pwd->b[i] = msa_ ## func ## _df(df, pwd->b[i], pws->b[i], \
3631 for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) { \
3632 pwd->h[i] = msa_ ## func ## _df(df, pwd->h[i], pws->h[i], \
3637 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) { \
3638 pwd->w[i] = msa_ ## func ## _df(df, pwd->w[i], pws->w[i], \
3643 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) { \
3644 pwd->d[i] = msa_ ## func ## _df(df, pwd->d[i], pws->d[i], \
3653 MSA_TEROP_IMMU_DF(binsli, binsl)
3654 MSA_TEROP_IMMU_DF(binsri, binsr)
3655 #undef MSA_TEROP_IMMU_DF
3657 static inline int64_t msa_subs_s_df(uint32_t df, int64_t arg1, int64_t arg2)
3659 int64_t max_int = DF_MAX_INT(df);
3660 int64_t min_int = DF_MIN_INT(df);
3662 return (min_int + arg2 < arg1) ? arg1 - arg2 : min_int;
3664 return (arg1 < max_int + arg2) ? arg1 - arg2 : max_int;
3668 static inline int64_t msa_subs_u_df(uint32_t df, int64_t arg1, int64_t arg2)
3670 uint64_t u_arg1 = UNSIGNED(arg1, df);
3671 uint64_t u_arg2 = UNSIGNED(arg2, df);
3672 return (u_arg1 > u_arg2) ? u_arg1 - u_arg2 : 0;
3675 static inline int64_t msa_subsus_u_df(uint32_t df, int64_t arg1, int64_t arg2)
3677 uint64_t u_arg1 = UNSIGNED(arg1, df);
3678 uint64_t max_uint = DF_MAX_UINT(df);
3680 uint64_t u_arg2 = (uint64_t)arg2;
3681 return (u_arg1 > u_arg2) ?
3682 (int64_t)(u_arg1 - u_arg2) :
3685 uint64_t u_arg2 = (uint64_t)(-arg2);
3686 return (u_arg1 < max_uint - u_arg2) ?
3687 (int64_t)(u_arg1 + u_arg2) :
3692 static inline int64_t msa_subsuu_s_df(uint32_t df, int64_t arg1, int64_t arg2)
3694 uint64_t u_arg1 = UNSIGNED(arg1, df);
3695 uint64_t u_arg2 = UNSIGNED(arg2, df);
3696 int64_t max_int = DF_MAX_INT(df);
3697 int64_t min_int = DF_MIN_INT(df);
3698 if (u_arg1 > u_arg2) {
3699 return u_arg1 - u_arg2 < (uint64_t)max_int ?
3700 (int64_t)(u_arg1 - u_arg2) :
3703 return u_arg2 - u_arg1 < (uint64_t)(-min_int) ?
3704 (int64_t)(u_arg1 - u_arg2) :
3709 static inline int64_t msa_asub_s_df(uint32_t df, int64_t arg1, int64_t arg2)
3711 /* signed compare */
3712 return (arg1 < arg2) ?
3713 (uint64_t)(arg2 - arg1) : (uint64_t)(arg1 - arg2);
3716 static inline uint64_t msa_asub_u_df(uint32_t df, uint64_t arg1, uint64_t arg2)
3718 uint64_t u_arg1 = UNSIGNED(arg1, df);
3719 uint64_t u_arg2 = UNSIGNED(arg2, df);
3720 /* unsigned compare */
3721 return (u_arg1 < u_arg2) ?
3722 (uint64_t)(u_arg2 - u_arg1) : (uint64_t)(u_arg1 - u_arg2);
3725 static inline int64_t msa_mulv_df(uint32_t df, int64_t arg1, int64_t arg2)
3730 #define SIGNED_EVEN(a, df) \
3731 ((((int64_t)(a)) << (64 - DF_BITS(df) / 2)) >> (64 - DF_BITS(df) / 2))
3733 #define UNSIGNED_EVEN(a, df) \
3734 ((((uint64_t)(a)) << (64 - DF_BITS(df) / 2)) >> (64 - DF_BITS(df) / 2))
3736 #define SIGNED_ODD(a, df) \
3737 ((((int64_t)(a)) << (64 - DF_BITS(df))) >> (64 - DF_BITS(df) / 2))
3739 #define UNSIGNED_ODD(a, df) \
3740 ((((uint64_t)(a)) << (64 - DF_BITS(df))) >> (64 - DF_BITS(df) / 2))
3742 #define SIGNED_EXTRACT(e, o, a, df) \
3744 e = SIGNED_EVEN(a, df); \
3745 o = SIGNED_ODD(a, df); \
3748 #define UNSIGNED_EXTRACT(e, o, a, df) \
3750 e = UNSIGNED_EVEN(a, df); \
3751 o = UNSIGNED_ODD(a, df); \
3754 static inline int64_t msa_dotp_s_df(uint32_t df, int64_t arg1, int64_t arg2)
3760 SIGNED_EXTRACT(even_arg1, odd_arg1, arg1, df);
3761 SIGNED_EXTRACT(even_arg2, odd_arg2, arg2, df);
3762 return (even_arg1 * even_arg2) + (odd_arg1 * odd_arg2);
3765 static inline int64_t msa_dotp_u_df(uint32_t df, int64_t arg1, int64_t arg2)
3771 UNSIGNED_EXTRACT(even_arg1, odd_arg1, arg1, df);
3772 UNSIGNED_EXTRACT(even_arg2, odd_arg2, arg2, df);
3773 return (even_arg1 * even_arg2) + (odd_arg1 * odd_arg2);
3776 #define CONCATENATE_AND_SLIDE(s, k) \
3778 for (i = 0; i < s; i++) { \
3779 v[i] = pws->b[s * k + i]; \
3780 v[i + s] = pwd->b[s * k + i]; \
3782 for (i = 0; i < s; i++) { \
3783 pwd->b[s * k + i] = v[i + n]; \
3787 static inline void msa_sld_df(uint32_t df, wr_t *pwd,
3788 wr_t *pws, target_ulong rt)
3790 uint32_t n = rt % DF_ELEMENTS(df);
3796 CONCATENATE_AND_SLIDE(DF_ELEMENTS(DF_BYTE), 0);
3799 for (k = 0; k < 2; k++) {
3800 CONCATENATE_AND_SLIDE(DF_ELEMENTS(DF_HALF), k);
3804 for (k = 0; k < 4; k++) {
3805 CONCATENATE_AND_SLIDE(DF_ELEMENTS(DF_WORD), k);
3809 for (k = 0; k < 8; k++) {
3810 CONCATENATE_AND_SLIDE(DF_ELEMENTS(DF_DOUBLE), k);
3818 static inline int64_t msa_hadd_s_df(uint32_t df, int64_t arg1, int64_t arg2)
3820 return SIGNED_ODD(arg1, df) + SIGNED_EVEN(arg2, df);
3823 static inline int64_t msa_hadd_u_df(uint32_t df, int64_t arg1, int64_t arg2)
3825 return UNSIGNED_ODD(arg1, df) + UNSIGNED_EVEN(arg2, df);
3828 static inline int64_t msa_hsub_s_df(uint32_t df, int64_t arg1, int64_t arg2)
3830 return SIGNED_ODD(arg1, df) - SIGNED_EVEN(arg2, df);
3833 static inline int64_t msa_hsub_u_df(uint32_t df, int64_t arg1, int64_t arg2)
3835 return UNSIGNED_ODD(arg1, df) - UNSIGNED_EVEN(arg2, df);
3838 static inline int64_t msa_mul_q_df(uint32_t df, int64_t arg1, int64_t arg2)
3840 int64_t q_min = DF_MIN_INT(df);
3841 int64_t q_max = DF_MAX_INT(df);
3843 if (arg1 == q_min && arg2 == q_min) {
3846 return (arg1 * arg2) >> (DF_BITS(df) - 1);
3849 static inline int64_t msa_mulr_q_df(uint32_t df, int64_t arg1, int64_t arg2)
3851 int64_t q_min = DF_MIN_INT(df);
3852 int64_t q_max = DF_MAX_INT(df);
3853 int64_t r_bit = 1 << (DF_BITS(df) - 2);
3855 if (arg1 == q_min && arg2 == q_min) {
3858 return (arg1 * arg2 + r_bit) >> (DF_BITS(df) - 1);
3861 #define MSA_BINOP_DF(func) \
3862 void helper_msa_ ## func ## _df(CPUMIPSState *env, uint32_t df, \
3863 uint32_t wd, uint32_t ws, uint32_t wt) \
3865 wr_t *pwd = &(env->active_fpu.fpr[wd].wr); \
3866 wr_t *pws = &(env->active_fpu.fpr[ws].wr); \
3867 wr_t *pwt = &(env->active_fpu.fpr[wt].wr); \
3871 pwd->b[0] = msa_ ## func ## _df(df, pws->b[0], pwt->b[0]); \
3872 pwd->b[1] = msa_ ## func ## _df(df, pws->b[1], pwt->b[1]); \
3873 pwd->b[2] = msa_ ## func ## _df(df, pws->b[2], pwt->b[2]); \
3874 pwd->b[3] = msa_ ## func ## _df(df, pws->b[3], pwt->b[3]); \
3875 pwd->b[4] = msa_ ## func ## _df(df, pws->b[4], pwt->b[4]); \
3876 pwd->b[5] = msa_ ## func ## _df(df, pws->b[5], pwt->b[5]); \
3877 pwd->b[6] = msa_ ## func ## _df(df, pws->b[6], pwt->b[6]); \
3878 pwd->b[7] = msa_ ## func ## _df(df, pws->b[7], pwt->b[7]); \
3879 pwd->b[8] = msa_ ## func ## _df(df, pws->b[8], pwt->b[8]); \
3880 pwd->b[9] = msa_ ## func ## _df(df, pws->b[9], pwt->b[9]); \
3881 pwd->b[10] = msa_ ## func ## _df(df, pws->b[10], pwt->b[10]); \
3882 pwd->b[11] = msa_ ## func ## _df(df, pws->b[11], pwt->b[11]); \
3883 pwd->b[12] = msa_ ## func ## _df(df, pws->b[12], pwt->b[12]); \
3884 pwd->b[13] = msa_ ## func ## _df(df, pws->b[13], pwt->b[13]); \
3885 pwd->b[14] = msa_ ## func ## _df(df, pws->b[14], pwt->b[14]); \
3886 pwd->b[15] = msa_ ## func ## _df(df, pws->b[15], pwt->b[15]); \
3889 pwd->h[0] = msa_ ## func ## _df(df, pws->h[0], pwt->h[0]); \
3890 pwd->h[1] = msa_ ## func ## _df(df, pws->h[1], pwt->h[1]); \
3891 pwd->h[2] = msa_ ## func ## _df(df, pws->h[2], pwt->h[2]); \
3892 pwd->h[3] = msa_ ## func ## _df(df, pws->h[3], pwt->h[3]); \
3893 pwd->h[4] = msa_ ## func ## _df(df, pws->h[4], pwt->h[4]); \
3894 pwd->h[5] = msa_ ## func ## _df(df, pws->h[5], pwt->h[5]); \
3895 pwd->h[6] = msa_ ## func ## _df(df, pws->h[6], pwt->h[6]); \
3896 pwd->h[7] = msa_ ## func ## _df(df, pws->h[7], pwt->h[7]); \
3899 pwd->w[0] = msa_ ## func ## _df(df, pws->w[0], pwt->w[0]); \
3900 pwd->w[1] = msa_ ## func ## _df(df, pws->w[1], pwt->w[1]); \
3901 pwd->w[2] = msa_ ## func ## _df(df, pws->w[2], pwt->w[2]); \
3902 pwd->w[3] = msa_ ## func ## _df(df, pws->w[3], pwt->w[3]); \
3905 pwd->d[0] = msa_ ## func ## _df(df, pws->d[0], pwt->d[0]); \
3906 pwd->d[1] = msa_ ## func ## _df(df, pws->d[1], pwt->d[1]); \
3917 MSA_BINOP_DF(subs_s)
3918 MSA_BINOP_DF(subs_u)
3919 MSA_BINOP_DF(subsus_u)
3920 MSA_BINOP_DF(subsuu_s)
3921 MSA_BINOP_DF(asub_s)
3922 MSA_BINOP_DF(asub_u)
3924 MSA_BINOP_DF(dotp_s)
3925 MSA_BINOP_DF(dotp_u)
3928 MSA_BINOP_DF(hadd_s)
3929 MSA_BINOP_DF(hadd_u)
3930 MSA_BINOP_DF(hsub_s)
3931 MSA_BINOP_DF(hsub_u)
3934 MSA_BINOP_DF(mulr_q)
3937 void helper_msa_sld_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
3938 uint32_t ws, uint32_t rt)
3940 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
3941 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
3943 msa_sld_df(df, pwd, pws, env->active_tc.gpr[rt]);
3946 static inline int64_t msa_maddv_df(uint32_t df, int64_t dest, int64_t arg1,
3949 return dest + arg1 * arg2;
3952 static inline int64_t msa_msubv_df(uint32_t df, int64_t dest, int64_t arg1,
3955 return dest - arg1 * arg2;
3958 static inline int64_t msa_dpadd_s_df(uint32_t df, int64_t dest, int64_t arg1,
3965 SIGNED_EXTRACT(even_arg1, odd_arg1, arg1, df);
3966 SIGNED_EXTRACT(even_arg2, odd_arg2, arg2, df);
3967 return dest + (even_arg1 * even_arg2) + (odd_arg1 * odd_arg2);
3970 static inline int64_t msa_dpadd_u_df(uint32_t df, int64_t dest, int64_t arg1,
3977 UNSIGNED_EXTRACT(even_arg1, odd_arg1, arg1, df);
3978 UNSIGNED_EXTRACT(even_arg2, odd_arg2, arg2, df);
3979 return dest + (even_arg1 * even_arg2) + (odd_arg1 * odd_arg2);
3982 static inline int64_t msa_dpsub_s_df(uint32_t df, int64_t dest, int64_t arg1,
3989 SIGNED_EXTRACT(even_arg1, odd_arg1, arg1, df);
3990 SIGNED_EXTRACT(even_arg2, odd_arg2, arg2, df);
3991 return dest - ((even_arg1 * even_arg2) + (odd_arg1 * odd_arg2));
3994 static inline int64_t msa_dpsub_u_df(uint32_t df, int64_t dest, int64_t arg1,
4001 UNSIGNED_EXTRACT(even_arg1, odd_arg1, arg1, df);
4002 UNSIGNED_EXTRACT(even_arg2, odd_arg2, arg2, df);
4003 return dest - ((even_arg1 * even_arg2) + (odd_arg1 * odd_arg2));
4006 static inline int64_t msa_madd_q_df(uint32_t df, int64_t dest, int64_t arg1,
4009 int64_t q_prod, q_ret;
4011 int64_t q_max = DF_MAX_INT(df);
4012 int64_t q_min = DF_MIN_INT(df);
4014 q_prod = arg1 * arg2;
4015 q_ret = ((dest << (DF_BITS(df) - 1)) + q_prod) >> (DF_BITS(df) - 1);
4017 return (q_ret < q_min) ? q_min : (q_max < q_ret) ? q_max : q_ret;
4020 static inline int64_t msa_msub_q_df(uint32_t df, int64_t dest, int64_t arg1,
4023 int64_t q_prod, q_ret;
4025 int64_t q_max = DF_MAX_INT(df);
4026 int64_t q_min = DF_MIN_INT(df);
4028 q_prod = arg1 * arg2;
4029 q_ret = ((dest << (DF_BITS(df) - 1)) - q_prod) >> (DF_BITS(df) - 1);
4031 return (q_ret < q_min) ? q_min : (q_max < q_ret) ? q_max : q_ret;
4034 static inline int64_t msa_maddr_q_df(uint32_t df, int64_t dest, int64_t arg1,
4037 int64_t q_prod, q_ret;
4039 int64_t q_max = DF_MAX_INT(df);
4040 int64_t q_min = DF_MIN_INT(df);
4041 int64_t r_bit = 1 << (DF_BITS(df) - 2);
4043 q_prod = arg1 * arg2;
4044 q_ret = ((dest << (DF_BITS(df) - 1)) + q_prod + r_bit) >> (DF_BITS(df) - 1);
4046 return (q_ret < q_min) ? q_min : (q_max < q_ret) ? q_max : q_ret;
4049 static inline int64_t msa_msubr_q_df(uint32_t df, int64_t dest, int64_t arg1,
4052 int64_t q_prod, q_ret;
4054 int64_t q_max = DF_MAX_INT(df);
4055 int64_t q_min = DF_MIN_INT(df);
4056 int64_t r_bit = 1 << (DF_BITS(df) - 2);
4058 q_prod = arg1 * arg2;
4059 q_ret = ((dest << (DF_BITS(df) - 1)) - q_prod + r_bit) >> (DF_BITS(df) - 1);
4061 return (q_ret < q_min) ? q_min : (q_max < q_ret) ? q_max : q_ret;
4064 #define MSA_TEROP_DF(func) \
4065 void helper_msa_ ## func ## _df(CPUMIPSState *env, uint32_t df, uint32_t wd, \
4066 uint32_t ws, uint32_t wt) \
4068 wr_t *pwd = &(env->active_fpu.fpr[wd].wr); \
4069 wr_t *pws = &(env->active_fpu.fpr[ws].wr); \
4070 wr_t *pwt = &(env->active_fpu.fpr[wt].wr); \
4074 pwd->b[0] = msa_ ## func ## _df(df, pwd->b[0], pws->b[0], \
4076 pwd->b[1] = msa_ ## func ## _df(df, pwd->b[1], pws->b[1], \
4078 pwd->b[2] = msa_ ## func ## _df(df, pwd->b[2], pws->b[2], \
4080 pwd->b[3] = msa_ ## func ## _df(df, pwd->b[3], pws->b[3], \
4082 pwd->b[4] = msa_ ## func ## _df(df, pwd->b[4], pws->b[4], \
4084 pwd->b[5] = msa_ ## func ## _df(df, pwd->b[5], pws->b[5], \
4086 pwd->b[6] = msa_ ## func ## _df(df, pwd->b[6], pws->b[6], \
4088 pwd->b[7] = msa_ ## func ## _df(df, pwd->b[7], pws->b[7], \
4090 pwd->b[8] = msa_ ## func ## _df(df, pwd->b[8], pws->b[8], \
4092 pwd->b[9] = msa_ ## func ## _df(df, pwd->b[9], pws->b[9], \
4094 pwd->b[10] = msa_ ## func ## _df(df, pwd->b[10], pws->b[10], \
4096 pwd->b[11] = msa_ ## func ## _df(df, pwd->b[11], pws->b[11], \
4098 pwd->b[12] = msa_ ## func ## _df(df, pwd->b[12], pws->b[12], \
4100 pwd->b[13] = msa_ ## func ## _df(df, pwd->b[13], pws->b[13], \
4102 pwd->b[14] = msa_ ## func ## _df(df, pwd->b[14], pws->b[14], \
4104 pwd->b[15] = msa_ ## func ## _df(df, pwd->b[15], pws->b[15], \
4108 pwd->h[0] = msa_ ## func ## _df(df, pwd->h[0], pws->h[0], pwt->h[0]); \
4109 pwd->h[1] = msa_ ## func ## _df(df, pwd->h[1], pws->h[1], pwt->h[1]); \
4110 pwd->h[2] = msa_ ## func ## _df(df, pwd->h[2], pws->h[2], pwt->h[2]); \
4111 pwd->h[3] = msa_ ## func ## _df(df, pwd->h[3], pws->h[3], pwt->h[3]); \
4112 pwd->h[4] = msa_ ## func ## _df(df, pwd->h[4], pws->h[4], pwt->h[4]); \
4113 pwd->h[5] = msa_ ## func ## _df(df, pwd->h[5], pws->h[5], pwt->h[5]); \
4114 pwd->h[6] = msa_ ## func ## _df(df, pwd->h[6], pws->h[6], pwt->h[6]); \
4115 pwd->h[7] = msa_ ## func ## _df(df, pwd->h[7], pws->h[7], pwt->h[7]); \
4118 pwd->w[0] = msa_ ## func ## _df(df, pwd->w[0], pws->w[0], pwt->w[0]); \
4119 pwd->w[1] = msa_ ## func ## _df(df, pwd->w[1], pws->w[1], pwt->w[1]); \
4120 pwd->w[2] = msa_ ## func ## _df(df, pwd->w[2], pws->w[2], pwt->w[2]); \
4121 pwd->w[3] = msa_ ## func ## _df(df, pwd->w[3], pws->w[3], pwt->w[3]); \
4124 pwd->d[0] = msa_ ## func ## _df(df, pwd->d[0], pws->d[0], pwt->d[0]); \
4125 pwd->d[1] = msa_ ## func ## _df(df, pwd->d[1], pws->d[1], pwt->d[1]); \
4134 MSA_TEROP_DF(dpadd_s)
4135 MSA_TEROP_DF(dpadd_u)
4136 MSA_TEROP_DF(dpsub_s)
4137 MSA_TEROP_DF(dpsub_u)
4140 MSA_TEROP_DF(madd_q)
4141 MSA_TEROP_DF(msub_q)
4142 MSA_TEROP_DF(maddr_q)
4143 MSA_TEROP_DF(msubr_q)
4146 static inline void msa_splat_df(uint32_t df, wr_t *pwd,
4147 wr_t *pws, target_ulong rt)
4149 uint32_t n = rt % DF_ELEMENTS(df);
4154 for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) {
4155 pwd->b[i] = pws->b[n];
4159 for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) {
4160 pwd->h[i] = pws->h[n];
4164 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
4165 pwd->w[i] = pws->w[n];
4169 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
4170 pwd->d[i] = pws->d[n];
4178 void helper_msa_splat_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
4179 uint32_t ws, uint32_t rt)
4181 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
4182 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
4184 msa_splat_df(df, pwd, pws, env->active_tc.gpr[rt]);
4187 #define MSA_DO_B MSA_DO(b)
4188 #define MSA_DO_H MSA_DO(h)
4189 #define MSA_DO_W MSA_DO(w)
4190 #define MSA_DO_D MSA_DO(d)
4192 #define MSA_LOOP_B MSA_LOOP(B)
4193 #define MSA_LOOP_H MSA_LOOP(H)
4194 #define MSA_LOOP_W MSA_LOOP(W)
4195 #define MSA_LOOP_D MSA_LOOP(D)
4197 #define MSA_LOOP_COND_B MSA_LOOP_COND(DF_BYTE)
4198 #define MSA_LOOP_COND_H MSA_LOOP_COND(DF_HALF)
4199 #define MSA_LOOP_COND_W MSA_LOOP_COND(DF_WORD)
4200 #define MSA_LOOP_COND_D MSA_LOOP_COND(DF_DOUBLE)
4202 #define MSA_LOOP(DF) \
4204 for (i = 0; i < (MSA_LOOP_COND_ ## DF) ; i++) { \
4209 #define MSA_FN_DF(FUNC) \
4210 void helper_msa_##FUNC(CPUMIPSState *env, uint32_t df, uint32_t wd, \
4211 uint32_t ws, uint32_t wt) \
4213 wr_t *pwd = &(env->active_fpu.fpr[wd].wr); \
4214 wr_t *pws = &(env->active_fpu.fpr[ws].wr); \
4215 wr_t *pwt = &(env->active_fpu.fpr[wt].wr); \
4216 wr_t wx, *pwx = &wx; \
4234 msa_move_v(pwd, pwx); \
4237 #define MSA_LOOP_COND(DF) \
4238 (DF_ELEMENTS(DF) / 2)
4240 #define Rb(pwr, i) (pwr->b[i])
4241 #define Lb(pwr, i) (pwr->b[i + DF_ELEMENTS(DF_BYTE) / 2])
4242 #define Rh(pwr, i) (pwr->h[i])
4243 #define Lh(pwr, i) (pwr->h[i + DF_ELEMENTS(DF_HALF) / 2])
4244 #define Rw(pwr, i) (pwr->w[i])
4245 #define Lw(pwr, i) (pwr->w[i + DF_ELEMENTS(DF_WORD) / 2])
4246 #define Rd(pwr, i) (pwr->d[i])
4247 #define Ld(pwr, i) (pwr->d[i + DF_ELEMENTS(DF_DOUBLE) / 2])
4249 #undef MSA_LOOP_COND
4251 #define MSA_LOOP_COND(DF) \
4254 #define MSA_DO(DF) \
4256 uint32_t n = DF_ELEMENTS(df); \
4257 uint32_t k = (pwd->DF[i] & 0x3f) % (2 * n); \
4259 (pwd->DF[i] & 0xc0) ? 0 : k < n ? pwt->DF[k] : pws->DF[k - n]; \
4263 #undef MSA_LOOP_COND
4267 void helper_msa_pckev_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
4268 uint32_t ws, uint32_t wt)
4270 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
4271 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
4272 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
4276 #if defined(HOST_WORDS_BIGENDIAN)
4277 pwd->b[8] = pws->b[9];
4278 pwd->b[10] = pws->b[13];
4279 pwd->b[12] = pws->b[1];
4280 pwd->b[14] = pws->b[5];
4281 pwd->b[0] = pwt->b[9];
4282 pwd->b[2] = pwt->b[13];
4283 pwd->b[4] = pwt->b[1];
4284 pwd->b[6] = pwt->b[5];
4285 pwd->b[9] = pws->b[11];
4286 pwd->b[13] = pws->b[3];
4287 pwd->b[1] = pwt->b[11];
4288 pwd->b[5] = pwt->b[3];
4289 pwd->b[11] = pws->b[15];
4290 pwd->b[3] = pwt->b[15];
4291 pwd->b[15] = pws->b[7];
4292 pwd->b[7] = pwt->b[7];
4294 pwd->b[15] = pws->b[14];
4295 pwd->b[13] = pws->b[10];
4296 pwd->b[11] = pws->b[6];
4297 pwd->b[9] = pws->b[2];
4298 pwd->b[7] = pwt->b[14];
4299 pwd->b[5] = pwt->b[10];
4300 pwd->b[3] = pwt->b[6];
4301 pwd->b[1] = pwt->b[2];
4302 pwd->b[14] = pws->b[12];
4303 pwd->b[10] = pws->b[4];
4304 pwd->b[6] = pwt->b[12];
4305 pwd->b[2] = pwt->b[4];
4306 pwd->b[12] = pws->b[8];
4307 pwd->b[4] = pwt->b[8];
4308 pwd->b[8] = pws->b[0];
4309 pwd->b[0] = pwt->b[0];
4313 #if defined(HOST_WORDS_BIGENDIAN)
4314 pwd->h[4] = pws->h[5];
4315 pwd->h[6] = pws->h[1];
4316 pwd->h[0] = pwt->h[5];
4317 pwd->h[2] = pwt->h[1];
4318 pwd->h[5] = pws->h[7];
4319 pwd->h[1] = pwt->h[7];
4320 pwd->h[7] = pws->h[3];
4321 pwd->h[3] = pwt->h[3];
4323 pwd->h[7] = pws->h[6];
4324 pwd->h[5] = pws->h[2];
4325 pwd->h[3] = pwt->h[6];
4326 pwd->h[1] = pwt->h[2];
4327 pwd->h[6] = pws->h[4];
4328 pwd->h[2] = pwt->h[4];
4329 pwd->h[4] = pws->h[0];
4330 pwd->h[0] = pwt->h[0];
4334 #if defined(HOST_WORDS_BIGENDIAN)
4335 pwd->w[2] = pws->w[3];
4336 pwd->w[0] = pwt->w[3];
4337 pwd->w[3] = pws->w[1];
4338 pwd->w[1] = pwt->w[1];
4340 pwd->w[3] = pws->w[2];
4341 pwd->w[1] = pwt->w[2];
4342 pwd->w[2] = pws->w[0];
4343 pwd->w[0] = pwt->w[0];
4347 pwd->d[1] = pws->d[0];
4348 pwd->d[0] = pwt->d[0];
4355 void helper_msa_pckod_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
4356 uint32_t ws, uint32_t wt)
4358 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
4359 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
4360 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
4364 #if defined(HOST_WORDS_BIGENDIAN)
4365 pwd->b[7] = pwt->b[6];
4366 pwd->b[5] = pwt->b[2];
4367 pwd->b[3] = pwt->b[14];
4368 pwd->b[1] = pwt->b[10];
4369 pwd->b[15] = pws->b[6];
4370 pwd->b[13] = pws->b[2];
4371 pwd->b[11] = pws->b[14];
4372 pwd->b[9] = pws->b[10];
4373 pwd->b[6] = pwt->b[4];
4374 pwd->b[2] = pwt->b[12];
4375 pwd->b[14] = pws->b[4];
4376 pwd->b[10] = pws->b[12];
4377 pwd->b[4] = pwt->b[0];
4378 pwd->b[12] = pws->b[0];
4379 pwd->b[0] = pwt->b[8];
4380 pwd->b[8] = pws->b[8];
4382 pwd->b[0] = pwt->b[1];
4383 pwd->b[2] = pwt->b[5];
4384 pwd->b[4] = pwt->b[9];
4385 pwd->b[6] = pwt->b[13];
4386 pwd->b[8] = pws->b[1];
4387 pwd->b[10] = pws->b[5];
4388 pwd->b[12] = pws->b[9];
4389 pwd->b[14] = pws->b[13];
4390 pwd->b[1] = pwt->b[3];
4391 pwd->b[5] = pwt->b[11];
4392 pwd->b[9] = pws->b[3];
4393 pwd->b[13] = pws->b[11];
4394 pwd->b[3] = pwt->b[7];
4395 pwd->b[11] = pws->b[7];
4396 pwd->b[7] = pwt->b[15];
4397 pwd->b[15] = pws->b[15];
4401 #if defined(HOST_WORDS_BIGENDIAN)
4402 pwd->h[3] = pwt->h[2];
4403 pwd->h[1] = pwt->h[6];
4404 pwd->h[7] = pws->h[2];
4405 pwd->h[5] = pws->h[6];
4406 pwd->h[2] = pwt->h[0];
4407 pwd->h[6] = pws->h[0];
4408 pwd->h[0] = pwt->h[4];
4409 pwd->h[4] = pws->h[4];
4411 pwd->h[0] = pwt->h[1];
4412 pwd->h[2] = pwt->h[5];
4413 pwd->h[4] = pws->h[1];
4414 pwd->h[6] = pws->h[5];
4415 pwd->h[1] = pwt->h[3];
4416 pwd->h[5] = pws->h[3];
4417 pwd->h[3] = pwt->h[7];
4418 pwd->h[7] = pws->h[7];
4422 #if defined(HOST_WORDS_BIGENDIAN)
4423 pwd->w[1] = pwt->w[0];
4424 pwd->w[3] = pws->w[0];
4425 pwd->w[0] = pwt->w[2];
4426 pwd->w[2] = pws->w[2];
4428 pwd->w[0] = pwt->w[1];
4429 pwd->w[2] = pws->w[1];
4430 pwd->w[1] = pwt->w[3];
4431 pwd->w[3] = pws->w[3];
4435 pwd->d[0] = pwt->d[1];
4436 pwd->d[1] = pws->d[1];
4444 void helper_msa_sldi_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
4445 uint32_t ws, uint32_t n)
4447 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
4448 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
4450 msa_sld_df(df, pwd, pws, n);
4453 void helper_msa_splati_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
4454 uint32_t ws, uint32_t n)
4456 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
4457 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
4459 msa_splat_df(df, pwd, pws, n);
4462 void helper_msa_copy_s_b(CPUMIPSState *env, uint32_t rd,
4463 uint32_t ws, uint32_t n)
4466 #if defined(HOST_WORDS_BIGENDIAN)
4473 env->active_tc.gpr[rd] = (int8_t)env->active_fpu.fpr[ws].wr.b[n];
4476 void helper_msa_copy_s_h(CPUMIPSState *env, uint32_t rd,
4477 uint32_t ws, uint32_t n)
4480 #if defined(HOST_WORDS_BIGENDIAN)
4487 env->active_tc.gpr[rd] = (int16_t)env->active_fpu.fpr[ws].wr.h[n];
4490 void helper_msa_copy_s_w(CPUMIPSState *env, uint32_t rd,
4491 uint32_t ws, uint32_t n)
4494 #if defined(HOST_WORDS_BIGENDIAN)
4501 env->active_tc.gpr[rd] = (int32_t)env->active_fpu.fpr[ws].wr.w[n];
4504 void helper_msa_copy_s_d(CPUMIPSState *env, uint32_t rd,
4505 uint32_t ws, uint32_t n)
4508 env->active_tc.gpr[rd] = (int64_t)env->active_fpu.fpr[ws].wr.d[n];
4511 void helper_msa_copy_u_b(CPUMIPSState *env, uint32_t rd,
4512 uint32_t ws, uint32_t n)
4515 #if defined(HOST_WORDS_BIGENDIAN)
4522 env->active_tc.gpr[rd] = (uint8_t)env->active_fpu.fpr[ws].wr.b[n];
4525 void helper_msa_copy_u_h(CPUMIPSState *env, uint32_t rd,
4526 uint32_t ws, uint32_t n)
4529 #if defined(HOST_WORDS_BIGENDIAN)
4536 env->active_tc.gpr[rd] = (uint16_t)env->active_fpu.fpr[ws].wr.h[n];
4539 void helper_msa_copy_u_w(CPUMIPSState *env, uint32_t rd,
4540 uint32_t ws, uint32_t n)
4543 #if defined(HOST_WORDS_BIGENDIAN)
4550 env->active_tc.gpr[rd] = (uint32_t)env->active_fpu.fpr[ws].wr.w[n];
4553 void helper_msa_insert_b(CPUMIPSState *env, uint32_t wd,
4554 uint32_t rs_num, uint32_t n)
4556 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
4557 target_ulong rs = env->active_tc.gpr[rs_num];
4559 #if defined(HOST_WORDS_BIGENDIAN)
4566 pwd->b[n] = (int8_t)rs;
4569 void helper_msa_insert_h(CPUMIPSState *env, uint32_t wd,
4570 uint32_t rs_num, uint32_t n)
4572 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
4573 target_ulong rs = env->active_tc.gpr[rs_num];
4575 #if defined(HOST_WORDS_BIGENDIAN)
4582 pwd->h[n] = (int16_t)rs;
4585 void helper_msa_insert_w(CPUMIPSState *env, uint32_t wd,
4586 uint32_t rs_num, uint32_t n)
4588 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
4589 target_ulong rs = env->active_tc.gpr[rs_num];
4591 #if defined(HOST_WORDS_BIGENDIAN)
4598 pwd->w[n] = (int32_t)rs;
4601 void helper_msa_insert_d(CPUMIPSState *env, uint32_t wd,
4602 uint32_t rs_num, uint32_t n)
4604 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
4605 target_ulong rs = env->active_tc.gpr[rs_num];
4607 pwd->d[n] = (int64_t)rs;
4610 void helper_msa_insve_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
4611 uint32_t ws, uint32_t n)
4613 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
4614 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
4618 pwd->b[n] = (int8_t)pws->b[0];
4621 pwd->h[n] = (int16_t)pws->h[0];
4624 pwd->w[n] = (int32_t)pws->w[0];
4627 pwd->d[n] = (int64_t)pws->d[0];
4634 void helper_msa_ctcmsa(CPUMIPSState *env, target_ulong elm, uint32_t cd)
4640 env->active_tc.msacsr = (int32_t)elm & MSACSR_MASK;
4641 restore_msa_fp_status(env);
4642 /* check exception */
4643 if ((GET_FP_ENABLE(env->active_tc.msacsr) | FP_UNIMPLEMENTED)
4644 & GET_FP_CAUSE(env->active_tc.msacsr)) {
4645 do_raise_exception(env, EXCP_MSAFPE, GETPC());
4651 target_ulong helper_msa_cfcmsa(CPUMIPSState *env, uint32_t cs)
4657 return env->active_tc.msacsr & MSACSR_MASK;
4662 void helper_msa_fill_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
4665 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
4670 for (i = 0; i < DF_ELEMENTS(DF_BYTE); i++) {
4671 pwd->b[i] = (int8_t)env->active_tc.gpr[rs];
4675 for (i = 0; i < DF_ELEMENTS(DF_HALF); i++) {
4676 pwd->h[i] = (int16_t)env->active_tc.gpr[rs];
4680 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
4681 pwd->w[i] = (int32_t)env->active_tc.gpr[rs];
4685 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
4686 pwd->d[i] = (int64_t)env->active_tc.gpr[rs];
4695 #define FLOAT_ONE32 make_float32(0x3f8 << 20)
4696 #define FLOAT_ONE64 make_float64(0x3ffULL << 52)
4698 #define FLOAT_SNAN16(s) (float16_default_nan(s) ^ 0x0220)
4700 #define FLOAT_SNAN32(s) (float32_default_nan(s) ^ 0x00400020)
4702 #define FLOAT_SNAN64(s) (float64_default_nan(s) ^ 0x0008000000000020ULL)
4703 /* 0x7ff0000000000020 */
4705 static inline void clear_msacsr_cause(CPUMIPSState *env)
4707 SET_FP_CAUSE(env->active_tc.msacsr, 0);
4710 static inline void check_msacsr_cause(CPUMIPSState *env, uintptr_t retaddr)
4712 if ((GET_FP_CAUSE(env->active_tc.msacsr) &
4713 (GET_FP_ENABLE(env->active_tc.msacsr) | FP_UNIMPLEMENTED)) == 0) {
4714 UPDATE_FP_FLAGS(env->active_tc.msacsr,
4715 GET_FP_CAUSE(env->active_tc.msacsr));
4717 do_raise_exception(env, EXCP_MSAFPE, retaddr);
4721 /* Flush-to-zero use cases for update_msacsr() */
4722 #define CLEAR_FS_UNDERFLOW 1
4723 #define CLEAR_IS_INEXACT 2
4724 #define RECIPROCAL_INEXACT 4
4726 static inline int update_msacsr(CPUMIPSState *env, int action, int denormal)
4734 ieee_ex = get_float_exception_flags(&env->active_tc.msa_fp_status);
4736 /* QEMU softfloat does not signal all underflow cases */
4738 ieee_ex |= float_flag_underflow;
4741 c = ieee_ex_to_mips(ieee_ex);
4742 enable = GET_FP_ENABLE(env->active_tc.msacsr) | FP_UNIMPLEMENTED;
4744 /* Set Inexact (I) when flushing inputs to zero */
4745 if ((ieee_ex & float_flag_input_denormal) &&
4746 (env->active_tc.msacsr & MSACSR_FS_MASK) != 0) {
4747 if (action & CLEAR_IS_INEXACT) {
4754 /* Set Inexact (I) and Underflow (U) when flushing outputs to zero */
4755 if ((ieee_ex & float_flag_output_denormal) &&
4756 (env->active_tc.msacsr & MSACSR_FS_MASK) != 0) {
4758 if (action & CLEAR_FS_UNDERFLOW) {
4765 /* Set Inexact (I) when Overflow (O) is not enabled */
4766 if ((c & FP_OVERFLOW) != 0 && (enable & FP_OVERFLOW) == 0) {
4770 /* Clear Exact Underflow when Underflow (U) is not enabled */
4771 if ((c & FP_UNDERFLOW) != 0 && (enable & FP_UNDERFLOW) == 0 &&
4772 (c & FP_INEXACT) == 0) {
4777 * Reciprocal operations set only Inexact when valid and not
4780 if ((action & RECIPROCAL_INEXACT) &&
4781 (c & (FP_INVALID | FP_DIV0)) == 0) {
4785 cause = c & enable; /* all current enabled exceptions */
4789 * No enabled exception, update the MSACSR Cause
4790 * with all current exceptions
4792 SET_FP_CAUSE(env->active_tc.msacsr,
4793 (GET_FP_CAUSE(env->active_tc.msacsr) | c));
4795 /* Current exceptions are enabled */
4796 if ((env->active_tc.msacsr & MSACSR_NX_MASK) == 0) {
4798 * Exception(s) will trap, update MSACSR Cause
4799 * with all enabled exceptions
4801 SET_FP_CAUSE(env->active_tc.msacsr,
4802 (GET_FP_CAUSE(env->active_tc.msacsr) | c));
4809 static inline int get_enabled_exceptions(const CPUMIPSState *env, int c)
4811 int enable = GET_FP_ENABLE(env->active_tc.msacsr) | FP_UNIMPLEMENTED;
4815 static inline float16 float16_from_float32(int32_t a, flag ieee,
4816 float_status *status)
4820 f_val = float32_to_float16((float32)a, ieee, status);
4822 return a < 0 ? (f_val | (1 << 15)) : f_val;
4825 static inline float32 float32_from_float64(int64_t a, float_status *status)
4829 f_val = float64_to_float32((float64)a, status);
4831 return a < 0 ? (f_val | (1 << 31)) : f_val;
4834 static inline float32 float32_from_float16(int16_t a, flag ieee,
4835 float_status *status)
4839 f_val = float16_to_float32((float16)a, ieee, status);
4841 return a < 0 ? (f_val | (1 << 31)) : f_val;
4844 static inline float64 float64_from_float32(int32_t a, float_status *status)
4848 f_val = float32_to_float64((float64)a, status);
4850 return a < 0 ? (f_val | (1ULL << 63)) : f_val;
4853 static inline float32 float32_from_q16(int16_t a, float_status *status)
4857 /* conversion as integer and scaling */
4858 f_val = int32_to_float32(a, status);
4859 f_val = float32_scalbn(f_val, -15, status);
4864 static inline float64 float64_from_q32(int32_t a, float_status *status)
4868 /* conversion as integer and scaling */
4869 f_val = int32_to_float64(a, status);
4870 f_val = float64_scalbn(f_val, -31, status);
4875 static inline int16_t float32_to_q16(float32 a, float_status *status)
4878 int32_t q_min = 0xffff8000;
4879 int32_t q_max = 0x00007fff;
4883 if (float32_is_any_nan(a)) {
4884 float_raise(float_flag_invalid, status);
4889 a = float32_scalbn(a, 15, status);
4891 ieee_ex = get_float_exception_flags(status);
4892 set_float_exception_flags(ieee_ex & (~float_flag_underflow)
4895 if (ieee_ex & float_flag_overflow) {
4896 float_raise(float_flag_inexact, status);
4897 return (int32_t)a < 0 ? q_min : q_max;
4900 /* conversion to int */
4901 q_val = float32_to_int32(a, status);
4903 ieee_ex = get_float_exception_flags(status);
4904 set_float_exception_flags(ieee_ex & (~float_flag_underflow)
4907 if (ieee_ex & float_flag_invalid) {
4908 set_float_exception_flags(ieee_ex & (~float_flag_invalid)
4910 float_raise(float_flag_overflow | float_flag_inexact, status);
4911 return (int32_t)a < 0 ? q_min : q_max;
4914 if (q_val < q_min) {
4915 float_raise(float_flag_overflow | float_flag_inexact, status);
4916 return (int16_t)q_min;
4919 if (q_max < q_val) {
4920 float_raise(float_flag_overflow | float_flag_inexact, status);
4921 return (int16_t)q_max;
4924 return (int16_t)q_val;
4927 static inline int32_t float64_to_q32(float64 a, float_status *status)
4930 int64_t q_min = 0xffffffff80000000LL;
4931 int64_t q_max = 0x000000007fffffffLL;
4935 if (float64_is_any_nan(a)) {
4936 float_raise(float_flag_invalid, status);
4941 a = float64_scalbn(a, 31, status);
4943 ieee_ex = get_float_exception_flags(status);
4944 set_float_exception_flags(ieee_ex & (~float_flag_underflow)
4947 if (ieee_ex & float_flag_overflow) {
4948 float_raise(float_flag_inexact, status);
4949 return (int64_t)a < 0 ? q_min : q_max;
4952 /* conversion to integer */
4953 q_val = float64_to_int64(a, status);
4955 ieee_ex = get_float_exception_flags(status);
4956 set_float_exception_flags(ieee_ex & (~float_flag_underflow)
4959 if (ieee_ex & float_flag_invalid) {
4960 set_float_exception_flags(ieee_ex & (~float_flag_invalid)
4962 float_raise(float_flag_overflow | float_flag_inexact, status);
4963 return (int64_t)a < 0 ? q_min : q_max;
4966 if (q_val < q_min) {
4967 float_raise(float_flag_overflow | float_flag_inexact, status);
4968 return (int32_t)q_min;
4971 if (q_max < q_val) {
4972 float_raise(float_flag_overflow | float_flag_inexact, status);
4973 return (int32_t)q_max;
4976 return (int32_t)q_val;
4979 #define MSA_FLOAT_COND(DEST, OP, ARG1, ARG2, BITS, QUIET) \
4981 float_status *status = &env->active_tc.msa_fp_status; \
4984 set_float_exception_flags(0, status); \
4986 cond = float ## BITS ## _ ## OP(ARG1, ARG2, status); \
4988 cond = float ## BITS ## _ ## OP ## _quiet(ARG1, ARG2, status); \
4990 DEST = cond ? M_MAX_UINT(BITS) : 0; \
4991 c = update_msacsr(env, CLEAR_IS_INEXACT, 0); \
4993 if (get_enabled_exceptions(env, c)) { \
4994 DEST = ((FLOAT_SNAN ## BITS(status) >> 6) << 6) | c; \
4998 #define MSA_FLOAT_AF(DEST, ARG1, ARG2, BITS, QUIET) \
5000 MSA_FLOAT_COND(DEST, eq, ARG1, ARG2, BITS, QUIET); \
5001 if ((DEST & M_MAX_UINT(BITS)) == M_MAX_UINT(BITS)) { \
5006 #define MSA_FLOAT_UEQ(DEST, ARG1, ARG2, BITS, QUIET) \
5008 MSA_FLOAT_COND(DEST, unordered, ARG1, ARG2, BITS, QUIET); \
5010 MSA_FLOAT_COND(DEST, eq, ARG1, ARG2, BITS, QUIET); \
5014 #define MSA_FLOAT_NE(DEST, ARG1, ARG2, BITS, QUIET) \
5016 MSA_FLOAT_COND(DEST, lt, ARG1, ARG2, BITS, QUIET); \
5018 MSA_FLOAT_COND(DEST, lt, ARG2, ARG1, BITS, QUIET); \
5022 #define MSA_FLOAT_UNE(DEST, ARG1, ARG2, BITS, QUIET) \
5024 MSA_FLOAT_COND(DEST, unordered, ARG1, ARG2, BITS, QUIET); \
5026 MSA_FLOAT_COND(DEST, lt, ARG1, ARG2, BITS, QUIET); \
5028 MSA_FLOAT_COND(DEST, lt, ARG2, ARG1, BITS, QUIET); \
5033 #define MSA_FLOAT_ULE(DEST, ARG1, ARG2, BITS, QUIET) \
5035 MSA_FLOAT_COND(DEST, unordered, ARG1, ARG2, BITS, QUIET); \
5037 MSA_FLOAT_COND(DEST, le, ARG1, ARG2, BITS, QUIET); \
5041 #define MSA_FLOAT_ULT(DEST, ARG1, ARG2, BITS, QUIET) \
5043 MSA_FLOAT_COND(DEST, unordered, ARG1, ARG2, BITS, QUIET); \
5045 MSA_FLOAT_COND(DEST, lt, ARG1, ARG2, BITS, QUIET); \
5049 #define MSA_FLOAT_OR(DEST, ARG1, ARG2, BITS, QUIET) \
5051 MSA_FLOAT_COND(DEST, le, ARG1, ARG2, BITS, QUIET); \
5053 MSA_FLOAT_COND(DEST, le, ARG2, ARG1, BITS, QUIET); \
5057 static inline void compare_af(CPUMIPSState *env, wr_t *pwd, wr_t *pws,
5058 wr_t *pwt, uint32_t df, int quiet,
5061 wr_t wx, *pwx = &wx;
5064 clear_msacsr_cause(env);
5068 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5069 MSA_FLOAT_AF(pwx->w[i], pws->w[i], pwt->w[i], 32, quiet);
5073 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5074 MSA_FLOAT_AF(pwx->d[i], pws->d[i], pwt->d[i], 64, quiet);
5081 check_msacsr_cause(env, retaddr);
5083 msa_move_v(pwd, pwx);
5086 static inline void compare_un(CPUMIPSState *env, wr_t *pwd, wr_t *pws,
5087 wr_t *pwt, uint32_t df, int quiet,
5090 wr_t wx, *pwx = &wx;
5093 clear_msacsr_cause(env);
5097 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5098 MSA_FLOAT_COND(pwx->w[i], unordered, pws->w[i], pwt->w[i], 32,
5103 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5104 MSA_FLOAT_COND(pwx->d[i], unordered, pws->d[i], pwt->d[i], 64,
5112 check_msacsr_cause(env, retaddr);
5114 msa_move_v(pwd, pwx);
5117 static inline void compare_eq(CPUMIPSState *env, wr_t *pwd, wr_t *pws,
5118 wr_t *pwt, uint32_t df, int quiet,
5121 wr_t wx, *pwx = &wx;
5124 clear_msacsr_cause(env);
5128 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5129 MSA_FLOAT_COND(pwx->w[i], eq, pws->w[i], pwt->w[i], 32, quiet);
5133 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5134 MSA_FLOAT_COND(pwx->d[i], eq, pws->d[i], pwt->d[i], 64, quiet);
5141 check_msacsr_cause(env, retaddr);
5143 msa_move_v(pwd, pwx);
5146 static inline void compare_ueq(CPUMIPSState *env, wr_t *pwd, wr_t *pws,
5147 wr_t *pwt, uint32_t df, int quiet,
5150 wr_t wx, *pwx = &wx;
5153 clear_msacsr_cause(env);
5157 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5158 MSA_FLOAT_UEQ(pwx->w[i], pws->w[i], pwt->w[i], 32, quiet);
5162 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5163 MSA_FLOAT_UEQ(pwx->d[i], pws->d[i], pwt->d[i], 64, quiet);
5170 check_msacsr_cause(env, retaddr);
5172 msa_move_v(pwd, pwx);
5175 static inline void compare_lt(CPUMIPSState *env, wr_t *pwd, wr_t *pws,
5176 wr_t *pwt, uint32_t df, int quiet,
5179 wr_t wx, *pwx = &wx;
5182 clear_msacsr_cause(env);
5186 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5187 MSA_FLOAT_COND(pwx->w[i], lt, pws->w[i], pwt->w[i], 32, quiet);
5191 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5192 MSA_FLOAT_COND(pwx->d[i], lt, pws->d[i], pwt->d[i], 64, quiet);
5199 check_msacsr_cause(env, retaddr);
5201 msa_move_v(pwd, pwx);
5204 static inline void compare_ult(CPUMIPSState *env, wr_t *pwd, wr_t *pws,
5205 wr_t *pwt, uint32_t df, int quiet,
5208 wr_t wx, *pwx = &wx;
5211 clear_msacsr_cause(env);
5215 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5216 MSA_FLOAT_ULT(pwx->w[i], pws->w[i], pwt->w[i], 32, quiet);
5220 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5221 MSA_FLOAT_ULT(pwx->d[i], pws->d[i], pwt->d[i], 64, quiet);
5228 check_msacsr_cause(env, retaddr);
5230 msa_move_v(pwd, pwx);
5233 static inline void compare_le(CPUMIPSState *env, wr_t *pwd, wr_t *pws,
5234 wr_t *pwt, uint32_t df, int quiet,
5237 wr_t wx, *pwx = &wx;
5240 clear_msacsr_cause(env);
5244 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5245 MSA_FLOAT_COND(pwx->w[i], le, pws->w[i], pwt->w[i], 32, quiet);
5249 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5250 MSA_FLOAT_COND(pwx->d[i], le, pws->d[i], pwt->d[i], 64, quiet);
5257 check_msacsr_cause(env, retaddr);
5259 msa_move_v(pwd, pwx);
5262 static inline void compare_ule(CPUMIPSState *env, wr_t *pwd, wr_t *pws,
5263 wr_t *pwt, uint32_t df, int quiet,
5266 wr_t wx, *pwx = &wx;
5269 clear_msacsr_cause(env);
5273 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5274 MSA_FLOAT_ULE(pwx->w[i], pws->w[i], pwt->w[i], 32, quiet);
5278 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5279 MSA_FLOAT_ULE(pwx->d[i], pws->d[i], pwt->d[i], 64, quiet);
5286 check_msacsr_cause(env, retaddr);
5288 msa_move_v(pwd, pwx);
5291 static inline void compare_or(CPUMIPSState *env, wr_t *pwd, wr_t *pws,
5292 wr_t *pwt, uint32_t df, int quiet,
5295 wr_t wx, *pwx = &wx;
5298 clear_msacsr_cause(env);
5302 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5303 MSA_FLOAT_OR(pwx->w[i], pws->w[i], pwt->w[i], 32, quiet);
5307 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5308 MSA_FLOAT_OR(pwx->d[i], pws->d[i], pwt->d[i], 64, quiet);
5315 check_msacsr_cause(env, retaddr);
5317 msa_move_v(pwd, pwx);
5320 static inline void compare_une(CPUMIPSState *env, wr_t *pwd, wr_t *pws,
5321 wr_t *pwt, uint32_t df, int quiet,
5324 wr_t wx, *pwx = &wx;
5327 clear_msacsr_cause(env);
5331 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5332 MSA_FLOAT_UNE(pwx->w[i], pws->w[i], pwt->w[i], 32, quiet);
5336 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5337 MSA_FLOAT_UNE(pwx->d[i], pws->d[i], pwt->d[i], 64, quiet);
5344 check_msacsr_cause(env, retaddr);
5346 msa_move_v(pwd, pwx);
5349 static inline void compare_ne(CPUMIPSState *env, wr_t *pwd, wr_t *pws,
5350 wr_t *pwt, uint32_t df, int quiet,
5353 wr_t wx, *pwx = &wx;
5356 clear_msacsr_cause(env);
5360 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5361 MSA_FLOAT_NE(pwx->w[i], pws->w[i], pwt->w[i], 32, quiet);
5365 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5366 MSA_FLOAT_NE(pwx->d[i], pws->d[i], pwt->d[i], 64, quiet);
5373 check_msacsr_cause(env, retaddr);
5375 msa_move_v(pwd, pwx);
5378 void helper_msa_fcaf_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5379 uint32_t ws, uint32_t wt)
5381 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5382 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5383 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5384 compare_af(env, pwd, pws, pwt, df, 1, GETPC());
5387 void helper_msa_fcun_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5388 uint32_t ws, uint32_t wt)
5390 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5391 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5392 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5393 compare_un(env, pwd, pws, pwt, df, 1, GETPC());
5396 void helper_msa_fceq_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5397 uint32_t ws, uint32_t wt)
5399 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5400 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5401 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5402 compare_eq(env, pwd, pws, pwt, df, 1, GETPC());
5405 void helper_msa_fcueq_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5406 uint32_t ws, uint32_t wt)
5408 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5409 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5410 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5411 compare_ueq(env, pwd, pws, pwt, df, 1, GETPC());
5414 void helper_msa_fclt_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5415 uint32_t ws, uint32_t wt)
5417 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5418 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5419 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5420 compare_lt(env, pwd, pws, pwt, df, 1, GETPC());
5423 void helper_msa_fcult_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5424 uint32_t ws, uint32_t wt)
5426 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5427 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5428 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5429 compare_ult(env, pwd, pws, pwt, df, 1, GETPC());
5432 void helper_msa_fcle_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5433 uint32_t ws, uint32_t wt)
5435 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5436 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5437 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5438 compare_le(env, pwd, pws, pwt, df, 1, GETPC());
5441 void helper_msa_fcule_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5442 uint32_t ws, uint32_t wt)
5444 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5445 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5446 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5447 compare_ule(env, pwd, pws, pwt, df, 1, GETPC());
5450 void helper_msa_fsaf_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5451 uint32_t ws, uint32_t wt)
5453 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5454 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5455 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5456 compare_af(env, pwd, pws, pwt, df, 0, GETPC());
5459 void helper_msa_fsun_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5460 uint32_t ws, uint32_t wt)
5462 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5463 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5464 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5465 compare_un(env, pwd, pws, pwt, df, 0, GETPC());
5468 void helper_msa_fseq_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5469 uint32_t ws, uint32_t wt)
5471 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5472 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5473 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5474 compare_eq(env, pwd, pws, pwt, df, 0, GETPC());
5477 void helper_msa_fsueq_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5478 uint32_t ws, uint32_t wt)
5480 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5481 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5482 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5483 compare_ueq(env, pwd, pws, pwt, df, 0, GETPC());
5486 void helper_msa_fslt_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5487 uint32_t ws, uint32_t wt)
5489 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5490 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5491 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5492 compare_lt(env, pwd, pws, pwt, df, 0, GETPC());
5495 void helper_msa_fsult_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5496 uint32_t ws, uint32_t wt)
5498 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5499 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5500 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5501 compare_ult(env, pwd, pws, pwt, df, 0, GETPC());
5504 void helper_msa_fsle_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5505 uint32_t ws, uint32_t wt)
5507 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5508 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5509 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5510 compare_le(env, pwd, pws, pwt, df, 0, GETPC());
5513 void helper_msa_fsule_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5514 uint32_t ws, uint32_t wt)
5516 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5517 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5518 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5519 compare_ule(env, pwd, pws, pwt, df, 0, GETPC());
5522 void helper_msa_fcor_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5523 uint32_t ws, uint32_t wt)
5525 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5526 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5527 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5528 compare_or(env, pwd, pws, pwt, df, 1, GETPC());
5531 void helper_msa_fcune_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5532 uint32_t ws, uint32_t wt)
5534 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5535 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5536 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5537 compare_une(env, pwd, pws, pwt, df, 1, GETPC());
5540 void helper_msa_fcne_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5541 uint32_t ws, uint32_t wt)
5543 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5544 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5545 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5546 compare_ne(env, pwd, pws, pwt, df, 1, GETPC());
5549 void helper_msa_fsor_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5550 uint32_t ws, uint32_t wt)
5552 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5553 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5554 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5555 compare_or(env, pwd, pws, pwt, df, 0, GETPC());
5558 void helper_msa_fsune_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5559 uint32_t ws, uint32_t wt)
5561 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5562 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5563 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5564 compare_une(env, pwd, pws, pwt, df, 0, GETPC());
5567 void helper_msa_fsne_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5568 uint32_t ws, uint32_t wt)
5570 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5571 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5572 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5573 compare_ne(env, pwd, pws, pwt, df, 0, GETPC());
5576 #define float16_is_zero(ARG) 0
5577 #define float16_is_zero_or_denormal(ARG) 0
5579 #define IS_DENORMAL(ARG, BITS) \
5580 (!float ## BITS ## _is_zero(ARG) \
5581 && float ## BITS ## _is_zero_or_denormal(ARG))
5583 #define MSA_FLOAT_BINOP(DEST, OP, ARG1, ARG2, BITS) \
5585 float_status *status = &env->active_tc.msa_fp_status; \
5588 set_float_exception_flags(0, status); \
5589 DEST = float ## BITS ## _ ## OP(ARG1, ARG2, status); \
5590 c = update_msacsr(env, 0, IS_DENORMAL(DEST, BITS)); \
5592 if (get_enabled_exceptions(env, c)) { \
5593 DEST = ((FLOAT_SNAN ## BITS(status) >> 6) << 6) | c; \
5597 void helper_msa_fadd_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5598 uint32_t ws, uint32_t wt)
5600 wr_t wx, *pwx = &wx;
5601 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5602 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5603 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5606 clear_msacsr_cause(env);
5610 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5611 MSA_FLOAT_BINOP(pwx->w[i], add, pws->w[i], pwt->w[i], 32);
5615 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5616 MSA_FLOAT_BINOP(pwx->d[i], add, pws->d[i], pwt->d[i], 64);
5623 check_msacsr_cause(env, GETPC());
5624 msa_move_v(pwd, pwx);
5627 void helper_msa_fsub_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5628 uint32_t ws, uint32_t wt)
5630 wr_t wx, *pwx = &wx;
5631 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5632 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5633 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5636 clear_msacsr_cause(env);
5640 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5641 MSA_FLOAT_BINOP(pwx->w[i], sub, pws->w[i], pwt->w[i], 32);
5645 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5646 MSA_FLOAT_BINOP(pwx->d[i], sub, pws->d[i], pwt->d[i], 64);
5653 check_msacsr_cause(env, GETPC());
5654 msa_move_v(pwd, pwx);
5657 void helper_msa_fmul_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5658 uint32_t ws, uint32_t wt)
5660 wr_t wx, *pwx = &wx;
5661 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5662 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5663 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5666 clear_msacsr_cause(env);
5670 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5671 MSA_FLOAT_BINOP(pwx->w[i], mul, pws->w[i], pwt->w[i], 32);
5675 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5676 MSA_FLOAT_BINOP(pwx->d[i], mul, pws->d[i], pwt->d[i], 64);
5683 check_msacsr_cause(env, GETPC());
5685 msa_move_v(pwd, pwx);
5688 void helper_msa_fdiv_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5689 uint32_t ws, uint32_t wt)
5691 wr_t wx, *pwx = &wx;
5692 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5693 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5694 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5697 clear_msacsr_cause(env);
5701 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5702 MSA_FLOAT_BINOP(pwx->w[i], div, pws->w[i], pwt->w[i], 32);
5706 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5707 MSA_FLOAT_BINOP(pwx->d[i], div, pws->d[i], pwt->d[i], 64);
5714 check_msacsr_cause(env, GETPC());
5716 msa_move_v(pwd, pwx);
5719 #define MSA_FLOAT_MULADD(DEST, ARG1, ARG2, ARG3, NEGATE, BITS) \
5721 float_status *status = &env->active_tc.msa_fp_status; \
5724 set_float_exception_flags(0, status); \
5725 DEST = float ## BITS ## _muladd(ARG2, ARG3, ARG1, NEGATE, status); \
5726 c = update_msacsr(env, 0, IS_DENORMAL(DEST, BITS)); \
5728 if (get_enabled_exceptions(env, c)) { \
5729 DEST = ((FLOAT_SNAN ## BITS(status) >> 6) << 6) | c; \
5733 void helper_msa_fmadd_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5734 uint32_t ws, uint32_t wt)
5736 wr_t wx, *pwx = &wx;
5737 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5738 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5739 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5742 clear_msacsr_cause(env);
5746 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5747 MSA_FLOAT_MULADD(pwx->w[i], pwd->w[i],
5748 pws->w[i], pwt->w[i], 0, 32);
5752 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5753 MSA_FLOAT_MULADD(pwx->d[i], pwd->d[i],
5754 pws->d[i], pwt->d[i], 0, 64);
5761 check_msacsr_cause(env, GETPC());
5763 msa_move_v(pwd, pwx);
5766 void helper_msa_fmsub_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5767 uint32_t ws, uint32_t wt)
5769 wr_t wx, *pwx = &wx;
5770 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5771 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5772 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5775 clear_msacsr_cause(env);
5779 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5780 MSA_FLOAT_MULADD(pwx->w[i], pwd->w[i],
5781 pws->w[i], pwt->w[i],
5782 float_muladd_negate_product, 32);
5786 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5787 MSA_FLOAT_MULADD(pwx->d[i], pwd->d[i],
5788 pws->d[i], pwt->d[i],
5789 float_muladd_negate_product, 64);
5796 check_msacsr_cause(env, GETPC());
5798 msa_move_v(pwd, pwx);
5801 void helper_msa_fexp2_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5802 uint32_t ws, uint32_t wt)
5804 wr_t wx, *pwx = &wx;
5805 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5806 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5807 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5810 clear_msacsr_cause(env);
5814 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5815 MSA_FLOAT_BINOP(pwx->w[i], scalbn, pws->w[i],
5816 pwt->w[i] > 0x200 ? 0x200 :
5817 pwt->w[i] < -0x200 ? -0x200 : pwt->w[i],
5822 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5823 MSA_FLOAT_BINOP(pwx->d[i], scalbn, pws->d[i],
5824 pwt->d[i] > 0x1000 ? 0x1000 :
5825 pwt->d[i] < -0x1000 ? -0x1000 : pwt->d[i],
5833 check_msacsr_cause(env, GETPC());
5835 msa_move_v(pwd, pwx);
5838 #define MSA_FLOAT_UNOP(DEST, OP, ARG, BITS) \
5840 float_status *status = &env->active_tc.msa_fp_status; \
5843 set_float_exception_flags(0, status); \
5844 DEST = float ## BITS ## _ ## OP(ARG, status); \
5845 c = update_msacsr(env, 0, IS_DENORMAL(DEST, BITS)); \
5847 if (get_enabled_exceptions(env, c)) { \
5848 DEST = ((FLOAT_SNAN ## BITS(status) >> 6) << 6) | c; \
5852 void helper_msa_fexdo_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5853 uint32_t ws, uint32_t wt)
5855 wr_t wx, *pwx = &wx;
5856 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5857 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5858 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5861 clear_msacsr_cause(env);
5865 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5867 * Half precision floats come in two formats: standard
5868 * IEEE and "ARM" format. The latter gains extra exponent
5869 * range by omitting the NaN/Inf encodings.
5873 MSA_FLOAT_BINOP(Lh(pwx, i), from_float32, pws->w[i], ieee, 16);
5874 MSA_FLOAT_BINOP(Rh(pwx, i), from_float32, pwt->w[i], ieee, 16);
5878 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5879 MSA_FLOAT_UNOP(Lw(pwx, i), from_float64, pws->d[i], 32);
5880 MSA_FLOAT_UNOP(Rw(pwx, i), from_float64, pwt->d[i], 32);
5887 check_msacsr_cause(env, GETPC());
5888 msa_move_v(pwd, pwx);
5891 #define MSA_FLOAT_UNOP_XD(DEST, OP, ARG, BITS, XBITS) \
5893 float_status *status = &env->active_tc.msa_fp_status; \
5896 set_float_exception_flags(0, status); \
5897 DEST = float ## BITS ## _ ## OP(ARG, status); \
5898 c = update_msacsr(env, CLEAR_FS_UNDERFLOW, 0); \
5900 if (get_enabled_exceptions(env, c)) { \
5901 DEST = ((FLOAT_SNAN ## XBITS(status) >> 6) << 6) | c; \
5905 void helper_msa_ftq_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5906 uint32_t ws, uint32_t wt)
5908 wr_t wx, *pwx = &wx;
5909 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5910 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5911 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5914 clear_msacsr_cause(env);
5918 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
5919 MSA_FLOAT_UNOP_XD(Lh(pwx, i), to_q16, pws->w[i], 32, 16);
5920 MSA_FLOAT_UNOP_XD(Rh(pwx, i), to_q16, pwt->w[i], 32, 16);
5924 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
5925 MSA_FLOAT_UNOP_XD(Lw(pwx, i), to_q32, pws->d[i], 64, 32);
5926 MSA_FLOAT_UNOP_XD(Rw(pwx, i), to_q32, pwt->d[i], 64, 32);
5933 check_msacsr_cause(env, GETPC());
5935 msa_move_v(pwd, pwx);
5938 #define NUMBER_QNAN_PAIR(ARG1, ARG2, BITS, STATUS) \
5939 !float ## BITS ## _is_any_nan(ARG1) \
5940 && float ## BITS ## _is_quiet_nan(ARG2, STATUS)
5942 #define MSA_FLOAT_MAXOP(DEST, OP, ARG1, ARG2, BITS) \
5944 float_status *status = &env->active_tc.msa_fp_status; \
5947 set_float_exception_flags(0, status); \
5948 DEST = float ## BITS ## _ ## OP(ARG1, ARG2, status); \
5949 c = update_msacsr(env, 0, 0); \
5951 if (get_enabled_exceptions(env, c)) { \
5952 DEST = ((FLOAT_SNAN ## BITS(status) >> 6) << 6) | c; \
5956 #define FMAXMIN_A(F, G, X, _S, _T, BITS, STATUS) \
5958 uint## BITS ##_t S = _S, T = _T; \
5959 uint## BITS ##_t as, at, xs, xt, xd; \
5960 if (NUMBER_QNAN_PAIR(S, T, BITS, STATUS)) { \
5963 else if (NUMBER_QNAN_PAIR(T, S, BITS, STATUS)) { \
5966 as = float## BITS ##_abs(S); \
5967 at = float## BITS ##_abs(T); \
5968 MSA_FLOAT_MAXOP(xs, F, S, T, BITS); \
5969 MSA_FLOAT_MAXOP(xt, G, S, T, BITS); \
5970 MSA_FLOAT_MAXOP(xd, F, as, at, BITS); \
5971 X = (as == at || xd == float## BITS ##_abs(xs)) ? xs : xt; \
5974 void helper_msa_fmin_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
5975 uint32_t ws, uint32_t wt)
5977 float_status *status = &env->active_tc.msa_fp_status;
5978 wr_t wx, *pwx = &wx;
5979 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
5980 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
5981 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
5983 clear_msacsr_cause(env);
5985 if (df == DF_WORD) {
5987 if (NUMBER_QNAN_PAIR(pws->w[0], pwt->w[0], 32, status)) {
5988 MSA_FLOAT_MAXOP(pwx->w[0], min, pws->w[0], pws->w[0], 32);
5989 } else if (NUMBER_QNAN_PAIR(pwt->w[0], pws->w[0], 32, status)) {
5990 MSA_FLOAT_MAXOP(pwx->w[0], min, pwt->w[0], pwt->w[0], 32);
5992 MSA_FLOAT_MAXOP(pwx->w[0], min, pws->w[0], pwt->w[0], 32);
5995 if (NUMBER_QNAN_PAIR(pws->w[1], pwt->w[1], 32, status)) {
5996 MSA_FLOAT_MAXOP(pwx->w[1], min, pws->w[1], pws->w[1], 32);
5997 } else if (NUMBER_QNAN_PAIR(pwt->w[1], pws->w[1], 32, status)) {
5998 MSA_FLOAT_MAXOP(pwx->w[1], min, pwt->w[1], pwt->w[1], 32);
6000 MSA_FLOAT_MAXOP(pwx->w[1], min, pws->w[1], pwt->w[1], 32);
6003 if (NUMBER_QNAN_PAIR(pws->w[2], pwt->w[2], 32, status)) {
6004 MSA_FLOAT_MAXOP(pwx->w[2], min, pws->w[2], pws->w[2], 32);
6005 } else if (NUMBER_QNAN_PAIR(pwt->w[2], pws->w[2], 32, status)) {
6006 MSA_FLOAT_MAXOP(pwx->w[2], min, pwt->w[2], pwt->w[2], 32);
6008 MSA_FLOAT_MAXOP(pwx->w[2], min, pws->w[2], pwt->w[2], 32);
6011 if (NUMBER_QNAN_PAIR(pws->w[3], pwt->w[3], 32, status)) {
6012 MSA_FLOAT_MAXOP(pwx->w[3], min, pws->w[3], pws->w[3], 32);
6013 } else if (NUMBER_QNAN_PAIR(pwt->w[3], pws->w[3], 32, status)) {
6014 MSA_FLOAT_MAXOP(pwx->w[3], min, pwt->w[3], pwt->w[3], 32);
6016 MSA_FLOAT_MAXOP(pwx->w[3], min, pws->w[3], pwt->w[3], 32);
6019 } else if (df == DF_DOUBLE) {
6021 if (NUMBER_QNAN_PAIR(pws->d[0], pwt->d[0], 64, status)) {
6022 MSA_FLOAT_MAXOP(pwx->d[0], min, pws->d[0], pws->d[0], 64);
6023 } else if (NUMBER_QNAN_PAIR(pwt->d[0], pws->d[0], 64, status)) {
6024 MSA_FLOAT_MAXOP(pwx->d[0], min, pwt->d[0], pwt->d[0], 64);
6026 MSA_FLOAT_MAXOP(pwx->d[0], min, pws->d[0], pwt->d[0], 64);
6029 if (NUMBER_QNAN_PAIR(pws->d[1], pwt->d[1], 64, status)) {
6030 MSA_FLOAT_MAXOP(pwx->d[1], min, pws->d[1], pws->d[1], 64);
6031 } else if (NUMBER_QNAN_PAIR(pwt->d[1], pws->d[1], 64, status)) {
6032 MSA_FLOAT_MAXOP(pwx->d[1], min, pwt->d[1], pwt->d[1], 64);
6034 MSA_FLOAT_MAXOP(pwx->d[1], min, pws->d[1], pwt->d[1], 64);
6043 check_msacsr_cause(env, GETPC());
6045 msa_move_v(pwd, pwx);
6048 void helper_msa_fmin_a_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
6049 uint32_t ws, uint32_t wt)
6051 float_status *status = &env->active_tc.msa_fp_status;
6052 wr_t wx, *pwx = &wx;
6053 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
6054 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
6055 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
6057 clear_msacsr_cause(env);
6059 if (df == DF_WORD) {
6060 FMAXMIN_A(min, max, pwx->w[0], pws->w[0], pwt->w[0], 32, status);
6061 FMAXMIN_A(min, max, pwx->w[1], pws->w[1], pwt->w[1], 32, status);
6062 FMAXMIN_A(min, max, pwx->w[2], pws->w[2], pwt->w[2], 32, status);
6063 FMAXMIN_A(min, max, pwx->w[3], pws->w[3], pwt->w[3], 32, status);
6064 } else if (df == DF_DOUBLE) {
6065 FMAXMIN_A(min, max, pwx->d[0], pws->d[0], pwt->d[0], 64, status);
6066 FMAXMIN_A(min, max, pwx->d[1], pws->d[1], pwt->d[1], 64, status);
6071 check_msacsr_cause(env, GETPC());
6073 msa_move_v(pwd, pwx);
6076 void helper_msa_fmax_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
6077 uint32_t ws, uint32_t wt)
6079 float_status *status = &env->active_tc.msa_fp_status;
6080 wr_t wx, *pwx = &wx;
6081 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
6082 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
6083 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
6085 clear_msacsr_cause(env);
6087 if (df == DF_WORD) {
6089 if (NUMBER_QNAN_PAIR(pws->w[0], pwt->w[0], 32, status)) {
6090 MSA_FLOAT_MAXOP(pwx->w[0], max, pws->w[0], pws->w[0], 32);
6091 } else if (NUMBER_QNAN_PAIR(pwt->w[0], pws->w[0], 32, status)) {
6092 MSA_FLOAT_MAXOP(pwx->w[0], max, pwt->w[0], pwt->w[0], 32);
6094 MSA_FLOAT_MAXOP(pwx->w[0], max, pws->w[0], pwt->w[0], 32);
6097 if (NUMBER_QNAN_PAIR(pws->w[1], pwt->w[1], 32, status)) {
6098 MSA_FLOAT_MAXOP(pwx->w[1], max, pws->w[1], pws->w[1], 32);
6099 } else if (NUMBER_QNAN_PAIR(pwt->w[1], pws->w[1], 32, status)) {
6100 MSA_FLOAT_MAXOP(pwx->w[1], max, pwt->w[1], pwt->w[1], 32);
6102 MSA_FLOAT_MAXOP(pwx->w[1], max, pws->w[1], pwt->w[1], 32);
6105 if (NUMBER_QNAN_PAIR(pws->w[2], pwt->w[2], 32, status)) {
6106 MSA_FLOAT_MAXOP(pwx->w[2], max, pws->w[2], pws->w[2], 32);
6107 } else if (NUMBER_QNAN_PAIR(pwt->w[2], pws->w[2], 32, status)) {
6108 MSA_FLOAT_MAXOP(pwx->w[2], max, pwt->w[2], pwt->w[2], 32);
6110 MSA_FLOAT_MAXOP(pwx->w[2], max, pws->w[2], pwt->w[2], 32);
6113 if (NUMBER_QNAN_PAIR(pws->w[3], pwt->w[3], 32, status)) {
6114 MSA_FLOAT_MAXOP(pwx->w[3], max, pws->w[3], pws->w[3], 32);
6115 } else if (NUMBER_QNAN_PAIR(pwt->w[3], pws->w[3], 32, status)) {
6116 MSA_FLOAT_MAXOP(pwx->w[3], max, pwt->w[3], pwt->w[3], 32);
6118 MSA_FLOAT_MAXOP(pwx->w[3], max, pws->w[3], pwt->w[3], 32);
6121 } else if (df == DF_DOUBLE) {
6123 if (NUMBER_QNAN_PAIR(pws->d[0], pwt->d[0], 64, status)) {
6124 MSA_FLOAT_MAXOP(pwx->d[0], max, pws->d[0], pws->d[0], 64);
6125 } else if (NUMBER_QNAN_PAIR(pwt->d[0], pws->d[0], 64, status)) {
6126 MSA_FLOAT_MAXOP(pwx->d[0], max, pwt->d[0], pwt->d[0], 64);
6128 MSA_FLOAT_MAXOP(pwx->d[0], max, pws->d[0], pwt->d[0], 64);
6131 if (NUMBER_QNAN_PAIR(pws->d[1], pwt->d[1], 64, status)) {
6132 MSA_FLOAT_MAXOP(pwx->d[1], max, pws->d[1], pws->d[1], 64);
6133 } else if (NUMBER_QNAN_PAIR(pwt->d[1], pws->d[1], 64, status)) {
6134 MSA_FLOAT_MAXOP(pwx->d[1], max, pwt->d[1], pwt->d[1], 64);
6136 MSA_FLOAT_MAXOP(pwx->d[1], max, pws->d[1], pwt->d[1], 64);
6145 check_msacsr_cause(env, GETPC());
6147 msa_move_v(pwd, pwx);
6150 void helper_msa_fmax_a_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
6151 uint32_t ws, uint32_t wt)
6153 float_status *status = &env->active_tc.msa_fp_status;
6154 wr_t wx, *pwx = &wx;
6155 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
6156 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
6157 wr_t *pwt = &(env->active_fpu.fpr[wt].wr);
6159 clear_msacsr_cause(env);
6161 if (df == DF_WORD) {
6162 FMAXMIN_A(max, min, pwx->w[0], pws->w[0], pwt->w[0], 32, status);
6163 FMAXMIN_A(max, min, pwx->w[1], pws->w[1], pwt->w[1], 32, status);
6164 FMAXMIN_A(max, min, pwx->w[2], pws->w[2], pwt->w[2], 32, status);
6165 FMAXMIN_A(max, min, pwx->w[3], pws->w[3], pwt->w[3], 32, status);
6166 } else if (df == DF_DOUBLE) {
6167 FMAXMIN_A(max, min, pwx->d[0], pws->d[0], pwt->d[0], 64, status);
6168 FMAXMIN_A(max, min, pwx->d[1], pws->d[1], pwt->d[1], 64, status);
6173 check_msacsr_cause(env, GETPC());
6175 msa_move_v(pwd, pwx);
6178 void helper_msa_fclass_df(CPUMIPSState *env, uint32_t df,
6179 uint32_t wd, uint32_t ws)
6181 float_status *status = &env->active_tc.msa_fp_status;
6183 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
6184 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
6185 if (df == DF_WORD) {
6186 pwd->w[0] = float_class_s(pws->w[0], status);
6187 pwd->w[1] = float_class_s(pws->w[1], status);
6188 pwd->w[2] = float_class_s(pws->w[2], status);
6189 pwd->w[3] = float_class_s(pws->w[3], status);
6190 } else if (df == DF_DOUBLE) {
6191 pwd->d[0] = float_class_d(pws->d[0], status);
6192 pwd->d[1] = float_class_d(pws->d[1], status);
6198 #define MSA_FLOAT_UNOP0(DEST, OP, ARG, BITS) \
6200 float_status *status = &env->active_tc.msa_fp_status; \
6203 set_float_exception_flags(0, status); \
6204 DEST = float ## BITS ## _ ## OP(ARG, status); \
6205 c = update_msacsr(env, CLEAR_FS_UNDERFLOW, 0); \
6207 if (get_enabled_exceptions(env, c)) { \
6208 DEST = ((FLOAT_SNAN ## BITS(status) >> 6) << 6) | c; \
6209 } else if (float ## BITS ## _is_any_nan(ARG)) { \
6214 void helper_msa_ftrunc_s_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
6217 wr_t wx, *pwx = &wx;
6218 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
6219 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
6222 clear_msacsr_cause(env);
6226 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
6227 MSA_FLOAT_UNOP0(pwx->w[i], to_int32_round_to_zero, pws->w[i], 32);
6231 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
6232 MSA_FLOAT_UNOP0(pwx->d[i], to_int64_round_to_zero, pws->d[i], 64);
6239 check_msacsr_cause(env, GETPC());
6241 msa_move_v(pwd, pwx);
6244 void helper_msa_ftrunc_u_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
6247 wr_t wx, *pwx = &wx;
6248 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
6249 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
6252 clear_msacsr_cause(env);
6256 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
6257 MSA_FLOAT_UNOP0(pwx->w[i], to_uint32_round_to_zero, pws->w[i], 32);
6261 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
6262 MSA_FLOAT_UNOP0(pwx->d[i], to_uint64_round_to_zero, pws->d[i], 64);
6269 check_msacsr_cause(env, GETPC());
6271 msa_move_v(pwd, pwx);
6274 void helper_msa_fsqrt_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
6277 wr_t wx, *pwx = &wx;
6278 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
6279 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
6282 clear_msacsr_cause(env);
6286 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
6287 MSA_FLOAT_UNOP(pwx->w[i], sqrt, pws->w[i], 32);
6291 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
6292 MSA_FLOAT_UNOP(pwx->d[i], sqrt, pws->d[i], 64);
6299 check_msacsr_cause(env, GETPC());
6301 msa_move_v(pwd, pwx);
6304 #define MSA_FLOAT_RECIPROCAL(DEST, ARG, BITS) \
6306 float_status *status = &env->active_tc.msa_fp_status; \
6309 set_float_exception_flags(0, status); \
6310 DEST = float ## BITS ## _ ## div(FLOAT_ONE ## BITS, ARG, status); \
6311 c = update_msacsr(env, float ## BITS ## _is_infinity(ARG) || \
6312 float ## BITS ## _is_quiet_nan(DEST, status) ? \
6313 0 : RECIPROCAL_INEXACT, \
6314 IS_DENORMAL(DEST, BITS)); \
6316 if (get_enabled_exceptions(env, c)) { \
6317 DEST = ((FLOAT_SNAN ## BITS(status) >> 6) << 6) | c; \
6321 void helper_msa_frsqrt_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
6324 wr_t wx, *pwx = &wx;
6325 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
6326 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
6329 clear_msacsr_cause(env);
6333 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
6334 MSA_FLOAT_RECIPROCAL(pwx->w[i], float32_sqrt(pws->w[i],
6335 &env->active_tc.msa_fp_status), 32);
6339 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
6340 MSA_FLOAT_RECIPROCAL(pwx->d[i], float64_sqrt(pws->d[i],
6341 &env->active_tc.msa_fp_status), 64);
6348 check_msacsr_cause(env, GETPC());
6350 msa_move_v(pwd, pwx);
6353 void helper_msa_frcp_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
6356 wr_t wx, *pwx = &wx;
6357 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
6358 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
6361 clear_msacsr_cause(env);
6365 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
6366 MSA_FLOAT_RECIPROCAL(pwx->w[i], pws->w[i], 32);
6370 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
6371 MSA_FLOAT_RECIPROCAL(pwx->d[i], pws->d[i], 64);
6378 check_msacsr_cause(env, GETPC());
6380 msa_move_v(pwd, pwx);
6383 void helper_msa_frint_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
6386 wr_t wx, *pwx = &wx;
6387 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
6388 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
6391 clear_msacsr_cause(env);
6395 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
6396 MSA_FLOAT_UNOP(pwx->w[i], round_to_int, pws->w[i], 32);
6400 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
6401 MSA_FLOAT_UNOP(pwx->d[i], round_to_int, pws->d[i], 64);
6408 check_msacsr_cause(env, GETPC());
6410 msa_move_v(pwd, pwx);
6413 #define MSA_FLOAT_LOGB(DEST, ARG, BITS) \
6415 float_status *status = &env->active_tc.msa_fp_status; \
6418 set_float_exception_flags(0, status); \
6419 set_float_rounding_mode(float_round_down, status); \
6420 DEST = float ## BITS ## _ ## log2(ARG, status); \
6421 DEST = float ## BITS ## _ ## round_to_int(DEST, status); \
6422 set_float_rounding_mode(ieee_rm[(env->active_tc.msacsr & \
6423 MSACSR_RM_MASK) >> MSACSR_RM], \
6426 set_float_exception_flags(get_float_exception_flags(status) & \
6427 (~float_flag_inexact), \
6430 c = update_msacsr(env, 0, IS_DENORMAL(DEST, BITS)); \
6432 if (get_enabled_exceptions(env, c)) { \
6433 DEST = ((FLOAT_SNAN ## BITS(status) >> 6) << 6) | c; \
6437 void helper_msa_flog2_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
6440 wr_t wx, *pwx = &wx;
6441 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
6442 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
6445 clear_msacsr_cause(env);
6449 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
6450 MSA_FLOAT_LOGB(pwx->w[i], pws->w[i], 32);
6454 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
6455 MSA_FLOAT_LOGB(pwx->d[i], pws->d[i], 64);
6462 check_msacsr_cause(env, GETPC());
6464 msa_move_v(pwd, pwx);
6467 void helper_msa_fexupl_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
6470 wr_t wx, *pwx = &wx;
6471 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
6472 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
6475 clear_msacsr_cause(env);
6479 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
6481 * Half precision floats come in two formats: standard
6482 * IEEE and "ARM" format. The latter gains extra exponent
6483 * range by omitting the NaN/Inf encodings.
6487 MSA_FLOAT_BINOP(pwx->w[i], from_float16, Lh(pws, i), ieee, 32);
6491 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
6492 MSA_FLOAT_UNOP(pwx->d[i], from_float32, Lw(pws, i), 64);
6499 check_msacsr_cause(env, GETPC());
6500 msa_move_v(pwd, pwx);
6503 void helper_msa_fexupr_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
6506 wr_t wx, *pwx = &wx;
6507 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
6508 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
6511 clear_msacsr_cause(env);
6515 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
6517 * Half precision floats come in two formats: standard
6518 * IEEE and "ARM" format. The latter gains extra exponent
6519 * range by omitting the NaN/Inf encodings.
6523 MSA_FLOAT_BINOP(pwx->w[i], from_float16, Rh(pws, i), ieee, 32);
6527 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
6528 MSA_FLOAT_UNOP(pwx->d[i], from_float32, Rw(pws, i), 64);
6535 check_msacsr_cause(env, GETPC());
6536 msa_move_v(pwd, pwx);
6539 void helper_msa_ffql_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
6542 wr_t wx, *pwx = &wx;
6543 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
6544 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
6549 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
6550 MSA_FLOAT_UNOP(pwx->w[i], from_q16, Lh(pws, i), 32);
6554 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
6555 MSA_FLOAT_UNOP(pwx->d[i], from_q32, Lw(pws, i), 64);
6562 msa_move_v(pwd, pwx);
6565 void helper_msa_ffqr_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
6568 wr_t wx, *pwx = &wx;
6569 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
6570 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
6575 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
6576 MSA_FLOAT_UNOP(pwx->w[i], from_q16, Rh(pws, i), 32);
6580 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
6581 MSA_FLOAT_UNOP(pwx->d[i], from_q32, Rw(pws, i), 64);
6588 msa_move_v(pwd, pwx);
6591 void helper_msa_ftint_s_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
6594 wr_t wx, *pwx = &wx;
6595 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
6596 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
6599 clear_msacsr_cause(env);
6603 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
6604 MSA_FLOAT_UNOP0(pwx->w[i], to_int32, pws->w[i], 32);
6608 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
6609 MSA_FLOAT_UNOP0(pwx->d[i], to_int64, pws->d[i], 64);
6616 check_msacsr_cause(env, GETPC());
6618 msa_move_v(pwd, pwx);
6621 void helper_msa_ftint_u_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
6624 wr_t wx, *pwx = &wx;
6625 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
6626 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
6629 clear_msacsr_cause(env);
6633 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
6634 MSA_FLOAT_UNOP0(pwx->w[i], to_uint32, pws->w[i], 32);
6638 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
6639 MSA_FLOAT_UNOP0(pwx->d[i], to_uint64, pws->d[i], 64);
6646 check_msacsr_cause(env, GETPC());
6648 msa_move_v(pwd, pwx);
6651 #define float32_from_int32 int32_to_float32
6652 #define float32_from_uint32 uint32_to_float32
6654 #define float64_from_int64 int64_to_float64
6655 #define float64_from_uint64 uint64_to_float64
6657 void helper_msa_ffint_s_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
6660 wr_t wx, *pwx = &wx;
6661 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
6662 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
6665 clear_msacsr_cause(env);
6669 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
6670 MSA_FLOAT_UNOP(pwx->w[i], from_int32, pws->w[i], 32);
6674 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
6675 MSA_FLOAT_UNOP(pwx->d[i], from_int64, pws->d[i], 64);
6682 check_msacsr_cause(env, GETPC());
6684 msa_move_v(pwd, pwx);
6687 void helper_msa_ffint_u_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
6690 wr_t wx, *pwx = &wx;
6691 wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
6692 wr_t *pws = &(env->active_fpu.fpr[ws].wr);
6695 clear_msacsr_cause(env);
6699 for (i = 0; i < DF_ELEMENTS(DF_WORD); i++) {
6700 MSA_FLOAT_UNOP(pwx->w[i], from_uint32, pws->w[i], 32);
6704 for (i = 0; i < DF_ELEMENTS(DF_DOUBLE); i++) {
6705 MSA_FLOAT_UNOP(pwx->d[i], from_uint64, pws->d[i], 64);
6712 check_msacsr_cause(env, GETPC());
6714 msa_move_v(pwd, pwx);