Extract the common code which parses data formats to an helper. Signed-off-by: Philippe Mathieu-Daudé <f4...@amsat.org> --- target/mips/tcg/msa_translate.c | 68 +++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 29 deletions(-)
diff --git a/target/mips/tcg/msa_translate.c b/target/mips/tcg/msa_translate.c index 3b0dfcca69d..7c1bbfaec61 100644 --- a/target/mips/tcg/msa_translate.c +++ b/target/mips/tcg/msa_translate.c @@ -272,6 +272,40 @@ static const char msaregnames[][6] = { "w30.d0", "w30.d1", "w31.d0", "w31.d1", }; +/* Encoding of Operation Field */ +static const struct dfe { + enum CPUMIPSMSADataFormat df; + int start; + int length; + uint32_t value; +} df_elm[] = { + /* Table 3.26 ELM Instruction Format */ + {DF_BYTE, 4, 2, 0b00}, + {DF_HALF, 3, 3, 0b100}, + {DF_WORD, 2, 4, 0b1100}, + {DF_DOUBLE, 1, 5, 0b11100} +}, df_bit[] = { + /* Table 3.28 BIT Instruction Format */ + {DF_BYTE, 3, 4, 0b1110}, + {DF_HALF, 4, 3, 0b110}, + {DF_WORD, 5, 2, 0b10}, + {DF_DOUBLE, 6, 1, 0b0} +}; + +/* Extract Operation Field (used by ELM & BIT instructions) */ +static bool df_extract(const struct dfe *s, int value, + enum CPUMIPSMSADataFormat *df, uint32_t *x) +{ + for (unsigned i = 0; i < 4; i++) { + if (extract32(value, s->start, s->length) == s->value) { + *x = extract32(value, 0, s->start); + *df = s->df; + return true; + } + } + return false; +} + static TCGv_i64 msa_wr_d[64]; void msa_translate_init(void) @@ -562,7 +596,6 @@ static void gen_msa_bit(DisasContext *ctx) { #define MASK_MSA_BIT(op) (MASK_MSA_MINOR(op) | (op & (0x7 << 23))) uint8_t dfm = (ctx->opcode >> 16) & 0x7f; - uint32_t df = 0, m = 0; uint8_t ws = (ctx->opcode >> 11) & 0x1f; uint8_t wd = (ctx->opcode >> 6) & 0x1f; @@ -570,20 +603,9 @@ static void gen_msa_bit(DisasContext *ctx) TCGv_i32 tm; TCGv_i32 twd; TCGv_i32 tws; + uint32_t df, m; - if ((dfm & 0x40) == 0x00) { - m = dfm & 0x3f; - df = DF_DOUBLE; - } else if ((dfm & 0x60) == 0x40) { - m = dfm & 0x1f; - df = DF_WORD; - } else if ((dfm & 0x70) == 0x60) { - m = dfm & 0x0f; - df = DF_HALF; - } else if ((dfm & 0x78) == 0x70) { - m = dfm & 0x7; - df = DF_BYTE; - } else { + if (!df_extract(df_bit, dfm, &df, &m)) { gen_reserved_instruction(ctx); return; } @@ -1768,25 +1790,13 @@ static void gen_msa_elm_df(DisasContext *ctx, uint32_t df, uint32_t n) static void gen_msa_elm(DisasContext *ctx) { uint8_t dfn = (ctx->opcode >> 16) & 0x3f; - uint32_t df = 0, n = 0; + uint32_t df, n; - if ((dfn & 0x30) == 0x00) { - n = dfn & 0x0f; - df = DF_BYTE; - } else if ((dfn & 0x38) == 0x20) { - n = dfn & 0x07; - df = DF_HALF; - } else if ((dfn & 0x3c) == 0x30) { - n = dfn & 0x03; - df = DF_WORD; - } else if ((dfn & 0x3e) == 0x38) { - n = dfn & 0x01; - df = DF_DOUBLE; - } else if (dfn == 0x3E) { + if (dfn == 0x3E) { /* CTCMSA, CFCMSA, MOVE.V */ gen_msa_elm_3e(ctx); return; - } else { + } else if (!df_extract(df_elm, dfn, &df, &n)) { gen_reserved_instruction(ctx); return; } -- 2.31.1