1 #include <stdio.h> 2 3 #define branch(mask,i2,_v1) \ 4 ({ \ 5 unsigned char taken; \ 6 unsigned char v1 = _v1; \ 7 asm volatile( " tm %[v]," #i2 "\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) \ 14 : [v] "Q"(v1) \ 15 : "cc"); \ 16 taken; \ 17 }) 18 19 void 20 tm_mask_0(void) 21 { 22 int wrong, ok; 23 unsigned char v; 24 25 printf("Test #1 mask == 0, value == ~0 --> cc == 0\n"); 26 27 v = ~0; 28 wrong = ok = 0; 29 30 if (branch(0, 0, v)) ++wrong; else ++ok; 31 if (branch(1, 0, v)) ++wrong; else ++ok; 32 if (branch(2, 0, v)) ++wrong; else ++ok; 33 if (branch(3, 0, v)) ++wrong; else ++ok; 34 if (branch(4, 0, v)) ++wrong; else ++ok; 35 if (branch(5, 0, v)) ++wrong; else ++ok; 36 if (branch(6, 0, v)) ++wrong; else ++ok; 37 if (branch(7, 0, v)) ++wrong; else ++ok; 38 if (branch(8, 0, v)) ++ok; else ++wrong; 39 if (branch(9, 0, v)) ++ok; else ++wrong; 40 if (branch(10, 0, v)) ++ok; else ++wrong; 41 if (branch(11, 0, v)) ++ok; else ++wrong; 42 if (branch(12, 0, v)) ++ok; else ++wrong; 43 if (branch(13, 0, v)) ++ok; else ++wrong; 44 if (branch(14, 0, v)) ++ok; else ++wrong; 45 if (branch(15, 0, v)) ++ok; else ++wrong; 46 47 if (wrong != 0 || ok != 16) 48 printf("FAILED\n"); 49 else 50 printf("OK\n"); 51 } 52 53 void 54 tm_value_0(void) 55 { 56 int wrong, ok; 57 unsigned char v; 58 59 printf("Test #2 mask == 0xFF, value == 0 --> cc == 0\n"); 60 61 v = 0; 62 wrong = ok = 0; 63 64 if (branch(0, 0xFF, v)) ++wrong; else ++ok; 65 if (branch(1, 0xFF, v)) ++wrong; else ++ok; 66 if (branch(2, 0xFF, v)) ++wrong; else ++ok; 67 if (branch(3, 0xFF, v)) ++wrong; else ++ok; 68 if (branch(4, 0xFF, v)) ++wrong; else ++ok; 69 if (branch(5, 0xFF, v)) ++wrong; else ++ok; 70 if (branch(6, 0xFF, v)) ++wrong; else ++ok; 71 if (branch(7, 0xFF, v)) ++wrong; else ++ok; 72 if (branch(8, 0xFF, v)) ++ok; else ++wrong; 73 if (branch(9, 0xFF, v)) ++ok; else ++wrong; 74 if (branch(10, 0xFF, v)) ++ok; else ++wrong; 75 if (branch(11, 0xFF, v)) ++ok; else ++wrong; 76 if (branch(12, 0xFF, v)) ++ok; else ++wrong; 77 if (branch(13, 0xFF, v)) ++ok; else ++wrong; 78 if (branch(14, 0xFF, v)) ++ok; else ++wrong; 79 if (branch(15, 0xFF, v)) ++ok; else ++wrong; 80 81 if (wrong != 0 || ok != 16) 82 printf("FAILED\n"); 83 else 84 printf("OK\n"); 85 } 86 87 void 88 tm_all_selected_bits_set_1(void) 89 { 90 int wrong, ok; 91 unsigned char v; 92 93 printf("Test #3 mask == 0xFF, value == 0xFF --> cc == 3\n"); 94 95 v = 0xFF; 96 wrong = ok = 0; 97 98 if (branch(0, 0xFF, v)) ++wrong; else ++ok; 99 if (branch(1, 0xFF, v)) ++ok; else ++wrong; 100 if (branch(2, 0xFF, v)) ++wrong; else ++ok; 101 if (branch(3, 0xFF, v)) ++ok; else ++wrong; 102 if (branch(4, 0xFF, v)) ++wrong; else ++ok; 103 if (branch(5, 0xFF, v)) ++ok; else ++wrong; 104 if (branch(6, 0xFF, v)) ++wrong; else ++ok; 105 if (branch(7, 0xFF, v)) ++ok; else ++wrong; 106 if (branch(8, 0xFF, v)) ++wrong; else ++ok; 107 if (branch(9, 0xFF, v)) ++ok; else ++wrong; 108 if (branch(10, 0xFF, v)) ++wrong; else ++ok; 109 if (branch(11, 0xFF, v)) ++ok; else ++wrong; 110 if (branch(12, 0xFF, v)) ++wrong; else ++ok; 111 if (branch(13, 0xFF, v)) ++ok; else ++wrong; 112 if (branch(14, 0xFF, v)) ++wrong; else ++ok; 113 if (branch(15, 0xFF, v)) ++ok; else ++wrong; 114 115 if (wrong != 0 || ok != 16) 116 printf("FAILED\n"); 117 else 118 printf("OK\n"); 119 } 120 121 void 122 tm_all_selected_bits_set_2(void) 123 { 124 int wrong, ok; 125 unsigned char v; 126 127 printf("Test #4 mask == 0x80, value == 0x80 --> cc == 3\n"); 128 129 v = 0x80; 130 wrong = ok = 0; 131 132 if (branch(0, 0x80, v)) ++wrong; else ++ok; 133 if (branch(1, 0x80, v)) ++ok; else ++wrong; 134 if (branch(2, 0x80, v)) ++wrong; else ++ok; 135 if (branch(3, 0x80, v)) ++ok; else ++wrong; 136 if (branch(4, 0x80, v)) ++wrong; else ++ok; 137 if (branch(5, 0x80, v)) ++ok; else ++wrong; 138 if (branch(6, 0x80, v)) ++wrong; else ++ok; 139 if (branch(7, 0x80, v)) ++ok; else ++wrong; 140 if (branch(8, 0x80, v)) ++wrong; else ++ok; 141 if (branch(9, 0x80, v)) ++ok; else ++wrong; 142 if (branch(10, 0x80, v)) ++wrong; else ++ok; 143 if (branch(11, 0x80, v)) ++ok; else ++wrong; 144 if (branch(12, 0x80, v)) ++wrong; else ++ok; 145 if (branch(13, 0x80, v)) ++ok; else ++wrong; 146 if (branch(14, 0x80, v)) ++wrong; else ++ok; 147 if (branch(15, 0x80, v)) ++ok; else ++wrong; 148 149 if (wrong != 0 || ok != 16) 150 printf("FAILED\n"); 151 else 152 printf("OK\n"); 153 } 154 155 void 156 tm_some_selected_bits_set_msb_set(void) 157 { 158 int wrong, ok; 159 unsigned char v; 160 161 printf("Test #5 mask == 0xF0, value == 0x90 --> cc == 1\n"); 162 163 v = 0x90; 164 wrong = ok = 0; 165 166 if (branch(0, 0xF0, v)) ++wrong; else ++ok; 167 if (branch(1, 0xF0, v)) ++wrong; else ++ok; 168 if (branch(2, 0xF0, v)) ++wrong; else ++ok; 169 if (branch(3, 0xF0, v)) ++wrong; else ++ok; 170 if (branch(4, 0xF0, v)) ++ok; else ++wrong; 171 if (branch(5, 0xF0, v)) ++ok; else ++wrong; 172 if (branch(6, 0xF0, v)) ++ok; else ++wrong; 173 if (branch(7, 0xF0, v)) ++ok; else ++wrong; 174 if (branch(8, 0xF0, v)) ++wrong; else ++ok; 175 if (branch(9, 0xF0, v)) ++wrong; else ++ok; 176 if (branch(10, 0xF0, v)) ++wrong; else ++ok; 177 if (branch(11, 0xF0, v)) ++wrong; else ++ok; 178 if (branch(12, 0xF0, v)) ++ok; else ++wrong; 179 if (branch(13, 0xF0, v)) ++ok; else ++wrong; 180 if (branch(14, 0xF0, v)) ++ok; else ++wrong; 181 if (branch(15, 0xF0, v)) ++ok; else ++wrong; 182 183 if (wrong != 0 || ok != 16) 184 printf("FAILED\n"); 185 else 186 printf("OK\n"); 187 } 188 189 void 190 tm_some_selected_bits_set_msb_not_set(void) 191 { 192 int wrong, ok; 193 unsigned char v; 194 195 printf("Test #6 mask == 0xF0, value == 0x30 --> cc == 1\n"); 196 197 v = 0x30; 198 wrong = ok = 0; 199 200 if (branch(0, 0xF0, v)) ++wrong; else ++ok; 201 if (branch(1, 0xF0, v)) ++wrong; else ++ok; 202 if (branch(2, 0xF0, v)) ++wrong; else ++ok; 203 if (branch(3, 0xF0, v)) ++wrong; else ++ok; 204 if (branch(4, 0xF0, v)) ++ok; else ++wrong; 205 if (branch(5, 0xF0, v)) ++ok; else ++wrong; 206 if (branch(6, 0xF0, v)) ++ok; else ++wrong; 207 if (branch(7, 0xF0, v)) ++ok; else ++wrong; 208 if (branch(8, 0xF0, v)) ++wrong; else ++ok; 209 if (branch(9, 0xF0, v)) ++wrong; else ++ok; 210 if (branch(10, 0xF0, v)) ++wrong; else ++ok; 211 if (branch(11, 0xF0, v)) ++wrong; else ++ok; 212 if (branch(12, 0xF0, v)) ++ok; else ++wrong; 213 if (branch(13, 0xF0, v)) ++ok; else ++wrong; 214 if (branch(14, 0xF0, v)) ++ok; else ++wrong; 215 if (branch(15, 0xF0, v)) ++ok; else ++wrong; 216 217 if (wrong != 0 || ok != 16) 218 printf("FAILED\n"); 219 else 220 printf("OK\n"); 221 } 222 223 int main() 224 { 225 tm_mask_0(); 226 tm_value_0(); 227 tm_all_selected_bits_set_1(); 228 tm_all_selected_bits_set_2(); 229 tm_some_selected_bits_set_msb_set(); 230 tm_some_selected_bits_set_msb_not_set(); 231 232 return 0; 233 } 234