modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/20031201-1.c (about)

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