1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdio.h>
2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define get_cc() \
4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov({ \
5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   char __cc; \
6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* don't use IPM to better test spechelpers */ \
7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   asm volatile( "brc 8,1f\n\t" \
8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "brc 4,2f\n\t" \
9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "brc 2,3f\n\t" \
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "brc 1,4f\n\t" \
11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "mvi %0,4\n\t" \
12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "j   0f\n\t" \
13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "1:  mvi %0,0\n\t" \
14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "j   0f\n\t" \
15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "2:  mvi %0,1\n\t" \
16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "j   0f\n\t" \
17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "3:  mvi %0,2\n\t" \
18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "j   0f\n\t" \
19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "4:  mvi %0,3\n\t" \
20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "j   0f\n\t" \
21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "0:  /* nop */ brc 0,0\n\t" \
22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 : "=m" (__cc) : : "memory"); \
23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov	__cc; \
24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov})
25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid check_cc(int value, int cc)
27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (cc != value) {
29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("wrong cc: ");
30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (value == 0) printf("expected 0  ");
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (value == 1) printf("expected 1  ");
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (value == 2) printf("expected 2  ");
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (value == 3) printf("expected 3  ");
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (cc == 0) printf("got 0");
35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (cc == 1) printf("got 1");
36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (cc == 2) printf("got 2");
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (cc == 3) printf("got 3");
38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      printf("OK");
40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   printf("\n");
42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid tm(void)
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   unsigned char v;
47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* test #1: value is zero */
49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   v = 0;
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   asm volatile( "tm   %[v],15\n\t" : : [v] "R"(v) : "cc");
51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   check_cc(0, get_cc());
52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* test #2: mask is zero */
54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   v = 0xFF;
55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   asm volatile( "tm   %[v],0\n\t" : : [v] "R"(v) : "cc");
56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   check_cc(0, get_cc());
57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* test #3: selected bits are 0 */
59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   v = 0x0F;
60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   asm volatile( "tm   %[v],0xf0\n\t" : : [v] "R"(v) : "cc");
61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   check_cc(0, get_cc());
62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* test #4: selected bits are all 1 */
64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   v = 0xF0;
65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   asm volatile( "tm   %[v],0x70\n\t" : : [v] "R"(v) : "cc");
66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   check_cc(3, get_cc());
67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* test #5: selected bits are mixed */
69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   v = 0x0F;
70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   asm volatile( "tm   %[v],0x81\n\t" : : [v] "R"(v) : "cc");
71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   check_cc(1, get_cc());
72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
73436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint main(void)
75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   tm();
77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return 0;
79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
80