/* Copyright (C) 2003 Free Software Foundation. PR target/13256 STRICT_LOW_PART was handled incorrectly in delay slots. Origin: Hans-Peter Nilsson. */ typedef struct { unsigned int e0 : 16; unsigned int e1 : 16; } s1; typedef struct { unsigned int e0 : 16; unsigned int e1 : 16; } s2; typedef struct { s1 i12; s2 i16; } io; static int test_length = 2; static io *i; static int m = 1; static int d = 1; static unsigned long test_t0; static unsigned long test_t1; void test(void) __attribute__ ((__noinline__)); extern int f1 (void *port) __attribute__ ((__noinline__)); extern void f0 (void) __attribute__ ((__noinline__)); int f1 (void *port) { int fail_count = 0; unsigned long tlen; s1 x0 = {0}; s2 x1 = {0}; i = port; x0.e0 = x1.e0 = 32; i->i12 = x0; i->i16 = x1; do f0(); while (test_t1); x0.e0 = x1.e0 = 8; i->i12 = x0; i->i16 = x1; test (); if (m) { unsigned long e = 1000000000 / 460800 * test_length; tlen = test_t1 - test_t0; if (((tlen-e) & 0x7FFFFFFF) > 1000) f0(); } if (d) { unsigned long e = 1000000000 / 460800 * test_length; tlen = test_t1 - test_t0; if (((tlen - e) & 0x7FFFFFFF) > 1000) f0(); } return fail_count != 0 ? 1 : 0; } int main () { io io0; f1 (&io0); abort (); } void test (void) { io *iop = i; if (iop->i12.e0 != 8 || iop->i16.e0 != 8) abort (); exit (0); } void f0 (void) { static int washere = 0; io *iop = i; if (washere++ || iop->i12.e0 != 32 || iop->i16.e0 != 32) abort (); }