42 lines
1001 B
C
42 lines
1001 B
C
/* 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;
|
|
}
|