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