• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdio.h>
2 
3 #define branch(mask,_v1,_v2)                           \
4   ({                                                   \
5         unsigned char taken;                           \
6         unsigned b1 = _v1, b2 = _v2;                   \
7         asm volatile("     or   %[b1],%[b2]\n\t"       \
8                      "     brc  " #mask " ,1f\n\t"     \
9                      "     mvi  %[taken],0\n\t"        \
10                      "     j    0f\n\t"                \
11                      "1:   mvi  %[taken],1\n\t"        \
12                      "0:   bcr  0,0 /* nop */\n\t"     \
13              : [taken] "=Q" (taken), [b1] "+d"(b1)     \
14              : [b2] "d"(b2)                            \
15              : "cc");                                  \
16         taken;                                         \
17    })
18 
19 void
or_1(void)20 or_1(void)
21 {
22    int wrong, ok, v1, v2;
23 
24    printf("Test #1  result = 0\n");
25 
26    v1 = v2 = 0;
27    wrong = ok = 0;
28    if (branch(0,  v1, v2)) ++wrong; else ++ok;
29    if (branch(1,  v1, v2)) ++wrong; else ++ok;
30    if (branch(2,  v1, v2)) ++wrong; else ++ok;
31    if (branch(3,  v1, v2)) ++wrong; else ++ok;
32    if (branch(4,  v1, v2)) ++wrong; else ++ok;
33    if (branch(5,  v1, v2)) ++wrong; else ++ok;
34    if (branch(6,  v1, v2)) ++wrong; else ++ok;
35    if (branch(7,  v1, v2)) ++wrong; else ++ok;
36    if (branch(8,  v1, v2)) ++ok; else ++wrong;
37    if (branch(9,  v1, v2)) ++ok; else ++wrong;
38    if (branch(10, v1, v2)) ++ok; else ++wrong;
39    if (branch(11, v1, v2)) ++ok; else ++wrong;
40    if (branch(12, v1, v2)) ++ok; else ++wrong;
41    if (branch(13, v1, v2)) ++ok; else ++wrong;
42    if (branch(14, v1, v2)) ++ok; else ++wrong;
43    if (branch(15, v1, v2)) ++ok; else ++wrong;
44 
45    if (wrong != 0 || ok != 16)
46       printf("FAILED\n");
47    else
48       printf("OK\n");
49 }
50 
51 void
or_2(void)52 or_2(void)
53 {
54    int wrong, ok, v1, v2;
55 
56    printf("Test #2  result = 0xffffffff\n");
57    v1 = 0;
58    v2 = ~0;
59    wrong = ok = 0;
60    if (branch(0,  v1, v2)) ++wrong; else ++ok;
61    if (branch(1,  v1, v2)) ++wrong; else ++ok;
62    if (branch(2,  v1, v2)) ++wrong; else ++ok;
63    if (branch(3,  v1, v2)) ++wrong; else ++ok;
64    if (branch(4,  v1, v2)) ++ok; else ++wrong;
65    if (branch(5,  v1, v2)) ++ok; else ++wrong;
66    if (branch(6,  v1, v2)) ++ok; else ++wrong;
67    if (branch(7,  v1, v2)) ++ok; else ++wrong;
68    if (branch(8,  v1, v2)) ++wrong; else ++ok;
69    if (branch(9,  v1, v2)) ++wrong; else ++ok;
70    if (branch(10, v1, v2)) ++wrong; else ++ok;
71    if (branch(11, v1, v2)) ++wrong; else ++ok;
72    if (branch(12, v1, v2)) ++ok; else ++wrong;
73    if (branch(13, v1, v2)) ++ok; else ++wrong;
74    if (branch(14, v1, v2)) ++ok; else ++wrong;
75    if (branch(15, v1, v2)) ++ok; else ++wrong;
76 
77    if (wrong != 0 || ok != 16)
78       printf("FAILED\n");
79    else
80       printf("OK\n");
81 }
82 
main()83 int main()
84 {
85    or_1();
86    or_2();
87    return 0;
88 }
89