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