19768109e5d3c18da127dd70f28454171c1eba7c0florian#include <stdio.h> 29768109e5d3c18da127dd70f28454171c1eba7c0florian 39768109e5d3c18da127dd70f28454171c1eba7c0florian#define branch(mask,_v1,_v2) \ 49768109e5d3c18da127dd70f28454171c1eba7c0florian ({ \ 59768109e5d3c18da127dd70f28454171c1eba7c0florian unsigned char taken; \ 69768109e5d3c18da127dd70f28454171c1eba7c0florian unsigned b1 = _v1, b2 = _v2; \ 79768109e5d3c18da127dd70f28454171c1eba7c0florian asm volatile(" or %[b1],%[b2]\n\t" \ 89768109e5d3c18da127dd70f28454171c1eba7c0florian " brc " #mask " ,1f\n\t" \ 99768109e5d3c18da127dd70f28454171c1eba7c0florian " mvi %[taken],0\n\t" \ 109768109e5d3c18da127dd70f28454171c1eba7c0florian " j 0f\n\t" \ 119768109e5d3c18da127dd70f28454171c1eba7c0florian "1: mvi %[taken],1\n\t" \ 129768109e5d3c18da127dd70f28454171c1eba7c0florian "0: bcr 0,0 /* nop */\n\t" \ 139768109e5d3c18da127dd70f28454171c1eba7c0florian : [taken] "=Q" (taken), [b1] "+d"(b1) \ 149768109e5d3c18da127dd70f28454171c1eba7c0florian : [b2] "d"(b2) \ 159768109e5d3c18da127dd70f28454171c1eba7c0florian : "cc"); \ 169768109e5d3c18da127dd70f28454171c1eba7c0florian taken; \ 179768109e5d3c18da127dd70f28454171c1eba7c0florian }) 189768109e5d3c18da127dd70f28454171c1eba7c0florian 199768109e5d3c18da127dd70f28454171c1eba7c0florianvoid 209768109e5d3c18da127dd70f28454171c1eba7c0florianor_1(void) 219768109e5d3c18da127dd70f28454171c1eba7c0florian{ 229768109e5d3c18da127dd70f28454171c1eba7c0florian int wrong, ok, v1, v2; 239768109e5d3c18da127dd70f28454171c1eba7c0florian 249768109e5d3c18da127dd70f28454171c1eba7c0florian printf("Test #1 result = 0\n"); 259768109e5d3c18da127dd70f28454171c1eba7c0florian 269768109e5d3c18da127dd70f28454171c1eba7c0florian v1 = v2 = 0; 279768109e5d3c18da127dd70f28454171c1eba7c0florian wrong = ok = 0; 289768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(0, v1, v2)) ++wrong; else ++ok; 299768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(1, v1, v2)) ++wrong; else ++ok; 309768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(2, v1, v2)) ++wrong; else ++ok; 319768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(3, v1, v2)) ++wrong; else ++ok; 329768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(4, v1, v2)) ++wrong; else ++ok; 339768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(5, v1, v2)) ++wrong; else ++ok; 349768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(6, v1, v2)) ++wrong; else ++ok; 359768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(7, v1, v2)) ++wrong; else ++ok; 369768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(8, v1, v2)) ++ok; else ++wrong; 379768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(9, v1, v2)) ++ok; else ++wrong; 389768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(10, v1, v2)) ++ok; else ++wrong; 399768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(11, v1, v2)) ++ok; else ++wrong; 409768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(12, v1, v2)) ++ok; else ++wrong; 419768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(13, v1, v2)) ++ok; else ++wrong; 429768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(14, v1, v2)) ++ok; else ++wrong; 439768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(15, v1, v2)) ++ok; else ++wrong; 449768109e5d3c18da127dd70f28454171c1eba7c0florian 459768109e5d3c18da127dd70f28454171c1eba7c0florian if (wrong != 0 || ok != 16) 469768109e5d3c18da127dd70f28454171c1eba7c0florian printf("FAILED\n"); 479768109e5d3c18da127dd70f28454171c1eba7c0florian else 489768109e5d3c18da127dd70f28454171c1eba7c0florian printf("OK\n"); 499768109e5d3c18da127dd70f28454171c1eba7c0florian} 509768109e5d3c18da127dd70f28454171c1eba7c0florian 519768109e5d3c18da127dd70f28454171c1eba7c0florianvoid 529768109e5d3c18da127dd70f28454171c1eba7c0florianor_2(void) 539768109e5d3c18da127dd70f28454171c1eba7c0florian{ 549768109e5d3c18da127dd70f28454171c1eba7c0florian int wrong, ok, v1, v2; 559768109e5d3c18da127dd70f28454171c1eba7c0florian 569768109e5d3c18da127dd70f28454171c1eba7c0florian printf("Test #2 result = 0xffffffff\n"); 579768109e5d3c18da127dd70f28454171c1eba7c0florian v1 = 0; 589768109e5d3c18da127dd70f28454171c1eba7c0florian v2 = ~0; 599768109e5d3c18da127dd70f28454171c1eba7c0florian wrong = ok = 0; 609768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(0, v1, v2)) ++wrong; else ++ok; 619768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(1, v1, v2)) ++wrong; else ++ok; 629768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(2, v1, v2)) ++wrong; else ++ok; 639768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(3, v1, v2)) ++wrong; else ++ok; 649768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(4, v1, v2)) ++ok; else ++wrong; 659768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(5, v1, v2)) ++ok; else ++wrong; 669768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(6, v1, v2)) ++ok; else ++wrong; 679768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(7, v1, v2)) ++ok; else ++wrong; 689768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(8, v1, v2)) ++wrong; else ++ok; 699768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(9, v1, v2)) ++wrong; else ++ok; 709768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(10, v1, v2)) ++wrong; else ++ok; 719768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(11, v1, v2)) ++wrong; else ++ok; 729768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(12, v1, v2)) ++ok; else ++wrong; 739768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(13, v1, v2)) ++ok; else ++wrong; 749768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(14, v1, v2)) ++ok; else ++wrong; 759768109e5d3c18da127dd70f28454171c1eba7c0florian if (branch(15, v1, v2)) ++ok; else ++wrong; 769768109e5d3c18da127dd70f28454171c1eba7c0florian 779768109e5d3c18da127dd70f28454171c1eba7c0florian if (wrong != 0 || ok != 16) 789768109e5d3c18da127dd70f28454171c1eba7c0florian printf("FAILED\n"); 799768109e5d3c18da127dd70f28454171c1eba7c0florian else 809768109e5d3c18da127dd70f28454171c1eba7c0florian printf("OK\n"); 819768109e5d3c18da127dd70f28454171c1eba7c0florian} 829768109e5d3c18da127dd70f28454171c1eba7c0florian 839768109e5d3c18da127dd70f28454171c1eba7c0florianint main() 849768109e5d3c18da127dd70f28454171c1eba7c0florian{ 859768109e5d3c18da127dd70f28454171c1eba7c0florian or_1(); 869768109e5d3c18da127dd70f28454171c1eba7c0florian or_2(); 879768109e5d3c18da127dd70f28454171c1eba7c0florian return 0; 889768109e5d3c18da127dd70f28454171c1eba7c0florian} 89