mirror of
https://github.com/kanjitalk755/macemu.git
synced 2024-11-26 10:49:21 +00:00
Sync with ARAnyM compiler sources
This commit is contained in:
parent
730ca109b7
commit
48a41966fd
@ -57,7 +57,7 @@ using std::string;
|
||||
#include "sigsegv.h"
|
||||
|
||||
#if USE_JIT
|
||||
extern void flush_icache_range(uint8 *start, uint32 size); // from compemu_support.cpp
|
||||
extern void (*flush_icache)(void); // from compemu_support.cpp
|
||||
#endif
|
||||
|
||||
|
||||
@ -542,7 +542,7 @@ void FlushCodeCache(void *start, uint32 size)
|
||||
{
|
||||
#if USE_JIT
|
||||
if (UseJIT)
|
||||
flush_icache_range((uint8 *)start, size);
|
||||
flush_icache();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -22,9 +22,9 @@
|
||||
#include "macos_util.h"
|
||||
#include "timer.h"
|
||||
|
||||
// #ifdef USE_SDL
|
||||
// # include <SDL.h>
|
||||
// #endif
|
||||
#ifdef USE_SDL
|
||||
# include <SDL.h>
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
@ -341,19 +341,19 @@ void Delay_usec(uint32 usec)
|
||||
// #endif
|
||||
// #endif
|
||||
|
||||
// SDL_mutex *idle_lock;
|
||||
// SDL_cond *idle_cond;
|
||||
SDL_mutex *idle_lock;
|
||||
SDL_cond *idle_cond;
|
||||
|
||||
void idle_wait(void)
|
||||
{
|
||||
//This causes events to not process randomly in JIT so commented out
|
||||
// if (!idle_lock)
|
||||
// idle_lock = SDL_CreateMutex();
|
||||
// if (!idle_cond)
|
||||
// idle_cond = SDL_CreateCond();
|
||||
// SDL_LockMutex(idle_lock);
|
||||
// SDL_CondWait(idle_cond, idle_lock);
|
||||
// SDL_UnlockMutex(idle_lock);
|
||||
if (!idle_lock)
|
||||
idle_lock = SDL_CreateMutex();
|
||||
if (!idle_cond)
|
||||
idle_cond = SDL_CreateCond();
|
||||
SDL_LockMutex(idle_lock);
|
||||
SDL_CondWait(idle_cond, idle_lock);
|
||||
SDL_UnlockMutex(idle_lock);
|
||||
|
||||
// #ifdef IDLE_USES_COND_WAIT
|
||||
// pthread_mutex_lock(&idle_lock);
|
||||
@ -386,8 +386,8 @@ void idle_wait(void)
|
||||
void idle_resume(void)
|
||||
{
|
||||
//This causes events to not process randomly in JIT so commented out
|
||||
// if (idle_cond)
|
||||
// SDL_CondSignal(idle_cond);
|
||||
if (idle_cond)
|
||||
SDL_CondSignal(idle_cond);
|
||||
// #ifdef IDLE_USES_COND_WAIT
|
||||
// pthread_cond_signal(&idle_cond);
|
||||
// #else
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -66,22 +66,22 @@
|
||||
/* --- ENCODINGS ----------------------------------------------------------- */
|
||||
/* ========================================================================= */
|
||||
|
||||
#define IMM32(c) ((c & 0xffffff00) == 0 ? c : \
|
||||
(c & 0x3fffffc0) == 0 ? (0x100 | ((c >> 30) & 0x3) | ((c << 2) & 0xfc)) : \
|
||||
(c & 0x0ffffff0) == 0 ? (0x200 | ((c >> 28) & 0xf) | ((c << 4) & 0xf0)) : \
|
||||
(c & 0x03fffffc) == 0 ? (0x300 | ((c >> 26) & 0x3f) | ((c << 6) & 0xc0) ) : \
|
||||
(c & 0x00ffffff) == 0 ? (0x400 | ((c >> 24) & 0xff)) : \
|
||||
(c & 0xc03fffff) == 0 ? (0x500 | (c >> 22)) : \
|
||||
(c & 0xf00fffff) == 0 ? (0x600 | (c >> 20)) : \
|
||||
(c & 0xfc03ffff) == 0 ? (0x700 | (c >> 18)) : \
|
||||
(c & 0xff00ffff) == 0 ? (0x800 | (c >> 16)) : \
|
||||
(c & 0xffc03fff) == 0 ? (0x900 | (c >> 14)) : \
|
||||
(c & 0xfff00fff) == 0 ? (0xa00 | (c >> 12)) : \
|
||||
(c & 0xfffc03ff) == 0 ? (0xb00 | (c >> 10)) : \
|
||||
(c & 0xffff00ff) == 0 ? (0xc00 | (c >> 8)) : \
|
||||
(c & 0xffffc03f) == 0 ? (0xd00 | (c >> 6)) : \
|
||||
(c & 0xfffff00f) == 0 ? (0xe00 | (c >> 4)) : \
|
||||
(c & 0xfffffc03) == 0 ? (0xf00 | (c >> 2)) : \
|
||||
#define IMM32(c) (((c) & 0xffffff00) == 0 ? (c) : \
|
||||
((c) & 0x3fffffc0) == 0 ? (0x100 | (((c) >> 30) & 0x3) | ((((c) & 0x0000003f) << 2))) : \
|
||||
((c) & 0x0ffffff0) == 0 ? (0x200 | (((c) >> 28) & 0xf) | ((((c) & 0x0000000f) << 4))) : \
|
||||
((c) & 0x03fffffc) == 0 ? (0x300 | (((c) >> 26) & 0x3f) | ((((c) & 0x00000003) << 6)) ) : \
|
||||
((c) & 0x00ffffff) == 0 ? (0x400 | (((c) >> 24) & 0xff)) : \
|
||||
((c) & 0xc03fffff) == 0 ? (0x500 | ((c) >> 22)) : \
|
||||
((c) & 0xf00fffff) == 0 ? (0x600 | ((c) >> 20)) : \
|
||||
((c) & 0xfc03ffff) == 0 ? (0x700 | ((c) >> 18)) : \
|
||||
((c) & 0xff00ffff) == 0 ? (0x800 | ((c) >> 16)) : \
|
||||
((c) & 0xffc03fff) == 0 ? (0x900 | ((c) >> 14)) : \
|
||||
((c) & 0xfff00fff) == 0 ? (0xa00 | ((c) >> 12)) : \
|
||||
((c) & 0xfffc03ff) == 0 ? (0xb00 | ((c) >> 10)) : \
|
||||
((c) & 0xffff00ff) == 0 ? (0xc00 | ((c) >> 8)) : \
|
||||
((c) & 0xffffc03f) == 0 ? (0xd00 | ((c) >> 6)) : \
|
||||
((c) & 0xfffff00f) == 0 ? (0xe00 | ((c) >> 4)) : \
|
||||
((c) & 0xfffffc03) == 0 ? (0xf00 | ((c) >> 2)) : \
|
||||
0\
|
||||
)
|
||||
|
||||
@ -102,7 +102,7 @@
|
||||
#define SHIFT_RRX(Rm) ((Rm) | 0x60)
|
||||
#define SHIFT_PK(Rm,s) ((Rm) | ((s) << 7))
|
||||
|
||||
// Load/Store addressings
|
||||
/* Load/Store addressings */
|
||||
#define ADR_ADD(v) ((1 << 23) | (v))
|
||||
#define ADR_SUB(v) (v)
|
||||
|
||||
@ -138,16 +138,16 @@
|
||||
#define ADD2_REG(Rm) ADR_ADD(Rm)
|
||||
#define SUB2_REG(Rm) ADR_SUB(Rm)
|
||||
|
||||
// MOV, MVN
|
||||
/* MOV, MVN */
|
||||
#define _OP1(cc,op,s,Rd,shift) _W(((cc) << 28) | ((op) << 21) | ((s) << 20) | ((Rd) << 12) | (shift))
|
||||
|
||||
// CMP, CMN, TST, TEQ
|
||||
/* CMP, CMN, TST, TEQ */
|
||||
#define _OP2(cc,op,Rn,shift) _W(((cc) << 28) | ((op) << 21) | (1 << 20) | ((Rn) << 16) | (shift))
|
||||
|
||||
// ADD, SUB, RSB, ADC, SBC, RSC, AND, BIC, EOR, ORR
|
||||
/* ADD, SUB, RSB, ADC, SBC, RSC, AND, BIC, EOR, ORR */
|
||||
#define _OP3(cc,op,s,Rd,Rn,shift) _W(((cc) << 28) | ((op) << 21) | ((s) << 20) | ((Rn) << 16) | ((Rd) << 12) | (shift))
|
||||
|
||||
// LDR, STR
|
||||
/* LDR, STR */
|
||||
#define _LS1(cc,l,b,Rd,Rn,a) _W(((cc) << 28) | (0x01 << 26) | ((l) << 20) | ((b) << 22) | ((Rn) << 16) | ((Rd) << 12) | (a))
|
||||
#define _LS2(cc,p,l,s,h,Rd,Rn,a) _W(((cc) << 28) | ((p) << 24) | ((l) << 20) | ((Rn) << 16) | ((Rd) << 12) | ((s) << 6) | ((h) << 5) | 0x90 | _LS2_ADDR((a)))
|
||||
|
||||
@ -211,9 +211,9 @@ enum {
|
||||
/* Data processing instructions */
|
||||
|
||||
/* Opcodes Type 1 */
|
||||
// MOVcc rd,#i
|
||||
/* MOVcc rd,#i */
|
||||
#define CC_MOV_ri8(cc,Rd,i) _OP1(cc,_MOV,0,Rd,UNSHIFTED_IMM8(i))
|
||||
// MOVcc Rd,#i ROR #s
|
||||
/* MOVcc Rd,#i ROR #s */
|
||||
#define CC_MOV_ri8RORi(cc,Rd,i,s) _OP1(cc,_MOV,0,Rd,SHIFT_IMM8_ROR(i,s))
|
||||
#define CC_MOV_ri(cc,Rd,i) _OP1(cc,_MOV,0,Rd,SHIFT_IMM(i))
|
||||
#define CC_MOV_rr(cc,Rd,Rm) _OP1(cc,_MOV,0,Rd,SHIFT_REG(Rm))
|
||||
@ -227,9 +227,9 @@ enum {
|
||||
#define CC_MOV_rrRORr(cc,Rd,Rm,Rs) _OP1(cc,_MOV,0,Rd,SHIFT_ROR_r(Rm,Rs))
|
||||
#define CC_MOV_rrRRX(cc,Rd,Rm) _OP1(cc,_MOV,0,Rd,SHIFT_RRX(Rm))
|
||||
|
||||
// MOV rd,#i
|
||||
/* MOV rd,#i */
|
||||
#define MOV_ri8(Rd,i) CC_MOV_ri8(NATIVE_CC_AL,Rd,i)
|
||||
// MOV Rd,#i ROR #s
|
||||
/* MOV Rd,#i ROR #s */
|
||||
#define MOV_ri8RORi(Rd,i,s) CC_MOV_ri8RORi(NATIVE_CC_AL,Rd,i,s)
|
||||
#define MOV_ri(Rd,i) CC_MOV_ri(NATIVE_CC_AL,Rd,i)
|
||||
#define MOV_rr(Rd,Rm) CC_MOV_rr(NATIVE_CC_AL,Rd,Rm)
|
||||
@ -267,9 +267,9 @@ enum {
|
||||
#define MOVS_rrRORr(Rd,Rm,Rs) CC_MOVS_rrRORr(NATIVE_CC_AL,Rd,Rm,Rs)
|
||||
#define MOVS_rrRRX(Rd,Rm) CC_MOVS_rrRRX(NATIVE_CC_AL,Rd,Rm)
|
||||
|
||||
// MVNcc rd,#i
|
||||
/* MVNcc rd,#i */
|
||||
#define CC_MVN_ri8(cc,Rd,i) _OP1(cc,_MVN,0,Rd,UNSHIFTED_IMM8(i))
|
||||
// MVNcc Rd,#i ROR #s
|
||||
/* MVNcc Rd,#i ROR #s */
|
||||
#define CC_MVN_ri8RORi(cc,Rd,i,s) _OP1(cc,_MVN,0,Rd,SHIFT_IMM8_ROR(i,s))
|
||||
#define CC_MVN_ri(cc,Rd,i) _OP1(cc,_MVN,0,Rd,SHIFT_IMM(i))
|
||||
#define CC_MVN_rr(cc,Rd,Rm) _OP1(cc,_MVN,0,Rd,SHIFT_REG(Rm))
|
||||
@ -283,9 +283,9 @@ enum {
|
||||
#define CC_MVN_rrRORr(cc,Rd,Rm,Rs) _OP1(cc,_MVN,0,Rd,SHIFT_ROR_r(Rm,Rs))
|
||||
#define CC_MVN_rrRRX(cc,Rd,Rm) _OP1(cc,_MVN,0,Rd,SHIFT_RRX(Rm))
|
||||
|
||||
// MVN rd,#i
|
||||
/* MVN rd,#i */
|
||||
#define MVN_ri8(Rd,i) CC_MVN_ri8(NATIVE_CC_AL,Rd,i)
|
||||
// MVN Rd,#i ROR #s
|
||||
/* MVN Rd,#i ROR #s */
|
||||
#define MVN_ri8RORi(Rd,i,s) CC_MVN_ri8RORi(NATIVE_CC_AL,Rd,i,s)
|
||||
#define MVN_ri(Rd,i) CC_MVN_ri(NATIVE_CC_AL,Rd,i)
|
||||
#define MVN_rr(Rd,Rm) CC_MVN_rr(NATIVE_CC_AL,Rd,Rm)
|
||||
@ -811,9 +811,9 @@ enum {
|
||||
#define RSCS_rrrRORr(Rd,Rn,Rm,Rs) CC_RSCS_rrrRORr(NATIVE_CC_AL,Rd,Rn,Rm,Rs)
|
||||
#define RSCS_rrrRRX(Rd,Rn,Rm) CC_RSCS_rrrRRX(NATIVE_CC_AL,Rd,Rn,Rm)
|
||||
|
||||
// ORRcc Rd,Rn,#i
|
||||
/* ORRcc Rd,Rn,#i */
|
||||
#define CC_ORR_rri8(cc,Rd,Rn,i) _OP3(cc,_ORR,0,Rd,Rn,UNSHIFTED_IMM8(i))
|
||||
// ORRcc Rd,Rn,#i ROR #s
|
||||
/* ORRcc Rd,Rn,#i ROR #s */
|
||||
#define CC_ORR_rri8RORi(cc,Rd,Rn,i,s) _OP3(cc,_ORR,0,Rd,Rn,SHIFT_IMM8_ROR(i,s))
|
||||
|
||||
#define CC_ORR_rri(cc,Rd,Rn,i) _OP3(cc,_ORR,0,Rd,Rn,SHIFT_IMM(i))
|
||||
@ -828,9 +828,9 @@ enum {
|
||||
#define CC_ORR_rrrRORr(cc,Rd,Rn,Rm,Rs) _OP3(cc,_ORR,0,Rd,Rn,SHIFT_ROR_r(Rm,Rs))
|
||||
#define CC_ORR_rrrRRX(cc,Rd,Rn,Rm) _OP3(cc,_ORR,0,Rd,Rn,SHIFT_RRX(Rm))
|
||||
|
||||
// ORR Rd,Rn,#i
|
||||
/* ORR Rd,Rn,#i */
|
||||
#define ORR_rri8(Rd,Rn,i) CC_ORR_rri8(NATIVE_CC_AL,Rd,Rn,i)
|
||||
// ORR Rd,Rn,#i ROR #s
|
||||
/* ORR Rd,Rn,#i ROR #s */
|
||||
#define ORR_rri8RORi(Rd,Rn,i,s) CC_ORR_rri8RORi(NATIVE_CC_AL,Rd,Rn,i,s)
|
||||
|
||||
#define ORR_rri(Rd,Rn,i) CC_ORR_rri(NATIVE_CC_AL,Rd,Rn,i)
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -402,22 +402,54 @@ typedef unsigned int _ul;
|
||||
/* --- Memory subformats - urgh! ------------------------------------------- */
|
||||
|
||||
/* _r_D() is RIP addressing mode if X86_TARGET_64BIT, use _r_DSIB() instead */
|
||||
#define _r_D( R, D ) (_Mrm(_b00,_rN(R),_b101 ) ,_L((long)(D)))
|
||||
#define _r_DSIB(R, D ) (_Mrm(_b00,_rN(R),_b100 ),_SIB(_SCL(1),_b100 ,_b101 ),_L((long)(D)))
|
||||
#define _r_D( R, D ) (_Mrm(_b00,_rN(R),_b101 ) ,_L((uae_u32)(D)))
|
||||
#define _r_DSIB(R, D ) (_Mrm(_b00,_rN(R),_b100 ),_SIB(_SCL(1),_b100 ,_b101 ),_L((uae_u32)(D)))
|
||||
#define _r_0B( R, B ) (_Mrm(_b00,_rN(R),_rA(B)) )
|
||||
#define _r_0BIS(R, B,I,S) (_Mrm(_b00,_rN(R),_b100 ),_SIB(_SCL(S),_rA(I),_rA(B)) )
|
||||
#define _r_1B( R, D,B ) (_Mrm(_b01,_rN(R),_rA(B)) ,_B((long)(D)))
|
||||
#define _r_1BIS(R, D,B,I,S) (_Mrm(_b01,_rN(R),_b100 ),_SIB(_SCL(S),_rA(I),_rA(B)),_B((long)(D)))
|
||||
#define _r_4B( R, D,B ) (_Mrm(_b10,_rN(R),_rA(B)) ,_L((long)(D)))
|
||||
#define _r_4IS( R, D,I,S) (_Mrm(_b00,_rN(R),_b100 ),_SIB(_SCL(S),_rA(I),_b101 ),_L((long)(D)))
|
||||
#define _r_4BIS(R, D,B,I,S) (_Mrm(_b10,_rN(R),_b100 ),_SIB(_SCL(S),_rA(I),_rA(B)),_L((long)(D)))
|
||||
#define _r_1B( R, D,B ) (_Mrm(_b01,_rN(R),_rA(B)) ,_B((uae_u32)(D)))
|
||||
#define _r_1BIS(R, D,B,I,S) (_Mrm(_b01,_rN(R),_b100 ),_SIB(_SCL(S),_rA(I),_rA(B)),_B((uae_u32)(D)))
|
||||
#define _r_4B( R, D,B ) (_Mrm(_b10,_rN(R),_rA(B)) ,_L((uae_u32)(D)))
|
||||
#define _r_4IS( R, D,I,S) (_Mrm(_b00,_rN(R),_b100 ),_SIB(_SCL(S),_rA(I),_b101 ),_L((uae_u32)(D)))
|
||||
#define _r_4BIS(R, D,B,I,S) (_Mrm(_b10,_rN(R),_b100 ),_SIB(_SCL(S),_rA(I),_rA(B)),_L((uae_u32)(D)))
|
||||
|
||||
#define _r_DB( R, D,B ) ((_s0P(D) && (!_rbp13P(B)) ? _r_0B (R, B ) : (_s8P(D) ? _r_1B( R,D,B ) : _r_4B( R,D,B ))))
|
||||
#define _r_DBIS(R, D,B,I,S) ((_s0P(D) && (!_rbp13P(B)) ? _r_0BIS(R, B,I,S) : (_s8P(D) ? _r_1BIS(R,D,B,I,S) : _r_4BIS(R,D,B,I,S))))
|
||||
|
||||
/* Use RIP-addressing in 64-bit mode, if possible */
|
||||
#define _x86_RIP_addressing_possible(D,O) (X86_RIP_RELATIVE_ADDR && \
|
||||
((uintptr)x86_get_target() + 4 + (O) - (D) <= 0xffffffff))
|
||||
#define _x86_RIP_addressing_possible(D,O) (X86_RIP_RELATIVE_ADDR && x86_RIP_addressing_possible(D, O))
|
||||
|
||||
static inline int x86_RIP_addressing_possible(uintptr addr, uintptr offset)
|
||||
{
|
||||
#if X86_TARGET_64BIT
|
||||
/*
|
||||
* address of the next instruction.
|
||||
* The opcode has already been emmitted,
|
||||
* so this is the size of an 32bit displacement +
|
||||
* the size of any immediate value that is part of the instruction (offset),
|
||||
*/
|
||||
uintptr dst = (uintptr)get_target() + 4 + offset;
|
||||
intptr disp = dst - addr;
|
||||
int ok = disp >= -0x80000000LL && disp <= 0x7fffffffLL;
|
||||
/* fprintf(stderr, "x86_RIP_addressing_possible: %llx - %llx %16llx = %d\n", (unsigned long long)dst, (unsigned long long)addr, (long long)disp, ok); */
|
||||
return ok;
|
||||
#else
|
||||
UNUSED(addr);
|
||||
UNUSED(offset);
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
static inline int x86_DISP32_addressing_possible(uintptr addr)
|
||||
{
|
||||
#if X86_TARGET_64BIT
|
||||
return addr <= 0xFFFFFFFFULL;
|
||||
#else
|
||||
UNUSED(addr);
|
||||
return 1;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#define _r_X( R, D,B,I,S,O) (_r0P(I) ? (_r0P(B) ? (!X86_TARGET_64BIT ? _r_D(R,D) : \
|
||||
(_x86_RIP_addressing_possible(D, O) ? \
|
||||
|
@ -35,11 +35,6 @@
|
||||
// #include "sysconfig.h"
|
||||
#include "newcpu.h"
|
||||
|
||||
#ifdef __x86_64__
|
||||
#define CPU_64_BIT 1
|
||||
#define CPU_x86_64 1
|
||||
#endif
|
||||
|
||||
#ifdef UAE
|
||||
#ifdef CPU_64_BIT
|
||||
typedef uae_u64 uintptr;
|
||||
@ -135,11 +130,19 @@ union cacheline {
|
||||
for jump targets */
|
||||
|
||||
#define INDIVIDUAL_INST 0
|
||||
#ifdef WINUAE_ARANYM
|
||||
#define FLAG_X 0x0010
|
||||
#define FLAG_N 0x0008
|
||||
#define FLAG_Z 0x0004
|
||||
#define FLAG_V 0x0002
|
||||
#define FLAG_C 0x0001
|
||||
#else
|
||||
#define FLAG_C 0x0010
|
||||
#define FLAG_V 0x0008
|
||||
#define FLAG_Z 0x0004
|
||||
#define FLAG_N 0x0002
|
||||
#define FLAG_X 0x0001
|
||||
#endif
|
||||
#define FLAG_CZNV (FLAG_C | FLAG_Z | FLAG_N | FLAG_V)
|
||||
#define FLAG_ALL (FLAG_C | FLAG_Z | FLAG_N | FLAG_V | FLAG_X)
|
||||
#define FLAG_ZNV (FLAG_Z | FLAG_N | FLAG_V)
|
||||
@ -165,27 +168,74 @@ extern void compiler_init(void);
|
||||
extern void compiler_exit(void);
|
||||
extern bool compiler_use_jit(void);
|
||||
#endif
|
||||
extern void init_comp(void);
|
||||
extern void flush(int save_regs);
|
||||
extern void small_flush(int save_regs);
|
||||
extern void set_target(uae_u8* t);
|
||||
extern uae_u8* get_target(void);
|
||||
extern void freescratch(void);
|
||||
#ifdef UAE
|
||||
extern void build_comp(void);
|
||||
#endif
|
||||
extern void set_cache_state(int enabled);
|
||||
extern int get_cache_state(void);
|
||||
extern uae_u32 get_jitted_size(void);
|
||||
#ifdef JIT
|
||||
#ifdef WINUAE_ARANYM
|
||||
extern void (*flush_icache)(int n);
|
||||
#else
|
||||
extern void flush_icache(int n);
|
||||
#endif
|
||||
extern void (*flush_icache)(void);
|
||||
#endif
|
||||
extern void alloc_cache(void);
|
||||
extern int check_for_cache_miss(void);
|
||||
|
||||
/* JIT FPU compilation */
|
||||
struct jit_disable_opcodes {
|
||||
bool fbcc;
|
||||
bool fdbcc;
|
||||
bool fscc;
|
||||
bool ftrapcc;
|
||||
bool fsave;
|
||||
bool frestore;
|
||||
bool fmove;
|
||||
bool fmovem;
|
||||
bool fmovec; /* for move control register */
|
||||
bool fmovecr; /* for move from constant rom */
|
||||
bool fint;
|
||||
bool fsinh;
|
||||
bool fintrz;
|
||||
bool fsqrt;
|
||||
bool flognp1;
|
||||
bool fetoxm1;
|
||||
bool ftanh;
|
||||
bool fatan;
|
||||
bool fasin;
|
||||
bool fatanh;
|
||||
bool fsin;
|
||||
bool ftan;
|
||||
bool fetox;
|
||||
bool ftwotox;
|
||||
bool ftentox;
|
||||
bool flogn;
|
||||
bool flog10;
|
||||
bool flog2;
|
||||
bool fabs;
|
||||
bool fcosh;
|
||||
bool fneg;
|
||||
bool facos;
|
||||
bool fcos;
|
||||
bool fgetexp;
|
||||
bool fgetman;
|
||||
bool fdiv;
|
||||
bool fmod;
|
||||
bool fadd;
|
||||
bool fmul;
|
||||
bool fsgldiv;
|
||||
bool frem;
|
||||
bool fscale;
|
||||
bool fsglmul;
|
||||
bool fsub;
|
||||
bool fsincos;
|
||||
bool fcmp;
|
||||
bool ftst;
|
||||
};
|
||||
extern struct jit_disable_opcodes jit_disable;
|
||||
|
||||
|
||||
extern void comp_fpp_opp (uae_u32 opcode, uae_u16 extra);
|
||||
extern void comp_fbcc_opp (uae_u32 opcode);
|
||||
extern void comp_fscc_opp (uae_u32 opcode, uae_u16 extra);
|
||||
@ -320,18 +370,20 @@ extern int touchcnt;
|
||||
#define RW4 uae_u32
|
||||
#define MEMR uae_u32
|
||||
#define MEMW uae_u32
|
||||
#define MEMRW uae_u32
|
||||
#define MEMRW uae_u32
|
||||
#define MEMPTR uintptr
|
||||
#define MEMPTRR MEMPTR
|
||||
#define MEMPTRW MEMPTR
|
||||
#define MEMPTRRW MEMPTR
|
||||
|
||||
#define FW uae_u32
|
||||
#define FR uae_u32
|
||||
#define FRW uae_u32
|
||||
|
||||
#define MIDFUNC(nargs,func,args) void func args
|
||||
#define MENDFUNC(nargs,func,args)
|
||||
#define COMPCALL(func) func
|
||||
|
||||
#define LOWFUNC(flags,mem,nargs,func,args) static inline void func args
|
||||
#define LENDFUNC(flags,mem,nargs,func,args)
|
||||
|
||||
/* What we expose to the outside */
|
||||
#define DECLARE_MIDFUNC(func) extern void func
|
||||
@ -456,8 +508,7 @@ void do_nothing(void);
|
||||
|
||||
#else
|
||||
|
||||
static inline void flush_icache(int) { }
|
||||
static inline void build_comp() { }
|
||||
static inline void flush_icache(void) { }
|
||||
|
||||
#endif /* !USE_JIT */
|
||||
|
||||
@ -520,7 +571,7 @@ void jit_abort(const TCHAR *format, ...);
|
||||
#else
|
||||
|
||||
#ifdef WINUAE_ARANYM
|
||||
#define jit_log(format, ...) write_log(format"\n", ##__VA_ARGS__)
|
||||
#define jit_log(format, ...) D(bug(format, ##__VA_ARGS__))
|
||||
#define jit_log2(format, ...) D2(bug(format, ##__VA_ARGS__))
|
||||
void jit_abort(const char *format,...) __attribute__((format(printf, 1, 2))) __attribute__((__noreturn__));
|
||||
#else
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -61,13 +61,11 @@ MIDFUNC(0,live_flags,(void))
|
||||
live.flags_in_flags=VALID;
|
||||
live.flags_are_important=1;
|
||||
}
|
||||
MENDFUNC(0,live_flags,(void))
|
||||
|
||||
MIDFUNC(0,dont_care_flags,(void))
|
||||
{
|
||||
live.flags_are_important=0;
|
||||
}
|
||||
MENDFUNC(0,dont_care_flags,(void))
|
||||
|
||||
MIDFUNC(0,duplicate_carry,(void))
|
||||
{
|
||||
@ -76,7 +74,6 @@ MIDFUNC(0,duplicate_carry,(void))
|
||||
COMPCALL(setcc_m)((uintptr)live.state[FLAGX].mem,NATIVE_CC_CS);
|
||||
log_vwrite(FLAGX);
|
||||
}
|
||||
MENDFUNC(0,duplicate_carry,(void))
|
||||
|
||||
MIDFUNC(0,restore_carry,(void))
|
||||
{
|
||||
@ -100,25 +97,21 @@ MIDFUNC(0,restore_carry,(void))
|
||||
}
|
||||
#endif
|
||||
}
|
||||
MENDFUNC(0,restore_carry,(void))
|
||||
|
||||
MIDFUNC(0,start_needflags,(void))
|
||||
{
|
||||
needflags=1;
|
||||
}
|
||||
MENDFUNC(0,start_needflags,(void))
|
||||
|
||||
MIDFUNC(0,end_needflags,(void))
|
||||
{
|
||||
needflags=0;
|
||||
}
|
||||
MENDFUNC(0,end_needflags,(void))
|
||||
|
||||
MIDFUNC(0,make_flags_live,(void))
|
||||
{
|
||||
make_flags_live_internal();
|
||||
}
|
||||
MENDFUNC(0,make_flags_live,(void))
|
||||
|
||||
MIDFUNC(2,bt_l_ri,(RR4 r, IMM i)) /* This is defined as only affecting C */
|
||||
{
|
||||
@ -130,7 +123,6 @@ MIDFUNC(2,bt_l_ri,(RR4 r, IMM i)) /* This is defined as only affecting C */
|
||||
raw_bt_l_ri(r,i);
|
||||
unlock2(r);
|
||||
}
|
||||
MENDFUNC(2,bt_l_ri,(RR4 r, IMM i)) /* This is defined as only affecting C */
|
||||
|
||||
MIDFUNC(2,bt_l_rr,(RR4 r, RR4 b)) /* This is defined as only affecting C */
|
||||
{
|
||||
@ -141,7 +133,6 @@ MIDFUNC(2,bt_l_rr,(RR4 r, RR4 b)) /* This is defined as only affecting C */
|
||||
unlock2(r);
|
||||
unlock2(b);
|
||||
}
|
||||
MENDFUNC(2,bt_l_rr,(RR4 r, RR4 b)) /* This is defined as only affecting C */
|
||||
|
||||
MIDFUNC(2,btc_l_rr,(RW4 r, RR4 b))
|
||||
{
|
||||
@ -152,7 +143,6 @@ MIDFUNC(2,btc_l_rr,(RW4 r, RR4 b))
|
||||
unlock2(r);
|
||||
unlock2(b);
|
||||
}
|
||||
MENDFUNC(2,btc_l_rr,(RW4 r, RR4 b))
|
||||
|
||||
MIDFUNC(2,btr_l_rr,(RW4 r, RR4 b))
|
||||
{
|
||||
@ -163,7 +153,6 @@ MIDFUNC(2,btr_l_rr,(RW4 r, RR4 b))
|
||||
unlock2(r);
|
||||
unlock2(b);
|
||||
}
|
||||
MENDFUNC(2,btr_l_rr,(RW4 r, RR4 b))
|
||||
|
||||
MIDFUNC(2,bts_l_rr,(RW4 r, RR4 b))
|
||||
{
|
||||
@ -174,7 +163,6 @@ MIDFUNC(2,bts_l_rr,(RW4 r, RR4 b))
|
||||
unlock2(r);
|
||||
unlock2(b);
|
||||
}
|
||||
MENDFUNC(2,bts_l_rr,(RW4 r, RR4 b))
|
||||
|
||||
MIDFUNC(2,mov_l_rm,(W4 d, IMM s))
|
||||
{
|
||||
@ -183,7 +171,6 @@ MIDFUNC(2,mov_l_rm,(W4 d, IMM s))
|
||||
raw_mov_l_rm(d,s);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,mov_l_rm,(W4 d, IMM s))
|
||||
|
||||
MIDFUNC(4,mov_l_rm_indexed,(W4 d, IMM base, RR4 index, IMM factor))
|
||||
{
|
||||
@ -194,28 +181,24 @@ MIDFUNC(4,mov_l_rm_indexed,(W4 d, IMM base, RR4 index, IMM factor))
|
||||
unlock2(index);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(4,mov_l_rm_indexed,(W4 d, IMM base, RR4 index, IMM factor))
|
||||
|
||||
MIDFUNC(2,mov_l_mi,(IMM d, IMM s))
|
||||
{
|
||||
CLOBBER_MOV;
|
||||
raw_mov_l_mi(d,s);
|
||||
}
|
||||
MENDFUNC(2,mov_l_mi,(IMM d, IMM s))
|
||||
|
||||
MIDFUNC(2,mov_w_mi,(IMM d, IMM s))
|
||||
{
|
||||
CLOBBER_MOV;
|
||||
raw_mov_w_mi(d,s);
|
||||
}
|
||||
MENDFUNC(2,mov_w_mi,(IMM d, IMM s))
|
||||
|
||||
MIDFUNC(2,mov_b_mi,(IMM d, IMM s))
|
||||
{
|
||||
CLOBBER_MOV;
|
||||
raw_mov_b_mi(d,s);
|
||||
}
|
||||
MENDFUNC(2,mov_b_mi,(IMM d, IMM s))
|
||||
|
||||
MIDFUNC(2,rol_b_ri,(RW1 r, IMM i))
|
||||
{
|
||||
@ -226,7 +209,6 @@ MIDFUNC(2,rol_b_ri,(RW1 r, IMM i))
|
||||
raw_rol_b_ri(r,i);
|
||||
unlock2(r);
|
||||
}
|
||||
MENDFUNC(2,rol_b_ri,(RW1 r, IMM i))
|
||||
|
||||
MIDFUNC(2,rol_w_ri,(RW2 r, IMM i))
|
||||
{
|
||||
@ -237,7 +219,6 @@ MIDFUNC(2,rol_w_ri,(RW2 r, IMM i))
|
||||
raw_rol_w_ri(r,i);
|
||||
unlock2(r);
|
||||
}
|
||||
MENDFUNC(2,rol_w_ri,(RW2 r, IMM i))
|
||||
|
||||
MIDFUNC(2,rol_l_ri,(RW4 r, IMM i))
|
||||
{
|
||||
@ -248,7 +229,6 @@ MIDFUNC(2,rol_l_ri,(RW4 r, IMM i))
|
||||
raw_rol_l_ri(r,i);
|
||||
unlock2(r);
|
||||
}
|
||||
MENDFUNC(2,rol_l_ri,(RW4 r, IMM i))
|
||||
|
||||
MIDFUNC(2,rol_l_rr,(RW4 d, RR1 r))
|
||||
{
|
||||
@ -263,7 +243,6 @@ MIDFUNC(2,rol_l_rr,(RW4 d, RR1 r))
|
||||
unlock2(r);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,rol_l_rr,(RW4 d, RR1 r))
|
||||
|
||||
MIDFUNC(2,rol_w_rr,(RW2 d, RR1 r))
|
||||
{ /* Can only do this with r==1, i.e. cl */
|
||||
@ -279,7 +258,6 @@ MIDFUNC(2,rol_w_rr,(RW2 d, RR1 r))
|
||||
unlock2(r);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,rol_w_rr,(RW2 d, RR1 r))
|
||||
|
||||
MIDFUNC(2,rol_b_rr,(RW1 d, RR1 r))
|
||||
{ /* Can only do this with r==1, i.e. cl */
|
||||
@ -295,7 +273,6 @@ MIDFUNC(2,rol_b_rr,(RW1 d, RR1 r))
|
||||
unlock2(r);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,rol_b_rr,(RW1 d, RR1 r))
|
||||
|
||||
MIDFUNC(2,shll_l_rr,(RW4 d, RR1 r))
|
||||
{
|
||||
@ -310,7 +287,6 @@ MIDFUNC(2,shll_l_rr,(RW4 d, RR1 r))
|
||||
unlock2(r);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,shll_l_rr,(RW4 d, RR1 r))
|
||||
|
||||
MIDFUNC(2,shll_w_rr,(RW2 d, RR1 r))
|
||||
{ /* Can only do this with r==1, i.e. cl */
|
||||
@ -326,7 +302,6 @@ MIDFUNC(2,shll_w_rr,(RW2 d, RR1 r))
|
||||
unlock2(r);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,shll_w_rr,(RW2 d, RR1 r))
|
||||
|
||||
MIDFUNC(2,shll_b_rr,(RW1 d, RR1 r))
|
||||
{ /* Can only do this with r==1, i.e. cl */
|
||||
@ -342,7 +317,6 @@ MIDFUNC(2,shll_b_rr,(RW1 d, RR1 r))
|
||||
unlock2(r);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,shll_b_rr,(RW1 d, RR1 r))
|
||||
|
||||
MIDFUNC(2,ror_b_ri,(RR1 r, IMM i))
|
||||
{
|
||||
@ -353,7 +327,6 @@ MIDFUNC(2,ror_b_ri,(RR1 r, IMM i))
|
||||
raw_ror_b_ri(r,i);
|
||||
unlock2(r);
|
||||
}
|
||||
MENDFUNC(2,ror_b_ri,(RR1 r, IMM i))
|
||||
|
||||
MIDFUNC(2,ror_w_ri,(RR2 r, IMM i))
|
||||
{
|
||||
@ -364,7 +337,6 @@ MIDFUNC(2,ror_w_ri,(RR2 r, IMM i))
|
||||
raw_ror_w_ri(r,i);
|
||||
unlock2(r);
|
||||
}
|
||||
MENDFUNC(2,ror_w_ri,(RR2 r, IMM i))
|
||||
|
||||
MIDFUNC(2,ror_l_ri,(RR4 r, IMM i))
|
||||
{
|
||||
@ -375,7 +347,6 @@ MIDFUNC(2,ror_l_ri,(RR4 r, IMM i))
|
||||
raw_ror_l_ri(r,i);
|
||||
unlock2(r);
|
||||
}
|
||||
MENDFUNC(2,ror_l_ri,(RR4 r, IMM i))
|
||||
|
||||
MIDFUNC(2,ror_l_rr,(RR4 d, RR1 r))
|
||||
{
|
||||
@ -390,7 +361,6 @@ MIDFUNC(2,ror_l_rr,(RR4 d, RR1 r))
|
||||
unlock2(r);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,ror_l_rr,(RR4 d, RR1 r))
|
||||
|
||||
MIDFUNC(2,ror_w_rr,(RR2 d, RR1 r))
|
||||
{
|
||||
@ -405,7 +375,6 @@ MIDFUNC(2,ror_w_rr,(RR2 d, RR1 r))
|
||||
unlock2(r);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,ror_w_rr,(RR2 d, RR1 r))
|
||||
|
||||
MIDFUNC(2,ror_b_rr,(RR1 d, RR1 r))
|
||||
{
|
||||
@ -421,7 +390,6 @@ MIDFUNC(2,ror_b_rr,(RR1 d, RR1 r))
|
||||
unlock2(r);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,ror_b_rr,(RR1 d, RR1 r))
|
||||
|
||||
MIDFUNC(2,shrl_l_rr,(RW4 d, RR1 r))
|
||||
{
|
||||
@ -436,7 +404,6 @@ MIDFUNC(2,shrl_l_rr,(RW4 d, RR1 r))
|
||||
unlock2(r);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,shrl_l_rr,(RW4 d, RR1 r))
|
||||
|
||||
MIDFUNC(2,shrl_w_rr,(RW2 d, RR1 r))
|
||||
{ /* Can only do this with r==1, i.e. cl */
|
||||
@ -452,7 +419,6 @@ MIDFUNC(2,shrl_w_rr,(RW2 d, RR1 r))
|
||||
unlock2(r);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,shrl_w_rr,(RW2 d, RR1 r))
|
||||
|
||||
MIDFUNC(2,shrl_b_rr,(RW1 d, RR1 r))
|
||||
{ /* Can only do this with r==1, i.e. cl */
|
||||
@ -469,7 +435,6 @@ MIDFUNC(2,shrl_b_rr,(RW1 d, RR1 r))
|
||||
unlock2(r);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,shrl_b_rr,(RW1 d, RR1 r))
|
||||
|
||||
MIDFUNC(2,shll_l_ri,(RW4 r, IMM i))
|
||||
{
|
||||
@ -484,7 +449,6 @@ MIDFUNC(2,shll_l_ri,(RW4 r, IMM i))
|
||||
raw_shll_l_ri(r,i);
|
||||
unlock2(r);
|
||||
}
|
||||
MENDFUNC(2,shll_l_ri,(RW4 r, IMM i))
|
||||
|
||||
MIDFUNC(2,shll_w_ri,(RW2 r, IMM i))
|
||||
{
|
||||
@ -495,7 +459,6 @@ MIDFUNC(2,shll_w_ri,(RW2 r, IMM i))
|
||||
raw_shll_w_ri(r,i);
|
||||
unlock2(r);
|
||||
}
|
||||
MENDFUNC(2,shll_w_ri,(RW2 r, IMM i))
|
||||
|
||||
MIDFUNC(2,shll_b_ri,(RW1 r, IMM i))
|
||||
{
|
||||
@ -506,7 +469,6 @@ MIDFUNC(2,shll_b_ri,(RW1 r, IMM i))
|
||||
raw_shll_b_ri(r,i);
|
||||
unlock2(r);
|
||||
}
|
||||
MENDFUNC(2,shll_b_ri,(RW1 r, IMM i))
|
||||
|
||||
MIDFUNC(2,shrl_l_ri,(RW4 r, IMM i))
|
||||
{
|
||||
@ -521,7 +483,6 @@ MIDFUNC(2,shrl_l_ri,(RW4 r, IMM i))
|
||||
raw_shrl_l_ri(r,i);
|
||||
unlock2(r);
|
||||
}
|
||||
MENDFUNC(2,shrl_l_ri,(RW4 r, IMM i))
|
||||
|
||||
MIDFUNC(2,shrl_w_ri,(RW2 r, IMM i))
|
||||
{
|
||||
@ -532,7 +493,6 @@ MIDFUNC(2,shrl_w_ri,(RW2 r, IMM i))
|
||||
raw_shrl_w_ri(r,i);
|
||||
unlock2(r);
|
||||
}
|
||||
MENDFUNC(2,shrl_w_ri,(RW2 r, IMM i))
|
||||
|
||||
MIDFUNC(2,shrl_b_ri,(RW1 r, IMM i))
|
||||
{
|
||||
@ -543,7 +503,6 @@ MIDFUNC(2,shrl_b_ri,(RW1 r, IMM i))
|
||||
raw_shrl_b_ri(r,i);
|
||||
unlock2(r);
|
||||
}
|
||||
MENDFUNC(2,shrl_b_ri,(RW1 r, IMM i))
|
||||
|
||||
MIDFUNC(2,shra_l_ri,(RW4 r, IMM i))
|
||||
{
|
||||
@ -554,7 +513,6 @@ MIDFUNC(2,shra_l_ri,(RW4 r, IMM i))
|
||||
raw_shra_l_ri(r,i);
|
||||
unlock2(r);
|
||||
}
|
||||
MENDFUNC(2,shra_l_ri,(RW4 r, IMM i))
|
||||
|
||||
MIDFUNC(2,shra_w_ri,(RW2 r, IMM i))
|
||||
{
|
||||
@ -565,7 +523,6 @@ MIDFUNC(2,shra_w_ri,(RW2 r, IMM i))
|
||||
raw_shra_w_ri(r,i);
|
||||
unlock2(r);
|
||||
}
|
||||
MENDFUNC(2,shra_w_ri,(RW2 r, IMM i))
|
||||
|
||||
MIDFUNC(2,shra_b_ri,(RW1 r, IMM i))
|
||||
{
|
||||
@ -576,7 +533,6 @@ MIDFUNC(2,shra_b_ri,(RW1 r, IMM i))
|
||||
raw_shra_b_ri(r,i);
|
||||
unlock2(r);
|
||||
}
|
||||
MENDFUNC(2,shra_b_ri,(RW1 r, IMM i))
|
||||
|
||||
MIDFUNC(2,shra_l_rr,(RW4 d, RR1 r))
|
||||
{
|
||||
@ -591,7 +547,6 @@ MIDFUNC(2,shra_l_rr,(RW4 d, RR1 r))
|
||||
unlock2(r);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,shra_l_rr,(RW4 d, RR1 r))
|
||||
|
||||
MIDFUNC(2,shra_w_rr,(RW2 d, RR1 r))
|
||||
{ /* Can only do this with r==1, i.e. cl */
|
||||
@ -607,7 +562,6 @@ MIDFUNC(2,shra_w_rr,(RW2 d, RR1 r))
|
||||
unlock2(r);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,shra_w_rr,(RW2 d, RR1 r))
|
||||
|
||||
MIDFUNC(2,shra_b_rr,(RW1 d, RR1 r))
|
||||
{ /* Can only do this with r==1, i.e. cl */
|
||||
@ -624,7 +578,6 @@ MIDFUNC(2,shra_b_rr,(RW1 d, RR1 r))
|
||||
unlock2(r);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,shra_b_rr,(RW1 d, RR1 r))
|
||||
|
||||
MIDFUNC(2,setcc,(W1 d, IMM cc))
|
||||
{
|
||||
@ -633,14 +586,12 @@ MIDFUNC(2,setcc,(W1 d, IMM cc))
|
||||
raw_setcc(d,cc);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,setcc,(W1 d, IMM cc))
|
||||
|
||||
MIDFUNC(2,setcc_m,(IMM d, IMM cc))
|
||||
{
|
||||
CLOBBER_SETCC;
|
||||
raw_setcc_m(d,cc);
|
||||
}
|
||||
MENDFUNC(2,setcc_m,(IMM d, IMM cc))
|
||||
|
||||
MIDFUNC(3,cmov_l_rr,(RW4 d, RR4 s, IMM cc))
|
||||
{
|
||||
@ -653,7 +604,6 @@ MIDFUNC(3,cmov_l_rr,(RW4 d, RR4 s, IMM cc))
|
||||
unlock2(s);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(3,cmov_l_rr,(RW4 d, RR4 s, IMM cc))
|
||||
|
||||
MIDFUNC(2,bsf_l_rr,(W4 d, W4 s))
|
||||
{
|
||||
@ -664,7 +614,6 @@ MIDFUNC(2,bsf_l_rr,(W4 d, W4 s))
|
||||
unlock2(s);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,bsf_l_rr,(W4 d, W4 s))
|
||||
|
||||
/* Set the Z flag depending on the value in s. Note that the
|
||||
value has to be 0 or -1 (or, more precisely, for non-zero
|
||||
@ -678,7 +627,6 @@ MIDFUNC(2,simulate_bsf,(W4 tmp, RW4 s))
|
||||
unlock2(tmp);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,simulate_bsf,(W4 tmp, RW4 s))
|
||||
|
||||
MIDFUNC(2,imul_32_32,(RW4 d, RR4 s))
|
||||
{
|
||||
@ -689,7 +637,6 @@ MIDFUNC(2,imul_32_32,(RW4 d, RR4 s))
|
||||
unlock2(s);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,imul_32_32,(RW4 d, RR4 s))
|
||||
|
||||
MIDFUNC(2,imul_64_32,(RW4 d, RW4 s))
|
||||
{
|
||||
@ -700,7 +647,6 @@ MIDFUNC(2,imul_64_32,(RW4 d, RW4 s))
|
||||
unlock2(s);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,imul_64_32,(RW4 d, RW4 s))
|
||||
|
||||
MIDFUNC(2,mul_64_32,(RW4 d, RW4 s))
|
||||
{
|
||||
@ -711,7 +657,6 @@ MIDFUNC(2,mul_64_32,(RW4 d, RW4 s))
|
||||
unlock2(s);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,mul_64_32,(RW4 d, RW4 s))
|
||||
|
||||
MIDFUNC(2,sign_extend_16_rr,(W4 d, RR2 s))
|
||||
{
|
||||
@ -741,7 +686,6 @@ MIDFUNC(2,sign_extend_16_rr,(W4 d, RR2 s))
|
||||
unlock2(s);
|
||||
}
|
||||
}
|
||||
MENDFUNC(2,sign_extend_16_rr,(W4 d, RR2 s))
|
||||
|
||||
MIDFUNC(2,sign_extend_8_rr,(W4 d, RR1 s))
|
||||
{
|
||||
@ -773,7 +717,6 @@ MIDFUNC(2,sign_extend_8_rr,(W4 d, RR1 s))
|
||||
unlock2(s);
|
||||
}
|
||||
}
|
||||
MENDFUNC(2,sign_extend_8_rr,(W4 d, RR1 s))
|
||||
|
||||
MIDFUNC(2,zero_extend_16_rr,(W4 d, RR2 s))
|
||||
{
|
||||
@ -803,7 +746,6 @@ MIDFUNC(2,zero_extend_16_rr,(W4 d, RR2 s))
|
||||
unlock2(s);
|
||||
}
|
||||
}
|
||||
MENDFUNC(2,zero_extend_16_rr,(W4 d, RR2 s))
|
||||
|
||||
MIDFUNC(2,zero_extend_8_rr,(W4 d, RR1 s))
|
||||
{
|
||||
@ -834,7 +776,6 @@ MIDFUNC(2,zero_extend_8_rr,(W4 d, RR1 s))
|
||||
unlock2(s);
|
||||
}
|
||||
}
|
||||
MENDFUNC(2,zero_extend_8_rr,(W4 d, RR1 s))
|
||||
|
||||
MIDFUNC(2,mov_b_rr,(W1 d, RR1 s))
|
||||
{
|
||||
@ -852,7 +793,6 @@ MIDFUNC(2,mov_b_rr,(W1 d, RR1 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,mov_b_rr,(W1 d, RR1 s))
|
||||
|
||||
MIDFUNC(2,mov_w_rr,(W2 d, RR2 s))
|
||||
{
|
||||
@ -870,7 +810,6 @@ MIDFUNC(2,mov_w_rr,(W2 d, RR2 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,mov_w_rr,(W2 d, RR2 s))
|
||||
|
||||
/* read the long at the address contained in s+offset and store in d */
|
||||
MIDFUNC(3,mov_l_rR,(W4 d, RR4 s, IMM offset))
|
||||
@ -887,7 +826,6 @@ MIDFUNC(3,mov_l_rR,(W4 d, RR4 s, IMM offset))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(3,mov_l_rR,(W4 d, RR4 s, IMM offset))
|
||||
|
||||
/* read the word at the address contained in s+offset and store in d */
|
||||
MIDFUNC(3,mov_w_rR,(W2 d, RR4 s, IMM offset))
|
||||
@ -904,7 +842,6 @@ MIDFUNC(3,mov_w_rR,(W2 d, RR4 s, IMM offset))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(3,mov_w_rR,(W2 d, RR4 s, IMM offset))
|
||||
|
||||
/* read the long at the address contained in s+offset and store in d */
|
||||
MIDFUNC(3,mov_l_brR,(W4 d, RR4 s, IMM offset))
|
||||
@ -923,7 +860,6 @@ MIDFUNC(3,mov_l_brR,(W4 d, RR4 s, IMM offset))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(3,mov_l_brR,(W4 d, RR4 s, IMM offset))
|
||||
|
||||
/* read the word at the address contained in s+offset and store in d */
|
||||
MIDFUNC(3,mov_w_brR,(W2 d, RR4 s, IMM offset))
|
||||
@ -943,7 +879,6 @@ MIDFUNC(3,mov_w_brR,(W2 d, RR4 s, IMM offset))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(3,mov_w_brR,(W2 d, RR4 s, IMM offset))
|
||||
|
||||
/* read the word at the address contained in s+offset and store in d */
|
||||
MIDFUNC(3,mov_b_brR,(W1 d, RR4 s, IMM offset))
|
||||
@ -963,7 +898,6 @@ MIDFUNC(3,mov_b_brR,(W1 d, RR4 s, IMM offset))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(3,mov_b_brR,(W1 d, RR4 s, IMM offset))
|
||||
|
||||
MIDFUNC(3,mov_l_Ri,(RR4 d, IMM i, IMM offset))
|
||||
{
|
||||
@ -979,7 +913,6 @@ MIDFUNC(3,mov_l_Ri,(RR4 d, IMM i, IMM offset))
|
||||
raw_mov_l_Ri(d,i,offset);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(3,mov_l_Ri,(RR4 d, IMM i, IMM offset))
|
||||
|
||||
MIDFUNC(3,mov_w_Ri,(RR4 d, IMM i, IMM offset))
|
||||
{
|
||||
@ -995,7 +928,6 @@ MIDFUNC(3,mov_w_Ri,(RR4 d, IMM i, IMM offset))
|
||||
raw_mov_w_Ri(d,i,offset);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(3,mov_w_Ri,(RR4 d, IMM i, IMM offset))
|
||||
|
||||
/* Warning! OFFSET is byte sized only! */
|
||||
MIDFUNC(3,mov_l_Rr,(RR4 d, RR4 s, IMM offset))
|
||||
@ -1017,7 +949,6 @@ MIDFUNC(3,mov_l_Rr,(RR4 d, RR4 s, IMM offset))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(3,mov_l_Rr,(RR4 d, RR4 s, IMM offset))
|
||||
|
||||
MIDFUNC(3,mov_w_Rr,(RR4 d, RR2 s, IMM offset))
|
||||
{
|
||||
@ -1037,7 +968,6 @@ MIDFUNC(3,mov_w_Rr,(RR4 d, RR2 s, IMM offset))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(3,mov_w_Rr,(RR4 d, RR2 s, IMM offset))
|
||||
|
||||
MIDFUNC(3,lea_l_brr,(W4 d, RR4 s, IMM offset))
|
||||
{
|
||||
@ -1058,7 +988,6 @@ MIDFUNC(3,lea_l_brr,(W4 d, RR4 s, IMM offset))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(3,lea_l_brr,(W4 d, RR4 s, IMM offset))
|
||||
|
||||
MIDFUNC(5,lea_l_brr_indexed,(W4 d, RR4 s, RR4 index, IMM factor, IMM offset))
|
||||
{
|
||||
@ -1076,7 +1005,6 @@ MIDFUNC(5,lea_l_brr_indexed,(W4 d, RR4 s, RR4 index, IMM factor, IMM offset))
|
||||
unlock2(index);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(5,lea_l_brr_indexed,(W4 d, RR4 s, RR4 index, IMM factor, IMM offset))
|
||||
|
||||
MIDFUNC(4,lea_l_rr_indexed,(W4 d, RR4 s, RR4 index, IMM factor))
|
||||
{
|
||||
@ -1090,7 +1018,6 @@ MIDFUNC(4,lea_l_rr_indexed,(W4 d, RR4 s, RR4 index, IMM factor))
|
||||
unlock2(index);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(4,lea_l_rr_indexed,(W4 d, RR4 s, RR4 index, IMM factor))
|
||||
|
||||
/* write d to the long at the address contained in s+offset */
|
||||
MIDFUNC(3,mov_l_bRr,(RR4 d, RR4 s, IMM offset))
|
||||
@ -1110,7 +1037,6 @@ MIDFUNC(3,mov_l_bRr,(RR4 d, RR4 s, IMM offset))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(3,mov_l_bRr,(RR4 d, RR4 s, IMM offset))
|
||||
|
||||
/* write the word at the address contained in s+offset and store in d */
|
||||
MIDFUNC(3,mov_w_bRr,(RR4 d, RR2 s, IMM offset))
|
||||
@ -1130,7 +1056,6 @@ MIDFUNC(3,mov_w_bRr,(RR4 d, RR2 s, IMM offset))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(3,mov_w_bRr,(RR4 d, RR2 s, IMM offset))
|
||||
|
||||
MIDFUNC(3,mov_b_bRr,(RR4 d, RR1 s, IMM offset))
|
||||
{
|
||||
@ -1148,7 +1073,6 @@ MIDFUNC(3,mov_b_bRr,(RR4 d, RR1 s, IMM offset))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(3,mov_b_bRr,(RR4 d, RR1 s, IMM offset))
|
||||
|
||||
MIDFUNC(1,mid_bswap_32,(RW4 r))
|
||||
{
|
||||
@ -1164,7 +1088,6 @@ MIDFUNC(1,mid_bswap_32,(RW4 r))
|
||||
raw_bswap_32(r);
|
||||
unlock2(r);
|
||||
}
|
||||
MENDFUNC(1,mid_bswap_32,(RW4 r))
|
||||
|
||||
MIDFUNC(1,mid_bswap_16,(RW2 r))
|
||||
{
|
||||
@ -1181,7 +1104,6 @@ MIDFUNC(1,mid_bswap_16,(RW2 r))
|
||||
raw_bswap_16(r);
|
||||
unlock2(r);
|
||||
}
|
||||
MENDFUNC(1,mid_bswap_16,(RW2 r))
|
||||
|
||||
MIDFUNC(2,mov_l_rr,(W4 d, RR4 s))
|
||||
{
|
||||
@ -1210,7 +1132,6 @@ MIDFUNC(2,mov_l_rr,(W4 d, RR4 s))
|
||||
D2(panicbug("Added %d to nreg %d(%d), now holds %d regs", d,s,live.state[d].realind,live.nat[s].nholds));
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,mov_l_rr,(W4 d, RR4 s))
|
||||
|
||||
MIDFUNC(2,mov_l_mr,(IMM d, RR4 s))
|
||||
{
|
||||
@ -1224,7 +1145,6 @@ MIDFUNC(2,mov_l_mr,(IMM d, RR4 s))
|
||||
raw_mov_l_mr(d,s);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,mov_l_mr,(IMM d, RR4 s))
|
||||
|
||||
MIDFUNC(2,mov_w_mr,(IMM d, RR2 s))
|
||||
{
|
||||
@ -1238,7 +1158,6 @@ MIDFUNC(2,mov_w_mr,(IMM d, RR2 s))
|
||||
raw_mov_w_mr(d,s);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,mov_w_mr,(IMM d, RR2 s))
|
||||
|
||||
MIDFUNC(2,mov_w_rm,(W2 d, IMM s))
|
||||
{
|
||||
@ -1248,7 +1167,6 @@ MIDFUNC(2,mov_w_rm,(W2 d, IMM s))
|
||||
raw_mov_w_rm(d,s);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,mov_w_rm,(W2 d, IMM s))
|
||||
|
||||
MIDFUNC(2,mov_b_mr,(IMM d, RR1 s))
|
||||
{
|
||||
@ -1263,7 +1181,6 @@ MIDFUNC(2,mov_b_mr,(IMM d, RR1 s))
|
||||
raw_mov_b_mr(d,s);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,mov_b_mr,(IMM d, RR1 s))
|
||||
|
||||
MIDFUNC(2,mov_b_rm,(W1 d, IMM s))
|
||||
{
|
||||
@ -1273,14 +1190,12 @@ MIDFUNC(2,mov_b_rm,(W1 d, IMM s))
|
||||
raw_mov_b_rm(d,s);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,mov_b_rm,(W1 d, IMM s))
|
||||
|
||||
MIDFUNC(2,mov_l_ri,(W4 d, IMM s))
|
||||
{
|
||||
set_const(d,s);
|
||||
return;
|
||||
}
|
||||
MENDFUNC(2,mov_l_ri,(W4 d, IMM s))
|
||||
|
||||
MIDFUNC(2,mov_w_ri,(W2 d, IMM s))
|
||||
{
|
||||
@ -1290,7 +1205,6 @@ MIDFUNC(2,mov_w_ri,(W2 d, IMM s))
|
||||
raw_mov_w_ri(d,s);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,mov_w_ri,(W2 d, IMM s))
|
||||
|
||||
MIDFUNC(2,mov_b_ri,(W1 d, IMM s))
|
||||
{
|
||||
@ -1300,7 +1214,6 @@ MIDFUNC(2,mov_b_ri,(W1 d, IMM s))
|
||||
raw_mov_b_ri(d,s);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,mov_b_ri,(W1 d, IMM s))
|
||||
|
||||
MIDFUNC(2,test_l_ri,(RR4 d, IMM i))
|
||||
{
|
||||
@ -1310,7 +1223,6 @@ MIDFUNC(2,test_l_ri,(RR4 d, IMM i))
|
||||
raw_test_l_ri(d,i);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,test_l_ri,(RR4 d, IMM i))
|
||||
|
||||
MIDFUNC(2,test_l_rr,(RR4 d, RR4 s))
|
||||
{
|
||||
@ -1322,7 +1234,6 @@ MIDFUNC(2,test_l_rr,(RR4 d, RR4 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,test_l_rr,(RR4 d, RR4 s))
|
||||
|
||||
MIDFUNC(2,test_w_rr,(RR2 d, RR2 s))
|
||||
{
|
||||
@ -1334,7 +1245,6 @@ MIDFUNC(2,test_w_rr,(RR2 d, RR2 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,test_w_rr,(RR2 d, RR2 s))
|
||||
|
||||
MIDFUNC(2,test_b_rr,(RR1 d, RR1 s))
|
||||
{
|
||||
@ -1346,7 +1256,6 @@ MIDFUNC(2,test_b_rr,(RR1 d, RR1 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,test_b_rr,(RR1 d, RR1 s))
|
||||
|
||||
MIDFUNC(2,and_l_ri,(RW4 d, IMM i))
|
||||
{
|
||||
@ -1361,7 +1270,6 @@ MIDFUNC(2,and_l_ri,(RW4 d, IMM i))
|
||||
raw_and_l_ri(d,i);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,and_l_ri,(RW4 d, IMM i))
|
||||
|
||||
MIDFUNC(2,and_l,(RW4 d, RR4 s))
|
||||
{
|
||||
@ -1373,7 +1281,6 @@ MIDFUNC(2,and_l,(RW4 d, RR4 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,and_l,(RW4 d, RR4 s))
|
||||
|
||||
MIDFUNC(2,and_w,(RW2 d, RR2 s))
|
||||
{
|
||||
@ -1385,7 +1292,6 @@ MIDFUNC(2,and_w,(RW2 d, RR2 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,and_w,(RW2 d, RR2 s))
|
||||
|
||||
MIDFUNC(2,and_b,(RW1 d, RR1 s))
|
||||
{
|
||||
@ -1397,7 +1303,6 @@ MIDFUNC(2,and_b,(RW1 d, RR1 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,and_b,(RW1 d, RR1 s))
|
||||
|
||||
MIDFUNC(2,or_l_ri,(RW4 d, IMM i))
|
||||
{
|
||||
@ -1411,7 +1316,6 @@ MIDFUNC(2,or_l_ri,(RW4 d, IMM i))
|
||||
raw_or_l_ri(d,i);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,or_l_ri,(RW4 d, IMM i))
|
||||
|
||||
MIDFUNC(2,or_l,(RW4 d, RR4 s))
|
||||
{
|
||||
@ -1427,7 +1331,6 @@ MIDFUNC(2,or_l,(RW4 d, RR4 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,or_l,(RW4 d, RR4 s))
|
||||
|
||||
MIDFUNC(2,or_w,(RW2 d, RR2 s))
|
||||
{
|
||||
@ -1439,7 +1342,6 @@ MIDFUNC(2,or_w,(RW2 d, RR2 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,or_w,(RW2 d, RR2 s))
|
||||
|
||||
MIDFUNC(2,or_b,(RW1 d, RR1 s))
|
||||
{
|
||||
@ -1451,7 +1353,6 @@ MIDFUNC(2,or_b,(RW1 d, RR1 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,or_b,(RW1 d, RR1 s))
|
||||
|
||||
MIDFUNC(2,adc_l,(RW4 d, RR4 s))
|
||||
{
|
||||
@ -1464,7 +1365,6 @@ MIDFUNC(2,adc_l,(RW4 d, RR4 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,adc_l,(RW4 d, RR4 s))
|
||||
|
||||
MIDFUNC(2,adc_w,(RW2 d, RR2 s))
|
||||
{
|
||||
@ -1476,7 +1376,6 @@ MIDFUNC(2,adc_w,(RW2 d, RR2 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,adc_w,(RW2 d, RR2 s))
|
||||
|
||||
MIDFUNC(2,adc_b,(RW1 d, RR1 s))
|
||||
{
|
||||
@ -1488,7 +1387,6 @@ MIDFUNC(2,adc_b,(RW1 d, RR1 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,adc_b,(RW1 d, RR1 s))
|
||||
|
||||
MIDFUNC(2,add_l,(RW4 d, RR4 s))
|
||||
{
|
||||
@ -1506,7 +1404,6 @@ MIDFUNC(2,add_l,(RW4 d, RR4 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,add_l,(RW4 d, RR4 s))
|
||||
|
||||
MIDFUNC(2,add_w,(RW2 d, RR2 s))
|
||||
{
|
||||
@ -1523,7 +1420,6 @@ MIDFUNC(2,add_w,(RW2 d, RR2 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,add_w,(RW2 d, RR2 s))
|
||||
|
||||
MIDFUNC(2,add_b,(RW1 d, RR1 s))
|
||||
{
|
||||
@ -1540,7 +1436,6 @@ MIDFUNC(2,add_b,(RW1 d, RR1 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,add_b,(RW1 d, RR1 s))
|
||||
|
||||
MIDFUNC(2,sub_l_ri,(RW4 d, IMM i))
|
||||
{
|
||||
@ -1563,7 +1458,6 @@ MIDFUNC(2,sub_l_ri,(RW4 d, IMM i))
|
||||
raw_sub_l_ri(d,i);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,sub_l_ri,(RW4 d, IMM i))
|
||||
|
||||
MIDFUNC(2,sub_w_ri,(RW2 d, IMM i))
|
||||
{
|
||||
@ -1576,7 +1470,6 @@ MIDFUNC(2,sub_w_ri,(RW2 d, IMM i))
|
||||
raw_sub_w_ri(d,i);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,sub_w_ri,(RW2 d, IMM i))
|
||||
|
||||
MIDFUNC(2,sub_b_ri,(RW1 d, IMM i))
|
||||
{
|
||||
@ -1590,7 +1483,6 @@ MIDFUNC(2,sub_b_ri,(RW1 d, IMM i))
|
||||
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,sub_b_ri,(RW1 d, IMM i))
|
||||
|
||||
MIDFUNC(2,add_l_ri,(RW4 d, IMM i))
|
||||
{
|
||||
@ -1611,7 +1503,6 @@ MIDFUNC(2,add_l_ri,(RW4 d, IMM i))
|
||||
raw_add_l_ri(d,i);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,add_l_ri,(RW4 d, IMM i))
|
||||
|
||||
MIDFUNC(2,add_w_ri,(RW2 d, IMM i))
|
||||
{
|
||||
@ -1624,7 +1515,6 @@ MIDFUNC(2,add_w_ri,(RW2 d, IMM i))
|
||||
raw_add_w_ri(d,i);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,add_w_ri,(RW2 d, IMM i))
|
||||
|
||||
MIDFUNC(2,add_b_ri,(RW1 d, IMM i))
|
||||
{
|
||||
@ -1638,7 +1528,6 @@ MIDFUNC(2,add_b_ri,(RW1 d, IMM i))
|
||||
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,add_b_ri,(RW1 d, IMM i))
|
||||
|
||||
MIDFUNC(2,sbb_l,(RW4 d, RR4 s))
|
||||
{
|
||||
@ -1650,7 +1539,6 @@ MIDFUNC(2,sbb_l,(RW4 d, RR4 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,sbb_l,(RW4 d, RR4 s))
|
||||
|
||||
MIDFUNC(2,sbb_w,(RW2 d, RR2 s))
|
||||
{
|
||||
@ -1662,7 +1550,6 @@ MIDFUNC(2,sbb_w,(RW2 d, RR2 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,sbb_w,(RW2 d, RR2 s))
|
||||
|
||||
MIDFUNC(2,sbb_b,(RW1 d, RR1 s))
|
||||
{
|
||||
@ -1674,7 +1561,6 @@ MIDFUNC(2,sbb_b,(RW1 d, RR1 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,sbb_b,(RW1 d, RR1 s))
|
||||
|
||||
MIDFUNC(2,sub_l,(RW4 d, RR4 s))
|
||||
{
|
||||
@ -1691,7 +1577,6 @@ MIDFUNC(2,sub_l,(RW4 d, RR4 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,sub_l,(RW4 d, RR4 s))
|
||||
|
||||
MIDFUNC(2,sub_w,(RW2 d, RR2 s))
|
||||
{
|
||||
@ -1708,7 +1593,6 @@ MIDFUNC(2,sub_w,(RW2 d, RR2 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,sub_w,(RW2 d, RR2 s))
|
||||
|
||||
MIDFUNC(2,sub_b,(RW1 d, RR1 s))
|
||||
{
|
||||
@ -1725,7 +1609,6 @@ MIDFUNC(2,sub_b,(RW1 d, RR1 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,sub_b,(RW1 d, RR1 s))
|
||||
|
||||
MIDFUNC(2,cmp_l,(RR4 d, RR4 s))
|
||||
{
|
||||
@ -1737,7 +1620,6 @@ MIDFUNC(2,cmp_l,(RR4 d, RR4 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,cmp_l,(RR4 d, RR4 s))
|
||||
|
||||
MIDFUNC(2,cmp_w,(RR2 d, RR2 s))
|
||||
{
|
||||
@ -1749,7 +1631,6 @@ MIDFUNC(2,cmp_w,(RR2 d, RR2 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,cmp_w,(RR2 d, RR2 s))
|
||||
|
||||
MIDFUNC(2,cmp_b,(RR1 d, RR1 s))
|
||||
{
|
||||
@ -1761,7 +1642,6 @@ MIDFUNC(2,cmp_b,(RR1 d, RR1 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,cmp_b,(RR1 d, RR1 s))
|
||||
|
||||
MIDFUNC(2,xor_l,(RW4 d, RR4 s))
|
||||
{
|
||||
@ -1773,7 +1653,6 @@ MIDFUNC(2,xor_l,(RW4 d, RR4 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,xor_l,(RW4 d, RR4 s))
|
||||
|
||||
MIDFUNC(2,xor_w,(RW2 d, RR2 s))
|
||||
{
|
||||
@ -1785,7 +1664,6 @@ MIDFUNC(2,xor_w,(RW2 d, RR2 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,xor_w,(RW2 d, RR2 s))
|
||||
|
||||
MIDFUNC(2,xor_b,(RW1 d, RR1 s))
|
||||
{
|
||||
@ -1797,7 +1675,6 @@ MIDFUNC(2,xor_b,(RW1 d, RR1 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,xor_b,(RW1 d, RR1 s))
|
||||
|
||||
MIDFUNC(5,call_r_02,(RR4 r, RR4 in1, RR4 in2, IMM isize1, IMM isize2))
|
||||
{
|
||||
@ -1812,7 +1689,6 @@ MIDFUNC(5,call_r_02,(RR4 r, RR4 in1, RR4 in2, IMM isize1, IMM isize2))
|
||||
prepare_for_call_2();
|
||||
compemu_raw_call_r(r);
|
||||
}
|
||||
MENDFUNC(5,call_r_02,(RR4 r, RR4 in1, RR4 in2, IMM isize1, IMM isize2))
|
||||
|
||||
MIDFUNC(5,call_r_11,(W4 out1, RR4 r, RR4 in1, IMM osize, IMM isize))
|
||||
{
|
||||
@ -1849,13 +1725,11 @@ MIDFUNC(5,call_r_11,(W4 out1, RR4 r, RR4 in1, IMM osize, IMM isize))
|
||||
live.state[out1].dirtysize=osize;
|
||||
set_status(out1,DIRTY);
|
||||
}
|
||||
MENDFUNC(5,call_r_11,(W4 out1, RR4 r, RR4 in1, IMM osize, IMM isize))
|
||||
|
||||
MIDFUNC(0,nop,(void))
|
||||
{
|
||||
raw_emit_nop();
|
||||
}
|
||||
MENDFUNC(0,nop,(void))
|
||||
|
||||
/* forget_about() takes a mid-layer register */
|
||||
MIDFUNC(1,forget_about,(W4 r))
|
||||
@ -1865,7 +1739,6 @@ MIDFUNC(1,forget_about,(W4 r))
|
||||
live.state[r].val=0;
|
||||
set_status(r,UNDEF);
|
||||
}
|
||||
MENDFUNC(1,forget_about,(W4 r))
|
||||
|
||||
MIDFUNC(1,f_forget_about,(FW r))
|
||||
{
|
||||
@ -1873,7 +1746,6 @@ MIDFUNC(1,f_forget_about,(FW r))
|
||||
f_disassociate(r);
|
||||
live.fate[r].status=UNDEF;
|
||||
}
|
||||
MENDFUNC(1,f_forget_about,(FW r))
|
||||
|
||||
// ARM optimized functions
|
||||
|
||||
@ -1892,7 +1764,6 @@ MIDFUNC(2,arm_ADD_l,(RW4 d, RR4 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,arm_ADD_l,(RW4 d, RR4 s))
|
||||
|
||||
MIDFUNC(2,arm_ADD_l_ri,(RW4 d, IMM i))
|
||||
{
|
||||
@ -1911,7 +1782,6 @@ MIDFUNC(2,arm_ADD_l_ri,(RW4 d, IMM i))
|
||||
raw_ADD_l_rr(d,REG_WORK1);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,arm_ADD_l_ri,(RW4 d, IMM i))
|
||||
|
||||
MIDFUNC(2,arm_ADD_l_ri8,(RW4 d, IMM i))
|
||||
{
|
||||
@ -1929,7 +1799,6 @@ MIDFUNC(2,arm_ADD_l_ri8,(RW4 d, IMM i))
|
||||
raw_ADD_l_rri(d,d,i);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,arm_ADD_l_ri8,(RW4 d, IMM i))
|
||||
|
||||
MIDFUNC(2,arm_SUB_l_ri8,(RW4 d, IMM i))
|
||||
{
|
||||
@ -1947,7 +1816,6 @@ MIDFUNC(2,arm_SUB_l_ri8,(RW4 d, IMM i))
|
||||
raw_SUB_l_rri(d,d,i);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,arm_ADD_l_ri8,(RW4 d, IMM i))
|
||||
|
||||
MIDFUNC(2,arm_AND_l,(RW4 d, RR4 s))
|
||||
{
|
||||
@ -1958,7 +1826,6 @@ MIDFUNC(2,arm_AND_l,(RW4 d, RR4 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,arm_AND_l,(RW4 d, RR4 s))
|
||||
|
||||
MIDFUNC(2,arm_AND_w,(RW2 d, RR2 s))
|
||||
{
|
||||
@ -1969,7 +1836,6 @@ MIDFUNC(2,arm_AND_w,(RW2 d, RR2 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,arm_AND_w,(RW2 d, RR2 s))
|
||||
|
||||
MIDFUNC(2,arm_AND_b,(RW1 d, RR1 s))
|
||||
{
|
||||
@ -1980,7 +1846,6 @@ MIDFUNC(2,arm_AND_b,(RW1 d, RR1 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,arm_AND_b,(RW1 d, RR1 s))
|
||||
|
||||
MIDFUNC(2,arm_AND_l_ri8,(RW4 d, IMM i))
|
||||
{
|
||||
@ -1994,7 +1859,6 @@ MIDFUNC(2,arm_AND_l_ri8,(RW4 d, IMM i))
|
||||
raw_AND_l_ri(d,i);
|
||||
unlock2(d);
|
||||
}
|
||||
MENDFUNC(2,arm_AND_l_ri8,(RW4 d, IMM i))
|
||||
|
||||
MIDFUNC(2,arm_EOR_b,(RW1 d, RR1 s))
|
||||
{
|
||||
@ -2005,7 +1869,6 @@ MIDFUNC(2,arm_EOR_b,(RW1 d, RR1 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,arm_EOR_b,(RW1 d, RR1 s))
|
||||
|
||||
MIDFUNC(2,arm_EOR_l,(RW4 d, RR4 s))
|
||||
{
|
||||
@ -2016,7 +1879,6 @@ MIDFUNC(2,arm_EOR_l,(RW4 d, RR4 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,arm_EOR_l,(RW4 d, RR4 s))
|
||||
|
||||
MIDFUNC(2,arm_EOR_w,(RW2 d, RR2 s))
|
||||
{
|
||||
@ -2027,7 +1889,6 @@ MIDFUNC(2,arm_EOR_w,(RW2 d, RR2 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,arm_EOR_w,(RW2 d, RR2 s))
|
||||
|
||||
MIDFUNC(2,arm_ORR_b,(RW1 d, RR1 s))
|
||||
{
|
||||
@ -2038,7 +1899,6 @@ MIDFUNC(2,arm_ORR_b,(RW1 d, RR1 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,arm_ORR_b,(RW1 d, RR1 s))
|
||||
|
||||
MIDFUNC(2,arm_ORR_l,(RW4 d, RR4 s))
|
||||
{
|
||||
@ -2053,7 +1913,6 @@ MIDFUNC(2,arm_ORR_l,(RW4 d, RR4 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,arm_ORR_l,(RW4 d, RR4 s))
|
||||
|
||||
MIDFUNC(2,arm_ORR_w,(RW2 d, RR2 s))
|
||||
{
|
||||
@ -2064,7 +1923,6 @@ MIDFUNC(2,arm_ORR_w,(RW2 d, RR2 s))
|
||||
unlock2(d);
|
||||
unlock2(s);
|
||||
}
|
||||
MENDFUNC(2,arm_ORR_w,(RW2 d, RR2 s))
|
||||
|
||||
MIDFUNC(2,arm_ROR_l_ri8,(RW4 r, IMM i))
|
||||
{
|
||||
@ -2075,7 +1933,6 @@ MIDFUNC(2,arm_ROR_l_ri8,(RW4 r, IMM i))
|
||||
raw_ROR_l_ri(r,i);
|
||||
unlock2(r);
|
||||
}
|
||||
MENDFUNC(2,arm_ROR_l_ri8,(RW4 r, IMM i))
|
||||
|
||||
// Other
|
||||
static inline void flush_cpu_icache(void *start, void *stop)
|
||||
|
@ -64,6 +64,7 @@ DECLARE_MIDFUNC(rol_w_ri(RW2 r, IMM i));
|
||||
DECLARE_MIDFUNC(rol_l_rr(RW4 d, RR1 r));
|
||||
DECLARE_MIDFUNC(rol_w_rr(RW2 d, RR1 r));
|
||||
DECLARE_MIDFUNC(rol_b_rr(RW1 d, RR1 r));
|
||||
DECLARE_MIDFUNC(rol_l_ri(RW4 r, IMM i));
|
||||
DECLARE_MIDFUNC(shll_l_rr(RW4 d, RR1 r));
|
||||
DECLARE_MIDFUNC(shll_w_rr(RW2 d, RR1 r));
|
||||
DECLARE_MIDFUNC(shll_b_rr(RW1 d, RR1 r));
|
||||
@ -98,6 +99,7 @@ DECLARE_MIDFUNC(sign_extend_16_rr(W4 d, RR2 s));
|
||||
DECLARE_MIDFUNC(sign_extend_8_rr(W4 d, RR1 s));
|
||||
DECLARE_MIDFUNC(zero_extend_16_rr(W4 d, RR2 s));
|
||||
DECLARE_MIDFUNC(zero_extend_8_rr(W4 d, RR1 s));
|
||||
DECLARE_MIDFUNC(simulate_bsf(W4 tmp, RW4 s));
|
||||
DECLARE_MIDFUNC(imul_64_32(RW4 d, RW4 s));
|
||||
DECLARE_MIDFUNC(mul_64_32(RW4 d, RW4 s));
|
||||
DECLARE_MIDFUNC(imul_32_32(RW4 d, RR4 s));
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -185,6 +185,7 @@ DECLARE_MIDFUNC(xor_b(RW1 d, RR1 s));
|
||||
DECLARE_MIDFUNC(live_flags(void));
|
||||
DECLARE_MIDFUNC(dont_care_flags(void));
|
||||
DECLARE_MIDFUNC(duplicate_carry(void));
|
||||
DECLARE_MIDFUNC(setcc_for_cntzero(RR4 d, RR4 data, int size));
|
||||
DECLARE_MIDFUNC(restore_carry(void));
|
||||
DECLARE_MIDFUNC(start_needflags(void));
|
||||
DECLARE_MIDFUNC(end_needflags(void));
|
||||
@ -201,17 +202,17 @@ DECLARE_MIDFUNC(fmov_log2_e(FW r));
|
||||
DECLARE_MIDFUNC(fmov_loge_2(FW r));
|
||||
DECLARE_MIDFUNC(fmov_1(FW r));
|
||||
DECLARE_MIDFUNC(fmov_0(FW r));
|
||||
DECLARE_MIDFUNC(fmov_rm(FW r, MEMR m));
|
||||
DECLARE_MIDFUNC(fmov_mr(MEMW m, FR r));
|
||||
DECLARE_MIDFUNC(fmovi_rm(FW r, MEMR m));
|
||||
DECLARE_MIDFUNC(fmovi_mr(MEMW m, FR r));
|
||||
DECLARE_MIDFUNC(fmovi_mrb(MEMW m, FR r, double *bounds));
|
||||
DECLARE_MIDFUNC(fmovs_rm(FW r, MEMR m));
|
||||
DECLARE_MIDFUNC(fmovs_mr(MEMW m, FR r));
|
||||
DECLARE_MIDFUNC(fmov_rm(FW r, MEMPTRR m));
|
||||
DECLARE_MIDFUNC(fmov_mr(MEMPTRW m, FR r));
|
||||
DECLARE_MIDFUNC(fmovi_rm(FW r, MEMPTRR m));
|
||||
DECLARE_MIDFUNC(fmovi_mr(MEMPTRW m, FR r));
|
||||
DECLARE_MIDFUNC(fmovi_mrb(MEMPTRW m, FR r, double *bounds));
|
||||
DECLARE_MIDFUNC(fmovs_rm(FW r, MEMPTRR m));
|
||||
DECLARE_MIDFUNC(fmovs_mr(MEMPTRW m, FR r));
|
||||
DECLARE_MIDFUNC(fcuts_r(FRW r));
|
||||
DECLARE_MIDFUNC(fcut_r(FRW r));
|
||||
DECLARE_MIDFUNC(fmov_ext_mr(MEMW m, FR r));
|
||||
DECLARE_MIDFUNC(fmov_ext_rm(FW r, MEMR m));
|
||||
DECLARE_MIDFUNC(fmov_ext_mr(MEMPTRW m, FR r));
|
||||
DECLARE_MIDFUNC(fmov_ext_rm(FW r, MEMPTRR m));
|
||||
DECLARE_MIDFUNC(fmov_rr(FW d, FR s));
|
||||
DECLARE_MIDFUNC(fldcw_m_indexed(RR4 index, IMM base));
|
||||
DECLARE_MIDFUNC(ftst_r(FR r));
|
||||
|
@ -43,12 +43,6 @@
|
||||
#error "Only [LS]AHF scheme to [gs]et flags is supported with the JIT Compiler"
|
||||
#endif
|
||||
|
||||
//TODO: detect i386 and arm platforms
|
||||
|
||||
#ifdef __x86_64__
|
||||
#define CPU_x86_64 1
|
||||
#endif
|
||||
|
||||
/* NOTE: support for AMD64 assumes translation cache and other code
|
||||
* buffers are allocated into a 32-bit address space because (i) B2/JIT
|
||||
* code is not 64-bit clean and (ii) it's faster to resolve branches
|
||||
@ -72,7 +66,7 @@
|
||||
#ifdef UAE
|
||||
#include "options.h"
|
||||
#include "events.h"
|
||||
#include "memory.h"
|
||||
#include "uae/memory.h"
|
||||
#include "custom.h"
|
||||
#else
|
||||
#include "cpu_emulation.h"
|
||||
@ -88,11 +82,15 @@
|
||||
#include "comptbl.h"
|
||||
#ifdef UAE
|
||||
#include "compemu.h"
|
||||
#ifdef FSUAE
|
||||
#include "codegen_udis86.h"
|
||||
#endif
|
||||
#else
|
||||
#include "compiler/compemu.h"
|
||||
#include "fpu/fpu.h"
|
||||
#include "fpu/flags.h"
|
||||
// #include "parameters.h"
|
||||
static void build_comp(void);
|
||||
#endif
|
||||
// #include "verify.h"
|
||||
|
||||
@ -100,10 +98,16 @@
|
||||
// uae_log("JIT: " format "\n", ##__VA_ARGS__);
|
||||
#define D2 D
|
||||
|
||||
|
||||
#ifdef UAE
|
||||
#ifdef FSUAE
|
||||
#include "uae/fs.h"
|
||||
#endif
|
||||
#include "uae/log.h"
|
||||
|
||||
#if defined(__pie__) || defined (__PIE__)
|
||||
#error Position-independent code (PIE) cannot be used with JIT
|
||||
#endif
|
||||
|
||||
#include "uae/vm.h"
|
||||
#define VM_PAGE_READ UAE_VM_READ
|
||||
#define VM_PAGE_WRITE UAE_VM_WRITE
|
||||
@ -149,6 +153,15 @@ static inline int distrust_check(int value)
|
||||
return 1;
|
||||
#else
|
||||
int distrust = value;
|
||||
#ifdef FSUAE
|
||||
switch (value) {
|
||||
case 0: distrust = 0; break;
|
||||
case 1: distrust = 1; break;
|
||||
case 2: distrust = ((start_pc & 0xF80000) == 0xF80000); break;
|
||||
case 3: distrust = !have_done_picasso; break;
|
||||
default: abort();
|
||||
}
|
||||
#endif
|
||||
return distrust;
|
||||
#endif
|
||||
}
|
||||
@ -237,7 +250,7 @@ static clock_t emul_end_time = 0;
|
||||
#endif
|
||||
|
||||
#ifdef PROFILE_UNTRANSLATED_INSNS
|
||||
static const int untranslated_top_ten = 20;
|
||||
static const int untranslated_top_ten = 50;
|
||||
static uae_u32 raw_cputbl_count[65536] = { 0, };
|
||||
static uae_u16 opcode_nums[65536];
|
||||
|
||||
@ -266,8 +279,10 @@ extern bool quit_program;
|
||||
// gb-- Extra data for Basilisk II/JIT
|
||||
#ifdef JIT_DEBUG
|
||||
static bool JITDebug = false; // Enable runtime disassemblers through mon?
|
||||
// #define JITDebug bx_options.jit.jitdebug // Enable runtime disassemblers through mon?
|
||||
#else
|
||||
const bool JITDebug = false;
|
||||
// #define JITDebug false // Don't use JIT debug mode at all
|
||||
#endif
|
||||
#if USE_INLINING
|
||||
#ifdef UAE
|
||||
@ -283,6 +298,7 @@ const uae_u32 MIN_CACHE_SIZE = 1024; // Minimal translation cache size (1 MB)
|
||||
static uae_u32 cache_size = 0; // Size of total cache allocated for compiled blocks
|
||||
static uae_u32 current_cache_size = 0; // Cache grows upwards: how much has been consumed already
|
||||
static bool lazy_flush = true; // Flag: lazy translation cache invalidation
|
||||
// Flag: compile FPU instructions ?
|
||||
#ifdef UAE
|
||||
#ifdef USE_JIT_FPU
|
||||
#define avoid_fpu (!currprefs.compfpu)
|
||||
@ -291,6 +307,11 @@ static bool lazy_flush = true; // Flag: lazy translation cache invalidation
|
||||
#endif
|
||||
#else
|
||||
static bool avoid_fpu = true; // Flag: compile FPU instructions ?
|
||||
// #ifdef USE_JIT_FPU
|
||||
// #define avoid_fpu (!bx_options.jit.jitfpu)
|
||||
// #else
|
||||
// #define avoid_fpu (true)
|
||||
// #endif
|
||||
#endif
|
||||
static bool have_cmov = false; // target has CMOV instructions ?
|
||||
static bool have_rat_stall = true; // target has partial register stalls ?
|
||||
@ -370,10 +391,9 @@ static uintptr taken_pc_p;
|
||||
static int branch_cc;
|
||||
static int redo_current_block;
|
||||
|
||||
#ifdef UAE
|
||||
int segvcount=0;
|
||||
int soft_flush_count=0;
|
||||
int hard_flush_count=0;
|
||||
int checksum_count=0;
|
||||
#endif
|
||||
static uae_u8* current_compile_p=NULL;
|
||||
static uae_u8* max_compile_start;
|
||||
static uae_u8* compiled_code=NULL;
|
||||
@ -395,7 +415,7 @@ static void* popall_check_checksum=NULL;
|
||||
* lists that we maintain for each hash result.
|
||||
*/
|
||||
static cacheline cache_tags[TAGSIZE];
|
||||
int letit=0;
|
||||
static int cache_enabled=0;
|
||||
static blockinfo* hold_bi[MAX_HOLD_BI];
|
||||
static blockinfo* active;
|
||||
static blockinfo* dormant;
|
||||
@ -420,12 +440,10 @@ extern const struct cputbl op_smalltbl_4_nf[];
|
||||
extern const struct cputbl op_smalltbl_5_nf[];
|
||||
#endif
|
||||
|
||||
#ifdef WINUAE_ARANYM
|
||||
static void flush_icache_hard(int n);
|
||||
static void flush_icache_lazy(int n);
|
||||
static void flush_icache_none(int n);
|
||||
void (*flush_icache)(int n) = flush_icache_none;
|
||||
#endif
|
||||
static void flush_icache_hard(void);
|
||||
static void flush_icache_lazy(void);
|
||||
static void flush_icache_none(void);
|
||||
void (*flush_icache)(void) = flush_icache_none;
|
||||
|
||||
static bigstate live;
|
||||
static smallstate empty_ss;
|
||||
@ -452,7 +470,7 @@ uae_u32 m68k_pc_offset;
|
||||
* side effects they would have on the flags are not important. This
|
||||
* variable indicates whether we need the side effects or not
|
||||
*/
|
||||
uae_u32 needflags=0;
|
||||
static uae_u32 needflags=0;
|
||||
|
||||
/* Flag handling is complicated.
|
||||
*
|
||||
@ -500,7 +518,7 @@ static inline blockinfo* get_blockinfo_addr(void* addr)
|
||||
/*******************************************************************
|
||||
* Disassembler support *
|
||||
*******************************************************************/
|
||||
|
||||
|
||||
#define TARGET_M68K 0
|
||||
#define TARGET_POWERPC 1
|
||||
#define TARGET_X86 2
|
||||
@ -531,11 +549,11 @@ static void disasm_block(int disasm_target, const uint8 *start, size_t length)
|
||||
#if defined(HAVE_DISASM_M68K)
|
||||
{
|
||||
char buf[256];
|
||||
|
||||
|
||||
disasm_info.memory_vma = ((memptr)((uintptr_t)(start) - MEMBaseDiff));
|
||||
while (length > 0)
|
||||
{
|
||||
int isize = m68k_disasm_to_buf(&disasm_info, buf);
|
||||
int isize = m68k_disasm_to_buf(&disasm_info, buf, 1);
|
||||
bug("%s", buf);
|
||||
if (isize < 0)
|
||||
break;
|
||||
@ -552,10 +570,10 @@ static void disasm_block(int disasm_target, const uint8 *start, size_t length)
|
||||
{
|
||||
const uint8 *end = start + length;
|
||||
char buf[256];
|
||||
|
||||
|
||||
while (start < end)
|
||||
{
|
||||
start = x86_disasm(start, buf);
|
||||
start = x86_disasm(start, buf, 1);
|
||||
bug("%s", buf);
|
||||
}
|
||||
}
|
||||
@ -566,10 +584,10 @@ static void disasm_block(int disasm_target, const uint8 *start, size_t length)
|
||||
{
|
||||
const uint8 *end = start + length;
|
||||
char buf[256];
|
||||
|
||||
|
||||
while (start < end)
|
||||
{
|
||||
start = arm_disasm(start, buf);
|
||||
start = arm_disasm(start, buf, 1);
|
||||
bug("%s", buf);
|
||||
}
|
||||
}
|
||||
@ -2640,8 +2658,10 @@ static scratch_t scratch;
|
||||
* Support functions exposed to newcpu *
|
||||
********************************************************************/
|
||||
|
||||
#define str_on_off(b) b ? "on" : "off"
|
||||
|
||||
static inline const char *str_on_off(bool b)
|
||||
{
|
||||
return b ? "on" : "off";
|
||||
}
|
||||
|
||||
#ifdef UAE
|
||||
static
|
||||
@ -2673,8 +2693,6 @@ void compiler_init(void)
|
||||
cache_size = PrefsFindInt32("jitcachesize");
|
||||
jit_log("<JIT compiler> : requested translation cache size : %d KB", cache_size);
|
||||
|
||||
// Initialize target CPU (check for features, e.g. CMOV, rat stalls)
|
||||
raw_init_cpu();
|
||||
setzflg_uses_bsf = target_check_bsf();
|
||||
jit_log("<JIT compiler> : target processor has CMOV instructions : %s", have_cmov ? "yes" : "no");
|
||||
jit_log("<JIT compiler> : target processor can suffer from partial register stalls : %s", have_rat_stall ? "yes" : "no");
|
||||
@ -2700,6 +2718,8 @@ void compiler_init(void)
|
||||
jit_log("<JIT compiler> : separate blockinfo allocation : %s", str_on_off(USE_SEPARATE_BIA));
|
||||
|
||||
// Build compiler tables
|
||||
read_table68k();
|
||||
do_merges();
|
||||
build_comp();
|
||||
#endif
|
||||
|
||||
@ -2728,7 +2748,7 @@ void compiler_exit(void)
|
||||
#else
|
||||
#if DEBUG
|
||||
#if defined(USE_DATA_BUFFER)
|
||||
jit_log("data_wasted = %d bytes", data_wasted);
|
||||
jit_log("data_wasted = %ld bytes", data_wasted);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@ -2759,7 +2779,7 @@ void compiler_exit(void)
|
||||
opcode_nums[i] = i;
|
||||
untranslated_count += raw_cputbl_count[i];
|
||||
}
|
||||
jit_log("Sorting out untranslated instructions count...");
|
||||
bug("Sorting out untranslated instructions count...");
|
||||
qsort(opcode_nums, 65536, sizeof(uae_u16), untranslated_compfn);
|
||||
jit_log("Rank Opc Count Name");
|
||||
for (int i = 0; i < untranslated_top_ten; i++) {
|
||||
@ -2771,7 +2791,7 @@ void compiler_exit(void)
|
||||
dp = table68k + opcode_nums[i];
|
||||
for (lookup = lookuptab; lookup->mnemo != (instrmnem)dp->mnemo; lookup++)
|
||||
;
|
||||
jit_log("%03d: %04x %10u %s", i, opcode_nums[i], count, lookup->name);
|
||||
bug("%03d: %04x %10u %s", i, opcode_nums[i], count, lookup->name);
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -2793,6 +2813,8 @@ void compiler_exit(void)
|
||||
100.0*double(cum_reg_count)/double(tot_reg_count));
|
||||
}
|
||||
#endif
|
||||
|
||||
// exit_table68k();
|
||||
}
|
||||
|
||||
#ifdef UAE
|
||||
@ -2813,7 +2835,7 @@ bool compiler_use_jit(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
void init_comp(void)
|
||||
static void init_comp(void)
|
||||
{
|
||||
int i;
|
||||
uae_s8* cb=can_byte;
|
||||
@ -3015,14 +3037,18 @@ static void flush_keepflags(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
void freescratch(void)
|
||||
static void freescratch(void)
|
||||
{
|
||||
int i;
|
||||
for (i=0;i<N_REGS;i++)
|
||||
#if defined(CPU_arm)
|
||||
if (live.nat[i].locked && i != REG_WORK1 && i != REG_WORK2)
|
||||
#else
|
||||
if (live.nat[i].locked && i!=ESP_INDEX)
|
||||
if (live.nat[i].locked && i != ESP_INDEX
|
||||
#if defined(UAE) && defined(CPU_x86_64)
|
||||
&& i != R12_INDEX
|
||||
#endif
|
||||
)
|
||||
#endif
|
||||
{
|
||||
jit_log("Warning! %d is locked",i);
|
||||
@ -3479,14 +3505,14 @@ void calc_disp_ea_020(int base, uae_u32 dp, int target, int tmp)
|
||||
|
||||
void set_cache_state(int enabled)
|
||||
{
|
||||
if (enabled!=letit)
|
||||
flush_icache_hard(77);
|
||||
letit=enabled;
|
||||
if (enabled!=cache_enabled)
|
||||
flush_icache_hard();
|
||||
cache_enabled=enabled;
|
||||
}
|
||||
|
||||
int get_cache_state(void)
|
||||
{
|
||||
return letit;
|
||||
return cache_enabled;
|
||||
}
|
||||
|
||||
uae_u32 get_jitted_size(void)
|
||||
@ -3498,54 +3524,9 @@ uae_u32 get_jitted_size(void)
|
||||
|
||||
static uint8 *do_alloc_code(uint32 size, int depth)
|
||||
{
|
||||
#if defined(__linux__) && 0
|
||||
/*
|
||||
This is a really awful hack that is known to work on Linux at
|
||||
least.
|
||||
|
||||
The trick here is to make sure the allocated cache is nearby
|
||||
code segment, and more precisely in the positive half of a
|
||||
32-bit address space. i.e. addr < 0x80000000. Actually, it
|
||||
turned out that a 32-bit binary run on AMD64 yields a cache
|
||||
allocated around 0xa0000000, thus causing some troubles when
|
||||
translating addresses from m68k to x86.
|
||||
*/
|
||||
const int CODE_ALLOC_MAX_ATTEMPTS = 10;
|
||||
const int CODE_ALLOC_BOUNDARIES = 128 * 1024; // 128 KB
|
||||
|
||||
static uint8 * code_base = NULL;
|
||||
if (code_base == NULL) {
|
||||
uintptr page_size = getpagesize();
|
||||
uintptr boundaries = CODE_ALLOC_BOUNDARIES;
|
||||
if (boundaries < page_size)
|
||||
boundaries = page_size;
|
||||
code_base = (uint8 *)sbrk(0);
|
||||
for (int attempts = 0; attempts < CODE_ALLOC_MAX_ATTEMPTS; attempts++) {
|
||||
if (vm_acquire_fixed(code_base, size) == 0) {
|
||||
uint8 *code = code_base;
|
||||
code_base += size;
|
||||
return code;
|
||||
}
|
||||
code_base += boundaries;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (vm_acquire_fixed(code_base, size) == 0) {
|
||||
uint8 *code = code_base;
|
||||
code_base += size;
|
||||
return code;
|
||||
}
|
||||
|
||||
if (depth >= CODE_ALLOC_MAX_ATTEMPTS)
|
||||
return NULL;
|
||||
|
||||
return do_alloc_code(size, depth + 1);
|
||||
#else
|
||||
UNUSED(depth);
|
||||
uint8 *code = (uint8 *)vm_acquire(size, VM_MAP_DEFAULT | VM_MAP_32BIT);
|
||||
return code == VM_MAP_FAILED ? NULL : code;
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline uint8 *alloc_code(uint32 size)
|
||||
@ -3559,7 +3540,7 @@ static inline uint8 *alloc_code(uint32 size)
|
||||
void alloc_cache(void)
|
||||
{
|
||||
if (compiled_code) {
|
||||
flush_icache_hard(6);
|
||||
flush_icache_hard();
|
||||
vm_release(compiled_code, cache_size * 1024);
|
||||
compiled_code = 0;
|
||||
}
|
||||
@ -3719,8 +3700,6 @@ static inline int block_check_checksum(blockinfo* bi)
|
||||
if (bi->status!=BI_NEED_CHECK)
|
||||
return 1; /* This block is in a checked state */
|
||||
|
||||
checksum_count++;
|
||||
|
||||
if (bi->c1 || bi->c2)
|
||||
calc_checksum(bi,&c1,&c2);
|
||||
else {
|
||||
@ -3885,7 +3864,10 @@ static inline void create_popalls(void)
|
||||
r=REG_PC_TMP;
|
||||
compemu_raw_mov_l_rm(r, uae_p32(®s.pc_p));
|
||||
compemu_raw_and_l_ri(r,TAGMASK);
|
||||
assert(sizeof(cache_tags[0]) == sizeof(void *));
|
||||
{
|
||||
assert(sizeof(cache_tags[0]) == sizeof(void *));
|
||||
// verify(sizeof(cache_tags[0]) == sizeof(void *));
|
||||
}
|
||||
compemu_raw_jmp_m_indexed(uae_p32(cache_tags), r, sizeof(void *));
|
||||
|
||||
/* now the exit points */
|
||||
@ -4020,12 +4002,98 @@ static int read_opcode(const char *p)
|
||||
return opcode;
|
||||
}
|
||||
|
||||
|
||||
#ifdef USE_JIT_FPU
|
||||
static struct {
|
||||
const char *name;
|
||||
bool *const disabled;
|
||||
} const jit_opcodes[] = {
|
||||
{ "fbcc", &jit_disable.fbcc },
|
||||
{ "fdbcc", &jit_disable.fdbcc },
|
||||
{ "fscc", &jit_disable.fscc },
|
||||
{ "ftrapcc", &jit_disable.ftrapcc },
|
||||
{ "fsave", &jit_disable.fsave },
|
||||
{ "frestore", &jit_disable.frestore },
|
||||
{ "fmove", &jit_disable.fmove },
|
||||
{ "fmovec", &jit_disable.fmovec },
|
||||
{ "fmovem", &jit_disable.fmovem },
|
||||
{ "fmovecr", &jit_disable.fmovecr },
|
||||
{ "fint", &jit_disable.fint },
|
||||
{ "fsinh", &jit_disable.fsinh },
|
||||
{ "fintrz", &jit_disable.fintrz },
|
||||
{ "fsqrt", &jit_disable.fsqrt },
|
||||
{ "flognp1", &jit_disable.flognp1 },
|
||||
{ "fetoxm1", &jit_disable.fetoxm1 },
|
||||
{ "ftanh", &jit_disable.ftanh },
|
||||
{ "fatan", &jit_disable.fatan },
|
||||
{ "fasin", &jit_disable.fasin },
|
||||
{ "fatanh", &jit_disable.fatanh },
|
||||
{ "fsin", &jit_disable.fsin },
|
||||
{ "ftan", &jit_disable.ftan },
|
||||
{ "fetox", &jit_disable.fetox },
|
||||
{ "ftwotox", &jit_disable.ftwotox },
|
||||
{ "ftentox", &jit_disable.ftentox },
|
||||
{ "flogn", &jit_disable.flogn },
|
||||
{ "flog10", &jit_disable.flog10 },
|
||||
{ "flog2", &jit_disable.flog2 },
|
||||
{ "fabs", &jit_disable.fabs },
|
||||
{ "fcosh", &jit_disable.fcosh },
|
||||
{ "fneg", &jit_disable.fneg },
|
||||
{ "facos", &jit_disable.facos },
|
||||
{ "fcos", &jit_disable.fcos },
|
||||
{ "fgetexp", &jit_disable.fgetexp },
|
||||
{ "fgetman", &jit_disable.fgetman },
|
||||
{ "fdiv", &jit_disable.fdiv },
|
||||
{ "fmod", &jit_disable.fmod },
|
||||
{ "fadd", &jit_disable.fadd },
|
||||
{ "fmul", &jit_disable.fmul },
|
||||
{ "fsgldiv", &jit_disable.fsgldiv },
|
||||
{ "frem", &jit_disable.frem },
|
||||
{ "fscale", &jit_disable.fscale },
|
||||
{ "fsglmul", &jit_disable.fsglmul },
|
||||
{ "fsub", &jit_disable.fsub },
|
||||
{ "fsincos", &jit_disable.fsincos },
|
||||
{ "fcmp", &jit_disable.fcmp },
|
||||
{ "ftst", &jit_disable.ftst },
|
||||
};
|
||||
|
||||
static bool read_fpu_opcode(const char **pp)
|
||||
{
|
||||
const char *p = *pp;
|
||||
const char *end;
|
||||
size_t len;
|
||||
unsigned int i;
|
||||
|
||||
end = p;
|
||||
while (*end != '\0' && *end != ',')
|
||||
end++;
|
||||
len = end - p;
|
||||
if (*end != '\0')
|
||||
end++;
|
||||
for (i = 0; i < (sizeof(jit_opcodes) / sizeof(jit_opcodes[0])); i++)
|
||||
{
|
||||
if (len == strlen(jit_opcodes[i].name) && strncasecmp(jit_opcodes[i].name, p, len) == 0)
|
||||
{
|
||||
*jit_opcodes[i].disabled = true;
|
||||
jit_log("<JIT compiler> : disabled %s", jit_opcodes[i].name);
|
||||
*pp = end;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
static bool merge_blacklist()
|
||||
{
|
||||
#ifdef UAE
|
||||
const char *blacklist = "";
|
||||
#else
|
||||
const char *blacklist = PrefsFindString("jitblacklist");
|
||||
#endif
|
||||
#ifdef USE_JIT_FPU
|
||||
for (unsigned int i = 0; i < (sizeof(jit_opcodes) / sizeof(jit_opcodes[0])); i++)
|
||||
*jit_opcodes[i].disabled = false;
|
||||
#endif
|
||||
if (blacklist[0] != '\0') {
|
||||
const char *p = blacklist;
|
||||
@ -4035,7 +4103,14 @@ static bool merge_blacklist()
|
||||
|
||||
int opcode1 = read_opcode(p);
|
||||
if (opcode1 < 0)
|
||||
{
|
||||
#ifdef USE_JIT_FPU
|
||||
if (read_fpu_opcode(&p))
|
||||
continue;
|
||||
#endif
|
||||
bug("<JIT compiler> : invalid opcode %s", p);
|
||||
return false;
|
||||
}
|
||||
p += 4;
|
||||
|
||||
int opcode2 = opcode1;
|
||||
@ -4043,7 +4118,10 @@ static bool merge_blacklist()
|
||||
p++;
|
||||
opcode2 = read_opcode(p);
|
||||
if (opcode2 < 0)
|
||||
{
|
||||
bug("<JIT compiler> : invalid opcode %s", p);
|
||||
return false;
|
||||
}
|
||||
p += 4;
|
||||
}
|
||||
|
||||
@ -4066,6 +4144,12 @@ static bool merge_blacklist()
|
||||
|
||||
void build_comp(void)
|
||||
{
|
||||
#ifdef FSUAE
|
||||
if (!g_fs_uae_jit_compiler) {
|
||||
jit_log("JIT: JIT compiler is not enabled");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
int i;
|
||||
unsigned long opcode;
|
||||
const struct comptbl* tbl=op_smalltbl_0_comp_ff;
|
||||
@ -4084,6 +4168,8 @@ void build_comp(void)
|
||||
: op_smalltbl_5_nf);
|
||||
#endif
|
||||
#endif
|
||||
// Initialize target CPU (check for features, e.g. CMOV, rat stalls)
|
||||
raw_init_cpu();
|
||||
|
||||
#ifdef NATMEM_OFFSET
|
||||
#ifdef UAE
|
||||
@ -4220,7 +4306,7 @@ void build_comp(void)
|
||||
{
|
||||
jit_log("<JIT compiler> : blacklist merge failure!");
|
||||
}
|
||||
|
||||
|
||||
count=0;
|
||||
for (opcode = 0; opcode < 65536; opcode++) {
|
||||
if (compfunctbl[cft_map(opcode)])
|
||||
@ -4258,21 +4344,19 @@ void build_comp(void)
|
||||
}
|
||||
|
||||
|
||||
static void flush_icache_none(int)
|
||||
static void flush_icache_none(void)
|
||||
{
|
||||
/* Nothing to do. */
|
||||
}
|
||||
|
||||
static void flush_icache_hard(int n)
|
||||
void flush_icache_hard(void)
|
||||
{
|
||||
blockinfo* bi, *dbi;
|
||||
|
||||
hard_flush_count++;
|
||||
#ifndef UAE
|
||||
jit_log("JIT: Flush Icache_hard(%d/%x/%p), %u KB",
|
||||
n,regs.pc,regs.pc_p,current_cache_size/1024);
|
||||
#endif
|
||||
UNUSED(n);
|
||||
bi=active;
|
||||
while(bi) {
|
||||
cache_tags[cacheline(bi->pc_p)].handler=(cpuop_func*)popall_execute_normal;
|
||||
@ -4309,22 +4393,11 @@ static void flush_icache_hard(int n)
|
||||
we simply mark everything as "needs to be checked".
|
||||
*/
|
||||
|
||||
#ifdef WINUAE_ARANYM
|
||||
static inline void flush_icache_lazy(int)
|
||||
#else
|
||||
void flush_icache(int n)
|
||||
#endif
|
||||
static inline void flush_icache_lazy(void)
|
||||
{
|
||||
blockinfo* bi;
|
||||
blockinfo* bi2;
|
||||
|
||||
#ifdef UAE
|
||||
if (currprefs.comp_hardflush) {
|
||||
flush_icache_hard(n);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
soft_flush_count++;
|
||||
if (!active)
|
||||
return;
|
||||
|
||||
@ -4359,51 +4432,15 @@ void flush_icache(int n)
|
||||
active=NULL;
|
||||
}
|
||||
|
||||
#ifdef UAE
|
||||
static
|
||||
#endif
|
||||
// void flush_icache_range(uae_u32 start, uae_u32 length)
|
||||
// {
|
||||
// if (!active)
|
||||
// return;
|
||||
|
||||
// #if LAZY_FLUSH_ICACHE_RANGE
|
||||
// uae_u8 *start_p = get_real_address(start);
|
||||
// blockinfo *bi = active;
|
||||
// while (bi) {
|
||||
// #if USE_CHECKSUM_INFO
|
||||
// bool invalidate = false;
|
||||
// for (checksum_info *csi = bi->csi; csi && !invalidate; csi = csi->next)
|
||||
// invalidate = (((start_p - csi->start_p) < csi->length) ||
|
||||
// ((csi->start_p - start_p) < length));
|
||||
// #else
|
||||
// // Assume system is consistent and would invalidate the right range
|
||||
// const bool invalidate = (bi->pc_p - start_p) < length;
|
||||
// #endif
|
||||
// if (invalidate) {
|
||||
// uae_u32 cl = cacheline(bi->pc_p);
|
||||
// if (bi == cache_tags[cl + 1].bi)
|
||||
// cache_tags[cl].handler = (cpuop_func *)popall_execute_normal;
|
||||
// bi->handler_to_use = (cpuop_func *)popall_execute_normal;
|
||||
// set_dhtu(bi, bi->direct_pen);
|
||||
// bi->status = BI_NEED_RECOMP;
|
||||
// }
|
||||
// bi = bi->next;
|
||||
// }
|
||||
// return;
|
||||
// #else
|
||||
// UNUSED(start);
|
||||
// UNUSED(length);
|
||||
// #endif
|
||||
// flush_icache(-1);
|
||||
// }
|
||||
|
||||
void flush_icache_range(uae_u8 *start_p, uae_u32 length)
|
||||
#if 0
|
||||
static void flush_icache_range(uae_u32 start, uae_u32 length)
|
||||
{
|
||||
if (!active)
|
||||
return;
|
||||
|
||||
#if LAZY_FLUSH_ICACHE_RANGE
|
||||
uae_u8 *start_p = get_real_address(start);
|
||||
blockinfo *bi = active;
|
||||
while (bi) {
|
||||
#if USE_CHECKSUM_INFO
|
||||
@ -4427,18 +4464,13 @@ void flush_icache_range(uae_u8 *start_p, uae_u32 length)
|
||||
}
|
||||
return;
|
||||
#else
|
||||
// UNUSED(start);
|
||||
// UNUSED(length);
|
||||
UNUSED(start);
|
||||
UNUSED(length);
|
||||
#endif
|
||||
flush_icache(-1);
|
||||
flush_icache();
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
static void catastrophe(void)
|
||||
{
|
||||
jit_abort("catastprophe");
|
||||
}
|
||||
*/
|
||||
|
||||
int failure;
|
||||
|
||||
@ -4465,45 +4497,45 @@ void compiler_dumpstate(void)
|
||||
if (!JITDebug)
|
||||
return;
|
||||
|
||||
bug("### Host addresses");
|
||||
bug("MEM_BASE : %lx", (unsigned long)MEMBaseDiff);
|
||||
bug("PC_P : %p", ®s.pc_p);
|
||||
bug("SPCFLAGS : %p", ®s.spcflags);
|
||||
bug("D0-D7 : %p-%p", ®s.regs[0], ®s.regs[7]);
|
||||
bug("A0-A7 : %p-%p", ®s.regs[8], ®s.regs[15]);
|
||||
bug(" ");
|
||||
jit_log("### Host addresses");
|
||||
jit_log("MEM_BASE : %lx", (unsigned long)MEMBaseDiff);
|
||||
jit_log("PC_P : %p", ®s.pc_p);
|
||||
jit_log("SPCFLAGS : %p", ®s.spcflags);
|
||||
jit_log("D0-D7 : %p-%p", ®s.regs[0], ®s.regs[7]);
|
||||
jit_log("A0-A7 : %p-%p", ®s.regs[8], ®s.regs[15]);
|
||||
jit_log(" ");
|
||||
|
||||
bug("### M68k processor state");
|
||||
jit_log("### M68k processor state");
|
||||
m68k_dumpstate(stderr, 0);
|
||||
bug(" ");
|
||||
jit_log(" ");
|
||||
|
||||
bug("### Block in Atari address space");
|
||||
bug("M68K block : %p",
|
||||
jit_log("### Block in Atari address space");
|
||||
jit_log("M68K block : %p",
|
||||
(void *)(uintptr)last_regs_pc_p);
|
||||
if (last_regs_pc_p != 0) {
|
||||
bug("Native block : %p (%d bytes)",
|
||||
jit_log("Native block : %p (%d bytes)",
|
||||
(void *)last_compiled_block_addr,
|
||||
get_blockinfo_addr(last_regs_pc_p)->direct_handler_size);
|
||||
}
|
||||
bug(" ");
|
||||
jit_log(" ");
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef UAE
|
||||
void compile_block(cpu_history *pc_hist, int blocklen, int totcycles)
|
||||
{
|
||||
if (letit && compiled_code && currprefs.cpu_model >= 68020) {
|
||||
if (cache_enabled && compiled_code && currprefs.cpu_model >= 68020) {
|
||||
#else
|
||||
static void compile_block(cpu_history* pc_hist, int blocklen)
|
||||
{
|
||||
if (letit && compiled_code) {
|
||||
if (cache_enabled && compiled_code) {
|
||||
#endif
|
||||
#ifdef PROFILE_COMPILE_TIME
|
||||
compile_count++;
|
||||
clock_t start_time = clock();
|
||||
#endif
|
||||
#ifdef JIT_DEBUG
|
||||
bool disasm_block = true;
|
||||
bool disasm_block = false;
|
||||
#endif
|
||||
|
||||
/* OK, here we need to 'compile' a block */
|
||||
@ -4527,7 +4559,7 @@ static void compile_block(cpu_history* pc_hist, int blocklen)
|
||||
|
||||
redo_current_block=0;
|
||||
if (current_compile_p >= MAX_COMPILE_PTR)
|
||||
flush_icache_hard(7);
|
||||
flush_icache_hard();
|
||||
|
||||
alloc_blockinfos();
|
||||
|
||||
@ -4643,12 +4675,12 @@ static void compile_block(cpu_history* pc_hist, int blocklen)
|
||||
#ifdef USE_CPU_EMUL_SERVICES
|
||||
compemu_raw_sub_l_mi((uintptr)&emulated_ticks,blocklen);
|
||||
compemu_raw_jcc_b_oponly(NATIVE_CC_GT);
|
||||
uae_s8 *branchadd=(uae_s8*)get_target();
|
||||
uae_u8 *branchadd=get_target();
|
||||
skip_byte();
|
||||
raw_dec_sp(STACK_SHADOW_SPACE);
|
||||
compemu_raw_call((uintptr)cpu_do_check_ticks);
|
||||
raw_inc_sp(STACK_SHADOW_SPACE);
|
||||
*branchadd=(uintptr)get_target()-((uintptr)branchadd+1);
|
||||
*branchadd=get_target()-(branchadd+1);
|
||||
#endif
|
||||
|
||||
#ifdef JIT_DEBUG
|
||||
@ -4690,7 +4722,7 @@ static void compile_block(cpu_history* pc_hist, int blocklen)
|
||||
prepare_for_call_1();
|
||||
prepare_for_call_2();
|
||||
raw_mov_l_ri(REG_PAR1, ((uintptr)(pc_hist[i].location)) - MEMBaseDiff);
|
||||
raw_mov_w_ri(REG_PAR2, opcode);
|
||||
raw_mov_w_ri(REG_PAR2, cft_map(opcode));
|
||||
raw_dec_sp(STACK_SHADOW_SPACE);
|
||||
compemu_raw_call((uintptr)m68k_record_step);
|
||||
raw_inc_sp(STACK_SHADOW_SPACE);
|
||||
@ -4706,11 +4738,13 @@ static void compile_block(cpu_history* pc_hist, int blocklen)
|
||||
}
|
||||
was_comp=1;
|
||||
|
||||
#ifdef WINUAE_ARANYM
|
||||
bool isnop = do_get_mem_word(pc_hist[i].location) == 0x4e71 ||
|
||||
((i + 1) < blocklen && do_get_mem_word(pc_hist[i+1].location) == 0x4e71);
|
||||
|
||||
if (isnop)
|
||||
compemu_raw_mov_l_mi((uintptr)®s.fault_pc, ((uintptr)(pc_hist[i].location)) - MEMBaseDiff);
|
||||
#endif
|
||||
|
||||
comptbl[opcode](opcode);
|
||||
freescratch();
|
||||
@ -4724,6 +4758,7 @@ static void compile_block(cpu_history* pc_hist, int blocklen)
|
||||
flush(1);
|
||||
was_comp=0;
|
||||
#endif
|
||||
#ifdef WINUAE_ARANYM
|
||||
/*
|
||||
* workaround for buserror handling: on a "nop", write registers back
|
||||
*/
|
||||
@ -4733,6 +4768,7 @@ static void compile_block(cpu_history* pc_hist, int blocklen)
|
||||
nop();
|
||||
was_comp=0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if (failure) {
|
||||
@ -4758,7 +4794,7 @@ static void compile_block(cpu_history* pc_hist, int blocklen)
|
||||
#endif
|
||||
|
||||
if (i < blocklen - 1) {
|
||||
uae_s8* branchadd;
|
||||
uae_u8* branchadd;
|
||||
|
||||
/* if (SPCFLAGS_TEST(SPCFLAG_STOP)) popall_do_nothing() */
|
||||
compemu_raw_mov_l_rm(0,(uintptr)specflags);
|
||||
@ -4767,13 +4803,13 @@ static void compile_block(cpu_history* pc_hist, int blocklen)
|
||||
data_check_end(8, 64); // just a pessimistic guess...
|
||||
#endif
|
||||
compemu_raw_jz_b_oponly();
|
||||
branchadd=(uae_s8*)get_target();
|
||||
branchadd=get_target();
|
||||
skip_byte();
|
||||
#ifdef UAE
|
||||
raw_sub_l_mi(uae_p32(&countdown),scaled_cycles(totcycles));
|
||||
#endif
|
||||
compemu_raw_jmp((uintptr)popall_do_nothing);
|
||||
*branchadd=(uintptr)get_target()-(uintptr)branchadd-1;
|
||||
*branchadd=get_target()-branchadd-1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4804,7 +4840,7 @@ static void compile_block(cpu_history* pc_hist, int blocklen)
|
||||
}
|
||||
#endif
|
||||
log_flush();
|
||||
|
||||
|
||||
if (next_pc_p) { /* A branch was registered */
|
||||
uintptr t1=next_pc_p;
|
||||
uintptr t2=taken_pc_p;
|
||||
@ -4900,7 +4936,7 @@ static void compile_block(cpu_history* pc_hist, int blocklen)
|
||||
|
||||
tbi = get_blockinfo_addr_new((void*) v, 1);
|
||||
match_states(tbi);
|
||||
|
||||
|
||||
#ifdef UAE
|
||||
raw_sub_l_mi(uae_p32(&countdown),scaled_cycles(totcycles));
|
||||
raw_jcc_l_oponly(NATIVE_CC_PL);
|
||||
@ -4936,10 +4972,10 @@ static void compile_block(cpu_history* pc_hist, int blocklen)
|
||||
if (callers_need_recompile(&live,&(bi->env))) {
|
||||
mark_callers_recompile(bi);
|
||||
}
|
||||
|
||||
|
||||
big_to_small_state(&live,&(bi->env));
|
||||
#endif
|
||||
|
||||
|
||||
#if USE_CHECKSUM_INFO
|
||||
remove_from_list(bi);
|
||||
if (trace_in_rom) {
|
||||
@ -4974,7 +5010,7 @@ static void compile_block(cpu_history* pc_hist, int blocklen)
|
||||
}
|
||||
#endif
|
||||
|
||||
current_cache_size += get_target() - (uae_u8 *)current_compile_p;
|
||||
current_cache_size += get_target() - current_compile_p;
|
||||
|
||||
#ifdef JIT_DEBUG
|
||||
bi->direct_handler_size = get_target() - (uae_u8 *)current_block_start_target;
|
||||
@ -4983,9 +5019,13 @@ static void compile_block(cpu_history* pc_hist, int blocklen)
|
||||
uaecptr block_addr = start_pc + ((char *)pc_hist[0].location - (char *)start_pc_p);
|
||||
jit_log("M68K block @ 0x%08x (%d insns)", block_addr, blocklen);
|
||||
uae_u32 block_size = ((uae_u8 *)pc_hist[blocklen - 1].location - (uae_u8 *)pc_hist[0].location) + 1;
|
||||
#ifdef WINUAE_ARANYM
|
||||
disasm_m68k_block((const uae_u8 *)pc_hist[0].location, block_size);
|
||||
#endif
|
||||
jit_log("Compiled block @ %p", pc_hist[0].location);
|
||||
#ifdef WINUAE_ARANYM
|
||||
disasm_native_block((const uae_u8 *)current_block_start_target, bi->direct_handler_size);
|
||||
#endif
|
||||
UNUSED(block_addr);
|
||||
}
|
||||
#endif
|
||||
@ -5022,7 +5062,7 @@ static void compile_block(cpu_history* pc_hist, int blocklen)
|
||||
|
||||
/* We will flush soon, anyway, so let's do it now */
|
||||
if (current_compile_p >= MAX_COMPILE_PTR)
|
||||
flush_icache_hard(7);
|
||||
flush_icache_hard();
|
||||
|
||||
bi->status=BI_ACTIVE;
|
||||
if (redo_current_block)
|
||||
@ -5037,7 +5077,7 @@ static void compile_block(cpu_history* pc_hist, int blocklen)
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef UAE
|
||||
#ifdef USE_CPU_EMUL_SERVICES
|
||||
/* Account for compilation time */
|
||||
cpu_do_check_ticks();
|
||||
#endif
|
||||
@ -5060,7 +5100,7 @@ void exec_nostats(void)
|
||||
for (;;) {
|
||||
uae_u32 opcode = GET_OPCODE;
|
||||
#if FLIGHT_RECORDER
|
||||
m68k_record_step(m68k_getpc(), opcode);
|
||||
m68k_record_step(m68k_getpc(), cft_map(opcode));
|
||||
#endif
|
||||
(*cpufunctbl[opcode])(opcode);
|
||||
cpu_check_ticks();
|
||||
@ -5090,7 +5130,7 @@ void execute_normal(void)
|
||||
pc_hist[blocklen++].location = (uae_u16 *)regs.pc_p;
|
||||
uae_u32 opcode = GET_OPCODE;
|
||||
#if FLIGHT_RECORDER
|
||||
m68k_record_step(m68k_getpc(), opcode);
|
||||
m68k_record_step(m68k_getpc(), cft_map(opcode));
|
||||
#endif
|
||||
(*cpufunctbl[opcode])(opcode);
|
||||
cpu_check_ticks();
|
||||
@ -5131,11 +5171,15 @@ void m68k_compile_execute (void)
|
||||
setjmpagain:
|
||||
TRY(prb) {
|
||||
for (;;) {
|
||||
if (quit_program == 1) {
|
||||
if (quit_program > 0) {
|
||||
if (quit_program == 1) {
|
||||
#if FLIGHT_RECORDER
|
||||
dump_flight_recorder();
|
||||
dump_flight_recorder();
|
||||
#endif
|
||||
break;
|
||||
break;
|
||||
}
|
||||
quit_program = 0;
|
||||
m68k_reset ();
|
||||
}
|
||||
m68k_do_compile_execute();
|
||||
}
|
||||
@ -5148,7 +5192,7 @@ setjmpagain:
|
||||
regs.fault_pc,
|
||||
regs.mmu_fault_addr, get_long (regs.vbr + 4*prb),
|
||||
regs.regs[15]);
|
||||
flush_icache(0);
|
||||
flush_icache();
|
||||
Exception(prb, 0);
|
||||
goto setjmpagain;
|
||||
}
|
||||
|
@ -93,11 +93,16 @@
|
||||
#define DISABLE_I_FSCC
|
||||
#define DISABLE_I_MOVE16
|
||||
*/
|
||||
|
||||
#endif /* UAE */
|
||||
|
||||
#ifdef UAE
|
||||
#define JIT_PATH "jit/"
|
||||
#ifdef FSUAE
|
||||
#define GEN_PATH "gen/"
|
||||
#else
|
||||
#define GEN_PATH "jit/"
|
||||
#endif
|
||||
#define RETURN "return 0;"
|
||||
#define RETTYPE "uae_u32"
|
||||
#define NEXT_CPU_LEVEL 5
|
||||
@ -107,7 +112,6 @@
|
||||
#define RETURN "return;"
|
||||
#define RETTYPE "void"
|
||||
#define NEXT_CPU_LEVEL 4
|
||||
#define ua(s) s
|
||||
#endif
|
||||
|
||||
#define BOOL_TYPE "int"
|
||||
@ -738,8 +742,9 @@ static void genmov16(uae_u32 opcode, struct instr *curi)
|
||||
"\tadd_l_ri(dst,4);\n"
|
||||
"\treadlong(src,tmp,scratchie);\n"
|
||||
"\twritelong_clobber(dst,tmp,scratchie);\n");
|
||||
comprintf("\t} else {\n");
|
||||
comprintf("\t} else\n");
|
||||
#endif
|
||||
start_brace();
|
||||
comprintf("\tint tmp=scratchie;\n");
|
||||
comprintf("\tscratchie+=4;\n"
|
||||
"\tget_n_addr(src,src,scratchie);\n"
|
||||
@ -755,9 +760,7 @@ static void genmov16(uae_u32 opcode, struct instr *curi)
|
||||
"\tmov_l_Rr(dst,tmp+2,8);\n"
|
||||
"\tforget_about(tmp+2);\n"
|
||||
"\tmov_l_Rr(dst,tmp+3,12);\n");
|
||||
#ifdef UAE
|
||||
comprintf("\t}\n");
|
||||
#endif
|
||||
close_brace();
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1304,11 +1307,11 @@ genflags (flagtypes type, wordsizes size, const char *value, const char *src, co
|
||||
break;
|
||||
}
|
||||
comprintf("\tlive_flags();\n");
|
||||
comprintf("\tif (needed_flags&FLAG_Z) {\n"
|
||||
"\tcmov_l_rr(zero,one,%d);\n"
|
||||
"\tset_zero(zero, one);\n" /* No longer need one */
|
||||
"\tlive_flags();\n"
|
||||
"\t}\n",NATIVE_CC_NE);
|
||||
comprintf("\tif (needed_flags&FLAG_Z) {\n");
|
||||
comprintf("\tcmov_l_rr(zero,one,%d);\n", NATIVE_CC_NE);
|
||||
comprintf("\tset_zero(zero, one);\n"); /* No longer need one */
|
||||
comprintf("\tlive_flags();\n");
|
||||
comprintf("\t}\n");
|
||||
comprintf("\tend_needflags();\n");
|
||||
duplicate_carry();
|
||||
comprintf("if (!(needed_flags & FLAG_CZNV)) dont_care_flags();\n");
|
||||
@ -2181,158 +2184,63 @@ gen_opcode (unsigned int opcode)
|
||||
|
||||
genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
|
||||
genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
|
||||
if (curi->smode!=immi) {
|
||||
if (!noflags) {
|
||||
uses_cmov;
|
||||
start_brace();
|
||||
comprintf("\tint highmask;\n"
|
||||
"\tint width;\n"
|
||||
"\tint cdata=scratchie++;\n"
|
||||
"\tint tmpcnt=scratchie++;\n"
|
||||
"\tint highshift=scratchie++;\n");
|
||||
comprintf("\tmov_l_rr(tmpcnt,cnt);\n"
|
||||
"\tand_l_ri(tmpcnt,63);\n"
|
||||
"\tmov_l_ri(cdata,0);\n"
|
||||
"\tcmov_l_rr(cdata,data,%d);\n", NATIVE_CC_NE);
|
||||
/* cdata is now either data (for shift count!=0) or
|
||||
0 (for shift count==0) */
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshra_b_rr(data,cnt);\n"
|
||||
"\thighmask=0x38;\n"
|
||||
"\twidth=8;\n");
|
||||
break;
|
||||
case sz_word: comprintf("\tshra_w_rr(data,cnt);\n"
|
||||
"\thighmask=0x30;\n"
|
||||
"\twidth=16;\n");
|
||||
break;
|
||||
case sz_long: comprintf("\tshra_l_rr(data,cnt);\n"
|
||||
"\thighmask=0x20;\n"
|
||||
"\twidth=32;\n");
|
||||
break;
|
||||
default: assert(0);
|
||||
}
|
||||
comprintf("test_l_ri(cnt,highmask);\n"
|
||||
"mov_l_ri(highshift,0);\n"
|
||||
"mov_l_ri(scratchie,width/2);\n"
|
||||
"cmov_l_rr(highshift,scratchie,%d);\n", NATIVE_CC_NE);
|
||||
/* The x86 masks out bits, so we now make sure that things
|
||||
really get shifted as much as planned */
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshra_b_rr(data,highshift);\n");break;
|
||||
case sz_word: comprintf("\tshra_w_rr(data,highshift);\n");break;
|
||||
case sz_long: comprintf("\tshra_l_rr(data,highshift);\n");break;
|
||||
default: assert(0);
|
||||
}
|
||||
/* And again */
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshra_b_rr(data,highshift);\n");break;
|
||||
case sz_word: comprintf("\tshra_w_rr(data,highshift);\n");break;
|
||||
case sz_long: comprintf("\tshra_l_rr(data,highshift);\n");break;
|
||||
default: assert(0);
|
||||
}
|
||||
|
||||
/* Result of shift is now in data. Now we need to determine
|
||||
the carry by shifting cdata one less */
|
||||
comprintf("\tsub_l_ri(tmpcnt,1);\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshra_b_rr(cdata,tmpcnt);\n");break;
|
||||
case sz_word: comprintf("\tshra_w_rr(cdata,tmpcnt);\n");break;
|
||||
case sz_long: comprintf("\tshra_l_rr(cdata,tmpcnt);\n");break;
|
||||
default: assert(0);
|
||||
}
|
||||
/* If the shift count was higher than the width, we need
|
||||
to pick up the sign from data */
|
||||
comprintf("test_l_ri(tmpcnt,highmask);\n"
|
||||
"cmov_l_rr(cdata,data,%d);\n", NATIVE_CC_NE);
|
||||
/* And create the flags */
|
||||
start_brace();
|
||||
if (!noflags)
|
||||
comprintf("\tstart_needflags();\n");
|
||||
comprintf("\tif (needed_flags & FLAG_ZNV)\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\t test_b_rr(data,data);\n"); break;
|
||||
case sz_word: comprintf("\t test_w_rr(data,data);\n"); break;
|
||||
case sz_long: comprintf("\t test_l_rr(data,data);\n"); break;
|
||||
}
|
||||
comprintf("\t bt_l_ri(cdata,0);\n"); /* Set C */
|
||||
comprintf("\t live_flags();\n");
|
||||
comprintf("\t end_needflags();\n");
|
||||
comprintf("\t duplicate_carry();\n");
|
||||
comprintf("if (!(needed_flags & FLAG_CZNV)) dont_care_flags();\n");
|
||||
genastore ("data", curi->dmode, "dstreg", curi->size, "data");
|
||||
}
|
||||
else {
|
||||
if (curi->smode!=immi) {
|
||||
uses_cmov;
|
||||
start_brace();
|
||||
comprintf("\tint highmask;\n"
|
||||
"\tint width;\n"
|
||||
"\tint highshift=scratchie++;\n");
|
||||
comprintf("\tint zero = scratchie++;\n");
|
||||
comprintf("\tint minus1 = scratchie++;\n");
|
||||
comprintf("\tand_l_ri(cnt,63);\n");
|
||||
comprintf("\tmov_l_ri(zero, 0);\n");
|
||||
comprintf("\tmov_l_ri(minus1, -1);\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshra_b_rr(data,cnt);\n"
|
||||
"\thighmask=0x38;\n"
|
||||
"\twidth=8;\n");
|
||||
break;
|
||||
case sz_word: comprintf("\tshra_w_rr(data,cnt);\n"
|
||||
"\thighmask=0x30;\n"
|
||||
"\twidth=16;\n");
|
||||
break;
|
||||
case sz_long: comprintf("\tshra_l_rr(data,cnt);\n"
|
||||
"\thighmask=0x20;\n"
|
||||
"\twidth=32;\n");
|
||||
break;
|
||||
case sz_byte:
|
||||
comprintf("\ttest_b_rr(data,data);\n");
|
||||
comprintf("\tcmov_l_rr(zero, minus1, NATIVE_CC_MI);\n");
|
||||
comprintf("\ttest_l_ri(cnt, 0x38);\n");
|
||||
comprintf("\tcmov_l_rr(data, zero, NATIVE_CC_NE);\n");
|
||||
comprintf("\tshra_b_rr(data,cnt);\n");
|
||||
break;
|
||||
case sz_word:
|
||||
comprintf("\ttest_w_rr(data,data);\n");
|
||||
comprintf("\tcmov_l_rr(zero, minus1, NATIVE_CC_MI);\n");
|
||||
comprintf("\ttest_l_ri(cnt, 0x30);\n");
|
||||
comprintf("\tcmov_l_rr(data, zero, NATIVE_CC_NE);\n");
|
||||
comprintf("\tshra_w_rr(data,cnt);\n");
|
||||
break;
|
||||
case sz_long:
|
||||
comprintf("\ttest_l_rr(data,data);\n");
|
||||
comprintf("\tcmov_l_rr(zero, minus1, NATIVE_CC_MI);\n");
|
||||
comprintf("\ttest_l_ri(cnt, 0x20);\n");
|
||||
comprintf("\tcmov_l_rr(data, zero, NATIVE_CC_NE);\n");
|
||||
comprintf("\tshra_l_rr(data,cnt);\n");
|
||||
break;
|
||||
default: assert(0);
|
||||
}
|
||||
comprintf("test_l_ri(cnt,highmask);\n"
|
||||
"mov_l_ri(highshift,0);\n"
|
||||
"mov_l_ri(scratchie,width/2);\n"
|
||||
"cmov_l_rr(highshift,scratchie,%d);\n",NATIVE_CC_NE);
|
||||
/* The x86 masks out bits, so we now make sure that things
|
||||
really get shifted as much as planned */
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshra_b_rr(data,highshift);\n");break;
|
||||
case sz_word: comprintf("\tshra_w_rr(data,highshift);\n");break;
|
||||
case sz_long: comprintf("\tshra_l_rr(data,highshift);\n");break;
|
||||
default: assert(0);
|
||||
}
|
||||
/* And again */
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshra_b_rr(data,highshift);\n");break;
|
||||
case sz_word: comprintf("\tshra_w_rr(data,highshift);\n");break;
|
||||
case sz_long: comprintf("\tshra_l_rr(data,highshift);\n");break;
|
||||
default: assert(0);
|
||||
}
|
||||
genastore ("data", curi->dmode, "dstreg", curi->size, "data");
|
||||
}
|
||||
/* Result of shift is now in data. */
|
||||
}
|
||||
else {
|
||||
start_brace();
|
||||
comprintf("\tint tmp=scratchie++;\n"
|
||||
"\tint bp;\n"
|
||||
"\tmov_l_rr(tmp,data);\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshra_b_ri(data,srcreg);\n"
|
||||
"\tbp=srcreg-1;\n"); break;
|
||||
case sz_word: comprintf("\tshra_w_ri(data,srcreg);\n"
|
||||
"\tbp=srcreg-1;\n"); break;
|
||||
case sz_long: comprintf("\tshra_l_ri(data,srcreg);\n"
|
||||
"\tbp=srcreg-1;\n"); break;
|
||||
case sz_byte: comprintf("\tshra_b_ri(data,srcreg);\n"); break;
|
||||
case sz_word: comprintf("\tshra_w_ri(data,srcreg);\n"); break;
|
||||
case sz_long: comprintf("\tshra_l_ri(data,srcreg);\n"); break;
|
||||
default: assert(0);
|
||||
}
|
||||
|
||||
if (!noflags) {
|
||||
comprintf("\tstart_needflags();\n");
|
||||
comprintf("\tif (needed_flags & FLAG_ZNV)\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\t test_b_rr(data,data);\n"); break;
|
||||
case sz_word: comprintf("\t test_w_rr(data,data);\n"); break;
|
||||
case sz_long: comprintf("\t test_l_rr(data,data);\n"); break;
|
||||
}
|
||||
comprintf("\t bt_l_ri(tmp,bp);\n"); /* Set C */
|
||||
comprintf("\t live_flags();\n");
|
||||
comprintf("\t end_needflags();\n");
|
||||
comprintf("\t duplicate_carry();\n");
|
||||
comprintf("if (!(needed_flags & FLAG_CZNV)) dont_care_flags();\n");
|
||||
}
|
||||
genastore ("data", curi->dmode, "dstreg", curi->size, "data");
|
||||
}
|
||||
/* And create the flags */
|
||||
if (!noflags) {
|
||||
comprintf("\tlive_flags();\n");
|
||||
comprintf("\tend_needflags();\n");
|
||||
if (curi->smode!=immi)
|
||||
comprintf("\tsetcc_for_cntzero(cnt, data, %d);\n", curi->size == sz_byte ? 1 : curi->size == sz_word ? 2 : 4);
|
||||
else
|
||||
comprintf("\tduplicate_carry();\n");
|
||||
comprintf("if (!(needed_flags & FLAG_CZNV)) dont_care_flags();\n");
|
||||
}
|
||||
genastore ("data", curi->dmode, "dstreg", curi->size, "data");
|
||||
break;
|
||||
|
||||
case i_ASL:
|
||||
@ -2359,129 +2267,54 @@ gen_opcode (unsigned int opcode)
|
||||
|
||||
genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
|
||||
genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
|
||||
if (curi->smode!=immi) {
|
||||
if (!noflags) {
|
||||
uses_cmov;
|
||||
start_brace();
|
||||
comprintf("\tint highmask;\n"
|
||||
"\tint cdata=scratchie++;\n"
|
||||
"\tint tmpcnt=scratchie++;\n");
|
||||
comprintf("\tmov_l_rr(tmpcnt,cnt);\n"
|
||||
"\tand_l_ri(tmpcnt,63);\n"
|
||||
"\tmov_l_ri(cdata,0);\n"
|
||||
"\tcmov_l_rr(cdata,data,%d);\n",NATIVE_CC_NE);
|
||||
/* cdata is now either data (for shift count!=0) or
|
||||
0 (for shift count==0) */
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshll_b_rr(data,cnt);\n"
|
||||
"\thighmask=0x38;\n");
|
||||
break;
|
||||
case sz_word: comprintf("\tshll_w_rr(data,cnt);\n"
|
||||
"\thighmask=0x30;\n");
|
||||
break;
|
||||
case sz_long: comprintf("\tshll_l_rr(data,cnt);\n"
|
||||
"\thighmask=0x20;\n");
|
||||
break;
|
||||
default: assert(0);
|
||||
}
|
||||
comprintf("test_l_ri(cnt,highmask);\n"
|
||||
"mov_l_ri(scratchie,0);\n"
|
||||
"cmov_l_rr(scratchie,data,%d);\n",NATIVE_CC_EQ);
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tmov_b_rr(data,scratchie);\n");break;
|
||||
case sz_word: comprintf("\tmov_w_rr(data,scratchie);\n");break;
|
||||
case sz_long: comprintf("\tmov_l_rr(data,scratchie);\n");break;
|
||||
default: assert(0);
|
||||
}
|
||||
/* Result of shift is now in data. Now we need to determine
|
||||
the carry by shifting cdata one less */
|
||||
comprintf("\tsub_l_ri(tmpcnt,1);\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshll_b_rr(cdata,tmpcnt);\n");break;
|
||||
case sz_word: comprintf("\tshll_w_rr(cdata,tmpcnt);\n");break;
|
||||
case sz_long: comprintf("\tshll_l_rr(cdata,tmpcnt);\n");break;
|
||||
default: assert(0);
|
||||
}
|
||||
comprintf("test_l_ri(tmpcnt,highmask);\n"
|
||||
"mov_l_ri(scratchie,0);\n"
|
||||
"cmov_l_rr(cdata,scratchie,%d);\n",NATIVE_CC_NE);
|
||||
/* And create the flags */
|
||||
comprintf("\tstart_needflags();\n");
|
||||
|
||||
comprintf("\tif (needed_flags & FLAG_ZNV)\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\t test_b_rr(data,data);\n");
|
||||
comprintf("\t bt_l_ri(cdata,7);\n"); break;
|
||||
case sz_word: comprintf("\t test_w_rr(data,data);\n");
|
||||
comprintf("\t bt_l_ri(cdata,15);\n"); break;
|
||||
case sz_long: comprintf("\t test_l_rr(data,data);\n");
|
||||
comprintf("\t bt_l_ri(cdata,31);\n"); break;
|
||||
}
|
||||
comprintf("\t live_flags();\n");
|
||||
comprintf("\t end_needflags();\n");
|
||||
comprintf("\t duplicate_carry();\n");
|
||||
comprintf("if (!(needed_flags & FLAG_CZNV)) dont_care_flags();\n");
|
||||
genastore ("data", curi->dmode, "dstreg", curi->size, "data");
|
||||
}
|
||||
else {
|
||||
if (!noflags)
|
||||
comprintf("\tstart_needflags();\n");
|
||||
if (curi->smode!=immi) {
|
||||
uses_cmov;
|
||||
start_brace();
|
||||
comprintf("\tint highmask;\n");
|
||||
comprintf("\tint zero = scratchie++;\n");
|
||||
comprintf("\tand_l_ri(cnt,63);\n");
|
||||
comprintf("\tmov_l_ri(zero, 0);\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshll_b_rr(data,cnt);\n"
|
||||
"\thighmask=0x38;\n");
|
||||
break;
|
||||
case sz_word: comprintf("\tshll_w_rr(data,cnt);\n"
|
||||
"\thighmask=0x30;\n");
|
||||
break;
|
||||
case sz_long: comprintf("\tshll_l_rr(data,cnt);\n"
|
||||
"\thighmask=0x20;\n");
|
||||
break;
|
||||
case sz_byte:
|
||||
comprintf("\ttest_l_ri(cnt, 0x38);\n");
|
||||
comprintf("\tcmov_l_rr(data, zero, NATIVE_CC_NE);\n");
|
||||
comprintf("\tshll_b_rr(data,cnt);\n");
|
||||
break;
|
||||
case sz_word:
|
||||
comprintf("\ttest_l_ri(cnt, 0x30);\n");
|
||||
comprintf("\tcmov_l_rr(data, zero, NATIVE_CC_NE);\n");
|
||||
comprintf("\tshll_w_rr(data,cnt);\n");
|
||||
break;
|
||||
case sz_long:
|
||||
comprintf("\ttest_l_ri(cnt, 0x20);\n");
|
||||
comprintf("\tcmov_l_rr(data, zero, NATIVE_CC_NE);\n");
|
||||
comprintf("\tshll_l_rr(data,cnt);\n");
|
||||
break;
|
||||
default: assert(0);
|
||||
}
|
||||
comprintf("test_l_ri(cnt,highmask);\n"
|
||||
"mov_l_ri(scratchie,0);\n"
|
||||
"cmov_l_rr(scratchie,data,%d);\n",NATIVE_CC_EQ);
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tmov_b_rr(data,scratchie);\n");break;
|
||||
case sz_word: comprintf("\tmov_w_rr(data,scratchie);\n");break;
|
||||
case sz_long: comprintf("\tmov_l_rr(data,scratchie);\n");break;
|
||||
default: assert(0);
|
||||
}
|
||||
genastore ("data", curi->dmode, "dstreg", curi->size, "data");
|
||||
}
|
||||
/* Result of shift is now in data. */
|
||||
}
|
||||
else {
|
||||
start_brace();
|
||||
comprintf("\tint tmp=scratchie++;\n"
|
||||
"\tint bp;\n"
|
||||
"\tmov_l_rr(tmp,data);\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshll_b_ri(data,srcreg);\n"
|
||||
"\tbp=8-srcreg;\n"); break;
|
||||
case sz_word: comprintf("\tshll_w_ri(data,srcreg);\n"
|
||||
"\tbp=16-srcreg;\n"); break;
|
||||
case sz_long: comprintf("\tshll_l_ri(data,srcreg);\n"
|
||||
"\tbp=32-srcreg;\n"); break;
|
||||
case sz_byte: comprintf("\tshll_b_ri(data,srcreg);\n"); break;
|
||||
case sz_word: comprintf("\tshll_w_ri(data,srcreg);\n"); break;
|
||||
case sz_long: comprintf("\tshll_l_ri(data,srcreg);\n"); break;
|
||||
default: assert(0);
|
||||
}
|
||||
|
||||
if (!noflags) {
|
||||
comprintf("\tstart_needflags();\n");
|
||||
comprintf("\tif (needed_flags & FLAG_ZNV)\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\t test_b_rr(data,data);\n"); break;
|
||||
case sz_word: comprintf("\t test_w_rr(data,data);\n"); break;
|
||||
case sz_long: comprintf("\t test_l_rr(data,data);\n"); break;
|
||||
}
|
||||
comprintf("\t bt_l_ri(tmp,bp);\n"); /* Set C */
|
||||
comprintf("\t live_flags();\n");
|
||||
comprintf("\t end_needflags();\n");
|
||||
comprintf("\t duplicate_carry();\n");
|
||||
comprintf("if (!(needed_flags & FLAG_CZNV)) dont_care_flags();\n");
|
||||
}
|
||||
genastore ("data", curi->dmode, "dstreg", curi->size, "data");
|
||||
}
|
||||
/* And create the flags */
|
||||
if (!noflags) {
|
||||
comprintf("\tlive_flags();\n");
|
||||
comprintf("\tend_needflags();\n");
|
||||
if (curi->smode!=immi)
|
||||
comprintf("\tsetcc_for_cntzero(cnt, data, %d);\n", curi->size == sz_byte ? 1 : curi->size == sz_word ? 2 : 4);
|
||||
else
|
||||
comprintf("\tduplicate_carry();\n");
|
||||
comprintf("if (!(needed_flags & FLAG_CZNV)) dont_care_flags();\n");
|
||||
}
|
||||
genastore ("data", curi->dmode, "dstreg", curi->size, "data");
|
||||
break;
|
||||
|
||||
case i_LSR:
|
||||
@ -2500,126 +2333,55 @@ gen_opcode (unsigned int opcode)
|
||||
|
||||
genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
|
||||
genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
|
||||
if (curi->smode!=immi) {
|
||||
if (!noflags) {
|
||||
uses_cmov;
|
||||
start_brace();
|
||||
comprintf("\tint highmask;\n"
|
||||
"\tint cdata=scratchie++;\n"
|
||||
"\tint tmpcnt=scratchie++;\n");
|
||||
comprintf("\tmov_l_rr(tmpcnt,cnt);\n"
|
||||
"\tand_l_ri(tmpcnt,63);\n"
|
||||
"\tmov_l_ri(cdata,0);\n"
|
||||
"\tcmov_l_rr(cdata,data,%d);\n",NATIVE_CC_NE);
|
||||
/* cdata is now either data (for shift count!=0) or
|
||||
0 (for shift count==0) */
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshrl_b_rr(data,cnt);\n"
|
||||
"\thighmask=0x38;\n");
|
||||
break;
|
||||
case sz_word: comprintf("\tshrl_w_rr(data,cnt);\n"
|
||||
"\thighmask=0x30;\n");
|
||||
break;
|
||||
case sz_long: comprintf("\tshrl_l_rr(data,cnt);\n"
|
||||
"\thighmask=0x20;\n");
|
||||
break;
|
||||
default: assert(0);
|
||||
}
|
||||
comprintf("test_l_ri(cnt,highmask);\n"
|
||||
"mov_l_ri(scratchie,0);\n"
|
||||
"cmov_l_rr(scratchie,data,%d);\n",NATIVE_CC_EQ);
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tmov_b_rr(data,scratchie);\n");break;
|
||||
case sz_word: comprintf("\tmov_w_rr(data,scratchie);\n");break;
|
||||
case sz_long: comprintf("\tmov_l_rr(data,scratchie);\n");break;
|
||||
default: assert(0);
|
||||
}
|
||||
/* Result of shift is now in data. Now we need to determine
|
||||
the carry by shifting cdata one less */
|
||||
comprintf("\tsub_l_ri(tmpcnt,1);\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshrl_b_rr(cdata,tmpcnt);\n");break;
|
||||
case sz_word: comprintf("\tshrl_w_rr(cdata,tmpcnt);\n");break;
|
||||
case sz_long: comprintf("\tshrl_l_rr(cdata,tmpcnt);\n");break;
|
||||
default: assert(0);
|
||||
}
|
||||
comprintf("test_l_ri(tmpcnt,highmask);\n"
|
||||
"mov_l_ri(scratchie,0);\n"
|
||||
"cmov_l_rr(cdata,scratchie,%d);\n",NATIVE_CC_NE);
|
||||
/* And create the flags */
|
||||
|
||||
start_brace();
|
||||
if (!noflags)
|
||||
comprintf("\tstart_needflags();\n");
|
||||
comprintf("\tif (needed_flags & FLAG_ZNV)\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\t test_b_rr(data,data);\n"); break;
|
||||
case sz_word: comprintf("\t test_w_rr(data,data);\n"); break;
|
||||
case sz_long: comprintf("\t test_l_rr(data,data);\n"); break;
|
||||
}
|
||||
comprintf("\t bt_l_ri(cdata,0);\n"); /* Set C */
|
||||
comprintf("\t live_flags();\n");
|
||||
comprintf("\t end_needflags();\n");
|
||||
comprintf("\t duplicate_carry();\n");
|
||||
comprintf("if (!(needed_flags & FLAG_CZNV)) dont_care_flags();\n");
|
||||
genastore ("data", curi->dmode, "dstreg", curi->size, "data");
|
||||
}
|
||||
else {
|
||||
if (curi->smode!=immi) {
|
||||
uses_cmov;
|
||||
start_brace();
|
||||
comprintf("\tint highmask;\n");
|
||||
comprintf("\tint zero = scratchie++;\n");
|
||||
comprintf("\tand_l_ri(cnt,63);\n");
|
||||
comprintf("\tmov_l_ri(zero, 0);\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshrl_b_rr(data,cnt);\n"
|
||||
"\thighmask=0x38;\n");
|
||||
break;
|
||||
case sz_word: comprintf("\tshrl_w_rr(data,cnt);\n"
|
||||
"\thighmask=0x30;\n");
|
||||
break;
|
||||
case sz_long: comprintf("\tshrl_l_rr(data,cnt);\n"
|
||||
"\thighmask=0x20;\n");
|
||||
break;
|
||||
case sz_byte:
|
||||
comprintf("\ttest_l_ri(cnt, 0x38);\n");
|
||||
comprintf("\tcmov_l_rr(data, zero, NATIVE_CC_NE);\n");
|
||||
comprintf("\tshrl_b_rr(data,cnt);\n");
|
||||
break;
|
||||
case sz_word:
|
||||
comprintf("\ttest_l_ri(cnt, 0x30);\n");
|
||||
comprintf("\tcmov_l_rr(data, zero, NATIVE_CC_NE);\n");
|
||||
comprintf("\tshrl_w_rr(data,cnt);\n");
|
||||
break;
|
||||
case sz_long:
|
||||
comprintf("\ttest_l_ri(cnt, 0x20);\n");
|
||||
comprintf("\tcmov_l_rr(data, zero, NATIVE_CC_NE);\n");
|
||||
comprintf("\tshrl_l_rr(data, cnt);\n");
|
||||
break;
|
||||
default: assert(0);
|
||||
}
|
||||
comprintf("test_l_ri(cnt,highmask);\n"
|
||||
"mov_l_ri(scratchie,0);\n"
|
||||
"cmov_l_rr(scratchie,data,%d);\n",NATIVE_CC_EQ);
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tmov_b_rr(data,scratchie);\n");break;
|
||||
case sz_word: comprintf("\tmov_w_rr(data,scratchie);\n");break;
|
||||
case sz_long: comprintf("\tmov_l_rr(data,scratchie);\n");break;
|
||||
default: assert(0);
|
||||
}
|
||||
genastore ("data", curi->dmode, "dstreg", curi->size, "data");
|
||||
}
|
||||
/* Result of shift is now in data. */
|
||||
}
|
||||
else {
|
||||
start_brace();
|
||||
comprintf("\tint tmp=scratchie++;\n"
|
||||
"\tint bp;\n"
|
||||
"\tmov_l_rr(tmp,data);\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshrl_b_ri(data,srcreg);\n"
|
||||
"\tbp=srcreg-1;\n"); break;
|
||||
case sz_word: comprintf("\tshrl_w_ri(data,srcreg);\n"
|
||||
"\tbp=srcreg-1;\n"); break;
|
||||
case sz_long: comprintf("\tshrl_l_ri(data,srcreg);\n"
|
||||
"\tbp=srcreg-1;\n"); break;
|
||||
case sz_byte: comprintf("\tshrl_b_ri(data,srcreg);\n"); break;
|
||||
case sz_word: comprintf("\tshrl_w_ri(data,srcreg);\n"); break;
|
||||
case sz_long: comprintf("\tshrl_l_ri(data,srcreg);\n"); break;
|
||||
default: assert(0);
|
||||
}
|
||||
|
||||
if (!noflags) {
|
||||
comprintf("\tstart_needflags();\n");
|
||||
comprintf("\tif (needed_flags & FLAG_ZNV)\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\t test_b_rr(data,data);\n"); break;
|
||||
case sz_word: comprintf("\t test_w_rr(data,data);\n"); break;
|
||||
case sz_long: comprintf("\t test_l_rr(data,data);\n"); break;
|
||||
}
|
||||
comprintf("\t bt_l_ri(tmp,bp);\n"); /* Set C */
|
||||
comprintf("\t live_flags();\n");
|
||||
comprintf("\t end_needflags();\n");
|
||||
comprintf("\t duplicate_carry();\n");
|
||||
comprintf("if (!(needed_flags & FLAG_CZNV)) dont_care_flags();\n");
|
||||
}
|
||||
genastore ("data", curi->dmode, "dstreg", curi->size, "data");
|
||||
}
|
||||
/* And create the flags */
|
||||
if (!noflags) {
|
||||
comprintf("\tlive_flags();\n");
|
||||
comprintf("\tend_needflags();\n");
|
||||
if (curi->smode!=immi)
|
||||
comprintf("\tsetcc_for_cntzero(cnt, data, %d);\n", curi->size == sz_byte ? 1 : curi->size == sz_word ? 2 : 4);
|
||||
else
|
||||
comprintf("\tduplicate_carry();\n");
|
||||
comprintf("if (!(needed_flags & FLAG_CZNV)) dont_care_flags();\n");
|
||||
}
|
||||
genastore ("data", curi->dmode, "dstreg", curi->size, "data");
|
||||
break;
|
||||
|
||||
case i_LSL:
|
||||
@ -2638,128 +2400,55 @@ gen_opcode (unsigned int opcode)
|
||||
|
||||
genamode (curi->smode, "srcreg", curi->size, "cnt", 1, 0);
|
||||
genamode (curi->dmode, "dstreg", curi->size, "data", 1, 0);
|
||||
if (curi->smode!=immi) {
|
||||
if (!noflags) {
|
||||
uses_cmov;
|
||||
start_brace();
|
||||
comprintf("\tint highmask;\n"
|
||||
"\tint cdata=scratchie++;\n"
|
||||
"\tint tmpcnt=scratchie++;\n");
|
||||
comprintf("\tmov_l_rr(tmpcnt,cnt);\n"
|
||||
"\tand_l_ri(tmpcnt,63);\n"
|
||||
"\tmov_l_ri(cdata,0);\n"
|
||||
"\tcmov_l_rr(cdata,data,%d);\n",NATIVE_CC_NE);
|
||||
/* cdata is now either data (for shift count!=0) or
|
||||
0 (for shift count==0) */
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshll_b_rr(data,cnt);\n"
|
||||
"\thighmask=0x38;\n");
|
||||
break;
|
||||
case sz_word: comprintf("\tshll_w_rr(data,cnt);\n"
|
||||
"\thighmask=0x30;\n");
|
||||
break;
|
||||
case sz_long: comprintf("\tshll_l_rr(data,cnt);\n"
|
||||
"\thighmask=0x20;\n");
|
||||
break;
|
||||
default: assert(0);
|
||||
}
|
||||
comprintf("test_l_ri(cnt,highmask);\n"
|
||||
"mov_l_ri(scratchie,0);\n"
|
||||
"cmov_l_rr(scratchie,data,%d);\n",NATIVE_CC_EQ);
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tmov_b_rr(data,scratchie);\n");break;
|
||||
case sz_word: comprintf("\tmov_w_rr(data,scratchie);\n");break;
|
||||
case sz_long: comprintf("\tmov_l_rr(data,scratchie);\n");break;
|
||||
default: assert(0);
|
||||
}
|
||||
/* Result of shift is now in data. Now we need to determine
|
||||
the carry by shifting cdata one less */
|
||||
comprintf("\tsub_l_ri(tmpcnt,1);\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshll_b_rr(cdata,tmpcnt);\n");break;
|
||||
case sz_word: comprintf("\tshll_w_rr(cdata,tmpcnt);\n");break;
|
||||
case sz_long: comprintf("\tshll_l_rr(cdata,tmpcnt);\n");break;
|
||||
default: assert(0);
|
||||
}
|
||||
comprintf("test_l_ri(tmpcnt,highmask);\n"
|
||||
"mov_l_ri(scratchie,0);\n"
|
||||
"cmov_l_rr(cdata,scratchie,%d);\n",NATIVE_CC_NE);
|
||||
/* And create the flags */
|
||||
|
||||
start_brace();
|
||||
if (!noflags)
|
||||
comprintf("\tstart_needflags();\n");
|
||||
comprintf("\tif (needed_flags & FLAG_ZNV)\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\t test_b_rr(data,data);\n");
|
||||
comprintf("\t bt_l_ri(cdata,7);\n"); break;
|
||||
case sz_word: comprintf("\t test_w_rr(data,data);\n");
|
||||
comprintf("\t bt_l_ri(cdata,15);\n"); break;
|
||||
case sz_long: comprintf("\t test_l_rr(data,data);\n");
|
||||
comprintf("\t bt_l_ri(cdata,31);\n"); break;
|
||||
}
|
||||
comprintf("\t live_flags();\n");
|
||||
comprintf("\t end_needflags();\n");
|
||||
comprintf("\t duplicate_carry();\n");
|
||||
comprintf("if (!(needed_flags & FLAG_CZNV)) dont_care_flags();\n");
|
||||
genastore ("data", curi->dmode, "dstreg", curi->size, "data");
|
||||
}
|
||||
else {
|
||||
if (curi->smode!=immi) {
|
||||
uses_cmov;
|
||||
start_brace();
|
||||
comprintf("\tint highmask;\n");
|
||||
comprintf("\tint zero = scratchie++;\n");
|
||||
comprintf("\tand_l_ri(cnt,63);\n");
|
||||
comprintf("\tmov_l_ri(zero, 0);\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshll_b_rr(data,cnt);\n"
|
||||
"\thighmask=0x38;\n");
|
||||
break;
|
||||
case sz_word: comprintf("\tshll_w_rr(data,cnt);\n"
|
||||
"\thighmask=0x30;\n");
|
||||
break;
|
||||
case sz_long: comprintf("\tshll_l_rr(data,cnt);\n"
|
||||
"\thighmask=0x20;\n");
|
||||
break;
|
||||
case sz_byte:
|
||||
comprintf("\ttest_l_ri(cnt, 0x38);\n");
|
||||
comprintf("\tcmov_l_rr(data, zero, NATIVE_CC_NE);\n");
|
||||
comprintf("\tshll_b_rr(data,cnt);\n");
|
||||
break;
|
||||
case sz_word:
|
||||
comprintf("\ttest_l_ri(cnt, 0x30);\n");
|
||||
comprintf("\tcmov_l_rr(data, zero, NATIVE_CC_NE);\n");
|
||||
comprintf("\tshll_w_rr(data,cnt);\n");
|
||||
break;
|
||||
case sz_long:
|
||||
comprintf("\ttest_l_ri(cnt, 0x20);\n");
|
||||
comprintf("\tcmov_l_rr(data, zero, NATIVE_CC_NE);\n");
|
||||
comprintf("\tshll_l_rr(data,cnt);\n");
|
||||
break;
|
||||
default: assert(0);
|
||||
}
|
||||
comprintf("test_l_ri(cnt,highmask);\n"
|
||||
"mov_l_ri(scratchie,0);\n"
|
||||
"cmov_l_rr(scratchie,data,%d);\n",NATIVE_CC_EQ);
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tmov_b_rr(data,scratchie);\n");break;
|
||||
case sz_word: comprintf("\tmov_w_rr(data,scratchie);\n");break;
|
||||
case sz_long: comprintf("\tmov_l_rr(data,scratchie);\n");break;
|
||||
default: assert(0);
|
||||
}
|
||||
genastore ("data", curi->dmode, "dstreg", curi->size, "data");
|
||||
}
|
||||
/* Result of shift is now in data. */
|
||||
}
|
||||
else {
|
||||
start_brace();
|
||||
comprintf("\tint tmp=scratchie++;\n"
|
||||
"\tint bp;\n"
|
||||
"\tmov_l_rr(tmp,data);\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\tshll_b_ri(data,srcreg);\n"
|
||||
"\tbp=8-srcreg;\n"); break;
|
||||
case sz_word: comprintf("\tshll_w_ri(data,srcreg);\n"
|
||||
"\tbp=16-srcreg;\n"); break;
|
||||
case sz_long: comprintf("\tshll_l_ri(data,srcreg);\n"
|
||||
"\tbp=32-srcreg;\n"); break;
|
||||
case sz_byte: comprintf("\tshll_b_ri(data,srcreg);\n"); break;
|
||||
case sz_word: comprintf("\tshll_w_ri(data,srcreg);\n"); break;
|
||||
case sz_long: comprintf("\tshll_l_ri(data,srcreg);\n"); break;
|
||||
default: assert(0);
|
||||
}
|
||||
|
||||
if (!noflags) {
|
||||
comprintf("\tstart_needflags();\n");
|
||||
comprintf("\tif (needed_flags & FLAG_ZNV)\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\t test_b_rr(data,data);\n"); break;
|
||||
case sz_word: comprintf("\t test_w_rr(data,data);\n"); break;
|
||||
case sz_long: comprintf("\t test_l_rr(data,data);\n"); break;
|
||||
}
|
||||
comprintf("\t bt_l_ri(tmp,bp);\n"); /* Set C */
|
||||
comprintf("\t live_flags();\n");
|
||||
comprintf("\t end_needflags();\n");
|
||||
comprintf("\t duplicate_carry();\n");
|
||||
comprintf("if (!(needed_flags & FLAG_CZNV)) dont_care_flags();\n");
|
||||
}
|
||||
genastore ("data", curi->dmode, "dstreg", curi->size, "data");
|
||||
}
|
||||
/* And create the flags */
|
||||
if (!noflags) {
|
||||
comprintf("\tlive_flags();\n");
|
||||
comprintf("\tend_needflags();\n");
|
||||
if (curi->smode!=immi)
|
||||
comprintf("\tsetcc_for_cntzero(cnt, data, %d);\n", curi->size == sz_byte ? 1 : curi->size == sz_word ? 2 : 4);
|
||||
else
|
||||
comprintf("\tduplicate_carry();\n");
|
||||
comprintf("if (!(needed_flags & FLAG_CZNV)) dont_care_flags();\n");
|
||||
}
|
||||
genastore ("data", curi->dmode, "dstreg", curi->size, "data");
|
||||
break;
|
||||
|
||||
case i_ROL:
|
||||
@ -2787,6 +2476,9 @@ gen_opcode (unsigned int opcode)
|
||||
|
||||
if (!noflags) {
|
||||
comprintf("\tstart_needflags();\n");
|
||||
/*
|
||||
* x86 ROL instruction does not set ZF/SF, so we need extra checks here
|
||||
*/
|
||||
comprintf("\tif (needed_flags & FLAG_ZNV)\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\t test_b_rr(data,data);\n"); break;
|
||||
@ -2825,6 +2517,9 @@ gen_opcode (unsigned int opcode)
|
||||
|
||||
if (!noflags) {
|
||||
comprintf("\tstart_needflags();\n");
|
||||
/*
|
||||
* x86 ROR instruction does not set ZF/SF, so we need extra checks here
|
||||
*/
|
||||
comprintf("\tif (needed_flags & FLAG_ZNV)\n");
|
||||
switch(curi->size) {
|
||||
case sz_byte: comprintf("\t test_b_rr(data,data);\n"); break;
|
||||
@ -3133,7 +2828,7 @@ generate_includes (FILE * f)
|
||||
fprintf (f, "#include \"sysdeps.h\"\n");
|
||||
#ifdef UAE
|
||||
fprintf (f, "#include \"options.h\"\n");
|
||||
fprintf (f, "#include \"memory.h\"\n");
|
||||
fprintf (f, "#include \"uae/memory.h\"\n");
|
||||
#else
|
||||
fprintf (f, "#include \"m68k.h\"\n");
|
||||
fprintf (f, "#include \"memory.h\"\n");
|
||||
@ -3147,7 +2842,6 @@ generate_includes (FILE * f)
|
||||
static int postfix;
|
||||
|
||||
|
||||
#ifdef UAE
|
||||
static char *decodeEA (amodes mode, wordsizes size)
|
||||
{
|
||||
static char buffer[80];
|
||||
@ -3221,22 +2915,13 @@ static char *decodeEA (amodes mode, wordsizes size)
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static char *outopcode (int opcode)
|
||||
static char *outopcode (const char *name, int opcode)
|
||||
{
|
||||
static char out[100];
|
||||
struct instr *ins;
|
||||
int i;
|
||||
|
||||
ins = &table68k[opcode];
|
||||
for (i = 0; lookuptab[i].name[0]; i++) {
|
||||
if (ins->mnemo == lookuptab[i].mnemo)
|
||||
break;
|
||||
}
|
||||
{
|
||||
char *s = ua (lookuptab[i].name);
|
||||
strcpy (out, s);
|
||||
xfree (s);
|
||||
}
|
||||
strcpy (out, name);
|
||||
if (ins->smode == immi)
|
||||
strcat (out, "Q");
|
||||
if (ins->size == sz_byte)
|
||||
@ -3254,7 +2939,6 @@ static char *outopcode (int opcode)
|
||||
}
|
||||
return out;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static void
|
||||
@ -3266,11 +2950,7 @@ generate_one_opcode (int rp, int noflags)
|
||||
int aborted=0;
|
||||
int have_srcreg=0;
|
||||
int have_dstreg=0;
|
||||
#ifdef UAE
|
||||
char *name;
|
||||
#else
|
||||
const char *name;
|
||||
#endif
|
||||
|
||||
if (table68k[opcode].mnemo == i_ILLG
|
||||
|| table68k[opcode].clev > cpu_level)
|
||||
@ -3459,34 +3139,23 @@ generate_one_opcode (int rp, int noflags)
|
||||
else
|
||||
strcpy(flags, "0");
|
||||
|
||||
#ifdef UAE
|
||||
#ifdef UAE /* RETTYPE != void */
|
||||
comprintf ("return 0;\n");
|
||||
#endif
|
||||
comprintf ("}\n");
|
||||
|
||||
#ifdef UAE
|
||||
name = ua (lookuptab[i].name);
|
||||
#else
|
||||
name = lookuptab[i].name;
|
||||
#endif
|
||||
if (aborted) {
|
||||
fprintf (stblfile, "{ NULL, %u, %s }, /* %s */\n", opcode, flags, name);
|
||||
com_discard();
|
||||
} else {
|
||||
const char *tbl = noflags ? "nf" : "ff";
|
||||
#ifdef UAE
|
||||
printf ("/* %s */\n", outopcode (opcode));
|
||||
#else
|
||||
printf ("/* %s */\n", name);
|
||||
#endif
|
||||
fprintf (stblfile, "{ op_%x_%d_comp_%s, %u, %s }, /* %s */\n", opcode, postfix, tbl, opcode, flags, name);
|
||||
fprintf (headerfile, "extern compop_func op_%x_%d_comp_%s;\n", opcode, postfix, tbl);
|
||||
printf (RETTYPE " REGPARAM2 op_%x_%d_comp_%s(uae_u32 opcode)\n{\n", opcode, postfix, tbl);
|
||||
printf ("/* %s */\n", outopcode (name, opcode));
|
||||
printf (RETTYPE " REGPARAM2 op_%x_%d_comp_%s(uae_u32 opcode) /* %s */\n{\n", opcode, postfix, tbl, name);
|
||||
com_flush();
|
||||
}
|
||||
#ifdef UAE
|
||||
xfree (name);
|
||||
#endif
|
||||
}
|
||||
opcode_next_clev[rp] = next_cpu_level;
|
||||
opcode_last_postfix[rp] = postfix;
|
||||
@ -3552,7 +3221,12 @@ void cygwin_mingw_abort()
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(FSUAE) && defined (WINDOWS)
|
||||
#include "windows.h"
|
||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
|
||||
#else
|
||||
int main(void)
|
||||
#endif
|
||||
{
|
||||
read_table68k ();
|
||||
do_merges ();
|
||||
@ -3582,6 +3256,7 @@ int main(void)
|
||||
generate_includes (stblfile);
|
||||
|
||||
printf("#include \"" JIT_PATH "compemu.h\"\n");
|
||||
printf("#include \"" JIT_PATH "flags_x86.h\"\n");
|
||||
|
||||
noflags=0;
|
||||
generate_func (noflags);
|
||||
|
@ -677,6 +677,7 @@ static void gen_move16(uae_u32 opcode, struct instr *curi) {
|
||||
else if ((opcode & 0xfff8) == 0xf608)
|
||||
comprintf("\tarm_ADD_l_ri8(dstreg+8,16);\n");
|
||||
|
||||
start_brace();
|
||||
comprintf("\tint tmp=scratchie;\n");
|
||||
comprintf("\tscratchie+=4;\n");
|
||||
|
||||
@ -693,6 +694,7 @@ static void gen_move16(uae_u32 opcode, struct instr *curi) {
|
||||
"\tmov_l_Rr(dst,tmp+2,8);\n"
|
||||
"\tforget_about(tmp+2);\n"
|
||||
"\tmov_l_Rr(dst,tmp+3,12);\n");
|
||||
close_brace();
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -4632,10 +4634,10 @@ gen_opcode(unsigned long int opcode) {
|
||||
failure;
|
||||
break;
|
||||
|
||||
case i_NATFEAT_ID:
|
||||
case i_NATFEAT_CALL:
|
||||
failure;
|
||||
break;
|
||||
// case i_NATFEAT_ID:
|
||||
// case i_NATFEAT_CALL:
|
||||
// failure;
|
||||
// break;
|
||||
|
||||
case i_MMUOP:
|
||||
isjump;
|
||||
@ -4665,6 +4667,105 @@ static void generate_includes(FILE * f) {
|
||||
|
||||
static int postfix;
|
||||
|
||||
static char *decodeEA (amodes mode, wordsizes size)
|
||||
{
|
||||
static char buffer[80];
|
||||
|
||||
buffer[0] = 0;
|
||||
switch (mode){
|
||||
case Dreg:
|
||||
strcpy (buffer,"Dn");
|
||||
break;
|
||||
case Areg:
|
||||
strcpy (buffer,"An");
|
||||
break;
|
||||
case Aind:
|
||||
strcpy (buffer,"(An)");
|
||||
break;
|
||||
case Aipi:
|
||||
strcpy (buffer,"(An)+");
|
||||
break;
|
||||
case Apdi:
|
||||
strcpy (buffer,"-(An)");
|
||||
break;
|
||||
case Ad16:
|
||||
strcpy (buffer,"(d16,An)");
|
||||
break;
|
||||
case Ad8r:
|
||||
strcpy (buffer,"(d8,An,Xn)");
|
||||
break;
|
||||
case PC16:
|
||||
strcpy (buffer,"(d16,PC)");
|
||||
break;
|
||||
case PC8r:
|
||||
strcpy (buffer,"(d8,PC,Xn)");
|
||||
break;
|
||||
case absw:
|
||||
strcpy (buffer,"(xxx).W");
|
||||
break;
|
||||
case absl:
|
||||
strcpy (buffer,"(xxx).L");
|
||||
break;
|
||||
case imm:
|
||||
switch (size){
|
||||
case sz_byte:
|
||||
strcpy (buffer,"#<data>.B");
|
||||
break;
|
||||
case sz_word:
|
||||
strcpy (buffer,"#<data>.W");
|
||||
break;
|
||||
case sz_long:
|
||||
strcpy (buffer,"#<data>.L");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case imm0:
|
||||
strcpy (buffer,"#<data>.B");
|
||||
break;
|
||||
case imm1:
|
||||
strcpy (buffer,"#<data>.W");
|
||||
break;
|
||||
case imm2:
|
||||
strcpy (buffer,"#<data>.L");
|
||||
break;
|
||||
case immi:
|
||||
strcpy (buffer,"#<data>");
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
|
||||
static char *outopcode (const char *name, int opcode)
|
||||
{
|
||||
static char out[100];
|
||||
struct instr *ins;
|
||||
|
||||
ins = &table68k[opcode];
|
||||
strcpy (out, name);
|
||||
if (ins->smode == immi)
|
||||
strcat (out, "Q");
|
||||
if (ins->size == sz_byte)
|
||||
strcat (out,".B");
|
||||
if (ins->size == sz_word)
|
||||
strcat (out,".W");
|
||||
if (ins->size == sz_long)
|
||||
strcat (out,".L");
|
||||
strcat (out," ");
|
||||
if (ins->suse)
|
||||
strcat (out, decodeEA (ins->smode, ins->size));
|
||||
if (ins->duse) {
|
||||
if (ins->suse) strcat (out,",");
|
||||
strcat (out, decodeEA (ins->dmode, ins->size));
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
static void generate_one_opcode(int rp, int noflags) {
|
||||
int i;
|
||||
uae_u16 smsk, dmsk;
|
||||
@ -4858,6 +4959,7 @@ static void generate_one_opcode(int rp, int noflags) {
|
||||
opcode, postfix, tbl, opcode, flags, name);
|
||||
fprintf(headerfile, "extern compop_func op_%x_%d_comp_%s;\n",
|
||||
opcode, postfix, tbl);
|
||||
printf ("/* %s */\n", outopcode (name, opcode));
|
||||
printf(
|
||||
"void REGPARAM2 op_%x_%d_comp_%s(uae_u32 opcode) /* %s */\n{\n",
|
||||
opcode, postfix, tbl, name);
|
||||
|
@ -582,7 +582,7 @@ static void genmovemle (uae_u16 opcode)
|
||||
|
||||
static void duplicate_carry (void)
|
||||
{
|
||||
printf ("\tCOPY_CARRY;\n");
|
||||
printf ("\tCOPY_CARRY();\n");
|
||||
}
|
||||
|
||||
typedef enum {
|
||||
@ -682,7 +682,7 @@ static void genflags_normal (flagtypes type, wordsizes size, char *value, char *
|
||||
|
||||
switch (type) {
|
||||
case flag_logical:
|
||||
printf ("\tCLEAR_CZNV;\n");
|
||||
printf ("\tCLEAR_CZNV();\n");
|
||||
printf ("\tSET_ZFLG (%s == 0);\n", vstr);
|
||||
printf ("\tSET_NFLG (%s < 0);\n", vstr);
|
||||
break;
|
||||
@ -697,10 +697,10 @@ static void genflags_normal (flagtypes type, wordsizes size, char *value, char *
|
||||
printf ("\tSET_VFLG ((flgs ^ flgo) & (flgn ^ flgo));\n");
|
||||
break;
|
||||
case flag_z:
|
||||
printf ("\tSET_ZFLG (GET_ZFLG & (%s == 0));\n", vstr);
|
||||
printf ("\tSET_ZFLG (GET_ZFLG() & (%s == 0));\n", vstr);
|
||||
break;
|
||||
case flag_zn:
|
||||
printf ("\tSET_ZFLG (GET_ZFLG & (%s == 0));\n", vstr);
|
||||
printf ("\tSET_ZFLG (GET_ZFLG() & (%s == 0));\n", vstr);
|
||||
printf ("\tSET_NFLG (%s < 0);\n", vstr);
|
||||
break;
|
||||
case flag_add:
|
||||
@ -926,7 +926,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
|
||||
genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
|
||||
start_brace ();
|
||||
printf ("\tuae_u32 newv = dst - src - (GET_XFLG ? 1 : 0);\n");
|
||||
printf ("\tuae_u32 newv = dst - src - (GET_XFLG() ? 1 : 0);\n");
|
||||
genflags (flag_subx, curi->size, "newv", "src", "dst");
|
||||
genflags (flag_zn, curi->size, "newv", "", "");
|
||||
genastore ("newv", curi->dmode, "dstreg", curi->size, "dst");
|
||||
@ -935,14 +935,14 @@ static void gen_opcode (unsigned long int opcode)
|
||||
genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
|
||||
genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
|
||||
start_brace ();
|
||||
printf ("\tuae_u16 newv_lo = (dst & 0xF) - (src & 0xF) - (GET_XFLG ? 1 : 0);\n");
|
||||
printf ("\tuae_u16 newv_lo = (dst & 0xF) - (src & 0xF) - (GET_XFLG() ? 1 : 0);\n");
|
||||
printf ("\tuae_u16 newv_hi = (dst & 0xF0) - (src & 0xF0);\n");
|
||||
printf ("\tuae_u16 newv, tmp_newv;\n");
|
||||
printf ("\tint bcd = 0;\n");
|
||||
printf ("\tnewv = tmp_newv = newv_hi + newv_lo;\n");
|
||||
printf ("\tif (newv_lo & 0xF0) { newv -= 6; bcd = 6; };\n");
|
||||
printf ("\tif ((((dst & 0xFF) - (src & 0xFF) - (GET_XFLG ? 1 : 0)) & 0x100) > 0xFF) { newv -= 0x60; }\n");
|
||||
printf ("\tSET_CFLG ((((dst & 0xFF) - (src & 0xFF) - bcd - (GET_XFLG ? 1 : 0)) & 0x300) > 0xFF);\n");
|
||||
printf ("\tif ((((dst & 0xFF) - (src & 0xFF) - (GET_XFLG() ? 1 : 0)) & 0x100) > 0xFF) { newv -= 0x60; }\n");
|
||||
printf ("\tSET_CFLG ((((dst & 0xFF) - (src & 0xFF) - bcd - (GET_XFLG() ? 1 : 0)) & 0x300) > 0xFF);\n");
|
||||
duplicate_carry ();
|
||||
/* Manual says bits NV are undefined though a real 68040 don't change them */
|
||||
if (cpu_level >= xBCD_KEEPS_NV_FLAGS) {
|
||||
@ -974,7 +974,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
|
||||
genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
|
||||
start_brace ();
|
||||
printf ("\tuae_u32 newv = dst + src + (GET_XFLG ? 1 : 0);\n");
|
||||
printf ("\tuae_u32 newv = dst + src + (GET_XFLG() ? 1 : 0);\n");
|
||||
genflags (flag_addx, curi->size, "newv", "src", "dst");
|
||||
genflags (flag_zn, curi->size, "newv", "", "");
|
||||
genastore ("newv", curi->dmode, "dstreg", curi->size, "dst");
|
||||
@ -983,7 +983,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
|
||||
genamode (curi->dmode, "dstreg", curi->size, "dst", 1, 0);
|
||||
start_brace ();
|
||||
printf ("\tuae_u16 newv_lo = (src & 0xF) + (dst & 0xF) + (GET_XFLG ? 1 : 0);\n");
|
||||
printf ("\tuae_u16 newv_lo = (src & 0xF) + (dst & 0xF) + (GET_XFLG() ? 1 : 0);\n");
|
||||
printf ("\tuae_u16 newv_hi = (src & 0xF0) + (dst & 0xF0);\n");
|
||||
printf ("\tuae_u16 newv, tmp_newv;\n");
|
||||
printf ("\tint cflg;\n");
|
||||
@ -1014,7 +1014,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
case i_NEGX:
|
||||
genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
|
||||
start_brace ();
|
||||
printf ("\tuae_u32 newv = 0 - src - (GET_XFLG ? 1 : 0);\n");
|
||||
printf ("\tuae_u32 newv = 0 - src - (GET_XFLG() ? 1 : 0);\n");
|
||||
genflags (flag_subx, curi->size, "newv", "src", "0");
|
||||
genflags (flag_zn, curi->size, "newv", "", "");
|
||||
genastore ("newv", curi->smode, "srcreg", curi->size, "src");
|
||||
@ -1022,7 +1022,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
case i_NBCD:
|
||||
genamode (curi->smode, "srcreg", curi->size, "src", 1, 0);
|
||||
start_brace ();
|
||||
printf ("\tuae_u16 newv_lo = - (src & 0xF) - (GET_XFLG ? 1 : 0);\n");
|
||||
printf ("\tuae_u16 newv_lo = - (src & 0xF) - (GET_XFLG() ? 1 : 0);\n");
|
||||
printf ("\tuae_u16 newv_hi = - (src & 0xF0);\n");
|
||||
printf ("\tuae_u16 newv;\n");
|
||||
printf ("\tint cflg;\n");
|
||||
@ -1295,7 +1295,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
break;
|
||||
case i_TRAPV:
|
||||
sync_m68k_pc ();
|
||||
printf ("\tif (GET_VFLG) { Exception(7,m68k_getpc()); goto %s; }\n", endlabelstr);
|
||||
printf ("\tif (GET_VFLG()) { Exception(7,m68k_getpc()); goto %s; }\n", endlabelstr);
|
||||
need_endlabel = 1;
|
||||
break;
|
||||
case i_RTR:
|
||||
@ -1505,7 +1505,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
}
|
||||
printf ("\tSET_ZFLG (upper == reg || lower == reg);\n");
|
||||
printf ("\tSET_CFLG_ALWAYS (lower <= upper ? reg < lower || reg > upper : reg > upper || reg < lower);\n");
|
||||
printf ("\tif ((extra & 0x800) && GET_CFLG) { Exception(6,oldpc); goto %s; }\n}\n", endlabelstr);
|
||||
printf ("\tif ((extra & 0x800) && GET_CFLG()) { Exception(6,oldpc); goto %s; }\n}\n", endlabelstr);
|
||||
need_endlabel = 1;
|
||||
break;
|
||||
|
||||
@ -1521,7 +1521,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
}
|
||||
printf ("\tuae_u32 sign = (%s & val) >> %d;\n", cmask (curi->size), bit_size (curi->size) - 1);
|
||||
printf ("\tcnt &= 63;\n");
|
||||
printf ("\tCLEAR_CZNV;\n");
|
||||
printf ("\tCLEAR_CZNV();\n");
|
||||
printf ("\tif (cnt >= %d) {\n", bit_size (curi->size));
|
||||
printf ("\t\tval = %s & (uae_u32)-(uae_s32)sign;\n", bit_mask (curi->size));
|
||||
printf ("\t\tSET_CFLG (sign);\n");
|
||||
@ -1553,7 +1553,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
default: abort ();
|
||||
}
|
||||
printf ("\tcnt &= 63;\n");
|
||||
printf ("\tCLEAR_CZNV;\n");
|
||||
printf ("\tCLEAR_CZNV();\n");
|
||||
printf ("\tif (cnt >= %d) {\n", bit_size (curi->size));
|
||||
printf ("\t\tSET_VFLG (val != 0);\n");
|
||||
printf ("\t\tSET_CFLG (cnt == %d ? val & 1 : 0);\n",
|
||||
@ -1589,7 +1589,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
default: abort ();
|
||||
}
|
||||
printf ("\tcnt &= 63;\n");
|
||||
printf ("\tCLEAR_CZNV;\n");
|
||||
printf ("\tCLEAR_CZNV();\n");
|
||||
printf ("\tif (cnt >= %d) {\n", bit_size (curi->size));
|
||||
printf ("\t\tSET_CFLG ((cnt == %d) & (val >> %d));\n",
|
||||
bit_size (curi->size), bit_size (curi->size) - 1);
|
||||
@ -1618,7 +1618,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
default: abort ();
|
||||
}
|
||||
printf ("\tcnt &= 63;\n");
|
||||
printf ("\tCLEAR_CZNV;\n");
|
||||
printf ("\tCLEAR_CZNV();\n");
|
||||
printf ("\tif (cnt >= %d) {\n", bit_size (curi->size));
|
||||
printf ("\t\tSET_CFLG (cnt == %d ? val & 1 : 0);\n",
|
||||
bit_size (curi->size));
|
||||
@ -1648,7 +1648,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
default: abort ();
|
||||
}
|
||||
printf ("\tcnt &= 63;\n");
|
||||
printf ("\tCLEAR_CZNV;\n");
|
||||
printf ("\tCLEAR_CZNV();\n");
|
||||
if (source_is_imm1_8 (curi))
|
||||
printf ("{");
|
||||
else
|
||||
@ -1675,7 +1675,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
default: abort ();
|
||||
}
|
||||
printf ("\tcnt &= 63;\n");
|
||||
printf ("\tCLEAR_CZNV;\n");
|
||||
printf ("\tCLEAR_CZNV();\n");
|
||||
if (source_is_imm1_8 (curi))
|
||||
printf ("{");
|
||||
else
|
||||
@ -1702,7 +1702,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
default: abort ();
|
||||
}
|
||||
printf ("\tcnt &= 63;\n");
|
||||
printf ("\tCLEAR_CZNV;\n");
|
||||
printf ("\tCLEAR_CZNV();\n");
|
||||
if (source_is_imm1_8 (curi))
|
||||
printf ("{");
|
||||
else {
|
||||
@ -1713,11 +1713,11 @@ static void gen_opcode (unsigned long int opcode)
|
||||
printf ("\t{\n\tuae_u32 carry;\n");
|
||||
printf ("\tuae_u32 loval = val >> (%d - cnt);\n", bit_size (curi->size) - 1);
|
||||
printf ("\tcarry = loval & 1;\n");
|
||||
printf ("\tval = (((val << 1) | GET_XFLG) << cnt) | (loval >> 1);\n");
|
||||
printf ("\tval = (((val << 1) | GET_XFLG()) << cnt) | (loval >> 1);\n");
|
||||
printf ("\tSET_XFLG (carry);\n");
|
||||
printf ("\tval &= %s;\n", bit_mask (curi->size));
|
||||
printf ("\t} }\n");
|
||||
printf ("\tSET_CFLG (GET_XFLG);\n");
|
||||
printf ("\tSET_CFLG (GET_XFLG());\n");
|
||||
genflags (flag_logical_noclobber, curi->size, "val", "", "");
|
||||
genastore ("val", curi->dmode, "dstreg", curi->size, "data");
|
||||
break;
|
||||
@ -1732,7 +1732,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
default: abort ();
|
||||
}
|
||||
printf ("\tcnt &= 63;\n");
|
||||
printf ("\tCLEAR_CZNV;\n");
|
||||
printf ("\tCLEAR_CZNV();\n");
|
||||
if (source_is_imm1_8 (curi))
|
||||
printf ("{");
|
||||
else {
|
||||
@ -1741,7 +1741,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
}
|
||||
printf ("\tcnt--;\n");
|
||||
printf ("\t{\n\tuae_u32 carry;\n");
|
||||
printf ("\tuae_u32 hival = (val << 1) | GET_XFLG;\n");
|
||||
printf ("\tuae_u32 hival = (val << 1) | GET_XFLG();\n");
|
||||
printf ("\thival <<= (%d - cnt);\n", bit_size (curi->size) - 1);
|
||||
printf ("\tval >>= cnt;\n");
|
||||
printf ("\tcarry = val & 1;\n");
|
||||
@ -1750,7 +1750,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
printf ("\tSET_XFLG (carry);\n");
|
||||
printf ("\tval &= %s;\n", bit_mask (curi->size));
|
||||
printf ("\t} }\n");
|
||||
printf ("\tSET_CFLG (GET_XFLG);\n");
|
||||
printf ("\tSET_CFLG (GET_XFLG());\n");
|
||||
genflags (flag_logical_noclobber, curi->size, "val", "", "");
|
||||
genastore ("val", curi->dmode, "dstreg", curi->size, "data");
|
||||
break;
|
||||
@ -1788,7 +1788,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
printf ("\tSET_CFLG (sign != 0);\n");
|
||||
duplicate_carry ();
|
||||
|
||||
printf ("\tSET_VFLG (GET_VFLG | (sign2 != sign));\n");
|
||||
printf ("\tSET_VFLG (GET_VFLG() | (sign2 != sign));\n");
|
||||
genastore ("val", curi->smode, "srcreg", curi->size, "data");
|
||||
break;
|
||||
case i_LSRW:
|
||||
@ -1866,7 +1866,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
}
|
||||
printf ("\tuae_u32 carry = val & %s;\n", cmask (curi->size));
|
||||
printf ("\tval <<= 1;\n");
|
||||
printf ("\tif (GET_XFLG) val |= 1;\n");
|
||||
printf ("\tif (GET_XFLG()) val |= 1;\n");
|
||||
genflags (flag_logical, curi->size, "val", "", "");
|
||||
printf ("SET_CFLG (carry >> %d);\n", bit_size (curi->size) - 1);
|
||||
duplicate_carry ();
|
||||
@ -1883,7 +1883,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
}
|
||||
printf ("\tuae_u32 carry = val & 1;\n");
|
||||
printf ("\tval >>= 1;\n");
|
||||
printf ("\tif (GET_XFLG) val |= %s;\n", cmask (curi->size));
|
||||
printf ("\tif (GET_XFLG()) val |= %s;\n", cmask (curi->size));
|
||||
genflags (flag_logical, curi->size, "val", "", "");
|
||||
printf ("SET_CFLG (carry);\n");
|
||||
duplicate_carry ();
|
||||
@ -1912,7 +1912,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
printf ("\tint ru = (src >> 6) & 7;\n");
|
||||
printf ("\tint rc = src & 7;\n");
|
||||
genflags (flag_cmp, curi->size, "newv", "m68k_dreg(regs, rc)", "dst");
|
||||
printf ("\tif (GET_ZFLG)");
|
||||
printf ("\tif (GET_ZFLG())");
|
||||
old_brace_level = n_braces;
|
||||
start_brace ();
|
||||
genastore ("(m68k_dreg(regs, ru))", curi->dmode, "dstreg", curi->size, "dst");
|
||||
@ -1931,14 +1931,14 @@ static void gen_opcode (unsigned long int opcode)
|
||||
int old_brace_level = n_braces;
|
||||
printf ("\tuae_u16 dst1 = get_word(rn1), dst2 = get_word(rn2);\n");
|
||||
genflags (flag_cmp, curi->size, "newv", "m68k_dreg(regs, (extra >> 16) & 7)", "dst1");
|
||||
printf ("\tif (GET_ZFLG) {\n");
|
||||
printf ("\tif (GET_ZFLG()) {\n");
|
||||
genflags (flag_cmp, curi->size, "newv", "m68k_dreg(regs, extra & 7)", "dst2");
|
||||
printf ("\tif (GET_ZFLG) {\n");
|
||||
printf ("\tif (GET_ZFLG()) {\n");
|
||||
printf ("\tput_word(rn1, m68k_dreg(regs, (extra >> 22) & 7));\n");
|
||||
printf ("\tput_word(rn1, m68k_dreg(regs, (extra >> 6) & 7));\n");
|
||||
printf ("\t}}\n");
|
||||
pop_braces (old_brace_level);
|
||||
printf ("\tif (! GET_ZFLG) {\n");
|
||||
printf ("\tif (! GET_ZFLG()) {\n");
|
||||
printf ("\tm68k_dreg(regs, (extra >> 22) & 7) = (m68k_dreg(regs, (extra >> 22) & 7) & ~0xffff) | (dst1 & 0xffff);\n");
|
||||
printf ("\tm68k_dreg(regs, (extra >> 6) & 7) = (m68k_dreg(regs, (extra >> 6) & 7) & ~0xffff) | (dst2 & 0xffff);\n");
|
||||
printf ("\t}\n");
|
||||
@ -1946,14 +1946,14 @@ static void gen_opcode (unsigned long int opcode)
|
||||
int old_brace_level = n_braces;
|
||||
printf ("\tuae_u32 dst1 = get_long(rn1), dst2 = get_long(rn2);\n");
|
||||
genflags (flag_cmp, curi->size, "newv", "m68k_dreg(regs, (extra >> 16) & 7)", "dst1");
|
||||
printf ("\tif (GET_ZFLG) {\n");
|
||||
printf ("\tif (GET_ZFLG()) {\n");
|
||||
genflags (flag_cmp, curi->size, "newv", "m68k_dreg(regs, extra & 7)", "dst2");
|
||||
printf ("\tif (GET_ZFLG) {\n");
|
||||
printf ("\tif (GET_ZFLG()) {\n");
|
||||
printf ("\tput_long(rn1, m68k_dreg(regs, (extra >> 22) & 7));\n");
|
||||
printf ("\tput_long(rn1, m68k_dreg(regs, (extra >> 6) & 7));\n");
|
||||
printf ("\t}}\n");
|
||||
pop_braces (old_brace_level);
|
||||
printf ("\tif (! GET_ZFLG) {\n");
|
||||
printf ("\tif (! GET_ZFLG()) {\n");
|
||||
printf ("\tm68k_dreg(regs, (extra >> 22) & 7) = dst1;\n");
|
||||
printf ("\tm68k_dreg(regs, (extra >> 6) & 7) = dst2;\n");
|
||||
printf ("\t}\n");
|
||||
@ -2053,7 +2053,7 @@ static void gen_opcode (unsigned long int opcode)
|
||||
printf ("\ttmp = ~tmp;\n");
|
||||
break;
|
||||
case i_BFEXTS:
|
||||
printf ("\tif (GET_NFLG) tmp |= width == 32 ? 0 : (-1 << width);\n");
|
||||
printf ("\tif (GET_NFLG()) tmp |= width == 32 ? 0 : (-1 << width);\n");
|
||||
printf ("\tm68k_dreg(regs, (extra >> 12) & 7) = tmp;\n");
|
||||
break;
|
||||
case i_BFCLR:
|
||||
@ -2185,18 +2185,40 @@ static void gen_opcode (unsigned long int opcode)
|
||||
printf ("\tfpuop_restore(opcode);\n");
|
||||
break;
|
||||
case i_CINVL:
|
||||
printf("\n#ifdef USE_JIT\n");
|
||||
printf ("\tif (opcode&0x80)\n"
|
||||
"\t\tflush_icache();\n");
|
||||
printf("#endif\n");
|
||||
break;
|
||||
case i_CINVP:
|
||||
printf("\n#ifdef USE_JIT\n");
|
||||
printf ("\tif (opcode&0x80)\n"
|
||||
"\t\tflush_icache();\n");
|
||||
printf("#endif\n");
|
||||
break;
|
||||
case i_CINVA:
|
||||
/* gb-- srcreg now contains the cache field */
|
||||
printf ("\tif (srcreg&0x2)\n");
|
||||
printf ("\t\tflush_icache(%d);\n", 30 + ((opcode >> 3) & 3));
|
||||
printf("\n#ifdef USE_JIT\n");
|
||||
printf ("\tif (opcode&0x80)\n"
|
||||
"\t\tflush_icache();\n");
|
||||
printf("#endif\n");
|
||||
break;
|
||||
case i_CPUSHL:
|
||||
printf("\n#ifdef USE_JIT\n");
|
||||
printf ("\tif (opcode&0x80)\n"
|
||||
"\t\tflush_icache();\n");
|
||||
printf("#endif\n");
|
||||
break;
|
||||
case i_CPUSHP:
|
||||
printf("\n#ifdef USE_JIT\n");
|
||||
printf ("\tif (opcode&0x80)\n"
|
||||
"\t\tflush_icache();\n");
|
||||
printf("#endif\n");
|
||||
break;
|
||||
case i_CPUSHA:
|
||||
/* gb-- srcreg now contains the cache field */
|
||||
printf ("\tif (srcreg&0x2)\n");
|
||||
printf ("\t\tflush_icache(%d);\n", 40 + ((opcode >> 3) & 3));
|
||||
printf("\n#ifdef USE_JIT\n");
|
||||
printf ("\tif (opcode&0x80)\n"
|
||||
"\t\tflush_icache();\n");
|
||||
printf("#endif\n");
|
||||
break;
|
||||
case i_MOVE16:
|
||||
if ((opcode & 0xfff8) == 0xf620) {
|
||||
|
@ -25,67 +25,108 @@
|
||||
|
||||
#ifdef OPTIMIZED_FLAGS
|
||||
|
||||
#if defined(X86_ASSEMBLY) || defined(X86_64_ASSEMBLY) || defined(MSVC_INTRINSICS)
|
||||
#if (defined(CPU_i386) && defined(X86_ASSEMBLY)) || (defined(CPU_x86_64) && defined(X86_64_ASSEMBLY))
|
||||
|
||||
# include <cstdlib>
|
||||
|
||||
#ifndef SAHF_SETO_PROFITABLE
|
||||
|
||||
/*
|
||||
* Machine dependent structure for holding the 68k CCR flags
|
||||
*/
|
||||
/* PUSH/POP instructions are naturally 64-bit sized on x86-64, thus
|
||||
unsigned long hereunder is either 64-bit or 32-bit wide depending
|
||||
on the target. */
|
||||
struct flag_struct {
|
||||
unsigned long cznv;
|
||||
unsigned long x;
|
||||
#if defined(CPU_x86_64)
|
||||
uint64 cznv;
|
||||
uint64 x;
|
||||
#else
|
||||
uint32 cznv;
|
||||
uint32 x;
|
||||
#endif
|
||||
};
|
||||
|
||||
#define FLAGVAL_Z 0x40
|
||||
#define FLAGVAL_N 0x80
|
||||
/*
|
||||
* The bits in the cznv field in the above structure are assigned to
|
||||
* allow the easy mirroring of the x86 rFLAGS register.
|
||||
*
|
||||
* The 68k CZNV flags are thus assigned in cznv as:
|
||||
*
|
||||
* 76543210 FEDCBA98 --------- ---------
|
||||
* SZxxxxxC xxxxVxxx xxxxxxxxx xxxxxxxxx
|
||||
*/
|
||||
|
||||
#define SET_ZFLG(y) (regflags.cznv = (((uae_u32)regflags.cznv) & ~0x40) | (((y) & 1) << 6))
|
||||
#define SET_CFLG(y) (regflags.cznv = (((uae_u32)regflags.cznv) & ~1) | ((y) & 1))
|
||||
#define SET_VFLG(y) (regflags.cznv = (((uae_u32)regflags.cznv) & ~0x800) | (((y) & 1) << 11))
|
||||
#define SET_NFLG(y) (regflags.cznv = (((uae_u32)regflags.cznv) & ~0x80) | (((y) & 1) << 7))
|
||||
#define SET_XFLG(y) (regflags.x = (y))
|
||||
#define FLAGBIT_N 7
|
||||
#define FLAGBIT_Z 6
|
||||
#define FLAGBIT_C 0
|
||||
#define FLAGBIT_V 11
|
||||
#define FLAGBIT_X 0 /* must be in position 0 for duplicate_carry() to work */
|
||||
|
||||
#define GET_ZFLG ((regflags.cznv >> 6) & 1)
|
||||
#define GET_CFLG (regflags.cznv & 1)
|
||||
#define GET_VFLG ((regflags.cznv >> 11) & 1)
|
||||
#define GET_NFLG ((regflags.cznv >> 7) & 1)
|
||||
#define GET_XFLG (regflags.x & 1)
|
||||
#define FLAGVAL_N (1 << FLAGBIT_N)
|
||||
#define FLAGVAL_Z (1 << FLAGBIT_Z)
|
||||
#define FLAGVAL_C (1 << FLAGBIT_C)
|
||||
#define FLAGVAL_V (1 << FLAGBIT_V)
|
||||
#define FLAGVAL_X (1 << FLAGBIT_X)
|
||||
|
||||
#define CLEAR_CZNV (regflags.cznv = 0)
|
||||
#define GET_CZNV (regflags.cznv)
|
||||
#define IOR_CZNV(X) (regflags.cznv |= (X))
|
||||
#define SET_CZNV(X) (regflags.cznv = (X))
|
||||
#define SET_ZFLG(y) (regflags.cznv = (((uae_u32)regflags.cznv) & ~FLAGVAL_Z) | (((y) & 1) << FLAGBIT_Z))
|
||||
#define SET_CFLG(y) (regflags.cznv = (((uae_u32)regflags.cznv) & ~FLAGVAL_C) | (((y) & 1) << FLAGBIT_C))
|
||||
#define SET_VFLG(y) (regflags.cznv = (((uae_u32)regflags.cznv) & ~FLAGVAL_V) | (((y) & 1) << FLAGBIT_V))
|
||||
#define SET_NFLG(y) (regflags.cznv = (((uae_u32)regflags.cznv) & ~FLAGVAL_N) | (((y) & 1) << FLAGBIT_N))
|
||||
#define SET_XFLG(y) (regflags.x = ((y) & 1) << FLAGBIT_X)
|
||||
|
||||
#define COPY_CARRY (regflags.x = regflags.cznv)
|
||||
#define GET_ZFLG() ((regflags.cznv >> FLAGBIT_Z) & 1)
|
||||
#define GET_CFLG() ((regflags.cznv >> FLAGBIT_C) & 1)
|
||||
#define GET_VFLG() ((regflags.cznv >> FLAGBIT_V) & 1)
|
||||
#define GET_NFLG() ((regflags.cznv >> FLAGBIT_N) & 1)
|
||||
#define GET_XFLG() ((regflags.x >> FLAGBIT_X) & 1)
|
||||
|
||||
extern struct flag_struct regflags ASM_SYM ("regflags");
|
||||
#define CLEAR_CZNV() (regflags.cznv = 0)
|
||||
#define GET_CZNV() (regflags.cznv)
|
||||
#define IOR_CZNV(X) (regflags.cznv |= (X))
|
||||
#define SET_CZNV(X) (regflags.cznv = (X))
|
||||
|
||||
static __inline__ int cctrue(int cc)
|
||||
#define COPY_CARRY() (regflags.x = regflags.cznv >> (FLAGBIT_C - FLAGBIT_X))
|
||||
|
||||
extern struct flag_struct regflags __asm__ ("regflags");
|
||||
|
||||
/*
|
||||
* Test CCR condition
|
||||
*/
|
||||
static inline int cctrue(int cc)
|
||||
{
|
||||
uae_u32 cznv = regflags.cznv;
|
||||
switch(cc){
|
||||
case 0: return 1; /* T */
|
||||
case 1: return 0; /* F */
|
||||
case 2: return (cznv & 0x41) == 0; /* !GET_CFLG && !GET_ZFLG; HI */
|
||||
case 3: return (cznv & 0x41) != 0; /* GET_CFLG || GET_ZFLG; LS */
|
||||
case 4: return (cznv & 1) == 0; /* !GET_CFLG; CC */
|
||||
case 5: return (cznv & 1) != 0; /* GET_CFLG; CS */
|
||||
case 6: return (cznv & 0x40) == 0; /* !GET_ZFLG; NE */
|
||||
case 7: return (cznv & 0x40) != 0; /* GET_ZFLG; EQ */
|
||||
case 8: return (cznv & 0x800) == 0;/* !GET_VFLG; VC */
|
||||
case 9: return (cznv & 0x800) != 0;/* GET_VFLG; VS */
|
||||
case 10:return (cznv & 0x80) == 0; /* !GET_NFLG; PL */
|
||||
case 11:return (cznv & 0x80) != 0; /* GET_NFLG; MI */
|
||||
case 12:return (((cznv << 4) ^ cznv) & 0x800) == 0; /* GET_NFLG == GET_VFLG; GE */
|
||||
case 13:return (((cznv << 4) ^ cznv) & 0x800) != 0;/* GET_NFLG != GET_VFLG; LT */
|
||||
case 14:
|
||||
cznv &= 0x8c0;
|
||||
return (((cznv << 4) ^ cznv) & 0x840) == 0; /* !GET_ZFLG && (GET_NFLG == GET_VFLG); GT */
|
||||
case 15:
|
||||
cznv &= 0x8c0;
|
||||
return (((cznv << 4) ^ cznv) & 0x840) != 0; /* GET_ZFLG || (GET_NFLG != GET_VFLG); LE */
|
||||
|
||||
switch (cc) {
|
||||
case 0: return 1; /* T */
|
||||
case 1: return 0; /* F */
|
||||
case 2: return (cznv & (FLAGVAL_C | FLAGVAL_Z)) == 0; /* !CFLG && !ZFLG HI */
|
||||
case 3: return (cznv & (FLAGVAL_C | FLAGVAL_Z)) != 0; /* CFLG || ZFLG LS */
|
||||
case 4: return (cznv & FLAGVAL_C) == 0; /* !CFLG CC */
|
||||
case 5: return (cznv & FLAGVAL_C) != 0; /* CFLG CS */
|
||||
case 6: return (cznv & FLAGVAL_Z) == 0; /* !ZFLG NE */
|
||||
case 7: return (cznv & FLAGVAL_Z) != 0; /* ZFLG EQ */
|
||||
case 8: return (cznv & FLAGVAL_V) == 0; /* !VFLG VC */
|
||||
case 9: return (cznv & FLAGVAL_V) != 0; /* VFLG VS */
|
||||
case 10: return (cznv & FLAGVAL_N) == 0; /* !NFLG PL */
|
||||
case 11: return (cznv & FLAGVAL_N) != 0; /* NFLG MI */
|
||||
#if FLAGBIT_N > FLAGBIT_V
|
||||
case 12: return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & FLAGVAL_N) == 0; /* NFLG == VFLG GE */
|
||||
case 13: return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & FLAGVAL_N) != 0; /* NFLG != VFLG LT */
|
||||
case 14: cznv &= (FLAGVAL_N | FLAGVAL_Z | FLAGVAL_V); /* !ZFLG && (NFLG == VFLG) GT */
|
||||
return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & (FLAGVAL_N | FLAGVAL_Z)) == 0;
|
||||
case 15: cznv &= (FLAGVAL_N | FLAGVAL_Z | FLAGVAL_V); /* ZFLG || (NFLG != VFLG) LE */
|
||||
return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & (FLAGVAL_N | FLAGVAL_Z)) != 0;
|
||||
#else
|
||||
case 12: return (((cznv << (FLAGBIT_V - FLAGBIT_N)) ^ cznv) & FLAGVAL_V) == 0; /* NFLG == VFLG GE */
|
||||
case 13: return (((cznv << (FLAGBIT_V - FLAGBIT_N)) ^ cznv) & FLAGVAL_V) != 0; /* NFLG != VFLG LT */
|
||||
case 14: cznv &= (FLAGVAL_N | FLAGVAL_Z | FLAGVAL_V); /* !ZFLG && (NFLG == VFLG) GT */
|
||||
return (((cznv << (FLAGBIT_V - FLAGBIT_N)) ^ cznv) & (FLAGVAL_V | FLAGVAL_Z)) == 0;
|
||||
case 15: cznv &= (FLAGVAL_N | FLAGVAL_Z | FLAGVAL_V); /* ZFLG || (NFLG != VFLG) LE */
|
||||
return (((cznv << (FLAGBIT_V - FLAGBIT_N)) ^ cznv) & (FLAGVAL_V | FLAGVAL_Z)) != 0;
|
||||
#endif
|
||||
}
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -93,34 +134,34 @@ static __inline__ int cctrue(int cc)
|
||||
__asm__ __volatile__ ("andl %1,%1\n\t" \
|
||||
"pushf\n\t" \
|
||||
"pop %0\n\t" \
|
||||
: "=r" (regflags.cznv) : "r" (v) : "cc")
|
||||
: "=rm" (regflags.cznv) : "r" (v) : "memory", "cc")
|
||||
|
||||
#define optflag_testw(v) \
|
||||
__asm__ __volatile__ ("andw %w1,%w1\n\t" \
|
||||
"pushf\n\t" \
|
||||
"pop %0\n\t" \
|
||||
: "=r" (regflags.cznv) : "r" (v) : "cc")
|
||||
: "=rm" (regflags.cznv) : "r" (v) : "memory", "cc")
|
||||
|
||||
#define optflag_testb(v) \
|
||||
__asm__ __volatile__ ("andb %b1,%b1\n\t" \
|
||||
"pushf\n\t" \
|
||||
"pop %0\n\t" \
|
||||
: "=r" (regflags.cznv) : "q" (v) : "cc")
|
||||
: "=rm" (regflags.cznv) : "q" (v) : "memory", "cc")
|
||||
|
||||
#define optflag_addl(v, s, d) do { \
|
||||
__asm__ __volatile__ ("addl %k2,%k1\n\t" \
|
||||
"pushf\n\t" \
|
||||
"pop %0\n\t" \
|
||||
: "=r" (regflags.cznv), "=r" (v) : "rmi" (s), "1" (d) : "cc"); \
|
||||
COPY_CARRY; \
|
||||
: "=rm" (regflags.cznv), "=r" (v) : "rmi" (s), "1" (d) : "memory", "cc"); \
|
||||
COPY_CARRY(); \
|
||||
} while (0)
|
||||
|
||||
#define optflag_addw(v, s, d) do { \
|
||||
__asm__ __volatile__ ("addw %w2,%w1\n\t" \
|
||||
"pushf\n\t" \
|
||||
"pop %0\n\t" \
|
||||
: "=r" (regflags.cznv), "=r" (v) : "rmi" (s), "1" (d) : "cc"); \
|
||||
COPY_CARRY; \
|
||||
: "=rm" (regflags.cznv), "=r" (v) : "rmi" (s), "1" (d) : "memory", "cc"); \
|
||||
COPY_CARRY(); \
|
||||
} while (0)
|
||||
|
||||
#define optflag_addb(v, s, d) do { \
|
||||
@ -128,113 +169,151 @@ static __inline__ int cctrue(int cc)
|
||||
"pushf\n\t" \
|
||||
"pop %0\n\t" \
|
||||
: "=r" (regflags.cznv), "=q" (v) : "qmi" (s), "1" (d) : "cc"); \
|
||||
COPY_CARRY; \
|
||||
COPY_CARRY(); \
|
||||
} while (0)
|
||||
|
||||
#define optflag_subl(v, s, d) do { \
|
||||
__asm__ __volatile__ ("subl %k2,%k1\n\t" \
|
||||
"pushf\n\t" \
|
||||
"pop %0\n\t" \
|
||||
: "=r" (regflags.cznv), "=r" (v) : "rmi" (s), "1" (d) : "cc"); \
|
||||
COPY_CARRY; \
|
||||
: "=rm" (regflags.cznv), "=r" (v) : "rmi" (s), "1" (d) : "memory", "cc"); \
|
||||
COPY_CARRY(); \
|
||||
} while (0)
|
||||
|
||||
#define optflag_subw(v, s, d) do { \
|
||||
__asm__ __volatile__ ("subw %w2,%w1\n\t" \
|
||||
"pushf\n\t" \
|
||||
"pop %0\n\t" \
|
||||
: "=r" (regflags.cznv), "=r" (v) : "rmi" (s), "1" (d) : "cc"); \
|
||||
COPY_CARRY; \
|
||||
: "=rm" (regflags.cznv), "=r" (v) : "rmi" (s), "1" (d) : "memory", "cc"); \
|
||||
COPY_CARRY(); \
|
||||
} while (0)
|
||||
|
||||
#define optflag_subb(v, s, d) do { \
|
||||
__asm__ __volatile__ ("subb %b2,%b1\n\t" \
|
||||
"pushf\n\t" \
|
||||
"pop %0\n\t" \
|
||||
: "=r" (regflags.cznv), "=q" (v) : "qmi" (s), "1" (d) : "cc"); \
|
||||
COPY_CARRY; \
|
||||
: "=rm" (regflags.cznv), "=q" (v) : "qmi" (s), "1" (d) : "memory", "cc"); \
|
||||
COPY_CARRY(); \
|
||||
} while (0)
|
||||
|
||||
#define optflag_cmpl(s, d) \
|
||||
__asm__ __volatile__ ("cmpl %k1,%k2\n\t" \
|
||||
"pushf\n\t" \
|
||||
"pop %0\n\t" \
|
||||
: "=r" (regflags.cznv) : "rmi" (s), "r" (d) : "cc")
|
||||
: "=rm" (regflags.cznv) : "rmi" (s), "r" (d) : "memory", "cc")
|
||||
|
||||
#define optflag_cmpw(s, d) \
|
||||
__asm__ __volatile__ ("cmpw %w1,%w2\n\t" \
|
||||
"pushf\n\t" \
|
||||
"pop %0\n\t" \
|
||||
: "=r" (regflags.cznv) : "rmi" (s), "r" (d) : "cc")
|
||||
: "=rm" (regflags.cznv) : "rmi" (s), "r" (d) : "memory", "cc")
|
||||
|
||||
#define optflag_cmpb(s, d) \
|
||||
__asm__ __volatile__ ("cmpb %b1,%b2\n\t" \
|
||||
"pushf\n\t" \
|
||||
"pop %0\n\t" \
|
||||
: "=r" (regflags.cznv) : "qmi" (s), "q" (d) : "cc")
|
||||
: "=rm" (regflags.cznv) : "qmi" (s), "q" (d) : "memory", "cc")
|
||||
|
||||
#else
|
||||
#else /* !SAHF_SETO_PROFITABLE */
|
||||
|
||||
/*
|
||||
* Machine dependent structure for holding the 68k CCR flags
|
||||
*/
|
||||
struct flag_struct {
|
||||
uae_u32 cznv;
|
||||
uae_u32 x;
|
||||
uae_u32 cznv;
|
||||
uae_u32 x;
|
||||
};
|
||||
|
||||
#define FLAGVAL_Z 0x4000
|
||||
#define FLAGVAL_N 0x8000
|
||||
extern struct flag_struct regflags __asm__ ("regflags");
|
||||
|
||||
#define SET_ZFLG(y) (regflags.cznv = (regflags.cznv & ~0x4000) | (((y) & 1) << 14))
|
||||
#define SET_CFLG(y) (regflags.cznv = (regflags.cznv & ~0x100) | (((y) & 1) << 8))
|
||||
#define SET_VFLG(y) (regflags.cznv = (regflags.cznv & ~0x1) | (((y) & 1)))
|
||||
#define SET_NFLG(y) (regflags.cznv = (regflags.cznv & ~0x8000) | (((y) & 1) << 15))
|
||||
#define SET_XFLG(y) (regflags.x = (y))
|
||||
/*
|
||||
* The bits in the cznv field in the above structure are assigned to
|
||||
* allow the easy mirroring of the x86 condition flags. (For example,
|
||||
* from the AX register - the x86 overflow flag can be copied to AL
|
||||
* with a setto %AL instr and the other flags copied to AH with an
|
||||
* lahf instr).
|
||||
*
|
||||
* The 68k CZNV flags are thus assigned in cznv as:
|
||||
*
|
||||
* <--AL--> <--AH-->
|
||||
* 76543210 FEDCBA98 --------- ---------
|
||||
* xxxxxxxV NZxxxxxC xxxxxxxxx xxxxxxxxx
|
||||
*/
|
||||
|
||||
#define GET_ZFLG ((regflags.cznv >> 14) & 1)
|
||||
#define GET_CFLG ((regflags.cznv >> 8) & 1)
|
||||
#define GET_VFLG ((regflags.cznv >> 0) & 1)
|
||||
#define GET_NFLG ((regflags.cznv >> 15) & 1)
|
||||
#define GET_XFLG (regflags.x & 1)
|
||||
#define FLAGBIT_N 15
|
||||
#define FLAGBIT_Z 14
|
||||
#define FLAGBIT_C 8
|
||||
#define FLAGBIT_V 0
|
||||
#define FLAGBIT_X 0 /* must be in position 0 for duplicate_carry() to work */
|
||||
|
||||
#define CLEAR_CZNV (regflags.cznv = 0)
|
||||
#define GET_CZNV (regflags.cznv)
|
||||
#define IOR_CZNV(X) (regflags.cznv |= (X))
|
||||
#define SET_CZNV(X) (regflags.cznv = (X))
|
||||
#define FLAGVAL_N (1 << FLAGBIT_N)
|
||||
#define FLAGVAL_Z (1 << FLAGBIT_Z)
|
||||
#define FLAGVAL_C (1 << FLAGBIT_C)
|
||||
#define FLAGVAL_V (1 << FLAGBIT_V)
|
||||
#define FLAGVAL_X (1 << FLAGBIT_X)
|
||||
|
||||
#define COPY_CARRY (regflags.x = (regflags.cznv)>>8)
|
||||
#define SET_ZFLG(y) (regflags.cznv = (((uae_u32)regflags.cznv) & ~FLAGVAL_Z) | (((y) & 1) << FLAGBIT_Z))
|
||||
#define SET_CFLG(y) (regflags.cznv = (((uae_u32)regflags.cznv) & ~FLAGVAL_C) | (((y) & 1) << FLAGBIT_C))
|
||||
#define SET_VFLG(y) (regflags.cznv = (((uae_u32)regflags.cznv) & ~FLAGVAL_V) | (((y) & 1) << FLAGBIT_V))
|
||||
#define SET_NFLG(y) (regflags.cznv = (((uae_u32)regflags.cznv) & ~FLAGVAL_N) | (((y) & 1) << FLAGBIT_N))
|
||||
#define SET_XFLG(y) (regflags.x = ((y) & 1) << FLAGBIT_X)
|
||||
|
||||
extern struct flag_struct regflags ASM_SYM("regflags");
|
||||
#define GET_ZFLG() ((regflags.cznv >> FLAGBIT_Z) & 1)
|
||||
#define GET_CFLG() ((regflags.cznv >> FLAGBIT_C) & 1)
|
||||
#define GET_VFLG() ((regflags.cznv >> FLAGBIT_V) & 1)
|
||||
#define GET_NFLG() ((regflags.cznv >> FLAGBIT_N) & 1)
|
||||
#define GET_XFLG() ((regflags.x >> FLAGBIT_X) & 1)
|
||||
|
||||
static __inline__ int cctrue(int cc)
|
||||
#define CLEAR_CZNV() (regflags.cznv = 0)
|
||||
#define GET_CZNV() (regflags.cznv)
|
||||
#define IOR_CZNV(X) (regflags.cznv |= (X))
|
||||
#define SET_CZNV(X) (regflags.cznv = (X))
|
||||
|
||||
#define COPY_CARRY() (regflags.x = regflags.cznv >> (FLAGBIT_C - FLAGBIT_X))
|
||||
|
||||
|
||||
/*
|
||||
* Test CCR condition
|
||||
*/
|
||||
static inline int cctrue(int cc)
|
||||
{
|
||||
uae_u32 cznv = regflags.cznv;
|
||||
switch(cc){
|
||||
case 0: return 1; /* T */
|
||||
case 1: return 0; /* F */
|
||||
case 2: return (cznv & 0x4100) == 0; /* !GET_CFLG && !GET_ZFLG; HI */
|
||||
case 3: return (cznv & 0x4100) != 0; /* GET_CFLG || GET_ZFLG; LS */
|
||||
case 4: return (cznv & 0x100) == 0; /* !GET_CFLG; CC */
|
||||
case 5: return (cznv & 0x100) != 0; /* GET_CFLG; CS */
|
||||
case 6: return (cznv & 0x4000) == 0; /* !GET_ZFLG; NE */
|
||||
case 7: return (cznv & 0x4000) != 0; /* GET_ZFLG; EQ */
|
||||
case 8: return (cznv & 0x01) == 0; /* !GET_VFLG; VC */
|
||||
case 9: return (cznv & 0x01) != 0; /* GET_VFLG; VS */
|
||||
case 10:return (cznv & 0x8000) == 0; /* !GET_NFLG; PL */
|
||||
case 11:return (cznv & 0x8000) != 0; /* GET_NFLG; MI */
|
||||
case 12:return (((cznv << 15) ^ cznv) & 0x8000) == 0; /* GET_NFLG == GET_VFLG; GE */
|
||||
case 13:return (((cznv << 15) ^ cznv) & 0x8000) != 0;/* GET_NFLG != GET_VFLG; LT */
|
||||
case 14:
|
||||
cznv &= 0xc001;
|
||||
return (((cznv << 15) ^ cznv) & 0xc000) == 0; /* !GET_ZFLG && (GET_NFLG == GET_VFLG); GT */
|
||||
case 15:
|
||||
cznv &= 0xc001;
|
||||
return (((cznv << 15) ^ cznv) & 0xc000) != 0; /* GET_ZFLG || (GET_NFLG != GET_VFLG); LE */
|
||||
|
||||
switch (cc) {
|
||||
case 0: return 1; /* T */
|
||||
case 1: return 0; /* F */
|
||||
case 2: return (cznv & (FLAGVAL_C | FLAGVAL_Z)) == 0; /* !CFLG && !ZFLG HI */
|
||||
case 3: return (cznv & (FLAGVAL_C | FLAGVAL_Z)) != 0; /* CFLG || ZFLG LS */
|
||||
case 4: return (cznv & FLAGVAL_C) == 0; /* !CFLG CC */
|
||||
case 5: return (cznv & FLAGVAL_C) != 0; /* CFLG CS */
|
||||
case 6: return (cznv & FLAGVAL_Z) == 0; /* !ZFLG NE */
|
||||
case 7: return (cznv & FLAGVAL_Z) != 0; /* ZFLG EQ */
|
||||
case 8: return (cznv & FLAGVAL_V) == 0; /* !VFLG VC */
|
||||
case 9: return (cznv & FLAGVAL_V) != 0; /* VFLG VS */
|
||||
case 10: return (cznv & FLAGVAL_N) == 0; /* !NFLG PL */
|
||||
case 11: return (cznv & FLAGVAL_N) != 0; /* NFLG MI */
|
||||
#if FLAGBIT_N > FLAGBIT_V
|
||||
case 12: return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & FLAGVAL_N) == 0; /* NFLG == VFLG GE */
|
||||
case 13: return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & FLAGVAL_N) != 0; /* NFLG != VFLG LT */
|
||||
case 14: cznv &= (FLAGVAL_N | FLAGVAL_Z | FLAGVAL_V); /* !ZFLG && (NFLG == VFLG) GT */
|
||||
return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & (FLAGVAL_N | FLAGVAL_Z)) == 0;
|
||||
case 15: cznv &= (FLAGVAL_N | FLAGVAL_Z | FLAGVAL_V); /* ZFLG || (NFLG != VFLG) LE */
|
||||
return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & (FLAGVAL_N | FLAGVAL_Z)) != 0;
|
||||
#else
|
||||
case 12: return (((cznv << (FLAGBIT_V - FLAGBIT_N)) ^ cznv) & FLAGVAL_V) == 0; /* NFLG == VFLG GE */
|
||||
case 13: return (((cznv << (FLAGBIT_V - FLAGBIT_N)) ^ cznv) & FLAGVAL_V) != 0; /* NFLG != VFLG LT */
|
||||
case 14: cznv &= (FLAGVAL_N | FLAGVAL_Z | FLAGVAL_V); /* !ZFLG && (NFLG == VFLG) GT */
|
||||
return (((cznv << (FLAGBIT_V - FLAGBIT_N)) ^ cznv) & (FLAGVAL_V | FLAGVAL_Z)) == 0;
|
||||
case 15: cznv &= (FLAGVAL_N | FLAGVAL_Z | FLAGVAL_V); /* ZFLG || (NFLG != VFLG) LE */
|
||||
return (((cznv << (FLAGBIT_V - FLAGBIT_N)) ^ cznv) & (FLAGVAL_V | FLAGVAL_Z)) != 0;
|
||||
#endif
|
||||
}
|
||||
abort();
|
||||
abort ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Manually emit LAHF instruction so that 64-bit assemblers can grok it */
|
||||
#if defined __x86_64__ && defined __GNUC__
|
||||
#if defined CPU_x86_64 && defined __GNUC__
|
||||
#define ASM_LAHF ".byte 0x9f"
|
||||
#else
|
||||
#define ASM_LAHF "lahf"
|
||||
@ -273,7 +352,7 @@ static __inline__ int cctrue(int cc)
|
||||
"movb %%al,regflags\n\t" \
|
||||
"movb %%ah,regflags+1\n\t" \
|
||||
: "=r" (v) : "rmi" (s), "0" (d) : "%eax","cc","memory"); \
|
||||
COPY_CARRY; \
|
||||
COPY_CARRY(); \
|
||||
} while (0)
|
||||
|
||||
#define optflag_addw(v, s, d) do { \
|
||||
@ -283,7 +362,7 @@ static __inline__ int cctrue(int cc)
|
||||
"movb %%al,regflags\n\t" \
|
||||
"movb %%ah,regflags+1\n\t" \
|
||||
: "=r" (v) : "rmi" (s), "0" (d) : "%eax","cc","memory"); \
|
||||
COPY_CARRY; \
|
||||
COPY_CARRY(); \
|
||||
} while (0)
|
||||
|
||||
#define optflag_addb(v, s, d) do { \
|
||||
@ -293,7 +372,7 @@ static __inline__ int cctrue(int cc)
|
||||
"movb %%al,regflags\n\t" \
|
||||
"movb %%ah,regflags+1\n\t" \
|
||||
: "=q" (v) : "qmi" (s), "0" (d) : "%eax","cc","memory"); \
|
||||
COPY_CARRY; \
|
||||
COPY_CARRY(); \
|
||||
} while (0)
|
||||
|
||||
#define optflag_subl(v, s, d) do { \
|
||||
@ -303,7 +382,7 @@ static __inline__ int cctrue(int cc)
|
||||
"movb %%al,regflags\n\t" \
|
||||
"movb %%ah,regflags+1\n\t" \
|
||||
: "=r" (v) : "rmi" (s), "0" (d) : "%eax","cc","memory"); \
|
||||
COPY_CARRY; \
|
||||
COPY_CARRY(); \
|
||||
} while (0)
|
||||
|
||||
#define optflag_subw(v, s, d) do { \
|
||||
@ -313,7 +392,7 @@ static __inline__ int cctrue(int cc)
|
||||
"movb %%al,regflags\n\t" \
|
||||
"movb %%ah,regflags+1\n\t" \
|
||||
: "=r" (v) : "rmi" (s), "0" (d) : "%eax","cc","memory"); \
|
||||
COPY_CARRY; \
|
||||
COPY_CARRY(); \
|
||||
} while (0)
|
||||
|
||||
#define optflag_subb(v, s, d) do { \
|
||||
@ -323,7 +402,7 @@ static __inline__ int cctrue(int cc)
|
||||
"movb %%al,regflags\n\t" \
|
||||
"movb %%ah,regflags+1\n\t" \
|
||||
: "=q" (v) : "qmi" (s), "0" (d) : "%eax","cc","memory"); \
|
||||
COPY_CARRY; \
|
||||
COPY_CARRY(); \
|
||||
} while (0)
|
||||
|
||||
#define optflag_cmpl(s, d) \
|
||||
@ -340,7 +419,7 @@ static __inline__ int cctrue(int cc)
|
||||
"seto %%al\n\t" \
|
||||
"movb %%al,regflags\n\t" \
|
||||
"movb %%ah,regflags+1\n\t" \
|
||||
: : "rmi" (s), "r" (d) : "%eax","cc","memory");
|
||||
: : "rmi" (s), "r" (d) : "%eax","cc","memory")
|
||||
|
||||
#define optflag_cmpb(s, d) \
|
||||
__asm__ __volatile__ ("cmpb %b0,%b1\n\t" \
|
||||
@ -350,10 +429,306 @@ static __inline__ int cctrue(int cc)
|
||||
"movb %%ah,regflags+1\n\t" \
|
||||
: : "qmi" (s), "q" (d) : "%eax","cc","memory")
|
||||
|
||||
#endif /* SAHF_SETO_PROFITABLE */
|
||||
|
||||
#elif defined(CPU_arm) && defined(ARM_ASSEMBLY)
|
||||
|
||||
/*
|
||||
* Machine dependent structure for holding the 68k CCR flags
|
||||
*/
|
||||
struct flag_struct {
|
||||
uae_u32 nzcv;
|
||||
uae_u32 x;
|
||||
};
|
||||
|
||||
#define FLAGBIT_N 31
|
||||
#define FLAGBIT_Z 30
|
||||
#define FLAGBIT_C 29
|
||||
#define FLAGBIT_V 28
|
||||
#define FLAGBIT_X FLAGBIT_C /* must be in the same position in as x flag */
|
||||
|
||||
#define FLAGVAL_N (1 << FLAGBIT_N)
|
||||
#define FLAGVAL_Z (1 << FLAGBIT_Z)
|
||||
#define FLAGVAL_C (1 << FLAGBIT_C)
|
||||
#define FLAGVAL_V (1 << FLAGBIT_V)
|
||||
#define FLAGVAL_X (1 << FLAGBIT_X)
|
||||
|
||||
#define SET_NFLG(y) (regflags.nzcv = (regflags.nzcv & ~FLAGVAL_N) | (((y) & 1) << FLAGBIT_N))
|
||||
#define SET_ZFLG(y) (regflags.nzcv = (regflags.nzcv & ~FLAGVAL_Z) | (((y) & 1) << FLAGBIT_Z))
|
||||
#define SET_CFLG(y) (regflags.nzcv = (regflags.nzcv & ~FLAGVAL_C) | (((y) & 1) << FLAGBIT_C))
|
||||
#define SET_VFLG(y) (regflags.nzcv = (regflags.nzcv & ~FLAGVAL_V) | (((y) & 1) << FLAGBIT_V))
|
||||
#define SET_XFLG(y) (regflags.x = ((y) & 1) << FLAGBIT_X)
|
||||
|
||||
#define GET_NFLG() ((regflags.nzcv >> FLAGBIT_N) & 1)
|
||||
#define GET_ZFLG() ((regflags.nzcv >> FLAGBIT_Z) & 1)
|
||||
#define GET_CFLG() ((regflags.nzcv >> FLAGBIT_C) & 1)
|
||||
#define GET_VFLG() ((regflags.nzcv >> FLAGBIT_V) & 1)
|
||||
#define GET_XFLG() ((regflags.x >> FLAGBIT_X) & 1)
|
||||
|
||||
#define CLEAR_CZNV() (regflags.nzcv = 0)
|
||||
#define GET_CZNV() (regflags.nzcv)
|
||||
#define IOR_CZNV(X) (regflags.nzcv |= (X))
|
||||
#define SET_CZNV(X) (regflags.nzcv = (X))
|
||||
|
||||
#define COPY_CARRY() (regflags.x = regflags.nzcv >> (FLAGBIT_C - FLAGBIT_X))
|
||||
|
||||
extern struct flag_struct regflags __asm__ ("regflags");
|
||||
|
||||
/*
|
||||
* Test CCR condition
|
||||
*/
|
||||
static inline int cctrue(int cc)
|
||||
{
|
||||
unsigned int nzcv = regflags.nzcv;
|
||||
switch(cc){
|
||||
case 0: return 1; /* T */
|
||||
case 1: return 0; /* F */
|
||||
case 2: return (nzcv & (FLAGVAL_C | FLAGVAL_Z)) == 0; /* !GET_CFLG && !GET_ZFLG; HI */
|
||||
case 3: return (nzcv & (FLAGVAL_C | FLAGVAL_Z)) != 0; /* GET_CFLG || GET_ZFLG; LS */
|
||||
case 4: return (nzcv & FLAGVAL_C) == 0; /* !GET_CFLG; CC */
|
||||
case 5: return (nzcv & FLAGVAL_C) != 0; /* GET_CFLG; CS */
|
||||
case 6: return (nzcv & FLAGVAL_Z) == 0; /* !GET_ZFLG; NE */
|
||||
case 7: return (nzcv & FLAGVAL_Z) != 0; /* GET_ZFLG; EQ */
|
||||
case 8: return (nzcv & FLAGVAL_V) == 0; /* !GET_VFLG; VC */
|
||||
case 9: return (nzcv & FLAGVAL_V) != 0; /* GET_VFLG; VS */
|
||||
case 10:return (nzcv & FLAGVAL_N) == 0; /* !GET_NFLG; PL */
|
||||
case 11:return (nzcv & FLAGVAL_N) != 0; /* GET_NFLG; MI */
|
||||
case 12:return (((nzcv << (FLAGBIT_N - FLAGBIT_V)) ^ nzcv) & FLAGVAL_N) == 0; /* GET_NFLG == GET_VFLG; GE */
|
||||
case 13:return (((nzcv << (FLAGBIT_N - FLAGBIT_V)) ^ nzcv) & FLAGVAL_N) != 0; /* GET_NFLG != GET_VFLG; LT */
|
||||
case 14: nzcv &= (FLAGVAL_N | FLAGVAL_Z | FLAGVAL_V);
|
||||
return (((nzcv << (FLAGBIT_N - FLAGBIT_V)) ^ nzcv) & (FLAGVAL_N | FLAGVAL_Z)) == 0; /* !GET_ZFLG && (GET_NFLG == GET_VFLG); GT */
|
||||
case 15: nzcv &= (FLAGVAL_N | FLAGVAL_Z | FLAGVAL_V);
|
||||
return (((nzcv << (FLAGBIT_N - FLAGBIT_V)) ^ nzcv) & (FLAGVAL_N | FLAGVAL_Z)) != 0; /* GET_ZFLG || (GET_NFLG != GET_VFLG); LE */
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define optflag_testl(v) do {\
|
||||
__asm__ __volatile__ ("tst %[rv],%[rv]\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
"bic %[nzcv],#0x30000000\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv) \
|
||||
: [rv] "r" (v) \
|
||||
: "cc"); \
|
||||
} while(0)
|
||||
|
||||
#define optflag_addl(v, s, d) do { \
|
||||
__asm__ __volatile__ ("adds %[rv],%[rd],%[rs]\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv), [rv] "=r" (v) \
|
||||
: [rs] "ri" (s), [rd] "1" (d) \
|
||||
: "cc"); \
|
||||
COPY_CARRY(); \
|
||||
} while(0)
|
||||
|
||||
#define optflag_subl(v, s, d) do { \
|
||||
__asm__ __volatile__ ("subs %[rv],%[rd],%[rs]\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
"eor %[nzcv],#0x20000000\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv), [rv] "=r" (v) \
|
||||
: [rs] "ri" (s), [rd] "1" (d) \
|
||||
: "cc"); \
|
||||
COPY_CARRY(); \
|
||||
} while(0)
|
||||
|
||||
#define optflag_cmpl(s, d) do { \
|
||||
__asm__ __volatile__ ("cmp %[rd],%[rs]\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
"eor %[nzcv],#0x20000000\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv) \
|
||||
: [rs] "ri" (s), [rd] "0" (d) \
|
||||
: "cc"); \
|
||||
} while(0)
|
||||
|
||||
#if defined(ARMV6_ASSEMBLY)
|
||||
|
||||
// #pragma message "ARM/v6 Assembly optimized flags"
|
||||
|
||||
#define optflag_testw(v) do { \
|
||||
__asm__ __volatile__ ("sxth %[rv],%[rv]\n\t" \
|
||||
"tst %[rv],%[rv]\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
"bic %[nzcv],#0x30000000\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv) \
|
||||
: [rv] "0" (v) \
|
||||
: "cc"); \
|
||||
}while(0)
|
||||
|
||||
#define optflag_testb(v) do {\
|
||||
__asm__ __volatile__ ("sxtb %[rv],%[rv]\n\t" \
|
||||
"tst %[rv],%[rv]\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
"bic %[nzcv],#0x30000000\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv) \
|
||||
: [rv] "0" (v) \
|
||||
: "cc"); \
|
||||
}while(0)
|
||||
|
||||
#define optflag_addw(v, s, d) do { \
|
||||
__asm__ __volatile__ ("sxth %[rd],%[rd]\n\t" \
|
||||
"sxth %[rs],%[rs]\n\t" \
|
||||
"adds %[rd],%[rd],%[rs]\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv), [rv] "=r" (v) \
|
||||
: [rs] "ri" (s), [rd] "1" (d) \
|
||||
: "cc"); \
|
||||
COPY_CARRY(); \
|
||||
} while(0)
|
||||
|
||||
#define optflag_addb(v, s, d) do { \
|
||||
__asm__ __volatile__ ("sxtb %[rd],%[rd]\n\t" \
|
||||
"sxtb %[rs],%[rs]\n\t" \
|
||||
"adds %[rd],%[rd],%[rs]\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv), [rv] "=r" (v) \
|
||||
: [rs] "ri" (s), [rd] "1" (d) \
|
||||
: "cc"); \
|
||||
COPY_CARRY(); \
|
||||
} while(0)
|
||||
|
||||
#define optflag_subw(v, s, d) do { \
|
||||
__asm__ __volatile__ ("sxth %[rd],%[rd]\n\t" \
|
||||
"sxth %[rs],%[rs]\n\t" \
|
||||
"subs %[rd],%[rd],%[rs]\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
"eor %[nzcv],#0x20000000\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv), [rv] "=r" (v) \
|
||||
: [rs] "ri" (s), [rd] "1" (d) \
|
||||
: "cc"); \
|
||||
COPY_CARRY(); \
|
||||
} while(0)
|
||||
|
||||
#define optflag_subb(v, s, d) do { \
|
||||
__asm__ __volatile__ ("sxtb %[rd],%[rd]\n\t" \
|
||||
"sxtb %[rs],%[rs]\n\t" \
|
||||
"subs %[rd],%[rd],%[rs]\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
"eor %[nzcv],#0x20000000\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv), [rv] "=r" (v) \
|
||||
: [rs] "ri" (s), [rd] "1" (d) \
|
||||
: "cc"); \
|
||||
COPY_CARRY(); \
|
||||
} while(0)
|
||||
|
||||
#define optflag_cmpw(s, d) do { \
|
||||
__asm__ __volatile__ ("sxth %[rd],%[rd]\n\t" \
|
||||
"sxth %[rs],%[rs]\n\t" \
|
||||
"cmp %[rd],%[rs]\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
"eor %[nzcv],#0x20000000\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv) \
|
||||
: [rs] "ri" (s), [rd] "0" (d) \
|
||||
: "cc"); \
|
||||
} while(0)
|
||||
|
||||
#define optflag_cmpb(s, d) do { \
|
||||
__asm__ __volatile__ ("sxtb %[rd],%[rd]\n\t" \
|
||||
"sxtb %[rs],%[rs]\n\t" \
|
||||
"cmp %[rd],%[rs]\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
"eor %[nzcv],#0x20000000\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv) \
|
||||
: [rs] "ri" (s), [rd] "0" (d) \
|
||||
: "cc"); \
|
||||
} while(0)
|
||||
|
||||
#else
|
||||
|
||||
// #pragma message "ARM/generic Assembly optimized flags"
|
||||
|
||||
#define optflag_testw(v) do { \
|
||||
__asm__ __volatile__ ("lsl %[rv],%[rv],#16\n\t" \
|
||||
"tst %[rv],%[rv]\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
"bic %[nzcv],#0x30000000\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv) \
|
||||
: [rv] "0" (v) \
|
||||
: "cc"); \
|
||||
}while(0)
|
||||
|
||||
#define optflag_testb(v) do {\
|
||||
__asm__ __volatile__ ("lsl %[rv],%[rv],#24\n\t" \
|
||||
"tst %[rv],%[rv]\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
"bic %[nzcv],#0x30000000\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv) \
|
||||
: [rv] "0" (v) \
|
||||
: "cc"); \
|
||||
}while(0)
|
||||
|
||||
#define optflag_addw(v, s, d) do { \
|
||||
__asm__ __volatile__ ("lsl %[rd],%[rd],#16\n\t" \
|
||||
"adds %[rd],%[rd],%[rs],lsl #16\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
"lsr %[rv],%[rd],#16\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv), [rv] "=r" (v) \
|
||||
: [rs] "ri" (s), [rd] "1" (d) \
|
||||
: "cc"); \
|
||||
COPY_CARRY(); \
|
||||
} while(0)
|
||||
|
||||
#define optflag_addb(v, s, d) do { \
|
||||
__asm__ __volatile__ ("lsl %[rd],%[rd],#24\n\t" \
|
||||
"adds %[rd],%[rd],%[rs],lsl #24\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
"lsr %[rv],%[rd],#24\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv), [rv] "=r" (v) \
|
||||
: [rs] "ri" (s), [rd] "1" (d) \
|
||||
: "cc"); \
|
||||
COPY_CARRY(); \
|
||||
} while(0)
|
||||
|
||||
#define optflag_subw(v, s, d) do { \
|
||||
__asm__ __volatile__ ("lsl %[rd],%[rd],#16\n\t" \
|
||||
"subs %[rd],%[rd],%[rs],lsl #16\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
"eor %[nzcv],#0x20000000\n\t" \
|
||||
"lsr %[rv],%[rd],#16\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv), [rv] "=r" (v) \
|
||||
: [rs] "ri" (s), [rd] "1" (d) \
|
||||
: "cc"); \
|
||||
COPY_CARRY(); \
|
||||
} while(0)
|
||||
|
||||
#define optflag_subb(v, s, d) do { \
|
||||
__asm__ __volatile__ ("lsl %[rd],%[rd],#24\n\t" \
|
||||
"subs %[rd],%[rd],%[rs],lsl #24\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
"eor %[nzcv],#0x20000000\n\t" \
|
||||
"lsr %[rv],%[rd],#24\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv), [rv] "=r" (v) \
|
||||
: [rs] "ri" (s), [rd] "1" (d) \
|
||||
: "cc"); \
|
||||
COPY_CARRY(); \
|
||||
} while(0)
|
||||
|
||||
#define optflag_cmpw(s, d) do { \
|
||||
__asm__ __volatile__ ("lsl %[rd],%[rd],#16\n\t" \
|
||||
"cmp %[rd],%[rs],lsl #16\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
"eor %[nzcv],#0x20000000\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv) \
|
||||
: [rs] "ri" (s), [rd] "0" (d) \
|
||||
: "cc"); \
|
||||
} while(0)
|
||||
|
||||
#define optflag_cmpb(s, d) do { \
|
||||
__asm__ __volatile__ ("lsl %[rd],%[rd],#24\n\t" \
|
||||
"cmp %[rd],%[rs],lsl #24\n\t" \
|
||||
"mrs %[nzcv],cpsr\n\t" \
|
||||
"eor %[nzcv],#0x20000000\n\t" \
|
||||
: [nzcv] "=r" (regflags.nzcv) \
|
||||
: [rs] "ri" (s), [rd] "0" (d) \
|
||||
: "cc"); \
|
||||
} while(0)
|
||||
|
||||
#endif
|
||||
|
||||
#elif defined(SPARC_V8_ASSEMBLY) || defined(SPARC_V9_ASSEMBLY)
|
||||
#elif defined(CPU_sparc) && (defined(SPARC_V8_ASSEMBLY) || defined(SPARC_V9_ASSEMBLY))
|
||||
|
||||
/*
|
||||
* Machine dependent structure for holding the 68k CCR flags
|
||||
*/
|
||||
struct flag_struct {
|
||||
unsigned char nzvc;
|
||||
unsigned char x;
|
||||
@ -361,52 +736,62 @@ struct flag_struct {
|
||||
|
||||
extern struct flag_struct regflags;
|
||||
|
||||
#define FLAGVAL_Z 0x04
|
||||
#define FLAGVAL_N 0x08
|
||||
#define FLAGBIT_N 3
|
||||
#define FLAGBIT_Z 2
|
||||
#define FLAGBIT_V 1
|
||||
#define FLAGBIT_C 0
|
||||
#define FLAGBIT_X FLAGBIT_C /* should be in the same position as the x flag */
|
||||
|
||||
#define SET_ZFLG(y) (regflags.nzvc = (regflags.nzvc & ~0x04) | (((y) & 1) << 2))
|
||||
#define SET_CFLG(y) (regflags.nzvc = (regflags.nzvc & ~1) | ((y) & 1))
|
||||
#define SET_VFLG(y) (regflags.nzvc = (regflags.nzvc & ~0x02) | (((y) & 1) << 1))
|
||||
#define SET_NFLG(y) (regflags.nzvc = (regflags.nzvc & ~0x08) | (((y) & 1) << 3))
|
||||
#define SET_XFLG(y) (regflags.x = (y))
|
||||
#define FLAGVAL_N (1 << FLAGBIT_N)
|
||||
#define FLAGVAL_Z (1 << FLAGBIT_Z)
|
||||
#define FLAGVAL_C (1 << FLAGBIT_C)
|
||||
#define FLAGVAL_V (1 << FLAGBIT_V)
|
||||
#define FLAGVAL_X (1 << FLAGBIT_X)
|
||||
|
||||
#define GET_ZFLG ((regflags.nzvc >> 2) & 1)
|
||||
#define GET_CFLG (regflags.nzvc & 1)
|
||||
#define GET_VFLG ((regflags.nzvc >> 1) & 1)
|
||||
#define GET_NFLG ((regflags.nzvc >> 3) & 1)
|
||||
#define GET_XFLG (regflags.x & 1)
|
||||
#define SET_ZFLG(y) (regflags.nzvc = (regflags.nzvc & ~FLAGVAL_Z) | (((y) & 1) << FLAGBIT_Z))
|
||||
#define SET_CFLG(y) (regflags.nzvc = (regflags.nzvc & ~FLAGVAL_C) | (((y) & 1) << FLAGBIT_C))
|
||||
#define SET_VFLG(y) (regflags.nzvc = (regflags.nzvc & ~FLAGVAL_V) | (((y) & 1) << FLAGBIT_V))
|
||||
#define SET_NFLG(y) (regflags.nzvc = (regflags.nzvc & ~FLAGVAL_V) | (((y) & 1) << FLAGBIT_N))
|
||||
#define SET_XFLG(y) (regflags.x = ((y) & 1) << FLAGBIT_X)
|
||||
|
||||
#define CLEAR_CZNV (regflags.nzvc = 0)
|
||||
#define GET_CZNV (reflags.nzvc)
|
||||
#define IOR_CZNV(X) (refglags.nzvc |= (X))
|
||||
#define SET_CZNV(X) (regflags.nzvc = (X))
|
||||
#define GET_ZFLG() ((regflags.nzvc >> FLAGBIT_Z) & 1)
|
||||
#define GET_CFLG() ((regflags.nzvc >> FLAGBIT_C) & 1)
|
||||
#define GET_VFLG() ((regflags.nzvc >> FLAGBIT_V) & 1)
|
||||
#define GET_NFLG() ((regflags.nzvc >> FLAGBIT_N) & 1)
|
||||
#define GET_XFLG() ((regflags.x >> FLAGBIT_X) & 1)
|
||||
|
||||
#define COPY_CARRY (regflags.x = regflags.nzvc)
|
||||
#define CLEAR_CZNV() (regflags.nzvc = 0)
|
||||
#define GET_CZNV() (regflags.nzvc)
|
||||
#define IOR_CZNV(X) (regflags.nzvc |= (X))
|
||||
#define SET_CZNV(X) (regflags.nzvc = (X))
|
||||
|
||||
static __inline__ int cctrue(int cc)
|
||||
#define COPY_CARRY() (regflags.x = regflags.nzvc >> (FLAGBIT_C - FLAGBIT_X))
|
||||
|
||||
/*
|
||||
* Test CCR condition
|
||||
*/
|
||||
static inline int cctrue(int cc)
|
||||
{
|
||||
uae_u32 nzvc = regflags.nzvc;
|
||||
switch(cc){
|
||||
case 0: return 1; /* T */
|
||||
case 1: return 0; /* F */
|
||||
case 2: return (nzvc & 0x05) == 0; /* !GET_CFLG && !GET_ZFLG; HI */
|
||||
case 3: return (nzvc & 0x05) != 0; /* GET_CFLG || GET_ZFLG; LS */
|
||||
case 4: return (nzvc & 1) == 0; /* !GET_CFLG; CC */
|
||||
case 5: return (nzvc & 1) != 0; /* GET_CFLG; CS */
|
||||
case 6: return (nzvc & 0x04) == 0; /* !GET_ZFLG; NE */
|
||||
case 7: return (nzvc & 0x04) != 0; /* GET_ZFLG; EQ */
|
||||
case 8: return (nzvc & 0x02) == 0;/* !GET_VFLG; VC */
|
||||
case 9: return (nzvc & 0x02) != 0;/* GET_VFLG; VS */
|
||||
case 10:return (nzvc & 0x08) == 0; /* !GET_NFLG; PL */
|
||||
case 11:return (nzvc & 0x08) != 0; /* GET_NFLG; MI */
|
||||
case 12:return (((nzvc << 2) ^ nzvc) & 0x08) == 0; /* GET_NFLG == GET_VFLG; GE */
|
||||
case 13:return (((nzvc << 2) ^ nzvc) & 0x08) != 0;/* GET_NFLG != GET_VFLG; LT */
|
||||
case 14:
|
||||
nzvc &= 0x0e;
|
||||
return (((nzvc << 2) ^ nzvc) & 0x0c) == 0; /* !GET_ZFLG && (GET_NFLG == GET_VFLG); GT */
|
||||
case 15:
|
||||
nzvc &= 0x0e;
|
||||
return (((nzvc << 2) ^ nzvc) & 0x0c) != 0; /* GET_ZFLG || (GET_NFLG != GET_VFLG); LE */
|
||||
switch (cc) {
|
||||
case 0: return 1; /* T */
|
||||
case 1: return 0; /* F */
|
||||
case 2: return (cznv & (FLAGVAL_C | FLAGVAL_Z)) == 0; /* !CFLG && !ZFLG HI */
|
||||
case 3: return (cznv & (FLAGVAL_C | FLAGVAL_Z)) != 0; /* CFLG || ZFLG LS */
|
||||
case 4: return (cznv & FLAGVAL_C) == 0; /* !CFLG CC */
|
||||
case 5: return (cznv & FLAGVAL_C) != 0; /* CFLG CS */
|
||||
case 6: return (cznv & FLAGVAL_Z) == 0; /* !ZFLG NE */
|
||||
case 7: return (cznv & FLAGVAL_Z) != 0; /* ZFLG EQ */
|
||||
case 8: return (cznv & FLAGVAL_V) == 0; /* !VFLG VC */
|
||||
case 9: return (cznv & FLAGVAL_V) != 0; /* VFLG VS */
|
||||
case 10: return (cznv & FLAGVAL_N) == 0; /* !NFLG PL */
|
||||
case 11: return (cznv & FLAGVAL_N) != 0; /* NFLG MI */
|
||||
case 12: return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & FLAGVAL_N) == 0; /* NFLG == VFLG GE */
|
||||
case 13: return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & FLAGVAL_N) != 0; /* NFLG != VFLG LT */
|
||||
case 14: cznv &= (FLAGVAL_N | FLAGVAL_Z | FLAGVAL_V); /* ZFLG && (NFLG == VFLG) GT */
|
||||
return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & (FLAGVAL_N | FLAGVAL_Z)) == 0;
|
||||
case 15: cznv &= (FLAGVAL_N | FLAGVAL_Z | FLAGVAL_V); /* ZFLG && (NFLG != VFLG) LE */
|
||||
return (((cznv << (FLAGBIT_N - FLAGBIT_V)) ^ cznv) & (FLAGVAL_N | FLAGVAL_Z)) != 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -1008,6 +1393,9 @@ static inline uae_u32 sparc_v9_flag_addx_32(flag_struct *flags, uae_u32 src, uae
|
||||
|
||||
#else
|
||||
|
||||
/*
|
||||
* Machine independent structure for holding the 68k CCR flags
|
||||
*/
|
||||
struct flag_struct {
|
||||
unsigned int c;
|
||||
unsigned int z;
|
||||
@ -1030,22 +1418,25 @@ extern struct flag_struct regflags;
|
||||
#define SET_ZFLG(x) (ZFLG = (x))
|
||||
#define SET_XFLG(x) (XFLG = (x))
|
||||
|
||||
#define GET_CFLG CFLG
|
||||
#define GET_NFLG NFLG
|
||||
#define GET_VFLG VFLG
|
||||
#define GET_ZFLG ZFLG
|
||||
#define GET_XFLG XFLG
|
||||
#define GET_CFLG() CFLG
|
||||
#define GET_NFLG() NFLG
|
||||
#define GET_VFLG() VFLG
|
||||
#define GET_ZFLG() ZFLG
|
||||
#define GET_XFLG() XFLG
|
||||
|
||||
#define CLEAR_CZNV do { \
|
||||
#define CLEAR_CZNV() do { \
|
||||
SET_CFLG (0); \
|
||||
SET_ZFLG (0); \
|
||||
SET_NFLG (0); \
|
||||
SET_VFLG (0); \
|
||||
} while (0)
|
||||
|
||||
#define COPY_CARRY (SET_XFLG (GET_CFLG))
|
||||
#define COPY_CARRY() (SET_XFLG (GET_CFLG ()))
|
||||
|
||||
static __inline__ int cctrue(const int cc)
|
||||
/*
|
||||
* Test CCR condition
|
||||
*/
|
||||
static inline int cctrue(const int cc)
|
||||
{
|
||||
switch(cc){
|
||||
case 0: return 1; /* T */
|
||||
|
@ -678,8 +678,8 @@ void MakeSR (void)
|
||||
#endif
|
||||
regs.sr = ((regs.t1 << 15) | (regs.t0 << 14)
|
||||
| (regs.s << 13) | (regs.m << 12) | (regs.intmask << 8)
|
||||
| (GET_XFLG << 4) | (GET_NFLG << 3) | (GET_ZFLG << 2) | (GET_VFLG << 1)
|
||||
| GET_CFLG);
|
||||
| (GET_XFLG() << 4) | (GET_NFLG() << 3) | (GET_ZFLG() << 2) | (GET_VFLG() << 1)
|
||||
| GET_CFLG());
|
||||
}
|
||||
|
||||
void MakeFromSR (void)
|
||||
@ -858,7 +858,7 @@ int m68k_move2c (int regno, uae_u32 *regp)
|
||||
#if USE_JIT
|
||||
set_cache_state(regs.cacr & 0x8000);
|
||||
if (*regp & 0x08) { /* Just to be on the safe side */
|
||||
flush_icache(1);
|
||||
flush_icache();
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
@ -1268,7 +1268,7 @@ void mmu_op(uae_u32 opcode, uae_u16 extra)
|
||||
/* PFLUSH */
|
||||
mmusr = 0;
|
||||
#ifdef USE_JIT
|
||||
flush_icache(0);
|
||||
flush_icache();
|
||||
#endif
|
||||
} else if ((opcode & 0x0FD8) == 0x548) {
|
||||
/* PTEST */
|
||||
@ -1501,7 +1501,7 @@ void m68k_dumpstate (uaecptr *nextpc)
|
||||
regs.usp,regs.isp,regs.msp,regs.vbr);
|
||||
printf ("T=%d%d S=%d M=%d X=%ld N=%ld Z=%ld V=%ld C=%ld IMASK=%d\n",
|
||||
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);
|
||||
|
||||
fpu_dump_registers();
|
||||
fpu_dump_flags();
|
||||
|
@ -62,13 +62,13 @@ static __inline__ void SET_CFLG_ALWAYS(uae_u32 x)
|
||||
#define SET_XFLG(y) do {uae_u32 dummy=(y); } while (0)
|
||||
|
||||
#undef CLEAR_CZNV
|
||||
#define CLEAR_CZNV
|
||||
#define CLEAR_CZNV() do {} while (0)
|
||||
#undef IOR_CZNV
|
||||
#define IOR_CZNV(y) do {uae_u32 dummy=(y); } while (0)
|
||||
#undef SET_CZNV
|
||||
#define SET_CZNV(y) do {uae_u32 dummy=(y); } while (0)
|
||||
#undef COPY_CARRY
|
||||
#define COPY_CARRY
|
||||
#define COPY_CARRY() do {} while (0)
|
||||
|
||||
#ifdef optflag_testl
|
||||
#undef optflag_testl
|
||||
|
Loading…
Reference in New Issue
Block a user