mirror of
https://github.com/nArnoSNES/tcc-65816.git
synced 2024-06-12 13:29:29 +00:00
138 lines
2.2 KiB
C
138 lines
2.2 KiB
C
#include <stdarg.h>
|
|
|
|
extern void abort (void);
|
|
long x, y;
|
|
|
|
inline void __attribute__((always_inline))
|
|
f1i (va_list ap)
|
|
{
|
|
x = va_arg (ap, double);
|
|
x += va_arg (ap, long);
|
|
x += va_arg (ap, double);
|
|
}
|
|
|
|
void
|
|
f1 (int i, ...)
|
|
{
|
|
va_list ap;
|
|
va_start (ap, i);
|
|
f1i (ap);
|
|
va_end (ap);
|
|
}
|
|
|
|
inline void __attribute__((always_inline))
|
|
f2i (va_list ap)
|
|
{
|
|
y = va_arg (ap, int);
|
|
y += va_arg (ap, long);
|
|
y += va_arg (ap, double);
|
|
f1i (ap);
|
|
}
|
|
|
|
void
|
|
f2 (int i, ...)
|
|
{
|
|
va_list ap;
|
|
va_start (ap, i);
|
|
f2i (ap);
|
|
va_end (ap);
|
|
}
|
|
|
|
long
|
|
f3h (int i, long arg0, long arg1, long arg2, long arg3)
|
|
{
|
|
return i + arg0 + arg1 + arg2 + arg3;
|
|
}
|
|
|
|
long
|
|
f3 (int i, ...)
|
|
{
|
|
long t, arg0, arg1, arg2, arg3;
|
|
va_list ap;
|
|
|
|
va_start (ap, i);
|
|
switch (i)
|
|
{
|
|
case 0:
|
|
t = f3h (i, 0, 0, 0, 0);
|
|
break;
|
|
case 1:
|
|
arg0 = va_arg (ap, long);
|
|
t = f3h (i, arg0, 0, 0, 0);
|
|
break;
|
|
case 2:
|
|
arg0 = va_arg (ap, long);
|
|
arg1 = va_arg (ap, long);
|
|
t = f3h (i, arg0, arg1, 0, 0);
|
|
break;
|
|
case 3:
|
|
arg0 = va_arg (ap, long);
|
|
arg1 = va_arg (ap, long);
|
|
arg2 = va_arg (ap, long);
|
|
t = f3h (i, arg0, arg1, arg2, 0);
|
|
break;
|
|
case 4:
|
|
arg0 = va_arg (ap, long);
|
|
arg1 = va_arg (ap, long);
|
|
arg2 = va_arg (ap, long);
|
|
arg3 = va_arg (ap, long);
|
|
t = f3h (i, arg0, arg1, arg2, arg3);
|
|
break;
|
|
default:
|
|
abort ();
|
|
}
|
|
va_end (ap);
|
|
|
|
return t;
|
|
}
|
|
|
|
void
|
|
f4 (int i, ...)
|
|
{
|
|
va_list ap;
|
|
|
|
va_start (ap, i);
|
|
switch (i)
|
|
{
|
|
case 4:
|
|
y = va_arg (ap, double);
|
|
break;
|
|
case 5:
|
|
y = va_arg (ap, double);
|
|
y += va_arg (ap, double);
|
|
break;
|
|
default:
|
|
abort ();
|
|
}
|
|
f1i (ap);
|
|
va_end (ap);
|
|
}
|
|
|
|
int
|
|
main (void)
|
|
{
|
|
f1 (3, 16.0, 128L, 32.0);
|
|
if (x != 176L)
|
|
abort ();
|
|
f2 (6, 5, 7L, 18.0, 19.0, 17L, 64.0);
|
|
if (x != 100L || y != 30L)
|
|
abort ();
|
|
if (f3 (0) != 0)
|
|
abort ();
|
|
if (f3 (1, 18L) != 19L)
|
|
abort ();
|
|
if (f3 (2, 18L, 100L) != 120L)
|
|
abort ();
|
|
if (f3 (3, 18L, 100L, 300L) != 421L)
|
|
abort ();
|
|
if (f3 (4, 18L, 71L, 64L, 86L) != 243L)
|
|
abort ();
|
|
f4 (4, 6.0, 9.0, 16L, 18.0);
|
|
if (x != 43L || y != 6L)
|
|
abort ();
|
|
f4 (5, 7.0, 21.0, 1.0, 17L, 126.0);
|
|
if (x != 144L || y != 28L)
|
|
abort ();
|
|
return 0;
|
|
}
|