diff --git a/src/cpu/386.c b/src/cpu/386.c index 298cc66fc..2358fd646 100644 --- a/src/cpu/386.c +++ b/src/cpu/386.c @@ -81,7 +81,20 @@ x386_log(const char *fmt, ...) #define OP_TABLE(name) ops_ ## name -#define CLOCK_CYCLES(c) cycles -= (c) +#define CLOCK_CYCLES(c) \ + {\ + if (fpu_cycles > 0) {\ + fpu_cycles -= (c);\ + if (fpu_cycles < 0) {\ + cycles += fpu_cycles;\ + }\ + } else {\ + cycles -= (c);\ + }\ + } + +#define CLOCK_CYCLES_FPU(c) cycles -= (c) +#define CONCURRENCY_CYCLES(c) fpu_cycles = (c) #define CLOCK_CYCLES_ALWAYS(c) cycles -= (c) #include "x86_ops.h" diff --git a/src/cpu/386_dynarec.c b/src/cpu/386_dynarec.c index d11be000e..88a95637c 100644 --- a/src/cpu/386_dynarec.c +++ b/src/cpu/386_dynarec.c @@ -267,9 +267,22 @@ static void prefetch_flush() #define OP_TABLE(name) ops_ ## name -#define CLOCK_CYCLES(c) cycles -= (c) +#define CLOCK_CYCLES(c) \ + {\ + if (fpu_cycles > 0) {\ + fpu_cycles -= (c);\ + if (fpu_cycles < 0) {\ + cycles += fpu_cycles;\ + }\ + } else {\ + cycles -= (c);\ + }\ + } +#define CLOCK_CYCLES_FPU(c) cycles -= (c) +#define CONCURRENCY_CYCLES(c) fpu_cycles = (c) #define CLOCK_CYCLES_ALWAYS(c) cycles -= (c) + #include "386_ops.h" diff --git a/src/cpu/386_dynarec_ops.c b/src/cpu/386_dynarec_ops.c index ef18c2558..40aa2db80 100644 --- a/src/cpu/386_dynarec_ops.c +++ b/src/cpu/386_dynarec_ops.c @@ -65,6 +65,8 @@ static __inline void fetch_ea_16_long(uint32_t rmdat) #define OP_TABLE(name) dynarec_ops_ ## name #define CLOCK_CYCLES(c) +#define CLOCK_CYCLES_FPU(c) +#define CONCURRENCY_CYCLES(c) fpu_cycles = (c) #define CLOCK_CYCLES_ALWAYS(c) cycles -= (c) #include "386_ops.h" diff --git a/src/cpu/808x.c b/src/cpu/808x.c index 750335b60..827ec5b1c 100644 --- a/src/cpu/808x.c +++ b/src/cpu/808x.c @@ -89,11 +89,32 @@ static int refresh = 0, cycdiff; wait(val, 0); \ } -#define CLOCK_CYCLES(val) \ +#define CLOCK_CYCLES_ALWAYS(val) \ { \ wait(val, 0); \ } +#define CLOCK_CYCLES_FPU(val) \ + { \ + wait(val, 0); \ + } + + +#define CLOCK_CYCLES(val) \ + { \ + if (fpu_cycles > 0) { \ + fpu_cycles -= (val); \ + if (fpu_cycles < 0) { \ + wait(val, 0); \ + } \ + } else { \ + wait(val, 0); \ + } \ + } + +#define CONCURRENCY_CYCLES(c) fpu_cycles = (c) + + typedef int (*OpFn)(uint32_t fetchdat);