From mboxrd@z Thu Jan 1 00:00:00 1970 From: hjl@lucon.org (H.J. Lu) To: wilson@cygnus.com, law@cygnus.com, scox@cygnus.com, crux@pool.informatik.rwth-aachen.de Cc: egcs@cygnus.com Subject: More fp bug in egcs Date: Sat, 25 Apr 1998 18:25:00 -0000 Message-id: X-SW-Source: 1998-04/msg01026.html Hi, I discovered this x86 fp bug by accident. # gcc -B/home/work/gnu/bin/egcs/gcc/ -S mpgeomnn.c gcc: Internal compiler error: program cc1 got fatal signal 6 It is very similar to the one fixed by Jim. It will compile if -O is used. I think it may have something to do with Jim's patch. In the greg rtl dump, the clobbered register is used as input in the next insn. Thanks. -- H.J. Lu (hjl@gnu.org) ---mpgeomnn.c--- typedef struct _geom_elem { double coeffs[6]; double constant[3 ]; int do_band[3]; } pGeomDefRec, *pGeomDefPtr; typedef struct _mpgeombanddef { double first_mlow, first_mhigh; int first_ilow, first_ihigh; double *s_locs; int *x_locs; int x_start; int x_end; int int_constant; int yOut; int out_width; int out_height; int in_width; int in_height; int lo_src_available; int hi_src_available; void (*linefunc) (); void (*fillfunc) (); } mpGeometryBandRec, *mpGeometryBandPtr; typedef void *pointer; typedef unsigned char CARD8; typedef CARD8 BytePixel; static void BiGL_B (OUTP,srcimg,width,sline,pedpvt,pvtband) pointer OUTP; pointer *srcimg; register int width; int sline; pGeomDefPtr pedpvt; mpGeometryBandPtr pvtband; { register float s, t, st; register double a = pedpvt->coeffs[0]; register double c = pedpvt->coeffs[2]; register double srcpix = a * ((double)(0.0000)) + pedpvt->coeffs[1] * (pvtband->yOut + ((double)(0.0000)) ) + pedpvt->coeffs[4]; register double srcline = c * ((double)(0.0000)) + pedpvt->coeffs[3] * (pvtband->yOut + ((double)(0.0000)) ) + pedpvt->coeffs[5]; register int isrcline,isrcpix; register BytePixel constant = ( BytePixel ) pvtband-> int_constant ; register BytePixel *outp = ( BytePixel *) OUTP; register BytePixel *ptrIn, *ptrJn; register BytePixel val; register int srcwidth = pvtband->in_width - 1; register int minline = pvtband->lo_src_available; register int maxline = pvtband->hi_src_available; while ( width > 0 ) { isrcline = srcline; isrcpix = srcpix; val = constant; if ( (isrcline >= minline) && (isrcline < maxline) ) { s = srcpix - isrcpix; ptrIn = ( BytePixel *) srcimg[isrcline]; t = srcline - isrcline; ptrJn = ( BytePixel *) srcimg[isrcline+1]; st = s * t; if ( (isrcpix >= 0) && (isrcpix < srcwidth) ) val = ptrIn[isrcpix] * ((float)1. - s - t + st) + ptrIn[isrcpix+1] * (s - st) + ptrJn[isrcpix] * (t - st) + ptrJn[isrcpix+1] * (st) + (float)0.5 ; } width--; srcline += c; srcpix += a; *outp++ = val; } }