1 #include <stdio.h> 2 3 #define branch(mask,_v1) \ 4 ({ \ 5 unsigned char taken; \ 6 unsigned b1 = _v1; \ 7 asm volatile( " ltr %[b1],%[b1]\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 : \ 15 : "cc"); \ 16 taken; \ 17 }) 18 19 void 20 ltr_1(void) 21 { 22 int wrong, ok, v1; 23 24 printf("Test #1 value = 0\n"); 25 26 v1 = 0; 27 wrong = ok = 0; 28 if (branch(0, v1)) ++wrong; else ++ok; 29 if (branch(1, v1)) ++wrong; else ++ok; 30 if (branch(2, v1)) ++wrong; else ++ok; 31 if (branch(3, v1)) ++wrong; else ++ok; 32 if (branch(4, v1)) ++wrong; else ++ok; 33 if (branch(5, v1)) ++wrong; else ++ok; 34 if (branch(6, v1)) ++wrong; else ++ok; 35 if (branch(7, v1)) ++wrong; else ++ok; 36 if (branch(8, v1)) ++ok; else ++wrong; 37 if (branch(9, v1)) ++ok; else ++wrong; 38 if (branch(10, v1)) ++ok; else ++wrong; 39 if (branch(11, v1)) ++ok; else ++wrong; 40 if (branch(12, v1)) ++ok; else ++wrong; 41 if (branch(13, v1)) ++ok; else ++wrong; 42 if (branch(14, v1)) ++ok; else ++wrong; 43 if (branch(15, v1)) ++ok; else ++wrong; 44 45 if (wrong != 0 || ok != 16) 46 printf("FAILED\n"); 47 else 48 printf("OK\n"); 49 } 50 51 void 52 ltr_2(void) 53 { 54 int wrong, ok, v1; 55 56 printf("Test #2 value > 0\n"); 57 v1 = 42; 58 wrong = ok = 0; 59 if (branch(0, v1)) ++wrong; else ++ok; 60 if (branch(1, v1)) ++wrong; else ++ok; 61 if (branch(2, v1)) ++ok; else ++wrong; 62 if (branch(3, v1)) ++ok; else ++wrong; 63 if (branch(4, v1)) ++wrong; else ++ok; 64 if (branch(5, v1)) ++wrong; else ++ok; 65 if (branch(6, v1)) ++ok; else ++wrong; 66 if (branch(7, v1)) ++ok; else ++wrong; 67 if (branch(8, v1)) ++wrong; else ++ok; 68 if (branch(9, v1)) ++wrong; else ++ok; 69 if (branch(10, v1)) ++ok; else ++wrong; 70 if (branch(11, v1)) ++ok; else ++wrong; 71 if (branch(12, v1)) ++wrong; else ++ok; 72 if (branch(13, v1)) ++wrong; else ++ok; 73 if (branch(14, v1)) ++ok; else ++wrong; 74 if (branch(15, v1)) ++ok; else ++wrong; 75 76 if (wrong != 0 || ok != 16) 77 printf("FAILED\n"); 78 else 79 printf("OK\n"); 80 } 81 82 void 83 ltr_3(void) 84 { 85 int wrong, ok, v1; 86 87 printf("Test #3 value < 0\n"); 88 89 v1 = -100; 90 wrong = ok = 0; 91 if (branch(0, v1)) ++wrong; else ++ok; 92 if (branch(1, v1)) ++wrong; else ++ok; 93 if (branch(2, v1)) ++wrong; else ++ok; 94 if (branch(3, v1)) ++wrong; else ++ok; 95 if (branch(4, v1)) ++ok; else ++wrong; 96 if (branch(5, v1)) ++ok; else ++wrong; 97 if (branch(6, v1)) ++ok; else ++wrong; 98 if (branch(7, v1)) ++ok; else ++wrong; 99 if (branch(8, v1)) ++wrong; else ++ok; 100 if (branch(9, v1)) ++wrong; else ++ok; 101 if (branch(10, v1)) ++wrong; else ++ok; 102 if (branch(11, v1)) ++wrong; else ++ok; 103 if (branch(12, v1)) ++ok; else ++wrong; 104 if (branch(13, v1)) ++ok; else ++wrong; 105 if (branch(14, v1)) ++ok; else ++wrong; 106 if (branch(15, v1)) ++ok; else ++wrong; 107 108 if (wrong != 0 || ok != 16) 109 printf("FAILED\n"); 110 else 111 printf("OK\n"); 112 } 113 114 int main() 115 { 116 ltr_1(); 117 ltr_2(); 118 ltr_3(); 119 return 0; 120 } 121