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 
6 extern void abort (void);
7 extern 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
18 union u { unsigned long long ll; unsigned int i[2]; };
19 
20 unsigned int __attribute__ ((nomips16))
foo(volatile unsigned int * ptr)21 foo (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 
34 int __attribute__ ((nomips16))
main(void)35 main (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