| #include <stdio.h> |
| |
| #define get_cc() \ |
| ({ \ |
| char __cc; \ |
| /* don't use IPM to better test spechelpers */ \ |
| asm volatile( "brc 8,1f\n\t" \ |
| "brc 4,2f\n\t" \ |
| "brc 2,3f\n\t" \ |
| "brc 1,4f\n\t" \ |
| "mvi %0,4\n\t" \ |
| "j 0f\n\t" \ |
| "1: mvi %0,0\n\t" \ |
| "j 0f\n\t" \ |
| "2: mvi %0,1\n\t" \ |
| "j 0f\n\t" \ |
| "3: mvi %0,2\n\t" \ |
| "j 0f\n\t" \ |
| "4: mvi %0,3\n\t" \ |
| "j 0f\n\t" \ |
| "0: /* nop */ brc 0,0\n\t" \ |
| : "=m" (__cc) : : "memory"); \ |
| __cc; \ |
| }) |
| |
| void check_cc(int value, int cc) |
| { |
| if (cc != value) { |
| printf("wrong cc: "); |
| if (value == 0) printf("expected 0 "); |
| if (value == 1) printf("expected 1 "); |
| if (value == 2) printf("expected 2 "); |
| if (value == 3) printf("expected 3 "); |
| if (cc == 0) printf("got 0"); |
| if (cc == 1) printf("got 1"); |
| if (cc == 2) printf("got 2"); |
| if (cc == 3) printf("got 3"); |
| } else { |
| printf("OK"); |
| } |
| printf("\n"); |
| } |
| |
| void tm(void) |
| { |
| unsigned char v; |
| |
| /* test #1: value is zero */ |
| v = 0; |
| asm volatile( "tm %[v],15\n\t" : : [v] "R"(v) : "cc"); |
| check_cc(0, get_cc()); |
| |
| /* test #2: mask is zero */ |
| v = 0xFF; |
| asm volatile( "tm %[v],0\n\t" : : [v] "R"(v) : "cc"); |
| check_cc(0, get_cc()); |
| |
| /* test #3: selected bits are 0 */ |
| v = 0x0F; |
| asm volatile( "tm %[v],0xf0\n\t" : : [v] "R"(v) : "cc"); |
| check_cc(0, get_cc()); |
| |
| /* test #4: selected bits are all 1 */ |
| v = 0xF0; |
| asm volatile( "tm %[v],0x70\n\t" : : [v] "R"(v) : "cc"); |
| check_cc(3, get_cc()); |
| |
| /* test #5: selected bits are mixed */ |
| v = 0x0F; |
| asm volatile( "tm %[v],0x81\n\t" : : [v] "R"(v) : "cc"); |
| check_cc(1, get_cc()); |
| } |
| |
| int main(void) |
| { |
| tm(); |
| |
| return 0; |
| } |