| #include <stdio.h> |
| |
| #define branch(mask,_v1,_v2) \ |
| ({ \ |
| unsigned char taken; \ |
| unsigned long b1 = _v1; \ |
| unsigned long b2 = _v2; \ |
| asm volatile( " algr %[b1],%[b2]\n\t" \ |
| " brc " #mask " ,1f\n\t" \ |
| " mvi %[taken],0\n\t" \ |
| " j 0f\n\t" \ |
| "1: mvi %[taken],1\n\t" \ |
| "0: bcr 0,0 /* nop */\n\t" \ |
| : [taken] "=Q" (taken), [b1] "+d"(b1) \ |
| : [b2] "d"(b2) \ |
| : "cc"); \ |
| taken; \ |
| }) |
| |
| |
| void |
| algr_cc_0(void) |
| { |
| unsigned long v1, v2; |
| int wrong, ok; |
| |
| printf("Test #1 cc == 0\n"); |
| |
| v1 = v2 = 0; |
| wrong = ok = 0; |
| if (branch(0, v1, v2)) ++wrong; else ++ok; |
| if (branch(1, v1, v2)) ++wrong; else ++ok; |
| if (branch(2, v1, v2)) ++wrong; else ++ok; |
| if (branch(3, v1, v2)) ++wrong; else ++ok; |
| if (branch(4, v1, v2)) ++wrong; else ++ok; |
| if (branch(5, v1, v2)) ++wrong; else ++ok; |
| if (branch(6, v1, v2)) ++wrong; else ++ok; |
| if (branch(7, v1, v2)) ++wrong; else ++ok; |
| if (branch(8, v1, v2)) ++ok; else ++wrong; |
| if (branch(9, v1, v2)) ++ok; else ++wrong; |
| if (branch(10, v1, v2)) ++ok; else ++wrong; |
| if (branch(11, v1, v2)) ++ok; else ++wrong; |
| if (branch(12, v1, v2)) ++ok; else ++wrong; |
| if (branch(13, v1, v2)) ++ok; else ++wrong; |
| if (branch(14, v1, v2)) ++ok; else ++wrong; |
| if (branch(15, v1, v2)) ++ok; else ++wrong; |
| |
| if (wrong != 0 || ok != 16) |
| printf("FAILED\n"); |
| else |
| printf("OK\n"); |
| } |
| |
| void |
| algr_cc_1(void) |
| { |
| unsigned long v1, v2; |
| int wrong, ok; |
| |
| printf("Test #2 cc == 1\n"); |
| |
| v1 = v2 = 42; |
| wrong = ok = 0; |
| |
| if (branch(0, v1, v2)) ++wrong; else ++ok; |
| if (branch(1, v1, v2)) ++wrong; else ++ok; |
| if (branch(2, v1, v2)) ++wrong; else ++ok; |
| if (branch(3, v1, v2)) ++wrong; else ++ok; |
| if (branch(4, v1, v2)) ++ok; else ++wrong; |
| if (branch(5, v1, v2)) ++ok; else ++wrong; |
| if (branch(6, v1, v2)) ++ok; else ++wrong; |
| if (branch(7, v1, v2)) ++ok; else ++wrong; |
| if (branch(8, v1, v2)) ++wrong; else ++ok; |
| if (branch(9, v1, v2)) ++wrong; else ++ok; |
| if (branch(10, v1, v2)) ++wrong; else ++ok; |
| if (branch(11, v1, v2)) ++wrong; else ++ok; |
| if (branch(12, v1, v2)) ++ok; else ++wrong; |
| if (branch(13, v1, v2)) ++ok; else ++wrong; |
| if (branch(14, v1, v2)) ++ok; else ++wrong; |
| if (branch(15, v1, v2)) ++ok; else ++wrong; |
| |
| if (wrong != 0 || ok != 16) |
| printf("FAILED\n"); |
| else |
| printf("OK\n"); |
| } |
| |
| void |
| algr_cc_2(void) |
| { |
| unsigned long v1, v2; |
| int wrong, ok; |
| |
| printf("Test #3 cc == 2\n"); |
| |
| v1 = ~0ULL; |
| v2 = 1; |
| |
| wrong = ok = 0; |
| |
| if (branch(0, v1, v2)) ++wrong; else ++ok; |
| if (branch(1, v1, v2)) ++wrong; else ++ok; |
| if (branch(2, v1, v2)) ++ok; else ++wrong; |
| if (branch(3, v1, v2)) ++ok; else ++wrong; |
| if (branch(4, v1, v2)) ++wrong; else ++ok; |
| if (branch(5, v1, v2)) ++wrong; else ++ok; |
| if (branch(6, v1, v2)) ++ok; else ++wrong; |
| if (branch(7, v1, v2)) ++ok; else ++wrong; |
| if (branch(8, v1, v2)) ++wrong; else ++ok; |
| if (branch(9, v1, v2)) ++wrong; else ++ok; |
| if (branch(10, v1, v2)) ++ok; else ++wrong; |
| if (branch(11, v1, v2)) ++ok; else ++wrong; |
| if (branch(12, v1, v2)) ++wrong; else ++ok; |
| if (branch(13, v1, v2)) ++wrong; else ++ok; |
| if (branch(14, v1, v2)) ++ok; else ++wrong; |
| if (branch(15, v1, v2)) ++ok; else ++wrong; |
| |
| if (wrong != 0 /* || ok != 16 */) |
| printf("FAILED\n"); |
| else |
| printf("OK\n"); |
| } |
| |
| void |
| algr_cc_3(void) |
| { |
| unsigned long v1, v2; |
| int wrong, ok; |
| |
| printf("Test #4 cc == 3\n"); |
| |
| v1 = ~0ULL; |
| v2 = 100; |
| |
| wrong = ok = 0; |
| |
| if (branch(0, v1, v2)) ++wrong; else ++ok; |
| if (branch(1, v1, v2)) ++ok; else ++wrong; |
| if (branch(2, v1, v2)) ++wrong; else ++ok; |
| if (branch(3, v1, v2)) ++ok; else ++wrong; |
| if (branch(4, v1, v2)) ++wrong; else ++ok; |
| if (branch(5, v1, v2)) ++ok; else ++wrong; |
| if (branch(6, v1, v2)) ++wrong; else ++ok; |
| if (branch(7, v1, v2)) ++ok; else ++wrong; |
| if (branch(8, v1, v2)) ++wrong; else ++ok; |
| if (branch(9, v1, v2)) ++ok; else ++wrong; |
| if (branch(10, v1, v2)) ++wrong; else ++ok; |
| if (branch(11, v1, v2)) ++ok; else ++wrong; |
| if (branch(12, v1, v2)) ++wrong; else ++ok; |
| if (branch(13, v1, v2)) ++ok; else ++wrong; |
| if (branch(14, v1, v2)) ++wrong; else ++ok; |
| if (branch(15, v1, v2)) ++ok; else ++wrong; |
| |
| if (wrong != 0 || ok != 16) |
| printf("FAILED\n"); |
| else |
| printf("OK\n"); |
| } |
| |
| int main() |
| { |
| algr_cc_0(); |
| algr_cc_1(); |
| algr_cc_2(); |
| algr_cc_3(); |
| |
| return 0; |
| } |