mirror of
https://github.com/nArnoSNES/tcc-65816.git
synced 2024-06-11 22:29:28 +00:00
77 lines
1.5 KiB
C
77 lines
1.5 KiB
C
/* 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 ();
|
|
}
|