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