1#include <stdio.h> 2 3#define branch(mask,_v1,_v2) \ 4 ({ \ 5 unsigned char taken; \ 6 unsigned int b1 = _v1; \ 7 unsigned int b2 = _v2; \ 8 asm volatile( " slr %[b1],%[b2]\n\t" \ 9 " brc " #mask " ,1f\n\t" \ 10 " mvi %[taken],0\n\t" \ 11 " j 0f\n\t" \ 12 "1: mvi %[taken],1\n\t" \ 13 "0: bcr 0,0 /* nop */\n\t" \ 14 : [taken] "=Q" (taken), [b1] "+d"(b1) \ 15 : [b2] "d"(b2) \ 16 : "cc"); \ 17 taken; \ 18 }) 19 20/* cc = (op1 == op2) ? 2 21 : (op1 > op2) ? 3 : 1; */ 22 23void 24slr_equal(void) 25{ 26 unsigned int v1, v2; 27 int wrong, ok; 28 29 printf("Test #1 op1 == op2\n"); 30 31 v1 = v2 = 0xffffffff; 32 wrong = ok = 0; 33 34 if (branch(0, v1, v2)) ++wrong; else ++ok; 35 if (branch(1, v1, v2)) ++wrong; else ++ok; 36 if (branch(2, v1, v2)) ++ok; else ++wrong; 37 if (branch(3, v1, v2)) ++ok; else ++wrong; 38 if (branch(4, v1, v2)) ++wrong; else ++ok; 39 if (branch(5, v1, v2)) ++wrong; else ++ok; 40 if (branch(6, v1, v2)) ++ok; else ++wrong; 41 if (branch(7, v1, v2)) ++ok; else ++wrong; 42 if (branch(8, v1, v2)) ++wrong; else ++ok; 43 if (branch(9, v1, v2)) ++wrong; else ++ok; 44 if (branch(10, v1, v2)) ++ok; else ++wrong; 45 if (branch(11, v1, v2)) ++ok; else ++wrong; 46 if (branch(12, v1, v2)) ++wrong; else ++ok; 47 if (branch(13, v1, v2)) ++wrong; else ++ok; 48 if (branch(14, v1, v2)) ++ok; else ++wrong; 49 if (branch(15, v1, v2)) ++ok; else ++wrong; 50 51 if (wrong != 0 || ok != 16) 52 printf("FAILED\n"); 53 else 54 printf("OK\n"); 55} 56 57void 58slr_less(void) 59{ 60 unsigned int v1, v2; 61 int wrong, ok; 62 63 printf("Test #2 op1 < op2\n"); 64 65 v1 = 100; 66 v2 = 0xffffffff; 67 68 wrong = ok = 0; 69 70 if (branch(0, v1, v2)) ++wrong; else ++ok; 71 if (branch(1, v1, v2)) ++wrong; else ++ok; 72 if (branch(2, v1, v2)) ++wrong; else ++ok; 73 if (branch(3, v1, v2)) ++wrong; else ++ok; 74 if (branch(4, v1, v2)) ++ok; else ++wrong; 75 if (branch(5, v1, v2)) ++ok; else ++wrong; 76 if (branch(6, v1, v2)) ++ok; else ++wrong; 77 if (branch(7, v1, v2)) ++ok; else ++wrong; 78 if (branch(8, v1, v2)) ++wrong; else ++ok; 79 if (branch(9, v1, v2)) ++wrong; else ++ok; 80 if (branch(10, v1, v2)) ++wrong; else ++ok; 81 if (branch(11, v1, v2)) ++wrong; else ++ok; 82 if (branch(12, v1, v2)) ++ok; else ++wrong; 83 if (branch(13, v1, v2)) ++ok; else ++wrong; 84 if (branch(14, v1, v2)) ++ok; else ++wrong; 85 if (branch(15, v1, v2)) ++ok; else ++wrong; 86 87 if (wrong != 0 /* || ok != 16 */) 88 printf("FAILED\n"); 89 else 90 printf("OK\n"); 91} 92 93void 94slr_greater(void) 95{ 96 unsigned int v1, v2; 97 int wrong, ok; 98 99 printf("Test #3 op1 > op2\n"); 100 101 v1 = 0xffffffff; 102 v2 = 1000; 103 104 wrong = ok = 0; 105 106 if (branch(0, v1, v2)) ++wrong; else ++ok; 107 if (branch(1, v1, v2)) ++ok; else ++wrong; 108 if (branch(2, v1, v2)) ++wrong; else ++ok; 109 if (branch(3, v1, v2)) ++ok; else ++wrong; 110 if (branch(4, v1, v2)) ++wrong; else ++ok; 111 if (branch(5, v1, v2)) ++ok; else ++wrong; 112 if (branch(6, v1, v2)) ++wrong; else ++ok; 113 if (branch(7, v1, v2)) ++ok; else ++wrong; 114 if (branch(8, v1, v2)) ++wrong; else ++ok; 115 if (branch(9, v1, v2)) ++ok; else ++wrong; 116 if (branch(10, v1, v2)) ++wrong; else ++ok; 117 if (branch(11, v1, v2)) ++ok; else ++wrong; 118 if (branch(12, v1, v2)) ++wrong; else ++ok; 119 if (branch(13, v1, v2)) ++ok; else ++wrong; 120 if (branch(14, v1, v2)) ++wrong; else ++ok; 121 if (branch(15, v1, v2)) ++ok; else ++wrong; 122 123 if (wrong != 0 || ok != 16) 124 printf("FAILED\n"); 125 else 126 printf("OK\n"); 127} 128 129int main() 130{ 131 slr_equal(); 132 slr_less(); 133 slr_greater(); 134 135 return 0; 136} 137