[Bug middle-end/24627] [4.1 Regression] xntp miscompiled
pinskia at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Tue Nov 1 23:22:00 GMT 2005
------- Comment #6 from pinskia at gcc dot gnu dot org 2005-11-01 23:22 -------
Here is a little cleaned up testcase without any do {} while(0);:
extern void abort (void) __attribute__ ((noreturn));
typedef unsigned int u_int32;
typedef struct {
union {u_int32 Xl_ui;} Ul_i;
union {u_int32 Xl_uf;} Ul_f;
} l_fp;
void dolfptoa(short ndec)
{
l_fp work, ftmp;
work.Ul_i.Xl_ui = 0;
work.Ul_f.Xl_uf = 0x535f3d8;
while (ndec > 0) {
ndec--;
work.Ul_i.Xl_ui = 0;
work.Ul_i.Xl_ui <<= 1;
if ((work.Ul_f.Xl_uf) & 0x80000000)
(work.Ul_i.Xl_ui) |= 0x1; (work.Ul_f.Xl_uf) <<= 1;
// printf("%d\t", work.Ul_i.Xl_ui);
ftmp = work;
(work.Ul_i.Xl_ui) <<= 1;
if ((work.Ul_f.Xl_uf) & 0x80000000)
(work.Ul_i.Xl_ui) |= 0x1; (work.Ul_f.Xl_uf) <<= 1;
(work.Ul_i.Xl_ui) <<= 1;
if ((work.Ul_f.Xl_uf) & 0x80000000)
(work.Ul_i.Xl_ui) |= 0x1; (work.Ul_f.Xl_uf) <<= 1;
// printf("%d\t", work.Ul_i.Xl_ui);
u_int32 lo_tmp;
u_int32 hi_tmp;
lo_tmp = ((work.Ul_f.Xl_uf) & 0xffff) + ((ftmp.Ul_f.Xl_uf) & 0xffff);
hi_tmp = (((work.Ul_f.Xl_uf) >> 16) & 0xffff) + (((ftmp.Ul_f.Xl_uf) >> 16)
& 0xffff);
if (lo_tmp & 0x10000)
hi_tmp++;
(work.Ul_f.Xl_uf) = ((hi_tmp & 0xffff) << 16) | (lo_tmp & 0xffff);
(work.Ul_i.Xl_ui) += (ftmp.Ul_i.Xl_ui);
if (hi_tmp & 0x10000)
(work.Ul_i.Xl_ui)++;
// printf("%d\n", work.Ul_i.Xl_ui);
if (!(work.Ul_i.Xl_ui < 10))
abort ();
}
}
int main()
{
dolfptoa(6);
return 0;
}
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24627
More information about the Gcc-bugs
mailing list