Skip to content

Commit

Permalink
target/mips: Add emulation of MXU instructions S32I2M and S32M2I
Browse files Browse the repository at this point in the history
Add support for emulating the S32I2M and S32M2I MXU instructions.
This commit also contains utility functions for reading/writing
to MXU registers. This is required for overall MXU instruction
support.

Reviewed-by: Aleksandar Markovic <amarkovic@wavecomp.com>
Signed-off-by: Craig Janeczek <jancraig@amazon.com>
Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
  • Loading branch information
Craig Janeczek authored and AMarkovic committed Oct 29, 2018
1 parent 11d56f6 commit 96992d1
Showing 1 changed file with 85 additions and 6 deletions.
91 changes: 85 additions & 6 deletions target/mips/translate.c
Expand Up @@ -2569,6 +2569,36 @@ static inline void gen_store_srsgpr (int from, int to)
}
}

/* MXU General purpose registers moves. */
static inline void gen_load_mxu_gpr(TCGv t, unsigned int reg)
{
if (reg == 0) {
tcg_gen_movi_tl(t, 0);
} else if (reg <= 15) {
tcg_gen_mov_tl(t, mxu_gpr[reg - 1]);
}
}

static inline void gen_store_mxu_gpr(TCGv t, unsigned int reg)
{
if (reg > 0 && reg <= 15) {
tcg_gen_mov_tl(mxu_gpr[reg - 1], t);
}
}

/* MXU control register moves. */
static inline void gen_load_mxu_cr(TCGv t)
{
tcg_gen_mov_tl(t, mxu_CR);
}

static inline void gen_store_mxu_cr(TCGv t)
{
/* TODO: Add handling of RW rules for MXU_CR. */
tcg_gen_mov_tl(mxu_CR, t);
}


/* Tests */
static inline void gen_save_pc(target_ulong pc)
{
Expand Down Expand Up @@ -24012,6 +24042,59 @@ static void decode_opc_special(CPUMIPSState *env, DisasContext *ctx)
#define MXU_OPTN3_PTN7 7


/*
* S32I2M XRa, rb - Register move from GRF to XRF
*/
static void gen_mxu_s32i2m(DisasContext *ctx)
{
TCGv t0;
uint32_t XRa, Rb;

t0 = tcg_temp_new();

XRa = extract32(ctx->opcode, 6, 5);
Rb = extract32(ctx->opcode, 16, 5);

gen_load_gpr(t0, Rb);
if (XRa <= 15) {
gen_store_mxu_gpr(t0, XRa);
} else if (XRa == 16) {
gen_store_mxu_cr(t0);
}

tcg_temp_free(t0);
}

/*
* S32M2I XRa, rb - Register move from XRF to GRF
*/
static void gen_mxu_s32m2i(DisasContext *ctx)
{
TCGv t0;
uint32_t XRa, Rb;

t0 = tcg_temp_new();

XRa = extract32(ctx->opcode, 6, 5);
Rb = extract32(ctx->opcode, 16, 5);

if (XRa <= 15) {
gen_load_mxu_gpr(t0, XRa);
} else if (XRa == 16) {
gen_load_mxu_cr(t0);
}

gen_store_gpr(t0, Rb);

tcg_temp_free(t0);
}


/*
* Decoding engine for MXU
* =======================
*/

/*
*
* Decode MXU pool00
Expand Down Expand Up @@ -25091,14 +25174,10 @@ static void decode_opc_mxu(CPUMIPSState *env, DisasContext *ctx)
generate_exception_end(ctx, EXCP_RI);
break;
case OPC_MXU_S32M2I:
/* TODO: Implement emulation of S32M2I instruction. */
MIPS_INVAL("OPC_MXU_S32M2I");
generate_exception_end(ctx, EXCP_RI);
gen_mxu_s32m2i(ctx);
break;
case OPC_MXU_S32I2M:
/* TODO: Implement emulation of S32I2M instruction. */
MIPS_INVAL("OPC_MXU_S32I2M");
generate_exception_end(ctx, EXCP_RI);
gen_mxu_s32i2m(ctx);
break;
case OPC_MXU_D32SLL:
/* TODO: Implement emulation of D32SLL instruction. */
Expand Down

0 comments on commit 96992d1

Please sign in to comment.