c/6893: gcc generates invalid code for x86 subarches.
Glen Nakamura
glen@imodulo.com
Sat Jun 1 08:48:00 GMT 2002
http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=6893
Aloha,
Looks like the testcase you provided has an aliasing problem:
icolor = (int *) tmp;
Strict aliasing does not allow casting from (float *) to (int *)...
You will need to fix your code or compile w/ -fno-strict-aliasing.
See the GCC documentation on -fstrict-aliasing for more information.
Please check if your problem persists with the attached testcase.
- Glen Nakamura
-------------- next part --------------
#include <stdio.h>
#include <stdlib.h>
#define min(a,b) ((a) < (b) ? (a) : (b))
typedef union {
float f;
int i;
} tmp_t;
float source[4];
tmp_t tmp[4];
unsigned char out[4];
extern void inline FtoUB (float *in, char *out, int num)
{
int i;
tmp_t *icolor;
tmp_t *fcolor_to;
fcolor_to = tmp;
// shift float to have 8bit fraction at base of number
for (i = 0; i < num; i += 4) {
fcolor_to[i ].f = in[i ] + 32768.0f;
fcolor_to[i + 1].f = in[i + 1] + 32768.0f;
fcolor_to[i + 2].f = in[i + 2] + 32768.0f;
fcolor_to[i + 3].f = in[i + 3] + 32768.0f;
}
icolor = tmp;
// then read as integer and kill float bits...
for (i = 0; i < num; i += 4) {
out[i ] = (char) min(icolor[i ].i & 0x7FFFFF, 255);
out[i + 1] = (char) min(icolor[i + 1].i & 0x7FFFFF, 255);
out[i + 2] = (char) min(icolor[i + 2].i & 0x7FFFFF, 255);
out[i + 3] = (char) min(icolor[i + 3].i & 0x7FFFFF, 255);
}
}
int
main (int argc, char *argv[])
{
source[0] = atof(argv[1]);
source[1] = atof(argv[2]);
source[2] = atof(argv[3]);
source[3] = atof(argv[4]);
FtoUB(source, out, 4);
printf("in: %f %f %f %f\n", source[0], source[1], source[2], source[3]);
printf("out: %d %d %d %d\n", out[0], out[1], out[2], out[3]);
exit (0);
}
More information about the Gcc-bugs
mailing list