#include <stdio.h>
#define branch(mask,_v1,_v2) \
({ \
unsigned char taken; \
unsigned long b1 = _v1; \
unsigned long b2 = _v2; \
asm volatile( " algr %[b1],%[b2]\n\t" \
" brc " #mask " ,1f\n\t" \
" mvi %[taken],0\n\t" \
" j 0f\n\t" \
"1: mvi %[taken],1\n\t" \
"0: bcr 0,0 /* nop */\n\t" \
: [taken] "=Q" (taken), [b1] "+d"(b1) \
: [b2] "d"(b2) \
: "cc"); \
taken; \
})
void
algr_cc_0(void)
{
unsigned long v1, v2;
int wrong, ok;
printf("Test #1 cc == 0\n");
v1 = v2 = 0;
wrong = ok = 0;
if (branch(0, v1, v2)) ++wrong; else ++ok;
if (branch(1, v1, v2)) ++wrong; else ++ok;
if (branch(2, v1, v2)) ++wrong; else ++ok;
if (branch(3, v1, v2)) ++wrong; else ++ok;
if (branch(4, v1, v2)) ++wrong; else ++ok;
if (branch(5, v1, v2)) ++wrong; else ++ok;
if (branch(6, v1, v2)) ++wrong; else ++ok;
if (branch(7, v1, v2)) ++wrong; else ++ok;
if (branch(8, v1, v2)) ++ok; else ++wrong;
if (branch(9, v1, v2)) ++ok; else ++wrong;
if (branch(10, v1, v2)) ++ok; else ++wrong;
if (branch(11, v1, v2)) ++ok; else ++wrong;
if (branch(12, v1, v2)) ++ok; else ++wrong;
if (branch(13, v1, v2)) ++ok; else ++wrong;
if (branch(14, v1, v2)) ++ok; else ++wrong;
if (branch(15, v1, v2)) ++ok; else ++wrong;
if (wrong != 0 || ok != 16)
printf("FAILED\n");
else
printf("OK\n");
}
void
algr_cc_1(void)
{
unsigned long v1, v2;
int wrong, ok;
printf("Test #2 cc == 1\n");
v1 = v2 = 42;
wrong = ok = 0;
if (branch(0, v1, v2)) ++wrong; else ++ok;
if (branch(1, v1, v2)) ++wrong; else ++ok;
if (branch(2, v1, v2)) ++wrong; else ++ok;
if (branch(3, v1, v2)) ++wrong; else ++ok;
if (branch(4, v1, v2)) ++ok; else ++wrong;
if (branch(5, v1, v2)) ++ok; else ++wrong;
if (branch(6, v1, v2)) ++ok; else ++wrong;
if (branch(7, v1, v2)) ++ok; else ++wrong;
if (branch(8, v1, v2)) ++wrong; else ++ok;
if (branch(9, v1, v2)) ++wrong; else ++ok;
if (branch(10, v1, v2)) ++wrong; else ++ok;
if (branch(11, v1, v2)) ++wrong; else ++ok;
if (branch(12, v1, v2)) ++ok; else ++wrong;
if (branch(13, v1, v2)) ++ok; else ++wrong;
if (branch(14, v1, v2)) ++ok; else ++wrong;
if (branch(15, v1, v2)) ++ok; else ++wrong;
if (wrong != 0 || ok != 16)
printf("FAILED\n");
else
printf("OK\n");
}
void
algr_cc_2(void)
{
unsigned long v1, v2;
int wrong, ok;
printf("Test #3 cc == 2\n");
v1 = ~0ULL;
v2 = 1;
wrong = ok = 0;
if (branch(0, v1, v2)) ++wrong; else ++ok;
if (branch(1, v1, v2)) ++wrong; else ++ok;
if (branch(2, v1, v2)) ++ok; else ++wrong;
if (branch(3, v1, v2)) ++ok; else ++wrong;
if (branch(4, v1, v2)) ++wrong; else ++ok;
if (branch(5, v1, v2)) ++wrong; else ++ok;
if (branch(6, v1, v2)) ++ok; else ++wrong;
if (branch(7, v1, v2)) ++ok; else ++wrong;
if (branch(8, v1, v2)) ++wrong; else ++ok;
if (branch(9, v1, v2)) ++wrong; else ++ok;
if (branch(10, v1, v2)) ++ok; else ++wrong;
if (branch(11, v1, v2)) ++ok; else ++wrong;
if (branch(12, v1, v2)) ++wrong; else ++ok;
if (branch(13, v1, v2)) ++wrong; else ++ok;
if (branch(14, v1, v2)) ++ok; else ++wrong;
if (branch(15, v1, v2)) ++ok; else ++wrong;
if (wrong != 0 /* || ok != 16 */)
printf("FAILED\n");
else
printf("OK\n");
}
void
algr_cc_3(void)
{
unsigned long v1, v2;
int wrong, ok;
printf("Test #4 cc == 3\n");
v1 = ~0ULL;
v2 = 100;
wrong = ok = 0;
if (branch(0, v1, v2)) ++wrong; else ++ok;
if (branch(1, v1, v2)) ++ok; else ++wrong;
if (branch(2, v1, v2)) ++wrong; else ++ok;
if (branch(3, v1, v2)) ++ok; else ++wrong;
if (branch(4, v1, v2)) ++wrong; else ++ok;
if (branch(5, v1, v2)) ++ok; else ++wrong;
if (branch(6, v1, v2)) ++wrong; else ++ok;
if (branch(7, v1, v2)) ++ok; else ++wrong;
if (branch(8, v1, v2)) ++wrong; else ++ok;
if (branch(9, v1, v2)) ++ok; else ++wrong;
if (branch(10, v1, v2)) ++wrong; else ++ok;
if (branch(11, v1, v2)) ++ok; else ++wrong;
if (branch(12, v1, v2)) ++wrong; else ++ok;
if (branch(13, v1, v2)) ++ok; else ++wrong;
if (branch(14, v1, v2)) ++wrong; else ++ok;
if (branch(15, v1, v2)) ++ok; else ++wrong;
if (wrong != 0 || ok != 16)
printf("FAILED\n");
else
printf("OK\n");
}
int main()
{
algr_cc_0();
algr_cc_1();
algr_cc_2();
algr_cc_3();
return 0;
}