blob: 7c8e0ea290f76273f46182fafb4cd478cb8e4c4f [file] [log] [blame]
/* 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 ();
}