* gencode.c (process_instructions): Generate word64 and uword64

instead of `long long' and `unsigned long long' data types.
	* interp.c:  #include sysdep.h to get signals, and define default
	for SIGBUS.
	* (Convert):  Work around for Visual-C++ compiler bug with type
	conversion.
	* support.h:  Make things compile under Visual-C++ by using
	__int64 instead of `long long'.  Change many refs to long long
	into word64/uword64 typedefs.
This commit is contained in:
Stu Grossman
1996-07-18 01:21:16 +00:00
parent 2ba0d82d52
commit 4fa14cf71c
2 changed files with 22 additions and 13 deletions

View File

@ -1017,13 +1017,17 @@ process_instructions(doarch,features)
case ADD: case ADD:
case SUB: case SUB:
{ {
char *basetype = "unknown"; char *signed_basetype = "unknown";
char *unsigned_basetype = "unknown";
switch (GETDATASIZE()) { switch (GETDATASIZE()) {
case WORD : case WORD :
basetype = "int"; signed_basetype = "signed int";
unsigned_basetype = "unsigned int";
break; break;
case DOUBLEWORD : case DOUBLEWORD :
basetype = "long long"; signed_basetype = "word64";
unsigned_basetype = "uword64";
break; break;
default : default :
fprintf(stderr,"Opcode table error: size of ADD/SUB operands not known (%d)\n",GETDATASIZE()); fprintf(stderr,"Opcode table error: size of ADD/SUB operands not known (%d)\n",GETDATASIZE());
@ -1031,8 +1035,8 @@ process_instructions(doarch,features)
} }
if ((MIPS_DECODE[loop].type) == ADD) { if ((MIPS_DECODE[loop].type) == ADD) {
printf(" unsigned %s temp = (unsigned %s)(op1 + op2);\n",basetype,basetype); printf(" %s temp = (%s)(op1 + op2);\n", unsigned_basetype, unsigned_basetype);
printf(" signed %s tempS = (signed %s)temp;\n",basetype,basetype); printf(" %s tempS = (%s)temp;\n", signed_basetype, signed_basetype);
if (MIPS_DECODE[loop].flags & OVERFLOW) { if (MIPS_DECODE[loop].flags & OVERFLOW) {
printf(" if (((op1 < 0) == (op2 < 0)) && ((tempS < 0) != (op1 < 0)))\n"); printf(" if (((op1 < 0) == (op2 < 0)) && ((tempS < 0) != (op1 < 0)))\n");
printf(" SignalException(IntegerOverflow);\n"); printf(" SignalException(IntegerOverflow);\n");
@ -1043,8 +1047,8 @@ process_instructions(doarch,features)
else /* only sign-extend when placing 32bit result in 64bit processor */ else /* only sign-extend when placing 32bit result in 64bit processor */
printf(" GPR[destreg] = SIGNEXTEND(((%s)temp),32);\n",regtype); printf(" GPR[destreg] = SIGNEXTEND(((%s)temp),32);\n",regtype);
} else { /* SUB */ } else { /* SUB */
printf(" unsigned %s temp = (unsigned %s)(op1 - op2);\n",basetype,basetype); printf(" %s temp = (%s)(op1 - op2);\n", unsigned_basetype, unsigned_basetype);
printf(" signed %s tempS = (signed %s)temp;\n",basetype,basetype); printf(" %s tempS = (%s)temp;\n", signed_basetype, signed_basetype);
if (MIPS_DECODE[loop].flags & OVERFLOW) { /* different signs => overflow if result_sign != arg_sign */ if (MIPS_DECODE[loop].flags & OVERFLOW) { /* different signs => overflow if result_sign != arg_sign */
printf(" if (((op1 < 0) != (op2 < 0)) && ((tempS < 0) == (op1 < 0)))\n"); printf(" if (((op1 < 0) != (op2 < 0)) && ((tempS < 0) == (op1 < 0)))\n");
printf(" SignalException(IntegerOverflow);\n"); printf(" SignalException(IntegerOverflow);\n");

View File

@ -30,10 +30,15 @@
architectures if desired. */ architectures if desired. */
/* Control via a build boolean for the moment */ /* Control via a build boolean for the moment */
#if defined(__GNUC__) #if defined(__GNUC__) || defined(__WIN32__)
#ifdef __WIN32__
typedef signed __int64 word64;
typedef unsigned __int64 uword64;
#else
typedef long long word64; typedef long long word64;
typedef unsigned long long uword64; typedef unsigned long long uword64;
#endif
#define WORD64LO(t) (unsigned int)((t)&0xFFFFFFFF) #define WORD64LO(t) (unsigned int)((t)&0xFFFFFFFF)
#define WORD64HI(t) (unsigned int)(((uword64)(t))>>32) #define WORD64HI(t) (unsigned int)(((uword64)(t))>>32)
@ -43,13 +48,13 @@ typedef unsigned long long uword64;
/* Sign-extend the given value (e) as a value (b) bits long. We cannot /* Sign-extend the given value (e) as a value (b) bits long. We cannot
assume the HI32bits of the operand are zero, so we must perform a assume the HI32bits of the operand are zero, so we must perform a
mask to ensure we can use the simple subtraction to sign-extend. */ mask to ensure we can use the simple subtraction to sign-extend. */
#define SIGNEXTEND(e,b) (((e) & ((unsigned long long)1 << ((b) - 1))) ? (((e) & (((unsigned long long)1 << (b)) - 1)) - ((unsigned long long)1 << (b))) : (e)) #define SIGNEXTEND(e,b) (((e) & ((uword64)1 << ((b) - 1))) ? (((e) & (((uword64)1 << (b)) - 1)) - ((uword64)1 << (b))) : (e))
/* Check if a value will fit within a word (unsigned int): */ /* Check if a value will fit within a word (unsigned int): */
#define NOTWORDVALUE(v) ((((((unsigned long long)(v)>>32) == 0) && !((v) & ((unsigned)1 << 31))) || ((((unsigned long long)(v)>>32) == 0xFFFFFFFF) && ((v) & ((unsigned)1 << 31)))) ? (1 == 0) : (1 == 1)) #define NOTWORDVALUE(v) ((((((uword64)(v)>>32) == 0) && !((v) & ((unsigned)1 << 31))) || ((((uword64)(v)>>32) == 0xFFFFFFFF) && ((v) & ((unsigned)1 << 31)))) ? (1 == 0) : (1 == 1))
/* Check if a value will fit within a halfword: */ /* Check if a value will fit within a halfword: */
#define NOTHALFWORDVALUE(v) ((((((unsigned long long)(v)>>16) == 0) && !((v) & ((unsigned)1 << 15))) || (((((unsigned long long)(v)>>32) == 0xFFFFFFFF) && ((((unsigned long long)(v)>>16) & 0xFFFF) == 0xFFFF)) && ((v) & ((unsigned)1 << 15)))) ? (1 == 0) : (1 == 1)) #define NOTHALFWORDVALUE(v) ((((((uword64)(v)>>16) == 0) && !((v) & ((unsigned)1 << 15))) || (((((uword64)(v)>>32) == 0xFFFFFFFF) && ((((uword64)(v)>>16) & 0xFFFF) == 0xFFFF)) && ((v) & ((unsigned)1 << 15)))) ? (1 == 0) : (1 == 1))
/* The following should be executed once at the start of day in the /* The following should be executed once at the start of day in the
main emulator control function. The simulator assumes char is main emulator control function. The simulator assumes char is
@ -57,8 +62,8 @@ typedef unsigned long long uword64;
#define CHECKSIM() {\ #define CHECKSIM() {\
if (sizeof(int) != (4 * sizeof(char)))\ if (sizeof(int) != (4 * sizeof(char)))\
SignalException(SimulatorFault,"sizeof(int) != 4");\ SignalException(SimulatorFault,"sizeof(int) != 4");\
if (sizeof(long long) != (8 * sizeof(char)))\ if (sizeof(word64) != (8 * sizeof(char)))\
SignalException(SimulatorFault,"sizeof(long long) != 8");\ SignalException(SimulatorFault,"sizeof(word64) != 8");\
} }
#else /* non-GCC build */ #else /* non-GCC build */