diff options
Diffstat (limited to 'src/core/arm/skyeye_common')
-rw-r--r-- | src/core/arm/skyeye_common/arm_regformat.h | 4 | ||||
-rw-r--r-- | src/core/arm/skyeye_common/armdefs.h | 12 | ||||
-rw-r--r-- | src/core/arm/skyeye_common/armemu.h | 14 | ||||
-rw-r--r-- | src/core/arm/skyeye_common/vfp/vfpdouble.cpp | 3 | ||||
-rw-r--r-- | src/core/arm/skyeye_common/vfp/vfpsingle.cpp | 3 |
5 files changed, 19 insertions, 17 deletions
diff --git a/src/core/arm/skyeye_common/arm_regformat.h b/src/core/arm/skyeye_common/arm_regformat.h index 99787476..5be3a561 100644 --- a/src/core/arm/skyeye_common/arm_regformat.h +++ b/src/core/arm/skyeye_common/arm_regformat.h @@ -86,7 +86,9 @@ enum { CP15_IFAR, CP15_PID, CP15_CONTEXT_ID, - CP15_THREAD_URO, + CP15_THREAD_UPRW, // Thread ID register - User/Privileged Read/Write + CP15_THREAD_URO, // Thread ID register - User Read Only (Privileged R/W) + CP15_THREAD_PRW, // Thread ID register - Privileged R/W only. CP15_TLB_FAULT_ADDR, /* defined by SkyEye */ CP15_TLB_FAULT_STATUS, /* defined by SkyEye */ /* VFP registers */ diff --git a/src/core/arm/skyeye_common/armdefs.h b/src/core/arm/skyeye_common/armdefs.h index 77886878..ff9296e0 100644 --- a/src/core/arm/skyeye_common/armdefs.h +++ b/src/core/arm/skyeye_common/armdefs.h @@ -35,11 +35,6 @@ #define BITS(s, a, b) ((s << ((sizeof(s) * 8 - 1) - b)) >> (sizeof(s) * 8 - b + a - 1)) #define BIT(s, n) ((s >> (n)) & 1) -#ifndef FALSE -#define FALSE 0 -#define TRUE 1 -#endif - #define LOW 0 #define HIGH 1 #define LOWHIGH 1 @@ -135,7 +130,6 @@ struct ARMul_State unsigned char* CPData[16]; // Coprocessor data unsigned char const* CPRegWords[16]; // Map of coprocessor register sizes - unsigned Debug; // Show instructions as they are executed unsigned NresetSig; // Reset the processor unsigned NfiqSig; unsigned NirqSig; @@ -180,12 +174,12 @@ So, if lateabtSig=1, then it means Late Abort Model(Base Updated Abort Model) */ unsigned lateabtSig; - ARMword Vector; // Synthesize aborts in cycle modes - ARMword Aborted; // Sticky flag for aborts - ARMword Reseted; // Sticky flag for Reset + bool Aborted; // Sticky flag for aborts + bool Reseted; // Sticky flag for Reset ARMword Inted, LastInted; // Sticky flags for interrupts ARMword Base; // Extra hand for base writeback ARMword AbortAddr; // To keep track of Prefetch aborts + ARMword Vector; // Synthesize aborts in cycle modes // For differentiating ARM core emulaiton. bool is_v4; // Are we emulating a v4 architecture (or higher)? diff --git a/src/core/arm/skyeye_common/armemu.h b/src/core/arm/skyeye_common/armemu.h index 6071d447..beee54c9 100644 --- a/src/core/arm/skyeye_common/armemu.h +++ b/src/core/arm/skyeye_common/armemu.h @@ -100,10 +100,10 @@ extern ARMword ARMul_ImmedTable[]; // Immediate DP LHS values. extern char ARMul_BitList[]; // Number of bits in a byte table. // Coprocessor support functions. -extern unsigned ARMul_CoProInit (ARMul_State *); -extern void ARMul_CoProExit (ARMul_State *); -extern void ARMul_CoProAttach (ARMul_State *, unsigned, ARMul_CPInits *, - ARMul_CPExits *, ARMul_LDCs *, ARMul_STCs *, - ARMul_MRCs *, ARMul_MCRs *, ARMul_MRRCs *, ARMul_MCRRs *, - ARMul_CDPs *, ARMul_CPReads *, ARMul_CPWrites *); -extern void ARMul_CoProDetach (ARMul_State *, unsigned); +extern void ARMul_CoProInit(ARMul_State*); +extern void ARMul_CoProExit(ARMul_State*); +extern void ARMul_CoProAttach(ARMul_State*, unsigned, ARMul_CPInits*, + ARMul_CPExits*, ARMul_LDCs*, ARMul_STCs*, + ARMul_MRCs*, ARMul_MCRs*, ARMul_MRRCs*, ARMul_MCRRs*, + ARMul_CDPs*, ARMul_CPReads*, ARMul_CPWrites*); +extern void ARMul_CoProDetach(ARMul_State*, unsigned); diff --git a/src/core/arm/skyeye_common/vfp/vfpdouble.cpp b/src/core/arm/skyeye_common/vfp/vfpdouble.cpp index 2c15db12..9a708808 100644 --- a/src/core/arm/skyeye_common/vfp/vfpdouble.cpp +++ b/src/core/arm/skyeye_common/vfp/vfpdouble.cpp @@ -908,6 +908,9 @@ vfp_double_multiply_accumulate(ARMul_State* state, int dd, int dn, int dm, u32 f vdp.sign = vfp_sign_negate(vdp.sign); vfp_double_unpack(&vdn, vfp_get_double(state, dd)); + if (vdn.exponent == 0 && vdn.significand != 0) + vfp_double_normalise_denormal(&vdn); + if (negate & NEG_SUBTRACT) vdn.sign = vfp_sign_negate(vdn.sign); diff --git a/src/core/arm/skyeye_common/vfp/vfpsingle.cpp b/src/core/arm/skyeye_common/vfp/vfpsingle.cpp index 678b63f5..8b2dfa38 100644 --- a/src/core/arm/skyeye_common/vfp/vfpsingle.cpp +++ b/src/core/arm/skyeye_common/vfp/vfpsingle.cpp @@ -941,6 +941,9 @@ vfp_single_multiply_accumulate(ARMul_State* state, int sd, int sn, s32 m, u32 fp v = vfp_get_float(state, sd); pr_debug("VFP: s%u = %08x\n", sd, v); vfp_single_unpack(&vsn, v); + if (vsn.exponent == 0 && vsn.significand != 0) + vfp_single_normalise_denormal(&vsn); + if (negate & NEG_SUBTRACT) vsn.sign = vfp_sign_negate(vsn.sign); |