19768109e5d3c18da127dd70f28454171c1eba7c0florian#include <stdio.h>
29768109e5d3c18da127dd70f28454171c1eba7c0florian
39768109e5d3c18da127dd70f28454171c1eba7c0florian#define branch(mask,_v1,_v2)                           \
49768109e5d3c18da127dd70f28454171c1eba7c0florian  ({                                                   \
59768109e5d3c18da127dd70f28454171c1eba7c0florian        unsigned char taken;                           \
69768109e5d3c18da127dd70f28454171c1eba7c0florian        unsigned long b1 = _v1;                        \
79768109e5d3c18da127dd70f28454171c1eba7c0florian        unsigned long b2 = _v2;                        \
89768109e5d3c18da127dd70f28454171c1eba7c0florian        asm volatile(   "       algr %[b1],%[b2]\n\t"  \
99768109e5d3c18da127dd70f28454171c1eba7c0florian                 	"	brc " #mask " ,1f\n\t" \
109768109e5d3c18da127dd70f28454171c1eba7c0florian                        "       mvi %[taken],0\n\t"    \
119768109e5d3c18da127dd70f28454171c1eba7c0florian			"	j   0f\n\t"            \
129768109e5d3c18da127dd70f28454171c1eba7c0florian			"1:	mvi %[taken],1\n\t"    \
139768109e5d3c18da127dd70f28454171c1eba7c0florian			"0:	bcr 0,0 /* nop */\n\t" \
149768109e5d3c18da127dd70f28454171c1eba7c0florian             : [taken] "=Q" (taken), [b1] "+d"(b1)     \
159768109e5d3c18da127dd70f28454171c1eba7c0florian             : [b2] "d"(b2)                            \
169768109e5d3c18da127dd70f28454171c1eba7c0florian             : "cc");                                  \
179768109e5d3c18da127dd70f28454171c1eba7c0florian        taken;                                         \
189768109e5d3c18da127dd70f28454171c1eba7c0florian   })
199768109e5d3c18da127dd70f28454171c1eba7c0florian
209768109e5d3c18da127dd70f28454171c1eba7c0florian
219768109e5d3c18da127dd70f28454171c1eba7c0florianvoid
229768109e5d3c18da127dd70f28454171c1eba7c0florianalgr_cc_0(void)
239768109e5d3c18da127dd70f28454171c1eba7c0florian{
249768109e5d3c18da127dd70f28454171c1eba7c0florian  unsigned long v1, v2;
259768109e5d3c18da127dd70f28454171c1eba7c0florian  int wrong, ok;
269768109e5d3c18da127dd70f28454171c1eba7c0florian
279768109e5d3c18da127dd70f28454171c1eba7c0florian  printf("Test #1  cc == 0\n");
289768109e5d3c18da127dd70f28454171c1eba7c0florian
299768109e5d3c18da127dd70f28454171c1eba7c0florian  v1 = v2 = 0;
309768109e5d3c18da127dd70f28454171c1eba7c0florian  wrong = ok = 0;
319768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(0,  v1, v2)) ++wrong; else ++ok;
329768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(1,  v1, v2)) ++wrong; else ++ok;
339768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(2,  v1, v2)) ++wrong; else ++ok;
349768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(3,  v1, v2)) ++wrong; else ++ok;
359768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(4,  v1, v2)) ++wrong; else ++ok;
369768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(5,  v1, v2)) ++wrong; else ++ok;
379768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(6,  v1, v2)) ++wrong; else ++ok;
389768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(7,  v1, v2)) ++wrong; else ++ok;
399768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(8,  v1, v2)) ++ok; else ++wrong;
409768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(9,  v1, v2)) ++ok; else ++wrong;
419768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(10, v1, v2)) ++ok; else ++wrong;
429768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(11, v1, v2)) ++ok; else ++wrong;
439768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(12, v1, v2)) ++ok; else ++wrong;
449768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(13, v1, v2)) ++ok; else ++wrong;
459768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(14, v1, v2)) ++ok; else ++wrong;
469768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(15, v1, v2)) ++ok; else ++wrong;
479768109e5d3c18da127dd70f28454171c1eba7c0florian
489768109e5d3c18da127dd70f28454171c1eba7c0florian  if (wrong != 0 || ok != 16)
499768109e5d3c18da127dd70f28454171c1eba7c0florian    printf("FAILED\n");
509768109e5d3c18da127dd70f28454171c1eba7c0florian  else
519768109e5d3c18da127dd70f28454171c1eba7c0florian    printf("OK\n");
529768109e5d3c18da127dd70f28454171c1eba7c0florian}
539768109e5d3c18da127dd70f28454171c1eba7c0florian
549768109e5d3c18da127dd70f28454171c1eba7c0florianvoid
559768109e5d3c18da127dd70f28454171c1eba7c0florianalgr_cc_1(void)
569768109e5d3c18da127dd70f28454171c1eba7c0florian{
579768109e5d3c18da127dd70f28454171c1eba7c0florian  unsigned long v1, v2;
589768109e5d3c18da127dd70f28454171c1eba7c0florian  int wrong, ok;
599768109e5d3c18da127dd70f28454171c1eba7c0florian
609768109e5d3c18da127dd70f28454171c1eba7c0florian  printf("Test #2  cc == 1\n");
619768109e5d3c18da127dd70f28454171c1eba7c0florian
629768109e5d3c18da127dd70f28454171c1eba7c0florian  v1 = v2 = 42;
639768109e5d3c18da127dd70f28454171c1eba7c0florian  wrong = ok = 0;
649768109e5d3c18da127dd70f28454171c1eba7c0florian
659768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(0,  v1, v2)) ++wrong; else ++ok;
669768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(1,  v1, v2)) ++wrong; else ++ok;
679768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(2,  v1, v2)) ++wrong; else ++ok;
689768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(3,  v1, v2)) ++wrong; else ++ok;
699768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(4,  v1, v2)) ++ok; else ++wrong;
709768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(5,  v1, v2)) ++ok; else ++wrong;
719768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(6,  v1, v2)) ++ok; else ++wrong;
729768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(7,  v1, v2)) ++ok; else ++wrong;
739768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(8,  v1, v2)) ++wrong; else ++ok;
749768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(9,  v1, v2)) ++wrong; else ++ok;
759768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(10, v1, v2)) ++wrong; else ++ok;
769768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(11, v1, v2)) ++wrong; else ++ok;
779768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(12, v1, v2)) ++ok; else ++wrong;
789768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(13, v1, v2)) ++ok; else ++wrong;
799768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(14, v1, v2)) ++ok; else ++wrong;
809768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(15, v1, v2)) ++ok; else ++wrong;
819768109e5d3c18da127dd70f28454171c1eba7c0florian
829768109e5d3c18da127dd70f28454171c1eba7c0florian  if (wrong != 0 || ok != 16)
839768109e5d3c18da127dd70f28454171c1eba7c0florian    printf("FAILED\n");
849768109e5d3c18da127dd70f28454171c1eba7c0florian  else
859768109e5d3c18da127dd70f28454171c1eba7c0florian    printf("OK\n");
869768109e5d3c18da127dd70f28454171c1eba7c0florian}
879768109e5d3c18da127dd70f28454171c1eba7c0florian
889768109e5d3c18da127dd70f28454171c1eba7c0florianvoid
899768109e5d3c18da127dd70f28454171c1eba7c0florianalgr_cc_2(void)
909768109e5d3c18da127dd70f28454171c1eba7c0florian{
919768109e5d3c18da127dd70f28454171c1eba7c0florian  unsigned long v1, v2;
929768109e5d3c18da127dd70f28454171c1eba7c0florian  int wrong, ok;
939768109e5d3c18da127dd70f28454171c1eba7c0florian
949768109e5d3c18da127dd70f28454171c1eba7c0florian  printf("Test #3  cc == 2\n");
959768109e5d3c18da127dd70f28454171c1eba7c0florian
969768109e5d3c18da127dd70f28454171c1eba7c0florian  v1 = ~0ULL;
979768109e5d3c18da127dd70f28454171c1eba7c0florian  v2 = 1;
989768109e5d3c18da127dd70f28454171c1eba7c0florian
999768109e5d3c18da127dd70f28454171c1eba7c0florian  wrong = ok = 0;
1009768109e5d3c18da127dd70f28454171c1eba7c0florian
1019768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(0,  v1, v2)) ++wrong; else ++ok;
1029768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(1,  v1, v2)) ++wrong; else ++ok;
1039768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(2,  v1, v2)) ++ok; else ++wrong;
1049768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(3,  v1, v2)) ++ok; else ++wrong;
1059768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(4,  v1, v2)) ++wrong; else ++ok;
1069768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(5,  v1, v2)) ++wrong; else ++ok;
1079768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(6,  v1, v2)) ++ok; else ++wrong;
1089768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(7,  v1, v2)) ++ok; else ++wrong;
1099768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(8,  v1, v2)) ++wrong; else ++ok;
1109768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(9,  v1, v2)) ++wrong; else ++ok;
1119768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(10, v1, v2)) ++ok; else ++wrong;
1129768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(11, v1, v2)) ++ok; else ++wrong;
1139768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(12, v1, v2)) ++wrong; else ++ok;
1149768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(13, v1, v2)) ++wrong; else ++ok;
1159768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(14, v1, v2)) ++ok; else ++wrong;
1169768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(15, v1, v2)) ++ok; else ++wrong;
1179768109e5d3c18da127dd70f28454171c1eba7c0florian
1189768109e5d3c18da127dd70f28454171c1eba7c0florian  if (wrong != 0 /* || ok != 16 */)
1199768109e5d3c18da127dd70f28454171c1eba7c0florian    printf("FAILED\n");
1209768109e5d3c18da127dd70f28454171c1eba7c0florian  else
1219768109e5d3c18da127dd70f28454171c1eba7c0florian    printf("OK\n");
1229768109e5d3c18da127dd70f28454171c1eba7c0florian}
1239768109e5d3c18da127dd70f28454171c1eba7c0florian
1249768109e5d3c18da127dd70f28454171c1eba7c0florianvoid
1259768109e5d3c18da127dd70f28454171c1eba7c0florianalgr_cc_3(void)
1269768109e5d3c18da127dd70f28454171c1eba7c0florian{
1279768109e5d3c18da127dd70f28454171c1eba7c0florian  unsigned long v1, v2;
1289768109e5d3c18da127dd70f28454171c1eba7c0florian  int wrong, ok;
1299768109e5d3c18da127dd70f28454171c1eba7c0florian
1309768109e5d3c18da127dd70f28454171c1eba7c0florian  printf("Test #4  cc == 3\n");
1319768109e5d3c18da127dd70f28454171c1eba7c0florian
1329768109e5d3c18da127dd70f28454171c1eba7c0florian  v1 = ~0ULL;
1339768109e5d3c18da127dd70f28454171c1eba7c0florian  v2 = 100;
1349768109e5d3c18da127dd70f28454171c1eba7c0florian
1359768109e5d3c18da127dd70f28454171c1eba7c0florian  wrong = ok = 0;
1369768109e5d3c18da127dd70f28454171c1eba7c0florian
1379768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(0,  v1, v2)) ++wrong; else ++ok;
1389768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(1,  v1, v2)) ++ok; else ++wrong;
1399768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(2,  v1, v2)) ++wrong; else ++ok;
1409768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(3,  v1, v2)) ++ok; else ++wrong;
1419768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(4,  v1, v2)) ++wrong; else ++ok;
1429768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(5,  v1, v2)) ++ok; else ++wrong;
1439768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(6,  v1, v2)) ++wrong; else ++ok;
1449768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(7,  v1, v2)) ++ok; else ++wrong;
1459768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(8,  v1, v2)) ++wrong; else ++ok;
1469768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(9,  v1, v2)) ++ok; else ++wrong;
1479768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(10, v1, v2)) ++wrong; else ++ok;
1489768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(11, v1, v2)) ++ok; else ++wrong;
1499768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(12, v1, v2)) ++wrong; else ++ok;
1509768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(13, v1, v2)) ++ok; else ++wrong;
1519768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(14, v1, v2)) ++wrong; else ++ok;
1529768109e5d3c18da127dd70f28454171c1eba7c0florian  if (branch(15, v1, v2)) ++ok; else ++wrong;
1539768109e5d3c18da127dd70f28454171c1eba7c0florian
1549768109e5d3c18da127dd70f28454171c1eba7c0florian  if (wrong != 0 || ok != 16)
1559768109e5d3c18da127dd70f28454171c1eba7c0florian    printf("FAILED\n");
1569768109e5d3c18da127dd70f28454171c1eba7c0florian  else
1579768109e5d3c18da127dd70f28454171c1eba7c0florian    printf("OK\n");
1589768109e5d3c18da127dd70f28454171c1eba7c0florian}
1599768109e5d3c18da127dd70f28454171c1eba7c0florian
1609768109e5d3c18da127dd70f28454171c1eba7c0florianint main()
1619768109e5d3c18da127dd70f28454171c1eba7c0florian{
1629768109e5d3c18da127dd70f28454171c1eba7c0florian  algr_cc_0();
1639768109e5d3c18da127dd70f28454171c1eba7c0florian  algr_cc_1();
1649768109e5d3c18da127dd70f28454171c1eba7c0florian  algr_cc_2();
1659768109e5d3c18da127dd70f28454171c1eba7c0florian  algr_cc_3();
1669768109e5d3c18da127dd70f28454171c1eba7c0florian
1679768109e5d3c18da127dd70f28454171c1eba7c0florian  return 0;
1689768109e5d3c18da127dd70f28454171c1eba7c0florian}
169