1/* From PR rtl-optimization/19683.  On little-endian MIPS targets,
2   reload would incorrectly inherit the high part of the multiplication
3   result.  */
4/* { dg-do run { target mips*-*-* } } */
5
6extern void abort (void);
7extern void exit (int);
8
9#define REPEAT10(X, Y)					\
10  X(Y##0); X(Y##1); X(Y##2); X(Y##3); X(Y##4);		\
11  X(Y##5); X(Y##6); X(Y##7); X(Y##8); X(Y##9)
12
13#define REPEAT30(X) REPEAT10 (X, 0); REPEAT10 (X, 1); REPEAT10 (X, 2)
14#define IN(X) unsigned int x##X = ptr[0]
15#define OUT(X) ptr[0] = x##X
16
17#if __mips_isa_rev <= 5
18union u { unsigned long long ll; unsigned int i[2]; };
19
20unsigned int __attribute__ ((nomips16))
21foo (volatile unsigned int *ptr)
22{
23  union u u;
24  int result;
25
26  u.ll = (unsigned long long) ptr[0] * ptr[0];
27  REPEAT30 (IN);
28  REPEAT30 (OUT);
29  asm ("#" : "=l" (result) : "l" (u.i[1]));
30  return result;
31}
32#endif
33
34int __attribute__ ((nomips16))
35main (void)
36{
37#if __mips_isa_rev <= 5
38  unsigned int array[] = { 1000 * 1000 * 1000 };
39  union u u;
40
41  u.ll = (unsigned long long) array[0] * array[0];
42  if (foo (array) != u.i[1])
43    abort ();
44#endif
45  exit (0);
46}
47