From: Florian Krohm Date: Sun, 7 Oct 2012 04:00:48 +0000 (+0000) Subject: s390: Add a few more test from olden times. X-Git-Tag: svn/VALGRIND_3_9_0~641 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d5b07d8cf10059a7ae35af286b608209a8e3ee0d;p=thirdparty%2Fvalgrind.git s390: Add a few more test from olden times. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13027 --- diff --git a/none/tests/s390x/Makefile.am b/none/tests/s390x/Makefile.am index 7aeee2c547..16c2674b83 100644 --- a/none/tests/s390x/Makefile.am +++ b/none/tests/s390x/Makefile.am @@ -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 index 0000000000..fc7d96e47a --- /dev/null +++ b/none/tests/s390x/clst.c @@ -0,0 +1,53 @@ +#include +#include +#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 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/s390x/clst.stderr.exp @@ -0,0 +1,2 @@ + + diff --git a/none/tests/s390x/clst.stdout.exp b/none/tests/s390x/clst.stdout.exp new file mode 100644 index 0000000000..21bb155a02 --- /dev/null +++ b/none/tests/s390x/clst.stdout.exp @@ -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 index 0000000000..15f6e6e5e1 --- /dev/null +++ b/none/tests/s390x/clst.vgtest @@ -0,0 +1 @@ +prog: clst diff --git a/none/tests/s390x/mvc.c b/none/tests/s390x/mvc.c new file mode 100644 index 0000000000..3d5c496195 --- /dev/null +++ b/none/tests/s390x/mvc.c @@ -0,0 +1,62 @@ +#include +#include +#include + +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 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/s390x/mvc.stderr.exp @@ -0,0 +1,2 @@ + + diff --git a/none/tests/s390x/mvc.stdout.exp b/none/tests/s390x/mvc.stdout.exp new file mode 100644 index 0000000000..7ad5cc01e0 --- /dev/null +++ b/none/tests/s390x/mvc.stdout.exp @@ -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 index 0000000000..c5e499d8e8 --- /dev/null +++ b/none/tests/s390x/mvc.vgtest @@ -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 index 0000000000..441b6ef63f --- /dev/null +++ b/none/tests/s390x/spechelper-algr.c @@ -0,0 +1,168 @@ +#include + +#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 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/s390x/spechelper-algr.stderr.exp @@ -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 index 0000000000..9784a86b8d --- /dev/null +++ b/none/tests/s390x/spechelper-algr.stdout.exp @@ -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 index 0000000000..2287b7f4d3 --- /dev/null +++ b/none/tests/s390x/spechelper-algr.vgtest @@ -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 index 0000000000..0f1bff522c --- /dev/null +++ b/none/tests/s390x/spechelper-alr.c @@ -0,0 +1,168 @@ +#include + +#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 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/s390x/spechelper-alr.stderr.exp @@ -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 index 0000000000..9784a86b8d --- /dev/null +++ b/none/tests/s390x/spechelper-alr.stdout.exp @@ -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 index 0000000000..da9193bfdd --- /dev/null +++ b/none/tests/s390x/spechelper-alr.vgtest @@ -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 index 0000000000..3277fc76fe --- /dev/null +++ b/none/tests/s390x/spechelper-clr.c @@ -0,0 +1,124 @@ +#include + +#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 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/s390x/spechelper-clr.stderr.exp @@ -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 index 0000000000..d6cd0fc2ac --- /dev/null +++ b/none/tests/s390x/spechelper-clr.stdout.exp @@ -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 index 0000000000..5a5184879d --- /dev/null +++ b/none/tests/s390x/spechelper-clr.vgtest @@ -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 index 0000000000..63efacd54a --- /dev/null +++ b/none/tests/s390x/spechelper-cr.c @@ -0,0 +1,124 @@ +#include + +#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 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/s390x/spechelper-cr.stderr.exp @@ -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 index 0000000000..d6cd0fc2ac --- /dev/null +++ b/none/tests/s390x/spechelper-cr.stdout.exp @@ -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 index 0000000000..cc034686b9 --- /dev/null +++ b/none/tests/s390x/spechelper-cr.vgtest @@ -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 index 0000000000..78d202d3bd --- /dev/null +++ b/none/tests/s390x/spechelper-icm-1.c @@ -0,0 +1,761 @@ +#include + +#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 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/s390x/spechelper-icm-1.stderr.exp @@ -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 index 0000000000..65dcbc410b --- /dev/null +++ b/none/tests/s390x/spechelper-icm-1.stdout.exp @@ -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 index 0000000000..38b54bbfeb --- /dev/null +++ b/none/tests/s390x/spechelper-icm-1.vgtest @@ -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 index 0000000000..e0554f7405 --- /dev/null +++ b/none/tests/s390x/spechelper-icm-2.c @@ -0,0 +1,761 @@ +#include + +#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 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/s390x/spechelper-icm-2.stderr.exp @@ -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 index 0000000000..65dcbc410b --- /dev/null +++ b/none/tests/s390x/spechelper-icm-2.stdout.exp @@ -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 index 0000000000..96b88a2387 --- /dev/null +++ b/none/tests/s390x/spechelper-icm-2.vgtest @@ -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 index 0000000000..de20f36781 --- /dev/null +++ b/none/tests/s390x/spechelper-ltr.c @@ -0,0 +1,120 @@ +#include + +#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 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/s390x/spechelper-ltr.stderr.exp @@ -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 index 0000000000..58fcdd3213 --- /dev/null +++ b/none/tests/s390x/spechelper-ltr.stdout.exp @@ -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 index 0000000000..59e15504b6 --- /dev/null +++ b/none/tests/s390x/spechelper-ltr.vgtest @@ -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 index 0000000000..d495cd8401 --- /dev/null +++ b/none/tests/s390x/spechelper-or.c @@ -0,0 +1,88 @@ +#include + +#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 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/s390x/spechelper-or.stderr.exp @@ -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 index 0000000000..5f52c58846 --- /dev/null +++ b/none/tests/s390x/spechelper-or.stdout.exp @@ -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 index 0000000000..6ee56b1066 --- /dev/null +++ b/none/tests/s390x/spechelper-or.vgtest @@ -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 index 0000000000..699df4eb0e --- /dev/null +++ b/none/tests/s390x/spechelper-slgr.c @@ -0,0 +1,138 @@ +#include + +#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 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/s390x/spechelper-slgr.stderr.exp @@ -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 index 0000000000..575c11cd12 --- /dev/null +++ b/none/tests/s390x/spechelper-slgr.stdout.exp @@ -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 index 0000000000..833616110d --- /dev/null +++ b/none/tests/s390x/spechelper-slgr.vgtest @@ -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 index 0000000000..9eb59cc6c7 --- /dev/null +++ b/none/tests/s390x/spechelper-slr.c @@ -0,0 +1,136 @@ +#include + +#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 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/s390x/spechelper-slr.stderr.exp @@ -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 index 0000000000..575c11cd12 --- /dev/null +++ b/none/tests/s390x/spechelper-slr.stdout.exp @@ -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 index 0000000000..c759c1fa7f --- /dev/null +++ b/none/tests/s390x/spechelper-slr.vgtest @@ -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 index 0000000000..218d582ad1 --- /dev/null +++ b/none/tests/s390x/spechelper-tm.c @@ -0,0 +1,233 @@ +#include + +#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 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/s390x/spechelper-tm.stderr.exp @@ -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 index 0000000000..86cae898a4 --- /dev/null +++ b/none/tests/s390x/spechelper-tm.stdout.exp @@ -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 index 0000000000..1b33c1016d --- /dev/null +++ b/none/tests/s390x/spechelper-tm.vgtest @@ -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 index 0000000000..88d36d26c7 --- /dev/null +++ b/none/tests/s390x/spechelper-tmll.c @@ -0,0 +1,234 @@ +#include + +#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 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/s390x/spechelper-tmll.stderr.exp @@ -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 index 0000000000..9eb1491a1a --- /dev/null +++ b/none/tests/s390x/spechelper-tmll.stdout.exp @@ -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 index 0000000000..10b9a4f629 --- /dev/null +++ b/none/tests/s390x/spechelper-tmll.vgtest @@ -0,0 +1 @@ +prog: spechelper-tmll diff --git a/none/tests/s390x/svc.h b/none/tests/s390x/svc.h new file mode 100644 index 0000000000..9abe8e1912 --- /dev/null +++ b/none/tests/s390x/svc.h @@ -0,0 +1,105 @@ +#ifndef SVC_H +#define SVCT_H +#include +#include + +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 */ diff --git a/none/tests/s390x/test.h b/none/tests/s390x/test.h index 17a1f96cd0..c75e14cd8a 100644 --- a/none/tests/s390x/test.h +++ b/none/tests/s390x/test.h @@ -1,4 +1,28 @@ +#ifndef TEST_H +#define TEST_H + #include +#include +#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 index 0000000000..7f69c899d2 --- /dev/null +++ b/none/tests/s390x/test_clone.c @@ -0,0 +1,85 @@ +#include +#include +#include +#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 index 0000000000..b28b04f643 --- /dev/null +++ b/none/tests/s390x/test_clone.stderr.exp @@ -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 index 0000000000..a5aaa1886b --- /dev/null +++ b/none/tests/s390x/test_clone.stdout.exp @@ -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 index 0000000000..03b797c908 --- /dev/null +++ b/none/tests/s390x/test_clone.vgtest @@ -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 index 0000000000..1c18e71de6 --- /dev/null +++ b/none/tests/s390x/test_fork.c @@ -0,0 +1,19 @@ +#include +#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 index 0000000000..b28b04f643 --- /dev/null +++ b/none/tests/s390x/test_fork.stderr.exp @@ -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 index 0000000000..ed62fd9eec --- /dev/null +++ b/none/tests/s390x/test_fork.stdout.exp @@ -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 index 0000000000..b865c5ed90 --- /dev/null +++ b/none/tests/s390x/test_fork.vgtest @@ -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 index 0000000000..74049312f0 --- /dev/null +++ b/none/tests/s390x/test_sig.c @@ -0,0 +1,69 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +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 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/s390x/test_sig.stderr.exp @@ -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 index 0000000000..c7f0bee300 --- /dev/null +++ b/none/tests/s390x/test_sig.stdout.exp @@ -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 index 0000000000..0e1aa51eae --- /dev/null +++ b/none/tests/s390x/test_sig.vgtest @@ -0,0 +1 @@ +prog: test_sig