Floats in squeak...

Ian Piumarta ian.piumarta at inria.fr
Sat Sep 6 20:08:48 UTC 2003


On Sat, 6 Sep 2003, Ian Piumarta wrote:

> (I could try to make a small test-case program if you like.)

Attached.

If you don't want to check the pending bugs on the gcc site and file the
PR only if it's not already there, then I'm willing to do it.

Ian


/* compile-command:	gcc -O2 -fomit-frame-pointer -o fpbug fpbug.c
 *			gcc -O2 -fomit-frame-pointer -o fpbug fpbug.c -DBUGFIX=1
 */


#define BaseHeaderSize 4

#define longAt(i) (*((int *) (i)))


/* #undef	WORDS_BIGENDIAN */
/* #undef	DOUBLE_WORD_ALIGNMENT */
#define	DOUBLE_WORD_ORDER 1


#if defined(DOUBLE_WORD_ALIGNMENT) || defined(DOUBLE_WORD_ORDER)
# ifdef DOUBLE_WORD_ORDER
/* word-based copy with swapping for non-PowerPC order */
#   define storeFloatAtfrom(i, floatVarName) \
	*((int *) (i) + 0) = *((int *) &(floatVarName) + 1); \
	*((int *) (i) + 1) = *((int *) &(floatVarName) + 0);
#   define fetchFloatAtinto(i, floatVarName) \
	*((int *) &(floatVarName) + 0) = *((int *) (i) + 1); \
	*((int *) &(floatVarName) + 1) = *((int *) (i) + 0);
# else /*!DOUBLE_WORD_ORDER*/
/* word-based copy for machines with alignment restrictions */
#   define storeFloatAtfrom(i, floatVarName) \
	*((int *) (i) + 0) = *((int *) &(floatVarName) + 0); \
	*((int *) (i) + 1) = *((int *) &(floatVarName) + 1);
#   define fetchFloatAtinto(i, floatVarName) \
	*((int *) &(floatVarName) + 0) = *((int *) (i) + 0); \
	*((int *) &(floatVarName) + 1) = *((int *) (i) + 1);
# endif /*!DOUBLE_WORD_ORDER*/
#else /*!(DOUBLE_WORD_ORDER||DOUBLE_WORD_ALIGNMENT)*/
/* for machines that allow doubles to be on any word boundary */
# define storeFloatAtfrom(i, floatVarName) \
	*((double *) (i)) = (floatVarName);
# define fetchFloatAtinto(i, floatVarName) \
	(floatVarName) = *((double *) (i));
#endif


struct foo {
  int stackPointer;
} fum;
struct foo *foo= &fum;


double stackFloatValue(int offset) {
register struct foo * foo = &fum;
    double result;
    int floatPointer;
	floatPointer = longAt(foo->stackPointer - (offset * 4));
	fetchFloatAtinto(floatPointer + BaseHeaderSize, result);
#ifdef BUGFIX
	asm("");
#endif
	return result;
}


struct Float
{
  unsigned int baseHeader;
  unsigned int bytes[2];
};


static struct Float myFloat;
static int stack[2];


int main()
{
  double result;

  myFloat.bytes[0]= 0x400921fb;
  myFloat.bytes[1]= 0x54442d02;

  stack[0]= (int)&myFloat;
  fum.stackPointer= (int)(&stack[1]);

  result= stackFloatValue(1);
  printf("got %lf\n", result);
  result= stackFloatValue(1);
  printf("got %lf\n", result);

  return 0;
}



More information about the Squeak-dev mailing list