More fp bug in egcs
H.J. Lu
hjl@lucon.org
Sat Apr 25 18:25:00 GMT 1998
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; } }
More information about the Gcc
mailing list