regs.fpu_state = 1;
}
+static void trace_t0_68040(void)
+{
+ if (regs.t0 && currprefs.cpu_model == 68040)
+ check_t0_trace();
+}
+
+
void fpuop_dbcc (uae_u32 opcode, uae_u16 extra)
{
uaecptr pc = m68k_getpc ();
regs.fp_branch = true;
}
}
+ // 68040 FDBCC: T0 always
+ trace_t0_68040();
}
void fpuop_scc (uae_u32 opcode, uae_u16 extra)
x_cp_put_long(ad, fsave_data.et[2]); // ETM
ad += 4;
}
+ // 68040 FSAVE: T0 always
+ trace_t0_68040();
} else { /* 68881/68882 */
uae_u32 biu_flags = 0x540effff;
int frame_size = currprefs.fpu_model == 68882 ? 0x3c : 0x1c;
m68k_areg (regs, opcode & 7) = ad;
if ((opcode & 0x38) == 0x20)
m68k_areg (regs, opcode & 7) = ad;
+ trace_t0_68040();
} else {
/* FMOVEM Memory->Control Register */
uae_u32 ad;
if (extra & 0x2000) {
/* FMOVEM FPP->Memory */
ad = fmovem2mem (ad, list, incr, regdir);
+ trace_t0_68040();
} else {
/* FMOVEM Memory->FPP */
ad = fmovem2fpp (ad, list, incr, regdir);
printf("\tif(regs.t0) check_t0_trace();\n");
}
+static void trace_t0_68040_only(void)
+{
+ if (cpu_level == 4)
+ check_trace();
+ if (cpu_level == 5) {
+ if (next_cpu_level < 5)
+ next_cpu_level = 5 - 1;
+ } else if (cpu_level == 4) {
+ if (next_cpu_level < 4)
+ next_cpu_level = 4 - 1;
+ }
+}
+
// check trace bits
static void fill_prefetch_full (void)
{
genamode (curi, curi->smode, "srcreg", curi->size, "src", 1, 0, 0);
fill_prefetch_next ();
printf ("\tregs.usp = src;\n");
- if (cpu_level == 4)
- check_trace();
- next_level_040_to_030();
+ trace_t0_68040_only();
break;
case i_MVUSP2R:
genamode (curi, curi->smode, "srcreg", curi->size, "src", 2, 0, 0);
break;
case i_NOP:
fill_prefetch_next ();
- if (cpu_level == 4)
- check_trace();
- next_level_040_to_030();
+ trace_t0_68040_only();
break;
case i_STOP:
next_level_000();
genamode(NULL, curi->dmode, "dstreg", curi->size, "offs", GENA_GETV_FETCH, GENA_MOVEM_DO_INC, 0);
if (cpu_level == 4) {
genamode(NULL, Apdi, "7", sz_long, "old", GENA_GETV_FETCH_ALIGN, GENA_MOVEM_DO_INC, 0);
- genastore("m68k_areg(regs, 7)", curi->smode, "srcreg", sz_long, "src");
genamode(NULL, curi->smode, "srcreg", sz_long, "src", GENA_GETV_FETCH, GENA_MOVEM_DO_INC, 0);
+ genastore("m68k_areg(regs, 7)", curi->smode, "srcreg", sz_long, "src");
} else {
genamode(NULL, curi->smode, "srcreg", sz_long, "src", GENA_GETV_FETCH, GENA_MOVEM_DO_INC, 0);
genamode(NULL, Apdi, "7", sz_long, "old", GENA_GETV_FETCH_ALIGN, GENA_MOVEM_DO_INC, 0);
printf ("\tint regno = (src >> 12) & 15;\n");
printf ("\tuae_u32 *regp = regs.regs + regno;\n");
printf ("\tif (! m68k_movec2(src & 0xFFF, regp)) goto %s;\n", endlabelstr);
- if (cpu_level == 4)
- check_trace();
- next_level_040_to_030();
+ trace_t0_68040_only();
break;
case i_MOVE2C:
genamode (curi, curi->smode, "srcreg", curi->size, "src", 1, 0, 0);
printf ("\tint regno = (src >> 12) & 15;\n");
printf ("\tuae_u32 *regp = regs.regs + regno;\n");
printf ("\tif (! m68k_move2c(src & 0xFFF, regp)) goto %s;\n", endlabelstr);
- if (cpu_level == 4)
- check_trace();
- next_level_040_to_030();
+ trace_t0_68040_only();
break;
case i_CAS:
{
break;
}
pop_braces (old_brace_level);
- if (cpu_level == 4)
- check_trace();
- next_level_040_to_030();
+ trace_t0_68040_only();
}
break;
case i_CAS2:
}
printf ("\t}\n");
}
- if (cpu_level == 4)
- check_trace();
- next_level_040_to_030();
+ trace_t0_68040_only();
break;
case i_MOVES: /* ignore DFC and SFC when using_mmu == false */
{
returntail(false);
pop_braces (old_brace_level);
}
- if (cpu_level == 4)
- check_trace();
- if (cpu_level >= 5) {
- if (next_cpu_level < 5)
- next_cpu_level = 5 - 1;
- }
+ trace_t0_68040_only();
}
break;
case i_BKPT: /* only needed for hardware emulators */
addcycles000_nonce("\t\t", 4);
printf ("\t}\n");
}
+ trace_t0_68040_only();
break;
case i_FPP:
fpulimit();
case i_PFLUSHA:
sync_m68k_pc();
printf("\tmmu_op (opcode, 0);\n");
- if (cpu_level == 4)
- check_trace();
+ trace_t0_68040_only();
break;
case i_PLPAR:
case i_PLPAW:
case i_PTESTW:
sync_m68k_pc ();
printf ("\tmmu_op (opcode, 0);\n");
- if (cpu_level == 4)
- check_trace();
+ trace_t0_68040_only();
break;
case i_MMUOP030:
printf("\tuaecptr pc = %s;\n", getpc);