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(" or %[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), [b1] "+d"(b1) \ 14436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : [b2] "d"(b2) \ 15436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov : "cc"); \ 16436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov taken; \ 17436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov }) 18436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 19436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid 20436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovor_1(void) 21436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 22436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov int wrong, ok, v1, v2; 23436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 24436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("Test #1 result = 0\n"); 25436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 26436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov v1 = v2 = 0; 27436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov wrong = ok = 0; 28436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(0, v1, v2)) ++wrong; else ++ok; 29436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(1, v1, v2)) ++wrong; else ++ok; 30436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(2, v1, v2)) ++wrong; else ++ok; 31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(3, v1, v2)) ++wrong; else ++ok; 32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(4, v1, v2)) ++wrong; else ++ok; 33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(5, v1, v2)) ++wrong; else ++ok; 34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(6, v1, v2)) ++wrong; else ++ok; 35436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(7, v1, v2)) ++wrong; else ++ok; 36436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(8, v1, v2)) ++ok; else ++wrong; 37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(9, v1, v2)) ++ok; else ++wrong; 38436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(10, v1, v2)) ++ok; else ++wrong; 39436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(11, v1, v2)) ++ok; else ++wrong; 40436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(12, v1, v2)) ++ok; else ++wrong; 41436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(13, v1, v2)) ++ok; else ++wrong; 42436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(14, v1, v2)) ++ok; else ++wrong; 43436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(15, v1, v2)) ++ok; else ++wrong; 44436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (wrong != 0 || ok != 16) 46436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("FAILED\n"); 47436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov else 48436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("OK\n"); 49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid 52436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovor_2(void) 53436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 54436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov int wrong, ok, v1, v2; 55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("Test #2 result = 0xffffffff\n"); 57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov v1 = 0; 58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov v2 = ~0; 59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov wrong = ok = 0; 60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(0, v1, v2)) ++wrong; else ++ok; 61436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(1, v1, v2)) ++wrong; else ++ok; 62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(2, v1, v2)) ++wrong; else ++ok; 63436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(3, v1, v2)) ++wrong; else ++ok; 64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(4, v1, v2)) ++ok; else ++wrong; 65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(5, v1, v2)) ++ok; else ++wrong; 66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(6, v1, v2)) ++ok; else ++wrong; 67436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(7, v1, v2)) ++ok; else ++wrong; 68436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(8, v1, v2)) ++wrong; else ++ok; 69436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(9, v1, v2)) ++wrong; else ++ok; 70436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(10, v1, v2)) ++wrong; else ++ok; 71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(11, v1, v2)) ++wrong; else ++ok; 72436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(12, v1, v2)) ++ok; else ++wrong; 73436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(13, v1, v2)) ++ok; else ++wrong; 74436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(14, v1, v2)) ++ok; else ++wrong; 75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (branch(15, v1, v2)) ++ok; else ++wrong; 76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov if (wrong != 0 || ok != 16) 78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("FAILED\n"); 79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov else 80436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov printf("OK\n"); 81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov 83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovint main() 84436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{ 85436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov or_1(); 86436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov or_2(); 87436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov return 0; 88436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov} 89