#include <stdio.h>
#define get_cc() \
({ \
char __cc; \
/* don't use IPM to better test spechelpers */ \
asm volatile( "brc 8,1f\n\t" \
"brc 4,2f\n\t" \
"brc 2,3f\n\t" \
"brc 1,4f\n\t" \
"mvi %0,4\n\t" \
"j 0f\n\t" \
"1: mvi %0,0\n\t" \
"j 0f\n\t" \
"2: mvi %0,1\n\t" \
"j 0f\n\t" \
"3: mvi %0,2\n\t" \
"j 0f\n\t" \
"4: mvi %0,3\n\t" \
"j 0f\n\t" \
"0: /* nop */ brc 0,0\n\t" \
: "=m" (__cc) : : "memory"); \
__cc; \
})
void check_cc(int value, int cc)
{
if (cc != value) {
printf("wrong cc: ");
if (value == 0) printf("expected 0 ");
if (value == 1) printf("expected 1 ");
if (value == 2) printf("expected 2 ");
if (value == 3) printf("expected 3 ");
if (cc == 0) printf("got 0");
if (cc == 1) printf("got 1");
if (cc == 2) printf("got 2");
if (cc == 3) printf("got 3");
} else {
printf("OK");
}
printf("\n");
}
void tmll(void)
{
unsigned long v;
/* test #1: value is zero, all bits selected */
v = 0;
asm volatile( "tmll %[v],0xFFFF\n\t" : : [v] "d"(v) : "cc");
check_cc(0, get_cc());
/* test #2: value is all-ones, mask is zero */
v = 0xFFFF;
asm volatile( "tmll %[v],0\n\t" : : [v] "d"(v) : "cc");
check_cc(0, get_cc());
/* test #3: selected bits are 0 */
v = 0x0F;
asm volatile( "tmll %[v],0xf0\n\t" : : [v] "d"(v) : "cc");
check_cc(0, get_cc());
/* test #4: selected bits are all 1 */
v = 0xF0;
asm volatile( "tmll %[v],0x70\n\t" : : [v] "d"(v) : "cc");
check_cc(3, get_cc());
/* test #5: selected bits are mixed, leftmost bit is 0 */
v = 0x0F;
asm volatile( "tmll %[v],0x81\n\t" : : [v] "d"(v) : "cc");
check_cc(1, get_cc());
/* test #6: selected bits are mixed, leftmost bit is 1 */
v = 0xF0;
asm volatile( "tmll %[v],0x81\n\t" : : [v] "d"(v) : "cc");
check_cc(2, get_cc());
}
int main(void)
{
tmll();
return 0;
}