1/* { dg-do compile } */
2/* { dg-options -O0 } */
3
4typedef 	 int SItype	__attribute__ ((mode (SI)));
5typedef		 int DItype	__attribute__ ((mode (DI)));
6typedef unsigned int USItype	__attribute__ ((mode (SI)));
7  struct DIstruct {SItype low, high;};
8typedef union
9{
10  struct DIstruct s;
11  DItype ll;
12} DIunion;
13DItype
14__muldi3 (DItype u, DItype v)
15{
16  DIunion w;
17  DIunion uu, vv;
18  uu.ll = u,
19  vv.ll = v;
20  w.ll = ({DIunion __w;	__asm__ ("mull %3"	: "=a" ((USItype) (  __w.s.low )),	"=d" ((USItype) ( __w.s.high ))	: "%0" ((USItype) (   uu.s.low  )),	"rm" ((USItype) (    vv.s.low  ))) ;	__w.ll; }) ;
21  w.s.high += ((USItype) uu.s.low * (USItype) vv.s.high
22	       + (USItype) uu.s.high * (USItype) vv.s.low);
23  return w.ll;
24}
25