ex_sig ex_clone cu14 cu14_1 cu41 fpconv ecag fpext fpext_warn \
rounding-1 rounding-2 rounding-3 rounding-4 rounding-5 bfp-1 \
bfp-2 bfp-3 bfp-4 srnm srnmb comp-1 comp-2 exrl tmll tm stmg \
- ex
+ ex clst mvc test_clone test_fork test_sig \
+ spechelper-alr spechelper-algr \
+ spechelper-slr spechelper-slgr \
+ spechelper-cr spechelper-clr \
+ spechelper-ltr spechelper-or \
+ spechelper-icm-1 spechelper-icm-2 spechelper-tmll \
+ spechelper-tm
check_PROGRAMS = $(INSN_TESTS) \
allexec \
op00.stderr.exp1 op00.stderr.exp2 op00.vgtest \
fpext_fail.vgtest fpext_fail.stderr.exp fpext_fail.stdout.exp \
test.h opcodes.h add.h and.h div.h insert.h \
- mul.h or.h sub.h test.h xor.h table.h
+ mul.h or.h sub.h xor.h table.h svc.h
AM_CFLAGS += @FLAG_M64@
AM_CXXFLAGS += @FLAG_M64@
--- /dev/null
+#include <stdio.h>
+#include <ctype.h>
+#include "test.h"
+
+#define LOOPBACK "jo 0b \n\t"
+
+typedef struct {
+ const char *str1;
+ const char *str2;
+ int cc;
+} clst_t;
+
+static clst_t
+do_clst(const char *__string1, const char *__string2, char __end)
+{
+ register char end asm ("0") = __end;
+ register const char *string1 asm ("2") = __string1;
+ register const char *string2 asm ("4") = __string2;
+
+ asm volatile( "0: clst 2,4\n\t"
+ LOOPBACK
+ :"+d" (string1), "+d" (string2) :"d" (end): "cc");
+
+ return (clst_t) { .str1 = string1, .str2 = string2, .cc = get_cc() };
+}
+
+void
+clst(const char *str1, const char *str2, int sentinel)
+{
+ clst_t res;
+
+ printf("comparing: %s with %s sentinel = %d", str1, str2, sentinel);
+ if (isprint(sentinel))
+ printf(" (%c)", sentinel);
+ printf("\n");
+ res = do_clst(str1, str2, sentinel);
+ printf("str1 = %s\nstr2 = %s\ncc = %d\n", res.str1, res.str2, res.cc);
+ printf("\n");
+}
+
+int main(void)
+{
+ clst("lower123", "lowerabc", '\0');
+ clst("higher234", "higher123", '\0');
+ clst("equal", "equal", '\0');
+
+ clst("equal", "equallong", '\0');
+ clst("equallong", "equal", '\0');
+
+ clst("lower1", "lower2", 'w'); // will compare equal
+
+ return 0;
+}
--- /dev/null
+comparing: lower123 with lowerabc sentinel = 0
+str1 = 123
+str2 = abc
+cc = 1
+
+comparing: higher234 with higher123 sentinel = 0
+str1 = 234
+str2 = 123
+cc = 2
+
+comparing: equal with equal sentinel = 0
+str1 = equal
+str2 = equal
+cc = 0
+
+comparing: equal with equallong sentinel = 0
+str1 =
+str2 = long
+cc = 1
+
+comparing: equallong with equal sentinel = 0
+str1 = long
+str2 =
+cc = 2
+
+comparing: lower1 with lower2 sentinel = 119 (w)
+str1 = lower1
+str2 = lower2
+cc = 0
+
--- /dev/null
+prog: clst
--- /dev/null
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+
+char buffer[] = "0123456789abcdefXXXXX";
+char target[] = "---------------------";
+char overlap[]= "012345678901234567890";
+char full[300];
+
+int main(void)
+{
+ int i;
+
+ /* Normal copy */
+ printf("------- Copy 17 bytes from BUFFER to TARGET\n");
+ printf("before: buffer = |%s|\n", buffer);
+ printf("before: target = |%s|\n", target);
+ asm volatile( "mvc 0(17,%0),0(%1)\n"
+ ::"a" (target),"a" (buffer): "memory");
+ printf("after: buffer = |%s|\n", buffer);
+ printf("after: target = |%s|\n", target);
+ printf("\n");
+
+ /* Destructive overlap #1 */
+ printf("------- Destructive overlap #1\n");
+ printf("before: |%s|\n", overlap);
+ asm volatile( "mvc 1(17,%0),0(%1)\n"
+ ::"a" (overlap),"a" (overlap): "memory");
+ printf("after: |%s|\n", overlap);
+
+ /* Destructive overlap #2 */
+ printf("------- Destructive overlap #2\n");
+ memset(target, '-', sizeof target - 1); // restore initial state
+ printf("before: target = |%s|\n", target);
+ asm volatile( "mvi 0(%0),'x'\n\t" // target[1] = 'x'
+ "mvc 1(2,%0),0(%0)\n\t" // target[2:3] = target[1]
+ :: "a" (target+1));
+ printf("after: target = |%s|\n", target);
+
+ /* Destructive overlap #3 */
+ printf("------- Destructive overlap #3 (max length)\n");
+ memset(full, '-', sizeof full);
+ full[0] = 'x';
+ asm volatile( "mvc 1(256,%0),0(%0)\n\t" // full[1:256] = full[0]
+ :: "a" (full));
+ /* Verify: the first 256+1 characters should be 'x' followed by '-' */
+ for (i = 0; i <= 256; ++i)
+ assert(full[i] == 'x');
+ for ( ; i < sizeof full; ++i)
+ assert(full[i] == '-');
+ printf("\n");
+
+ /* Non-destructive overlap */
+ printf("------- Non-destructive overlap buf[0:4] = buf[10:14]\n");
+ char buf[] = "0123456789abcde";
+ printf("before: buf = |%s|\n", buf);
+ asm volatile( "mvc 0(5,%0),10(%1)\n"
+ ::"a" (buf),"a" (buf): "memory");
+ printf("after: buf = |%s|\n", buf);
+
+ return 0;
+}
--- /dev/null
+------- Copy 17 bytes from BUFFER to TARGET
+before: buffer = |0123456789abcdefXXXXX|
+before: target = |---------------------|
+after: buffer = |0123456789abcdefXXXXX|
+after: target = |0123456789abcdefX----|
+
+------- Destructive overlap #1
+before: |012345678901234567890|
+after: |000000000000000000890|
+------- Destructive overlap #2
+before: target = |---------------------|
+after: target = |-xxx-----------------|
+------- Destructive overlap #3 (max length)
+
+------- Non-destructive overlap buf[0:4] = buf[10:14]
+before: buf = |0123456789abcde|
+after: buf = |abcde56789abcde|
--- /dev/null
+#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;
+}
--- /dev/null
+Test #1 cc == 0
+OK
+Test #2 cc == 1
+OK
+Test #3 cc == 2
+OK
+Test #4 cc == 3
+OK
--- /dev/null
+prog: spechelper-algr
--- /dev/null
+#include <stdio.h>
+
+#define branch(mask,_v1,_v2) \
+ ({ \
+ unsigned char taken; \
+ unsigned b1 = _v1; \
+ unsigned b2 = _v2; \
+ asm volatile( " alr %[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
+alr_cc_0(void)
+{
+ unsigned 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
+alr_cc_1(void)
+{
+ unsigned 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
+alr_cc_2(void)
+{
+ unsigned v1, v2;
+ int wrong, ok;
+
+ printf("Test #3 cc == 2\n");
+
+ v1 = 0xFFFFFFFF;
+ 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
+alr_cc_3(void)
+{
+ unsigned v1, v2;
+ int wrong, ok;
+
+ printf("Test #4 cc == 3\n");
+
+ v1 = 0xFFFFFFFF;
+ 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()
+{
+ alr_cc_0();
+ alr_cc_1();
+ alr_cc_2();
+ alr_cc_3();
+
+ return 0;
+}
--- /dev/null
+Test #1 cc == 0
+OK
+Test #2 cc == 1
+OK
+Test #3 cc == 2
+OK
+Test #4 cc == 3
+OK
--- /dev/null
+prog: spechelper-alr
--- /dev/null
+#include <stdio.h>
+
+#define branch(mask,_v1,_v2) \
+ ({ \
+ unsigned char taken; \
+ unsigned b1 = _v1, b2 = _v2; \
+ asm volatile(" clr %[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
+clr_1(void)
+{
+ int wrong, ok, v1, v2;
+
+ printf("Test #1 op1 == op2\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)) ++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
+clr_2(void)
+{
+ int wrong, ok, v1, v2;
+
+ printf("Test #2 op1 > op2\n");
+ v1 = 100;
+ v2 = 99;
+ 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
+clr_3(void)
+{
+ int wrong, ok, v1, v2;
+
+ printf("Test #3 op1 < op2\n");
+ v1 = 7;
+ v2 = 10;
+ 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");
+}
+
+int main()
+{
+ clr_1();
+ clr_2();
+ clr_3();
+ return 0;
+}
--- /dev/null
+Test #1 op1 == op2
+OK
+Test #2 op1 > op2
+OK
+Test #3 op1 < op2
+OK
--- /dev/null
+prog: spechelper-clr
--- /dev/null
+#include <stdio.h>
+
+#define branch(mask,_v1,_v2) \
+ ({ \
+ unsigned char taken; \
+ unsigned b1 = _v1, b2 = _v2; \
+ asm volatile( " cr %[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
+cr_1(void)
+{
+ int wrong, ok, v1, v2;
+
+ printf("Test #1 op1 == op2\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)) ++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
+cr_2(void)
+{
+ int wrong, ok, v1, v2;
+
+ printf("Test #2 op1 > op2\n");
+ v1 = 100;
+ v2 = -10;
+ 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
+cr_3(void)
+{
+ int wrong, ok, v1, v2;
+
+ printf("Test #3 op1 < op2\n");
+ v1 = -100;
+ v2 = -10;
+ 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");
+}
+
+int main()
+{
+ cr_1();
+ cr_2();
+ cr_3();
+ return 0;
+}
--- /dev/null
+Test #1 op1 == op2
+OK
+Test #2 op1 > op2
+OK
+Test #3 op1 < op2
+OK
--- /dev/null
+prog: spechelper-cr
--- /dev/null
+#include <stdio.h>
+
+#define branch(mask,icmm,_v1) \
+ ({ \
+ unsigned char taken; \
+ unsigned b1 = _v1; \
+ asm volatile( " larl 1, 2f\n\t" \
+ " l 0, 0(1)\n\t" \
+ " icm 0," #icmm",%[b1]\n\t" \
+ " brc " #mask " ,1f\n\t" \
+ " mvi %[taken],0\n\t" \
+ " j 0f\n\t" \
+ "1: mvi %[taken],1\n\t" \
+ " j 0f\n\t" \
+ "2: .long 0\n\t" \
+ "0: bcr 0,0 /* nop */\n\t" \
+ : [taken] "=Q" (taken) \
+ : [b1] "Q"(b1) \
+ : "cc", "0","1"); \
+ taken; \
+ })
+
+void
+icm_mask_0(void)
+{
+ int wrong, ok;
+ unsigned v1;
+
+ printf("Test #1 mask == 0, value == 0xFFFFFFFF --> cc == 0\n");
+
+ v1 = 0xFFFFFFFF;
+ wrong = ok = 0;
+
+ if (branch(0, 0, v1)) ++wrong; else ++ok;
+ if (branch(1, 0, v1)) ++wrong; else ++ok;
+ if (branch(2, 0, v1)) ++wrong; else ++ok;
+ if (branch(3, 0, v1)) ++wrong; else ++ok;
+ if (branch(4, 0, v1)) ++wrong; else ++ok;
+ if (branch(5, 0, v1)) ++wrong; else ++ok;
+ if (branch(6, 0, v1)) ++wrong; else ++ok;
+ if (branch(7, 0, v1)) ++wrong; else ++ok;
+ if (branch(8, 0, v1)) ++ok; else ++wrong;
+ if (branch(9, 0, v1)) ++ok; else ++wrong;
+ if (branch(10, 0, v1)) ++ok; else ++wrong;
+ if (branch(11, 0, v1)) ++ok; else ++wrong;
+ if (branch(12, 0, v1)) ++ok; else ++wrong;
+ if (branch(13, 0, v1)) ++ok; else ++wrong;
+ if (branch(14, 0, v1)) ++ok; else ++wrong;
+ if (branch(15, 0, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+void
+icm_value_0(void)
+{
+ int wrong, ok;
+ unsigned v1;
+
+ printf("Test #2 mask == 0xF, value == 0 --> cc == 0\n");
+
+ v1 = 0;
+ wrong = ok = 0;
+
+ if (branch(0, 15, v1)) ++wrong; else ++ok;
+ if (branch(1, 15, v1)) ++wrong; else ++ok;
+ if (branch(2, 15, v1)) ++wrong; else ++ok;
+ if (branch(3, 15, v1)) ++wrong; else ++ok;
+ if (branch(4, 15, v1)) ++wrong; else ++ok;
+ if (branch(5, 15, v1)) ++wrong; else ++ok;
+ if (branch(6, 15, v1)) ++wrong; else ++ok;
+ if (branch(7, 15, v1)) ++wrong; else ++ok;
+ if (branch(8, 15, v1)) ++ok; else ++wrong;
+ if (branch(9, 15, v1)) ++ok; else ++wrong;
+ if (branch(10, 15, v1)) ++ok; else ++wrong;
+ if (branch(11, 15, v1)) ++ok; else ++wrong;
+ if (branch(12, 15, v1)) ++ok; else ++wrong;
+ if (branch(13, 15, v1)) ++ok; else ++wrong;
+ if (branch(14, 15, v1)) ++ok; else ++wrong;
+ if (branch(15, 15, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+/* loads one byte */
+void
+icm_one_byte_msb_set(void)
+{
+ int wrong, ok;
+ unsigned v1;
+
+ printf("Test #3 load one byte, msb set --> cc == 1\n");
+
+ v1 = 0x80000000;
+ wrong = ok = 0;
+
+ if (branch(0, 8, v1)) ++wrong; else ++ok;
+ if (branch(1, 8, v1)) ++wrong; else ++ok;
+ if (branch(2, 8, v1)) ++wrong; else ++ok;
+ if (branch(3, 8, v1)) ++wrong; else ++ok;
+ if (branch(4, 8, v1)) ++ok; else ++wrong;
+ if (branch(5, 8, v1)) ++ok; else ++wrong;
+ if (branch(6, 8, v1)) ++ok; else ++wrong;
+ if (branch(7, 8, v1)) ++ok; else ++wrong;
+ if (branch(8, 8, v1)) ++wrong; else ++ok;
+ if (branch(9, 8, v1)) ++wrong; else ++ok;
+ if (branch(10, 8, v1)) ++wrong; else ++ok;
+ if (branch(11, 8, v1)) ++wrong; else ++ok;
+ if (branch(12, 8, v1)) ++ok; else ++wrong;
+ if (branch(13, 8, v1)) ++ok; else ++wrong;
+ if (branch(14, 8, v1)) ++ok; else ++wrong;
+ if (branch(15, 8, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 4, v1)) ++wrong; else ++ok;
+ if (branch(1, 4, v1)) ++wrong; else ++ok;
+ if (branch(2, 4, v1)) ++wrong; else ++ok;
+ if (branch(3, 4, v1)) ++wrong; else ++ok;
+ if (branch(4, 4, v1)) ++ok; else ++wrong;
+ if (branch(5, 4, v1)) ++ok; else ++wrong;
+ if (branch(6, 4, v1)) ++ok; else ++wrong;
+ if (branch(7, 4, v1)) ++ok; else ++wrong;
+ if (branch(8, 4, v1)) ++wrong; else ++ok;
+ if (branch(9, 4, v1)) ++wrong; else ++ok;
+ if (branch(10, 4, v1)) ++wrong; else ++ok;
+ if (branch(11, 4, v1)) ++wrong; else ++ok;
+ if (branch(12, 4, v1)) ++ok; else ++wrong;
+ if (branch(13, 4, v1)) ++ok; else ++wrong;
+ if (branch(14, 4, v1)) ++ok; else ++wrong;
+ if (branch(15, 4, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 2, v1)) ++wrong; else ++ok;
+ if (branch(1, 2, v1)) ++wrong; else ++ok;
+ if (branch(2, 2, v1)) ++wrong; else ++ok;
+ if (branch(3, 2, v1)) ++wrong; else ++ok;
+ if (branch(4, 2, v1)) ++ok; else ++wrong;
+ if (branch(5, 2, v1)) ++ok; else ++wrong;
+ if (branch(6, 2, v1)) ++ok; else ++wrong;
+ if (branch(7, 2, v1)) ++ok; else ++wrong;
+ if (branch(8, 2, v1)) ++wrong; else ++ok;
+ if (branch(9, 2, v1)) ++wrong; else ++ok;
+ if (branch(10, 2, v1)) ++wrong; else ++ok;
+ if (branch(11, 2, v1)) ++wrong; else ++ok;
+ if (branch(12, 2, v1)) ++ok; else ++wrong;
+ if (branch(13, 2, v1)) ++ok; else ++wrong;
+ if (branch(14, 2, v1)) ++ok; else ++wrong;
+ if (branch(15, 2, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 1, v1)) ++wrong; else ++ok;
+ if (branch(1, 1, v1)) ++wrong; else ++ok;
+ if (branch(2, 1, v1)) ++wrong; else ++ok;
+ if (branch(3, 1, v1)) ++wrong; else ++ok;
+ if (branch(4, 1, v1)) ++ok; else ++wrong;
+ if (branch(5, 1, v1)) ++ok; else ++wrong;
+ if (branch(6, 1, v1)) ++ok; else ++wrong;
+ if (branch(7, 1, v1)) ++ok; else ++wrong;
+ if (branch(8, 1, v1)) ++wrong; else ++ok;
+ if (branch(9, 1, v1)) ++wrong; else ++ok;
+ if (branch(10, 1, v1)) ++wrong; else ++ok;
+ if (branch(11, 1, v1)) ++wrong; else ++ok;
+ if (branch(12, 1, v1)) ++ok; else ++wrong;
+ if (branch(13, 1, v1)) ++ok; else ++wrong;
+ if (branch(14, 1, v1)) ++ok; else ++wrong;
+ if (branch(15, 1, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 64)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+/* loads two bytes */
+void
+icm_two_bytes_msb_set(void)
+{
+ int wrong, ok;
+ unsigned v1;
+
+ printf("Test #4 load two bytes, msb set --> cc == 1\n");
+
+ v1 = 0x80000000;
+ wrong = ok = 0;
+
+ if (branch(0, 12, v1)) ++wrong; else ++ok;
+ if (branch(1, 12, v1)) ++wrong; else ++ok;
+ if (branch(2, 12, v1)) ++wrong; else ++ok;
+ if (branch(3, 12, v1)) ++wrong; else ++ok;
+ if (branch(4, 12, v1)) ++ok; else ++wrong;
+ if (branch(5, 12, v1)) ++ok; else ++wrong;
+ if (branch(6, 12, v1)) ++ok; else ++wrong;
+ if (branch(7, 12, v1)) ++ok; else ++wrong;
+ if (branch(8, 12, v1)) ++wrong; else ++ok;
+ if (branch(9, 12, v1)) ++wrong; else ++ok;
+ if (branch(10, 12, v1)) ++wrong; else ++ok;
+ if (branch(11, 12, v1)) ++wrong; else ++ok;
+ if (branch(12, 12, v1)) ++ok; else ++wrong;
+ if (branch(13, 12, v1)) ++ok; else ++wrong;
+ if (branch(14, 12, v1)) ++ok; else ++wrong;
+ if (branch(15, 12, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 10, v1)) ++wrong; else ++ok;
+ if (branch(1, 10, v1)) ++wrong; else ++ok;
+ if (branch(2, 10, v1)) ++wrong; else ++ok;
+ if (branch(3, 10, v1)) ++wrong; else ++ok;
+ if (branch(4, 10, v1)) ++ok; else ++wrong;
+ if (branch(5, 10, v1)) ++ok; else ++wrong;
+ if (branch(6, 10, v1)) ++ok; else ++wrong;
+ if (branch(7, 10, v1)) ++ok; else ++wrong;
+ if (branch(8, 10, v1)) ++wrong; else ++ok;
+ if (branch(9, 10, v1)) ++wrong; else ++ok;
+ if (branch(10, 10, v1)) ++wrong; else ++ok;
+ if (branch(11, 10, v1)) ++wrong; else ++ok;
+ if (branch(12, 10, v1)) ++ok; else ++wrong;
+ if (branch(13, 10, v1)) ++ok; else ++wrong;
+ if (branch(14, 10, v1)) ++ok; else ++wrong;
+ if (branch(15, 10, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 9, v1)) ++wrong; else ++ok;
+ if (branch(1, 9, v1)) ++wrong; else ++ok;
+ if (branch(2, 9, v1)) ++wrong; else ++ok;
+ if (branch(3, 9, v1)) ++wrong; else ++ok;
+ if (branch(4, 9, v1)) ++ok; else ++wrong;
+ if (branch(5, 9, v1)) ++ok; else ++wrong;
+ if (branch(6, 9, v1)) ++ok; else ++wrong;
+ if (branch(7, 9, v1)) ++ok; else ++wrong;
+ if (branch(8, 9, v1)) ++wrong; else ++ok;
+ if (branch(9, 9, v1)) ++wrong; else ++ok;
+ if (branch(10, 9, v1)) ++wrong; else ++ok;
+ if (branch(11, 9, v1)) ++wrong; else ++ok;
+ if (branch(12, 9, v1)) ++ok; else ++wrong;
+ if (branch(13, 9, v1)) ++ok; else ++wrong;
+ if (branch(14, 9, v1)) ++ok; else ++wrong;
+ if (branch(15, 9, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 6, v1)) ++wrong; else ++ok;
+ if (branch(1, 6, v1)) ++wrong; else ++ok;
+ if (branch(2, 6, v1)) ++wrong; else ++ok;
+ if (branch(3, 6, v1)) ++wrong; else ++ok;
+ if (branch(4, 6, v1)) ++ok; else ++wrong;
+ if (branch(5, 6, v1)) ++ok; else ++wrong;
+ if (branch(6, 6, v1)) ++ok; else ++wrong;
+ if (branch(7, 6, v1)) ++ok; else ++wrong;
+ if (branch(8, 6, v1)) ++wrong; else ++ok;
+ if (branch(9, 6, v1)) ++wrong; else ++ok;
+ if (branch(10, 6, v1)) ++wrong; else ++ok;
+ if (branch(11, 6, v1)) ++wrong; else ++ok;
+ if (branch(12, 6, v1)) ++ok; else ++wrong;
+ if (branch(13, 6, v1)) ++ok; else ++wrong;
+ if (branch(14, 6, v1)) ++ok; else ++wrong;
+ if (branch(15, 6, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 5, v1)) ++wrong; else ++ok;
+ if (branch(1, 5, v1)) ++wrong; else ++ok;
+ if (branch(2, 5, v1)) ++wrong; else ++ok;
+ if (branch(3, 5, v1)) ++wrong; else ++ok;
+ if (branch(4, 5, v1)) ++ok; else ++wrong;
+ if (branch(5, 5, v1)) ++ok; else ++wrong;
+ if (branch(6, 5, v1)) ++ok; else ++wrong;
+ if (branch(7, 5, v1)) ++ok; else ++wrong;
+ if (branch(8, 5, v1)) ++wrong; else ++ok;
+ if (branch(9, 5, v1)) ++wrong; else ++ok;
+ if (branch(10, 5, v1)) ++wrong; else ++ok;
+ if (branch(11, 5, v1)) ++wrong; else ++ok;
+ if (branch(12, 5, v1)) ++ok; else ++wrong;
+ if (branch(13, 5, v1)) ++ok; else ++wrong;
+ if (branch(14, 5, v1)) ++ok; else ++wrong;
+ if (branch(15, 5, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 3, v1)) ++wrong; else ++ok;
+ if (branch(1, 3, v1)) ++wrong; else ++ok;
+ if (branch(2, 3, v1)) ++wrong; else ++ok;
+ if (branch(3, 3, v1)) ++wrong; else ++ok;
+ if (branch(4, 3, v1)) ++ok; else ++wrong;
+ if (branch(5, 3, v1)) ++ok; else ++wrong;
+ if (branch(6, 3, v1)) ++ok; else ++wrong;
+ if (branch(7, 3, v1)) ++ok; else ++wrong;
+ if (branch(8, 3, v1)) ++wrong; else ++ok;
+ if (branch(9, 3, v1)) ++wrong; else ++ok;
+ if (branch(10, 3, v1)) ++wrong; else ++ok;
+ if (branch(11, 3, v1)) ++wrong; else ++ok;
+ if (branch(12, 3, v1)) ++ok; else ++wrong;
+ if (branch(13, 3, v1)) ++ok; else ++wrong;
+ if (branch(14, 3, v1)) ++ok; else ++wrong;
+ if (branch(15, 3, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 96)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+/* loads three bytes */
+void
+icm_three_bytes_msb_set(void)
+{
+ int wrong, ok;
+ unsigned v1;
+
+ printf("Test #5 load three bytes, msb set --> cc == 1\n");
+
+ v1 = 0x80000000;
+ wrong = ok = 0;
+
+ if (branch(0, 14, v1)) ++wrong; else ++ok;
+ if (branch(1, 14, v1)) ++wrong; else ++ok;
+ if (branch(2, 14, v1)) ++wrong; else ++ok;
+ if (branch(3, 14, v1)) ++wrong; else ++ok;
+ if (branch(4, 14, v1)) ++ok; else ++wrong;
+ if (branch(5, 14, v1)) ++ok; else ++wrong;
+ if (branch(6, 14, v1)) ++ok; else ++wrong;
+ if (branch(7, 14, v1)) ++ok; else ++wrong;
+ if (branch(8, 14, v1)) ++wrong; else ++ok;
+ if (branch(9, 14, v1)) ++wrong; else ++ok;
+ if (branch(10, 14, v1)) ++wrong; else ++ok;
+ if (branch(11, 14, v1)) ++wrong; else ++ok;
+ if (branch(12, 14, v1)) ++ok; else ++wrong;
+ if (branch(13, 14, v1)) ++ok; else ++wrong;
+ if (branch(14, 14, v1)) ++ok; else ++wrong;
+ if (branch(15, 14, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 13, v1)) ++wrong; else ++ok;
+ if (branch(1, 13, v1)) ++wrong; else ++ok;
+ if (branch(2, 13, v1)) ++wrong; else ++ok;
+ if (branch(3, 13, v1)) ++wrong; else ++ok;
+ if (branch(4, 13, v1)) ++ok; else ++wrong;
+ if (branch(5, 13, v1)) ++ok; else ++wrong;
+ if (branch(6, 13, v1)) ++ok; else ++wrong;
+ if (branch(7, 13, v1)) ++ok; else ++wrong;
+ if (branch(8, 13, v1)) ++wrong; else ++ok;
+ if (branch(9, 13, v1)) ++wrong; else ++ok;
+ if (branch(10, 13, v1)) ++wrong; else ++ok;
+ if (branch(11, 13, v1)) ++wrong; else ++ok;
+ if (branch(12, 13, v1)) ++ok; else ++wrong;
+ if (branch(13, 13, v1)) ++ok; else ++wrong;
+ if (branch(14, 13, v1)) ++ok; else ++wrong;
+ if (branch(15, 13, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 11, v1)) ++wrong; else ++ok;
+ if (branch(1, 11, v1)) ++wrong; else ++ok;
+ if (branch(2, 11, v1)) ++wrong; else ++ok;
+ if (branch(3, 11, v1)) ++wrong; else ++ok;
+ if (branch(4, 11, v1)) ++ok; else ++wrong;
+ if (branch(5, 11, v1)) ++ok; else ++wrong;
+ if (branch(6, 11, v1)) ++ok; else ++wrong;
+ if (branch(7, 11, v1)) ++ok; else ++wrong;
+ if (branch(8, 11, v1)) ++wrong; else ++ok;
+ if (branch(9, 11, v1)) ++wrong; else ++ok;
+ if (branch(10, 11, v1)) ++wrong; else ++ok;
+ if (branch(11, 11, v1)) ++wrong; else ++ok;
+ if (branch(12, 11, v1)) ++ok; else ++wrong;
+ if (branch(13, 11, v1)) ++ok; else ++wrong;
+ if (branch(14, 11, v1)) ++ok; else ++wrong;
+ if (branch(15, 11, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 7, v1)) ++wrong; else ++ok;
+ if (branch(1, 7, v1)) ++wrong; else ++ok;
+ if (branch(2, 7, v1)) ++wrong; else ++ok;
+ if (branch(3, 7, v1)) ++wrong; else ++ok;
+ if (branch(4, 7, v1)) ++ok; else ++wrong;
+ if (branch(5, 7, v1)) ++ok; else ++wrong;
+ if (branch(6, 7, v1)) ++ok; else ++wrong;
+ if (branch(7, 7, v1)) ++ok; else ++wrong;
+ if (branch(8, 7, v1)) ++wrong; else ++ok;
+ if (branch(9, 7, v1)) ++wrong; else ++ok;
+ if (branch(10, 7, v1)) ++wrong; else ++ok;
+ if (branch(11, 7, v1)) ++wrong; else ++ok;
+ if (branch(12, 7, v1)) ++ok; else ++wrong;
+ if (branch(13, 7, v1)) ++ok; else ++wrong;
+ if (branch(14, 7, v1)) ++ok; else ++wrong;
+ if (branch(15, 7, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 64)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+/* loads four bytes */
+void
+icm_four_bytes_msb_set(void)
+{
+ int wrong, ok;
+ unsigned v1;
+
+ printf("Test #6 load four bytes, msb set --> cc == 1\n");
+
+ v1 = 0x80000000;
+ wrong = ok = 0;
+
+ if (branch(0, 15, v1)) ++wrong; else ++ok;
+ if (branch(1, 15, v1)) ++wrong; else ++ok;
+ if (branch(2, 15, v1)) ++wrong; else ++ok;
+ if (branch(3, 15, v1)) ++wrong; else ++ok;
+ if (branch(4, 15, v1)) ++ok; else ++wrong;
+ if (branch(5, 15, v1)) ++ok; else ++wrong;
+ if (branch(6, 15, v1)) ++ok; else ++wrong;
+ if (branch(7, 15, v1)) ++ok; else ++wrong;
+ if (branch(8, 15, v1)) ++wrong; else ++ok;
+ if (branch(9, 15, v1)) ++wrong; else ++ok;
+ if (branch(10, 15, v1)) ++wrong; else ++ok;
+ if (branch(11, 15, v1)) ++wrong; else ++ok;
+ if (branch(12, 15, v1)) ++ok; else ++wrong;
+ if (branch(13, 15, v1)) ++ok; else ++wrong;
+ if (branch(14, 15, v1)) ++ok; else ++wrong;
+ if (branch(15, 15, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+/* loads one byte */
+void
+icm_one_byte_msb_not_set(void)
+{
+ int wrong, ok, v1;
+
+ printf("Test #7 load one byte, msb not set --> cc == 2\n");
+
+ v1 = 0x7FFFFFFF;
+ wrong = ok = 0;
+
+ if (branch(0, 8, v1)) ++wrong; else ++ok;
+ if (branch(1, 8, v1)) ++wrong; else ++ok;
+ if (branch(2, 8, v1)) ++ok; else ++wrong;
+ if (branch(3, 8, v1)) ++ok; else ++wrong;
+ if (branch(4, 8, v1)) ++wrong; else ++ok;
+ if (branch(5, 8, v1)) ++wrong; else ++ok;
+ if (branch(6, 8, v1)) ++ok; else ++wrong;
+ if (branch(7, 8, v1)) ++ok; else ++wrong;
+ if (branch(8, 8, v1)) ++wrong; else ++ok;
+ if (branch(9, 8, v1)) ++wrong; else ++ok;
+ if (branch(10, 8, v1)) ++ok; else ++wrong;
+ if (branch(11, 8, v1)) ++ok; else ++wrong;
+ if (branch(12, 8, v1)) ++wrong; else ++ok;
+ if (branch(13, 8, v1)) ++wrong; else ++ok;
+ if (branch(14, 8, v1)) ++ok; else ++wrong;
+ if (branch(15, 8, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 4, v1)) ++wrong; else ++ok;
+ if (branch(1, 4, v1)) ++wrong; else ++ok;
+ if (branch(2, 4, v1)) ++ok; else ++wrong;
+ if (branch(3, 4, v1)) ++ok; else ++wrong;
+ if (branch(4, 4, v1)) ++wrong; else ++ok;
+ if (branch(5, 4, v1)) ++wrong; else ++ok;
+ if (branch(6, 4, v1)) ++ok; else ++wrong;
+ if (branch(7, 4, v1)) ++ok; else ++wrong;
+ if (branch(8, 4, v1)) ++wrong; else ++ok;
+ if (branch(9, 4, v1)) ++wrong; else ++ok;
+ if (branch(10, 4, v1)) ++ok; else ++wrong;
+ if (branch(11, 4, v1)) ++ok; else ++wrong;
+ if (branch(12, 4, v1)) ++wrong; else ++ok;
+ if (branch(13, 4, v1)) ++wrong; else ++ok;
+ if (branch(14, 4, v1)) ++ok; else ++wrong;
+ if (branch(15, 4, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 2, v1)) ++wrong; else ++ok;
+ if (branch(1, 2, v1)) ++wrong; else ++ok;
+ if (branch(2, 2, v1)) ++ok; else ++wrong;
+ if (branch(3, 2, v1)) ++ok; else ++wrong;
+ if (branch(4, 2, v1)) ++wrong; else ++ok;
+ if (branch(5, 2, v1)) ++wrong; else ++ok;
+ if (branch(6, 2, v1)) ++ok; else ++wrong;
+ if (branch(7, 2, v1)) ++ok; else ++wrong;
+ if (branch(8, 2, v1)) ++wrong; else ++ok;
+ if (branch(9, 2, v1)) ++wrong; else ++ok;
+ if (branch(10, 2, v1)) ++ok; else ++wrong;
+ if (branch(11, 2, v1)) ++ok; else ++wrong;
+ if (branch(12, 2, v1)) ++wrong; else ++ok;
+ if (branch(13, 2, v1)) ++wrong; else ++ok;
+ if (branch(14, 2, v1)) ++ok; else ++wrong;
+ if (branch(15, 2, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 1, v1)) ++wrong; else ++ok;
+ if (branch(1, 1, v1)) ++wrong; else ++ok;
+ if (branch(2, 1, v1)) ++ok; else ++wrong;
+ if (branch(3, 1, v1)) ++ok; else ++wrong;
+ if (branch(4, 1, v1)) ++wrong; else ++ok;
+ if (branch(5, 1, v1)) ++wrong; else ++ok;
+ if (branch(6, 1, v1)) ++ok; else ++wrong;
+ if (branch(7, 1, v1)) ++ok; else ++wrong;
+ if (branch(8, 1, v1)) ++wrong; else ++ok;
+ if (branch(9, 1, v1)) ++wrong; else ++ok;
+ if (branch(10, 1, v1)) ++ok; else ++wrong;
+ if (branch(11, 1, v1)) ++ok; else ++wrong;
+ if (branch(12, 1, v1)) ++wrong; else ++ok;
+ if (branch(13, 1, v1)) ++wrong; else ++ok;
+ if (branch(14, 1, v1)) ++ok; else ++wrong;
+ if (branch(15, 1, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 64)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+/* loads two bytes */
+void
+icm_two_bytes_msb_not_set(void)
+{
+ int wrong, ok;
+ unsigned v1;
+
+ printf("Test #8 load two bytes, msb not set --> cc == 2\n");
+
+ v1 = 0x7FFFFFFF;
+ wrong = ok = 0;
+
+ if (branch(0, 12, v1)) ++wrong; else ++ok;
+ if (branch(1, 12, v1)) ++wrong; else ++ok;
+ if (branch(2, 12, v1)) ++ok; else ++wrong;
+ if (branch(3, 12, v1)) ++ok; else ++wrong;
+ if (branch(4, 12, v1)) ++wrong; else ++ok;
+ if (branch(5, 12, v1)) ++wrong; else ++ok;
+ if (branch(6, 12, v1)) ++ok; else ++wrong;
+ if (branch(7, 12, v1)) ++ok; else ++wrong;
+ if (branch(8, 12, v1)) ++wrong; else ++ok;
+ if (branch(9, 12, v1)) ++wrong; else ++ok;
+ if (branch(10, 12, v1)) ++ok; else ++wrong;
+ if (branch(11, 12, v1)) ++ok; else ++wrong;
+ if (branch(12, 12, v1)) ++wrong; else ++ok;
+ if (branch(13, 12, v1)) ++wrong; else ++ok;
+ if (branch(14, 12, v1)) ++ok; else ++wrong;
+ if (branch(15, 12, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 10, v1)) ++wrong; else ++ok;
+ if (branch(1, 10, v1)) ++wrong; else ++ok;
+ if (branch(2, 10, v1)) ++ok; else ++wrong;
+ if (branch(3, 10, v1)) ++ok; else ++wrong;
+ if (branch(4, 10, v1)) ++wrong; else ++ok;
+ if (branch(5, 10, v1)) ++wrong; else ++ok;
+ if (branch(6, 10, v1)) ++ok; else ++wrong;
+ if (branch(7, 10, v1)) ++ok; else ++wrong;
+ if (branch(8, 10, v1)) ++wrong; else ++ok;
+ if (branch(9, 10, v1)) ++wrong; else ++ok;
+ if (branch(10, 10, v1)) ++ok; else ++wrong;
+ if (branch(11, 10, v1)) ++ok; else ++wrong;
+ if (branch(12, 10, v1)) ++wrong; else ++ok;
+ if (branch(13, 10, v1)) ++wrong; else ++ok;
+ if (branch(14, 10, v1)) ++ok; else ++wrong;
+ if (branch(15, 10, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 9, v1)) ++wrong; else ++ok;
+ if (branch(1, 9, v1)) ++wrong; else ++ok;
+ if (branch(2, 9, v1)) ++ok; else ++wrong;
+ if (branch(3, 9, v1)) ++ok; else ++wrong;
+ if (branch(4, 9, v1)) ++wrong; else ++ok;
+ if (branch(5, 9, v1)) ++wrong; else ++ok;
+ if (branch(6, 9, v1)) ++ok; else ++wrong;
+ if (branch(7, 9, v1)) ++ok; else ++wrong;
+ if (branch(8, 9, v1)) ++wrong; else ++ok;
+ if (branch(9, 9, v1)) ++wrong; else ++ok;
+ if (branch(10, 9, v1)) ++ok; else ++wrong;
+ if (branch(11, 9, v1)) ++ok; else ++wrong;
+ if (branch(12, 9, v1)) ++wrong; else ++ok;
+ if (branch(13, 9, v1)) ++wrong; else ++ok;
+ if (branch(14, 9, v1)) ++ok; else ++wrong;
+ if (branch(15, 9, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 6, v1)) ++wrong; else ++ok;
+ if (branch(1, 6, v1)) ++wrong; else ++ok;
+ if (branch(2, 6, v1)) ++ok; else ++wrong;
+ if (branch(3, 6, v1)) ++ok; else ++wrong;
+ if (branch(4, 6, v1)) ++wrong; else ++ok;
+ if (branch(5, 6, v1)) ++wrong; else ++ok;
+ if (branch(6, 6, v1)) ++ok; else ++wrong;
+ if (branch(7, 6, v1)) ++ok; else ++wrong;
+ if (branch(8, 6, v1)) ++wrong; else ++ok;
+ if (branch(9, 6, v1)) ++wrong; else ++ok;
+ if (branch(10, 6, v1)) ++ok; else ++wrong;
+ if (branch(11, 6, v1)) ++ok; else ++wrong;
+ if (branch(12, 6, v1)) ++wrong; else ++ok;
+ if (branch(13, 6, v1)) ++wrong; else ++ok;
+ if (branch(14, 6, v1)) ++ok; else ++wrong;
+ if (branch(15, 6, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 5, v1)) ++wrong; else ++ok;
+ if (branch(1, 5, v1)) ++wrong; else ++ok;
+ if (branch(2, 5, v1)) ++ok; else ++wrong;
+ if (branch(3, 5, v1)) ++ok; else ++wrong;
+ if (branch(4, 5, v1)) ++wrong; else ++ok;
+ if (branch(5, 5, v1)) ++wrong; else ++ok;
+ if (branch(6, 5, v1)) ++ok; else ++wrong;
+ if (branch(7, 5, v1)) ++ok; else ++wrong;
+ if (branch(8, 5, v1)) ++wrong; else ++ok;
+ if (branch(9, 5, v1)) ++wrong; else ++ok;
+ if (branch(10, 5, v1)) ++ok; else ++wrong;
+ if (branch(11, 5, v1)) ++ok; else ++wrong;
+ if (branch(12, 5, v1)) ++wrong; else ++ok;
+ if (branch(13, 5, v1)) ++wrong; else ++ok;
+ if (branch(14, 5, v1)) ++ok; else ++wrong;
+ if (branch(15, 5, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 3, v1)) ++wrong; else ++ok;
+ if (branch(1, 3, v1)) ++wrong; else ++ok;
+ if (branch(2, 3, v1)) ++ok; else ++wrong;
+ if (branch(3, 3, v1)) ++ok; else ++wrong;
+ if (branch(4, 3, v1)) ++wrong; else ++ok;
+ if (branch(5, 3, v1)) ++wrong; else ++ok;
+ if (branch(6, 3, v1)) ++ok; else ++wrong;
+ if (branch(7, 3, v1)) ++ok; else ++wrong;
+ if (branch(8, 3, v1)) ++wrong; else ++ok;
+ if (branch(9, 3, v1)) ++wrong; else ++ok;
+ if (branch(10, 3, v1)) ++ok; else ++wrong;
+ if (branch(11, 3, v1)) ++ok; else ++wrong;
+ if (branch(12, 3, v1)) ++wrong; else ++ok;
+ if (branch(13, 3, v1)) ++wrong; else ++ok;
+ if (branch(14, 3, v1)) ++ok; else ++wrong;
+ if (branch(15, 3, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 96)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+
+/* loads three bytes */
+void
+icm_three_bytes_msb_not_set(void)
+{
+ int wrong, ok;
+ unsigned v1;
+
+ printf("Test #9 load three bytes, msb not set --> cc == 2\n");
+
+ v1 = 0x7FFFFFFF;
+ wrong = ok = 0;
+
+ if (branch(0, 14, v1)) ++wrong; else ++ok;
+ if (branch(1, 14, v1)) ++wrong; else ++ok;
+ if (branch(2, 14, v1)) ++ok; else ++wrong;
+ if (branch(3, 14, v1)) ++ok; else ++wrong;
+ if (branch(4, 14, v1)) ++wrong; else ++ok;
+ if (branch(5, 14, v1)) ++wrong; else ++ok;
+ if (branch(6, 14, v1)) ++ok; else ++wrong;
+ if (branch(7, 14, v1)) ++ok; else ++wrong;
+ if (branch(8, 14, v1)) ++wrong; else ++ok;
+ if (branch(9, 14, v1)) ++wrong; else ++ok;
+ if (branch(10, 14, v1)) ++ok; else ++wrong;
+ if (branch(11, 14, v1)) ++ok; else ++wrong;
+ if (branch(12, 14, v1)) ++wrong; else ++ok;
+ if (branch(13, 14, v1)) ++wrong; else ++ok;
+ if (branch(14, 14, v1)) ++ok; else ++wrong;
+ if (branch(15, 14, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 13, v1)) ++wrong; else ++ok;
+ if (branch(1, 13, v1)) ++wrong; else ++ok;
+ if (branch(2, 13, v1)) ++ok; else ++wrong;
+ if (branch(3, 13, v1)) ++ok; else ++wrong;
+ if (branch(4, 13, v1)) ++wrong; else ++ok;
+ if (branch(5, 13, v1)) ++wrong; else ++ok;
+ if (branch(6, 13, v1)) ++ok; else ++wrong;
+ if (branch(7, 13, v1)) ++ok; else ++wrong;
+ if (branch(8, 13, v1)) ++wrong; else ++ok;
+ if (branch(9, 13, v1)) ++wrong; else ++ok;
+ if (branch(10, 13, v1)) ++ok; else ++wrong;
+ if (branch(11, 13, v1)) ++ok; else ++wrong;
+ if (branch(12, 13, v1)) ++wrong; else ++ok;
+ if (branch(13, 13, v1)) ++wrong; else ++ok;
+ if (branch(14, 13, v1)) ++ok; else ++wrong;
+ if (branch(15, 13, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 11, v1)) ++wrong; else ++ok;
+ if (branch(1, 11, v1)) ++wrong; else ++ok;
+ if (branch(2, 11, v1)) ++ok; else ++wrong;
+ if (branch(3, 11, v1)) ++ok; else ++wrong;
+ if (branch(4, 11, v1)) ++wrong; else ++ok;
+ if (branch(5, 11, v1)) ++wrong; else ++ok;
+ if (branch(6, 11, v1)) ++ok; else ++wrong;
+ if (branch(7, 11, v1)) ++ok; else ++wrong;
+ if (branch(8, 11, v1)) ++wrong; else ++ok;
+ if (branch(9, 11, v1)) ++wrong; else ++ok;
+ if (branch(10, 11, v1)) ++ok; else ++wrong;
+ if (branch(11, 11, v1)) ++ok; else ++wrong;
+ if (branch(12, 11, v1)) ++wrong; else ++ok;
+ if (branch(13, 11, v1)) ++wrong; else ++ok;
+ if (branch(14, 11, v1)) ++ok; else ++wrong;
+ if (branch(15, 11, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 7, v1)) ++wrong; else ++ok;
+ if (branch(1, 7, v1)) ++wrong; else ++ok;
+ if (branch(2, 7, v1)) ++ok; else ++wrong;
+ if (branch(3, 7, v1)) ++ok; else ++wrong;
+ if (branch(4, 7, v1)) ++wrong; else ++ok;
+ if (branch(5, 7, v1)) ++wrong; else ++ok;
+ if (branch(6, 7, v1)) ++ok; else ++wrong;
+ if (branch(7, 7, v1)) ++ok; else ++wrong;
+ if (branch(8, 7, v1)) ++wrong; else ++ok;
+ if (branch(9, 7, v1)) ++wrong; else ++ok;
+ if (branch(10, 7, v1)) ++ok; else ++wrong;
+ if (branch(11, 7, v1)) ++ok; else ++wrong;
+ if (branch(12, 7, v1)) ++wrong; else ++ok;
+ if (branch(13, 7, v1)) ++wrong; else ++ok;
+ if (branch(14, 7, v1)) ++ok; else ++wrong;
+ if (branch(15, 7, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 64)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+/* loads four bytes */
+void
+icm_four_bytes_msb_not_set(void)
+{
+ int wrong, ok;
+ unsigned v1;
+
+ printf("Test #10 load four bytes, msb not set --> cc == 2\n");
+
+ v1 = 0x7FFFFFFF;
+ wrong = ok = 0;
+
+ if (branch(0, 15, v1)) ++wrong; else ++ok;
+ if (branch(1, 15, v1)) ++wrong; else ++ok;
+ if (branch(2, 15, v1)) ++ok; else ++wrong;
+ if (branch(3, 15, v1)) ++ok; else ++wrong;
+ if (branch(4, 15, v1)) ++wrong; else ++ok;
+ if (branch(5, 15, v1)) ++wrong; else ++ok;
+ if (branch(6, 15, v1)) ++ok; else ++wrong;
+ if (branch(7, 15, v1)) ++ok; else ++wrong;
+ if (branch(8, 15, v1)) ++wrong; else ++ok;
+ if (branch(9, 15, v1)) ++wrong; else ++ok;
+ if (branch(10, 15, v1)) ++ok; else ++wrong;
+ if (branch(11, 15, v1)) ++ok; else ++wrong;
+ if (branch(12, 15, v1)) ++wrong; else ++ok;
+ if (branch(13, 15, v1)) ++wrong; else ++ok;
+ if (branch(14, 15, v1)) ++ok; else ++wrong;
+ if (branch(15, 15, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+int main()
+{
+ icm_mask_0();
+ icm_value_0();
+
+ icm_one_byte_msb_set();
+ icm_two_bytes_msb_set();
+ icm_three_bytes_msb_set();
+ icm_four_bytes_msb_set();
+
+ icm_one_byte_msb_not_set();
+ icm_two_bytes_msb_not_set();
+ icm_three_bytes_msb_not_set();
+ icm_four_bytes_msb_not_set();
+
+ return 0;
+}
--- /dev/null
+Test #1 mask == 0, value == 0xFFFFFFFF --> cc == 0
+OK
+Test #2 mask == 0xF, value == 0 --> cc == 0
+OK
+Test #3 load one byte, msb set --> cc == 1
+OK
+Test #4 load two bytes, msb set --> cc == 1
+OK
+Test #5 load three bytes, msb set --> cc == 1
+OK
+Test #6 load four bytes, msb set --> cc == 1
+OK
+Test #7 load one byte, msb not set --> cc == 2
+OK
+Test #8 load two bytes, msb not set --> cc == 2
+OK
+Test #9 load three bytes, msb not set --> cc == 2
+OK
+Test #10 load four bytes, msb not set --> cc == 2
+OK
--- /dev/null
+prog: spechelper-icm-1
--- /dev/null
+#include <stdio.h>
+
+#define branch(mask,icmm,_v1) \
+ ({ \
+ unsigned char taken; \
+ unsigned b1 = _v1; \
+ asm volatile( " larl 1, 2f\n\t" \
+ " l 0, 0(1)\n\t" \
+ " icm 0," #icmm",%[b1]\n\t" \
+ " brc " #mask " ,1f\n\t" \
+ " mvi %[taken],0\n\t" \
+ " j 0f\n\t" \
+ "1: mvi %[taken],1\n\t" \
+ " j 0f\n\t" \
+ "2: .long 0xffffffff\n\t" \
+ "0: bcr 0,0 /* nop */\n\t" \
+ : [taken] "=Q" (taken) \
+ : [b1] "Q"(b1) \
+ : "cc", "0","1"); \
+ taken; \
+ })
+
+void
+icm_mask_0(void)
+{
+ int wrong, ok;
+ unsigned v1;
+
+ printf("Test #1 mask == 0, value == 0xFFFFFFFF --> cc == 0\n");
+
+ v1 = 0xFFFFFFFF;
+ wrong = ok = 0;
+
+ if (branch(0, 0, v1)) ++wrong; else ++ok;
+ if (branch(1, 0, v1)) ++wrong; else ++ok;
+ if (branch(2, 0, v1)) ++wrong; else ++ok;
+ if (branch(3, 0, v1)) ++wrong; else ++ok;
+ if (branch(4, 0, v1)) ++wrong; else ++ok;
+ if (branch(5, 0, v1)) ++wrong; else ++ok;
+ if (branch(6, 0, v1)) ++wrong; else ++ok;
+ if (branch(7, 0, v1)) ++wrong; else ++ok;
+ if (branch(8, 0, v1)) ++ok; else ++wrong;
+ if (branch(9, 0, v1)) ++ok; else ++wrong;
+ if (branch(10, 0, v1)) ++ok; else ++wrong;
+ if (branch(11, 0, v1)) ++ok; else ++wrong;
+ if (branch(12, 0, v1)) ++ok; else ++wrong;
+ if (branch(13, 0, v1)) ++ok; else ++wrong;
+ if (branch(14, 0, v1)) ++ok; else ++wrong;
+ if (branch(15, 0, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+void
+icm_value_0(void)
+{
+ int wrong, ok;
+ unsigned v1;
+
+ printf("Test #2 mask == 0xF, value == 0 --> cc == 0\n");
+
+ v1 = 0;
+ wrong = ok = 0;
+
+ if (branch(0, 15, v1)) ++wrong; else ++ok;
+ if (branch(1, 15, v1)) ++wrong; else ++ok;
+ if (branch(2, 15, v1)) ++wrong; else ++ok;
+ if (branch(3, 15, v1)) ++wrong; else ++ok;
+ if (branch(4, 15, v1)) ++wrong; else ++ok;
+ if (branch(5, 15, v1)) ++wrong; else ++ok;
+ if (branch(6, 15, v1)) ++wrong; else ++ok;
+ if (branch(7, 15, v1)) ++wrong; else ++ok;
+ if (branch(8, 15, v1)) ++ok; else ++wrong;
+ if (branch(9, 15, v1)) ++ok; else ++wrong;
+ if (branch(10, 15, v1)) ++ok; else ++wrong;
+ if (branch(11, 15, v1)) ++ok; else ++wrong;
+ if (branch(12, 15, v1)) ++ok; else ++wrong;
+ if (branch(13, 15, v1)) ++ok; else ++wrong;
+ if (branch(14, 15, v1)) ++ok; else ++wrong;
+ if (branch(15, 15, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+/* loads one byte */
+void
+icm_one_byte_msb_set(void)
+{
+ int wrong, ok;
+ unsigned v1;
+
+ printf("Test #3 load one byte, msb set --> cc == 1\n");
+
+ v1 = 0x80000000;
+ wrong = ok = 0;
+
+ if (branch(0, 8, v1)) ++wrong; else ++ok;
+ if (branch(1, 8, v1)) ++wrong; else ++ok;
+ if (branch(2, 8, v1)) ++wrong; else ++ok;
+ if (branch(3, 8, v1)) ++wrong; else ++ok;
+ if (branch(4, 8, v1)) ++ok; else ++wrong;
+ if (branch(5, 8, v1)) ++ok; else ++wrong;
+ if (branch(6, 8, v1)) ++ok; else ++wrong;
+ if (branch(7, 8, v1)) ++ok; else ++wrong;
+ if (branch(8, 8, v1)) ++wrong; else ++ok;
+ if (branch(9, 8, v1)) ++wrong; else ++ok;
+ if (branch(10, 8, v1)) ++wrong; else ++ok;
+ if (branch(11, 8, v1)) ++wrong; else ++ok;
+ if (branch(12, 8, v1)) ++ok; else ++wrong;
+ if (branch(13, 8, v1)) ++ok; else ++wrong;
+ if (branch(14, 8, v1)) ++ok; else ++wrong;
+ if (branch(15, 8, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 4, v1)) ++wrong; else ++ok;
+ if (branch(1, 4, v1)) ++wrong; else ++ok;
+ if (branch(2, 4, v1)) ++wrong; else ++ok;
+ if (branch(3, 4, v1)) ++wrong; else ++ok;
+ if (branch(4, 4, v1)) ++ok; else ++wrong;
+ if (branch(5, 4, v1)) ++ok; else ++wrong;
+ if (branch(6, 4, v1)) ++ok; else ++wrong;
+ if (branch(7, 4, v1)) ++ok; else ++wrong;
+ if (branch(8, 4, v1)) ++wrong; else ++ok;
+ if (branch(9, 4, v1)) ++wrong; else ++ok;
+ if (branch(10, 4, v1)) ++wrong; else ++ok;
+ if (branch(11, 4, v1)) ++wrong; else ++ok;
+ if (branch(12, 4, v1)) ++ok; else ++wrong;
+ if (branch(13, 4, v1)) ++ok; else ++wrong;
+ if (branch(14, 4, v1)) ++ok; else ++wrong;
+ if (branch(15, 4, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 2, v1)) ++wrong; else ++ok;
+ if (branch(1, 2, v1)) ++wrong; else ++ok;
+ if (branch(2, 2, v1)) ++wrong; else ++ok;
+ if (branch(3, 2, v1)) ++wrong; else ++ok;
+ if (branch(4, 2, v1)) ++ok; else ++wrong;
+ if (branch(5, 2, v1)) ++ok; else ++wrong;
+ if (branch(6, 2, v1)) ++ok; else ++wrong;
+ if (branch(7, 2, v1)) ++ok; else ++wrong;
+ if (branch(8, 2, v1)) ++wrong; else ++ok;
+ if (branch(9, 2, v1)) ++wrong; else ++ok;
+ if (branch(10, 2, v1)) ++wrong; else ++ok;
+ if (branch(11, 2, v1)) ++wrong; else ++ok;
+ if (branch(12, 2, v1)) ++ok; else ++wrong;
+ if (branch(13, 2, v1)) ++ok; else ++wrong;
+ if (branch(14, 2, v1)) ++ok; else ++wrong;
+ if (branch(15, 2, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 1, v1)) ++wrong; else ++ok;
+ if (branch(1, 1, v1)) ++wrong; else ++ok;
+ if (branch(2, 1, v1)) ++wrong; else ++ok;
+ if (branch(3, 1, v1)) ++wrong; else ++ok;
+ if (branch(4, 1, v1)) ++ok; else ++wrong;
+ if (branch(5, 1, v1)) ++ok; else ++wrong;
+ if (branch(6, 1, v1)) ++ok; else ++wrong;
+ if (branch(7, 1, v1)) ++ok; else ++wrong;
+ if (branch(8, 1, v1)) ++wrong; else ++ok;
+ if (branch(9, 1, v1)) ++wrong; else ++ok;
+ if (branch(10, 1, v1)) ++wrong; else ++ok;
+ if (branch(11, 1, v1)) ++wrong; else ++ok;
+ if (branch(12, 1, v1)) ++ok; else ++wrong;
+ if (branch(13, 1, v1)) ++ok; else ++wrong;
+ if (branch(14, 1, v1)) ++ok; else ++wrong;
+ if (branch(15, 1, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 64)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+/* loads two bytes */
+void
+icm_two_bytes_msb_set(void)
+{
+ int wrong, ok;
+ unsigned v1;
+
+ printf("Test #4 load two bytes, msb set --> cc == 1\n");
+
+ v1 = 0x80000000;
+ wrong = ok = 0;
+
+ if (branch(0, 12, v1)) ++wrong; else ++ok;
+ if (branch(1, 12, v1)) ++wrong; else ++ok;
+ if (branch(2, 12, v1)) ++wrong; else ++ok;
+ if (branch(3, 12, v1)) ++wrong; else ++ok;
+ if (branch(4, 12, v1)) ++ok; else ++wrong;
+ if (branch(5, 12, v1)) ++ok; else ++wrong;
+ if (branch(6, 12, v1)) ++ok; else ++wrong;
+ if (branch(7, 12, v1)) ++ok; else ++wrong;
+ if (branch(8, 12, v1)) ++wrong; else ++ok;
+ if (branch(9, 12, v1)) ++wrong; else ++ok;
+ if (branch(10, 12, v1)) ++wrong; else ++ok;
+ if (branch(11, 12, v1)) ++wrong; else ++ok;
+ if (branch(12, 12, v1)) ++ok; else ++wrong;
+ if (branch(13, 12, v1)) ++ok; else ++wrong;
+ if (branch(14, 12, v1)) ++ok; else ++wrong;
+ if (branch(15, 12, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 10, v1)) ++wrong; else ++ok;
+ if (branch(1, 10, v1)) ++wrong; else ++ok;
+ if (branch(2, 10, v1)) ++wrong; else ++ok;
+ if (branch(3, 10, v1)) ++wrong; else ++ok;
+ if (branch(4, 10, v1)) ++ok; else ++wrong;
+ if (branch(5, 10, v1)) ++ok; else ++wrong;
+ if (branch(6, 10, v1)) ++ok; else ++wrong;
+ if (branch(7, 10, v1)) ++ok; else ++wrong;
+ if (branch(8, 10, v1)) ++wrong; else ++ok;
+ if (branch(9, 10, v1)) ++wrong; else ++ok;
+ if (branch(10, 10, v1)) ++wrong; else ++ok;
+ if (branch(11, 10, v1)) ++wrong; else ++ok;
+ if (branch(12, 10, v1)) ++ok; else ++wrong;
+ if (branch(13, 10, v1)) ++ok; else ++wrong;
+ if (branch(14, 10, v1)) ++ok; else ++wrong;
+ if (branch(15, 10, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 9, v1)) ++wrong; else ++ok;
+ if (branch(1, 9, v1)) ++wrong; else ++ok;
+ if (branch(2, 9, v1)) ++wrong; else ++ok;
+ if (branch(3, 9, v1)) ++wrong; else ++ok;
+ if (branch(4, 9, v1)) ++ok; else ++wrong;
+ if (branch(5, 9, v1)) ++ok; else ++wrong;
+ if (branch(6, 9, v1)) ++ok; else ++wrong;
+ if (branch(7, 9, v1)) ++ok; else ++wrong;
+ if (branch(8, 9, v1)) ++wrong; else ++ok;
+ if (branch(9, 9, v1)) ++wrong; else ++ok;
+ if (branch(10, 9, v1)) ++wrong; else ++ok;
+ if (branch(11, 9, v1)) ++wrong; else ++ok;
+ if (branch(12, 9, v1)) ++ok; else ++wrong;
+ if (branch(13, 9, v1)) ++ok; else ++wrong;
+ if (branch(14, 9, v1)) ++ok; else ++wrong;
+ if (branch(15, 9, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 6, v1)) ++wrong; else ++ok;
+ if (branch(1, 6, v1)) ++wrong; else ++ok;
+ if (branch(2, 6, v1)) ++wrong; else ++ok;
+ if (branch(3, 6, v1)) ++wrong; else ++ok;
+ if (branch(4, 6, v1)) ++ok; else ++wrong;
+ if (branch(5, 6, v1)) ++ok; else ++wrong;
+ if (branch(6, 6, v1)) ++ok; else ++wrong;
+ if (branch(7, 6, v1)) ++ok; else ++wrong;
+ if (branch(8, 6, v1)) ++wrong; else ++ok;
+ if (branch(9, 6, v1)) ++wrong; else ++ok;
+ if (branch(10, 6, v1)) ++wrong; else ++ok;
+ if (branch(11, 6, v1)) ++wrong; else ++ok;
+ if (branch(12, 6, v1)) ++ok; else ++wrong;
+ if (branch(13, 6, v1)) ++ok; else ++wrong;
+ if (branch(14, 6, v1)) ++ok; else ++wrong;
+ if (branch(15, 6, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 5, v1)) ++wrong; else ++ok;
+ if (branch(1, 5, v1)) ++wrong; else ++ok;
+ if (branch(2, 5, v1)) ++wrong; else ++ok;
+ if (branch(3, 5, v1)) ++wrong; else ++ok;
+ if (branch(4, 5, v1)) ++ok; else ++wrong;
+ if (branch(5, 5, v1)) ++ok; else ++wrong;
+ if (branch(6, 5, v1)) ++ok; else ++wrong;
+ if (branch(7, 5, v1)) ++ok; else ++wrong;
+ if (branch(8, 5, v1)) ++wrong; else ++ok;
+ if (branch(9, 5, v1)) ++wrong; else ++ok;
+ if (branch(10, 5, v1)) ++wrong; else ++ok;
+ if (branch(11, 5, v1)) ++wrong; else ++ok;
+ if (branch(12, 5, v1)) ++ok; else ++wrong;
+ if (branch(13, 5, v1)) ++ok; else ++wrong;
+ if (branch(14, 5, v1)) ++ok; else ++wrong;
+ if (branch(15, 5, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 3, v1)) ++wrong; else ++ok;
+ if (branch(1, 3, v1)) ++wrong; else ++ok;
+ if (branch(2, 3, v1)) ++wrong; else ++ok;
+ if (branch(3, 3, v1)) ++wrong; else ++ok;
+ if (branch(4, 3, v1)) ++ok; else ++wrong;
+ if (branch(5, 3, v1)) ++ok; else ++wrong;
+ if (branch(6, 3, v1)) ++ok; else ++wrong;
+ if (branch(7, 3, v1)) ++ok; else ++wrong;
+ if (branch(8, 3, v1)) ++wrong; else ++ok;
+ if (branch(9, 3, v1)) ++wrong; else ++ok;
+ if (branch(10, 3, v1)) ++wrong; else ++ok;
+ if (branch(11, 3, v1)) ++wrong; else ++ok;
+ if (branch(12, 3, v1)) ++ok; else ++wrong;
+ if (branch(13, 3, v1)) ++ok; else ++wrong;
+ if (branch(14, 3, v1)) ++ok; else ++wrong;
+ if (branch(15, 3, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 96)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+/* loads three bytes */
+void
+icm_three_bytes_msb_set(void)
+{
+ int wrong, ok;
+ unsigned v1;
+
+ printf("Test #5 load three bytes, msb set --> cc == 1\n");
+
+ v1 = 0x80000000;
+ wrong = ok = 0;
+
+ if (branch(0, 14, v1)) ++wrong; else ++ok;
+ if (branch(1, 14, v1)) ++wrong; else ++ok;
+ if (branch(2, 14, v1)) ++wrong; else ++ok;
+ if (branch(3, 14, v1)) ++wrong; else ++ok;
+ if (branch(4, 14, v1)) ++ok; else ++wrong;
+ if (branch(5, 14, v1)) ++ok; else ++wrong;
+ if (branch(6, 14, v1)) ++ok; else ++wrong;
+ if (branch(7, 14, v1)) ++ok; else ++wrong;
+ if (branch(8, 14, v1)) ++wrong; else ++ok;
+ if (branch(9, 14, v1)) ++wrong; else ++ok;
+ if (branch(10, 14, v1)) ++wrong; else ++ok;
+ if (branch(11, 14, v1)) ++wrong; else ++ok;
+ if (branch(12, 14, v1)) ++ok; else ++wrong;
+ if (branch(13, 14, v1)) ++ok; else ++wrong;
+ if (branch(14, 14, v1)) ++ok; else ++wrong;
+ if (branch(15, 14, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 13, v1)) ++wrong; else ++ok;
+ if (branch(1, 13, v1)) ++wrong; else ++ok;
+ if (branch(2, 13, v1)) ++wrong; else ++ok;
+ if (branch(3, 13, v1)) ++wrong; else ++ok;
+ if (branch(4, 13, v1)) ++ok; else ++wrong;
+ if (branch(5, 13, v1)) ++ok; else ++wrong;
+ if (branch(6, 13, v1)) ++ok; else ++wrong;
+ if (branch(7, 13, v1)) ++ok; else ++wrong;
+ if (branch(8, 13, v1)) ++wrong; else ++ok;
+ if (branch(9, 13, v1)) ++wrong; else ++ok;
+ if (branch(10, 13, v1)) ++wrong; else ++ok;
+ if (branch(11, 13, v1)) ++wrong; else ++ok;
+ if (branch(12, 13, v1)) ++ok; else ++wrong;
+ if (branch(13, 13, v1)) ++ok; else ++wrong;
+ if (branch(14, 13, v1)) ++ok; else ++wrong;
+ if (branch(15, 13, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 11, v1)) ++wrong; else ++ok;
+ if (branch(1, 11, v1)) ++wrong; else ++ok;
+ if (branch(2, 11, v1)) ++wrong; else ++ok;
+ if (branch(3, 11, v1)) ++wrong; else ++ok;
+ if (branch(4, 11, v1)) ++ok; else ++wrong;
+ if (branch(5, 11, v1)) ++ok; else ++wrong;
+ if (branch(6, 11, v1)) ++ok; else ++wrong;
+ if (branch(7, 11, v1)) ++ok; else ++wrong;
+ if (branch(8, 11, v1)) ++wrong; else ++ok;
+ if (branch(9, 11, v1)) ++wrong; else ++ok;
+ if (branch(10, 11, v1)) ++wrong; else ++ok;
+ if (branch(11, 11, v1)) ++wrong; else ++ok;
+ if (branch(12, 11, v1)) ++ok; else ++wrong;
+ if (branch(13, 11, v1)) ++ok; else ++wrong;
+ if (branch(14, 11, v1)) ++ok; else ++wrong;
+ if (branch(15, 11, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 7, v1)) ++wrong; else ++ok;
+ if (branch(1, 7, v1)) ++wrong; else ++ok;
+ if (branch(2, 7, v1)) ++wrong; else ++ok;
+ if (branch(3, 7, v1)) ++wrong; else ++ok;
+ if (branch(4, 7, v1)) ++ok; else ++wrong;
+ if (branch(5, 7, v1)) ++ok; else ++wrong;
+ if (branch(6, 7, v1)) ++ok; else ++wrong;
+ if (branch(7, 7, v1)) ++ok; else ++wrong;
+ if (branch(8, 7, v1)) ++wrong; else ++ok;
+ if (branch(9, 7, v1)) ++wrong; else ++ok;
+ if (branch(10, 7, v1)) ++wrong; else ++ok;
+ if (branch(11, 7, v1)) ++wrong; else ++ok;
+ if (branch(12, 7, v1)) ++ok; else ++wrong;
+ if (branch(13, 7, v1)) ++ok; else ++wrong;
+ if (branch(14, 7, v1)) ++ok; else ++wrong;
+ if (branch(15, 7, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 64)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+/* loads four bytes */
+void
+icm_four_bytes_msb_set(void)
+{
+ int wrong, ok;
+ unsigned v1;
+
+ printf("Test #6 load four bytes, msb set --> cc == 1\n");
+
+ v1 = 0x80000000;
+ wrong = ok = 0;
+
+ if (branch(0, 15, v1)) ++wrong; else ++ok;
+ if (branch(1, 15, v1)) ++wrong; else ++ok;
+ if (branch(2, 15, v1)) ++wrong; else ++ok;
+ if (branch(3, 15, v1)) ++wrong; else ++ok;
+ if (branch(4, 15, v1)) ++ok; else ++wrong;
+ if (branch(5, 15, v1)) ++ok; else ++wrong;
+ if (branch(6, 15, v1)) ++ok; else ++wrong;
+ if (branch(7, 15, v1)) ++ok; else ++wrong;
+ if (branch(8, 15, v1)) ++wrong; else ++ok;
+ if (branch(9, 15, v1)) ++wrong; else ++ok;
+ if (branch(10, 15, v1)) ++wrong; else ++ok;
+ if (branch(11, 15, v1)) ++wrong; else ++ok;
+ if (branch(12, 15, v1)) ++ok; else ++wrong;
+ if (branch(13, 15, v1)) ++ok; else ++wrong;
+ if (branch(14, 15, v1)) ++ok; else ++wrong;
+ if (branch(15, 15, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+/* loads one byte */
+void
+icm_one_byte_msb_not_set(void)
+{
+ int wrong, ok, v1;
+
+ printf("Test #7 load one byte, msb not set --> cc == 2\n");
+
+ v1 = 0x7FFFFFFF;
+ wrong = ok = 0;
+
+ if (branch(0, 8, v1)) ++wrong; else ++ok;
+ if (branch(1, 8, v1)) ++wrong; else ++ok;
+ if (branch(2, 8, v1)) ++ok; else ++wrong;
+ if (branch(3, 8, v1)) ++ok; else ++wrong;
+ if (branch(4, 8, v1)) ++wrong; else ++ok;
+ if (branch(5, 8, v1)) ++wrong; else ++ok;
+ if (branch(6, 8, v1)) ++ok; else ++wrong;
+ if (branch(7, 8, v1)) ++ok; else ++wrong;
+ if (branch(8, 8, v1)) ++wrong; else ++ok;
+ if (branch(9, 8, v1)) ++wrong; else ++ok;
+ if (branch(10, 8, v1)) ++ok; else ++wrong;
+ if (branch(11, 8, v1)) ++ok; else ++wrong;
+ if (branch(12, 8, v1)) ++wrong; else ++ok;
+ if (branch(13, 8, v1)) ++wrong; else ++ok;
+ if (branch(14, 8, v1)) ++ok; else ++wrong;
+ if (branch(15, 8, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 4, v1)) ++wrong; else ++ok;
+ if (branch(1, 4, v1)) ++wrong; else ++ok;
+ if (branch(2, 4, v1)) ++ok; else ++wrong;
+ if (branch(3, 4, v1)) ++ok; else ++wrong;
+ if (branch(4, 4, v1)) ++wrong; else ++ok;
+ if (branch(5, 4, v1)) ++wrong; else ++ok;
+ if (branch(6, 4, v1)) ++ok; else ++wrong;
+ if (branch(7, 4, v1)) ++ok; else ++wrong;
+ if (branch(8, 4, v1)) ++wrong; else ++ok;
+ if (branch(9, 4, v1)) ++wrong; else ++ok;
+ if (branch(10, 4, v1)) ++ok; else ++wrong;
+ if (branch(11, 4, v1)) ++ok; else ++wrong;
+ if (branch(12, 4, v1)) ++wrong; else ++ok;
+ if (branch(13, 4, v1)) ++wrong; else ++ok;
+ if (branch(14, 4, v1)) ++ok; else ++wrong;
+ if (branch(15, 4, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 2, v1)) ++wrong; else ++ok;
+ if (branch(1, 2, v1)) ++wrong; else ++ok;
+ if (branch(2, 2, v1)) ++ok; else ++wrong;
+ if (branch(3, 2, v1)) ++ok; else ++wrong;
+ if (branch(4, 2, v1)) ++wrong; else ++ok;
+ if (branch(5, 2, v1)) ++wrong; else ++ok;
+ if (branch(6, 2, v1)) ++ok; else ++wrong;
+ if (branch(7, 2, v1)) ++ok; else ++wrong;
+ if (branch(8, 2, v1)) ++wrong; else ++ok;
+ if (branch(9, 2, v1)) ++wrong; else ++ok;
+ if (branch(10, 2, v1)) ++ok; else ++wrong;
+ if (branch(11, 2, v1)) ++ok; else ++wrong;
+ if (branch(12, 2, v1)) ++wrong; else ++ok;
+ if (branch(13, 2, v1)) ++wrong; else ++ok;
+ if (branch(14, 2, v1)) ++ok; else ++wrong;
+ if (branch(15, 2, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 1, v1)) ++wrong; else ++ok;
+ if (branch(1, 1, v1)) ++wrong; else ++ok;
+ if (branch(2, 1, v1)) ++ok; else ++wrong;
+ if (branch(3, 1, v1)) ++ok; else ++wrong;
+ if (branch(4, 1, v1)) ++wrong; else ++ok;
+ if (branch(5, 1, v1)) ++wrong; else ++ok;
+ if (branch(6, 1, v1)) ++ok; else ++wrong;
+ if (branch(7, 1, v1)) ++ok; else ++wrong;
+ if (branch(8, 1, v1)) ++wrong; else ++ok;
+ if (branch(9, 1, v1)) ++wrong; else ++ok;
+ if (branch(10, 1, v1)) ++ok; else ++wrong;
+ if (branch(11, 1, v1)) ++ok; else ++wrong;
+ if (branch(12, 1, v1)) ++wrong; else ++ok;
+ if (branch(13, 1, v1)) ++wrong; else ++ok;
+ if (branch(14, 1, v1)) ++ok; else ++wrong;
+ if (branch(15, 1, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 64)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+/* loads two bytes */
+void
+icm_two_bytes_msb_not_set(void)
+{
+ int wrong, ok;
+ unsigned v1;
+
+ printf("Test #8 load two bytes, msb not set --> cc == 2\n");
+
+ v1 = 0x7FFFFFFF;
+ wrong = ok = 0;
+
+ if (branch(0, 12, v1)) ++wrong; else ++ok;
+ if (branch(1, 12, v1)) ++wrong; else ++ok;
+ if (branch(2, 12, v1)) ++ok; else ++wrong;
+ if (branch(3, 12, v1)) ++ok; else ++wrong;
+ if (branch(4, 12, v1)) ++wrong; else ++ok;
+ if (branch(5, 12, v1)) ++wrong; else ++ok;
+ if (branch(6, 12, v1)) ++ok; else ++wrong;
+ if (branch(7, 12, v1)) ++ok; else ++wrong;
+ if (branch(8, 12, v1)) ++wrong; else ++ok;
+ if (branch(9, 12, v1)) ++wrong; else ++ok;
+ if (branch(10, 12, v1)) ++ok; else ++wrong;
+ if (branch(11, 12, v1)) ++ok; else ++wrong;
+ if (branch(12, 12, v1)) ++wrong; else ++ok;
+ if (branch(13, 12, v1)) ++wrong; else ++ok;
+ if (branch(14, 12, v1)) ++ok; else ++wrong;
+ if (branch(15, 12, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 10, v1)) ++wrong; else ++ok;
+ if (branch(1, 10, v1)) ++wrong; else ++ok;
+ if (branch(2, 10, v1)) ++ok; else ++wrong;
+ if (branch(3, 10, v1)) ++ok; else ++wrong;
+ if (branch(4, 10, v1)) ++wrong; else ++ok;
+ if (branch(5, 10, v1)) ++wrong; else ++ok;
+ if (branch(6, 10, v1)) ++ok; else ++wrong;
+ if (branch(7, 10, v1)) ++ok; else ++wrong;
+ if (branch(8, 10, v1)) ++wrong; else ++ok;
+ if (branch(9, 10, v1)) ++wrong; else ++ok;
+ if (branch(10, 10, v1)) ++ok; else ++wrong;
+ if (branch(11, 10, v1)) ++ok; else ++wrong;
+ if (branch(12, 10, v1)) ++wrong; else ++ok;
+ if (branch(13, 10, v1)) ++wrong; else ++ok;
+ if (branch(14, 10, v1)) ++ok; else ++wrong;
+ if (branch(15, 10, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 9, v1)) ++wrong; else ++ok;
+ if (branch(1, 9, v1)) ++wrong; else ++ok;
+ if (branch(2, 9, v1)) ++ok; else ++wrong;
+ if (branch(3, 9, v1)) ++ok; else ++wrong;
+ if (branch(4, 9, v1)) ++wrong; else ++ok;
+ if (branch(5, 9, v1)) ++wrong; else ++ok;
+ if (branch(6, 9, v1)) ++ok; else ++wrong;
+ if (branch(7, 9, v1)) ++ok; else ++wrong;
+ if (branch(8, 9, v1)) ++wrong; else ++ok;
+ if (branch(9, 9, v1)) ++wrong; else ++ok;
+ if (branch(10, 9, v1)) ++ok; else ++wrong;
+ if (branch(11, 9, v1)) ++ok; else ++wrong;
+ if (branch(12, 9, v1)) ++wrong; else ++ok;
+ if (branch(13, 9, v1)) ++wrong; else ++ok;
+ if (branch(14, 9, v1)) ++ok; else ++wrong;
+ if (branch(15, 9, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 6, v1)) ++wrong; else ++ok;
+ if (branch(1, 6, v1)) ++wrong; else ++ok;
+ if (branch(2, 6, v1)) ++ok; else ++wrong;
+ if (branch(3, 6, v1)) ++ok; else ++wrong;
+ if (branch(4, 6, v1)) ++wrong; else ++ok;
+ if (branch(5, 6, v1)) ++wrong; else ++ok;
+ if (branch(6, 6, v1)) ++ok; else ++wrong;
+ if (branch(7, 6, v1)) ++ok; else ++wrong;
+ if (branch(8, 6, v1)) ++wrong; else ++ok;
+ if (branch(9, 6, v1)) ++wrong; else ++ok;
+ if (branch(10, 6, v1)) ++ok; else ++wrong;
+ if (branch(11, 6, v1)) ++ok; else ++wrong;
+ if (branch(12, 6, v1)) ++wrong; else ++ok;
+ if (branch(13, 6, v1)) ++wrong; else ++ok;
+ if (branch(14, 6, v1)) ++ok; else ++wrong;
+ if (branch(15, 6, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 5, v1)) ++wrong; else ++ok;
+ if (branch(1, 5, v1)) ++wrong; else ++ok;
+ if (branch(2, 5, v1)) ++ok; else ++wrong;
+ if (branch(3, 5, v1)) ++ok; else ++wrong;
+ if (branch(4, 5, v1)) ++wrong; else ++ok;
+ if (branch(5, 5, v1)) ++wrong; else ++ok;
+ if (branch(6, 5, v1)) ++ok; else ++wrong;
+ if (branch(7, 5, v1)) ++ok; else ++wrong;
+ if (branch(8, 5, v1)) ++wrong; else ++ok;
+ if (branch(9, 5, v1)) ++wrong; else ++ok;
+ if (branch(10, 5, v1)) ++ok; else ++wrong;
+ if (branch(11, 5, v1)) ++ok; else ++wrong;
+ if (branch(12, 5, v1)) ++wrong; else ++ok;
+ if (branch(13, 5, v1)) ++wrong; else ++ok;
+ if (branch(14, 5, v1)) ++ok; else ++wrong;
+ if (branch(15, 5, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 3, v1)) ++wrong; else ++ok;
+ if (branch(1, 3, v1)) ++wrong; else ++ok;
+ if (branch(2, 3, v1)) ++ok; else ++wrong;
+ if (branch(3, 3, v1)) ++ok; else ++wrong;
+ if (branch(4, 3, v1)) ++wrong; else ++ok;
+ if (branch(5, 3, v1)) ++wrong; else ++ok;
+ if (branch(6, 3, v1)) ++ok; else ++wrong;
+ if (branch(7, 3, v1)) ++ok; else ++wrong;
+ if (branch(8, 3, v1)) ++wrong; else ++ok;
+ if (branch(9, 3, v1)) ++wrong; else ++ok;
+ if (branch(10, 3, v1)) ++ok; else ++wrong;
+ if (branch(11, 3, v1)) ++ok; else ++wrong;
+ if (branch(12, 3, v1)) ++wrong; else ++ok;
+ if (branch(13, 3, v1)) ++wrong; else ++ok;
+ if (branch(14, 3, v1)) ++ok; else ++wrong;
+ if (branch(15, 3, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 96)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+
+/* loads three bytes */
+void
+icm_three_bytes_msb_not_set(void)
+{
+ int wrong, ok;
+ unsigned v1;
+
+ printf("Test #9 load three bytes, msb not set --> cc == 2\n");
+
+ v1 = 0x7FFFFFFF;
+ wrong = ok = 0;
+
+ if (branch(0, 14, v1)) ++wrong; else ++ok;
+ if (branch(1, 14, v1)) ++wrong; else ++ok;
+ if (branch(2, 14, v1)) ++ok; else ++wrong;
+ if (branch(3, 14, v1)) ++ok; else ++wrong;
+ if (branch(4, 14, v1)) ++wrong; else ++ok;
+ if (branch(5, 14, v1)) ++wrong; else ++ok;
+ if (branch(6, 14, v1)) ++ok; else ++wrong;
+ if (branch(7, 14, v1)) ++ok; else ++wrong;
+ if (branch(8, 14, v1)) ++wrong; else ++ok;
+ if (branch(9, 14, v1)) ++wrong; else ++ok;
+ if (branch(10, 14, v1)) ++ok; else ++wrong;
+ if (branch(11, 14, v1)) ++ok; else ++wrong;
+ if (branch(12, 14, v1)) ++wrong; else ++ok;
+ if (branch(13, 14, v1)) ++wrong; else ++ok;
+ if (branch(14, 14, v1)) ++ok; else ++wrong;
+ if (branch(15, 14, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 13, v1)) ++wrong; else ++ok;
+ if (branch(1, 13, v1)) ++wrong; else ++ok;
+ if (branch(2, 13, v1)) ++ok; else ++wrong;
+ if (branch(3, 13, v1)) ++ok; else ++wrong;
+ if (branch(4, 13, v1)) ++wrong; else ++ok;
+ if (branch(5, 13, v1)) ++wrong; else ++ok;
+ if (branch(6, 13, v1)) ++ok; else ++wrong;
+ if (branch(7, 13, v1)) ++ok; else ++wrong;
+ if (branch(8, 13, v1)) ++wrong; else ++ok;
+ if (branch(9, 13, v1)) ++wrong; else ++ok;
+ if (branch(10, 13, v1)) ++ok; else ++wrong;
+ if (branch(11, 13, v1)) ++ok; else ++wrong;
+ if (branch(12, 13, v1)) ++wrong; else ++ok;
+ if (branch(13, 13, v1)) ++wrong; else ++ok;
+ if (branch(14, 13, v1)) ++ok; else ++wrong;
+ if (branch(15, 13, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 11, v1)) ++wrong; else ++ok;
+ if (branch(1, 11, v1)) ++wrong; else ++ok;
+ if (branch(2, 11, v1)) ++ok; else ++wrong;
+ if (branch(3, 11, v1)) ++ok; else ++wrong;
+ if (branch(4, 11, v1)) ++wrong; else ++ok;
+ if (branch(5, 11, v1)) ++wrong; else ++ok;
+ if (branch(6, 11, v1)) ++ok; else ++wrong;
+ if (branch(7, 11, v1)) ++ok; else ++wrong;
+ if (branch(8, 11, v1)) ++wrong; else ++ok;
+ if (branch(9, 11, v1)) ++wrong; else ++ok;
+ if (branch(10, 11, v1)) ++ok; else ++wrong;
+ if (branch(11, 11, v1)) ++ok; else ++wrong;
+ if (branch(12, 11, v1)) ++wrong; else ++ok;
+ if (branch(13, 11, v1)) ++wrong; else ++ok;
+ if (branch(14, 11, v1)) ++ok; else ++wrong;
+ if (branch(15, 11, v1)) ++ok; else ++wrong;
+
+ if (branch(0, 7, v1)) ++wrong; else ++ok;
+ if (branch(1, 7, v1)) ++wrong; else ++ok;
+ if (branch(2, 7, v1)) ++ok; else ++wrong;
+ if (branch(3, 7, v1)) ++ok; else ++wrong;
+ if (branch(4, 7, v1)) ++wrong; else ++ok;
+ if (branch(5, 7, v1)) ++wrong; else ++ok;
+ if (branch(6, 7, v1)) ++ok; else ++wrong;
+ if (branch(7, 7, v1)) ++ok; else ++wrong;
+ if (branch(8, 7, v1)) ++wrong; else ++ok;
+ if (branch(9, 7, v1)) ++wrong; else ++ok;
+ if (branch(10, 7, v1)) ++ok; else ++wrong;
+ if (branch(11, 7, v1)) ++ok; else ++wrong;
+ if (branch(12, 7, v1)) ++wrong; else ++ok;
+ if (branch(13, 7, v1)) ++wrong; else ++ok;
+ if (branch(14, 7, v1)) ++ok; else ++wrong;
+ if (branch(15, 7, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 64)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+/* loads four bytes */
+void
+icm_four_bytes_msb_not_set(void)
+{
+ int wrong, ok;
+ unsigned v1;
+
+ printf("Test #10 load four bytes, msb not set --> cc == 2\n");
+
+ v1 = 0x7FFFFFFF;
+ wrong = ok = 0;
+
+ if (branch(0, 15, v1)) ++wrong; else ++ok;
+ if (branch(1, 15, v1)) ++wrong; else ++ok;
+ if (branch(2, 15, v1)) ++ok; else ++wrong;
+ if (branch(3, 15, v1)) ++ok; else ++wrong;
+ if (branch(4, 15, v1)) ++wrong; else ++ok;
+ if (branch(5, 15, v1)) ++wrong; else ++ok;
+ if (branch(6, 15, v1)) ++ok; else ++wrong;
+ if (branch(7, 15, v1)) ++ok; else ++wrong;
+ if (branch(8, 15, v1)) ++wrong; else ++ok;
+ if (branch(9, 15, v1)) ++wrong; else ++ok;
+ if (branch(10, 15, v1)) ++ok; else ++wrong;
+ if (branch(11, 15, v1)) ++ok; else ++wrong;
+ if (branch(12, 15, v1)) ++wrong; else ++ok;
+ if (branch(13, 15, v1)) ++wrong; else ++ok;
+ if (branch(14, 15, v1)) ++ok; else ++wrong;
+ if (branch(15, 15, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+int main()
+{
+ icm_mask_0();
+ icm_value_0();
+
+ icm_one_byte_msb_set();
+ icm_two_bytes_msb_set();
+ icm_three_bytes_msb_set();
+ icm_four_bytes_msb_set();
+
+ icm_one_byte_msb_not_set();
+ icm_two_bytes_msb_not_set();
+ icm_three_bytes_msb_not_set();
+ icm_four_bytes_msb_not_set();
+
+ return 0;
+}
--- /dev/null
+Test #1 mask == 0, value == 0xFFFFFFFF --> cc == 0
+OK
+Test #2 mask == 0xF, value == 0 --> cc == 0
+OK
+Test #3 load one byte, msb set --> cc == 1
+OK
+Test #4 load two bytes, msb set --> cc == 1
+OK
+Test #5 load three bytes, msb set --> cc == 1
+OK
+Test #6 load four bytes, msb set --> cc == 1
+OK
+Test #7 load one byte, msb not set --> cc == 2
+OK
+Test #8 load two bytes, msb not set --> cc == 2
+OK
+Test #9 load three bytes, msb not set --> cc == 2
+OK
+Test #10 load four bytes, msb not set --> cc == 2
+OK
--- /dev/null
+prog: spechelper-icm-2
--- /dev/null
+#include <stdio.h>
+
+#define branch(mask,_v1) \
+ ({ \
+ unsigned char taken; \
+ unsigned b1 = _v1; \
+ asm volatile( " ltr %[b1],%[b1]\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) \
+ : \
+ : "cc"); \
+ taken; \
+ })
+
+void
+ltr_1(void)
+{
+ int wrong, ok, v1;
+
+ printf("Test #1 value = 0\n");
+
+ v1 = 0;
+ wrong = ok = 0;
+ if (branch(0, v1)) ++wrong; else ++ok;
+ if (branch(1, v1)) ++wrong; else ++ok;
+ if (branch(2, v1)) ++wrong; else ++ok;
+ if (branch(3, v1)) ++wrong; else ++ok;
+ if (branch(4, v1)) ++wrong; else ++ok;
+ if (branch(5, v1)) ++wrong; else ++ok;
+ if (branch(6, v1)) ++wrong; else ++ok;
+ if (branch(7, v1)) ++wrong; else ++ok;
+ if (branch(8, v1)) ++ok; else ++wrong;
+ if (branch(9, v1)) ++ok; else ++wrong;
+ if (branch(10, v1)) ++ok; else ++wrong;
+ if (branch(11, v1)) ++ok; else ++wrong;
+ if (branch(12, v1)) ++ok; else ++wrong;
+ if (branch(13, v1)) ++ok; else ++wrong;
+ if (branch(14, v1)) ++ok; else ++wrong;
+ if (branch(15, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+void
+ltr_2(void)
+{
+ int wrong, ok, v1;
+
+ printf("Test #2 value > 0\n");
+ v1 = 42;
+ wrong = ok = 0;
+ if (branch(0, v1)) ++wrong; else ++ok;
+ if (branch(1, v1)) ++wrong; else ++ok;
+ if (branch(2, v1)) ++ok; else ++wrong;
+ if (branch(3, v1)) ++ok; else ++wrong;
+ if (branch(4, v1)) ++wrong; else ++ok;
+ if (branch(5, v1)) ++wrong; else ++ok;
+ if (branch(6, v1)) ++ok; else ++wrong;
+ if (branch(7, v1)) ++ok; else ++wrong;
+ if (branch(8, v1)) ++wrong; else ++ok;
+ if (branch(9, v1)) ++wrong; else ++ok;
+ if (branch(10, v1)) ++ok; else ++wrong;
+ if (branch(11, v1)) ++ok; else ++wrong;
+ if (branch(12, v1)) ++wrong; else ++ok;
+ if (branch(13, v1)) ++wrong; else ++ok;
+ if (branch(14, v1)) ++ok; else ++wrong;
+ if (branch(15, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+void
+ltr_3(void)
+{
+ int wrong, ok, v1;
+
+ printf("Test #3 value < 0\n");
+
+ v1 = -100;
+ wrong = ok = 0;
+ if (branch(0, v1)) ++wrong; else ++ok;
+ if (branch(1, v1)) ++wrong; else ++ok;
+ if (branch(2, v1)) ++wrong; else ++ok;
+ if (branch(3, v1)) ++wrong; else ++ok;
+ if (branch(4, v1)) ++ok; else ++wrong;
+ if (branch(5, v1)) ++ok; else ++wrong;
+ if (branch(6, v1)) ++ok; else ++wrong;
+ if (branch(7, v1)) ++ok; else ++wrong;
+ if (branch(8, v1)) ++wrong; else ++ok;
+ if (branch(9, v1)) ++wrong; else ++ok;
+ if (branch(10, v1)) ++wrong; else ++ok;
+ if (branch(11, v1)) ++wrong; else ++ok;
+ if (branch(12, v1)) ++ok; else ++wrong;
+ if (branch(13, v1)) ++ok; else ++wrong;
+ if (branch(14, v1)) ++ok; else ++wrong;
+ if (branch(15, v1)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+int main()
+{
+ ltr_1();
+ ltr_2();
+ ltr_3();
+ return 0;
+}
--- /dev/null
+Test #1 value = 0
+OK
+Test #2 value > 0
+OK
+Test #3 value < 0
+OK
--- /dev/null
+prog: spechelper-ltr
--- /dev/null
+#include <stdio.h>
+
+#define branch(mask,_v1,_v2) \
+ ({ \
+ unsigned char taken; \
+ unsigned b1 = _v1, b2 = _v2; \
+ asm volatile(" or %[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
+or_1(void)
+{
+ int wrong, ok, v1, v2;
+
+ printf("Test #1 result = 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
+or_2(void)
+{
+ int wrong, ok, v1, v2;
+
+ printf("Test #2 result = 0xffffffff\n");
+ v1 = 0;
+ 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)) ++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");
+}
+
+int main()
+{
+ or_1();
+ or_2();
+ return 0;
+}
--- /dev/null
+Test #1 result = 0
+OK
+Test #2 result = 0xffffffff
+OK
--- /dev/null
+prog: spechelper-or
--- /dev/null
+#include <stdio.h>
+
+#define branch(mask,_v1,_v2) \
+ ({ \
+ unsigned char taken; \
+ unsigned long b1 = _v1; \
+ unsigned long b2 = _v2; \
+ asm volatile(" slgr %[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; \
+ })
+
+
+/* cc = (op1 == op2) ? 2
+ : (op1 > op2) ? 3 : 1; */
+
+
+void
+slgr_equal(void)
+{
+ unsigned long v1, v2;
+ int wrong, ok;
+
+ printf("Test #1 op1 == op2\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)) ++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
+slgr_less(void)
+{
+ unsigned long v1, v2;
+ int wrong, ok;
+
+ printf("Test #2 op1 < op2\n");
+
+ v1 = 100;
+ v2 = 1000;
+
+ 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
+slgr_greater(void)
+{
+ unsigned long v1, v2;
+ int wrong, ok;
+
+ printf("Test #3 op1 > op2\n");
+
+ v1 = 10000;
+ v2 = 1000;
+
+ 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()
+{
+ slgr_equal();
+ slgr_less();
+ slgr_greater();
+
+ return 0;
+}
--- /dev/null
+Test #1 op1 == op2
+OK
+Test #2 op1 < op2
+OK
+Test #3 op1 > op2
+OK
--- /dev/null
+prog: spechelper-slgr
--- /dev/null
+#include <stdio.h>
+
+#define branch(mask,_v1,_v2) \
+ ({ \
+ unsigned char taken; \
+ unsigned int b1 = _v1; \
+ unsigned int b2 = _v2; \
+ asm volatile( " slr %[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; \
+ })
+
+/* cc = (op1 == op2) ? 2
+ : (op1 > op2) ? 3 : 1; */
+
+void
+slr_equal(void)
+{
+ unsigned int v1, v2;
+ int wrong, ok;
+
+ printf("Test #1 op1 == op2\n");
+
+ v1 = v2 = 0xffffffff;
+ 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
+slr_less(void)
+{
+ unsigned int v1, v2;
+ int wrong, ok;
+
+ printf("Test #2 op1 < op2\n");
+
+ v1 = 100;
+ v2 = 0xffffffff;
+
+ 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
+slr_greater(void)
+{
+ unsigned int v1, v2;
+ int wrong, ok;
+
+ printf("Test #3 op1 > op2\n");
+
+ v1 = 0xffffffff;
+ v2 = 1000;
+
+ 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()
+{
+ slr_equal();
+ slr_less();
+ slr_greater();
+
+ return 0;
+}
--- /dev/null
+Test #1 op1 == op2
+OK
+Test #2 op1 < op2
+OK
+Test #3 op1 > op2
+OK
--- /dev/null
+prog: spechelper-slr
--- /dev/null
+#include <stdio.h>
+
+#define branch(mask,i2,_v1) \
+ ({ \
+ unsigned char taken; \
+ unsigned char v1 = _v1; \
+ asm volatile( " tm %[v]," #i2 "\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) \
+ : [v] "Q"(v1) \
+ : "cc"); \
+ taken; \
+ })
+
+void
+tm_mask_0(void)
+{
+ int wrong, ok;
+ unsigned char v;
+
+ printf("Test #1 mask == 0, value == ~0 --> cc == 0\n");
+
+ v = ~0;
+ wrong = ok = 0;
+
+ if (branch(0, 0, v)) ++wrong; else ++ok;
+ if (branch(1, 0, v)) ++wrong; else ++ok;
+ if (branch(2, 0, v)) ++wrong; else ++ok;
+ if (branch(3, 0, v)) ++wrong; else ++ok;
+ if (branch(4, 0, v)) ++wrong; else ++ok;
+ if (branch(5, 0, v)) ++wrong; else ++ok;
+ if (branch(6, 0, v)) ++wrong; else ++ok;
+ if (branch(7, 0, v)) ++wrong; else ++ok;
+ if (branch(8, 0, v)) ++ok; else ++wrong;
+ if (branch(9, 0, v)) ++ok; else ++wrong;
+ if (branch(10, 0, v)) ++ok; else ++wrong;
+ if (branch(11, 0, v)) ++ok; else ++wrong;
+ if (branch(12, 0, v)) ++ok; else ++wrong;
+ if (branch(13, 0, v)) ++ok; else ++wrong;
+ if (branch(14, 0, v)) ++ok; else ++wrong;
+ if (branch(15, 0, v)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+void
+tm_value_0(void)
+{
+ int wrong, ok;
+ unsigned char v;
+
+ printf("Test #2 mask == 0xFF, value == 0 --> cc == 0\n");
+
+ v = 0;
+ wrong = ok = 0;
+
+ if (branch(0, 0xFF, v)) ++wrong; else ++ok;
+ if (branch(1, 0xFF, v)) ++wrong; else ++ok;
+ if (branch(2, 0xFF, v)) ++wrong; else ++ok;
+ if (branch(3, 0xFF, v)) ++wrong; else ++ok;
+ if (branch(4, 0xFF, v)) ++wrong; else ++ok;
+ if (branch(5, 0xFF, v)) ++wrong; else ++ok;
+ if (branch(6, 0xFF, v)) ++wrong; else ++ok;
+ if (branch(7, 0xFF, v)) ++wrong; else ++ok;
+ if (branch(8, 0xFF, v)) ++ok; else ++wrong;
+ if (branch(9, 0xFF, v)) ++ok; else ++wrong;
+ if (branch(10, 0xFF, v)) ++ok; else ++wrong;
+ if (branch(11, 0xFF, v)) ++ok; else ++wrong;
+ if (branch(12, 0xFF, v)) ++ok; else ++wrong;
+ if (branch(13, 0xFF, v)) ++ok; else ++wrong;
+ if (branch(14, 0xFF, v)) ++ok; else ++wrong;
+ if (branch(15, 0xFF, v)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+void
+tm_all_selected_bits_set_1(void)
+{
+ int wrong, ok;
+ unsigned char v;
+
+ printf("Test #3 mask == 0xFF, value == 0xFF --> cc == 3\n");
+
+ v = 0xFF;
+ wrong = ok = 0;
+
+ if (branch(0, 0xFF, v)) ++wrong; else ++ok;
+ if (branch(1, 0xFF, v)) ++ok; else ++wrong;
+ if (branch(2, 0xFF, v)) ++wrong; else ++ok;
+ if (branch(3, 0xFF, v)) ++ok; else ++wrong;
+ if (branch(4, 0xFF, v)) ++wrong; else ++ok;
+ if (branch(5, 0xFF, v)) ++ok; else ++wrong;
+ if (branch(6, 0xFF, v)) ++wrong; else ++ok;
+ if (branch(7, 0xFF, v)) ++ok; else ++wrong;
+ if (branch(8, 0xFF, v)) ++wrong; else ++ok;
+ if (branch(9, 0xFF, v)) ++ok; else ++wrong;
+ if (branch(10, 0xFF, v)) ++wrong; else ++ok;
+ if (branch(11, 0xFF, v)) ++ok; else ++wrong;
+ if (branch(12, 0xFF, v)) ++wrong; else ++ok;
+ if (branch(13, 0xFF, v)) ++ok; else ++wrong;
+ if (branch(14, 0xFF, v)) ++wrong; else ++ok;
+ if (branch(15, 0xFF, v)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+void
+tm_all_selected_bits_set_2(void)
+{
+ int wrong, ok;
+ unsigned char v;
+
+ printf("Test #4 mask == 0x80, value == 0x80 --> cc == 3\n");
+
+ v = 0x80;
+ wrong = ok = 0;
+
+ if (branch(0, 0x80, v)) ++wrong; else ++ok;
+ if (branch(1, 0x80, v)) ++ok; else ++wrong;
+ if (branch(2, 0x80, v)) ++wrong; else ++ok;
+ if (branch(3, 0x80, v)) ++ok; else ++wrong;
+ if (branch(4, 0x80, v)) ++wrong; else ++ok;
+ if (branch(5, 0x80, v)) ++ok; else ++wrong;
+ if (branch(6, 0x80, v)) ++wrong; else ++ok;
+ if (branch(7, 0x80, v)) ++ok; else ++wrong;
+ if (branch(8, 0x80, v)) ++wrong; else ++ok;
+ if (branch(9, 0x80, v)) ++ok; else ++wrong;
+ if (branch(10, 0x80, v)) ++wrong; else ++ok;
+ if (branch(11, 0x80, v)) ++ok; else ++wrong;
+ if (branch(12, 0x80, v)) ++wrong; else ++ok;
+ if (branch(13, 0x80, v)) ++ok; else ++wrong;
+ if (branch(14, 0x80, v)) ++wrong; else ++ok;
+ if (branch(15, 0x80, v)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+void
+tm_some_selected_bits_set_msb_set(void)
+{
+ int wrong, ok;
+ unsigned char v;
+
+ printf("Test #5 mask == 0xF0, value == 0x90 --> cc == 1\n");
+
+ v = 0x90;
+ wrong = ok = 0;
+
+ if (branch(0, 0xF0, v)) ++wrong; else ++ok;
+ if (branch(1, 0xF0, v)) ++wrong; else ++ok;
+ if (branch(2, 0xF0, v)) ++wrong; else ++ok;
+ if (branch(3, 0xF0, v)) ++wrong; else ++ok;
+ if (branch(4, 0xF0, v)) ++ok; else ++wrong;
+ if (branch(5, 0xF0, v)) ++ok; else ++wrong;
+ if (branch(6, 0xF0, v)) ++ok; else ++wrong;
+ if (branch(7, 0xF0, v)) ++ok; else ++wrong;
+ if (branch(8, 0xF0, v)) ++wrong; else ++ok;
+ if (branch(9, 0xF0, v)) ++wrong; else ++ok;
+ if (branch(10, 0xF0, v)) ++wrong; else ++ok;
+ if (branch(11, 0xF0, v)) ++wrong; else ++ok;
+ if (branch(12, 0xF0, v)) ++ok; else ++wrong;
+ if (branch(13, 0xF0, v)) ++ok; else ++wrong;
+ if (branch(14, 0xF0, v)) ++ok; else ++wrong;
+ if (branch(15, 0xF0, v)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+void
+tm_some_selected_bits_set_msb_not_set(void)
+{
+ int wrong, ok;
+ unsigned char v;
+
+ printf("Test #6 mask == 0xF0, value == 0x30 --> cc == 1\n");
+
+ v = 0x30;
+ wrong = ok = 0;
+
+ if (branch(0, 0xF0, v)) ++wrong; else ++ok;
+ if (branch(1, 0xF0, v)) ++wrong; else ++ok;
+ if (branch(2, 0xF0, v)) ++wrong; else ++ok;
+ if (branch(3, 0xF0, v)) ++wrong; else ++ok;
+ if (branch(4, 0xF0, v)) ++ok; else ++wrong;
+ if (branch(5, 0xF0, v)) ++ok; else ++wrong;
+ if (branch(6, 0xF0, v)) ++ok; else ++wrong;
+ if (branch(7, 0xF0, v)) ++ok; else ++wrong;
+ if (branch(8, 0xF0, v)) ++wrong; else ++ok;
+ if (branch(9, 0xF0, v)) ++wrong; else ++ok;
+ if (branch(10, 0xF0, v)) ++wrong; else ++ok;
+ if (branch(11, 0xF0, v)) ++wrong; else ++ok;
+ if (branch(12, 0xF0, v)) ++ok; else ++wrong;
+ if (branch(13, 0xF0, v)) ++ok; else ++wrong;
+ if (branch(14, 0xF0, v)) ++ok; else ++wrong;
+ if (branch(15, 0xF0, v)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+int main()
+{
+ tm_mask_0();
+ tm_value_0();
+ tm_all_selected_bits_set_1();
+ tm_all_selected_bits_set_2();
+ tm_some_selected_bits_set_msb_set();
+ tm_some_selected_bits_set_msb_not_set();
+
+ return 0;
+}
--- /dev/null
+Test #1 mask == 0, value == ~0 --> cc == 0
+OK
+Test #2 mask == 0xFF, value == 0 --> cc == 0
+OK
+Test #3 mask == 0xFF, value == 0xFF --> cc == 3
+OK
+Test #4 mask == 0x80, value == 0x80 --> cc == 3
+OK
+Test #5 mask == 0xF0, value == 0x90 --> cc == 1
+OK
+Test #6 mask == 0xF0, value == 0x30 --> cc == 1
+OK
--- /dev/null
+prog: spechelper-tm
--- /dev/null
+#include <stdio.h>
+
+#define branch(mask,i2,_v1) \
+ ({ \
+ unsigned char taken; \
+ unsigned long v1 = _v1; \
+ asm volatile( " tmll %[v]," #i2 "\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) \
+ : [v] "d"(v1) \
+ : "cc"); \
+ taken; \
+ })
+
+void
+tmll_mask_0(void)
+{
+ int wrong, ok;
+ unsigned long v;
+
+ printf("Test #1 mask == 0, value == ~0 --> cc == 0\n");
+
+ v = ~0ULL;
+ wrong = ok = 0;
+
+ if (branch(0, 0, v)) ++wrong; else ++ok;
+ if (branch(1, 0, v)) ++wrong; else ++ok;
+ if (branch(2, 0, v)) ++wrong; else ++ok;
+ if (branch(3, 0, v)) ++wrong; else ++ok;
+ if (branch(4, 0, v)) ++wrong; else ++ok;
+ if (branch(5, 0, v)) ++wrong; else ++ok;
+ if (branch(6, 0, v)) ++wrong; else ++ok;
+ if (branch(7, 0, v)) ++wrong; else ++ok;
+ if (branch(8, 0, v)) ++ok; else ++wrong;
+ if (branch(9, 0, v)) ++ok; else ++wrong;
+ if (branch(10, 0, v)) ++ok; else ++wrong;
+ if (branch(11, 0, v)) ++ok; else ++wrong;
+ if (branch(12, 0, v)) ++ok; else ++wrong;
+ if (branch(13, 0, v)) ++ok; else ++wrong;
+ if (branch(14, 0, v)) ++ok; else ++wrong;
+ if (branch(15, 0, v)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+void
+tmll_value_0(void)
+{
+ int wrong, ok;
+ unsigned long v;
+
+ printf("Test #2 mask == 0xFFF, value == 0 --> cc == 0\n");
+
+ v = 0;
+ wrong = ok = 0;
+
+ if (branch(0, 0xFFFF, v)) ++wrong; else ++ok;
+ if (branch(1, 0xFFFF, v)) ++wrong; else ++ok;
+ if (branch(2, 0xFFFF, v)) ++wrong; else ++ok;
+ if (branch(3, 0xFFFF, v)) ++wrong; else ++ok;
+ if (branch(4, 0xFFFF, v)) ++wrong; else ++ok;
+ if (branch(5, 0xFFFF, v)) ++wrong; else ++ok;
+ if (branch(6, 0xFFFF, v)) ++wrong; else ++ok;
+ if (branch(7, 0xFFFF, v)) ++wrong; else ++ok;
+ if (branch(8, 0xFFFF, v)) ++ok; else ++wrong;
+ if (branch(9, 0xFFFF, v)) ++ok; else ++wrong;
+ if (branch(10, 0xFFFF, v)) ++ok; else ++wrong;
+ if (branch(11, 0xFFFF, v)) ++ok; else ++wrong;
+ if (branch(12, 0xFFFF, v)) ++ok; else ++wrong;
+ if (branch(13, 0xFFFF, v)) ++ok; else ++wrong;
+ if (branch(14, 0xFFFF, v)) ++ok; else ++wrong;
+ if (branch(15, 0xFFFF, v)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+void
+tmll_all_selected_bits_set_1(void)
+{
+ int wrong, ok;
+ unsigned long v;
+
+ printf("Test #3 mask == 0xFFFF, value == 0xFFFF --> cc == 3\n");
+
+ v = 0xFFFF;
+ wrong = ok = 0;
+
+ if (branch(0, 0xFFFF, v)) ++wrong; else ++ok;
+ if (branch(1, 0xFFFF, v)) ++ok; else ++wrong;
+ if (branch(2, 0xFFFF, v)) ++wrong; else ++ok;
+ if (branch(3, 0xFFFF, v)) ++ok; else ++wrong;
+ if (branch(4, 0xFFFF, v)) ++wrong; else ++ok;
+ if (branch(5, 0xFFFF, v)) ++ok; else ++wrong;
+ if (branch(6, 0xFFFF, v)) ++wrong; else ++ok;
+ if (branch(7, 0xFFFF, v)) ++ok; else ++wrong;
+ if (branch(8, 0xFFFF, v)) ++wrong; else ++ok;
+ if (branch(9, 0xFFFF, v)) ++ok; else ++wrong;
+ if (branch(10, 0xFFFF, v)) ++wrong; else ++ok;
+ if (branch(11, 0xFFFF, v)) ++ok; else ++wrong;
+ if (branch(12, 0xFFFF, v)) ++wrong; else ++ok;
+ if (branch(13, 0xFFFF, v)) ++ok; else ++wrong;
+ if (branch(14, 0xFFFF, v)) ++wrong; else ++ok;
+ if (branch(15, 0xFFFF, v)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+void
+tmll_all_selected_bits_set_2(void)
+{
+ int wrong, ok;
+ unsigned long v;
+
+ printf("Test #4 mask == 0x8000, value == 0x8000 --> cc == 3\n");
+
+ v = 0x8000;
+ wrong = ok = 0;
+
+ if (branch(0, 0x8000, v)) ++wrong; else ++ok;
+ if (branch(1, 0x8000, v)) ++ok; else ++wrong;
+ if (branch(2, 0x8000, v)) ++wrong; else ++ok;
+ if (branch(3, 0x8000, v)) ++ok; else ++wrong;
+ if (branch(4, 0x8000, v)) ++wrong; else ++ok;
+ if (branch(5, 0x8000, v)) ++ok; else ++wrong;
+ if (branch(6, 0x8000, v)) ++wrong; else ++ok;
+ if (branch(7, 0x8000, v)) ++ok; else ++wrong;
+ if (branch(8, 0x8000, v)) ++wrong; else ++ok;
+ if (branch(9, 0x8000, v)) ++ok; else ++wrong;
+ if (branch(10, 0x8000, v)) ++wrong; else ++ok;
+ if (branch(11, 0x8000, v)) ++ok; else ++wrong;
+ if (branch(12, 0x8000, v)) ++wrong; else ++ok;
+ if (branch(13, 0x8000, v)) ++ok; else ++wrong;
+ if (branch(14, 0x8000, v)) ++wrong; else ++ok;
+ if (branch(15, 0x8000, v)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+void
+tmll_some_selected_bits_set_msb_set(void)
+{
+ int wrong, ok;
+ unsigned long v;
+
+ printf("Test #5 mask == 0xF000, value == 0x9000 --> cc == 2\n");
+
+ v = 0x9000;
+ wrong = ok = 0;
+
+ if (branch(0, 0xF000, v)) ++wrong; else ++ok;
+ if (branch(1, 0xF000, v)) ++wrong; else ++ok;
+ if (branch(2, 0xF000, v)) ++ok; else ++wrong;
+ if (branch(3, 0xF000, v)) ++ok; else ++wrong;
+ if (branch(4, 0xF000, v)) ++wrong; else ++ok;
+ if (branch(5, 0xF000, v)) ++wrong; else ++ok;
+ if (branch(6, 0xF000, v)) ++ok; else ++wrong;
+ if (branch(7, 0xF000, v)) ++ok; else ++wrong;
+ if (branch(8, 0xF000, v)) ++wrong; else ++ok;
+ if (branch(9, 0xF000, v)) ++wrong; else ++ok;
+ if (branch(10, 0xF000, v)) ++ok; else ++wrong;
+ if (branch(11, 0xF000, v)) ++ok; else ++wrong;
+ if (branch(12, 0xF000, v)) ++wrong; else ++ok;
+ if (branch(13, 0xF000, v)) ++wrong; else ++ok;
+ if (branch(14, 0xF000, v)) ++ok; else ++wrong;
+ if (branch(15, 0xF000, v)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+void
+tmll_some_selected_bits_set_msb_not_set(void)
+{
+ int wrong, ok;
+ unsigned long v;
+
+ printf("Test #6 mask == 0xF000, value == 0x3000 --> cc == 1\n");
+
+ v = 0x3000;
+ wrong = ok = 0;
+
+ if (branch(0, 0xF000, v)) ++wrong; else ++ok;
+ if (branch(1, 0xF000, v)) ++wrong; else ++ok;
+ if (branch(2, 0xF000, v)) ++wrong; else ++ok;
+ if (branch(3, 0xF000, v)) ++wrong; else ++ok;
+ if (branch(4, 0xF000, v)) ++ok; else ++wrong;
+ if (branch(5, 0xF000, v)) ++ok; else ++wrong;
+ if (branch(6, 0xF000, v)) ++ok; else ++wrong;
+ if (branch(7, 0xF000, v)) ++ok; else ++wrong;
+ if (branch(8, 0xF000, v)) ++wrong; else ++ok;
+ if (branch(9, 0xF000, v)) ++wrong; else ++ok;
+ if (branch(10, 0xF000, v)) ++wrong; else ++ok;
+ if (branch(11, 0xF000, v)) ++wrong; else ++ok;
+ if (branch(12, 0xF000, v)) ++ok; else ++wrong;
+ if (branch(13, 0xF000, v)) ++ok; else ++wrong;
+ if (branch(14, 0xF000, v)) ++ok; else ++wrong;
+ if (branch(15, 0xF000, v)) ++ok; else ++wrong;
+
+ if (wrong != 0 || ok != 16)
+ printf("FAILED\n");
+ else
+ printf("OK\n");
+}
+
+
+int main()
+{
+ tmll_mask_0();
+ tmll_value_0();
+ tmll_all_selected_bits_set_1();
+ tmll_all_selected_bits_set_2();
+ tmll_some_selected_bits_set_msb_set();
+ tmll_some_selected_bits_set_msb_not_set();
+
+ return 0;
+}
--- /dev/null
+Test #1 mask == 0, value == ~0 --> cc == 0
+OK
+Test #2 mask == 0xFFF, value == 0 --> cc == 0
+OK
+Test #3 mask == 0xFFFF, value == 0xFFFF --> cc == 3
+OK
+Test #4 mask == 0x8000, value == 0x8000 --> cc == 3
+OK
+Test #5 mask == 0xF000, value == 0x9000 --> cc == 2
+OK
+Test #6 mask == 0xF000, value == 0x3000 --> cc == 1
+OK
--- /dev/null
+prog: spechelper-tmll
--- /dev/null
+#ifndef SVC_H
+#define SVCT_H
+#include <asm/unistd.h>
+#include <sys/syscall.h>
+
+static inline long
+svc0(int num)
+{
+ register int _num asm("1") = num;
+ register long ret asm("2");
+
+ asm volatile( "svc 0\n"
+ :"=d"(ret)
+ : "d" (_num)
+ : "cc", "memory");
+ return ret;
+}
+
+static inline long
+svc1(int num, unsigned long arg1)
+{
+ register int _num asm("1") = num;
+ register long ret asm("2");
+ register unsigned long _arg1 asm("2") = arg1;
+
+ asm volatile( "svc 0\n"
+ :"=d"(ret)
+ : "d" (_num), "d" (_arg1)
+ : "cc", "memory");
+ return ret;
+}
+
+static inline long
+svc2(int num, unsigned long arg1, unsigned long arg2)
+{
+ register int _num asm("1") = num;
+ register long ret asm("2");
+ register unsigned long _arg1 asm("2") = arg1;
+ register unsigned long _arg2 asm("3") = arg2;
+
+ asm volatile( "svc 0\n"
+ :"=d"(ret)
+ : "d" (_num), "d" (_arg1), "d" (_arg2)
+ : "cc", "memory");
+ return ret;
+}
+
+
+static inline long
+svc3(int num, unsigned long arg1, unsigned long arg2, unsigned long arg3)
+{
+ register int _num asm("1") = num;
+ register long ret asm("2");
+ register unsigned long _arg1 asm("2") = arg1;
+ register unsigned long _arg2 asm("3") = arg2;
+ register unsigned long _arg3 asm("4") = arg3;
+
+ asm volatile( "svc 0\n"
+ :"=d"(ret)
+ : "d" (_num), "d" (_arg1), "d" (_arg2), "d" (_arg3)
+ : "cc", "memory");
+ return ret;
+}
+
+
+
+static inline long
+svc4(int num, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4)
+{
+ register int _num asm("1") = num;
+ register long ret asm("2");
+ register unsigned long _arg1 asm("2") = arg1;
+ register unsigned long _arg2 asm("3") = arg2;
+ register unsigned long _arg3 asm("4") = arg3;
+ register unsigned long _arg4 asm("5") = arg4;
+
+ asm volatile( "svc 0\n"
+ :"=d"(ret)
+ : "d" (_num), "d" (_arg1), "d" (_arg2), "d" (_arg3), "d" (_arg4)
+ : "cc", "memory");
+ return ret;
+}
+
+
+
+static inline long
+svc5(int num, unsigned long arg1, unsigned long arg2, unsigned long arg3, unsigned long arg4,
+ unsigned long arg5)
+{
+ register int _num asm("1") = num;
+ register long ret asm("2");
+ register unsigned long _arg1 asm("2") = arg1;
+ register unsigned long _arg2 asm("3") = arg2;
+ register unsigned long _arg3 asm("4") = arg3;
+ register unsigned long _arg4 asm("5") = arg4;
+ register unsigned long _arg5 asm("6") = arg5;
+
+ asm volatile( "svc 0\n"
+ :"=d"(ret)
+ : "d" (_num), "d" (_arg1), "d" (_arg2), "d" (_arg3), "d" (_arg4), "d" (_arg5)
+ : "cc", "memory");
+ return ret;
+}
+
+#endif /* SVC_H */
+#ifndef TEST_H
+#define TEST_H
+
#include <stdio.h>
+#include <sys/time.h>
+#include "svc.h"
+
+/* Convenience macros and functions for testcases */
+
+#define EXIT(ret) svc1(__NR_exit, ret)
+
+/* X must be a string constant */
+#define SAY(x) say(x"\n", sizeof x)
+
+/* Test COND and if it happens to be true, say so */
+#define TEST(cond) do { if (cond) SAY(#cond); } while (0)
+
+#define BRASLCLOBBER "0","1","2","3","4","5","14", \
+ "f0","f1","f2","f3","f4","f5","f6","f7"
+
+int say(const char *text, unsigned long num_chars)
+{
+ return svc3(4, 1, (unsigned long) text, num_chars);
+}
+
#define get_cc() \
({ \
char __cc; \
for (i=0; i < size; i++)
printf("%2.2X ", ((char *) field)[i]);
}
+
+static inline void mysleep(long sec, long usec)
+{
+ struct timeval tv;
+
+ tv.tv_sec = sec;
+ tv.tv_usec = usec;
+
+ svc5(SYS_select, 0,0,0,0,(unsigned long) &tv);
+}
+
+#endif /* TEST_H */
--- /dev/null
+#include <sys/syscall.h>
+#include <linux/wait.h>
+#include <sched.h>
+#include "test.h"
+
+char stack[4096];
+
+void saynum(int num)
+{
+ char *nums="012345679";
+ say(nums+num,1);
+}
+
+void test_thread(void *arg)
+{
+ mysleep(0,50000);
+ SAY("thread_start");
+ mysleep(0,50000);
+ SAY("thread_end");
+ EXIT(1);
+}
+
+void test_child(void)
+{
+ mysleep(0,50000);
+ SAY("child_start");
+ mysleep(0,50000);
+ SAY("child_end");
+ EXIT(1);
+}
+
+
+void forkish(void)
+{
+ int pid;
+ int status;
+
+ asm volatile( "lghi 2, 0\n"
+ "lgr 3, 0\n"
+ "svc 120\n" // CLONE
+ "lr %0, 2\n"
+ :"=d" (pid)
+ :: "2", "3", "cc");
+ if (!pid)
+ test_child();
+ SAY("MAIN_proc");
+ asm volatile( "lr 2, %2\n"
+ "lgr 3,%1\n"
+ "lgr 4,%3\n"
+ "lghi 5,0\n"
+ "svc 114\n" // WAIT4
+ : "=m" (status)
+ : "d" (&status), "d" (pid), "d" (__WALL)
+ : "2","3","4","5", "cc");
+ say("wait returned:",14);
+ saynum(status >> 8);
+ say("\n",1);
+ SAY("MAIN_proc_end");
+}
+
+void threadish(void)
+{
+ register long ret asm("2") = (unsigned long) stack+4096-160;
+ register long flags asm("3") = CLONE_THREAD | CLONE_SIGHAND |
+ CLONE_PARENT | CLONE_VM |
+ CLONE_FILES | CLONE_FS |
+ CLONE_PTRACE;
+
+ asm volatile( "svc 120\n"
+ :"+d"(ret)
+ : "d"(flags)
+ : "cc", "memory");
+ if (!ret)
+ test_thread(0);
+ SAY("MAIN_thread");
+ mysleep(0,10000);
+ SAY("MAIN_thread_end");
+}
+
+int main(void)
+{
+ forkish();
+ threadish();
+ EXIT(1);
+}
--- /dev/null
+MAIN_proc
+child_start
+child_end
+wait returned:1
+MAIN_proc_end
+MAIN_thread
+MAIN_thread_end
+thread_start
+thread_end
--- /dev/null
+prog: test_clone
--- /dev/null
+#include <asm/unistd.h>
+#include "test.h"
+
+int main()
+{
+ switch (svc0(__NR_fork)) {
+ case 0:
+ SAY("child\n");
+ break;
+ case -1:
+ SAY("error\n");
+ break;
+ default:
+ svc4(__NR_wait4, 0, 0, 0, 0);
+ SAY("parent\n");
+ break;
+ }
+ EXIT(0);
+}
--- /dev/null
+child
+
+parent
+
--- /dev/null
+prog: test_fork
--- /dev/null
+#include <features.h>
+#include <fpu_control.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <ucontext.h>
+#include <unistd.h>
+
+void handle_SIG(int sig)
+{
+ double d;
+
+ _FPU_SETCW(0);
+ d = 7;
+ asm volatile ("":: "f" (d));
+ printf("Got signal %d\n", sig);
+ if (sig == SIGSEGV) {
+ printf("SIGSEGV, exiting...\n");
+ exit(0);
+ }
+}
+
+void handle_rt_SIG(int sig, siginfo_t *info, void *uc)
+{
+ double d;
+
+ _FPU_SETCW(0);
+ d = 8;
+ asm volatile ("":: "f" (d));
+ printf("Got signal %d\n", sig);
+ printf("si_signo: %d\n", info->si_signo);
+ printf("si_errno: %d\n", info->si_errno);
+ printf("si_code: %d\n", info->si_code);
+ if (sig == SIGSEGV) {
+ printf("SIGSEGV, exiting...\n");
+ exit(0);
+ }
+}
+
+int main(void)
+{
+ // char *a;
+ struct sigaction sa;
+ double d1,d2,d3,d4,d5;
+
+ _FPU_SETCW(1);
+ d1 = d2 = d3 = d4 = d5 = 1;
+ sa.sa_sigaction=handle_rt_SIG;
+ sa.sa_flags =SA_SIGINFO;
+ sigemptyset(&sa.sa_mask);
+ sigaction(SIGALRM, &sa, NULL);
+ signal(SIGUSR1, handle_SIG);
+ signal(SIGSEGV, handle_SIG);
+ kill(getpid(), SIGALRM);
+ printf("One!\n");
+ kill(getpid(), SIGUSR1);
+ printf("floating point is now: %f %f %f %f %f\n", d1, d2, d3, d4, d5);
+ {
+ int fpc;
+ _FPU_GETCW(fpc);
+ printf("fpc= %d\n", fpc);
+ }
+ printf("Good Bye!\n");
+// a = (char *) 0x12345678;
+// *a = 1;
+ exit(0);
+}
--- /dev/null
+Got signal 14
+si_signo: 14
+si_errno: 0
+si_code: 0
+One!
+Got signal 10
+floating point is now: 1.000000 1.000000 1.000000 1.000000 1.000000
+fpc= 1
+Good Bye!
--- /dev/null
+prog: test_sig