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