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)19 f1 (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()53 main ()
54 {
55   io io0;
56   f1 (&io0);
57   abort ();
58 }
59 
60 void
test(void)61 test (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)70 f0 (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