1 /* Copyright (C) 2003 Free Software Foundation. 2 PR target/13256 3 STRICT_LOW_PART was handled incorrectly in delay slots. 4 Origin: Hans-Peter Nilsson. */ 5 6 typedef struct { unsigned int e0 : 16; unsigned int e1 : 16; } s1; 7 typedef struct { unsigned int e0 : 16; unsigned int e1 : 16; } s2; 8 typedef struct { s1 i12; s2 i16; } io; 9 static int test_length = 2; 10 static io *i; 11 static int m = 1; 12 static int d = 1; 13 static unsigned long test_t0; 14 static unsigned long test_t1; 15 void test(void) __attribute__ ((__noinline__)); 16 extern int f1 (void *port) __attribute__ ((__noinline__)); 17 extern void f0 (void) __attribute__ ((__noinline__)); 18 int f1(void * port)19f1 (void *port) 20 { 21 int fail_count = 0; 22 unsigned long tlen; 23 s1 x0 = {0}; 24 s2 x1 = {0}; 25 26 i = port; 27 x0.e0 = x1.e0 = 32; 28 i->i12 = x0; 29 i->i16 = x1; 30 do f0(); while (test_t1); 31 x0.e0 = x1.e0 = 8; 32 i->i12 = x0; 33 i->i16 = x1; 34 test (); 35 if (m) 36 { 37 unsigned long e = 1000000000 / 460800 * test_length; 38 tlen = test_t1 - test_t0; 39 if (((tlen-e) & 0x7FFFFFFF) > 1000) 40 f0(); 41 } 42 if (d) 43 { 44 unsigned long e = 1000000000 / 460800 * test_length; 45 tlen = test_t1 - test_t0; 46 if (((tlen - e) & 0x7FFFFFFF) > 1000) 47 f0(); 48 } 49 return fail_count != 0 ? 1 : 0; 50 } 51 52 int main()53main () 54 { 55 io io0; 56 f1 (&io0); 57 abort (); 58 } 59 60 void test(void)61test (void) 62 { 63 io *iop = i; 64 if (iop->i12.e0 != 8 || iop->i16.e0 != 8) 65 abort (); 66 exit (0); 67 } 68 69 void f0(void)70f0 (void) 71 { 72 static int washere = 0; 73 io *iop = i; 74 if (washere++ || iop->i12.e0 != 32 || iop->i16.e0 != 32) 75 abort (); 76 } 77