retitle 105622 [m68k] Generates invalid asm instruction with -O2
thanks

OK, here is the test case.  I stripped out everything specific to Hercules, and
removed as many statements as possible.  If I change pretty much any of what's
left, the bug doesn't occur.  To reproduce:

[EMAIL PROTECTED]:/unstable/build/mdz/hercules-2.12$ cc -O2 -c test.c
/tmp/cc23gVSZ.s: Assembler messages:
/tmp/cc23gVSZ.s:69: Error: operands mismatch -- statement `add.l %a4,-20(%a6)' 
ignored
[EMAIL PROTECTED]:/unstable/build/mdz/hercules-2.12$ cc -O1 -c test.c
[EMAIL PROTECTED]:/unstable/build/mdz/hercules-2.12$ 

The same code compiles fine with -O2 on i386.

Versions used:

gcc             2.95.3-7
gcc-2.95        2.95.4-0.010604
libc6           2.2.3-5
cpp-2.95        2.95.4-0.010604
binutils        2.11.90.0.7-2

-- 
 - mdz
typedef unsigned int U32;
typedef unsigned long long U64;
typedef unsigned char BYTE;
typedef struct _EXTENDED_FLOAT {
        U64     ms_fract, ls_fract;     /* Fraction                  */
        short   expo;                   /* Exponent + 64             */
        BYTE    sign;                   /* Sign                      */
} EXTENDED_FLOAT;

static void func(EXTENDED_FLOAT *p) {};

void mul_ef( EXTENDED_FLOAT *fl, EXTENDED_FLOAT *mul_fl)
{
U64 wk1;
U64 wk2;
U64 wk3;
U64 wk;
U32 wk0;

	/* some function call here is necessary to reproduce the bug */
        func(mul_fl);

        wk0 = ((fl->ls_fract & 0x00000000FFFFFFFFULL) * (mul_fl->ls_fract & 0x00000000FFFFFFFFULL)) >> 32;

        wk = wk0 + (wk1 & 0x00000000FFFFFFFFULL) + (wk2 & 0x00000000FFFFFFFFULL);
        wk = (wk >> 32) + (wk1 >> 32) + (wk2 >> 32);

        wk1 = (fl->ls_fract & 0x00000000FFFFFFFFULL) * (mul_fl->ms_fract & 0x00000000FFFFFFFFULL);
        wk3 = (fl->ms_fract & 0x00000000FFFFFFFFULL) * (mul_fl->ls_fract & 0x00000000FFFFFFFFULL);

        wk2 = (fl->ls_fract >> 32) * (mul_fl->ms_fract & 0x00000000FFFFFFFFULL);

        wk2 = (fl->ms_fract & 0x00000000FFFFFFFFULL) * (mul_fl->ms_fract & 0x00000000FFFFFFFFULL);
        wk += ((wk1 & 0x00000000FFFFFFFFULL) + (wk2 & 0x00000000FFFFFFFFULL) + (wk3 & 0x00000000FFFFFFFFULL));
        fl->ls_fract = wk & 0x00000000FFFFFFFFULL;
} /* end function mul_ef */

/* end of float.c */

Reply via email to