Resync with TomB's sources, regarding ARMv6T2 improvements

This commit is contained in:
Dimitris Panokostas 2018-03-03 19:01:28 +01:00
parent 6571dc247d
commit 9b64073b68
21 changed files with 327 additions and 274 deletions

View file

@ -12,9 +12,9 @@
#include "uae/types.h"
typedef union {
int i;
uae_u32 _u32;
void *pv;
int i;
uae_u32 _u32;
void *pv;
} uae_pt;
/* These currently require the maximum size to be known at initialization
@ -24,35 +24,35 @@ typedef union {
* avoid overhead. */
typedef struct {
uae_sem_t lock;
uae_sem_t reader_wait;
uae_sem_t writer_wait;
uae_pt *data;
int size, chunks;
volatile int rdp, wrp;
volatile int writer_waiting;
volatile int reader_waiting;
uae_sem_t lock;
uae_sem_t reader_wait;
uae_sem_t writer_wait;
uae_pt *data;
int size, chunks;
volatile int rdp, wrp;
volatile int writer_waiting;
volatile int reader_waiting;
} smp_comm_pipe;
STATIC_INLINE void init_comm_pipe (smp_comm_pipe *p, int size, int chunks)
{
memset (p, 0, sizeof (*p));
p->data = (uae_pt *)malloc (size*sizeof (uae_pt));
p->size = size;
p->chunks = chunks;
p->rdp = p->wrp = 0;
p->reader_waiting = 0;
p->writer_waiting = 0;
uae_sem_init (&p->lock, 0, 1);
uae_sem_init (&p->reader_wait, 0, 0);
uae_sem_init (&p->writer_wait, 0, 0);
memset (p, 0, sizeof (*p));
p->data = (uae_pt *)malloc (size*sizeof (uae_pt));
p->size = size;
p->chunks = chunks;
p->rdp = p->wrp = 0;
p->reader_waiting = 0;
p->writer_waiting = 0;
uae_sem_init (&p->lock, 0, 1);
uae_sem_init (&p->reader_wait, 0, 0);
uae_sem_init (&p->writer_wait, 0, 0);
}
STATIC_INLINE void destroy_comm_pipe (smp_comm_pipe *p)
{
uae_sem_destroy (&p->lock);
uae_sem_destroy (&p->reader_wait);
uae_sem_destroy (&p->writer_wait);
uae_sem_destroy (&p->lock);
uae_sem_destroy (&p->reader_wait);
uae_sem_destroy (&p->writer_wait);
p->lock = 0;
p->reader_wait = 0;
p->writer_wait = 0;
@ -66,105 +66,105 @@ STATIC_INLINE void destroy_comm_pipe (smp_comm_pipe *p)
STATIC_INLINE void maybe_wake_reader (smp_comm_pipe *p, int no_buffer)
{
if (p->reader_waiting && (no_buffer || ((p->wrp - p->rdp + p->size) % p->size) >= p->chunks)) {
p->reader_waiting = 0;
uae_sem_post (&p->reader_wait);
}
if (p->reader_waiting && (no_buffer || ((p->wrp - p->rdp + p->size) % p->size) >= p->chunks)) {
p->reader_waiting = 0;
uae_sem_post (&p->reader_wait);
}
}
STATIC_INLINE void write_comm_pipe_pt (smp_comm_pipe *p, uae_pt data, int no_buffer)
{
int nxwrp = (p->wrp + 1) % p->size;
int nxwrp = (p->wrp + 1) % p->size;
if (p->reader_waiting) {
/* No need to do all the locking */
p->data[p->wrp] = data;
p->wrp = nxwrp;
maybe_wake_reader (p, no_buffer);
return;
}
uae_sem_wait (&p->lock);
if (nxwrp == p->rdp) {
/* Pipe full! */
p->writer_waiting = 1;
uae_sem_post (&p->lock);
/* Note that the reader could get in between here and do a
* sem_post on writer_wait before we wait on it. That's harmless.
* There's a similar case in read_comm_pipe_int_blocking. */
uae_sem_wait (&p->writer_wait);
uae_sem_wait (&p->lock);
}
p->data[p->wrp] = data;
p->wrp = nxwrp;
maybe_wake_reader (p, no_buffer);
uae_sem_post (&p->lock);
if (p->reader_waiting) {
/* No need to do all the locking */
p->data[p->wrp] = data;
p->wrp = nxwrp;
maybe_wake_reader (p, no_buffer);
return;
}
uae_sem_wait (&p->lock);
if (nxwrp == p->rdp) {
/* Pipe full! */
p->writer_waiting = 1;
uae_sem_post (&p->lock);
/* Note that the reader could get in between here and do a
* sem_post on writer_wait before we wait on it. That's harmless.
* There's a similar case in read_comm_pipe_int_blocking. */
uae_sem_wait (&p->writer_wait);
uae_sem_wait (&p->lock);
}
p->data[p->wrp] = data;
p->wrp = nxwrp;
maybe_wake_reader (p, no_buffer);
uae_sem_post (&p->lock);
}
STATIC_INLINE uae_pt read_comm_pipe_pt_blocking (smp_comm_pipe *p)
{
uae_pt data;
uae_pt data;
uae_sem_wait (&p->lock);
if (p->rdp == p->wrp) {
p->reader_waiting = 1;
uae_sem_post (&p->lock);
uae_sem_wait (&p->reader_wait);
uae_sem_wait (&p->lock);
}
data = p->data[p->rdp];
p->rdp = (p->rdp + 1) % p->size;
uae_sem_wait (&p->lock);
if (p->rdp == p->wrp) {
p->reader_waiting = 1;
uae_sem_post (&p->lock);
uae_sem_wait (&p->reader_wait);
uae_sem_wait (&p->lock);
}
data = p->data[p->rdp];
p->rdp = (p->rdp + 1) % p->size;
/* We ignore chunks here. If this is a problem, make the size bigger in the init call. */
if (p->writer_waiting) {
p->writer_waiting = 0;
uae_sem_post (&p->writer_wait);
}
uae_sem_post (&p->lock);
return data;
/* We ignore chunks here. If this is a problem, make the size bigger in the init call. */
if (p->writer_waiting) {
p->writer_waiting = 0;
uae_sem_post (&p->writer_wait);
}
uae_sem_post (&p->lock);
return data;
}
STATIC_INLINE int comm_pipe_has_data (smp_comm_pipe *p)
{
return p->rdp != p->wrp;
return p->rdp != p->wrp;
}
STATIC_INLINE int read_comm_pipe_int_blocking (smp_comm_pipe *p)
{
uae_pt foo = read_comm_pipe_pt_blocking (p);
return foo.i;
uae_pt foo = read_comm_pipe_pt_blocking (p);
return foo.i;
}
STATIC_INLINE uae_u32 read_comm_pipe_u32_blocking (smp_comm_pipe *p)
{
uae_pt foo = read_comm_pipe_pt_blocking (p);
return foo._u32;
uae_pt foo = read_comm_pipe_pt_blocking (p);
return foo._u32;
}
STATIC_INLINE void *read_comm_pipe_pvoid_blocking (smp_comm_pipe *p)
{
uae_pt foo = read_comm_pipe_pt_blocking (p);
return foo.pv;
uae_pt foo = read_comm_pipe_pt_blocking (p);
return foo.pv;
}
STATIC_INLINE void write_comm_pipe_int (smp_comm_pipe *p, int data, int no_buffer)
{
uae_pt foo;
foo.i = data;
write_comm_pipe_pt (p, foo, no_buffer);
uae_pt foo;
foo.i = data;
write_comm_pipe_pt (p, foo, no_buffer);
}
STATIC_INLINE void write_comm_pipe_u32 (smp_comm_pipe *p, int data, int no_buffer)
{
uae_pt foo;
foo._u32 = data;
write_comm_pipe_pt (p, foo, no_buffer);
uae_pt foo;
foo._u32 = data;
write_comm_pipe_pt (p, foo, no_buffer);
}
STATIC_INLINE void write_comm_pipe_pvoid (smp_comm_pipe *p, void *data, int no_buffer)
{
uae_pt foo;
foo.pv = data;
write_comm_pipe_pt (p, foo, no_buffer);
uae_pt foo;
foo.pv = data;
write_comm_pipe_pt (p, foo, no_buffer);
}
#endif /* UAE_COMMPIPE_H */

View file

@ -1,27 +1,27 @@
/*
* cpummu.h - MMU emulation
*
* Copyright (c) 2001-2004 Milan Jurik of ARAnyM dev team (see AUTHORS)
*
* Inspired by UAE MMU patch
*
* This file is part of the ARAnyM project which builds a new and powerful
* TOS/FreeMiNT compatible virtual machine running on almost any hardware.
*
* ARAnyM is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* ARAnyM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ARAnyM; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
* cpummu.h - MMU emulation
*
* Copyright (c) 2001-2004 Milan Jurik of ARAnyM dev team (see AUTHORS)
*
* Inspired by UAE MMU patch
*
* This file is part of the ARAnyM project which builds a new and powerful
* TOS/FreeMiNT compatible virtual machine running on almost any hardware.
*
* ARAnyM is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* ARAnyM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ARAnyM; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef UAE_CPUMMU_H

View file

@ -218,11 +218,11 @@ extern struct draw_info curr_drawinfo[2 * (MAXVPOS + 2) + 1];
/* struct decision contains things we save across drawing frames for
* comparison (smart update stuff). */
struct decision {
/* Records the leftmost access of BPL1DAT. */
int plfleft, plfright, plflinelen;
/* Display window: native coordinates, depend on lores state. */
int diwfirstword, diwlastword;
int ctable;
/* Records the leftmost access of BPL1DAT. */
int plfleft, plfright, plflinelen;
/* Display window: native coordinates, depend on lores state. */
int diwfirstword, diwlastword;
int ctable;
uae_u16 bplcon0, bplcon2;
uae_u16 bplcon3, bplcon4;

View file

@ -52,7 +52,7 @@ extern smp_comm_pipe native2amiga_pending;
STATIC_INLINE void do_uae_int_requested (void)
{
atomic_or(&uae_int_requested, 1);
atomic_or(&uae_int_requested, 1);
}
#endif /* UAE_NATIVE2AMIGA_H */

View file

@ -265,63 +265,63 @@ extern void to_upper (TCHAR *s, int len);
#ifdef DONT_HAVE_POSIX
#define access posixemu_access
extern int posixemu_access(const TCHAR *, int);
extern int posixemu_access (const TCHAR *, int);
#define open posixemu_open
extern int posixemu_open(const TCHAR *, int, int);
extern int posixemu_open (const TCHAR *, int, int);
#define close posixemu_close
extern void posixemu_close(int);
extern void posixemu_close (int);
#define read posixemu_read
extern int posixemu_read(int, TCHAR *, int);
extern int posixemu_read (int, TCHAR *, int);
#define write posixemu_write
extern int posixemu_write(int, const TCHAR *, int);
extern int posixemu_write (int, const TCHAR *, int);
#undef lseek
#define lseek posixemu_seek
extern int posixemu_seek(int, int, int);
extern int posixemu_seek (int, int, int);
#define stat(a,b) posixemu_stat ((a), (b))
extern int posixemu_stat(const TCHAR *, STAT *);
extern int posixemu_stat (const TCHAR *, STAT *);
#define mkdir posixemu_mkdir
extern int mkdir(const TCHAR *, int);
extern int mkdir (const TCHAR *, int);
#define rmdir posixemu_rmdir
extern int posixemu_rmdir(const TCHAR *);
extern int posixemu_rmdir (const TCHAR *);
#define unlink posixemu_unlink
extern int posixemu_unlink(const TCHAR *);
extern int posixemu_unlink (const TCHAR *);
#define truncate posixemu_truncate
extern int posixemu_truncate(const TCHAR *, long int);
extern int posixemu_truncate (const TCHAR *, long int);
#define rename posixemu_rename
extern int posixemu_rename(const TCHAR *, const TCHAR *);
extern int posixemu_rename (const TCHAR *, const TCHAR *);
#define chmod posixemu_chmod
extern int posixemu_chmod(const TCHAR *, int);
extern int posixemu_chmod (const TCHAR *, int);
#define tmpnam posixemu_tmpnam
extern void posixemu_tmpnam(TCHAR *);
extern void posixemu_tmpnam (TCHAR *);
#define utime posixemu_utime
extern int posixemu_utime(const TCHAR *, struct utimbuf *);
extern int posixemu_utime (const TCHAR *, struct utimbuf *);
#define opendir posixemu_opendir
extern DIR * posixemu_opendir(const TCHAR *);
extern DIR * posixemu_opendir (const TCHAR *);
#define readdir posixemu_readdir
extern struct dirent* readdir(DIR *);
extern struct dirent* readdir (DIR *);
#define closedir posixemu_closedir
extern void closedir(DIR *);
extern void closedir (DIR *);
/* This isn't the best place for this, but it fits reasonably well. The logic
* is that you probably don't have POSIX errnos if you don't have the above
* functions. */
extern long dos_errno(void);
extern long dos_errno (void);
#endif
#ifdef DONT_HAVE_STDIO
extern FILE *stdioemu_fopen(const TCHAR *, const TCHAR *);
extern FILE *stdioemu_fopen (const TCHAR *, const TCHAR *);
#define fopen(a,b) stdioemu_fopen(a, b)
extern int stdioemu_fseek(FILE *, int, int);
extern int stdioemu_fseek (FILE *, int, int);
#define fseek(a,b,c) stdioemu_fseek(a, b, c)
extern int stdioemu_fread(TCHAR *, int, int, FILE *);
extern int stdioemu_fread (TCHAR *, int, int, FILE *);
#define fread(a,b,c,d) stdioemu_fread(a, b, c, d)
extern int stdioemu_fwrite(const TCHAR *, int, int, FILE *);
extern int stdioemu_fwrite (const TCHAR *, int, int, FILE *);
#define fwrite(a,b,c,d) stdioemu_fwrite(a, b, c, d)
extern int stdioemu_ftell(FILE *);
extern int stdioemu_ftell (FILE *);
#define ftell(a) stdioemu_ftell(a)
extern int stdioemu_fclose(FILE *);
extern int stdioemu_fclose (FILE *);
#define fclose(a) stdioemu_fclose(a)
#endif
@ -329,9 +329,9 @@ extern int stdioemu_fclose(FILE *);
#ifdef DONT_HAVE_MALLOC
#define malloc(a) mallocemu_malloc(a)
extern void *mallocemu_malloc(int size);
extern void *mallocemu_malloc (int size);
#define free(a) mallocemu_free(a)
extern void mallocemu_free(void *ptr);
extern void mallocemu_free (void *ptr);
#endif
@ -346,10 +346,9 @@ extern void mallocemu_free(void *ptr);
#define write_log(FORMATO, RESTO...)
#define write_log_standard(FORMATO, RESTO...)
#else
extern void write_log(const TCHAR *, ...);
extern void write_log (const TCHAR *,...);
#endif
extern void gui_message(const TCHAR *, ...);
extern void gui_message (const TCHAR *,...);
#ifndef O_BINARY
#define O_BINARY 0
@ -431,17 +430,17 @@ STATIC_INLINE uae_u32 do_byteswap_16(uae_u32 v) {
# ifdef HAVE_BYTESWAP_H
# include <byteswap.h>
# endif
# else
#else
/* Else, if using SDL, try SDL's endian functions. */
# if defined (USE_SDL1) || defined (USE_SDL2)
# include <SDL_endian.h>
# define bswap_16(x) SDL_Swap16(x)
# define bswap_32(x) SDL_Swap32(x)
# else
#if defined (USE_SDL1) || defined (USE_SDL2)
#include <SDL_endian.h>
#define bswap_16(x) SDL_Swap16(x)
#define bswap_32(x) SDL_Swap32(x)
#else
/* Otherwise, we'll roll our own. */
#define bswap_16(x) (((x) >> 8) | (((x) & 0xFF) << 8))
#define bswap_32(x) (((x) << 24) | (((x) << 8) & 0x00FF0000) | (((x) >> 8) & 0x0000FF00) | ((x) >> 24))
# endif
#endif
#endif
#endif /* ARMV6_ASSEMBLY*/

View file

@ -80,8 +80,8 @@ extern uae_u32 CallFunc (TrapContext *context, uaecptr func);
/*
* Initialization
*/
void init_traps (void);
void init_extended_traps (void);
void init_traps(void);
void init_extended_traps(void);
#define deftrap(f) define_trap((f), 0, _T(#f))
#define deftrap2(f, mode, str) define_trap((f), (mode), (str))

View file

@ -4,6 +4,6 @@
#include "uae/types.h"
uaecptr uaeres_startup(TrapContext *ctx, uaecptr resaddr);
void uaeres_install (void);
void uaeres_install(void);
#endif /* UAE_UAERESOURCE_H */

View file

@ -471,8 +471,8 @@ LOWFUNC(WRITE,NONE,2,compemu_raw_MERGE8_rr,(RW4 d, RR4 s))
UBFX_rrii(REG_WORK1, s, 8, 24);
BFI_rrii(d, REG_WORK1, 8, 31);
#else
AND_rri(REG_WORK1, s, 0xffffff00);
BIC_rri(d, d, 0xffffff00);
BIC_rri(REG_WORK1, s, 0xff);
AND_rri(d, d, 0xff);
ORR_rrr(d, d, REG_WORK1);
#endif
}
@ -889,11 +889,17 @@ STATIC_INLINE void compemu_raw_jcc_l_oponly(int cc)
STATIC_INLINE void compemu_raw_handle_except(IMM cycles)
{
uae_u32* branchadd;
int offs;
clobber_flags();
#ifdef ARMV6T2
MOVW_ri16(REG_WORK2, (uae_u32)(&jit_exception));
MOVT_ri16(REG_WORK2, ((uae_u32)(&jit_exception)) >> 16);
#else
offs = data_long_offs((uae_u32)(&jit_exception));
LDR_rRI(REG_WORK2, RPC_INDEX, offs);
#endif
LDR_rR(REG_WORK1, REG_WORK2);
TST_rr(REG_WORK1, REG_WORK1);
@ -901,7 +907,7 @@ STATIC_INLINE void compemu_raw_handle_except(IMM cycles)
BEQ_i(0); // no exception, jump to next instruction
// countdown -= scaled_cycles(totcycles);
uae_s32 offs = (uae_u32)&countdown - (uae_u32)&regs;
offs = (uae_u32)&countdown - (uae_u32)&regs;
LDR_rRI(REG_WORK1, R_REGSTRUCT, offs);
if(CHECK32(cycles)) {
SUBS_rri(REG_WORK1, REG_WORK1, cycles);
@ -928,15 +934,10 @@ STATIC_INLINE void compemu_raw_handle_except(IMM cycles)
STATIC_INLINE void compemu_raw_maybe_recompile(uae_u32 t)
{
#ifdef ARMV6T2
BGE_i(2);
raw_pop_preserved_regs();
LDR_rRI(RPC_INDEX, RPC_INDEX, -4);
emit_long(t);
#else
uae_s32 offs = data_long_offs(t);
CC_LDR_rRI(NATIVE_CC_LT, RPC_INDEX, RPC_INDEX, offs);
#endif
}
STATIC_INLINE void compemu_raw_jmp(uae_u32 t)
@ -969,15 +970,10 @@ STATIC_INLINE void compemu_raw_jmp_m_indexed(uae_u32 base, uae_u32 r, uae_u32 m)
STATIC_INLINE void compemu_raw_maybe_cachemiss(uae_u32 t)
{
#ifdef ARMV6T2
BEQ_i(2);
raw_pop_preserved_regs();
LDR_rRI(RPC_INDEX, RPC_INDEX, -4);
emit_long(t);
#else
uae_s32 offs = data_long_offs(t);
CC_LDR_rRI(NATIVE_CC_NE, RPC_INDEX, RPC_INDEX, offs);
#endif
}
STATIC_INLINE void compemu_raw_jz_b_oponly(void)
@ -1101,6 +1097,8 @@ LENDFUNC(NONE,READ,2,compemu_raw_tag_pc,(W4 d, MEMR s))
* FPU stuff *
*************************************************************************/
#ifdef USE_JIT_FPU
LOWFUNC(NONE,NONE,2,raw_fmov_rr,(FW d, FR s))
{
VMOV64_dd(d, s);
@ -1112,13 +1110,8 @@ LOWFUNC(NONE,WRITE,2,compemu_raw_fmov_mr_drop,(MEMW mem, FR s))
if(mem >= (uae_u32) &regs && mem < (uae_u32) &regs + 1020 && ((mem - (uae_u32) &regs) & 0x3) == 0) {
VSTR64_dRi(s, R_REGSTRUCT, (mem - (uae_u32) &regs));
} else {
#ifdef ARMV6T2
MOVW_ri16(REG_WORK1, mem);
MOVT_ri16(REG_WORK1, mem >> 16);
#else
auto offs = data_long_offs(mem);
LDR_rRI(REG_WORK1, RPC_INDEX, offs);
#endif
VSTR64_dRi(s, REG_WORK1, 0);
}
}
@ -1130,13 +1123,8 @@ LOWFUNC(NONE,READ,2,compemu_raw_fmov_rm,(FW d, MEMR mem))
if(mem >= (uae_u32) &regs && mem < (uae_u32) &regs + 1020 && ((mem - (uae_u32) &regs) & 0x3) == 0) {
VLDR64_dRi(d, R_REGSTRUCT, (mem - (uae_u32) &regs));
} else {
#ifdef ARMV6T2
MOVW_ri16(REG_WORK1, mem);
MOVT_ri16(REG_WORK1, mem >> 16);
#else
auto offs = data_long_offs(mem);
LDR_rRI(REG_WORK1, RPC_INDEX, offs);
#endif
VLDR64_dRi(d, REG_WORK1, 0);
}
}
@ -1235,26 +1223,16 @@ LENDFUNC(NONE,NONE,1,raw_fmov_d_ri_10,(FW r))
LOWFUNC(NONE,READ,2,raw_fmov_d_rm,(FW r, MEMR m))
{
#ifdef ARMV6T2
MOVW_ri16(REG_WORK1, m);
MOVT_ri16(REG_WORK1, m >> 16);
#else
auto offs = data_long_offs(m);
LDR_rRI(REG_WORK1, RPC_INDEX, offs);
#endif
VLDR64_dRi(r, REG_WORK1, 0);
}
LENDFUNC(NONE,READ,2,raw_fmov_d_rm,(FW r, MEMR m))
LOWFUNC(NONE,READ,2,raw_fmovs_rm,(FW r, MEMR m))
{
#ifdef ARMV6T2
MOVW_ri16(REG_WORK1, m);
MOVT_ri16(REG_WORK1, m >> 16);
#else
auto offs = data_long_offs(m);
LDR_rRI(REG_WORK1, RPC_INDEX, offs);
#endif
MOVW_ri16(REG_WORK1, m);
MOVT_ri16(REG_WORK1, m >> 16);
VLDR32_sRi(SCRATCH_F32_1, REG_WORK1, 0);
VCVT32to64_ds(r, SCRATCH_F32_1);
}
@ -1386,13 +1364,10 @@ LENDFUNC(NONE,NONE,2,raw_fmovs_rr,(FW d, FR s))
LOWFUNC(NONE,NONE,3,raw_ffunc_rr,(double (*func)(double), FW d, FR s))
{
VMOV64_dd(0, s);
#ifdef ARMV6T2
MOVW_ri16(REG_WORK1, (uae_u32)func);
MOVT_ri16(REG_WORK1, ((uae_u32)func) >> 16);
#else
auto offs = data_long_offs(uae_u32(func));
LDR_rRI(REG_WORK1, RPC_INDEX, offs);
#endif
PUSH(RLR_INDEX);
BLX_r(REG_WORK1);
POP(RLR_INDEX);
@ -1413,13 +1388,8 @@ LOWFUNC(NONE,NONE,3,raw_fpowx_rr,(uae_u32 x, FW d, FR s))
VMOV64_dd(1, s);
#ifdef ARMV6T2
MOVW_ri16(REG_WORK1, (uae_u32)func);
MOVT_ri16(REG_WORK1, ((uae_u32)func) >> 16);
#else
auto offs = data_long_offs(uae_u32(func));
LDR_rRI(REG_WORK1, RPC_INDEX, offs);
#endif
MOVW_ri16(REG_WORK1, (uae_u32)func);
MOVT_ri16(REG_WORK1, ((uae_u32)func) >> 16);
PUSH(RLR_INDEX);
BLX_r(REG_WORK1);
@ -1436,12 +1406,20 @@ LOWFUNC(NONE,WRITE,2,raw_fp_from_exten_mr,(RR4 adr, FR s))
VMOVi_to_ARM_rd(REG_WORK1, s, 1); // get high part of double
VCMP64_d0(s);
VMRS_CPSR();
#ifdef ARMV6T2
BEQ_i(20); // iszero
#else
BEQ_i(21);
#endif
UBFX_rrii(REG_WORK2, REG_WORK1, 20, 11); // get exponent
MOVW_ri16(REG_WORK3, 2047);
CMP_rr(REG_WORK2, REG_WORK3);
#ifdef ARMV6T2
BEQ_i(13); // isnan
#else
BEQ_i(14);
#endif
MOVW_ri16(REG_WORK3, 15360); // diff of bias between double and long double
ADD_rrr(REG_WORK2, REG_WORK2, REG_WORK3); // exponent done
@ -1454,12 +1432,18 @@ LOWFUNC(NONE,WRITE,2,raw_fp_from_exten_mr,(RR4 adr, FR s))
REV_rr(REG_WORK2, REG_WORK2);
STRH_rR(REG_WORK2, REG_WORK3); // write exponent
VSHL64_ddi(SCRATCH_F64_1, s, 11); // shift mantissa to correct position
VSHL64_ddi(SCRATCH_F64_1, s, 11); // shift mantissa to correct position
VREV64_8_dd(SCRATCH_F64_1, SCRATCH_F64_1);
VMOV64_rrd(REG_WORK1, REG_WORK2, SCRATCH_F64_1);
ORR_rri(REG_WORK1, REG_WORK1, 0x80); // insert explicit 1
#ifdef ARMV6T2
STRD_rRI(REG_WORK1, REG_WORK3, 4);
B_i(9); // end_of_op
#else
STR_rRI(REG_WORK1, REG_WORK3, 4);
STR_rRI(REG_WORK2, REG_WORK3, 8);
B_i(10);
#endif
// isnan
MOVW_ri16(REG_WORK1, 0x7fff);
@ -1474,7 +1458,12 @@ LOWFUNC(NONE,WRITE,2,raw_fp_from_exten_mr,(RR4 adr, FR s))
ADD_rrr(REG_WORK3, adr, REG_WORK3);
REV_rr(REG_WORK1, REG_WORK1);
#ifdef ARMV6T2
STRD_rR(REG_WORK1, REG_WORK3);
#else
STR_rR(REG_WORK1, REG_WORK3);
STR_rRI(REG_WORK2, REG_WORK3, 4);
#endif
STR_rRI(REG_WORK2, REG_WORK3, 8);
// end_of_op
@ -1489,7 +1478,12 @@ LOWFUNC(NONE,READ,2,raw_fp_to_exten_rm,(FW d, RR4 adr))
LDR_rRI(REG_WORK3, R_REGSTRUCT, offs);
ADD_rrr(REG_WORK3, adr, REG_WORK3);
#ifdef ARMV6T2
LDRD_rRI(REG_WORK1, REG_WORK3, 4);
#else
LDR_rRI(REG_WORK1, REG_WORK3, 4);
LDR_rRI(REG_WORK2, REG_WORK3, 8);
#endif
BIC_rri(REG_WORK1, REG_WORK1, 0x80); // clear explicit 1
VMOV64_drr(d, REG_WORK1, REG_WORK2);
VREV64_8_dd(d, d);
@ -1527,6 +1521,30 @@ LOWFUNC(NONE,READ,2,raw_fp_to_exten_rm,(FW d, RR4 adr))
}
LENDFUNC(NONE,READ,2,raw_fp_to_exten_rm,(FW d, RR4 adr))
LOWFUNC(NONE,WRITE,2,raw_fp_from_double_mr,(RR4 adr, FR s))
{
uae_s32 offs = (uae_u32)&NATMEM_OFFSETX - (uae_u32) &regs;
LDR_rRI(REG_WORK3, R_REGSTRUCT, offs);
ADD_rrr(REG_WORK3, adr, REG_WORK3);
VREV64_8_dd(SCRATCH_F64_1, s);
VSTR64_dRi(SCRATCH_F64_1, REG_WORK3, 0);
}
LENDFUNC(NONE,WRITE,2,raw_fp_from_double_mr,(RR4 adr, FR s))
LOWFUNC(NONE,READ,2,raw_fp_to_double_rm,(FW d, RR4 adr))
{
uae_s32 offs = (uae_u32)&NATMEM_OFFSETX - (uae_u32) &regs;
LDR_rRI(REG_WORK3, R_REGSTRUCT, offs);
ADD_rrr(REG_WORK3, adr, REG_WORK3);
VLDR64_dRi(d, REG_WORK3, 0);
VREV64_8_dd(d, d);
}
LENDFUNC(NONE,READ,2,raw_fp_to_double_rm,(FW d, RR4 adr))
STATIC_INLINE void raw_fflags_into_flags(int r)
{
VCMP64_d0(r);
@ -1652,3 +1670,4 @@ LOWFUNC(NONE,NONE,1,raw_roundingmode,(IMM mode))
}
LENDFUNC(NONE,NONE,1,raw_roundingmode,(IMM mode))
#endif // USE_JIT_FPU

View file

@ -1327,7 +1327,7 @@ enum {
#define SMULxy_rrr(Rd,Rn,Rm,x,y) CC_SMULxy_rrr(NATIVE_CC_AL,Rd,Rn,Rm,x,y)
// ARMv6T2
//#ifdef ARMV6T2
#ifdef ARMV6T2
#define CC_BFI_rrii(cc,Rd,Rn,lsb,msb) _W(((cc) << 28) | (0x3e << 21) | ((msb) << 16) | (Rd << 12) | ((lsb) << 7) | (0x1 << 4) | (Rn))
#define BFI_rrii(Rd,Rn,lsb,msb) CC_BFI_rrii(NATIVE_CC_AL,Rd,Rn,lsb,msb)
@ -1353,7 +1353,7 @@ enum {
#define CC_UDIV_rrr(cc,Rd,Rn,Rm) _W(((cc) << 28) | (0x7 << 24) | (0x3 << 20) | (Rd << 16) | (0xf << 12) | (Rm << 8) | (0x1 << 4) | (Rn))
#define UDIV_rrr(Rd,Rn,Rm) CC_UDIV_rrr(NATIVE_CC_AL,Rd,Rn,Rm)
//#endif
#endif
// Floatingpoint
#define FADR_ADD(offs) ((1 << 23) | (offs) >> 2)

View file

@ -123,7 +123,7 @@ typedef union {
#if defined(CPU_arm)
//#define DEBUG_DATA_BUFFER
#define ALIGN_NOT_NEEDED
#define N_REGS 13 /* really 16, but 13 to 15 are SP, LR, PC */
#define N_REGS 11 /* really 16, but 13 to 15 are SP, LR, PC; 12 is scratch reg and 11 holds regs-struct */
#else
#define N_REGS 8 /* really only 7, but they are numbered 0,1,2,3,5,6,7 */
#endif
@ -381,6 +381,12 @@ typedef struct blockinfo_t {
#define BI_COMPILING 5
#define BI_FINALIZING 6
#if defined(CPU_arm) && !defined(ARMV6T2)
const int POPALLSPACE_SIZE = 2048; /* That should be enough space */
#else
const int POPALLSPACE_SIZE = 512; /* That should be enough space */
#endif
void execute_normal(void);
void exec_nostats(void);
void do_nothing(void);

View file

@ -20,7 +20,7 @@
#include "compemu.h"
#include "flags_arm.h"
#if defined(JIT)
#if defined(USE_JIT_FPU)
extern void fpp_to_exten(fpdata *fpd, uae_u32 wrd1, uae_u32 wrd2, uae_u32 wrd3);
@ -188,10 +188,7 @@ STATIC_INLINE int comp_fp_get (uae_u32 opcode, uae_u16 extra, int treg)
fmov_w_rr (treg, S2);
return 1;
case 5: /* Double */
readlong (S1, S2, S3);
add_l_ri (S1, 4);
readlong (S1, S4, S3);
fmov_d_rrr (treg, S4, S2);
fp_to_double_rm (treg, S1);
return 2;
case 6: /* Byte */
readbyte (S1, S2, S3);
@ -293,10 +290,7 @@ STATIC_INLINE int comp_fp_put (uae_u32 opcode, uae_u16 extra)
writeword_clobber (S1, S2, S3);
return 0;
case 5: /* Double */
fmov_to_d_rrr(S2, S3, sreg);
writelong_clobber (S1, S3, S4);
add_l_ri (S1, 4);
writelong_clobber (S1, S2, S4);
fp_from_double_mr(S1, sreg);
return 0;
case 6: /* Byte */
fmov_to_b_rr(S2, sreg);
@ -766,6 +760,11 @@ void comp_fpp_opp (uae_u32 opcode, uae_u16 extra)
sreg = FS1;
else /* one operand only, thus we can load the argument into dreg */
sreg = dreg;
if(opmode >= 0x30 && opmode <= 0x37) {
// get out early for unsupported ops
FAIL (1);
return;
}
if ((prec = comp_fp_get (opcode, extra, sreg)) < 0) {
FAIL (1);
return;

View file

@ -488,6 +488,8 @@ STATIC_INLINE void write_jmp_target(uae_u32* jmpaddr, uintptr a) {
* FPU stuff *
*************************************************************************/
#ifdef USE_JIT_FPU
MIDFUNC(1,f_forget_about,(FW r))
{
if (f_isinreg(r))
@ -935,6 +937,26 @@ MIDFUNC(2,fp_to_exten_rm,(FW d, RR4 adr))
}
MENDFUNC(2,fp_to_exten_rm,(FW d, RR4 adr))
MIDFUNC(2,fp_from_double_mr,(RR4 adr, FR s))
{
adr = readreg(adr, 4);
s = f_readreg(s);
raw_fp_from_double_mr(adr, s);
f_unlock(s);
unlock2(adr);
}
MENDFUNC(2,fp_from_double_mr,(RR4 adr, FR s))
MIDFUNC(2,fp_to_double_rm,(FW d, RR4 adr))
{
adr = readreg(adr, 4);
d = f_writereg(d);
raw_fp_to_double_rm(d, adr);
unlock2(adr);
f_unlock(d);
}
MENDFUNC(2,fp_to_double_rm,(FW d, RR4 adr))
MIDFUNC(2,fp_fscc_ri,(RW4 d, int cc))
{
d = rmw(d, 4, 4);
@ -950,4 +972,4 @@ MIDFUNC(1,roundingmode,(IMM mode))
MENDFUNC(1,roundingmode,(IMM mode))
#endif // USE_JIT_FPU

View file

@ -110,5 +110,7 @@ DECLARE_MIDFUNC(fpowx_rr(uae_u32 x, FW d, FR s));
DECLARE_MIDFUNC(fflags_into_flags());
DECLARE_MIDFUNC(fp_from_exten_mr(RR4 adr, FR s));
DECLARE_MIDFUNC(fp_to_exten_rm(FW d, RR4 adr));
DECLARE_MIDFUNC(fp_from_double_mr(RR4 adr, FR s));
DECLARE_MIDFUNC(fp_to_double_rm(FW d, RR4 adr));
DECLARE_MIDFUNC(fp_fscc_ri(RW4, int cc));
DECLARE_MIDFUNC(roundingmode(IMM mode));

View file

@ -1835,6 +1835,8 @@ MENDFUNC(2,jff_DBCC,(RR2 d, IMM cc))
* C Always cleared.
*
*/
#ifdef ARMV6T2
MIDFUNC(3,jnf_DIVU,(W4 d, RR4 s1, RR4 s2))
{
s1 = readreg(s1, 4);
@ -1847,13 +1849,8 @@ MIDFUNC(3,jnf_DIVU,(W4 d, RR4 s1, RR4 s2))
// Signal exception 5
MOV_ri(REG_WORK1, 5);
#ifdef ARMV6T2
MOVW_ri16(REG_WORK2, (uae_u32)(&jit_exception));
MOVT_ri16(REG_WORK2, ((uae_u32)(&jit_exception)) >> 16);
#else
auto offs = data_long_offs((uae_u32)(&jit_exception));
LDR_rRI(REG_WORK2, RPC_INDEX, offs);
#endif
STR_rR(REG_WORK1, REG_WORK2);
#ifdef ARM_HAS_DIV
B_i(4); // end_of_op
@ -1899,13 +1896,8 @@ MIDFUNC(3,jff_DIVU,(W4 d, RR4 s1, RR4 s2))
// Signal exception 5
MOV_ri(REG_WORK1, 5);
#ifdef ARMV6T2
MOVW_ri16(REG_WORK2, (uae_u32)(&jit_exception));
MOVT_ri16(REG_WORK2, ((uae_u32)(&jit_exception)) >> 16);
#else
auto offs = data_long_offs((uae_u32)(&jit_exception));
LDR_rRI(REG_WORK2, RPC_INDEX, offs);
#endif
MOVW_ri16(REG_WORK2, (uae_u32)(&jit_exception));
MOVT_ri16(REG_WORK2, ((uae_u32)(&jit_exception)) >> 16);
STR_rR(REG_WORK1, REG_WORK2);
// simplified flag handling for div0: set Z and V (for signed DIV: Z only)
@ -1918,8 +1910,8 @@ MIDFUNC(3,jff_DIVU,(W4 d, RR4 s1, RR4 s2))
UDIV_rrr(REG_WORK1, s1, REG_WORK3);
#else
B_i(17); // end_of_op
// src is not 0
// src is not 0
VMOVi_from_ARM_dr(SCRATCH_F64_1, s1, 0);
VMOVi_from_ARM_dr(SCRATCH_F64_2, REG_WORK3, 0);
VCVTIuto64_ds(SCRATCH_F64_1, SCRATCH_F32_1);
@ -1929,7 +1921,7 @@ MIDFUNC(3,jff_DIVU,(W4 d, RR4 s1, RR4 s2))
VMOVi_to_ARM_rd(REG_WORK1, SCRATCH_F64_1, 0);
#endif
LSRS_rri(REG_WORK2, REG_WORK1, 16); // if result of this is not 0, DIVU overflows
LSRS_rri(REG_WORK2, REG_WORK1, 16); // if result of this is not 0, DIVU overflows
BEQ_i(2);
// Here we handle overflow
MOV_ri(REG_WORK1, ARM_V_FLAG | ARM_N_FLAG);
@ -1945,13 +1937,15 @@ MIDFUNC(3,jff_DIVU,(W4 d, RR4 s1, RR4 s2))
MLS_rrrr(REG_WORK2, REG_WORK1, REG_WORK3, s1);
PKHBT_rrrLSLi(d, REG_WORK1, REG_WORK2, 16);
// end_of_op
unlock2(d);
unlock2(s1);
unlock2(s2);
}
MENDFUNC(3,jff_DIVU,(W4 d, RR4 s1, RR4 s2))
#endif
/*
* DIVS
*
@ -1962,6 +1956,8 @@ MENDFUNC(3,jff_DIVU,(W4 d, RR4 s1, RR4 s2))
* C Always cleared.
*
*/
#ifdef ARMV6T2
MIDFUNC(3,jnf_DIVS,(W4 d, RR4 s1, RR4 s2))
{
s1 = readreg(s1, 4);
@ -1974,23 +1970,18 @@ MIDFUNC(3,jnf_DIVS,(W4 d, RR4 s1, RR4 s2))
// Signal exception 5
MOV_ri(REG_WORK1, 5);
#ifdef ARMV6T2
MOVW_ri16(REG_WORK2, (uae_u32)(&jit_exception));
MOVT_ri16(REG_WORK2, ((uae_u32)(&jit_exception)) >> 16);
#else
auto offs = data_long_offs((uae_u32)(&jit_exception));
LDR_rRI(REG_WORK2, RPC_INDEX, offs);
#endif
STR_rR(REG_WORK1, REG_WORK2);
#ifdef ARM_HAS_DIV
B_i(12); // end_of_op
// src is not 0
SDIV_rrr(REG_WORK1, s1, REG_WORK3);
#else
B_i(18); // end_of_op
// src is not 0
// src is not 0
VMOVi_from_ARM_dr(SCRATCH_F64_1, s1, 0);
VMOVi_from_ARM_dr(SCRATCH_F64_2, REG_WORK3, 0);
VCVTIto64_ds(SCRATCH_F64_1, SCRATCH_F32_1);
@ -2037,13 +2028,8 @@ MIDFUNC(3,jff_DIVS,(W4 d, RR4 s1, RR4 s2))
// Signal exception 5
MOV_ri(REG_WORK1, 5);
#ifdef ARMV6T2
MOVW_ri16(REG_WORK2, (uae_u32)(&jit_exception));
MOVT_ri16(REG_WORK2, ((uae_u32)(&jit_exception)) >> 16);
#else
auto offs = data_long_offs((uae_u32)(&jit_exception));
LDR_rRI(REG_WORK2, RPC_INDEX, offs);
#endif
MOVW_ri16(REG_WORK2, (uae_u32)(&jit_exception));
MOVT_ri16(REG_WORK2, ((uae_u32)(&jit_exception)) >> 16);
STR_rR(REG_WORK1, REG_WORK2);
// simplified flag handling for div0: set Z and V (for signed DIV: Z only)
@ -2057,7 +2043,7 @@ MIDFUNC(3,jff_DIVS,(W4 d, RR4 s1, RR4 s2))
#else
B_i(25); // end_of_op
// src is not 0
// src is not 0
VMOVi_from_ARM_dr(SCRATCH_F64_1, s1, 0);
VMOVi_from_ARM_dr(SCRATCH_F64_2, REG_WORK3, 0);
VCVTIto64_ds(SCRATCH_F64_1, SCRATCH_F32_1);
@ -2299,6 +2285,8 @@ MIDFUNC(3,jff_DIVLS32,(RW4 d, RR4 s1, W4 rem))
}
MENDFUNC(3,jff_DIVLS32,(RW4 d, RR4 s1, W4 rem))
#endif
/*
* EOR
* Operand Syntax: Dn, <ea>
@ -3242,11 +3230,23 @@ MIDFUNC(2,jnf_MOVE16,(RR4 d, RR4 s))
ADD_rrr(s, s, REG_WORK1);
ADD_rrr(d, d, REG_WORK1);
#ifdef ARMV6T2
LDRD_rR(REG_WORK1, s);
STRD_rR(REG_WORK1, d);
LDRD_rRI(REG_WORK1, s, 8);
STRD_rRI(REG_WORK1, d, 8);
#else
LDR_rR(REG_WORK1, s);
LDR_rRI(REG_WORK2, s, 4);
STR_rR(REG_WORK1, d);
STR_rRI(REG_WORK2, d, 4);
LDR_rRI(REG_WORK1, s, 8);
LDR_rRI(REG_WORK2, s, 12);
STR_rRI(REG_WORK1, d, 8);
STR_rRI(REG_WORK2, d, 12);
#endif
POP_REGS((1 << s) | (1 << d));
@ -4499,7 +4499,12 @@ MIDFUNC(3,jff_ROXL_b,(W4 d, RR4 s, RR4 i))
CC_MOV_ri(NATIVE_CC_CC, x, 0);
// Calc N and Z
#ifdef ARMV6T2
BFI_rrii(d, x, 8, 8); // Make sure to set carry (last bit shifted out)
#else
BIC_rri(d, d, 0x100);
ORR_rrrLSLi(d, d, x, 8);
#endif
LSLS_rri(REG_WORK1, d, 24);
// end of op
@ -4549,7 +4554,12 @@ MIDFUNC(3,jff_ROXL_w,(W4 d, RR4 s, RR4 i))
CC_MOV_ri(NATIVE_CC_CC, x, 0);
// Calc N and Z
#ifdef ARMV6T2
BFI_rrii(d, x, 16, 16); // Make sure to set carry (last bit shifted out)
#else
BIC_rri(d, d, 0x10000);
ORR_rrrLSLi(d, d, x, 16);
#endif
LSLS_rri(REG_WORK1, d, 16);
// end of op

View file

@ -44,7 +44,6 @@
#include "compemu.h"
#include <SDL.h>
#define DEBUG 0
#if DEBUG
#define PROFILE_COMPILE_TIME 1
@ -134,7 +133,6 @@ static int redo_current_block;
uae_u8* current_compile_p = NULL;
static uae_u8* max_compile_start;
uae_u8* compiled_code = NULL;
const int POPALLSPACE_SIZE = 512; /* That should be enough space */
uae_u8 *popallspace = NULL;
void* pushall_call_handler = NULL;
@ -926,7 +924,7 @@ static int alloc_reg_hinted(int r, int size, int willclobber, int hint)
bestreg = -1;
when = 2000000000;
for (i=0; i<N_REGS; i++) {
for (i = N_REGS - 1; i >= 0; i--) {
badness = live.nat[i].touched;
if (live.nat[i].nholds == 0)
badness = 0;
@ -1248,6 +1246,7 @@ static int rmw(int r, int wsize, int rsize)
/********************************************************************
* FPU register status handling. EMIT TIME! *
********************************************************************/
#ifdef USE_JIT_FPU
STATIC_INLINE void f_tomem_drop(int r)
{
@ -1382,6 +1381,7 @@ static void fflags_into_flags_internal(void)
live_flags();
}
#endif
#if defined(CPU_arm)
#include "compemu_midfunc_arm.cpp"
@ -2599,7 +2599,7 @@ void compile_block(cpu_history* pc_hist, int blocklen, int totcycles)
compemu_raw_mov_l_rm(0, (uintptr)specflags);
compemu_raw_test_l_rr(0, 0);
#if defined(CPU_arm) && !defined(ARMV6T2)
data_check_end(8, 56);
data_check_end(8, 64);
#endif
compemu_raw_jz_b_oponly();
branchadd = (uae_s8 *)get_target();
@ -2609,6 +2609,9 @@ void compile_block(cpu_history* pc_hist, int blocklen, int totcycles)
*(branchadd - 4) = (((uintptr)get_target() - (uintptr)branchadd) - 4) >> 2;
}
} else if(may_raise_exception) {
#if defined(CPU_arm) && !defined(ARMV6T2)
data_check_end(8, 64);
#endif
compemu_raw_handle_except(scaled_cycles(totcycles));
may_raise_exception = false;
}
@ -2637,6 +2640,9 @@ void compile_block(cpu_history* pc_hist, int blocklen, int totcycles)
}
tmp = live; /* ouch! This is big... */
#if defined(CPU_arm) && !defined(ARMV6T2)
data_check_end(8, 128);
#endif
compemu_raw_jcc_l_oponly(cc); // Last emitted opcode is branch to target
branchadd = (uae_u32*)get_target() - 1;
@ -2644,9 +2650,6 @@ void compile_block(cpu_history* pc_hist, int blocklen, int totcycles)
tbi = get_blockinfo_addr_new((void*)t1);
match_states(tbi);
#if defined(CPU_arm) && !defined(ARMV6T2)
data_check_end(4, 56);
#endif
tba = compemu_raw_endblock_pc_isconst(scaled_cycles(totcycles), t1);
write_jmp_target(tba, get_handler(t1));
create_jmpdep(bi, 0, tba, t1);
@ -2658,9 +2661,6 @@ void compile_block(cpu_history* pc_hist, int blocklen, int totcycles)
match_states(tbi);
//flush(1); /* Can only get here if was_comp==1 */
#if defined(CPU_arm) && !defined(ARMV6T2)
data_check_end(4, 56);
#endif
tba = compemu_raw_endblock_pc_isconst(scaled_cycles(totcycles), t2);
write_jmp_target(tba, get_handler(t2));
create_jmpdep(bi, 1, tba, t2);
@ -2674,7 +2674,7 @@ void compile_block(cpu_history* pc_hist, int blocklen, int totcycles)
/* Let's find out where next_handler is... */
if (was_comp && isinreg(PC_P)) {
#if defined(CPU_arm) && !defined(ARMV6T2)
data_check_end(4, 52);
data_check_end(4, 64);
#endif
r = live.state[PC_P].realreg;
compemu_raw_endblock_pc_inreg(r, scaled_cycles(totcycles));
@ -2688,7 +2688,7 @@ void compile_block(cpu_history* pc_hist, int blocklen, int totcycles)
match_states(tbi);
#if defined(CPU_arm) && !defined(ARMV6T2)
data_check_end(4, 56);
data_check_end(4, 64);
#endif
tba = compemu_raw_endblock_pc_isconst(scaled_cycles(totcycles), v);
write_jmp_target(tba, get_handler(v));
@ -2698,7 +2698,7 @@ void compile_block(cpu_history* pc_hist, int blocklen, int totcycles)
r = REG_PC_TMP;
compemu_raw_mov_l_rm(r, (uintptr)&regs.pc_p);
#if defined(CPU_arm) && !defined(ARMV6T2)
data_check_end(4, 52);
data_check_end(4, 64);
#endif
compemu_raw_endblock_pc_inreg(r, scaled_cycles(totcycles));
}

View file

@ -25,7 +25,7 @@ int machdep_init (void)
// Initialize timebase
g_uae_epoch = read_processor_time();
syncbase = 1000000; // Microseconds
return 1;
}

View file

@ -1,10 +1,10 @@
class mp3decoder
{
void *g_mp3stream;
void *g_mp3stream;
public:
mp3decoder();
~mp3decoder();
uae_u8 *get(struct zfile *zf, uae_u8 *, int maxsize);
uae_u32 getsize(struct zfile *zf);
mp3decoder();
~mp3decoder();
uae_u8 *get(struct zfile *zf, uae_u8 *, int maxsize);
uae_u32 getsize(struct zfile *zf);
};

View file

@ -1701,6 +1701,7 @@ static void inituaegfx(TrapContext *ctx, uaecptr ABI)
trap_put_word(ctx, ABI + PSSO_BoardInfo_MaxVerResolution + 4, hicolour.height);
trap_put_word(ctx, ABI + PSSO_BoardInfo_MaxVerResolution + 6, truecolour.height);
trap_put_word(ctx, ABI + PSSO_BoardInfo_MaxVerResolution + 8, alphacolour.height);
inituaegfxfuncs(ctx, uaegfx_rom, ABI);
}
@ -1820,6 +1821,7 @@ static uae_u32 REGPARAM2 picasso_SetSwitch(TrapContext *ctx)
picasso96_state_uaegfx.Width, picasso96_state_uaegfx.Height, picasso96_state_uaegfx.BytesPerPixel * 8,
picasso_vidinfo.width, picasso_vidinfo.height, picasso_vidinfo.pixbytes * 8);
write_log(_T("SetSwitch() - %s\n"), flag ? p96text : _T("amiga"));
/* Put old switch-state in D0 */
return !flag;
}

View file

@ -49,7 +49,6 @@ void backtrace_symbols_fd(void* const*,int,int){}
extern uae_u8* current_compile_p;
extern uae_u8* compiled_code;
extern uae_u8 *popallspace;
#define POPALLSPACE_SIZE 2048
extern blockinfo* active;
extern blockinfo* dormant;
extern void invalidate_block(blockinfo* bi);

View file

@ -15,7 +15,9 @@
#define UAE_FILESYS_THREADS
#define AUTOCONFIG /* autoconfig support, fast ram, harddrives etc.. */
#define JIT /* JIT compiler support */
#ifdef ARMV6T2
#define USE_JIT_FPU
#endif
/* #define NATMEM_OFFSET regs.natmem_offset */
/* #define CATWEASEL */ /* Catweasel MK2/3 support */
/* #define AHI */ /* AHI sound emulation */

View file

@ -13,21 +13,14 @@
#define OPTIONSFILENAME "uaeconfig"
#ifndef ARMV6T2
#undef USE_JIT_FPU
#endif
STATIC_INLINE FILE *uae_tfopen(const TCHAR *path, const TCHAR *mode)
{
return fopen(path, mode);
}
extern void fix_apmodes(struct uae_prefs *p);
extern int generic_main (int argc, char *argv[]);
#define OFFSET_Y_ADJUST 18
extern int emulating;