1436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include <stdio.h> 2436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define branch(mask,_v1,_v2) \ 4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov ({ \ 5436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov unsigned char taken; \ 6436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov unsigned long b1 = _v1; \ 7436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov unsigned long b2 = _v2; \ 8436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov asm volatile(" slgr %[b1],%[b2]\n\t" \ 9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov " brc " #mask " ,1f\n\t" \ 10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov " mvi %[taken],0\n\t" \ 11436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov " j 0f\n\t" \ 12436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "1: mvi %[taken],1\n\t" \ 13436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov "0: bcr 0,0 /* nop */\n\t" \ 14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : [taken] "=Q" (taken), [b1] "+d"(b1) \ 15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : [b2] "d"(b2) \ 16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "cc"); \ 17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov taken; \ 18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov }) 19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* cc = (op1 == op2) ? 2 22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : (op1 > op2) ? 3 : 1; */ 23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid 26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovslgr_equal(void) 27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov unsigned long v1, v2; 29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov int wrong, ok; 30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("Test #1 op1 == op2\n"); 32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov v1 = v2 = 42; 34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov wrong = ok = 0; 35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(0, v1, v2)) ++wrong; else ++ok; 37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(1, v1, v2)) ++wrong; else ++ok; 38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(2, v1, v2)) ++ok; else ++wrong; 39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(3, v1, v2)) ++ok; else ++wrong; 40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(4, v1, v2)) ++wrong; else ++ok; 41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(5, v1, v2)) ++wrong; else ++ok; 42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(6, v1, v2)) ++ok; else ++wrong; 43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(7, v1, v2)) ++ok; else ++wrong; 44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(8, v1, v2)) ++wrong; else ++ok; 45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(9, v1, v2)) ++wrong; else ++ok; 46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(10, v1, v2)) ++ok; else ++wrong; 47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(11, v1, v2)) ++ok; else ++wrong; 48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(12, v1, v2)) ++wrong; else ++ok; 49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(13, v1, v2)) ++wrong; else ++ok; 50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(14, v1, v2)) ++ok; else ++wrong; 51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(15, v1, v2)) ++ok; else ++wrong; 52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (wrong != 0 || ok != 16) 54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("FAILED\n"); 55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov else 56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("OK\n"); 57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid 60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovslgr_less(void) 61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov unsigned long v1, v2; 63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov int wrong, ok; 64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("Test #2 op1 < op2\n"); 66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov v1 = 100; 68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov v2 = 1000; 69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov wrong = ok = 0; 71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(0, v1, v2)) ++wrong; else ++ok; 73436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(1, v1, v2)) ++wrong; else ++ok; 74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(2, v1, v2)) ++wrong; else ++ok; 75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(3, v1, v2)) ++wrong; else ++ok; 76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(4, v1, v2)) ++ok; else ++wrong; 77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(5, v1, v2)) ++ok; else ++wrong; 78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(6, v1, v2)) ++ok; else ++wrong; 79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(7, v1, v2)) ++ok; else ++wrong; 80436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(8, v1, v2)) ++wrong; else ++ok; 81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(9, v1, v2)) ++wrong; else ++ok; 82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(10, v1, v2)) ++wrong; else ++ok; 83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(11, v1, v2)) ++wrong; else ++ok; 84436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(12, v1, v2)) ++ok; else ++wrong; 85436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(13, v1, v2)) ++ok; else ++wrong; 86436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(14, v1, v2)) ++ok; else ++wrong; 87436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(15, v1, v2)) ++ok; else ++wrong; 88436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 89436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (wrong != 0 /* || ok != 16 */) 90436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("FAILED\n"); 91436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov else 92436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("OK\n"); 93436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 94436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 95436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid 96436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovslgr_greater(void) 97436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 98436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov unsigned long v1, v2; 99436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov int wrong, ok; 100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("Test #3 op1 > op2\n"); 102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov v1 = 10000; 104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov v2 = 1000; 105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov wrong = ok = 0; 107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(0, v1, v2)) ++wrong; else ++ok; 109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(1, v1, v2)) ++ok; else ++wrong; 110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(2, v1, v2)) ++wrong; else ++ok; 111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(3, v1, v2)) ++ok; else ++wrong; 112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(4, v1, v2)) ++wrong; else ++ok; 113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(5, v1, v2)) ++ok; else ++wrong; 114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(6, v1, v2)) ++wrong; else ++ok; 115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(7, v1, v2)) ++ok; else ++wrong; 116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(8, v1, v2)) ++wrong; else ++ok; 117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(9, v1, v2)) ++ok; else ++wrong; 118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(10, v1, v2)) ++wrong; else ++ok; 119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(11, v1, v2)) ++ok; else ++wrong; 120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(12, v1, v2)) ++wrong; else ++ok; 121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(13, v1, v2)) ++ok; else ++wrong; 122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(14, v1, v2)) ++wrong; else ++ok; 123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(15, v1, v2)) ++ok; else ++wrong; 124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (wrong != 0 || ok != 16) 126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("FAILED\n"); 127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov else 128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("OK\n"); 129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint main() 132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov slgr_equal(); 134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov slgr_less(); 135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov slgr_greater(); 136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return 0; 138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 139