From: Andreas Arnez Date: Tue, 2 Feb 2021 19:15:02 +0000 (+0100) Subject: s390x: Misc-insn-3, test case X-Git-Tag: VALGRIND_3_18_0~94 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=02b7bed505cad684af8f978e06a1cce1770e0cb6;p=thirdparty%2Fvalgrind.git s390x: Misc-insn-3, test case Add a test case for the new instructions in the miscellaneous instruction extensions facitility 3. --- diff --git a/.gitignore b/.gitignore index fddb1e75b7..b418f52fdc 100644 --- a/.gitignore +++ b/.gitignore @@ -1887,6 +1887,7 @@ /none/tests/s390x/vector_integer /none/tests/s390x/high-word /none/tests/s390x/vector_float +/none/tests/s390x/misc3 # /none/tests/scripts/ /none/tests/scripts/*.dSYM diff --git a/none/tests/s390x/Makefile.am b/none/tests/s390x/Makefile.am index a0fb92ef57..2fd45ec1e8 100644 --- a/none/tests/s390x/Makefile.am +++ b/none/tests/s390x/Makefile.am @@ -19,7 +19,8 @@ INSN_TESTS = clc clcle cvb cvd icm lpr tcxb lam_stam xc mvst add sub mul \ spechelper-ltr spechelper-or \ spechelper-icm-1 spechelper-icm-2 spechelper-tmll \ spechelper-tm laa vector lsc2 ppno vector_string vector_integer \ - vector_float add-z14 sub-z14 mul-z14 bic + vector_float add-z14 sub-z14 mul-z14 bic \ + misc3 if BUILD_DFP_TESTS INSN_TESTS += dfp-1 dfp-2 dfp-3 dfp-4 dfptest dfpext dfpconv srnmt pfpo diff --git a/none/tests/s390x/misc3.c b/none/tests/s390x/misc3.c new file mode 100644 index 0000000000..ae6e8d4c2b --- /dev/null +++ b/none/tests/s390x/misc3.c @@ -0,0 +1,182 @@ +#include + +/* -- Logical instructions -- */ + +#define TEST_GENERATE(opcode,insn) \ + static void test_##insn(unsigned long a, unsigned long b) \ + { \ + unsigned long out = 0xdecaffee42424242; \ + int cc; \ + \ + __asm__( \ + "cr 0,0\n\t" /* Clear CC */ \ + ".insn rrf,0x" #opcode "0000,%[out],%[a],%[b],0\n\t" \ + "ipm %[cc]\n\t" \ + "srl %[cc],28\n" \ + : [out] "+d" (out), \ + [cc] "=d" (cc) \ + : [a] "d" (a), \ + [b] "d" (b) \ + : "cc"); \ + \ + printf("\t%016lx %016lx -> %016lx cc=%d\n", \ + a, b, out, cc); \ + } + +#define TEST_EXEC(opcode,insn) \ + do { \ + puts(#insn); \ + test_##insn(0, 0); \ + test_##insn(0, -1); \ + test_##insn(-1, 0); \ + test_##insn(-1, -1); \ + test_##insn(0x012345678abcdef, 0); \ + test_##insn(0x012345678abcdef, -1); \ + test_##insn(0x55555555aaaaaaaa, 0xaaaaaaaa55555555); \ + } while (0) + +#define INSNS \ + XTEST(b9f5,ncrk); \ + XTEST(b9e5,ncgrk); \ + XTEST(b974,nnrk); \ + XTEST(b964,nngrk); \ + XTEST(b976,nork); \ + XTEST(b966,nogrk); \ + XTEST(b977,nxrk); \ + XTEST(b967,nxgrk); \ + XTEST(b975,ocrk); \ + XTEST(b965,ocgrk); + +#define XTEST TEST_GENERATE +INSNS +#undef XTEST + +static void test_all_logical_insns() +{ +#define XTEST TEST_EXEC + INSNS +#undef XTEST +} +#undef INSNS +#undef TEST_GENERATE +#undef TEST_EXEC + + +/* -- Full population count -- */ + +static void test_popcnt(unsigned long op2) +{ + unsigned long result; + int cc; + + __asm__(".insn rrf,0xb9e10000,%[result],%[op2],8,0\n\t" + "ipm %[cc]\n\t" + "srl %[cc],28\n" + : [result]"=d" (result), + [cc]"=d" (cc) + : [op2]"d" (op2) + : "cc"); + printf("\t%016lx -> %2lu cc=%d\n", op2, result, cc); +} + +static int test_all_popcnt() +{ + puts("popcnt"); + test_popcnt(0); + test_popcnt(1); + test_popcnt(0x8000000000000000); + test_popcnt(-1UL); + test_popcnt(0xff427e3800556bcd); + return 0; +} + +/* -- Select -- */ + +#define TEST_GENERATE(opcode,insn) \ + static void test_##insn(unsigned long a, unsigned long b) \ + { \ + unsigned long out0 = 0x0cafebad0badcafe; \ + unsigned long out1 = 0x0badcafe0cafebad; \ + \ + __asm__( \ + "cr 0,0\n\t" /* Clear CC */ \ + ".insn rrf,0x" #opcode "0000,%[out0],%[a],%[b],8\n\t" \ + ".insn rrf,0x" #opcode "0000,%[out1],%[a],%[b],7\n\t" \ + : [out0] "+d" (out0), \ + [out1] "+d" (out1) \ + : [a] "d" (a), \ + [b] "d" (b) \ + : ); \ + \ + printf("\t%016lx %016lx -> %016lx %016lx\n", \ + a, b, out0, out1); \ + } + +#define TEST_EXEC(opcode,insn) \ + do { \ + puts(#insn); \ + test_##insn(-1, 0); \ + test_##insn(0, -1); \ + test_##insn(0x1234567890abcdef, 0xfedcba9876543210); \ + } while (0) + +#define INSNS \ + XTEST(b9f0,selr); \ + XTEST(b9e3,selgr); \ + XTEST(b9c0,selfhr); + +#define XTEST TEST_GENERATE +INSNS +#undef XTEST + +static void test_all_select() +{ +#define XTEST TEST_EXEC + INSNS +#undef XTEST +} +#undef INSNS +#undef TEST_GENERATE +#undef TEST_EXEC + + +/* -- Move right to left -- */ + +static void test_mvcrl(void *to, void *from, size_t len) +{ + len -= 1; + __asm__("lgr 0,%[len]\n\t" + ".insn sse,0xe50a00000000,%[to],%[from]\n\t" + : [to] "+Q" (*(struct { char c[len]; } *) to) + : [from] "Q" (*(struct { char c[len]; } *) from), + [len] "d" (len) + : ); +} + +static void test_all_mvcrl() +{ + static const char pattern[] = + "abcdefghijklmnopqrstuvwxyz-0123456789.ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + char buf[4 * sizeof(pattern) - 2]; + + test_mvcrl(buf, (char *) pattern, sizeof(pattern)); + test_mvcrl(buf + sizeof(pattern) - 1, buf, sizeof(pattern)); + test_mvcrl(buf + 2 * sizeof(pattern) - 2, buf, 2 * sizeof(pattern) - 1); + test_mvcrl(buf + 32, buf + 10, 63); + test_mvcrl(buf + 2, buf + 1, 256); + test_mvcrl(buf + 254, buf + 256, 2); + puts("mvcrl"); + for (int i = 0; i < 256; i += 64) { + printf("\t%.64s\n", buf + i); + } +} + + +int main() +{ + test_all_logical_insns(); + test_all_popcnt(); + test_all_select(); + test_all_mvcrl(); + return 0; +} diff --git a/none/tests/s390x/misc3.stderr.exp b/none/tests/s390x/misc3.stderr.exp new file mode 100644 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/s390x/misc3.stderr.exp @@ -0,0 +1,2 @@ + + diff --git a/none/tests/s390x/misc3.stdout.exp b/none/tests/s390x/misc3.stdout.exp new file mode 100644 index 0000000000..caaba49603 --- /dev/null +++ b/none/tests/s390x/misc3.stdout.exp @@ -0,0 +1,103 @@ +ncrk + 0000000000000000 0000000000000000 -> decaffee00000000 cc=0 + 0000000000000000 ffffffffffffffff -> decaffee00000000 cc=0 + ffffffffffffffff 0000000000000000 -> decaffeeffffffff cc=1 + ffffffffffffffff ffffffffffffffff -> decaffee00000000 cc=0 + 0012345678abcdef 0000000000000000 -> decaffee78abcdef cc=1 + 0012345678abcdef ffffffffffffffff -> decaffee00000000 cc=0 + 55555555aaaaaaaa aaaaaaaa55555555 -> decaffeeaaaaaaaa cc=1 +ncgrk + 0000000000000000 0000000000000000 -> 0000000000000000 cc=0 + 0000000000000000 ffffffffffffffff -> 0000000000000000 cc=0 + ffffffffffffffff 0000000000000000 -> ffffffffffffffff cc=1 + ffffffffffffffff ffffffffffffffff -> 0000000000000000 cc=0 + 0012345678abcdef 0000000000000000 -> 0012345678abcdef cc=1 + 0012345678abcdef ffffffffffffffff -> 0000000000000000 cc=0 + 55555555aaaaaaaa aaaaaaaa55555555 -> 55555555aaaaaaaa cc=1 +nnrk + 0000000000000000 0000000000000000 -> decaffeeffffffff cc=1 + 0000000000000000 ffffffffffffffff -> decaffeeffffffff cc=1 + ffffffffffffffff 0000000000000000 -> decaffeeffffffff cc=1 + ffffffffffffffff ffffffffffffffff -> decaffee00000000 cc=0 + 0012345678abcdef 0000000000000000 -> decaffeeffffffff cc=1 + 0012345678abcdef ffffffffffffffff -> decaffee87543210 cc=1 + 55555555aaaaaaaa aaaaaaaa55555555 -> decaffeeffffffff cc=1 +nngrk + 0000000000000000 0000000000000000 -> ffffffffffffffff cc=1 + 0000000000000000 ffffffffffffffff -> ffffffffffffffff cc=1 + ffffffffffffffff 0000000000000000 -> ffffffffffffffff cc=1 + ffffffffffffffff ffffffffffffffff -> 0000000000000000 cc=0 + 0012345678abcdef 0000000000000000 -> ffffffffffffffff cc=1 + 0012345678abcdef ffffffffffffffff -> ffedcba987543210 cc=1 + 55555555aaaaaaaa aaaaaaaa55555555 -> ffffffffffffffff cc=1 +nork + 0000000000000000 0000000000000000 -> decaffeeffffffff cc=1 + 0000000000000000 ffffffffffffffff -> decaffee00000000 cc=0 + ffffffffffffffff 0000000000000000 -> decaffee00000000 cc=0 + ffffffffffffffff ffffffffffffffff -> decaffee00000000 cc=0 + 0012345678abcdef 0000000000000000 -> decaffee87543210 cc=1 + 0012345678abcdef ffffffffffffffff -> decaffee00000000 cc=0 + 55555555aaaaaaaa aaaaaaaa55555555 -> decaffee00000000 cc=0 +nogrk + 0000000000000000 0000000000000000 -> ffffffffffffffff cc=1 + 0000000000000000 ffffffffffffffff -> 0000000000000000 cc=0 + ffffffffffffffff 0000000000000000 -> 0000000000000000 cc=0 + ffffffffffffffff ffffffffffffffff -> 0000000000000000 cc=0 + 0012345678abcdef 0000000000000000 -> ffedcba987543210 cc=1 + 0012345678abcdef ffffffffffffffff -> 0000000000000000 cc=0 + 55555555aaaaaaaa aaaaaaaa55555555 -> 0000000000000000 cc=0 +nxrk + 0000000000000000 0000000000000000 -> decaffeeffffffff cc=1 + 0000000000000000 ffffffffffffffff -> decaffee00000000 cc=0 + ffffffffffffffff 0000000000000000 -> decaffee00000000 cc=0 + ffffffffffffffff ffffffffffffffff -> decaffeeffffffff cc=1 + 0012345678abcdef 0000000000000000 -> decaffee87543210 cc=1 + 0012345678abcdef ffffffffffffffff -> decaffee78abcdef cc=1 + 55555555aaaaaaaa aaaaaaaa55555555 -> decaffee00000000 cc=0 +nxgrk + 0000000000000000 0000000000000000 -> ffffffffffffffff cc=1 + 0000000000000000 ffffffffffffffff -> 0000000000000000 cc=0 + ffffffffffffffff 0000000000000000 -> 0000000000000000 cc=0 + ffffffffffffffff ffffffffffffffff -> ffffffffffffffff cc=1 + 0012345678abcdef 0000000000000000 -> ffedcba987543210 cc=1 + 0012345678abcdef ffffffffffffffff -> 0012345678abcdef cc=1 + 55555555aaaaaaaa aaaaaaaa55555555 -> 0000000000000000 cc=0 +ocrk + 0000000000000000 0000000000000000 -> decaffeeffffffff cc=1 + 0000000000000000 ffffffffffffffff -> decaffee00000000 cc=0 + ffffffffffffffff 0000000000000000 -> decaffeeffffffff cc=1 + ffffffffffffffff ffffffffffffffff -> decaffeeffffffff cc=1 + 0012345678abcdef 0000000000000000 -> decaffeeffffffff cc=1 + 0012345678abcdef ffffffffffffffff -> decaffee78abcdef cc=1 + 55555555aaaaaaaa aaaaaaaa55555555 -> decaffeeaaaaaaaa cc=1 +ocgrk + 0000000000000000 0000000000000000 -> ffffffffffffffff cc=1 + 0000000000000000 ffffffffffffffff -> 0000000000000000 cc=0 + ffffffffffffffff 0000000000000000 -> ffffffffffffffff cc=1 + ffffffffffffffff ffffffffffffffff -> ffffffffffffffff cc=1 + 0012345678abcdef 0000000000000000 -> ffffffffffffffff cc=1 + 0012345678abcdef ffffffffffffffff -> 0012345678abcdef cc=1 + 55555555aaaaaaaa aaaaaaaa55555555 -> 55555555aaaaaaaa cc=1 +popcnt + 0000000000000000 -> 0 cc=0 + 0000000000000001 -> 1 cc=1 + 8000000000000000 -> 1 cc=1 + ffffffffffffffff -> 64 cc=1 + ff427e3800556bcd -> 33 cc=1 +selr + ffffffffffffffff 0000000000000000 -> 0cafebadffffffff 0badcafe00000000 + 0000000000000000 ffffffffffffffff -> 0cafebad00000000 0badcafeffffffff + 1234567890abcdef fedcba9876543210 -> 0cafebad90abcdef 0badcafe76543210 +selgr + ffffffffffffffff 0000000000000000 -> ffffffffffffffff 0000000000000000 + 0000000000000000 ffffffffffffffff -> 0000000000000000 ffffffffffffffff + 1234567890abcdef fedcba9876543210 -> 1234567890abcdef fedcba9876543210 +selfhr + ffffffffffffffff 0000000000000000 -> ffffffff0badcafe 000000000cafebad + 0000000000000000 ffffffffffffffff -> 000000000badcafe ffffffff0cafebad + 1234567890abcdef fedcba9876543210 -> 123456780badcafe fedcba980cafebad +mvcrl + abbcdefghijklmnopqrstuvwxyz-01234klmnopqrstuvwxyz-0123456789.ABC + DEFGHIJKLMNOPQRSTUVWXYZabcdefghi456789.ABCDEFGHIJKLMNOPQRSTUVWXY + Zabcdefghijklmnopqrstuvwxyz-0123456789.ABCDEFGHIJKLMNOPQRSTUVWXY + Zabcdefghijklmnopqrstuvwxyz-0123456789.ABCDEFGHIJKLMNOPQRSTUVWZ diff --git a/none/tests/s390x/misc3.vgtest b/none/tests/s390x/misc3.vgtest new file mode 100644 index 0000000000..d051a06bd2 --- /dev/null +++ b/none/tests/s390x/misc3.vgtest @@ -0,0 +1 @@ +prog: misc3