]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
s390: Add a few more test from olden times.
authorFlorian Krohm <florian@eich-krohm.de>
Sun, 7 Oct 2012 04:00:48 +0000 (04:00 +0000)
committerFlorian Krohm <florian@eich-krohm.de>
Sun, 7 Oct 2012 04:00:48 +0000 (04:00 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13027

71 files changed:
none/tests/s390x/Makefile.am
none/tests/s390x/clst.c [new file with mode: 0644]
none/tests/s390x/clst.stderr.exp [new file with mode: 0644]
none/tests/s390x/clst.stdout.exp [new file with mode: 0644]
none/tests/s390x/clst.vgtest [new file with mode: 0644]
none/tests/s390x/mvc.c [new file with mode: 0644]
none/tests/s390x/mvc.stderr.exp [new file with mode: 0644]
none/tests/s390x/mvc.stdout.exp [new file with mode: 0644]
none/tests/s390x/mvc.vgtest [new file with mode: 0644]
none/tests/s390x/spechelper-algr.c [new file with mode: 0644]
none/tests/s390x/spechelper-algr.stderr.exp [new file with mode: 0644]
none/tests/s390x/spechelper-algr.stdout.exp [new file with mode: 0644]
none/tests/s390x/spechelper-algr.vgtest [new file with mode: 0644]
none/tests/s390x/spechelper-alr.c [new file with mode: 0644]
none/tests/s390x/spechelper-alr.stderr.exp [new file with mode: 0644]
none/tests/s390x/spechelper-alr.stdout.exp [new file with mode: 0644]
none/tests/s390x/spechelper-alr.vgtest [new file with mode: 0644]
none/tests/s390x/spechelper-clr.c [new file with mode: 0644]
none/tests/s390x/spechelper-clr.stderr.exp [new file with mode: 0644]
none/tests/s390x/spechelper-clr.stdout.exp [new file with mode: 0644]
none/tests/s390x/spechelper-clr.vgtest [new file with mode: 0644]
none/tests/s390x/spechelper-cr.c [new file with mode: 0644]
none/tests/s390x/spechelper-cr.stderr.exp [new file with mode: 0644]
none/tests/s390x/spechelper-cr.stdout.exp [new file with mode: 0644]
none/tests/s390x/spechelper-cr.vgtest [new file with mode: 0644]
none/tests/s390x/spechelper-icm-1.c [new file with mode: 0644]
none/tests/s390x/spechelper-icm-1.stderr.exp [new file with mode: 0644]
none/tests/s390x/spechelper-icm-1.stdout.exp [new file with mode: 0644]
none/tests/s390x/spechelper-icm-1.vgtest [new file with mode: 0644]
none/tests/s390x/spechelper-icm-2.c [new file with mode: 0644]
none/tests/s390x/spechelper-icm-2.stderr.exp [new file with mode: 0644]
none/tests/s390x/spechelper-icm-2.stdout.exp [new file with mode: 0644]
none/tests/s390x/spechelper-icm-2.vgtest [new file with mode: 0644]
none/tests/s390x/spechelper-ltr.c [new file with mode: 0644]
none/tests/s390x/spechelper-ltr.stderr.exp [new file with mode: 0644]
none/tests/s390x/spechelper-ltr.stdout.exp [new file with mode: 0644]
none/tests/s390x/spechelper-ltr.vgtest [new file with mode: 0644]
none/tests/s390x/spechelper-or.c [new file with mode: 0644]
none/tests/s390x/spechelper-or.stderr.exp [new file with mode: 0644]
none/tests/s390x/spechelper-or.stdout.exp [new file with mode: 0644]
none/tests/s390x/spechelper-or.vgtest [new file with mode: 0644]
none/tests/s390x/spechelper-slgr.c [new file with mode: 0644]
none/tests/s390x/spechelper-slgr.stderr.exp [new file with mode: 0644]
none/tests/s390x/spechelper-slgr.stdout.exp [new file with mode: 0644]
none/tests/s390x/spechelper-slgr.vgtest [new file with mode: 0644]
none/tests/s390x/spechelper-slr.c [new file with mode: 0644]
none/tests/s390x/spechelper-slr.stderr.exp [new file with mode: 0644]
none/tests/s390x/spechelper-slr.stdout.exp [new file with mode: 0644]
none/tests/s390x/spechelper-slr.vgtest [new file with mode: 0644]
none/tests/s390x/spechelper-tm.c [new file with mode: 0644]
none/tests/s390x/spechelper-tm.stderr.exp [new file with mode: 0644]
none/tests/s390x/spechelper-tm.stdout.exp [new file with mode: 0644]
none/tests/s390x/spechelper-tm.vgtest [new file with mode: 0644]
none/tests/s390x/spechelper-tmll.c [new file with mode: 0644]
none/tests/s390x/spechelper-tmll.stderr.exp [new file with mode: 0644]
none/tests/s390x/spechelper-tmll.stdout.exp [new file with mode: 0644]
none/tests/s390x/spechelper-tmll.vgtest [new file with mode: 0644]
none/tests/s390x/svc.h [new file with mode: 0644]
none/tests/s390x/test.h
none/tests/s390x/test_clone.c [new file with mode: 0644]
none/tests/s390x/test_clone.stderr.exp [new file with mode: 0644]
none/tests/s390x/test_clone.stdout.exp [new file with mode: 0644]
none/tests/s390x/test_clone.vgtest [new file with mode: 0644]
none/tests/s390x/test_fork.c [new file with mode: 0644]
none/tests/s390x/test_fork.stderr.exp [new file with mode: 0644]
none/tests/s390x/test_fork.stdout.exp [new file with mode: 0644]
none/tests/s390x/test_fork.vgtest [new file with mode: 0644]
none/tests/s390x/test_sig.c [new file with mode: 0644]
none/tests/s390x/test_sig.stderr.exp [new file with mode: 0644]
none/tests/s390x/test_sig.stdout.exp [new file with mode: 0644]
none/tests/s390x/test_sig.vgtest [new file with mode: 0644]

index 7aeee2c547da9d64c3c9d9a6ddc77366353a5073..16c2674b83e6ce33e3481d26df1d33fdeb979a9e 100644 (file)
@@ -11,7 +11,13 @@ INSN_TESTS = clc clcle cvb cvd icm lpr tcxb lam_stam xc mvst add sub mul \
              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 \
@@ -25,7 +31,7 @@ EXTRA_DIST = \
        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@
diff --git a/none/tests/s390x/clst.c b/none/tests/s390x/clst.c
new file mode 100644 (file)
index 0000000..fc7d96e
--- /dev/null
@@ -0,0 +1,53 @@
+#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;
+}
diff --git a/none/tests/s390x/clst.stderr.exp b/none/tests/s390x/clst.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/s390x/clst.stdout.exp b/none/tests/s390x/clst.stdout.exp
new file mode 100644 (file)
index 0000000..21bb155
--- /dev/null
@@ -0,0 +1,30 @@
+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
+
diff --git a/none/tests/s390x/clst.vgtest b/none/tests/s390x/clst.vgtest
new file mode 100644 (file)
index 0000000..15f6e6e
--- /dev/null
@@ -0,0 +1 @@
+prog: clst
diff --git a/none/tests/s390x/mvc.c b/none/tests/s390x/mvc.c
new file mode 100644 (file)
index 0000000..3d5c496
--- /dev/null
@@ -0,0 +1,62 @@
+#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;
+}
diff --git a/none/tests/s390x/mvc.stderr.exp b/none/tests/s390x/mvc.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/s390x/mvc.stdout.exp b/none/tests/s390x/mvc.stdout.exp
new file mode 100644 (file)
index 0000000..7ad5cc0
--- /dev/null
@@ -0,0 +1,17 @@
+------- 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|
diff --git a/none/tests/s390x/mvc.vgtest b/none/tests/s390x/mvc.vgtest
new file mode 100644 (file)
index 0000000..c5e499d
--- /dev/null
@@ -0,0 +1 @@
+prog: mvc
diff --git a/none/tests/s390x/spechelper-algr.c b/none/tests/s390x/spechelper-algr.c
new file mode 100644 (file)
index 0000000..441b6ef
--- /dev/null
@@ -0,0 +1,168 @@
+#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;
+}
diff --git a/none/tests/s390x/spechelper-algr.stderr.exp b/none/tests/s390x/spechelper-algr.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/s390x/spechelper-algr.stdout.exp b/none/tests/s390x/spechelper-algr.stdout.exp
new file mode 100644 (file)
index 0000000..9784a86
--- /dev/null
@@ -0,0 +1,8 @@
+Test #1  cc == 0
+OK
+Test #2  cc == 1
+OK
+Test #3  cc == 2
+OK
+Test #4  cc == 3
+OK
diff --git a/none/tests/s390x/spechelper-algr.vgtest b/none/tests/s390x/spechelper-algr.vgtest
new file mode 100644 (file)
index 0000000..2287b7f
--- /dev/null
@@ -0,0 +1 @@
+prog: spechelper-algr
diff --git a/none/tests/s390x/spechelper-alr.c b/none/tests/s390x/spechelper-alr.c
new file mode 100644 (file)
index 0000000..0f1bff5
--- /dev/null
@@ -0,0 +1,168 @@
+#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;
+}
diff --git a/none/tests/s390x/spechelper-alr.stderr.exp b/none/tests/s390x/spechelper-alr.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/s390x/spechelper-alr.stdout.exp b/none/tests/s390x/spechelper-alr.stdout.exp
new file mode 100644 (file)
index 0000000..9784a86
--- /dev/null
@@ -0,0 +1,8 @@
+Test #1  cc == 0
+OK
+Test #2  cc == 1
+OK
+Test #3  cc == 2
+OK
+Test #4  cc == 3
+OK
diff --git a/none/tests/s390x/spechelper-alr.vgtest b/none/tests/s390x/spechelper-alr.vgtest
new file mode 100644 (file)
index 0000000..da9193b
--- /dev/null
@@ -0,0 +1 @@
+prog: spechelper-alr
diff --git a/none/tests/s390x/spechelper-clr.c b/none/tests/s390x/spechelper-clr.c
new file mode 100644 (file)
index 0000000..3277fc7
--- /dev/null
@@ -0,0 +1,124 @@
+#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;
+}
diff --git a/none/tests/s390x/spechelper-clr.stderr.exp b/none/tests/s390x/spechelper-clr.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/s390x/spechelper-clr.stdout.exp b/none/tests/s390x/spechelper-clr.stdout.exp
new file mode 100644 (file)
index 0000000..d6cd0fc
--- /dev/null
@@ -0,0 +1,6 @@
+Test #1  op1 == op2
+OK
+Test #2  op1 > op2
+OK
+Test #3  op1 < op2
+OK
diff --git a/none/tests/s390x/spechelper-clr.vgtest b/none/tests/s390x/spechelper-clr.vgtest
new file mode 100644 (file)
index 0000000..5a51848
--- /dev/null
@@ -0,0 +1 @@
+prog: spechelper-clr
diff --git a/none/tests/s390x/spechelper-cr.c b/none/tests/s390x/spechelper-cr.c
new file mode 100644 (file)
index 0000000..63efacd
--- /dev/null
@@ -0,0 +1,124 @@
+#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;
+}
diff --git a/none/tests/s390x/spechelper-cr.stderr.exp b/none/tests/s390x/spechelper-cr.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/s390x/spechelper-cr.stdout.exp b/none/tests/s390x/spechelper-cr.stdout.exp
new file mode 100644 (file)
index 0000000..d6cd0fc
--- /dev/null
@@ -0,0 +1,6 @@
+Test #1  op1 == op2
+OK
+Test #2  op1 > op2
+OK
+Test #3  op1 < op2
+OK
diff --git a/none/tests/s390x/spechelper-cr.vgtest b/none/tests/s390x/spechelper-cr.vgtest
new file mode 100644 (file)
index 0000000..cc03468
--- /dev/null
@@ -0,0 +1 @@
+prog: spechelper-cr
diff --git a/none/tests/s390x/spechelper-icm-1.c b/none/tests/s390x/spechelper-icm-1.c
new file mode 100644 (file)
index 0000000..78d202d
--- /dev/null
@@ -0,0 +1,761 @@
+#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;
+}
diff --git a/none/tests/s390x/spechelper-icm-1.stderr.exp b/none/tests/s390x/spechelper-icm-1.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/s390x/spechelper-icm-1.stdout.exp b/none/tests/s390x/spechelper-icm-1.stdout.exp
new file mode 100644 (file)
index 0000000..65dcbc4
--- /dev/null
@@ -0,0 +1,20 @@
+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
diff --git a/none/tests/s390x/spechelper-icm-1.vgtest b/none/tests/s390x/spechelper-icm-1.vgtest
new file mode 100644 (file)
index 0000000..38b54bb
--- /dev/null
@@ -0,0 +1 @@
+prog: spechelper-icm-1
diff --git a/none/tests/s390x/spechelper-icm-2.c b/none/tests/s390x/spechelper-icm-2.c
new file mode 100644 (file)
index 0000000..e0554f7
--- /dev/null
@@ -0,0 +1,761 @@
+#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;
+}
diff --git a/none/tests/s390x/spechelper-icm-2.stderr.exp b/none/tests/s390x/spechelper-icm-2.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/s390x/spechelper-icm-2.stdout.exp b/none/tests/s390x/spechelper-icm-2.stdout.exp
new file mode 100644 (file)
index 0000000..65dcbc4
--- /dev/null
@@ -0,0 +1,20 @@
+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
diff --git a/none/tests/s390x/spechelper-icm-2.vgtest b/none/tests/s390x/spechelper-icm-2.vgtest
new file mode 100644 (file)
index 0000000..96b88a2
--- /dev/null
@@ -0,0 +1 @@
+prog: spechelper-icm-2
diff --git a/none/tests/s390x/spechelper-ltr.c b/none/tests/s390x/spechelper-ltr.c
new file mode 100644 (file)
index 0000000..de20f36
--- /dev/null
@@ -0,0 +1,120 @@
+#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;
+}
diff --git a/none/tests/s390x/spechelper-ltr.stderr.exp b/none/tests/s390x/spechelper-ltr.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/s390x/spechelper-ltr.stdout.exp b/none/tests/s390x/spechelper-ltr.stdout.exp
new file mode 100644 (file)
index 0000000..58fcdd3
--- /dev/null
@@ -0,0 +1,6 @@
+Test #1  value = 0
+OK
+Test #2  value > 0
+OK
+Test #3  value < 0
+OK
diff --git a/none/tests/s390x/spechelper-ltr.vgtest b/none/tests/s390x/spechelper-ltr.vgtest
new file mode 100644 (file)
index 0000000..59e1550
--- /dev/null
@@ -0,0 +1 @@
+prog: spechelper-ltr
diff --git a/none/tests/s390x/spechelper-or.c b/none/tests/s390x/spechelper-or.c
new file mode 100644 (file)
index 0000000..d495cd8
--- /dev/null
@@ -0,0 +1,88 @@
+#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;
+}
diff --git a/none/tests/s390x/spechelper-or.stderr.exp b/none/tests/s390x/spechelper-or.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/s390x/spechelper-or.stdout.exp b/none/tests/s390x/spechelper-or.stdout.exp
new file mode 100644 (file)
index 0000000..5f52c58
--- /dev/null
@@ -0,0 +1,4 @@
+Test #1  result = 0
+OK
+Test #2  result = 0xffffffff
+OK
diff --git a/none/tests/s390x/spechelper-or.vgtest b/none/tests/s390x/spechelper-or.vgtest
new file mode 100644 (file)
index 0000000..6ee56b1
--- /dev/null
@@ -0,0 +1 @@
+prog: spechelper-or
diff --git a/none/tests/s390x/spechelper-slgr.c b/none/tests/s390x/spechelper-slgr.c
new file mode 100644 (file)
index 0000000..699df4e
--- /dev/null
@@ -0,0 +1,138 @@
+#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;
+}
diff --git a/none/tests/s390x/spechelper-slgr.stderr.exp b/none/tests/s390x/spechelper-slgr.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/s390x/spechelper-slgr.stdout.exp b/none/tests/s390x/spechelper-slgr.stdout.exp
new file mode 100644 (file)
index 0000000..575c11c
--- /dev/null
@@ -0,0 +1,6 @@
+Test #1  op1 == op2
+OK
+Test #2  op1 < op2
+OK
+Test #3  op1 > op2
+OK
diff --git a/none/tests/s390x/spechelper-slgr.vgtest b/none/tests/s390x/spechelper-slgr.vgtest
new file mode 100644 (file)
index 0000000..8336161
--- /dev/null
@@ -0,0 +1 @@
+prog: spechelper-slgr
diff --git a/none/tests/s390x/spechelper-slr.c b/none/tests/s390x/spechelper-slr.c
new file mode 100644 (file)
index 0000000..9eb59cc
--- /dev/null
@@ -0,0 +1,136 @@
+#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;
+}
diff --git a/none/tests/s390x/spechelper-slr.stderr.exp b/none/tests/s390x/spechelper-slr.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/s390x/spechelper-slr.stdout.exp b/none/tests/s390x/spechelper-slr.stdout.exp
new file mode 100644 (file)
index 0000000..575c11c
--- /dev/null
@@ -0,0 +1,6 @@
+Test #1  op1 == op2
+OK
+Test #2  op1 < op2
+OK
+Test #3  op1 > op2
+OK
diff --git a/none/tests/s390x/spechelper-slr.vgtest b/none/tests/s390x/spechelper-slr.vgtest
new file mode 100644 (file)
index 0000000..c759c1f
--- /dev/null
@@ -0,0 +1 @@
+prog: spechelper-slr
diff --git a/none/tests/s390x/spechelper-tm.c b/none/tests/s390x/spechelper-tm.c
new file mode 100644 (file)
index 0000000..218d582
--- /dev/null
@@ -0,0 +1,233 @@
+#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;
+}
diff --git a/none/tests/s390x/spechelper-tm.stderr.exp b/none/tests/s390x/spechelper-tm.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/s390x/spechelper-tm.stdout.exp b/none/tests/s390x/spechelper-tm.stdout.exp
new file mode 100644 (file)
index 0000000..86cae89
--- /dev/null
@@ -0,0 +1,12 @@
+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
diff --git a/none/tests/s390x/spechelper-tm.vgtest b/none/tests/s390x/spechelper-tm.vgtest
new file mode 100644 (file)
index 0000000..1b33c10
--- /dev/null
@@ -0,0 +1 @@
+prog: spechelper-tm
diff --git a/none/tests/s390x/spechelper-tmll.c b/none/tests/s390x/spechelper-tmll.c
new file mode 100644 (file)
index 0000000..88d36d2
--- /dev/null
@@ -0,0 +1,234 @@
+#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;
+}
diff --git a/none/tests/s390x/spechelper-tmll.stderr.exp b/none/tests/s390x/spechelper-tmll.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/s390x/spechelper-tmll.stdout.exp b/none/tests/s390x/spechelper-tmll.stdout.exp
new file mode 100644 (file)
index 0000000..9eb1491
--- /dev/null
@@ -0,0 +1,12 @@
+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
diff --git a/none/tests/s390x/spechelper-tmll.vgtest b/none/tests/s390x/spechelper-tmll.vgtest
new file mode 100644 (file)
index 0000000..10b9a4f
--- /dev/null
@@ -0,0 +1 @@
+prog: spechelper-tmll
diff --git a/none/tests/s390x/svc.h b/none/tests/s390x/svc.h
new file mode 100644 (file)
index 0000000..9abe8e1
--- /dev/null
@@ -0,0 +1,105 @@
+#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 */
index 17a1f96cd0797c7729b0248d19add84aa664e24c..c75e14cd8a6e87e1e034cff83bfb1b2a60a690d1 100644 (file)
@@ -1,4 +1,28 @@
+#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; \
@@ -28,3 +52,15 @@ static inline void dump_field(void *field, int size)
        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 */
diff --git a/none/tests/s390x/test_clone.c b/none/tests/s390x/test_clone.c
new file mode 100644 (file)
index 0000000..7f69c89
--- /dev/null
@@ -0,0 +1,85 @@
+#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);
+}
diff --git a/none/tests/s390x/test_clone.stderr.exp b/none/tests/s390x/test_clone.stderr.exp
new file mode 100644 (file)
index 0000000..b28b04f
--- /dev/null
@@ -0,0 +1,3 @@
+
+
+
diff --git a/none/tests/s390x/test_clone.stdout.exp b/none/tests/s390x/test_clone.stdout.exp
new file mode 100644 (file)
index 0000000..a5aaa18
--- /dev/null
@@ -0,0 +1,9 @@
+MAIN_proc
+child_start
+child_end
+wait returned:1
+MAIN_proc_end
+MAIN_thread
+MAIN_thread_end
+thread_start
+thread_end
diff --git a/none/tests/s390x/test_clone.vgtest b/none/tests/s390x/test_clone.vgtest
new file mode 100644 (file)
index 0000000..03b797c
--- /dev/null
@@ -0,0 +1 @@
+prog: test_clone
diff --git a/none/tests/s390x/test_fork.c b/none/tests/s390x/test_fork.c
new file mode 100644 (file)
index 0000000..1c18e71
--- /dev/null
@@ -0,0 +1,19 @@
+#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);
+}
diff --git a/none/tests/s390x/test_fork.stderr.exp b/none/tests/s390x/test_fork.stderr.exp
new file mode 100644 (file)
index 0000000..b28b04f
--- /dev/null
@@ -0,0 +1,3 @@
+
+
+
diff --git a/none/tests/s390x/test_fork.stdout.exp b/none/tests/s390x/test_fork.stdout.exp
new file mode 100644 (file)
index 0000000..ed62fd9
--- /dev/null
@@ -0,0 +1,4 @@
+child
+
+parent
+
diff --git a/none/tests/s390x/test_fork.vgtest b/none/tests/s390x/test_fork.vgtest
new file mode 100644 (file)
index 0000000..b865c5e
--- /dev/null
@@ -0,0 +1 @@
+prog: test_fork
diff --git a/none/tests/s390x/test_sig.c b/none/tests/s390x/test_sig.c
new file mode 100644 (file)
index 0000000..7404931
--- /dev/null
@@ -0,0 +1,69 @@
+#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);
+}
diff --git a/none/tests/s390x/test_sig.stderr.exp b/none/tests/s390x/test_sig.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/s390x/test_sig.stdout.exp b/none/tests/s390x/test_sig.stdout.exp
new file mode 100644 (file)
index 0000000..c7f0bee
--- /dev/null
@@ -0,0 +1,9 @@
+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!
diff --git a/none/tests/s390x/test_sig.vgtest b/none/tests/s390x/test_sig.vgtest
new file mode 100644 (file)
index 0000000..0e1aa51
--- /dev/null
@@ -0,0 +1 @@
+prog: test_sig