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