1a2b0a27dSPhilippe Mathieu-Daudé /* 2a2b0a27dSPhilippe Mathieu-Daudé * MIPS SIMD Architecture (MSA) translation routines 3a2b0a27dSPhilippe Mathieu-Daudé * 4a2b0a27dSPhilippe Mathieu-Daudé * Copyright (c) 2004-2005 Jocelyn Mayer 5a2b0a27dSPhilippe Mathieu-Daudé * Copyright (c) 2006 Marius Groeger (FPU operations) 6a2b0a27dSPhilippe Mathieu-Daudé * Copyright (c) 2006 Thiemo Seufer (MIPS32R2 support) 7a2b0a27dSPhilippe Mathieu-Daudé * Copyright (c) 2009 CodeSourcery (MIPS16 and microMIPS support) 8a2b0a27dSPhilippe Mathieu-Daudé * Copyright (c) 2012 Jia Liu & Dongxue Zhang (MIPS ASE DSP support) 9a2b0a27dSPhilippe Mathieu-Daudé * Copyright (c) 2020 Philippe Mathieu-Daudé 10a2b0a27dSPhilippe Mathieu-Daudé * 11a2b0a27dSPhilippe Mathieu-Daudé * SPDX-License-Identifier: LGPL-2.1-or-later 12a2b0a27dSPhilippe Mathieu-Daudé */ 13a2b0a27dSPhilippe Mathieu-Daudé #include "qemu/osdep.h" 14a2b0a27dSPhilippe Mathieu-Daudé #include "tcg/tcg-op.h" 15a2b0a27dSPhilippe Mathieu-Daudé #include "exec/helper-gen.h" 16a2b0a27dSPhilippe Mathieu-Daudé #include "translate.h" 17a2b0a27dSPhilippe Mathieu-Daudé #include "fpu_helper.h" 18a2b0a27dSPhilippe Mathieu-Daudé #include "internal.h" 19a2b0a27dSPhilippe Mathieu-Daudé 204701d23aSPhilippe Mathieu-Daudé static int bit_m(DisasContext *ctx, int x); 214701d23aSPhilippe Mathieu-Daudé static int bit_df(DisasContext *ctx, int x); 224701d23aSPhilippe Mathieu-Daudé 23ff29e5d3SPhilippe Mathieu-Daudé static inline int plus_1(DisasContext *s, int x) 24ff29e5d3SPhilippe Mathieu-Daudé { 25ff29e5d3SPhilippe Mathieu-Daudé return x + 1; 26ff29e5d3SPhilippe Mathieu-Daudé } 27ff29e5d3SPhilippe Mathieu-Daudé 285c5b6400SPhilippe Mathieu-Daudé static inline int plus_2(DisasContext *s, int x) 295c5b6400SPhilippe Mathieu-Daudé { 305c5b6400SPhilippe Mathieu-Daudé return x + 2; 315c5b6400SPhilippe Mathieu-Daudé } 325c5b6400SPhilippe Mathieu-Daudé 33a2b0a27dSPhilippe Mathieu-Daudé /* Include the auto-generated decoder. */ 34f5c6ee0cSPhilippe Mathieu-Daudé #include "decode-msa.c.inc" 35a2b0a27dSPhilippe Mathieu-Daudé 36a2b0a27dSPhilippe Mathieu-Daudé #define OPC_MSA (0x1E << 26) 37a2b0a27dSPhilippe Mathieu-Daudé 38a2b0a27dSPhilippe Mathieu-Daudé #define MASK_MSA_MINOR(op) (MASK_OP_MAJOR(op) | (op & 0x3F)) 39a2b0a27dSPhilippe Mathieu-Daudé enum { 40a2b0a27dSPhilippe Mathieu-Daudé OPC_MSA_3R_0D = 0x0D | OPC_MSA, 41a2b0a27dSPhilippe Mathieu-Daudé OPC_MSA_3R_0E = 0x0E | OPC_MSA, 42a2b0a27dSPhilippe Mathieu-Daudé OPC_MSA_3R_0F = 0x0F | OPC_MSA, 43a2b0a27dSPhilippe Mathieu-Daudé OPC_MSA_3R_10 = 0x10 | OPC_MSA, 44a2b0a27dSPhilippe Mathieu-Daudé OPC_MSA_3R_11 = 0x11 | OPC_MSA, 45a2b0a27dSPhilippe Mathieu-Daudé OPC_MSA_3R_12 = 0x12 | OPC_MSA, 46a2b0a27dSPhilippe Mathieu-Daudé OPC_MSA_3R_13 = 0x13 | OPC_MSA, 47a2b0a27dSPhilippe Mathieu-Daudé OPC_MSA_3R_14 = 0x14 | OPC_MSA, 48a2b0a27dSPhilippe Mathieu-Daudé OPC_MSA_3R_15 = 0x15 | OPC_MSA, 49a2b0a27dSPhilippe Mathieu-Daudé OPC_MSA_ELM = 0x19 | OPC_MSA, 50a2b0a27dSPhilippe Mathieu-Daudé }; 51a2b0a27dSPhilippe Mathieu-Daudé 52a2b0a27dSPhilippe Mathieu-Daudé enum { 53a2b0a27dSPhilippe Mathieu-Daudé /* 3R instruction df(bits 22..21) = _b, _h, _w, d */ 54a2b0a27dSPhilippe Mathieu-Daudé OPC_SLL_df = (0x0 << 23) | OPC_MSA_3R_0D, 55a2b0a27dSPhilippe Mathieu-Daudé OPC_ADDV_df = (0x0 << 23) | OPC_MSA_3R_0E, 56a2b0a27dSPhilippe Mathieu-Daudé OPC_CEQ_df = (0x0 << 23) | OPC_MSA_3R_0F, 57a2b0a27dSPhilippe Mathieu-Daudé OPC_ADD_A_df = (0x0 << 23) | OPC_MSA_3R_10, 58a2b0a27dSPhilippe Mathieu-Daudé OPC_SUBS_S_df = (0x0 << 23) | OPC_MSA_3R_11, 59a2b0a27dSPhilippe Mathieu-Daudé OPC_MULV_df = (0x0 << 23) | OPC_MSA_3R_12, 60a2b0a27dSPhilippe Mathieu-Daudé OPC_SRA_df = (0x1 << 23) | OPC_MSA_3R_0D, 61a2b0a27dSPhilippe Mathieu-Daudé OPC_SUBV_df = (0x1 << 23) | OPC_MSA_3R_0E, 62a2b0a27dSPhilippe Mathieu-Daudé OPC_ADDS_A_df = (0x1 << 23) | OPC_MSA_3R_10, 63a2b0a27dSPhilippe Mathieu-Daudé OPC_SUBS_U_df = (0x1 << 23) | OPC_MSA_3R_11, 64a2b0a27dSPhilippe Mathieu-Daudé OPC_MADDV_df = (0x1 << 23) | OPC_MSA_3R_12, 65a2b0a27dSPhilippe Mathieu-Daudé OPC_SRAR_df = (0x1 << 23) | OPC_MSA_3R_15, 66a2b0a27dSPhilippe Mathieu-Daudé OPC_SRL_df = (0x2 << 23) | OPC_MSA_3R_0D, 67a2b0a27dSPhilippe Mathieu-Daudé OPC_MAX_S_df = (0x2 << 23) | OPC_MSA_3R_0E, 68a2b0a27dSPhilippe Mathieu-Daudé OPC_CLT_S_df = (0x2 << 23) | OPC_MSA_3R_0F, 69a2b0a27dSPhilippe Mathieu-Daudé OPC_ADDS_S_df = (0x2 << 23) | OPC_MSA_3R_10, 70a2b0a27dSPhilippe Mathieu-Daudé OPC_SUBSUS_U_df = (0x2 << 23) | OPC_MSA_3R_11, 71a2b0a27dSPhilippe Mathieu-Daudé OPC_MSUBV_df = (0x2 << 23) | OPC_MSA_3R_12, 72a2b0a27dSPhilippe Mathieu-Daudé OPC_PCKEV_df = (0x2 << 23) | OPC_MSA_3R_14, 73a2b0a27dSPhilippe Mathieu-Daudé OPC_SRLR_df = (0x2 << 23) | OPC_MSA_3R_15, 74a2b0a27dSPhilippe Mathieu-Daudé OPC_BCLR_df = (0x3 << 23) | OPC_MSA_3R_0D, 75a2b0a27dSPhilippe Mathieu-Daudé OPC_MAX_U_df = (0x3 << 23) | OPC_MSA_3R_0E, 76a2b0a27dSPhilippe Mathieu-Daudé OPC_CLT_U_df = (0x3 << 23) | OPC_MSA_3R_0F, 77a2b0a27dSPhilippe Mathieu-Daudé OPC_ADDS_U_df = (0x3 << 23) | OPC_MSA_3R_10, 78a2b0a27dSPhilippe Mathieu-Daudé OPC_SUBSUU_S_df = (0x3 << 23) | OPC_MSA_3R_11, 79a2b0a27dSPhilippe Mathieu-Daudé OPC_PCKOD_df = (0x3 << 23) | OPC_MSA_3R_14, 80a2b0a27dSPhilippe Mathieu-Daudé OPC_BSET_df = (0x4 << 23) | OPC_MSA_3R_0D, 81a2b0a27dSPhilippe Mathieu-Daudé OPC_MIN_S_df = (0x4 << 23) | OPC_MSA_3R_0E, 82a2b0a27dSPhilippe Mathieu-Daudé OPC_CLE_S_df = (0x4 << 23) | OPC_MSA_3R_0F, 83a2b0a27dSPhilippe Mathieu-Daudé OPC_AVE_S_df = (0x4 << 23) | OPC_MSA_3R_10, 84a2b0a27dSPhilippe Mathieu-Daudé OPC_ASUB_S_df = (0x4 << 23) | OPC_MSA_3R_11, 85a2b0a27dSPhilippe Mathieu-Daudé OPC_DIV_S_df = (0x4 << 23) | OPC_MSA_3R_12, 86a2b0a27dSPhilippe Mathieu-Daudé OPC_ILVL_df = (0x4 << 23) | OPC_MSA_3R_14, 87a2b0a27dSPhilippe Mathieu-Daudé OPC_BNEG_df = (0x5 << 23) | OPC_MSA_3R_0D, 88a2b0a27dSPhilippe Mathieu-Daudé OPC_MIN_U_df = (0x5 << 23) | OPC_MSA_3R_0E, 89a2b0a27dSPhilippe Mathieu-Daudé OPC_CLE_U_df = (0x5 << 23) | OPC_MSA_3R_0F, 90a2b0a27dSPhilippe Mathieu-Daudé OPC_AVE_U_df = (0x5 << 23) | OPC_MSA_3R_10, 91a2b0a27dSPhilippe Mathieu-Daudé OPC_ASUB_U_df = (0x5 << 23) | OPC_MSA_3R_11, 92a2b0a27dSPhilippe Mathieu-Daudé OPC_DIV_U_df = (0x5 << 23) | OPC_MSA_3R_12, 93a2b0a27dSPhilippe Mathieu-Daudé OPC_ILVR_df = (0x5 << 23) | OPC_MSA_3R_14, 94a2b0a27dSPhilippe Mathieu-Daudé OPC_BINSL_df = (0x6 << 23) | OPC_MSA_3R_0D, 95a2b0a27dSPhilippe Mathieu-Daudé OPC_MAX_A_df = (0x6 << 23) | OPC_MSA_3R_0E, 96a2b0a27dSPhilippe Mathieu-Daudé OPC_AVER_S_df = (0x6 << 23) | OPC_MSA_3R_10, 97a2b0a27dSPhilippe Mathieu-Daudé OPC_MOD_S_df = (0x6 << 23) | OPC_MSA_3R_12, 98a2b0a27dSPhilippe Mathieu-Daudé OPC_ILVEV_df = (0x6 << 23) | OPC_MSA_3R_14, 99a2b0a27dSPhilippe Mathieu-Daudé OPC_BINSR_df = (0x7 << 23) | OPC_MSA_3R_0D, 100a2b0a27dSPhilippe Mathieu-Daudé OPC_MIN_A_df = (0x7 << 23) | OPC_MSA_3R_0E, 101a2b0a27dSPhilippe Mathieu-Daudé OPC_AVER_U_df = (0x7 << 23) | OPC_MSA_3R_10, 102a2b0a27dSPhilippe Mathieu-Daudé OPC_MOD_U_df = (0x7 << 23) | OPC_MSA_3R_12, 103a2b0a27dSPhilippe Mathieu-Daudé OPC_ILVOD_df = (0x7 << 23) | OPC_MSA_3R_14, 104a2b0a27dSPhilippe Mathieu-Daudé 105a2b0a27dSPhilippe Mathieu-Daudé /* ELM instructions df(bits 21..16) = _b, _h, _w, _d */ 106a2b0a27dSPhilippe Mathieu-Daudé OPC_SLDI_df = (0x0 << 22) | (0x00 << 16) | OPC_MSA_ELM, 107a2b0a27dSPhilippe Mathieu-Daudé OPC_CTCMSA = (0x0 << 22) | (0x3E << 16) | OPC_MSA_ELM, 108a2b0a27dSPhilippe Mathieu-Daudé OPC_SPLATI_df = (0x1 << 22) | (0x00 << 16) | OPC_MSA_ELM, 109a2b0a27dSPhilippe Mathieu-Daudé OPC_CFCMSA = (0x1 << 22) | (0x3E << 16) | OPC_MSA_ELM, 110a2b0a27dSPhilippe Mathieu-Daudé OPC_COPY_S_df = (0x2 << 22) | (0x00 << 16) | OPC_MSA_ELM, 111a2b0a27dSPhilippe Mathieu-Daudé OPC_MOVE_V = (0x2 << 22) | (0x3E << 16) | OPC_MSA_ELM, 112a2b0a27dSPhilippe Mathieu-Daudé OPC_COPY_U_df = (0x3 << 22) | (0x00 << 16) | OPC_MSA_ELM, 113a2b0a27dSPhilippe Mathieu-Daudé OPC_INSERT_df = (0x4 << 22) | (0x00 << 16) | OPC_MSA_ELM, 114a2b0a27dSPhilippe Mathieu-Daudé OPC_INSVE_df = (0x5 << 22) | (0x00 << 16) | OPC_MSA_ELM, 115a2b0a27dSPhilippe Mathieu-Daudé }; 116a2b0a27dSPhilippe Mathieu-Daudé 11706106772SPhilippe Mathieu-Daudé static const char msaregnames[][6] = { 118a2b0a27dSPhilippe Mathieu-Daudé "w0.d0", "w0.d1", "w1.d0", "w1.d1", 119a2b0a27dSPhilippe Mathieu-Daudé "w2.d0", "w2.d1", "w3.d0", "w3.d1", 120a2b0a27dSPhilippe Mathieu-Daudé "w4.d0", "w4.d1", "w5.d0", "w5.d1", 121a2b0a27dSPhilippe Mathieu-Daudé "w6.d0", "w6.d1", "w7.d0", "w7.d1", 122a2b0a27dSPhilippe Mathieu-Daudé "w8.d0", "w8.d1", "w9.d0", "w9.d1", 123a2b0a27dSPhilippe Mathieu-Daudé "w10.d0", "w10.d1", "w11.d0", "w11.d1", 124a2b0a27dSPhilippe Mathieu-Daudé "w12.d0", "w12.d1", "w13.d0", "w13.d1", 125a2b0a27dSPhilippe Mathieu-Daudé "w14.d0", "w14.d1", "w15.d0", "w15.d1", 126a2b0a27dSPhilippe Mathieu-Daudé "w16.d0", "w16.d1", "w17.d0", "w17.d1", 127a2b0a27dSPhilippe Mathieu-Daudé "w18.d0", "w18.d1", "w19.d0", "w19.d1", 128a2b0a27dSPhilippe Mathieu-Daudé "w20.d0", "w20.d1", "w21.d0", "w21.d1", 129a2b0a27dSPhilippe Mathieu-Daudé "w22.d0", "w22.d1", "w23.d0", "w23.d1", 130a2b0a27dSPhilippe Mathieu-Daudé "w24.d0", "w24.d1", "w25.d0", "w25.d1", 131a2b0a27dSPhilippe Mathieu-Daudé "w26.d0", "w26.d1", "w27.d0", "w27.d1", 132a2b0a27dSPhilippe Mathieu-Daudé "w28.d0", "w28.d1", "w29.d0", "w29.d1", 133a2b0a27dSPhilippe Mathieu-Daudé "w30.d0", "w30.d1", "w31.d0", "w31.d1", 134a2b0a27dSPhilippe Mathieu-Daudé }; 135a2b0a27dSPhilippe Mathieu-Daudé 1364701d23aSPhilippe Mathieu-Daudé /* Encoding of Operation Field (must be indexed by CPUMIPSMSADataFormat) */ 1374701d23aSPhilippe Mathieu-Daudé struct dfe { 1384701d23aSPhilippe Mathieu-Daudé int start; 1394701d23aSPhilippe Mathieu-Daudé int length; 1404701d23aSPhilippe Mathieu-Daudé uint32_t mask; 1414701d23aSPhilippe Mathieu-Daudé }; 1424701d23aSPhilippe Mathieu-Daudé 1434701d23aSPhilippe Mathieu-Daudé /* 1444701d23aSPhilippe Mathieu-Daudé * Extract immediate from df/{m,n} format (used by ELM & BIT instructions). 1454701d23aSPhilippe Mathieu-Daudé * Returns the immediate value, or -1 if the format does not match. 1464701d23aSPhilippe Mathieu-Daudé */ 1474701d23aSPhilippe Mathieu-Daudé static int df_extract_val(DisasContext *ctx, int x, const struct dfe *s) 1484701d23aSPhilippe Mathieu-Daudé { 1494701d23aSPhilippe Mathieu-Daudé for (unsigned i = 0; i < 4; i++) { 1504701d23aSPhilippe Mathieu-Daudé if (extract32(x, s->start, s->length) == s->mask) { 1514701d23aSPhilippe Mathieu-Daudé return extract32(x, 0, s->start); 1524701d23aSPhilippe Mathieu-Daudé } 1534701d23aSPhilippe Mathieu-Daudé } 1544701d23aSPhilippe Mathieu-Daudé return -1; 1554701d23aSPhilippe Mathieu-Daudé } 1564701d23aSPhilippe Mathieu-Daudé 1574701d23aSPhilippe Mathieu-Daudé /* 1584701d23aSPhilippe Mathieu-Daudé * Extract DataField from df/{m,n} format (used by ELM & BIT instructions). 1594701d23aSPhilippe Mathieu-Daudé * Returns the DataField, or -1 if the format does not match. 1604701d23aSPhilippe Mathieu-Daudé */ 1614701d23aSPhilippe Mathieu-Daudé static int df_extract_df(DisasContext *ctx, int x, const struct dfe *s) 1624701d23aSPhilippe Mathieu-Daudé { 1634701d23aSPhilippe Mathieu-Daudé for (unsigned i = 0; i < 4; i++) { 1644701d23aSPhilippe Mathieu-Daudé if (extract32(x, s->start, s->length) == s->mask) { 1654701d23aSPhilippe Mathieu-Daudé return i; 1664701d23aSPhilippe Mathieu-Daudé } 1674701d23aSPhilippe Mathieu-Daudé } 1684701d23aSPhilippe Mathieu-Daudé return -1; 1694701d23aSPhilippe Mathieu-Daudé } 1704701d23aSPhilippe Mathieu-Daudé 1714701d23aSPhilippe Mathieu-Daudé static const struct dfe df_bit[] = { 1724701d23aSPhilippe Mathieu-Daudé /* Table 3.28 BIT Instruction Format */ 1734701d23aSPhilippe Mathieu-Daudé [DF_BYTE] = {3, 4, 0b1110}, 1744701d23aSPhilippe Mathieu-Daudé [DF_HALF] = {4, 3, 0b110}, 1754701d23aSPhilippe Mathieu-Daudé [DF_WORD] = {5, 2, 0b10}, 1764701d23aSPhilippe Mathieu-Daudé [DF_DOUBLE] = {6, 1, 0b0} 1774701d23aSPhilippe Mathieu-Daudé }; 1784701d23aSPhilippe Mathieu-Daudé 1794701d23aSPhilippe Mathieu-Daudé static int bit_m(DisasContext *ctx, int x) 1804701d23aSPhilippe Mathieu-Daudé { 1814701d23aSPhilippe Mathieu-Daudé return df_extract_val(ctx, x, df_bit); 1824701d23aSPhilippe Mathieu-Daudé } 1834701d23aSPhilippe Mathieu-Daudé 1844701d23aSPhilippe Mathieu-Daudé static int bit_df(DisasContext *ctx, int x) 1854701d23aSPhilippe Mathieu-Daudé { 1864701d23aSPhilippe Mathieu-Daudé return df_extract_df(ctx, x, df_bit); 1874701d23aSPhilippe Mathieu-Daudé } 1884701d23aSPhilippe Mathieu-Daudé 189a2b0a27dSPhilippe Mathieu-Daudé static TCGv_i64 msa_wr_d[64]; 190a2b0a27dSPhilippe Mathieu-Daudé 191a2b0a27dSPhilippe Mathieu-Daudé void msa_translate_init(void) 192a2b0a27dSPhilippe Mathieu-Daudé { 193a2b0a27dSPhilippe Mathieu-Daudé int i; 194a2b0a27dSPhilippe Mathieu-Daudé 195a2b0a27dSPhilippe Mathieu-Daudé for (i = 0; i < 32; i++) { 196bbc213b3SPhilippe Mathieu-Daudé int off; 197a2b0a27dSPhilippe Mathieu-Daudé 198a2b0a27dSPhilippe Mathieu-Daudé /* 199a2b0a27dSPhilippe Mathieu-Daudé * The MSA vector registers are mapped on the 200a2b0a27dSPhilippe Mathieu-Daudé * scalar floating-point unit (FPU) registers. 201a2b0a27dSPhilippe Mathieu-Daudé */ 202bbc213b3SPhilippe Mathieu-Daudé off = offsetof(CPUMIPSState, active_fpu.fpr[i].wr.d[0]); 203a2b0a27dSPhilippe Mathieu-Daudé msa_wr_d[i * 2] = fpu_f64[i]; 204bbc213b3SPhilippe Mathieu-Daudé 205a2b0a27dSPhilippe Mathieu-Daudé off = offsetof(CPUMIPSState, active_fpu.fpr[i].wr.d[1]); 206a2b0a27dSPhilippe Mathieu-Daudé msa_wr_d[i * 2 + 1] = 207a2b0a27dSPhilippe Mathieu-Daudé tcg_global_mem_new_i64(cpu_env, off, msaregnames[i * 2 + 1]); 208a2b0a27dSPhilippe Mathieu-Daudé } 209a2b0a27dSPhilippe Mathieu-Daudé } 210a2b0a27dSPhilippe Mathieu-Daudé 211340ee8b3SPhilippe Mathieu-Daudé /* 212340ee8b3SPhilippe Mathieu-Daudé * Check if MSA is enabled. 213340ee8b3SPhilippe Mathieu-Daudé * This function is always called with MSA available. 214340ee8b3SPhilippe Mathieu-Daudé * If MSA is disabled, raise an exception. 215340ee8b3SPhilippe Mathieu-Daudé */ 216340ee8b3SPhilippe Mathieu-Daudé static inline bool check_msa_enabled(DisasContext *ctx) 217a2b0a27dSPhilippe Mathieu-Daudé { 218a2b0a27dSPhilippe Mathieu-Daudé if (unlikely((ctx->hflags & MIPS_HFLAG_FPU) && 219a2b0a27dSPhilippe Mathieu-Daudé !(ctx->hflags & MIPS_HFLAG_F64))) { 220a2b0a27dSPhilippe Mathieu-Daudé gen_reserved_instruction(ctx); 221340ee8b3SPhilippe Mathieu-Daudé return false; 222a2b0a27dSPhilippe Mathieu-Daudé } 223a2b0a27dSPhilippe Mathieu-Daudé 224a2b0a27dSPhilippe Mathieu-Daudé if (unlikely(!(ctx->hflags & MIPS_HFLAG_MSA))) { 225a2b0a27dSPhilippe Mathieu-Daudé generate_exception_end(ctx, EXCP_MSADIS); 226340ee8b3SPhilippe Mathieu-Daudé return false; 227a2b0a27dSPhilippe Mathieu-Daudé } 228340ee8b3SPhilippe Mathieu-Daudé return true; 229a2b0a27dSPhilippe Mathieu-Daudé } 230a2b0a27dSPhilippe Mathieu-Daudé 231ce121fe2SPhilippe Mathieu-Daudé typedef void gen_helper_piv(TCGv_ptr, TCGv_i32, TCGv); 232adcff99aSPhilippe Mathieu-Daudé typedef void gen_helper_pii(TCGv_ptr, TCGv_i32, TCGv_i32); 2337cc351ffSPhilippe Mathieu-Daudé typedef void gen_helper_piii(TCGv_ptr, TCGv_i32, TCGv_i32, TCGv_i32); 234b8e74816SPhilippe Mathieu-Daudé typedef void gen_helper_piiii(TCGv_ptr, TCGv_i32, TCGv_i32, TCGv_i32, TCGv_i32); 235b8e74816SPhilippe Mathieu-Daudé 236ce121fe2SPhilippe Mathieu-Daudé #define TRANS_DF_x(TYPE, NAME, trans_func, gen_func) \ 237ce121fe2SPhilippe Mathieu-Daudé static gen_helper_p##TYPE * const NAME##_tab[4] = { \ 238ce121fe2SPhilippe Mathieu-Daudé gen_func##_b, gen_func##_h, gen_func##_w, gen_func##_d \ 239ce121fe2SPhilippe Mathieu-Daudé }; \ 240ce121fe2SPhilippe Mathieu-Daudé TRANS(NAME, trans_func, NAME##_tab[a->df]) 241ce121fe2SPhilippe Mathieu-Daudé 242ce121fe2SPhilippe Mathieu-Daudé #define TRANS_DF_iv(NAME, trans_func, gen_func) \ 243ce121fe2SPhilippe Mathieu-Daudé TRANS_DF_x(iv, NAME, trans_func, gen_func) 244ce121fe2SPhilippe Mathieu-Daudé 245adcff99aSPhilippe Mathieu-Daudé #define TRANS_DF_ii(NAME, trans_func, gen_func) \ 246adcff99aSPhilippe Mathieu-Daudé TRANS_DF_x(ii, NAME, trans_func, gen_func) 247adcff99aSPhilippe Mathieu-Daudé 248*f18708a5SPhilippe Mathieu-Daudé #define TRANS_DF_iii_b(NAME, trans_func, gen_func) \ 249*f18708a5SPhilippe Mathieu-Daudé static gen_helper_piii * const NAME##_tab[4] = { \ 250*f18708a5SPhilippe Mathieu-Daudé NULL, gen_func##_h, gen_func##_w, gen_func##_d \ 251*f18708a5SPhilippe Mathieu-Daudé }; \ 252*f18708a5SPhilippe Mathieu-Daudé static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \ 253*f18708a5SPhilippe Mathieu-Daudé { \ 254*f18708a5SPhilippe Mathieu-Daudé return trans_func(ctx, a, NAME##_tab[a->df]); \ 255*f18708a5SPhilippe Mathieu-Daudé } 256*f18708a5SPhilippe Mathieu-Daudé 257a2b0a27dSPhilippe Mathieu-Daudé static void gen_check_zero_element(TCGv tresult, uint8_t df, uint8_t wt, 258a2b0a27dSPhilippe Mathieu-Daudé TCGCond cond) 259a2b0a27dSPhilippe Mathieu-Daudé { 260a2b0a27dSPhilippe Mathieu-Daudé /* generates tcg ops to check if any element is 0 */ 261a2b0a27dSPhilippe Mathieu-Daudé /* Note this function only works with MSA_WRLEN = 128 */ 26240f75c02SPhilippe Mathieu-Daudé uint64_t eval_zero_or_big = dup_const(df, 1); 26340f75c02SPhilippe Mathieu-Daudé uint64_t eval_big = eval_zero_or_big << ((8 << df) - 1); 264a2b0a27dSPhilippe Mathieu-Daudé TCGv_i64 t0 = tcg_temp_new_i64(); 265a2b0a27dSPhilippe Mathieu-Daudé TCGv_i64 t1 = tcg_temp_new_i64(); 26640f75c02SPhilippe Mathieu-Daudé 267a2b0a27dSPhilippe Mathieu-Daudé tcg_gen_subi_i64(t0, msa_wr_d[wt << 1], eval_zero_or_big); 268a2b0a27dSPhilippe Mathieu-Daudé tcg_gen_andc_i64(t0, t0, msa_wr_d[wt << 1]); 269a2b0a27dSPhilippe Mathieu-Daudé tcg_gen_andi_i64(t0, t0, eval_big); 270a2b0a27dSPhilippe Mathieu-Daudé tcg_gen_subi_i64(t1, msa_wr_d[(wt << 1) + 1], eval_zero_or_big); 271a2b0a27dSPhilippe Mathieu-Daudé tcg_gen_andc_i64(t1, t1, msa_wr_d[(wt << 1) + 1]); 272a2b0a27dSPhilippe Mathieu-Daudé tcg_gen_andi_i64(t1, t1, eval_big); 273a2b0a27dSPhilippe Mathieu-Daudé tcg_gen_or_i64(t0, t0, t1); 274a2b0a27dSPhilippe Mathieu-Daudé /* if all bits are zero then all elements are not zero */ 275a2b0a27dSPhilippe Mathieu-Daudé /* if some bit is non-zero then some element is zero */ 276a2b0a27dSPhilippe Mathieu-Daudé tcg_gen_setcondi_i64(cond, t0, t0, 0); 277a2b0a27dSPhilippe Mathieu-Daudé tcg_gen_trunc_i64_tl(tresult, t0); 278a2b0a27dSPhilippe Mathieu-Daudé tcg_temp_free_i64(t0); 279a2b0a27dSPhilippe Mathieu-Daudé tcg_temp_free_i64(t1); 280a2b0a27dSPhilippe Mathieu-Daudé } 281a2b0a27dSPhilippe Mathieu-Daudé 282d61566cfSPhilippe Mathieu-Daudé static bool gen_msa_BxZ_V(DisasContext *ctx, int wt, int sa, TCGCond cond) 283a2b0a27dSPhilippe Mathieu-Daudé { 284a2b0a27dSPhilippe Mathieu-Daudé TCGv_i64 t0; 285a2b0a27dSPhilippe Mathieu-Daudé 286340ee8b3SPhilippe Mathieu-Daudé if (!check_msa_enabled(ctx)) { 287340ee8b3SPhilippe Mathieu-Daudé return true; 288340ee8b3SPhilippe Mathieu-Daudé } 289a2b0a27dSPhilippe Mathieu-Daudé 290a2b0a27dSPhilippe Mathieu-Daudé if (ctx->hflags & MIPS_HFLAG_BMASK) { 291a2b0a27dSPhilippe Mathieu-Daudé gen_reserved_instruction(ctx); 292a2b0a27dSPhilippe Mathieu-Daudé return true; 293a2b0a27dSPhilippe Mathieu-Daudé } 294a2b0a27dSPhilippe Mathieu-Daudé t0 = tcg_temp_new_i64(); 295a2b0a27dSPhilippe Mathieu-Daudé tcg_gen_or_i64(t0, msa_wr_d[wt << 1], msa_wr_d[(wt << 1) + 1]); 296a2b0a27dSPhilippe Mathieu-Daudé tcg_gen_setcondi_i64(cond, t0, t0, 0); 297a2b0a27dSPhilippe Mathieu-Daudé tcg_gen_trunc_i64_tl(bcond, t0); 298a2b0a27dSPhilippe Mathieu-Daudé tcg_temp_free_i64(t0); 299a2b0a27dSPhilippe Mathieu-Daudé 300d61566cfSPhilippe Mathieu-Daudé ctx->btarget = ctx->base.pc_next + (sa << 2) + 4; 301a2b0a27dSPhilippe Mathieu-Daudé 302a2b0a27dSPhilippe Mathieu-Daudé ctx->hflags |= MIPS_HFLAG_BC; 303a2b0a27dSPhilippe Mathieu-Daudé ctx->hflags |= MIPS_HFLAG_BDS32; 304a2b0a27dSPhilippe Mathieu-Daudé 305a2b0a27dSPhilippe Mathieu-Daudé return true; 306a2b0a27dSPhilippe Mathieu-Daudé } 307a2b0a27dSPhilippe Mathieu-Daudé 308a2b0a27dSPhilippe Mathieu-Daudé static bool trans_BZ_V(DisasContext *ctx, arg_msa_bz *a) 309a2b0a27dSPhilippe Mathieu-Daudé { 310d61566cfSPhilippe Mathieu-Daudé return gen_msa_BxZ_V(ctx, a->wt, a->sa, TCG_COND_EQ); 311a2b0a27dSPhilippe Mathieu-Daudé } 312a2b0a27dSPhilippe Mathieu-Daudé 313a2b0a27dSPhilippe Mathieu-Daudé static bool trans_BNZ_V(DisasContext *ctx, arg_msa_bz *a) 314a2b0a27dSPhilippe Mathieu-Daudé { 315d61566cfSPhilippe Mathieu-Daudé return gen_msa_BxZ_V(ctx, a->wt, a->sa, TCG_COND_NE); 316a2b0a27dSPhilippe Mathieu-Daudé } 317a2b0a27dSPhilippe Mathieu-Daudé 318d61566cfSPhilippe Mathieu-Daudé static bool gen_msa_BxZ(DisasContext *ctx, int df, int wt, int sa, bool if_not) 319a2b0a27dSPhilippe Mathieu-Daudé { 320340ee8b3SPhilippe Mathieu-Daudé if (!check_msa_enabled(ctx)) { 321340ee8b3SPhilippe Mathieu-Daudé return true; 322340ee8b3SPhilippe Mathieu-Daudé } 323a2b0a27dSPhilippe Mathieu-Daudé 324a2b0a27dSPhilippe Mathieu-Daudé if (ctx->hflags & MIPS_HFLAG_BMASK) { 325a2b0a27dSPhilippe Mathieu-Daudé gen_reserved_instruction(ctx); 326a2b0a27dSPhilippe Mathieu-Daudé return true; 327a2b0a27dSPhilippe Mathieu-Daudé } 328a2b0a27dSPhilippe Mathieu-Daudé 329a2b0a27dSPhilippe Mathieu-Daudé gen_check_zero_element(bcond, df, wt, if_not ? TCG_COND_EQ : TCG_COND_NE); 330a2b0a27dSPhilippe Mathieu-Daudé 331d61566cfSPhilippe Mathieu-Daudé ctx->btarget = ctx->base.pc_next + (sa << 2) + 4; 332a2b0a27dSPhilippe Mathieu-Daudé ctx->hflags |= MIPS_HFLAG_BC; 333a2b0a27dSPhilippe Mathieu-Daudé ctx->hflags |= MIPS_HFLAG_BDS32; 334a2b0a27dSPhilippe Mathieu-Daudé 335a2b0a27dSPhilippe Mathieu-Daudé return true; 336a2b0a27dSPhilippe Mathieu-Daudé } 337a2b0a27dSPhilippe Mathieu-Daudé 338d61566cfSPhilippe Mathieu-Daudé static bool trans_BZ(DisasContext *ctx, arg_msa_bz *a) 339a2b0a27dSPhilippe Mathieu-Daudé { 340d61566cfSPhilippe Mathieu-Daudé return gen_msa_BxZ(ctx, a->df, a->wt, a->sa, false); 341a2b0a27dSPhilippe Mathieu-Daudé } 342a2b0a27dSPhilippe Mathieu-Daudé 343d61566cfSPhilippe Mathieu-Daudé static bool trans_BNZ(DisasContext *ctx, arg_msa_bz *a) 344a2b0a27dSPhilippe Mathieu-Daudé { 345d61566cfSPhilippe Mathieu-Daudé return gen_msa_BxZ(ctx, a->df, a->wt, a->sa, true); 346a2b0a27dSPhilippe Mathieu-Daudé } 347a2b0a27dSPhilippe Mathieu-Daudé 3487cc351ffSPhilippe Mathieu-Daudé static bool trans_msa_i8(DisasContext *ctx, arg_msa_i *a, 3497cc351ffSPhilippe Mathieu-Daudé gen_helper_piii *gen_msa_i8) 350a2b0a27dSPhilippe Mathieu-Daudé { 3517cc351ffSPhilippe Mathieu-Daudé if (!check_msa_enabled(ctx)) { 3527cc351ffSPhilippe Mathieu-Daudé return true; 353a2b0a27dSPhilippe Mathieu-Daudé } 354a2b0a27dSPhilippe Mathieu-Daudé 3557cc351ffSPhilippe Mathieu-Daudé gen_msa_i8(cpu_env, 3567cc351ffSPhilippe Mathieu-Daudé tcg_constant_i32(a->wd), 3577cc351ffSPhilippe Mathieu-Daudé tcg_constant_i32(a->ws), 3587cc351ffSPhilippe Mathieu-Daudé tcg_constant_i32(a->sa)); 3597cc351ffSPhilippe Mathieu-Daudé 3607cc351ffSPhilippe Mathieu-Daudé return true; 361a2b0a27dSPhilippe Mathieu-Daudé } 362a2b0a27dSPhilippe Mathieu-Daudé 3637cc351ffSPhilippe Mathieu-Daudé TRANS(ANDI, trans_msa_i8, gen_helper_msa_andi_b); 3647cc351ffSPhilippe Mathieu-Daudé TRANS(ORI, trans_msa_i8, gen_helper_msa_ori_b); 3657cc351ffSPhilippe Mathieu-Daudé TRANS(NORI, trans_msa_i8, gen_helper_msa_nori_b); 3667cc351ffSPhilippe Mathieu-Daudé TRANS(XORI, trans_msa_i8, gen_helper_msa_xori_b); 3677cc351ffSPhilippe Mathieu-Daudé TRANS(BMNZI, trans_msa_i8, gen_helper_msa_bmnzi_b); 3687cc351ffSPhilippe Mathieu-Daudé TRANS(BMZI, trans_msa_i8, gen_helper_msa_bmzi_b); 3697cc351ffSPhilippe Mathieu-Daudé TRANS(BSELI, trans_msa_i8, gen_helper_msa_bseli_b); 3707cc351ffSPhilippe Mathieu-Daudé 371a9e17958SPhilippe Mathieu-Daudé static bool trans_SHF(DisasContext *ctx, arg_msa_i *a) 372a9e17958SPhilippe Mathieu-Daudé { 373a9e17958SPhilippe Mathieu-Daudé if (a->df == DF_DOUBLE) { 374a9e17958SPhilippe Mathieu-Daudé return false; 375a9e17958SPhilippe Mathieu-Daudé } 376a9e17958SPhilippe Mathieu-Daudé 377a9e17958SPhilippe Mathieu-Daudé if (!check_msa_enabled(ctx)) { 378a9e17958SPhilippe Mathieu-Daudé return true; 379a9e17958SPhilippe Mathieu-Daudé } 380a9e17958SPhilippe Mathieu-Daudé 381a9e17958SPhilippe Mathieu-Daudé gen_helper_msa_shf_df(cpu_env, 382a9e17958SPhilippe Mathieu-Daudé tcg_constant_i32(a->df), 383a9e17958SPhilippe Mathieu-Daudé tcg_constant_i32(a->wd), 384a9e17958SPhilippe Mathieu-Daudé tcg_constant_i32(a->ws), 385a9e17958SPhilippe Mathieu-Daudé tcg_constant_i32(a->sa)); 386a9e17958SPhilippe Mathieu-Daudé 387a9e17958SPhilippe Mathieu-Daudé return true; 388a9e17958SPhilippe Mathieu-Daudé } 389a9e17958SPhilippe Mathieu-Daudé 390b8e74816SPhilippe Mathieu-Daudé static bool trans_msa_i5(DisasContext *ctx, arg_msa_i *a, 391b8e74816SPhilippe Mathieu-Daudé gen_helper_piiii *gen_msa_i5) 392a2b0a27dSPhilippe Mathieu-Daudé { 393b8e74816SPhilippe Mathieu-Daudé if (!check_msa_enabled(ctx)) { 394b8e74816SPhilippe Mathieu-Daudé return true; 395a2b0a27dSPhilippe Mathieu-Daudé } 396a2b0a27dSPhilippe Mathieu-Daudé 397b8e74816SPhilippe Mathieu-Daudé gen_msa_i5(cpu_env, 398b8e74816SPhilippe Mathieu-Daudé tcg_constant_i32(a->df), 399b8e74816SPhilippe Mathieu-Daudé tcg_constant_i32(a->wd), 400b8e74816SPhilippe Mathieu-Daudé tcg_constant_i32(a->ws), 401b8e74816SPhilippe Mathieu-Daudé tcg_constant_i32(a->sa)); 402b8e74816SPhilippe Mathieu-Daudé 403b8e74816SPhilippe Mathieu-Daudé return true; 404a2b0a27dSPhilippe Mathieu-Daudé } 405a2b0a27dSPhilippe Mathieu-Daudé 406b8e74816SPhilippe Mathieu-Daudé TRANS(ADDVI, trans_msa_i5, gen_helper_msa_addvi_df); 407b8e74816SPhilippe Mathieu-Daudé TRANS(SUBVI, trans_msa_i5, gen_helper_msa_subvi_df); 408b8e74816SPhilippe Mathieu-Daudé TRANS(MAXI_S, trans_msa_i5, gen_helper_msa_maxi_s_df); 409b8e74816SPhilippe Mathieu-Daudé TRANS(MAXI_U, trans_msa_i5, gen_helper_msa_maxi_u_df); 410b8e74816SPhilippe Mathieu-Daudé TRANS(MINI_S, trans_msa_i5, gen_helper_msa_mini_s_df); 411b8e74816SPhilippe Mathieu-Daudé TRANS(MINI_U, trans_msa_i5, gen_helper_msa_mini_u_df); 412b8e74816SPhilippe Mathieu-Daudé TRANS(CLTI_S, trans_msa_i5, gen_helper_msa_clti_s_df); 413b8e74816SPhilippe Mathieu-Daudé TRANS(CLTI_U, trans_msa_i5, gen_helper_msa_clti_u_df); 414b8e74816SPhilippe Mathieu-Daudé TRANS(CLEI_S, trans_msa_i5, gen_helper_msa_clei_s_df); 415b8e74816SPhilippe Mathieu-Daudé TRANS(CLEI_U, trans_msa_i5, gen_helper_msa_clei_u_df); 416b8e74816SPhilippe Mathieu-Daudé TRANS(CEQI, trans_msa_i5, gen_helper_msa_ceqi_df); 417b8e74816SPhilippe Mathieu-Daudé 41875094c33SPhilippe Mathieu-Daudé static bool trans_LDI(DisasContext *ctx, arg_msa_ldi *a) 41975094c33SPhilippe Mathieu-Daudé { 42075094c33SPhilippe Mathieu-Daudé if (!check_msa_enabled(ctx)) { 42175094c33SPhilippe Mathieu-Daudé return true; 42275094c33SPhilippe Mathieu-Daudé } 42375094c33SPhilippe Mathieu-Daudé 42475094c33SPhilippe Mathieu-Daudé gen_helper_msa_ldi_df(cpu_env, 42575094c33SPhilippe Mathieu-Daudé tcg_constant_i32(a->df), 42675094c33SPhilippe Mathieu-Daudé tcg_constant_i32(a->wd), 42775094c33SPhilippe Mathieu-Daudé tcg_constant_i32(a->sa)); 42875094c33SPhilippe Mathieu-Daudé 42975094c33SPhilippe Mathieu-Daudé return true; 43075094c33SPhilippe Mathieu-Daudé } 43175094c33SPhilippe Mathieu-Daudé 4324701d23aSPhilippe Mathieu-Daudé static bool trans_msa_bit(DisasContext *ctx, arg_msa_bit *a, 4334701d23aSPhilippe Mathieu-Daudé gen_helper_piiii *gen_msa_bit) 434a2b0a27dSPhilippe Mathieu-Daudé { 4354701d23aSPhilippe Mathieu-Daudé if (a->df < 0) { 4364701d23aSPhilippe Mathieu-Daudé return false; 437a2b0a27dSPhilippe Mathieu-Daudé } 438a2b0a27dSPhilippe Mathieu-Daudé 4394701d23aSPhilippe Mathieu-Daudé if (!check_msa_enabled(ctx)) { 4404701d23aSPhilippe Mathieu-Daudé return true; 441a2b0a27dSPhilippe Mathieu-Daudé } 442a2b0a27dSPhilippe Mathieu-Daudé 4434701d23aSPhilippe Mathieu-Daudé gen_msa_bit(cpu_env, 4444701d23aSPhilippe Mathieu-Daudé tcg_constant_i32(a->df), 4454701d23aSPhilippe Mathieu-Daudé tcg_constant_i32(a->wd), 4464701d23aSPhilippe Mathieu-Daudé tcg_constant_i32(a->ws), 4474701d23aSPhilippe Mathieu-Daudé tcg_constant_i32(a->m)); 4484701d23aSPhilippe Mathieu-Daudé 4494701d23aSPhilippe Mathieu-Daudé return true; 450a2b0a27dSPhilippe Mathieu-Daudé } 451a2b0a27dSPhilippe Mathieu-Daudé 4524701d23aSPhilippe Mathieu-Daudé TRANS(SLLI, trans_msa_bit, gen_helper_msa_slli_df); 4534701d23aSPhilippe Mathieu-Daudé TRANS(SRAI, trans_msa_bit, gen_helper_msa_srai_df); 4544701d23aSPhilippe Mathieu-Daudé TRANS(SRLI, trans_msa_bit, gen_helper_msa_srli_df); 4554701d23aSPhilippe Mathieu-Daudé TRANS(BCLRI, trans_msa_bit, gen_helper_msa_bclri_df); 4564701d23aSPhilippe Mathieu-Daudé TRANS(BSETI, trans_msa_bit, gen_helper_msa_bseti_df); 4574701d23aSPhilippe Mathieu-Daudé TRANS(BNEGI, trans_msa_bit, gen_helper_msa_bnegi_df); 4584701d23aSPhilippe Mathieu-Daudé TRANS(BINSLI, trans_msa_bit, gen_helper_msa_binsli_df); 4594701d23aSPhilippe Mathieu-Daudé TRANS(BINSRI, trans_msa_bit, gen_helper_msa_binsri_df); 4604701d23aSPhilippe Mathieu-Daudé TRANS(SAT_S, trans_msa_bit, gen_helper_msa_sat_u_df); 4614701d23aSPhilippe Mathieu-Daudé TRANS(SAT_U, trans_msa_bit, gen_helper_msa_sat_u_df); 4624701d23aSPhilippe Mathieu-Daudé TRANS(SRARI, trans_msa_bit, gen_helper_msa_srari_df); 4634701d23aSPhilippe Mathieu-Daudé TRANS(SRLRI, trans_msa_bit, gen_helper_msa_srlri_df); 4644701d23aSPhilippe Mathieu-Daudé 465ff29e5d3SPhilippe Mathieu-Daudé static bool trans_msa_3rf(DisasContext *ctx, arg_msa_r *a, 466ff29e5d3SPhilippe Mathieu-Daudé gen_helper_piiii *gen_msa_3rf) 467ff29e5d3SPhilippe Mathieu-Daudé { 468ff29e5d3SPhilippe Mathieu-Daudé if (!check_msa_enabled(ctx)) { 469ff29e5d3SPhilippe Mathieu-Daudé return true; 470ff29e5d3SPhilippe Mathieu-Daudé } 471ff29e5d3SPhilippe Mathieu-Daudé 472ff29e5d3SPhilippe Mathieu-Daudé gen_msa_3rf(cpu_env, 473ff29e5d3SPhilippe Mathieu-Daudé tcg_constant_i32(a->df), 474ff29e5d3SPhilippe Mathieu-Daudé tcg_constant_i32(a->wd), 475ff29e5d3SPhilippe Mathieu-Daudé tcg_constant_i32(a->ws), 476ff29e5d3SPhilippe Mathieu-Daudé tcg_constant_i32(a->wt)); 477ff29e5d3SPhilippe Mathieu-Daudé 478ff29e5d3SPhilippe Mathieu-Daudé return true; 479ff29e5d3SPhilippe Mathieu-Daudé } 480ff29e5d3SPhilippe Mathieu-Daudé 4817acb5c78SPhilippe Mathieu-Daudé static bool trans_msa_3r(DisasContext *ctx, arg_msa_r *a, 4827acb5c78SPhilippe Mathieu-Daudé gen_helper_piii *gen_msa_3r) 4837acb5c78SPhilippe Mathieu-Daudé { 484*f18708a5SPhilippe Mathieu-Daudé if (!gen_msa_3r) { 485*f18708a5SPhilippe Mathieu-Daudé return false; 486*f18708a5SPhilippe Mathieu-Daudé } 487*f18708a5SPhilippe Mathieu-Daudé 4887acb5c78SPhilippe Mathieu-Daudé if (!check_msa_enabled(ctx)) { 4897acb5c78SPhilippe Mathieu-Daudé return true; 4907acb5c78SPhilippe Mathieu-Daudé } 4917acb5c78SPhilippe Mathieu-Daudé 4927acb5c78SPhilippe Mathieu-Daudé gen_msa_3r(cpu_env, 4937acb5c78SPhilippe Mathieu-Daudé tcg_constant_i32(a->wd), 4947acb5c78SPhilippe Mathieu-Daudé tcg_constant_i32(a->ws), 4957acb5c78SPhilippe Mathieu-Daudé tcg_constant_i32(a->wt)); 4967acb5c78SPhilippe Mathieu-Daudé 4977acb5c78SPhilippe Mathieu-Daudé return true; 4987acb5c78SPhilippe Mathieu-Daudé } 4997acb5c78SPhilippe Mathieu-Daudé 5007acb5c78SPhilippe Mathieu-Daudé TRANS(AND_V, trans_msa_3r, gen_helper_msa_and_v); 5017acb5c78SPhilippe Mathieu-Daudé TRANS(OR_V, trans_msa_3r, gen_helper_msa_or_v); 5027acb5c78SPhilippe Mathieu-Daudé TRANS(NOR_V, trans_msa_3r, gen_helper_msa_nor_v); 5037acb5c78SPhilippe Mathieu-Daudé TRANS(XOR_V, trans_msa_3r, gen_helper_msa_xor_v); 5047acb5c78SPhilippe Mathieu-Daudé TRANS(BMNZ_V, trans_msa_3r, gen_helper_msa_bmnz_v); 5057acb5c78SPhilippe Mathieu-Daudé TRANS(BMZ_V, trans_msa_3r, gen_helper_msa_bmz_v); 5067acb5c78SPhilippe Mathieu-Daudé TRANS(BSEL_V, trans_msa_3r, gen_helper_msa_bsel_v); 5077acb5c78SPhilippe Mathieu-Daudé 508*f18708a5SPhilippe Mathieu-Daudé TRANS_DF_iii_b(DOTP_S, trans_msa_3r, gen_helper_msa_dotp_s); 509*f18708a5SPhilippe Mathieu-Daudé TRANS_DF_iii_b(DOTP_U, trans_msa_3r, gen_helper_msa_dotp_u); 510*f18708a5SPhilippe Mathieu-Daudé TRANS_DF_iii_b(DPADD_S, trans_msa_3r, gen_helper_msa_dpadd_s); 511*f18708a5SPhilippe Mathieu-Daudé TRANS_DF_iii_b(DPADD_U, trans_msa_3r, gen_helper_msa_dpadd_u); 512*f18708a5SPhilippe Mathieu-Daudé TRANS_DF_iii_b(DPSUB_S, trans_msa_3r, gen_helper_msa_dpsub_s); 513*f18708a5SPhilippe Mathieu-Daudé TRANS_DF_iii_b(DPSUB_U, trans_msa_3r, gen_helper_msa_dpsub_u); 514*f18708a5SPhilippe Mathieu-Daudé 51567bedef5SPhilippe Mathieu-Daudé TRANS(SLD, trans_msa_3rf, gen_helper_msa_sld_df); 51667bedef5SPhilippe Mathieu-Daudé TRANS(SPLAT, trans_msa_3rf, gen_helper_msa_splat_df); 51767bedef5SPhilippe Mathieu-Daudé 51867bedef5SPhilippe Mathieu-Daudé TRANS(VSHF, trans_msa_3rf, gen_helper_msa_vshf_df); 519*f18708a5SPhilippe Mathieu-Daudé TRANS_DF_iii_b(HADD_S, trans_msa_3r, gen_helper_msa_hadd_s); 520*f18708a5SPhilippe Mathieu-Daudé TRANS_DF_iii_b(HADD_U, trans_msa_3r, gen_helper_msa_hadd_u); 521*f18708a5SPhilippe Mathieu-Daudé TRANS_DF_iii_b(HSUB_S, trans_msa_3r, gen_helper_msa_hsub_s); 522*f18708a5SPhilippe Mathieu-Daudé TRANS_DF_iii_b(HSUB_U, trans_msa_3r, gen_helper_msa_hsub_u); 52367bedef5SPhilippe Mathieu-Daudé 524a2b0a27dSPhilippe Mathieu-Daudé static void gen_msa_3r(DisasContext *ctx) 525a2b0a27dSPhilippe Mathieu-Daudé { 526a2b0a27dSPhilippe Mathieu-Daudé #define MASK_MSA_3R(op) (MASK_MSA_MINOR(op) | (op & (0x7 << 23))) 527a2b0a27dSPhilippe Mathieu-Daudé uint8_t df = (ctx->opcode >> 21) & 0x3; 528a2b0a27dSPhilippe Mathieu-Daudé uint8_t wt = (ctx->opcode >> 16) & 0x1f; 529a2b0a27dSPhilippe Mathieu-Daudé uint8_t ws = (ctx->opcode >> 11) & 0x1f; 530a2b0a27dSPhilippe Mathieu-Daudé uint8_t wd = (ctx->opcode >> 6) & 0x1f; 531a2b0a27dSPhilippe Mathieu-Daudé 532a2b0a27dSPhilippe Mathieu-Daudé TCGv_i32 tdf = tcg_const_i32(df); 533a2b0a27dSPhilippe Mathieu-Daudé TCGv_i32 twd = tcg_const_i32(wd); 534a2b0a27dSPhilippe Mathieu-Daudé TCGv_i32 tws = tcg_const_i32(ws); 535a2b0a27dSPhilippe Mathieu-Daudé TCGv_i32 twt = tcg_const_i32(wt); 536a2b0a27dSPhilippe Mathieu-Daudé 537a2b0a27dSPhilippe Mathieu-Daudé switch (MASK_MSA_3R(ctx->opcode)) { 538a2b0a27dSPhilippe Mathieu-Daudé case OPC_BINSL_df: 539a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 540a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 541a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_binsl_b(cpu_env, twd, tws, twt); 542a2b0a27dSPhilippe Mathieu-Daudé break; 543a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 544a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_binsl_h(cpu_env, twd, tws, twt); 545a2b0a27dSPhilippe Mathieu-Daudé break; 546a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 547a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_binsl_w(cpu_env, twd, tws, twt); 548a2b0a27dSPhilippe Mathieu-Daudé break; 549a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 550a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_binsl_d(cpu_env, twd, tws, twt); 551a2b0a27dSPhilippe Mathieu-Daudé break; 552a2b0a27dSPhilippe Mathieu-Daudé } 553a2b0a27dSPhilippe Mathieu-Daudé break; 554a2b0a27dSPhilippe Mathieu-Daudé case OPC_BINSR_df: 555a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 556a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 557a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_binsr_b(cpu_env, twd, tws, twt); 558a2b0a27dSPhilippe Mathieu-Daudé break; 559a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 560a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_binsr_h(cpu_env, twd, tws, twt); 561a2b0a27dSPhilippe Mathieu-Daudé break; 562a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 563a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_binsr_w(cpu_env, twd, tws, twt); 564a2b0a27dSPhilippe Mathieu-Daudé break; 565a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 566a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_binsr_d(cpu_env, twd, tws, twt); 567a2b0a27dSPhilippe Mathieu-Daudé break; 568a2b0a27dSPhilippe Mathieu-Daudé } 569a2b0a27dSPhilippe Mathieu-Daudé break; 570a2b0a27dSPhilippe Mathieu-Daudé case OPC_BCLR_df: 571a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 572a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 573a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_bclr_b(cpu_env, twd, tws, twt); 574a2b0a27dSPhilippe Mathieu-Daudé break; 575a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 576a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_bclr_h(cpu_env, twd, tws, twt); 577a2b0a27dSPhilippe Mathieu-Daudé break; 578a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 579a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_bclr_w(cpu_env, twd, tws, twt); 580a2b0a27dSPhilippe Mathieu-Daudé break; 581a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 582a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_bclr_d(cpu_env, twd, tws, twt); 583a2b0a27dSPhilippe Mathieu-Daudé break; 584a2b0a27dSPhilippe Mathieu-Daudé } 585a2b0a27dSPhilippe Mathieu-Daudé break; 586a2b0a27dSPhilippe Mathieu-Daudé case OPC_BNEG_df: 587a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 588a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 589a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_bneg_b(cpu_env, twd, tws, twt); 590a2b0a27dSPhilippe Mathieu-Daudé break; 591a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 592a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_bneg_h(cpu_env, twd, tws, twt); 593a2b0a27dSPhilippe Mathieu-Daudé break; 594a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 595a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_bneg_w(cpu_env, twd, tws, twt); 596a2b0a27dSPhilippe Mathieu-Daudé break; 597a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 598a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_bneg_d(cpu_env, twd, tws, twt); 599a2b0a27dSPhilippe Mathieu-Daudé break; 600a2b0a27dSPhilippe Mathieu-Daudé } 601a2b0a27dSPhilippe Mathieu-Daudé break; 602a2b0a27dSPhilippe Mathieu-Daudé case OPC_BSET_df: 603a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 604a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 605a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_bset_b(cpu_env, twd, tws, twt); 606a2b0a27dSPhilippe Mathieu-Daudé break; 607a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 608a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_bset_h(cpu_env, twd, tws, twt); 609a2b0a27dSPhilippe Mathieu-Daudé break; 610a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 611a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_bset_w(cpu_env, twd, tws, twt); 612a2b0a27dSPhilippe Mathieu-Daudé break; 613a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 614a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_bset_d(cpu_env, twd, tws, twt); 615a2b0a27dSPhilippe Mathieu-Daudé break; 616a2b0a27dSPhilippe Mathieu-Daudé } 617a2b0a27dSPhilippe Mathieu-Daudé break; 618a2b0a27dSPhilippe Mathieu-Daudé case OPC_ADD_A_df: 619a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 620a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 621a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_add_a_b(cpu_env, twd, tws, twt); 622a2b0a27dSPhilippe Mathieu-Daudé break; 623a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 624a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_add_a_h(cpu_env, twd, tws, twt); 625a2b0a27dSPhilippe Mathieu-Daudé break; 626a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 627a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_add_a_w(cpu_env, twd, tws, twt); 628a2b0a27dSPhilippe Mathieu-Daudé break; 629a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 630a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_add_a_d(cpu_env, twd, tws, twt); 631a2b0a27dSPhilippe Mathieu-Daudé break; 632a2b0a27dSPhilippe Mathieu-Daudé } 633a2b0a27dSPhilippe Mathieu-Daudé break; 634a2b0a27dSPhilippe Mathieu-Daudé case OPC_ADDS_A_df: 635a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 636a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 637a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_adds_a_b(cpu_env, twd, tws, twt); 638a2b0a27dSPhilippe Mathieu-Daudé break; 639a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 640a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_adds_a_h(cpu_env, twd, tws, twt); 641a2b0a27dSPhilippe Mathieu-Daudé break; 642a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 643a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_adds_a_w(cpu_env, twd, tws, twt); 644a2b0a27dSPhilippe Mathieu-Daudé break; 645a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 646a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_adds_a_d(cpu_env, twd, tws, twt); 647a2b0a27dSPhilippe Mathieu-Daudé break; 648a2b0a27dSPhilippe Mathieu-Daudé } 649a2b0a27dSPhilippe Mathieu-Daudé break; 650a2b0a27dSPhilippe Mathieu-Daudé case OPC_ADDS_S_df: 651a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 652a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 653a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_adds_s_b(cpu_env, twd, tws, twt); 654a2b0a27dSPhilippe Mathieu-Daudé break; 655a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 656a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_adds_s_h(cpu_env, twd, tws, twt); 657a2b0a27dSPhilippe Mathieu-Daudé break; 658a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 659a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_adds_s_w(cpu_env, twd, tws, twt); 660a2b0a27dSPhilippe Mathieu-Daudé break; 661a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 662a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_adds_s_d(cpu_env, twd, tws, twt); 663a2b0a27dSPhilippe Mathieu-Daudé break; 664a2b0a27dSPhilippe Mathieu-Daudé } 665a2b0a27dSPhilippe Mathieu-Daudé break; 666a2b0a27dSPhilippe Mathieu-Daudé case OPC_ADDS_U_df: 667a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 668a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 669a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_adds_u_b(cpu_env, twd, tws, twt); 670a2b0a27dSPhilippe Mathieu-Daudé break; 671a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 672a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_adds_u_h(cpu_env, twd, tws, twt); 673a2b0a27dSPhilippe Mathieu-Daudé break; 674a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 675a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_adds_u_w(cpu_env, twd, tws, twt); 676a2b0a27dSPhilippe Mathieu-Daudé break; 677a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 678a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_adds_u_d(cpu_env, twd, tws, twt); 679a2b0a27dSPhilippe Mathieu-Daudé break; 680a2b0a27dSPhilippe Mathieu-Daudé } 681a2b0a27dSPhilippe Mathieu-Daudé break; 682a2b0a27dSPhilippe Mathieu-Daudé case OPC_ADDV_df: 683a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 684a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 685a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_addv_b(cpu_env, twd, tws, twt); 686a2b0a27dSPhilippe Mathieu-Daudé break; 687a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 688a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_addv_h(cpu_env, twd, tws, twt); 689a2b0a27dSPhilippe Mathieu-Daudé break; 690a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 691a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_addv_w(cpu_env, twd, tws, twt); 692a2b0a27dSPhilippe Mathieu-Daudé break; 693a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 694a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_addv_d(cpu_env, twd, tws, twt); 695a2b0a27dSPhilippe Mathieu-Daudé break; 696a2b0a27dSPhilippe Mathieu-Daudé } 697a2b0a27dSPhilippe Mathieu-Daudé break; 698a2b0a27dSPhilippe Mathieu-Daudé case OPC_AVE_S_df: 699a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 700a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 701a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ave_s_b(cpu_env, twd, tws, twt); 702a2b0a27dSPhilippe Mathieu-Daudé break; 703a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 704a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ave_s_h(cpu_env, twd, tws, twt); 705a2b0a27dSPhilippe Mathieu-Daudé break; 706a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 707a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ave_s_w(cpu_env, twd, tws, twt); 708a2b0a27dSPhilippe Mathieu-Daudé break; 709a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 710a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ave_s_d(cpu_env, twd, tws, twt); 711a2b0a27dSPhilippe Mathieu-Daudé break; 712a2b0a27dSPhilippe Mathieu-Daudé } 713a2b0a27dSPhilippe Mathieu-Daudé break; 714a2b0a27dSPhilippe Mathieu-Daudé case OPC_AVE_U_df: 715a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 716a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 717a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ave_u_b(cpu_env, twd, tws, twt); 718a2b0a27dSPhilippe Mathieu-Daudé break; 719a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 720a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ave_u_h(cpu_env, twd, tws, twt); 721a2b0a27dSPhilippe Mathieu-Daudé break; 722a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 723a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ave_u_w(cpu_env, twd, tws, twt); 724a2b0a27dSPhilippe Mathieu-Daudé break; 725a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 726a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ave_u_d(cpu_env, twd, tws, twt); 727a2b0a27dSPhilippe Mathieu-Daudé break; 728a2b0a27dSPhilippe Mathieu-Daudé } 729a2b0a27dSPhilippe Mathieu-Daudé break; 730a2b0a27dSPhilippe Mathieu-Daudé case OPC_AVER_S_df: 731a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 732a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 733a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_aver_s_b(cpu_env, twd, tws, twt); 734a2b0a27dSPhilippe Mathieu-Daudé break; 735a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 736a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_aver_s_h(cpu_env, twd, tws, twt); 737a2b0a27dSPhilippe Mathieu-Daudé break; 738a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 739a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_aver_s_w(cpu_env, twd, tws, twt); 740a2b0a27dSPhilippe Mathieu-Daudé break; 741a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 742a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_aver_s_d(cpu_env, twd, tws, twt); 743a2b0a27dSPhilippe Mathieu-Daudé break; 744a2b0a27dSPhilippe Mathieu-Daudé } 745a2b0a27dSPhilippe Mathieu-Daudé break; 746a2b0a27dSPhilippe Mathieu-Daudé case OPC_AVER_U_df: 747a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 748a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 749a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_aver_u_b(cpu_env, twd, tws, twt); 750a2b0a27dSPhilippe Mathieu-Daudé break; 751a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 752a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_aver_u_h(cpu_env, twd, tws, twt); 753a2b0a27dSPhilippe Mathieu-Daudé break; 754a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 755a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_aver_u_w(cpu_env, twd, tws, twt); 756a2b0a27dSPhilippe Mathieu-Daudé break; 757a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 758a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_aver_u_d(cpu_env, twd, tws, twt); 759a2b0a27dSPhilippe Mathieu-Daudé break; 760a2b0a27dSPhilippe Mathieu-Daudé } 761a2b0a27dSPhilippe Mathieu-Daudé break; 762a2b0a27dSPhilippe Mathieu-Daudé case OPC_CEQ_df: 763a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 764a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 765a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ceq_b(cpu_env, twd, tws, twt); 766a2b0a27dSPhilippe Mathieu-Daudé break; 767a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 768a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ceq_h(cpu_env, twd, tws, twt); 769a2b0a27dSPhilippe Mathieu-Daudé break; 770a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 771a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ceq_w(cpu_env, twd, tws, twt); 772a2b0a27dSPhilippe Mathieu-Daudé break; 773a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 774a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ceq_d(cpu_env, twd, tws, twt); 775a2b0a27dSPhilippe Mathieu-Daudé break; 776a2b0a27dSPhilippe Mathieu-Daudé } 777a2b0a27dSPhilippe Mathieu-Daudé break; 778a2b0a27dSPhilippe Mathieu-Daudé case OPC_CLE_S_df: 779a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 780a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 781a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_cle_s_b(cpu_env, twd, tws, twt); 782a2b0a27dSPhilippe Mathieu-Daudé break; 783a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 784a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_cle_s_h(cpu_env, twd, tws, twt); 785a2b0a27dSPhilippe Mathieu-Daudé break; 786a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 787a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_cle_s_w(cpu_env, twd, tws, twt); 788a2b0a27dSPhilippe Mathieu-Daudé break; 789a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 790a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_cle_s_d(cpu_env, twd, tws, twt); 791a2b0a27dSPhilippe Mathieu-Daudé break; 792a2b0a27dSPhilippe Mathieu-Daudé } 793a2b0a27dSPhilippe Mathieu-Daudé break; 794a2b0a27dSPhilippe Mathieu-Daudé case OPC_CLE_U_df: 795a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 796a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 797a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_cle_u_b(cpu_env, twd, tws, twt); 798a2b0a27dSPhilippe Mathieu-Daudé break; 799a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 800a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_cle_u_h(cpu_env, twd, tws, twt); 801a2b0a27dSPhilippe Mathieu-Daudé break; 802a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 803a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_cle_u_w(cpu_env, twd, tws, twt); 804a2b0a27dSPhilippe Mathieu-Daudé break; 805a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 806a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_cle_u_d(cpu_env, twd, tws, twt); 807a2b0a27dSPhilippe Mathieu-Daudé break; 808a2b0a27dSPhilippe Mathieu-Daudé } 809a2b0a27dSPhilippe Mathieu-Daudé break; 810a2b0a27dSPhilippe Mathieu-Daudé case OPC_CLT_S_df: 811a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 812a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 813a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_clt_s_b(cpu_env, twd, tws, twt); 814a2b0a27dSPhilippe Mathieu-Daudé break; 815a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 816a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_clt_s_h(cpu_env, twd, tws, twt); 817a2b0a27dSPhilippe Mathieu-Daudé break; 818a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 819a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_clt_s_w(cpu_env, twd, tws, twt); 820a2b0a27dSPhilippe Mathieu-Daudé break; 821a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 822a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_clt_s_d(cpu_env, twd, tws, twt); 823a2b0a27dSPhilippe Mathieu-Daudé break; 824a2b0a27dSPhilippe Mathieu-Daudé } 825a2b0a27dSPhilippe Mathieu-Daudé break; 826a2b0a27dSPhilippe Mathieu-Daudé case OPC_CLT_U_df: 827a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 828a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 829a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_clt_u_b(cpu_env, twd, tws, twt); 830a2b0a27dSPhilippe Mathieu-Daudé break; 831a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 832a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_clt_u_h(cpu_env, twd, tws, twt); 833a2b0a27dSPhilippe Mathieu-Daudé break; 834a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 835a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_clt_u_w(cpu_env, twd, tws, twt); 836a2b0a27dSPhilippe Mathieu-Daudé break; 837a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 838a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_clt_u_d(cpu_env, twd, tws, twt); 839a2b0a27dSPhilippe Mathieu-Daudé break; 840a2b0a27dSPhilippe Mathieu-Daudé } 841a2b0a27dSPhilippe Mathieu-Daudé break; 842a2b0a27dSPhilippe Mathieu-Daudé case OPC_DIV_S_df: 843a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 844a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 845a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_div_s_b(cpu_env, twd, tws, twt); 846a2b0a27dSPhilippe Mathieu-Daudé break; 847a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 848a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_div_s_h(cpu_env, twd, tws, twt); 849a2b0a27dSPhilippe Mathieu-Daudé break; 850a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 851a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_div_s_w(cpu_env, twd, tws, twt); 852a2b0a27dSPhilippe Mathieu-Daudé break; 853a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 854a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_div_s_d(cpu_env, twd, tws, twt); 855a2b0a27dSPhilippe Mathieu-Daudé break; 856a2b0a27dSPhilippe Mathieu-Daudé } 857a2b0a27dSPhilippe Mathieu-Daudé break; 858a2b0a27dSPhilippe Mathieu-Daudé case OPC_DIV_U_df: 859a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 860a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 861a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_div_u_b(cpu_env, twd, tws, twt); 862a2b0a27dSPhilippe Mathieu-Daudé break; 863a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 864a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_div_u_h(cpu_env, twd, tws, twt); 865a2b0a27dSPhilippe Mathieu-Daudé break; 866a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 867a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_div_u_w(cpu_env, twd, tws, twt); 868a2b0a27dSPhilippe Mathieu-Daudé break; 869a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 870a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_div_u_d(cpu_env, twd, tws, twt); 871a2b0a27dSPhilippe Mathieu-Daudé break; 872a2b0a27dSPhilippe Mathieu-Daudé } 873a2b0a27dSPhilippe Mathieu-Daudé break; 874a2b0a27dSPhilippe Mathieu-Daudé case OPC_MAX_A_df: 875a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 876a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 877a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_max_a_b(cpu_env, twd, tws, twt); 878a2b0a27dSPhilippe Mathieu-Daudé break; 879a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 880a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_max_a_h(cpu_env, twd, tws, twt); 881a2b0a27dSPhilippe Mathieu-Daudé break; 882a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 883a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_max_a_w(cpu_env, twd, tws, twt); 884a2b0a27dSPhilippe Mathieu-Daudé break; 885a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 886a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_max_a_d(cpu_env, twd, tws, twt); 887a2b0a27dSPhilippe Mathieu-Daudé break; 888a2b0a27dSPhilippe Mathieu-Daudé } 889a2b0a27dSPhilippe Mathieu-Daudé break; 890a2b0a27dSPhilippe Mathieu-Daudé case OPC_MAX_S_df: 891a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 892a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 893a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_max_s_b(cpu_env, twd, tws, twt); 894a2b0a27dSPhilippe Mathieu-Daudé break; 895a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 896a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_max_s_h(cpu_env, twd, tws, twt); 897a2b0a27dSPhilippe Mathieu-Daudé break; 898a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 899a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_max_s_w(cpu_env, twd, tws, twt); 900a2b0a27dSPhilippe Mathieu-Daudé break; 901a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 902a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_max_s_d(cpu_env, twd, tws, twt); 903a2b0a27dSPhilippe Mathieu-Daudé break; 904a2b0a27dSPhilippe Mathieu-Daudé } 905a2b0a27dSPhilippe Mathieu-Daudé break; 906a2b0a27dSPhilippe Mathieu-Daudé case OPC_MAX_U_df: 907a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 908a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 909a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_max_u_b(cpu_env, twd, tws, twt); 910a2b0a27dSPhilippe Mathieu-Daudé break; 911a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 912a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_max_u_h(cpu_env, twd, tws, twt); 913a2b0a27dSPhilippe Mathieu-Daudé break; 914a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 915a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_max_u_w(cpu_env, twd, tws, twt); 916a2b0a27dSPhilippe Mathieu-Daudé break; 917a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 918a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_max_u_d(cpu_env, twd, tws, twt); 919a2b0a27dSPhilippe Mathieu-Daudé break; 920a2b0a27dSPhilippe Mathieu-Daudé } 921a2b0a27dSPhilippe Mathieu-Daudé break; 922a2b0a27dSPhilippe Mathieu-Daudé case OPC_MIN_A_df: 923a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 924a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 925a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_min_a_b(cpu_env, twd, tws, twt); 926a2b0a27dSPhilippe Mathieu-Daudé break; 927a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 928a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_min_a_h(cpu_env, twd, tws, twt); 929a2b0a27dSPhilippe Mathieu-Daudé break; 930a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 931a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_min_a_w(cpu_env, twd, tws, twt); 932a2b0a27dSPhilippe Mathieu-Daudé break; 933a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 934a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_min_a_d(cpu_env, twd, tws, twt); 935a2b0a27dSPhilippe Mathieu-Daudé break; 936a2b0a27dSPhilippe Mathieu-Daudé } 937a2b0a27dSPhilippe Mathieu-Daudé break; 938a2b0a27dSPhilippe Mathieu-Daudé case OPC_MIN_S_df: 939a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 940a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 941a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_min_s_b(cpu_env, twd, tws, twt); 942a2b0a27dSPhilippe Mathieu-Daudé break; 943a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 944a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_min_s_h(cpu_env, twd, tws, twt); 945a2b0a27dSPhilippe Mathieu-Daudé break; 946a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 947a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_min_s_w(cpu_env, twd, tws, twt); 948a2b0a27dSPhilippe Mathieu-Daudé break; 949a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 950a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_min_s_d(cpu_env, twd, tws, twt); 951a2b0a27dSPhilippe Mathieu-Daudé break; 952a2b0a27dSPhilippe Mathieu-Daudé } 953a2b0a27dSPhilippe Mathieu-Daudé break; 954a2b0a27dSPhilippe Mathieu-Daudé case OPC_MIN_U_df: 955a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 956a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 957a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_min_u_b(cpu_env, twd, tws, twt); 958a2b0a27dSPhilippe Mathieu-Daudé break; 959a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 960a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_min_u_h(cpu_env, twd, tws, twt); 961a2b0a27dSPhilippe Mathieu-Daudé break; 962a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 963a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_min_u_w(cpu_env, twd, tws, twt); 964a2b0a27dSPhilippe Mathieu-Daudé break; 965a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 966a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_min_u_d(cpu_env, twd, tws, twt); 967a2b0a27dSPhilippe Mathieu-Daudé break; 968a2b0a27dSPhilippe Mathieu-Daudé } 969a2b0a27dSPhilippe Mathieu-Daudé break; 970a2b0a27dSPhilippe Mathieu-Daudé case OPC_MOD_S_df: 971a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 972a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 973a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_mod_s_b(cpu_env, twd, tws, twt); 974a2b0a27dSPhilippe Mathieu-Daudé break; 975a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 976a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_mod_s_h(cpu_env, twd, tws, twt); 977a2b0a27dSPhilippe Mathieu-Daudé break; 978a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 979a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_mod_s_w(cpu_env, twd, tws, twt); 980a2b0a27dSPhilippe Mathieu-Daudé break; 981a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 982a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_mod_s_d(cpu_env, twd, tws, twt); 983a2b0a27dSPhilippe Mathieu-Daudé break; 984a2b0a27dSPhilippe Mathieu-Daudé } 985a2b0a27dSPhilippe Mathieu-Daudé break; 986a2b0a27dSPhilippe Mathieu-Daudé case OPC_MOD_U_df: 987a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 988a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 989a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_mod_u_b(cpu_env, twd, tws, twt); 990a2b0a27dSPhilippe Mathieu-Daudé break; 991a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 992a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_mod_u_h(cpu_env, twd, tws, twt); 993a2b0a27dSPhilippe Mathieu-Daudé break; 994a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 995a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_mod_u_w(cpu_env, twd, tws, twt); 996a2b0a27dSPhilippe Mathieu-Daudé break; 997a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 998a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_mod_u_d(cpu_env, twd, tws, twt); 999a2b0a27dSPhilippe Mathieu-Daudé break; 1000a2b0a27dSPhilippe Mathieu-Daudé } 1001a2b0a27dSPhilippe Mathieu-Daudé break; 1002a2b0a27dSPhilippe Mathieu-Daudé case OPC_MADDV_df: 1003a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1004a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1005a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_maddv_b(cpu_env, twd, tws, twt); 1006a2b0a27dSPhilippe Mathieu-Daudé break; 1007a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1008a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_maddv_h(cpu_env, twd, tws, twt); 1009a2b0a27dSPhilippe Mathieu-Daudé break; 1010a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1011a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_maddv_w(cpu_env, twd, tws, twt); 1012a2b0a27dSPhilippe Mathieu-Daudé break; 1013a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1014a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_maddv_d(cpu_env, twd, tws, twt); 1015a2b0a27dSPhilippe Mathieu-Daudé break; 1016a2b0a27dSPhilippe Mathieu-Daudé } 1017a2b0a27dSPhilippe Mathieu-Daudé break; 1018a2b0a27dSPhilippe Mathieu-Daudé case OPC_MSUBV_df: 1019a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1020a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1021a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_msubv_b(cpu_env, twd, tws, twt); 1022a2b0a27dSPhilippe Mathieu-Daudé break; 1023a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1024a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_msubv_h(cpu_env, twd, tws, twt); 1025a2b0a27dSPhilippe Mathieu-Daudé break; 1026a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1027a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_msubv_w(cpu_env, twd, tws, twt); 1028a2b0a27dSPhilippe Mathieu-Daudé break; 1029a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1030a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_msubv_d(cpu_env, twd, tws, twt); 1031a2b0a27dSPhilippe Mathieu-Daudé break; 1032a2b0a27dSPhilippe Mathieu-Daudé } 1033a2b0a27dSPhilippe Mathieu-Daudé break; 1034a2b0a27dSPhilippe Mathieu-Daudé case OPC_ASUB_S_df: 1035a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1036a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1037a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_asub_s_b(cpu_env, twd, tws, twt); 1038a2b0a27dSPhilippe Mathieu-Daudé break; 1039a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1040a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_asub_s_h(cpu_env, twd, tws, twt); 1041a2b0a27dSPhilippe Mathieu-Daudé break; 1042a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1043a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_asub_s_w(cpu_env, twd, tws, twt); 1044a2b0a27dSPhilippe Mathieu-Daudé break; 1045a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1046a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_asub_s_d(cpu_env, twd, tws, twt); 1047a2b0a27dSPhilippe Mathieu-Daudé break; 1048a2b0a27dSPhilippe Mathieu-Daudé } 1049a2b0a27dSPhilippe Mathieu-Daudé break; 1050a2b0a27dSPhilippe Mathieu-Daudé case OPC_ASUB_U_df: 1051a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1052a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1053a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_asub_u_b(cpu_env, twd, tws, twt); 1054a2b0a27dSPhilippe Mathieu-Daudé break; 1055a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1056a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_asub_u_h(cpu_env, twd, tws, twt); 1057a2b0a27dSPhilippe Mathieu-Daudé break; 1058a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1059a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_asub_u_w(cpu_env, twd, tws, twt); 1060a2b0a27dSPhilippe Mathieu-Daudé break; 1061a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1062a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_asub_u_d(cpu_env, twd, tws, twt); 1063a2b0a27dSPhilippe Mathieu-Daudé break; 1064a2b0a27dSPhilippe Mathieu-Daudé } 1065a2b0a27dSPhilippe Mathieu-Daudé break; 1066a2b0a27dSPhilippe Mathieu-Daudé case OPC_ILVEV_df: 1067a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1068a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1069a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ilvev_b(cpu_env, twd, tws, twt); 1070a2b0a27dSPhilippe Mathieu-Daudé break; 1071a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1072a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ilvev_h(cpu_env, twd, tws, twt); 1073a2b0a27dSPhilippe Mathieu-Daudé break; 1074a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1075a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ilvev_w(cpu_env, twd, tws, twt); 1076a2b0a27dSPhilippe Mathieu-Daudé break; 1077a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1078a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ilvev_d(cpu_env, twd, tws, twt); 1079a2b0a27dSPhilippe Mathieu-Daudé break; 1080a2b0a27dSPhilippe Mathieu-Daudé } 1081a2b0a27dSPhilippe Mathieu-Daudé break; 1082a2b0a27dSPhilippe Mathieu-Daudé case OPC_ILVOD_df: 1083a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1084a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1085a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ilvod_b(cpu_env, twd, tws, twt); 1086a2b0a27dSPhilippe Mathieu-Daudé break; 1087a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1088a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ilvod_h(cpu_env, twd, tws, twt); 1089a2b0a27dSPhilippe Mathieu-Daudé break; 1090a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1091a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ilvod_w(cpu_env, twd, tws, twt); 1092a2b0a27dSPhilippe Mathieu-Daudé break; 1093a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1094a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ilvod_d(cpu_env, twd, tws, twt); 1095a2b0a27dSPhilippe Mathieu-Daudé break; 1096a2b0a27dSPhilippe Mathieu-Daudé } 1097a2b0a27dSPhilippe Mathieu-Daudé break; 1098a2b0a27dSPhilippe Mathieu-Daudé case OPC_ILVL_df: 1099a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1100a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1101a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ilvl_b(cpu_env, twd, tws, twt); 1102a2b0a27dSPhilippe Mathieu-Daudé break; 1103a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1104a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ilvl_h(cpu_env, twd, tws, twt); 1105a2b0a27dSPhilippe Mathieu-Daudé break; 1106a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1107a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ilvl_w(cpu_env, twd, tws, twt); 1108a2b0a27dSPhilippe Mathieu-Daudé break; 1109a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1110a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ilvl_d(cpu_env, twd, tws, twt); 1111a2b0a27dSPhilippe Mathieu-Daudé break; 1112a2b0a27dSPhilippe Mathieu-Daudé } 1113a2b0a27dSPhilippe Mathieu-Daudé break; 1114a2b0a27dSPhilippe Mathieu-Daudé case OPC_ILVR_df: 1115a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1116a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1117a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ilvr_b(cpu_env, twd, tws, twt); 1118a2b0a27dSPhilippe Mathieu-Daudé break; 1119a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1120a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ilvr_h(cpu_env, twd, tws, twt); 1121a2b0a27dSPhilippe Mathieu-Daudé break; 1122a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1123a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ilvr_w(cpu_env, twd, tws, twt); 1124a2b0a27dSPhilippe Mathieu-Daudé break; 1125a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1126a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ilvr_d(cpu_env, twd, tws, twt); 1127a2b0a27dSPhilippe Mathieu-Daudé break; 1128a2b0a27dSPhilippe Mathieu-Daudé } 1129a2b0a27dSPhilippe Mathieu-Daudé break; 1130a2b0a27dSPhilippe Mathieu-Daudé case OPC_PCKEV_df: 1131a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1132a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1133a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_pckev_b(cpu_env, twd, tws, twt); 1134a2b0a27dSPhilippe Mathieu-Daudé break; 1135a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1136a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_pckev_h(cpu_env, twd, tws, twt); 1137a2b0a27dSPhilippe Mathieu-Daudé break; 1138a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1139a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_pckev_w(cpu_env, twd, tws, twt); 1140a2b0a27dSPhilippe Mathieu-Daudé break; 1141a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1142a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_pckev_d(cpu_env, twd, tws, twt); 1143a2b0a27dSPhilippe Mathieu-Daudé break; 1144a2b0a27dSPhilippe Mathieu-Daudé } 1145a2b0a27dSPhilippe Mathieu-Daudé break; 1146a2b0a27dSPhilippe Mathieu-Daudé case OPC_PCKOD_df: 1147a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1148a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1149a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_pckod_b(cpu_env, twd, tws, twt); 1150a2b0a27dSPhilippe Mathieu-Daudé break; 1151a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1152a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_pckod_h(cpu_env, twd, tws, twt); 1153a2b0a27dSPhilippe Mathieu-Daudé break; 1154a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1155a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_pckod_w(cpu_env, twd, tws, twt); 1156a2b0a27dSPhilippe Mathieu-Daudé break; 1157a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1158a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_pckod_d(cpu_env, twd, tws, twt); 1159a2b0a27dSPhilippe Mathieu-Daudé break; 1160a2b0a27dSPhilippe Mathieu-Daudé } 1161a2b0a27dSPhilippe Mathieu-Daudé break; 1162a2b0a27dSPhilippe Mathieu-Daudé case OPC_SLL_df: 1163a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1164a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1165a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_sll_b(cpu_env, twd, tws, twt); 1166a2b0a27dSPhilippe Mathieu-Daudé break; 1167a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1168a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_sll_h(cpu_env, twd, tws, twt); 1169a2b0a27dSPhilippe Mathieu-Daudé break; 1170a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1171a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_sll_w(cpu_env, twd, tws, twt); 1172a2b0a27dSPhilippe Mathieu-Daudé break; 1173a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1174a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_sll_d(cpu_env, twd, tws, twt); 1175a2b0a27dSPhilippe Mathieu-Daudé break; 1176a2b0a27dSPhilippe Mathieu-Daudé } 1177a2b0a27dSPhilippe Mathieu-Daudé break; 1178a2b0a27dSPhilippe Mathieu-Daudé case OPC_SRA_df: 1179a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1180a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1181a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_sra_b(cpu_env, twd, tws, twt); 1182a2b0a27dSPhilippe Mathieu-Daudé break; 1183a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1184a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_sra_h(cpu_env, twd, tws, twt); 1185a2b0a27dSPhilippe Mathieu-Daudé break; 1186a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1187a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_sra_w(cpu_env, twd, tws, twt); 1188a2b0a27dSPhilippe Mathieu-Daudé break; 1189a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1190a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_sra_d(cpu_env, twd, tws, twt); 1191a2b0a27dSPhilippe Mathieu-Daudé break; 1192a2b0a27dSPhilippe Mathieu-Daudé } 1193a2b0a27dSPhilippe Mathieu-Daudé break; 1194a2b0a27dSPhilippe Mathieu-Daudé case OPC_SRAR_df: 1195a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1196a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1197a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_srar_b(cpu_env, twd, tws, twt); 1198a2b0a27dSPhilippe Mathieu-Daudé break; 1199a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1200a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_srar_h(cpu_env, twd, tws, twt); 1201a2b0a27dSPhilippe Mathieu-Daudé break; 1202a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1203a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_srar_w(cpu_env, twd, tws, twt); 1204a2b0a27dSPhilippe Mathieu-Daudé break; 1205a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1206a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_srar_d(cpu_env, twd, tws, twt); 1207a2b0a27dSPhilippe Mathieu-Daudé break; 1208a2b0a27dSPhilippe Mathieu-Daudé } 1209a2b0a27dSPhilippe Mathieu-Daudé break; 1210a2b0a27dSPhilippe Mathieu-Daudé case OPC_SRL_df: 1211a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1212a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1213a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_srl_b(cpu_env, twd, tws, twt); 1214a2b0a27dSPhilippe Mathieu-Daudé break; 1215a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1216a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_srl_h(cpu_env, twd, tws, twt); 1217a2b0a27dSPhilippe Mathieu-Daudé break; 1218a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1219a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_srl_w(cpu_env, twd, tws, twt); 1220a2b0a27dSPhilippe Mathieu-Daudé break; 1221a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1222a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_srl_d(cpu_env, twd, tws, twt); 1223a2b0a27dSPhilippe Mathieu-Daudé break; 1224a2b0a27dSPhilippe Mathieu-Daudé } 1225a2b0a27dSPhilippe Mathieu-Daudé break; 1226a2b0a27dSPhilippe Mathieu-Daudé case OPC_SRLR_df: 1227a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1228a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1229a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_srlr_b(cpu_env, twd, tws, twt); 1230a2b0a27dSPhilippe Mathieu-Daudé break; 1231a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1232a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_srlr_h(cpu_env, twd, tws, twt); 1233a2b0a27dSPhilippe Mathieu-Daudé break; 1234a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1235a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_srlr_w(cpu_env, twd, tws, twt); 1236a2b0a27dSPhilippe Mathieu-Daudé break; 1237a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1238a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_srlr_d(cpu_env, twd, tws, twt); 1239a2b0a27dSPhilippe Mathieu-Daudé break; 1240a2b0a27dSPhilippe Mathieu-Daudé } 1241a2b0a27dSPhilippe Mathieu-Daudé break; 1242a2b0a27dSPhilippe Mathieu-Daudé case OPC_SUBS_S_df: 1243a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1244a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1245a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subs_s_b(cpu_env, twd, tws, twt); 1246a2b0a27dSPhilippe Mathieu-Daudé break; 1247a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1248a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subs_s_h(cpu_env, twd, tws, twt); 1249a2b0a27dSPhilippe Mathieu-Daudé break; 1250a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1251a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subs_s_w(cpu_env, twd, tws, twt); 1252a2b0a27dSPhilippe Mathieu-Daudé break; 1253a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1254a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subs_s_d(cpu_env, twd, tws, twt); 1255a2b0a27dSPhilippe Mathieu-Daudé break; 1256a2b0a27dSPhilippe Mathieu-Daudé } 1257a2b0a27dSPhilippe Mathieu-Daudé break; 1258a2b0a27dSPhilippe Mathieu-Daudé case OPC_MULV_df: 1259a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1260a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1261a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_mulv_b(cpu_env, twd, tws, twt); 1262a2b0a27dSPhilippe Mathieu-Daudé break; 1263a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1264a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_mulv_h(cpu_env, twd, tws, twt); 1265a2b0a27dSPhilippe Mathieu-Daudé break; 1266a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1267a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_mulv_w(cpu_env, twd, tws, twt); 1268a2b0a27dSPhilippe Mathieu-Daudé break; 1269a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1270a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_mulv_d(cpu_env, twd, tws, twt); 1271a2b0a27dSPhilippe Mathieu-Daudé break; 1272a2b0a27dSPhilippe Mathieu-Daudé } 1273a2b0a27dSPhilippe Mathieu-Daudé break; 1274a2b0a27dSPhilippe Mathieu-Daudé case OPC_SUBV_df: 1275a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1276a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1277a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subv_b(cpu_env, twd, tws, twt); 1278a2b0a27dSPhilippe Mathieu-Daudé break; 1279a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1280a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subv_h(cpu_env, twd, tws, twt); 1281a2b0a27dSPhilippe Mathieu-Daudé break; 1282a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1283a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subv_w(cpu_env, twd, tws, twt); 1284a2b0a27dSPhilippe Mathieu-Daudé break; 1285a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1286a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subv_d(cpu_env, twd, tws, twt); 1287a2b0a27dSPhilippe Mathieu-Daudé break; 1288a2b0a27dSPhilippe Mathieu-Daudé } 1289a2b0a27dSPhilippe Mathieu-Daudé break; 1290a2b0a27dSPhilippe Mathieu-Daudé case OPC_SUBS_U_df: 1291a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1292a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1293a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subs_u_b(cpu_env, twd, tws, twt); 1294a2b0a27dSPhilippe Mathieu-Daudé break; 1295a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1296a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subs_u_h(cpu_env, twd, tws, twt); 1297a2b0a27dSPhilippe Mathieu-Daudé break; 1298a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1299a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subs_u_w(cpu_env, twd, tws, twt); 1300a2b0a27dSPhilippe Mathieu-Daudé break; 1301a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1302a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subs_u_d(cpu_env, twd, tws, twt); 1303a2b0a27dSPhilippe Mathieu-Daudé break; 1304a2b0a27dSPhilippe Mathieu-Daudé } 1305a2b0a27dSPhilippe Mathieu-Daudé break; 1306a2b0a27dSPhilippe Mathieu-Daudé case OPC_SUBSUS_U_df: 1307a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1308a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1309a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subsus_u_b(cpu_env, twd, tws, twt); 1310a2b0a27dSPhilippe Mathieu-Daudé break; 1311a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1312a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subsus_u_h(cpu_env, twd, tws, twt); 1313a2b0a27dSPhilippe Mathieu-Daudé break; 1314a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1315a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subsus_u_w(cpu_env, twd, tws, twt); 1316a2b0a27dSPhilippe Mathieu-Daudé break; 1317a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1318a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subsus_u_d(cpu_env, twd, tws, twt); 1319a2b0a27dSPhilippe Mathieu-Daudé break; 1320a2b0a27dSPhilippe Mathieu-Daudé } 1321a2b0a27dSPhilippe Mathieu-Daudé break; 1322a2b0a27dSPhilippe Mathieu-Daudé case OPC_SUBSUU_S_df: 1323a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1324a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1325a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subsuu_s_b(cpu_env, twd, tws, twt); 1326a2b0a27dSPhilippe Mathieu-Daudé break; 1327a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1328a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subsuu_s_h(cpu_env, twd, tws, twt); 1329a2b0a27dSPhilippe Mathieu-Daudé break; 1330a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1331a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subsuu_s_w(cpu_env, twd, tws, twt); 1332a2b0a27dSPhilippe Mathieu-Daudé break; 1333a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1334a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_subsuu_s_d(cpu_env, twd, tws, twt); 1335a2b0a27dSPhilippe Mathieu-Daudé break; 1336a2b0a27dSPhilippe Mathieu-Daudé } 1337a2b0a27dSPhilippe Mathieu-Daudé break; 1338a2b0a27dSPhilippe Mathieu-Daudé default: 1339a2b0a27dSPhilippe Mathieu-Daudé MIPS_INVAL("MSA instruction"); 1340a2b0a27dSPhilippe Mathieu-Daudé gen_reserved_instruction(ctx); 1341a2b0a27dSPhilippe Mathieu-Daudé break; 1342a2b0a27dSPhilippe Mathieu-Daudé } 1343a2b0a27dSPhilippe Mathieu-Daudé tcg_temp_free_i32(twd); 1344a2b0a27dSPhilippe Mathieu-Daudé tcg_temp_free_i32(tws); 1345a2b0a27dSPhilippe Mathieu-Daudé tcg_temp_free_i32(twt); 1346a2b0a27dSPhilippe Mathieu-Daudé tcg_temp_free_i32(tdf); 1347a2b0a27dSPhilippe Mathieu-Daudé } 1348a2b0a27dSPhilippe Mathieu-Daudé 1349a2b0a27dSPhilippe Mathieu-Daudé static void gen_msa_elm_3e(DisasContext *ctx) 1350a2b0a27dSPhilippe Mathieu-Daudé { 1351a2b0a27dSPhilippe Mathieu-Daudé #define MASK_MSA_ELM_DF3E(op) (MASK_MSA_MINOR(op) | (op & (0x3FF << 16))) 1352a2b0a27dSPhilippe Mathieu-Daudé uint8_t source = (ctx->opcode >> 11) & 0x1f; 1353a2b0a27dSPhilippe Mathieu-Daudé uint8_t dest = (ctx->opcode >> 6) & 0x1f; 1354a2b0a27dSPhilippe Mathieu-Daudé TCGv telm = tcg_temp_new(); 1355a2b0a27dSPhilippe Mathieu-Daudé TCGv_i32 tsr = tcg_const_i32(source); 1356a2b0a27dSPhilippe Mathieu-Daudé TCGv_i32 tdt = tcg_const_i32(dest); 1357a2b0a27dSPhilippe Mathieu-Daudé 1358a2b0a27dSPhilippe Mathieu-Daudé switch (MASK_MSA_ELM_DF3E(ctx->opcode)) { 1359a2b0a27dSPhilippe Mathieu-Daudé case OPC_CTCMSA: 1360a2b0a27dSPhilippe Mathieu-Daudé gen_load_gpr(telm, source); 1361a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_ctcmsa(cpu_env, telm, tdt); 1362a2b0a27dSPhilippe Mathieu-Daudé break; 1363a2b0a27dSPhilippe Mathieu-Daudé case OPC_CFCMSA: 1364a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_cfcmsa(telm, cpu_env, tsr); 1365a2b0a27dSPhilippe Mathieu-Daudé gen_store_gpr(telm, dest); 1366a2b0a27dSPhilippe Mathieu-Daudé break; 1367a2b0a27dSPhilippe Mathieu-Daudé case OPC_MOVE_V: 1368a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_move_v(cpu_env, tdt, tsr); 1369a2b0a27dSPhilippe Mathieu-Daudé break; 1370a2b0a27dSPhilippe Mathieu-Daudé default: 1371a2b0a27dSPhilippe Mathieu-Daudé MIPS_INVAL("MSA instruction"); 1372a2b0a27dSPhilippe Mathieu-Daudé gen_reserved_instruction(ctx); 1373a2b0a27dSPhilippe Mathieu-Daudé break; 1374a2b0a27dSPhilippe Mathieu-Daudé } 1375a2b0a27dSPhilippe Mathieu-Daudé 1376a2b0a27dSPhilippe Mathieu-Daudé tcg_temp_free(telm); 1377a2b0a27dSPhilippe Mathieu-Daudé tcg_temp_free_i32(tdt); 1378a2b0a27dSPhilippe Mathieu-Daudé tcg_temp_free_i32(tsr); 1379a2b0a27dSPhilippe Mathieu-Daudé } 1380a2b0a27dSPhilippe Mathieu-Daudé 1381a2b0a27dSPhilippe Mathieu-Daudé static void gen_msa_elm_df(DisasContext *ctx, uint32_t df, uint32_t n) 1382a2b0a27dSPhilippe Mathieu-Daudé { 1383a2b0a27dSPhilippe Mathieu-Daudé #define MASK_MSA_ELM(op) (MASK_MSA_MINOR(op) | (op & (0xf << 22))) 1384a2b0a27dSPhilippe Mathieu-Daudé uint8_t ws = (ctx->opcode >> 11) & 0x1f; 1385a2b0a27dSPhilippe Mathieu-Daudé uint8_t wd = (ctx->opcode >> 6) & 0x1f; 1386a2b0a27dSPhilippe Mathieu-Daudé 1387a2b0a27dSPhilippe Mathieu-Daudé TCGv_i32 tws = tcg_const_i32(ws); 1388a2b0a27dSPhilippe Mathieu-Daudé TCGv_i32 twd = tcg_const_i32(wd); 1389a2b0a27dSPhilippe Mathieu-Daudé TCGv_i32 tn = tcg_const_i32(n); 13902b537a3dSPhilippe Mathieu-Daudé TCGv_i32 tdf = tcg_constant_i32(df); 1391a2b0a27dSPhilippe Mathieu-Daudé 1392a2b0a27dSPhilippe Mathieu-Daudé switch (MASK_MSA_ELM(ctx->opcode)) { 1393a2b0a27dSPhilippe Mathieu-Daudé case OPC_SLDI_df: 1394a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_sldi_df(cpu_env, tdf, twd, tws, tn); 1395a2b0a27dSPhilippe Mathieu-Daudé break; 1396a2b0a27dSPhilippe Mathieu-Daudé case OPC_SPLATI_df: 1397a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_splati_df(cpu_env, tdf, twd, tws, tn); 1398a2b0a27dSPhilippe Mathieu-Daudé break; 1399a2b0a27dSPhilippe Mathieu-Daudé case OPC_INSVE_df: 1400a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_insve_df(cpu_env, tdf, twd, tws, tn); 1401a2b0a27dSPhilippe Mathieu-Daudé break; 1402a2b0a27dSPhilippe Mathieu-Daudé case OPC_COPY_S_df: 1403a2b0a27dSPhilippe Mathieu-Daudé case OPC_COPY_U_df: 1404a2b0a27dSPhilippe Mathieu-Daudé case OPC_INSERT_df: 1405a2b0a27dSPhilippe Mathieu-Daudé #if !defined(TARGET_MIPS64) 1406a2b0a27dSPhilippe Mathieu-Daudé /* Double format valid only for MIPS64 */ 1407a2b0a27dSPhilippe Mathieu-Daudé if (df == DF_DOUBLE) { 1408a2b0a27dSPhilippe Mathieu-Daudé gen_reserved_instruction(ctx); 1409a2b0a27dSPhilippe Mathieu-Daudé break; 1410a2b0a27dSPhilippe Mathieu-Daudé } 1411a2b0a27dSPhilippe Mathieu-Daudé if ((MASK_MSA_ELM(ctx->opcode) == OPC_COPY_U_df) && 1412a2b0a27dSPhilippe Mathieu-Daudé (df == DF_WORD)) { 1413a2b0a27dSPhilippe Mathieu-Daudé gen_reserved_instruction(ctx); 1414a2b0a27dSPhilippe Mathieu-Daudé break; 1415a2b0a27dSPhilippe Mathieu-Daudé } 1416a2b0a27dSPhilippe Mathieu-Daudé #endif 1417a2b0a27dSPhilippe Mathieu-Daudé switch (MASK_MSA_ELM(ctx->opcode)) { 1418a2b0a27dSPhilippe Mathieu-Daudé case OPC_COPY_S_df: 1419a2b0a27dSPhilippe Mathieu-Daudé if (likely(wd != 0)) { 1420a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1421a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1422a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_copy_s_b(cpu_env, twd, tws, tn); 1423a2b0a27dSPhilippe Mathieu-Daudé break; 1424a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1425a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_copy_s_h(cpu_env, twd, tws, tn); 1426a2b0a27dSPhilippe Mathieu-Daudé break; 1427a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1428a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_copy_s_w(cpu_env, twd, tws, tn); 1429a2b0a27dSPhilippe Mathieu-Daudé break; 1430a2b0a27dSPhilippe Mathieu-Daudé #if defined(TARGET_MIPS64) 1431a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1432a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_copy_s_d(cpu_env, twd, tws, tn); 1433a2b0a27dSPhilippe Mathieu-Daudé break; 1434a2b0a27dSPhilippe Mathieu-Daudé #endif 1435a2b0a27dSPhilippe Mathieu-Daudé default: 1436a2b0a27dSPhilippe Mathieu-Daudé assert(0); 1437a2b0a27dSPhilippe Mathieu-Daudé } 1438a2b0a27dSPhilippe Mathieu-Daudé } 1439a2b0a27dSPhilippe Mathieu-Daudé break; 1440a2b0a27dSPhilippe Mathieu-Daudé case OPC_COPY_U_df: 1441a2b0a27dSPhilippe Mathieu-Daudé if (likely(wd != 0)) { 1442a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1443a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1444a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_copy_u_b(cpu_env, twd, tws, tn); 1445a2b0a27dSPhilippe Mathieu-Daudé break; 1446a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1447a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_copy_u_h(cpu_env, twd, tws, tn); 1448a2b0a27dSPhilippe Mathieu-Daudé break; 1449a2b0a27dSPhilippe Mathieu-Daudé #if defined(TARGET_MIPS64) 1450a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1451a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_copy_u_w(cpu_env, twd, tws, tn); 1452a2b0a27dSPhilippe Mathieu-Daudé break; 1453a2b0a27dSPhilippe Mathieu-Daudé #endif 1454a2b0a27dSPhilippe Mathieu-Daudé default: 1455a2b0a27dSPhilippe Mathieu-Daudé assert(0); 1456a2b0a27dSPhilippe Mathieu-Daudé } 1457a2b0a27dSPhilippe Mathieu-Daudé } 1458a2b0a27dSPhilippe Mathieu-Daudé break; 1459a2b0a27dSPhilippe Mathieu-Daudé case OPC_INSERT_df: 1460a2b0a27dSPhilippe Mathieu-Daudé switch (df) { 1461a2b0a27dSPhilippe Mathieu-Daudé case DF_BYTE: 1462a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_insert_b(cpu_env, twd, tws, tn); 1463a2b0a27dSPhilippe Mathieu-Daudé break; 1464a2b0a27dSPhilippe Mathieu-Daudé case DF_HALF: 1465a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_insert_h(cpu_env, twd, tws, tn); 1466a2b0a27dSPhilippe Mathieu-Daudé break; 1467a2b0a27dSPhilippe Mathieu-Daudé case DF_WORD: 1468a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_insert_w(cpu_env, twd, tws, tn); 1469a2b0a27dSPhilippe Mathieu-Daudé break; 1470a2b0a27dSPhilippe Mathieu-Daudé #if defined(TARGET_MIPS64) 1471a2b0a27dSPhilippe Mathieu-Daudé case DF_DOUBLE: 1472a2b0a27dSPhilippe Mathieu-Daudé gen_helper_msa_insert_d(cpu_env, twd, tws, tn); 1473a2b0a27dSPhilippe Mathieu-Daudé break; 1474a2b0a27dSPhilippe Mathieu-Daudé #endif 1475a2b0a27dSPhilippe Mathieu-Daudé default: 1476a2b0a27dSPhilippe Mathieu-Daudé assert(0); 1477a2b0a27dSPhilippe Mathieu-Daudé } 1478a2b0a27dSPhilippe Mathieu-Daudé break; 1479a2b0a27dSPhilippe Mathieu-Daudé } 1480a2b0a27dSPhilippe Mathieu-Daudé break; 1481a2b0a27dSPhilippe Mathieu-Daudé default: 1482a2b0a27dSPhilippe Mathieu-Daudé MIPS_INVAL("MSA instruction"); 1483a2b0a27dSPhilippe Mathieu-Daudé gen_reserved_instruction(ctx); 1484a2b0a27dSPhilippe Mathieu-Daudé } 1485a2b0a27dSPhilippe Mathieu-Daudé tcg_temp_free_i32(twd); 1486a2b0a27dSPhilippe Mathieu-Daudé tcg_temp_free_i32(tws); 1487a2b0a27dSPhilippe Mathieu-Daudé tcg_temp_free_i32(tn); 1488a2b0a27dSPhilippe Mathieu-Daudé } 1489a2b0a27dSPhilippe Mathieu-Daudé 1490a2b0a27dSPhilippe Mathieu-Daudé static void gen_msa_elm(DisasContext *ctx) 1491a2b0a27dSPhilippe Mathieu-Daudé { 1492a2b0a27dSPhilippe Mathieu-Daudé uint8_t dfn = (ctx->opcode >> 16) & 0x3f; 1493a2b0a27dSPhilippe Mathieu-Daudé uint32_t df = 0, n = 0; 1494a2b0a27dSPhilippe Mathieu-Daudé 1495a2b0a27dSPhilippe Mathieu-Daudé if ((dfn & 0x30) == 0x00) { 1496a2b0a27dSPhilippe Mathieu-Daudé n = dfn & 0x0f; 1497a2b0a27dSPhilippe Mathieu-Daudé df = DF_BYTE; 1498a2b0a27dSPhilippe Mathieu-Daudé } else if ((dfn & 0x38) == 0x20) { 1499a2b0a27dSPhilippe Mathieu-Daudé n = dfn & 0x07; 1500a2b0a27dSPhilippe Mathieu-Daudé df = DF_HALF; 1501a2b0a27dSPhilippe Mathieu-Daudé } else if ((dfn & 0x3c) == 0x30) { 1502a2b0a27dSPhilippe Mathieu-Daudé n = dfn & 0x03; 1503a2b0a27dSPhilippe Mathieu-Daudé df = DF_WORD; 1504a2b0a27dSPhilippe Mathieu-Daudé } else if ((dfn & 0x3e) == 0x38) { 1505a2b0a27dSPhilippe Mathieu-Daudé n = dfn & 0x01; 1506a2b0a27dSPhilippe Mathieu-Daudé df = DF_DOUBLE; 1507a2b0a27dSPhilippe Mathieu-Daudé } else if (dfn == 0x3E) { 1508a2b0a27dSPhilippe Mathieu-Daudé /* CTCMSA, CFCMSA, MOVE.V */ 1509a2b0a27dSPhilippe Mathieu-Daudé gen_msa_elm_3e(ctx); 1510a2b0a27dSPhilippe Mathieu-Daudé return; 1511a2b0a27dSPhilippe Mathieu-Daudé } else { 1512a2b0a27dSPhilippe Mathieu-Daudé gen_reserved_instruction(ctx); 1513a2b0a27dSPhilippe Mathieu-Daudé return; 1514a2b0a27dSPhilippe Mathieu-Daudé } 1515a2b0a27dSPhilippe Mathieu-Daudé 1516a2b0a27dSPhilippe Mathieu-Daudé gen_msa_elm_df(ctx, df, n); 1517a2b0a27dSPhilippe Mathieu-Daudé } 1518a2b0a27dSPhilippe Mathieu-Daudé 15192d5246f3SPhilippe Mathieu-Daudé TRANS(FCAF, trans_msa_3rf, gen_helper_msa_fcaf_df); 15202d5246f3SPhilippe Mathieu-Daudé TRANS(FCUN, trans_msa_3rf, gen_helper_msa_fcun_df); 15212d5246f3SPhilippe Mathieu-Daudé TRANS(FCEQ, trans_msa_3rf, gen_helper_msa_fceq_df); 15222d5246f3SPhilippe Mathieu-Daudé TRANS(FCUEQ, trans_msa_3rf, gen_helper_msa_fcueq_df); 15232d5246f3SPhilippe Mathieu-Daudé TRANS(FCLT, trans_msa_3rf, gen_helper_msa_fclt_df); 15242d5246f3SPhilippe Mathieu-Daudé TRANS(FCULT, trans_msa_3rf, gen_helper_msa_fcult_df); 15252d5246f3SPhilippe Mathieu-Daudé TRANS(FCLE, trans_msa_3rf, gen_helper_msa_fcle_df); 15262d5246f3SPhilippe Mathieu-Daudé TRANS(FCULE, trans_msa_3rf, gen_helper_msa_fcule_df); 15272d5246f3SPhilippe Mathieu-Daudé TRANS(FSAF, trans_msa_3rf, gen_helper_msa_fsaf_df); 15282d5246f3SPhilippe Mathieu-Daudé TRANS(FSUN, trans_msa_3rf, gen_helper_msa_fsun_df); 15292d5246f3SPhilippe Mathieu-Daudé TRANS(FSEQ, trans_msa_3rf, gen_helper_msa_fseq_df); 15302d5246f3SPhilippe Mathieu-Daudé TRANS(FSUEQ, trans_msa_3rf, gen_helper_msa_fsueq_df); 15312d5246f3SPhilippe Mathieu-Daudé TRANS(FSLT, trans_msa_3rf, gen_helper_msa_fslt_df); 15322d5246f3SPhilippe Mathieu-Daudé TRANS(FSULT, trans_msa_3rf, gen_helper_msa_fsult_df); 15332d5246f3SPhilippe Mathieu-Daudé TRANS(FSLE, trans_msa_3rf, gen_helper_msa_fsle_df); 15342d5246f3SPhilippe Mathieu-Daudé TRANS(FSULE, trans_msa_3rf, gen_helper_msa_fsule_df); 15352d5246f3SPhilippe Mathieu-Daudé 15362d5246f3SPhilippe Mathieu-Daudé TRANS(FADD, trans_msa_3rf, gen_helper_msa_fadd_df); 15372d5246f3SPhilippe Mathieu-Daudé TRANS(FSUB, trans_msa_3rf, gen_helper_msa_fsub_df); 15382d5246f3SPhilippe Mathieu-Daudé TRANS(FMUL, trans_msa_3rf, gen_helper_msa_fmul_df); 15392d5246f3SPhilippe Mathieu-Daudé TRANS(FDIV, trans_msa_3rf, gen_helper_msa_fdiv_df); 15402d5246f3SPhilippe Mathieu-Daudé TRANS(FMADD, trans_msa_3rf, gen_helper_msa_fmadd_df); 15412d5246f3SPhilippe Mathieu-Daudé TRANS(FMSUB, trans_msa_3rf, gen_helper_msa_fmsub_df); 15422d5246f3SPhilippe Mathieu-Daudé TRANS(FEXP2, trans_msa_3rf, gen_helper_msa_fexp2_df); 15432d5246f3SPhilippe Mathieu-Daudé TRANS(FEXDO, trans_msa_3rf, gen_helper_msa_fexdo_df); 15442d5246f3SPhilippe Mathieu-Daudé TRANS(FTQ, trans_msa_3rf, gen_helper_msa_ftq_df); 15452d5246f3SPhilippe Mathieu-Daudé TRANS(FMIN, trans_msa_3rf, gen_helper_msa_fmin_df); 15462d5246f3SPhilippe Mathieu-Daudé TRANS(FMIN_A, trans_msa_3rf, gen_helper_msa_fmin_a_df); 15472d5246f3SPhilippe Mathieu-Daudé TRANS(FMAX, trans_msa_3rf, gen_helper_msa_fmax_df); 15482d5246f3SPhilippe Mathieu-Daudé TRANS(FMAX_A, trans_msa_3rf, gen_helper_msa_fmax_a_df); 15492d5246f3SPhilippe Mathieu-Daudé 15502d5246f3SPhilippe Mathieu-Daudé TRANS(FCOR, trans_msa_3rf, gen_helper_msa_fcor_df); 15512d5246f3SPhilippe Mathieu-Daudé TRANS(FCUNE, trans_msa_3rf, gen_helper_msa_fcune_df); 15522d5246f3SPhilippe Mathieu-Daudé TRANS(FCNE, trans_msa_3rf, gen_helper_msa_fcne_df); 1553ff29e5d3SPhilippe Mathieu-Daudé TRANS(MUL_Q, trans_msa_3rf, gen_helper_msa_mul_q_df); 1554ff29e5d3SPhilippe Mathieu-Daudé TRANS(MADD_Q, trans_msa_3rf, gen_helper_msa_madd_q_df); 1555ff29e5d3SPhilippe Mathieu-Daudé TRANS(MSUB_Q, trans_msa_3rf, gen_helper_msa_msub_q_df); 15562d5246f3SPhilippe Mathieu-Daudé TRANS(FSOR, trans_msa_3rf, gen_helper_msa_fsor_df); 15572d5246f3SPhilippe Mathieu-Daudé TRANS(FSUNE, trans_msa_3rf, gen_helper_msa_fsune_df); 15582d5246f3SPhilippe Mathieu-Daudé TRANS(FSNE, trans_msa_3rf, gen_helper_msa_fsne_df); 1559ff29e5d3SPhilippe Mathieu-Daudé TRANS(MULR_Q, trans_msa_3rf, gen_helper_msa_mulr_q_df); 1560ff29e5d3SPhilippe Mathieu-Daudé TRANS(MADDR_Q, trans_msa_3rf, gen_helper_msa_maddr_q_df); 1561ff29e5d3SPhilippe Mathieu-Daudé TRANS(MSUBR_Q, trans_msa_3rf, gen_helper_msa_msubr_q_df); 1562ff29e5d3SPhilippe Mathieu-Daudé 1563adcff99aSPhilippe Mathieu-Daudé static bool trans_msa_2r(DisasContext *ctx, arg_msa_r *a, 1564adcff99aSPhilippe Mathieu-Daudé gen_helper_pii *gen_msa_2r) 1565a2b0a27dSPhilippe Mathieu-Daudé { 1566adcff99aSPhilippe Mathieu-Daudé if (!check_msa_enabled(ctx)) { 1567adcff99aSPhilippe Mathieu-Daudé return true; 1568a2b0a27dSPhilippe Mathieu-Daudé } 1569a2b0a27dSPhilippe Mathieu-Daudé 1570adcff99aSPhilippe Mathieu-Daudé gen_msa_2r(cpu_env, tcg_constant_i32(a->wd), tcg_constant_i32(a->ws)); 1571adcff99aSPhilippe Mathieu-Daudé 1572adcff99aSPhilippe Mathieu-Daudé return true; 1573a2b0a27dSPhilippe Mathieu-Daudé } 1574a2b0a27dSPhilippe Mathieu-Daudé 1575adcff99aSPhilippe Mathieu-Daudé TRANS_DF_ii(PCNT, trans_msa_2r, gen_helper_msa_pcnt); 1576adcff99aSPhilippe Mathieu-Daudé TRANS_DF_ii(NLOC, trans_msa_2r, gen_helper_msa_nloc); 1577adcff99aSPhilippe Mathieu-Daudé TRANS_DF_ii(NLZC, trans_msa_2r, gen_helper_msa_nlzc); 1578adcff99aSPhilippe Mathieu-Daudé 1579675bf34aSPhilippe Mathieu-Daudé static bool trans_FILL(DisasContext *ctx, arg_msa_r *a) 1580675bf34aSPhilippe Mathieu-Daudé { 1581675bf34aSPhilippe Mathieu-Daudé if (TARGET_LONG_BITS != 64 && a->df == DF_DOUBLE) { 1582675bf34aSPhilippe Mathieu-Daudé /* Double format valid only for MIPS64 */ 1583675bf34aSPhilippe Mathieu-Daudé return false; 1584675bf34aSPhilippe Mathieu-Daudé } 1585675bf34aSPhilippe Mathieu-Daudé 1586675bf34aSPhilippe Mathieu-Daudé if (!check_msa_enabled(ctx)) { 1587675bf34aSPhilippe Mathieu-Daudé return true; 1588675bf34aSPhilippe Mathieu-Daudé } 1589675bf34aSPhilippe Mathieu-Daudé 1590675bf34aSPhilippe Mathieu-Daudé gen_helper_msa_fill_df(cpu_env, 1591675bf34aSPhilippe Mathieu-Daudé tcg_constant_i32(a->df), 1592675bf34aSPhilippe Mathieu-Daudé tcg_constant_i32(a->wd), 1593675bf34aSPhilippe Mathieu-Daudé tcg_constant_i32(a->ws)); 1594675bf34aSPhilippe Mathieu-Daudé 1595675bf34aSPhilippe Mathieu-Daudé return true; 1596675bf34aSPhilippe Mathieu-Daudé } 1597675bf34aSPhilippe Mathieu-Daudé 15985c5b6400SPhilippe Mathieu-Daudé static bool trans_msa_2rf(DisasContext *ctx, arg_msa_r *a, 15995c5b6400SPhilippe Mathieu-Daudé gen_helper_piii *gen_msa_2rf) 1600a2b0a27dSPhilippe Mathieu-Daudé { 16015c5b6400SPhilippe Mathieu-Daudé if (!check_msa_enabled(ctx)) { 16025c5b6400SPhilippe Mathieu-Daudé return true; 1603a2b0a27dSPhilippe Mathieu-Daudé } 1604a2b0a27dSPhilippe Mathieu-Daudé 16055c5b6400SPhilippe Mathieu-Daudé gen_msa_2rf(cpu_env, 16065c5b6400SPhilippe Mathieu-Daudé tcg_constant_i32(a->df), 16075c5b6400SPhilippe Mathieu-Daudé tcg_constant_i32(a->wd), 16085c5b6400SPhilippe Mathieu-Daudé tcg_constant_i32(a->ws)); 16095c5b6400SPhilippe Mathieu-Daudé 16105c5b6400SPhilippe Mathieu-Daudé return true; 1611a2b0a27dSPhilippe Mathieu-Daudé } 1612a2b0a27dSPhilippe Mathieu-Daudé 16135c5b6400SPhilippe Mathieu-Daudé TRANS(FCLASS, trans_msa_2rf, gen_helper_msa_fclass_df); 16145c5b6400SPhilippe Mathieu-Daudé TRANS(FTRUNC_S, trans_msa_2rf, gen_helper_msa_fclass_df); 16155c5b6400SPhilippe Mathieu-Daudé TRANS(FTRUNC_U, trans_msa_2rf, gen_helper_msa_ftrunc_s_df); 16165c5b6400SPhilippe Mathieu-Daudé TRANS(FSQRT, trans_msa_2rf, gen_helper_msa_fsqrt_df); 16175c5b6400SPhilippe Mathieu-Daudé TRANS(FRSQRT, trans_msa_2rf, gen_helper_msa_frsqrt_df); 16185c5b6400SPhilippe Mathieu-Daudé TRANS(FRCP, trans_msa_2rf, gen_helper_msa_frcp_df); 16195c5b6400SPhilippe Mathieu-Daudé TRANS(FRINT, trans_msa_2rf, gen_helper_msa_frint_df); 16205c5b6400SPhilippe Mathieu-Daudé TRANS(FLOG2, trans_msa_2rf, gen_helper_msa_flog2_df); 16215c5b6400SPhilippe Mathieu-Daudé TRANS(FEXUPL, trans_msa_2rf, gen_helper_msa_fexupl_df); 16225c5b6400SPhilippe Mathieu-Daudé TRANS(FEXUPR, trans_msa_2rf, gen_helper_msa_fexupr_df); 16235c5b6400SPhilippe Mathieu-Daudé TRANS(FFQL, trans_msa_2rf, gen_helper_msa_ffql_df); 16245c5b6400SPhilippe Mathieu-Daudé TRANS(FFQR, trans_msa_2rf, gen_helper_msa_ffqr_df); 16255c5b6400SPhilippe Mathieu-Daudé TRANS(FTINT_S, trans_msa_2rf, gen_helper_msa_ftint_s_df); 16265c5b6400SPhilippe Mathieu-Daudé TRANS(FTINT_U, trans_msa_2rf, gen_helper_msa_ftint_u_df); 16275c5b6400SPhilippe Mathieu-Daudé TRANS(FFINT_S, trans_msa_2rf, gen_helper_msa_ffint_s_df); 16285c5b6400SPhilippe Mathieu-Daudé TRANS(FFINT_U, trans_msa_2rf, gen_helper_msa_ffint_u_df); 16295c5b6400SPhilippe Mathieu-Daudé 1630525ea877SPhilippe Mathieu-Daudé static bool trans_MSA(DisasContext *ctx, arg_MSA *a) 1631a2b0a27dSPhilippe Mathieu-Daudé { 1632a2b0a27dSPhilippe Mathieu-Daudé uint32_t opcode = ctx->opcode; 1633a2b0a27dSPhilippe Mathieu-Daudé 1634340ee8b3SPhilippe Mathieu-Daudé if (!check_msa_enabled(ctx)) { 1635340ee8b3SPhilippe Mathieu-Daudé return true; 1636340ee8b3SPhilippe Mathieu-Daudé } 1637a2b0a27dSPhilippe Mathieu-Daudé 1638a2b0a27dSPhilippe Mathieu-Daudé switch (MASK_MSA_MINOR(opcode)) { 1639a2b0a27dSPhilippe Mathieu-Daudé case OPC_MSA_3R_0D: 1640a2b0a27dSPhilippe Mathieu-Daudé case OPC_MSA_3R_0E: 1641a2b0a27dSPhilippe Mathieu-Daudé case OPC_MSA_3R_0F: 1642a2b0a27dSPhilippe Mathieu-Daudé case OPC_MSA_3R_10: 1643a2b0a27dSPhilippe Mathieu-Daudé case OPC_MSA_3R_11: 1644a2b0a27dSPhilippe Mathieu-Daudé case OPC_MSA_3R_12: 1645a2b0a27dSPhilippe Mathieu-Daudé case OPC_MSA_3R_13: 1646a2b0a27dSPhilippe Mathieu-Daudé case OPC_MSA_3R_14: 1647a2b0a27dSPhilippe Mathieu-Daudé case OPC_MSA_3R_15: 1648a2b0a27dSPhilippe Mathieu-Daudé gen_msa_3r(ctx); 1649a2b0a27dSPhilippe Mathieu-Daudé break; 1650a2b0a27dSPhilippe Mathieu-Daudé case OPC_MSA_ELM: 1651a2b0a27dSPhilippe Mathieu-Daudé gen_msa_elm(ctx); 1652a2b0a27dSPhilippe Mathieu-Daudé break; 1653a2b0a27dSPhilippe Mathieu-Daudé default: 1654a2b0a27dSPhilippe Mathieu-Daudé MIPS_INVAL("MSA instruction"); 1655a2b0a27dSPhilippe Mathieu-Daudé gen_reserved_instruction(ctx); 1656a2b0a27dSPhilippe Mathieu-Daudé break; 1657a2b0a27dSPhilippe Mathieu-Daudé } 1658a2b0a27dSPhilippe Mathieu-Daudé 1659a2b0a27dSPhilippe Mathieu-Daudé return true; 1660a2b0a27dSPhilippe Mathieu-Daudé } 1661a2b0a27dSPhilippe Mathieu-Daudé 1662ce121fe2SPhilippe Mathieu-Daudé static bool trans_msa_ldst(DisasContext *ctx, arg_msa_i *a, 1663ce121fe2SPhilippe Mathieu-Daudé gen_helper_piv *gen_msa_ldst) 1664ce121fe2SPhilippe Mathieu-Daudé { 1665ce121fe2SPhilippe Mathieu-Daudé TCGv taddr; 1666ce121fe2SPhilippe Mathieu-Daudé 1667ce121fe2SPhilippe Mathieu-Daudé if (!check_msa_enabled(ctx)) { 1668ce121fe2SPhilippe Mathieu-Daudé return true; 1669ce121fe2SPhilippe Mathieu-Daudé } 1670ce121fe2SPhilippe Mathieu-Daudé 1671ce121fe2SPhilippe Mathieu-Daudé taddr = tcg_temp_new(); 1672ce121fe2SPhilippe Mathieu-Daudé 1673ce121fe2SPhilippe Mathieu-Daudé gen_base_offset_addr(ctx, taddr, a->ws, a->sa << a->df); 1674ce121fe2SPhilippe Mathieu-Daudé gen_msa_ldst(cpu_env, tcg_constant_i32(a->wd), taddr); 1675ce121fe2SPhilippe Mathieu-Daudé 1676ce121fe2SPhilippe Mathieu-Daudé tcg_temp_free(taddr); 1677ce121fe2SPhilippe Mathieu-Daudé 1678ce121fe2SPhilippe Mathieu-Daudé return true; 1679ce121fe2SPhilippe Mathieu-Daudé } 1680ce121fe2SPhilippe Mathieu-Daudé 1681ce121fe2SPhilippe Mathieu-Daudé TRANS_DF_iv(LD, trans_msa_ldst, gen_helper_msa_ld); 1682ce121fe2SPhilippe Mathieu-Daudé TRANS_DF_iv(ST, trans_msa_ldst, gen_helper_msa_st); 1683ce121fe2SPhilippe Mathieu-Daudé 168434fe9fa3SPhilippe Mathieu-Daudé static bool trans_LSA(DisasContext *ctx, arg_r *a) 1685a2b0a27dSPhilippe Mathieu-Daudé { 1686a2b0a27dSPhilippe Mathieu-Daudé return gen_lsa(ctx, a->rd, a->rt, a->rs, a->sa); 1687a2b0a27dSPhilippe Mathieu-Daudé } 1688a2b0a27dSPhilippe Mathieu-Daudé 168934fe9fa3SPhilippe Mathieu-Daudé static bool trans_DLSA(DisasContext *ctx, arg_r *a) 1690a2b0a27dSPhilippe Mathieu-Daudé { 1691f5c6ee0cSPhilippe Mathieu-Daudé if (TARGET_LONG_BITS != 64) { 1692f5c6ee0cSPhilippe Mathieu-Daudé return false; 1693f5c6ee0cSPhilippe Mathieu-Daudé } 1694a2b0a27dSPhilippe Mathieu-Daudé return gen_dlsa(ctx, a->rd, a->rt, a->rs, a->sa); 1695a2b0a27dSPhilippe Mathieu-Daudé } 1696