On 05/24/2010 09:19 AM, Nathan Froyd wrote:
+int (*ldfun)(target_ulong);
+
+switch (mem_idx)
+{
+case 0: ldfun = ldl_kernel; break;
+case 1: ldfun = ldl_super; break;
+default:
+case 2: ldfun = ldl_user; break;
+}
This *should* now be a compile error. The return type should
now be uint32_t, not int.
+env-active_tc.gpr[multiple_regs[i]] = ldfun(addr);
...
+env-active_tc.gpr[31] = ldfun(addr);
Which means these will need explicit sign-extensions.
+void (*stfun)(target_ulong, int);
Similarly uint32_t, though no other changes should be required.
@@ -2535,26 +2555,29 @@ static void gen_compute_branch (DisasContext *ctx,
uint32_t opc,
case OPC_JALX:
ctx-hflags |= MIPS_HFLAG_BX;
/* Fallthrough */
+case OPC_JALS:
case OPC_JAL:
blink = 31;
ctx-hflags |= MIPS_HFLAG_B;
-ctx-hflags |= (ctx-hflags MIPS_HFLAG_M16
+ctx-hflags |= (opc == OPC_JALS
? MIPS_HFLAG_BDS16
: MIPS_HFLAG_BDS32);
Changed semantics here? You're no longer testing M16 bit.
Or is that later handled by switching mips16 to JALS too?
@@ -8678,7 +8709,7 @@ static int decode_mips16_opc (CPUState *env,
DisasContext *ctx,
int ra = (ctx-opcode 5) 0x1;
if (link) {
-op = nd ? OPC_JALRC : OPC_JALR;
+op = nd ? OPC_JALRC : OPC_JALRS;
Here's one conversion of mips16 to the new S opcodes, but
this is the only one. It *seems* like there should be more.
And if so, perhaps this patch should be broken into two, where
you introduce the new opcodes and hflags changes and apply them
as-needed to the mips16 code. Thus one can verify that the
semantics for mips16 are the same before and after.
... Unless there's some micromips dependency I'm not seeing?
+if (base == 0) {
+tcg_gen_movi_tl(t0, 0);
+} else {
+gen_load_gpr(t0, base);
+}
gen_load_gpr already takes care of R0.
+#if 0
+case 0x01:
+switch (minor) {
+case MFHI_ACC:
+gen_HILO(ctx, OPC_MFHI, rs);
New if 0 code?
r~