1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-24 11:31:31 +00:00
cc65/test/val/rotate8.c

157 lines
2.5 KiB
C

/*
!!DESCRIPTION!! Optimized-shift signed ints right by a constant; and, assign to chars.
!!ORIGIN!! cc65 regression tests
!!LICENCE!! Public Domain
!!AUTHOR!! Greg King
*/
#include <stdio.h>
static unsigned char failures = 0;
static unsigned char n = 0;
/* This number must be read from a variable because
** we want this program, not cc65, to do the shift.
*/
static const signed int aint0 = 0xAAC0;
static signed char achar0, achar1;
static void check(void)
{
if ((unsigned char)achar0 != (unsigned char)achar1)
++failures;
}
static void shift_right_0(void)
{
achar0 = aint0 >> 0;
check();
}
static void shift_right_1(void)
{
achar0 = aint0 >> 1;
check();
}
static void shift_right_2(void)
{
achar0 = aint0 >> 2;
check();
}
static void shift_right_3(void)
{
achar0 = aint0 >> 3;
check();
}
static void shift_right_4(void)
{
achar0 = aint0 >> 4;
check();
}
static void shift_right_5(void)
{
achar0 = aint0 >> 5;
check();
}
static void shift_right_6(void)
{
achar0 = aint0 >> 6;
check();
}
static void shift_right_7(void)
{
achar0 = aint0 >> 7;
check();
}
static void shift_right_8(void)
{
achar0 = aint0 >> 8;
check();
}
static void shift_right_9(void)
{
achar0 = aint0 >> 9;
check();
}
static void shift_right_10(void)
{
achar0 = aint0 >> 10;
check();
}
static void shift_right_11(void)
{
achar0 = aint0 >> 11;
check();
}
static void shift_right_12(void)
{
achar0 = aint0 >> 12;
check();
}
static void shift_right_13(void)
{
achar0 = aint0 >> 13;
check();
}
static void shift_right_14(void)
{
achar0 = aint0 >> 14;
check();
}
static void shift_right_15(void)
{
achar0 = aint0 >> 15;
check();
}
const struct {
signed char achar;
void (*func)(void);
} tests[] = {
{0xC0, shift_right_0},
{0x60, shift_right_1},
{0xB0, shift_right_2},
{0x58, shift_right_3},
{0xAC, shift_right_4},
{0x56, shift_right_5},
{0xAB, shift_right_6},
{0x55, shift_right_7},
{0xAA, shift_right_8},
{0xD5, shift_right_9},
{0xEA, shift_right_10},
{0xF5, shift_right_11},
{0xFA, shift_right_12},
{0xFD, shift_right_13},
{0xFE, shift_right_14},
{0xFF, shift_right_15}
};
int main(void)
{
do {
achar1 = tests[n].achar;
tests[n].func();
} while (++n < sizeof tests / sizeof tests[0]);
if (failures) {
printf("rotate8: failures: %u (of %u).\n",
failures, sizeof tests / sizeof tests[0]);
}
return failures;
}