if (curi->dmode == Dreg) {
c += 2;
if (curi->smode == imm || curi->smode == Dreg) {
- c += 2;
+ if (cpu_level == 0) {
+ c += 2;
+ }
fill_prefetch_next_after(1, "\t\tccr_68000_long_move_ae_LZN(src);\n\t\tdreg_68000_long_replace_low(dstreg, src);\n");
} else {
fill_prefetch_next_after(1, "\t\tdreg_68000_long_replace_low(dstreg, src);\n");
if (curi->dmode == Dreg) {
c += 2;
if (curi->smode == imm || curi->smode == immi || curi->smode == Dreg || curi->smode == Areg) {
- c += 2;
+ if (cpu_level == 0) {
+ c += 2;
+ }
fill_prefetch_next_after(1,
"\t\tuae_s16 bnewv = (uae_s16)dst - (uae_s16)src;\n"
"\t\tint bflgs = ((uae_s16)(src)) < 0;\n"
if (curi->dmode == Dreg) {
c += 2;
if (curi->smode == imm || curi->smode == immi || curi->smode == Dreg || curi->smode == Areg) {
- c += 2;
+ if (cpu_level == 0) {
+ c += 2;
+ }
fill_prefetch_next_after(1,
"\t\tuae_s16 bnewv = (uae_s16)dst + (uae_s16)src;\n"
"\t\tint bflgs = ((uae_s16)(src)) < 0;\n"
}
}
prefetch_done = 1;
+ // MOVE.L reg,-(an): 2 extra cycles if 68010
+ if (cpu_level == 1 && isreg(curi->smode) && curi->size == sz_long) {
+ addcycles000(2);
+ }
}
int storeflags = 0;
pop_ins_cnt();
printf("\t}\n");
sync_m68k_pc ();
- if (cpu_level != 1 || curi->size != sz_byte) {
+ if (cpu_level != 1 && curi->size != sz_byte) {
addcycles000(2);
}
get_prefetch_020_continue ();
printf("\t\t}\n");
add_head_cycs (10);
addcycles000_nonce("\t\t", 2 + 2);
- printf("\t} else {\n");
- addcycles000_onlyce(2);
- addcycles000_nonce("\t\t", 2);
+ if (cpu_level == 0) {
+ printf("\t} else {\n");
+ addcycles000_onlyce(2);
+ addcycles000_nonce("\t\t", 2);
+ }
printf("\t}\n");
pop_ins_cnt();
setpc ("oldpc + %d", m68k_pc_offset);
printf("\tuae_u32 newv = (uae_u32)dst / (uae_u32)(uae_u16)src;\n");
printf("\tuae_u32 rem = (uae_u32)dst %% (uae_u32)(uae_u16)src;\n");
if (using_ce) {
- start_brace();
- printf("\t\tint cycles = (getDivu68kCycles((uae_u32)dst, (uae_u16)src)) - 4;\n");
- addcycles000_3("\t\t");
+ printf("\tint cycles = getDivu68kCycles((uae_u32)dst, (uae_u16)src);\n");
+ addcycles000_3("\t");
}
- addcycles000_nonces("\t\t", "(getDivu68kCycles((uae_u32)dst, (uae_u16)src)) - 4");
- printf("\t\tif (newv > 0xffff) {\n");
- printf("\t\t\tsetdivuflags((uae_u32)dst, (uae_u16)src);\n");
- printf("\t\t} else {\n");
- printf("\t\t");
+ addcycles000_nonces("\t", "getDivu68kCycles((uae_u32)dst, (uae_u16)src)");
+ printf("\tif (newv > 0xffff) {\n");
+ printf("\t\tsetdivuflags((uae_u32)dst, (uae_u16)src);\n");
+ printf("\t} else {\n");
+ printf("\t");
genflags (flag_logical, sz_word, "newv", "", "");
- printf("\t\t\tnewv = (newv & 0xffff) | ((uae_u32)rem << 16);\n");
- printf("\t\t");
+ printf("\t\tnewv = (newv & 0xffff) | ((uae_u32)rem << 16);\n");
+ printf("\t");
genastore ("newv", curi->dmode, "dstreg", sz_long, "dst");
- printf("\t\t}\n");
+ printf("\t}\n");
fill_prefetch_next_t();
sync_m68k_pc();
count_ncycles++;
write_return_cycles("\t\t", 0);
printf("\t}\n");
if (using_ce) {
- start_brace();
- printf("\t\tint cycles = (getDivs68kCycles((uae_s32)dst, (uae_s16)src)) - 4;\n");
- addcycles000_3("\t\t");
+ printf("\tint cycles = getDivs68kCycles((uae_s32)dst, (uae_s16)src);\n");
+ addcycles000_3("\t");
}
- addcycles000_nonces("\t\t", "(getDivs68kCycles((uae_s32)dst, (uae_s16)src)) - 4");
+ addcycles000_nonces("\t", "getDivs68kCycles((uae_s32)dst, (uae_s16)src)");
printf("\tif (dst == 0x80000000 && src == -1) {\n");
printf("\t\tsetdivsflags((uae_s32)dst, (uae_s16)src);\n");
printf("\t} else {\n");
"\t\tSET_ZFLG(1);\n"
"\t\tm68k_dreg(regs, dstreg) &= 0xffff0000;\n");
printf("\tuae_u32 newv = (uae_u32)(uae_u16)dst * (uae_u32)(uae_u16)src;\n");
- if (using_ce)
- printf("\tint cycles = 38 - 4, bits;\n");
- else if (using_prefetch)
- printf("\tint bits;\n");
genflags (flag_logical, sz_long, "newv", "", "");
if (using_ce) {
- printf("\tfor(bits = 0; bits < 16 && src; bits++, src >>= 1)\n");
- printf("\t\tif (src & 1) cycles += 2;\n");
- addcycles000_3 ("\t");
+ printf("\tint cycles = getMulu68kCycles(src);\n");
+ addcycles000_3("\t");
}
- addcycles000_nonce("\tfor(bits = 0; bits < 16 && src; bits++, src >>= 1)\n\t\tif (src & 1) ", 2);
+ addcycles000_nonces("\t", "getMulu68kCycles(src)");
genastore ("newv", curi->dmode, "dstreg", sz_long, "dst");
sync_m68k_pc ();
- count_cycles += 38 - 4;
count_ncycles++;
insn_n_cycles += (70 - 38) / 2 + 38; /* average */
break;
"\t\tSET_ZFLG(1);\n"
"\t\tm68k_dreg(regs, dstreg) &= 0xffff0000;\n");
printf("\tuae_u32 newv = (uae_s32)(uae_s16)dst * (uae_s32)(uae_s16)src;\n");
- if (using_ce) {
- printf("\tint cycles = 38 - 4, bits;\n");
- printf("\tuae_u32 usrc;\n");
- } else if (using_prefetch) {
- printf("\tint bits;\n");
- printf("\tuae_u32 usrc;\n");
- }
genflags (flag_logical, sz_long, "newv", "", "");
if (using_ce) {
- printf("\tusrc = ((uae_u32)src) << 1;\n");
- printf("\tfor(bits = 0; bits < 16 && usrc; bits++, usrc >>= 1)\n");
- printf("\t\tif ((usrc & 3) == 1 || (usrc & 3) == 2) cycles += 2;\n");
- addcycles000_3 ("\t");
+ printf("\tint cycles = getMuls68kCycles(src);\n");
+ addcycles000_3("\t");
}
- addcycles000_nonce("\tusrc = ((uae_u32)src) << 1;\n\tfor(bits = 0; bits < 16 && usrc; bits++, usrc >>= 1)\n\t\tif ((usrc & 3) == 1 || (usrc & 3) == 2) ", 2);
+ addcycles000_nonces("\t", "getMuls68kCycles(src)");
genastore ("newv", curi->dmode, "dstreg", sz_long, "dst");
- count_cycles += 38 - 4;
count_ncycles++;
insn_n_cycles += (70 - 38) / 2 + 38; /* average */
break;
#endif
+
+int getMulu68kCycles(uae_u16 src)
+{
+ int cycles = 0;
+ if (currprefs.cpu_model == 68000) {
+ cycles = 38 - 4;
+ } else {
+ cycles = 8 - 4;
+ }
+ for (int bits = 0; bits < 16 && src; bits++, src >>= 1) {
+ if (src & 1)
+ cycles += 2;
+ }
+ return cycles;
+}
+
+int getMuls68kCycles(uae_u16 src)
+{
+ int cycles;
+ if (currprefs.cpu_model == 68000) {
+ cycles = 38 - 4;
+ } else {
+ cycles = 10 - 4;
+ }
+ uae_u32 usrc = ((uae_u32)src) << 1;
+ for (int bits = 0; bits < 16 && usrc; bits++, usrc >>= 1) {
+ if ((usrc & 3) == 1 || (usrc & 3) == 2) {
+ cycles += 2;
+ }
+ }
+ return cycles;
+}
+
+
/*
* Compute exact number of CPU cycles taken
* by DIVU and DIVS on a 68000 processor.
// Overflow
if ((dividend >> 16) >= divisor)
- return (mcycles = 5) * 2;
+ return (mcycles = 5) * 2 - 4;
+
+ if (currprefs.cpu_model == 68000) {
+ mcycles = 38;
+ } else {
+ mcycles = 22;
+ }
- mcycles = 38;
hdivisor = divisor << 16;
for (i = 0; i < 15; i++) {
}
}
}
- return mcycles * 2;
+ return mcycles * 2 - 4;
}
int getDivs68kCycles (uae_s32 dividend, uae_s16 divisor)
// Check for absolute overflow
if (((uae_u32)abs (dividend) >> 16) >= (uae_u16)abs (divisor))
- return (mcycles + 2) * 2;
+ return (mcycles + 2) * 2 - 4;
// Absolute quotient
aquot = (uae_u32) abs (dividend) / (uae_u16)abs (divisor);
- mcycles += 55;
+ if (currprefs.cpu_model == 68000) {
+ mcycles += 55;
+ } else {
+ mcycles += 37;
+ }
if (divisor >= 0) {
if (dividend >= 0)
aquot <<= 1;
}
- return mcycles * 2;
+ return mcycles * 2 - 4;
}
/* DIV divide by zero