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
|