|
From: Ned K. <ne...@us...> - 2003-11-12 23:10:34
|
Update of /cvsroot/squeak/squeak/platforms/Cross/vm
In directory sc8-pr-cvs1:/tmp/cvs-serv846/platforms/Cross/vm
Modified Files:
sq.h
Log Message:
Fix for GCC 3.* float optimization bug on little-endian machines.
Committed to trunk at recommendation of Andreas Raab.
Index: sq.h
===================================================================
RCS file: /cvsroot/squeak/squeak/platforms/Cross/vm/sq.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** sq.h 20 May 2003 18:57:27 -0000 1.9
--- sq.h 12 Nov 2003 23:10:31 -0000 1.10
***************
*** 58,77 ****
*/
#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)*/
--- 58,79 ----
*/
#if defined(DOUBLE_WORD_ALIGNMENT) || defined(DOUBLE_WORD_ORDER)
+ /* this is to allow strict aliasing assumption in the optimizer */
+ typedef union { double d; int i[sizeof(double) / sizeof(int)]; } _swapper;
# ifdef DOUBLE_WORD_ORDER
/* word-based copy with swapping for non-PowerPC order */
! # define storeFloatAtfrom(intPointerToFloat, floatVarName) \
! *((int *)(intPointerToFloat) + 0) = ((_swapper *)(&floatVarName))->i[1]; \
! *((int *)(intPointerToFloat) + 1) = ((_swapper *)(&floatVarName))->i[0];
! # define fetchFloatAtinto(intPointerToFloat, floatVarName) \
! ((_swapper *)(&floatVarName))->i[1] = *((int *)(intPointerToFloat) + 0); \
! ((_swapper *)(&floatVarName))->i[0] = *((int *)(intPointerToFloat) + 1);
# else /*!DOUBLE_WORD_ORDER*/
/* word-based copy for machines with alignment restrictions */
! # define storeFloatAtfrom(intPointerToFloat, floatVarName) \
! *((int *)(intPointerToFloat) + 0) = ((_swapper *)(&floatVarName))->i[0]; \
! *((int *)(intPointerToFloat) + 1) = ((_swapper *)(&floatVarName))->i[1];
! # define fetchFloatAtinto(intPointerToFloat, floatVarName) \
! ((_swapper *)(&floatVarName))->i[0] = *((int *)(intPointerToFloat) + 0); \
! ((_swapper *)(&floatVarName))->i[1] = *((int *)(intPointerToFloat) + 1);
# endif /*!DOUBLE_WORD_ORDER*/
#else /*!(DOUBLE_WORD_ORDER||DOUBLE_WORD_ALIGNMENT)*/
|