diff options
author | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2006-03-11 21:03:16 +0000 |
---|---|---|
committer | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2006-03-11 21:03:16 +0000 |
commit | 19b045dec90378e63496f7ebf86b4f81fdcc5fd3 (patch) | |
tree | c85450417b41d6917571e53f6a2d4e500934aeb4 /target-arm/nwfpe | |
parent | b55669bf570339188461a9ba755c2386f549de90 (diff) |
Fix FPA condition codes (Ulrich Hecht).
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1784 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'target-arm/nwfpe')
-rw-r--r-- | target-arm/nwfpe/fpa11.c | 5 | ||||
-rw-r--r-- | target-arm/nwfpe/fpa11.h | 29 |
2 files changed, 10 insertions, 24 deletions
diff --git a/target-arm/nwfpe/fpa11.c b/target-arm/nwfpe/fpa11.c index cfbe700c03..a8141e7e56 100644 --- a/target-arm/nwfpe/fpa11.c +++ b/target-arm/nwfpe/fpa11.c @@ -36,7 +36,7 @@ unsigned int EmulateCPDT(const unsigned int); unsigned int EmulateCPRT(const unsigned int); FPA11* qemufpa=0; -unsigned int* user_registers=0; +CPUARMState* user_registers; /* Reset the FPA11 chip. Called to initialize and reset the emulator. */ void resetFPA11(void) @@ -137,7 +137,8 @@ void SetRoundingPrecision(const unsigned int opcode) } /* Emulate the instruction in the opcode. */ -unsigned int EmulateAll(unsigned int opcode, FPA11* qfpa, unsigned int* qregs) +/* ??? This is not thread safe. */ +unsigned int EmulateAll(unsigned int opcode, FPA11* qfpa, CPUARMState* qregs) { unsigned int nRc = 0; // unsigned long flags; diff --git a/target-arm/nwfpe/fpa11.h b/target-arm/nwfpe/fpa11.h index 668393cff5..8751696de9 100644 --- a/target-arm/nwfpe/fpa11.h +++ b/target-arm/nwfpe/fpa11.h @@ -26,6 +26,8 @@ #include <stdio.h> #include <errno.h> +#include <cpu.h> + #define GET_FPA11() (qemufpa) /* @@ -33,7 +35,7 @@ * stack+task struct. Use the same method as 'current' uses to * reach them. */ -extern unsigned int *user_registers; +extern CPUARMState *user_registers; #define GET_USERREG() (user_registers) @@ -94,7 +96,7 @@ extern void SetRoundingPrecision(const unsigned int); static inline unsigned int readRegister(unsigned int reg) { - return (user_registers[(reg)]); + return (user_registers->regs[(reg)]); } static inline void writeRegister(unsigned int x, unsigned int y) @@ -102,34 +104,17 @@ static inline void writeRegister(unsigned int x, unsigned int y) #if 0 printf("writing %d to r%d\n",y,x); #endif - user_registers[(x)]=(y); + user_registers->regs[(x)]=(y); } static inline void writeConditionCodes(unsigned int x) { -#if 0 -unsigned int y; -unsigned int ZF; - printf("setting flags to %x from %x\n",x,user_registers[16]); -#endif - user_registers[16]=(x); // cpsr - user_registers[17]=(x>>29)&1; // cf - user_registers[18]=(x<<3)&(1<<31); // vf - user_registers[19]=x&(1<<31); // nzf - if(!(x&(1<<30))) user_registers[19]++; // nzf must be non-zero for zf to be cleared - -#if 0 - ZF = (user_registers[19] == 0); - y=user_registers[16] | (user_registers[19] & 0x80000000) | (ZF << 30) | - (user_registers[17] << 29) | ((user_registers[18] & 0x80000000) >> 3); - if(y != x) - printf("GODDAM SHIIIIIIIIIIIIIIIIT! %x %x nzf %x zf %x\n",x,y,user_registers[19],ZF); -#endif + cpsr_write(user_registers,x,CPSR_NZCV); } #define REG_PC 15 -unsigned int EmulateAll(unsigned int opcode, FPA11* qfpa, unsigned int* qregs); +unsigned int EmulateAll(unsigned int opcode, FPA11* qfpa, CPUARMState* qregs); /* included only for get_user/put_user macros */ #include "qemu.h" |