]> git.sur5r.net Git - cc65/blob - test/val/rotate8.c
Merge pull request #645 from polluks/patch-7
[cc65] / test / val / rotate8.c
1 /*
2   !!DESCRIPTION!! Optimized-shift signed ints right by a constant; and, assign to chars.
3   !!ORIGIN!!      cc65 regression tests
4   !!LICENCE!!     Public Domain
5   !!AUTHOR!!      Greg King
6 */
7
8 #include <stdio.h>
9
10 static unsigned char failures = 0;
11 static unsigned char n = 0;
12
13 /* This number must be read from a variable because
14 ** we want this program, not cc65, to do the shift.
15 */
16 static const signed int aint0 = 0xAAC0;
17
18 static signed char achar0, achar1;
19
20 static void check(void)
21 {
22     if ((unsigned char)achar0 != (unsigned char)achar1)
23         ++failures;
24 }
25
26 static void shift_right_0(void)
27 {
28     achar0 = aint0 >> 0;
29     check();
30 }
31
32 static void shift_right_1(void)
33 {
34     achar0 = aint0 >> 1;
35     check();
36 }
37
38 static void shift_right_2(void)
39 {
40     achar0 = aint0 >> 2;
41     check();
42 }
43
44 static void shift_right_3(void)
45 {
46     achar0 = aint0 >> 3;
47     check();
48 }
49
50 static void shift_right_4(void)
51 {
52     achar0 = aint0 >> 4;
53     check();
54 }
55
56 static void shift_right_5(void)
57 {
58     achar0 = aint0 >> 5;
59     check();
60 }
61
62 static void shift_right_6(void)
63 {
64     achar0 = aint0 >> 6;
65     check();
66 }
67
68 static void shift_right_7(void)
69 {
70     achar0 = aint0 >> 7;
71     check();
72 }
73
74 static void shift_right_8(void)
75 {
76     achar0 = aint0 >> 8;
77     check();
78 }
79
80 static void shift_right_9(void)
81 {
82     achar0 = aint0 >> 9;
83     check();
84 }
85
86 static void shift_right_10(void)
87 {
88     achar0 = aint0 >> 10;
89     check();
90 }
91
92 static void shift_right_11(void)
93 {
94     achar0 = aint0 >> 11;
95     check();
96 }
97
98 static void shift_right_12(void)
99 {
100     achar0 = aint0 >> 12;
101     check();
102 }
103
104 static void shift_right_13(void)
105 {
106     achar0 = aint0 >> 13;
107     check();
108 }
109
110 static void shift_right_14(void)
111 {
112     achar0 = aint0 >> 14;
113     check();
114 }
115
116 static void shift_right_15(void)
117 {
118     achar0 = aint0 >> 15;
119     check();
120 }
121
122 const struct {
123     signed char achar;
124     void (*func)(void);
125 } tests[] = {
126     {0xC0, shift_right_0},
127     {0x60, shift_right_1},
128     {0xB0, shift_right_2},
129     {0x58, shift_right_3},
130     {0xAC, shift_right_4},
131     {0x56, shift_right_5},
132     {0xAB, shift_right_6},
133     {0x55, shift_right_7},
134     {0xAA, shift_right_8},
135     {0xD5, shift_right_9},
136     {0xEA, shift_right_10},
137     {0xF5, shift_right_11},
138     {0xFA, shift_right_12},
139     {0xFD, shift_right_13},
140     {0xFE, shift_right_14},
141     {0xFF, shift_right_15}
142 };
143
144 int main(void)
145 {
146     do {
147         achar1 = tests[n].achar;
148         tests[n].func();
149     } while (++n < sizeof tests / sizeof tests[0]);
150
151     if (failures) {
152         printf("rotate8: failures: %u (of %u).\n",
153                failures, sizeof tests / sizeof tests[0]);
154     }
155     return failures;
156 }