mirror of
https://github.com/kanjitalk755/macemu.git
synced 2025-01-27 23:32:52 +00:00
Updates for new FPU core architecture
This commit is contained in:
parent
c327eee41b
commit
a50871f87c
@ -2113,19 +2113,19 @@ static void gen_opcode (unsigned long int opcode)
|
|||||||
genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
|
genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
|
||||||
sync_m68k_pc ();
|
sync_m68k_pc ();
|
||||||
swap_opcode ();
|
swap_opcode ();
|
||||||
printf ("\tfpp_opp(opcode,extra);\n");
|
printf ("\tfpuop_arithmetic(opcode, extra);\n");
|
||||||
break;
|
break;
|
||||||
case i_FDBcc:
|
case i_FDBcc:
|
||||||
genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
|
genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
|
||||||
sync_m68k_pc ();
|
sync_m68k_pc ();
|
||||||
swap_opcode ();
|
swap_opcode ();
|
||||||
printf ("\tfdbcc_opp(opcode,extra);\n");
|
printf ("\tfpuop_dbcc(opcode, extra);\n");
|
||||||
break;
|
break;
|
||||||
case i_FScc:
|
case i_FScc:
|
||||||
genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
|
genamode (curi->smode, "srcreg", curi->size, "extra", 1, 0);
|
||||||
sync_m68k_pc ();
|
sync_m68k_pc ();
|
||||||
swap_opcode ();
|
swap_opcode ();
|
||||||
printf ("\tfscc_opp(opcode,extra);\n");
|
printf ("\tfpuop_scc(opcode,extra);\n");
|
||||||
break;
|
break;
|
||||||
case i_FTRAPcc:
|
case i_FTRAPcc:
|
||||||
sync_m68k_pc ();
|
sync_m68k_pc ();
|
||||||
@ -2135,7 +2135,7 @@ static void gen_opcode (unsigned long int opcode)
|
|||||||
genamode (curi->smode, "srcreg", curi->size, "dummy", 1, 0);
|
genamode (curi->smode, "srcreg", curi->size, "dummy", 1, 0);
|
||||||
sync_m68k_pc ();
|
sync_m68k_pc ();
|
||||||
swap_opcode ();
|
swap_opcode ();
|
||||||
printf ("\tftrapcc_opp(opcode,oldpc);\n");
|
printf ("\tfpuop_trapcc(opcode,oldpc);\n");
|
||||||
break;
|
break;
|
||||||
case i_FBcc:
|
case i_FBcc:
|
||||||
sync_m68k_pc ();
|
sync_m68k_pc ();
|
||||||
@ -2144,17 +2144,17 @@ static void gen_opcode (unsigned long int opcode)
|
|||||||
genamode (curi->dmode, "srcreg", curi->size, "extra", 1, 0);
|
genamode (curi->dmode, "srcreg", curi->size, "extra", 1, 0);
|
||||||
sync_m68k_pc ();
|
sync_m68k_pc ();
|
||||||
swap_opcode ();
|
swap_opcode ();
|
||||||
printf ("\tfbcc_opp(opcode,pc,extra);\n");
|
printf ("\tfpuop_bcc(opcode,pc,extra);\n");
|
||||||
break;
|
break;
|
||||||
case i_FSAVE:
|
case i_FSAVE:
|
||||||
sync_m68k_pc ();
|
sync_m68k_pc ();
|
||||||
swap_opcode ();
|
swap_opcode ();
|
||||||
printf ("\tfsave_opp(opcode);\n");
|
printf ("\tfpuop_save(opcode);\n");
|
||||||
break;
|
break;
|
||||||
case i_FRESTORE:
|
case i_FRESTORE:
|
||||||
sync_m68k_pc ();
|
sync_m68k_pc ();
|
||||||
swap_opcode ();
|
swap_opcode ();
|
||||||
printf ("\tfrestore_opp(opcode);\n");
|
printf ("\tfpuop_restore(opcode);\n");
|
||||||
break;
|
break;
|
||||||
case i_CINVL:
|
case i_CINVL:
|
||||||
case i_CINVP:
|
case i_CINVP:
|
||||||
@ -2227,6 +2227,7 @@ static void generate_includes (FILE * f)
|
|||||||
fprintf (f, "#include \"memory.h\"\n");
|
fprintf (f, "#include \"memory.h\"\n");
|
||||||
fprintf (f, "#include \"readcpu.h\"\n");
|
fprintf (f, "#include \"readcpu.h\"\n");
|
||||||
fprintf (f, "#include \"newcpu.h\"\n");
|
fprintf (f, "#include \"newcpu.h\"\n");
|
||||||
|
fprintf (f, "#include \"fpu/fpu.h\"\n");
|
||||||
fprintf (f, "#include \"cputbl.h\"\n");
|
fprintf (f, "#include \"cputbl.h\"\n");
|
||||||
|
|
||||||
fprintf (f, "#define SET_CFLG_ALWAYS(x) SET_CFLG(x)\n");
|
fprintf (f, "#define SET_CFLG_ALWAYS(x) SET_CFLG(x)\n");
|
||||||
|
@ -22,6 +22,7 @@ extern int intlev(void); // From baisilisk_glue.cpp
|
|||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
#include "readcpu.h"
|
#include "readcpu.h"
|
||||||
#include "newcpu.h"
|
#include "newcpu.h"
|
||||||
|
#include "fpu/fpu.h"
|
||||||
|
|
||||||
#if defined(ENABLE_EXCLUSIVE_SPCFLAGS) && !defined(HAVE_HARDWARE_LOCKS)
|
#if defined(ENABLE_EXCLUSIVE_SPCFLAGS) && !defined(HAVE_HARDWARE_LOCKS)
|
||||||
B2_mutex *spcflags_lock = NULL;
|
B2_mutex *spcflags_lock = NULL;
|
||||||
@ -50,10 +51,6 @@ int movem_index1[256];
|
|||||||
int movem_index2[256];
|
int movem_index2[256];
|
||||||
int movem_next[256];
|
int movem_next[256];
|
||||||
|
|
||||||
int fpp_movem_index1[256];
|
|
||||||
int fpp_movem_index2[256];
|
|
||||||
int fpp_movem_next[256];
|
|
||||||
|
|
||||||
cpuop_func *cpufunctbl[65536];
|
cpuop_func *cpufunctbl[65536];
|
||||||
|
|
||||||
#define FLIGHT_RECORDER 0
|
#define FLIGHT_RECORDER 0
|
||||||
@ -235,15 +232,6 @@ void init_m68k (void)
|
|||||||
movem_index2[i] = 7-j;
|
movem_index2[i] = 7-j;
|
||||||
movem_next[i] = i & (~(1 << j));
|
movem_next[i] = i & (~(1 << j));
|
||||||
}
|
}
|
||||||
for (i = 0 ; i < 256 ; i++) {
|
|
||||||
int j;
|
|
||||||
for (j = 7 ; j >= 0 ; j--) {
|
|
||||||
if (i & (1 << j)) break;
|
|
||||||
}
|
|
||||||
fpp_movem_index1[i] = 7-j;
|
|
||||||
fpp_movem_index2[i] = j;
|
|
||||||
fpp_movem_next[i] = i & (~(1 << j));
|
|
||||||
}
|
|
||||||
#if COUNT_INSTRS
|
#if COUNT_INSTRS
|
||||||
{
|
{
|
||||||
FILE *f = fopen (icountfilename (), "r");
|
FILE *f = fopen (icountfilename (), "r");
|
||||||
@ -268,9 +256,7 @@ void init_m68k (void)
|
|||||||
#if defined(ENABLE_EXCLUSIVE_SPCFLAGS) && !defined(HAVE_HARDWARE_LOCKS)
|
#if defined(ENABLE_EXCLUSIVE_SPCFLAGS) && !defined(HAVE_HARDWARE_LOCKS)
|
||||||
spcflags_lock = B2_create_mutex();
|
spcflags_lock = B2_create_mutex();
|
||||||
#endif
|
#endif
|
||||||
|
fpu_init(CPUType == 4);
|
||||||
fpu_init ();
|
|
||||||
fpu_set_integral_fpu (CPUType == 4);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void exit_m68k (void)
|
void exit_m68k (void)
|
||||||
@ -1443,16 +1429,10 @@ void m68k_dumpstate (uaecptr *nextpc)
|
|||||||
printf ("T=%d%d S=%d M=%d X=%d N=%d Z=%d V=%d C=%d IMASK=%d\n",
|
printf ("T=%d%d S=%d M=%d X=%d N=%d Z=%d V=%d C=%d IMASK=%d\n",
|
||||||
regs.t1, regs.t0, regs.s, regs.m,
|
regs.t1, regs.t0, regs.s, regs.m,
|
||||||
GET_XFLG, GET_NFLG, GET_ZFLG, GET_VFLG, GET_CFLG, regs.intmask);
|
GET_XFLG, GET_NFLG, GET_ZFLG, GET_VFLG, GET_CFLG, regs.intmask);
|
||||||
for (i = 0; i < 8; i++){
|
|
||||||
printf ("FP%d: %g ", i, regs.fp[i]);
|
fpu_dump_registers();
|
||||||
if ((i & 3) == 3) printf ("\n");
|
fpu_dump_flags();
|
||||||
}
|
|
||||||
printf ("N=%d Z=%d I=%d NAN=%d\n",
|
|
||||||
(regs.fpsr & 0x8000000) != 0,
|
|
||||||
(regs.fpsr & 0x4000000) != 0,
|
|
||||||
(regs.fpsr & 0x2000000) != 0,
|
|
||||||
(regs.fpsr & 0x1000000) != 0);
|
|
||||||
|
|
||||||
m68k_disasm(m68k_getpc (), nextpc, 1);
|
m68k_disasm(m68k_getpc (), nextpc, 1);
|
||||||
if (nextpc)
|
if (nextpc)
|
||||||
printf ("next PC: %08lx\n", *nextpc);
|
printf ("next PC: %08lx\n", *nextpc);
|
||||||
|
@ -20,10 +20,6 @@ extern int movem_index1[256];
|
|||||||
extern int movem_index2[256];
|
extern int movem_index2[256];
|
||||||
extern int movem_next[256];
|
extern int movem_next[256];
|
||||||
|
|
||||||
extern int fpp_movem_index1[256];
|
|
||||||
extern int fpp_movem_index2[256];
|
|
||||||
extern int fpp_movem_next[256];
|
|
||||||
|
|
||||||
extern int broken_in;
|
extern int broken_in;
|
||||||
|
|
||||||
/* Control flow information */
|
/* Control flow information */
|
||||||
@ -83,9 +79,6 @@ struct regstruct {
|
|||||||
flagtype x;
|
flagtype x;
|
||||||
flagtype stopped;
|
flagtype stopped;
|
||||||
|
|
||||||
double fp[8];
|
|
||||||
uae_u32 fpcr,fpsr,fpiar;
|
|
||||||
|
|
||||||
#if USE_PREFETCH_BUFFER
|
#if USE_PREFETCH_BUFFER
|
||||||
/* Fellow sources say this is 4 longwords. That's impossible. It needs
|
/* Fellow sources say this is 4 longwords. That's impossible. It needs
|
||||||
* to be at least a longword. The HRM has some cryptic comment about two
|
* to be at least a longword. The HRM has some cryptic comment about two
|
||||||
@ -264,19 +257,6 @@ extern int m68k_do_specialties(void);
|
|||||||
|
|
||||||
extern void mmu_op (uae_u32, uae_u16);
|
extern void mmu_op (uae_u32, uae_u16);
|
||||||
|
|
||||||
extern void fpp_opp (uae_u32, uae_u16);
|
|
||||||
extern void fdbcc_opp (uae_u32, uae_u16);
|
|
||||||
extern void fscc_opp (uae_u32, uae_u16);
|
|
||||||
extern void ftrapcc_opp (uae_u32,uaecptr);
|
|
||||||
extern void fbcc_opp (uae_u32, uaecptr, uae_u32);
|
|
||||||
extern void fsave_opp (uae_u32);
|
|
||||||
extern void frestore_opp (uae_u32);
|
|
||||||
|
|
||||||
extern void fpu_set_integral_fpu (bool is_integral);
|
|
||||||
extern void fpu_init (void);
|
|
||||||
extern void fpu_exit (void);
|
|
||||||
extern void fpu_reset (void);
|
|
||||||
|
|
||||||
/* Opcode of faulting instruction */
|
/* Opcode of faulting instruction */
|
||||||
extern uae_u16 last_op_for_exception_3;
|
extern uae_u16 last_op_for_exception_3;
|
||||||
/* PC at fault time */
|
/* PC at fault time */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user