/* PR rtl-optimization/33552 */ /* { dg-do run } */ /* { dg-options "-O2" } */ extern void abort (void); void __attribute__((noinline)) foo (unsigned long *wp, unsigned long *up, long un, unsigned long *vp) { long j; unsigned long prod_low, prod_high; unsigned long cy_dig; unsigned long v_limb; v_limb = vp[0]; cy_dig = 64; for (j = un; j > 0; j--) { unsigned long u_limb, w_limb; u_limb = *up++; __asm__ ("" : "=r" (prod_low), "=r" (prod_high) : "0" (u_limb), "1" (v_limb)); __asm__ ("mov %5, %1; add %5, %0" : "=r" (cy_dig), "=&r" (w_limb) : "0" (prod_high), "rm" (0), "1" (prod_low), "rm" (cy_dig)); *wp++ = w_limb; } } int main (void) { unsigned long wp[4]; unsigned long up[4] = { 0x1248, 0x248a, 0x1745, 0x1853 }; unsigned long vp = 0xdead; foo (wp, up, 4, &vp); if (wp[0] != 0x40 || wp[1] != 0xdeed || wp[2] != 0x1bd9a || wp[3] != 0x29c47) abort (); return 0; }