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