Merge -r 127928:132243 from trunk
[official-gcc.git] / gcc / testsuite / gcc.dg / torture / pr19683-1.c
blob05bf174183b7e392fef8ce410fbfc7998bbfb4d7
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*-*-* } } */
6 extern void abort (void);
7 extern void exit (int);
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)
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
17 union u { unsigned long long ll; unsigned int i[2]; };
19 unsigned int __attribute__ ((nomips16))
20 foo (volatile unsigned int *ptr)
22 union u u;
23 int result;
25 u.ll = (unsigned long long) ptr[0] * ptr[0];
26 REPEAT30 (IN);
27 REPEAT30 (OUT);
28 asm ("#" : "=l" (result) : "l" (u.i[1]));
29 return result;
32 int __attribute__ ((nomips16))
33 main (void)
35 unsigned int array[] = { 1000 * 1000 * 1000 };
36 union u u;
38 u.ll = (unsigned long long) array[0] * array[0];
39 if (foo (array) != u.i[1])
40 abort ();
41 exit (0);