From: Florian Krohm Date: Mon, 22 Sep 2025 19:31:50 +0000 (+0000) Subject: s390: BFP testsuite tweaks X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7d9005f4912fa02eb48dcf578f40c035d8cc851b;p=thirdparty%2Fvalgrind.git s390: BFP testsuite tweaks Remove square root tests as they are covered by bfp-emit.pl Likewise for multiplication. Add tests for division. New file bfp-arith.c: Check condition code of arithmetic ops. Remove bfp-1.c Part of https://bugs.kde.org/show_bug.cgi?id=509572 --- diff --git a/.gitignore b/.gitignore index 00233d852f..fb3c9cc43b 100644 --- a/.gitignore +++ b/.gitignore @@ -2188,7 +2188,7 @@ /none/tests/s390x/rounding-1 /none/tests/s390x/rounding-2 /none/tests/s390x/rounding-3 -/none/tests/s390x/bfp-1 +/none/tests/s390x/bfp-arith /none/tests/s390x/bfp-2 /none/tests/s390x/bfp-3 /none/tests/s390x/bfp-4 diff --git a/none/tests/s390x/Makefile.am b/none/tests/s390x/Makefile.am index 8a373c4c88..234ed656ea 100644 --- a/none/tests/s390x/Makefile.am +++ b/none/tests/s390x/Makefile.am @@ -9,7 +9,7 @@ INSN_TESTS = clc clcle cvb cvd icm lpr lam_stam xc mvst add sub mul \ trto trot trtt tr tre cij cgij clij clgij crj cgrj clrj clgrj \ cs csg cds cdsg cu21 cu21_1 cu24 cu24_1 cu42 cu12 cu12_1 \ ex_sig ex_clone cu14 cu14_1 cu41 fpconv ecag fpext_warn \ - bfp-tdc rounding-1 rounding-2 rounding-3 bfp-1 \ + bfp-tdc rounding-1 rounding-2 rounding-3 bfp-arith \ bfp-2 bfp-3 bfp-4 srnm srnmb comp-1 comp-2 exrl tmll tm stmg \ ex clst mvc test_fork test_sig rounding-6 rxsbg popcnt \ high-word traps \ diff --git a/none/tests/s390x/bfp-1.c b/none/tests/s390x/bfp-1.c deleted file mode 100644 index 2cf558e241..0000000000 --- a/none/tests/s390x/bfp-1.c +++ /dev/null @@ -1,93 +0,0 @@ -#include - -/* Simple test to see that basic operators are mapped - correctly. Uses default rounding mode. */ - -volatile double d1, d2; -volatile float f1, f2; - -void fadd8(void) -{ - printf("%f + %f = %f\n", d1, d2, d1 + d2); -} - -void fsub8(void) -{ - printf("%f - %f = %f\n", d1, d2, d1 - d2); -} - -void fmul8(void) -{ - printf("%f * %f = %f\n", d1, d2, d1 * d2); -} - -void fdiv8(void) -{ - printf("%f / %f = %f\n", d1, d2, d1 / d2); -} - -void fadd4(void) -{ - register float r1 asm("f1") = f1; - register float r2 asm("f2") = f2; - - __asm__ volatile ("aebr %[r1],%[r2]\n\t" - : [r1] "+f"(r1) - : [r2] "f"(r2) : "cc"); - printf("%f + %f = %f\n", f1, f2, r1); -} - -void fsub4(void) -{ - register float r1 asm("f1") = f1; - register float r2 asm("f2") = f2; - - __asm__ volatile ("sebr %[r1],%[r2]\n\t" - : [r1] "+f"(r1) - : [r2] "f"(r2) : "cc"); - printf("%f - %f = %f\n", f1, f2, r1); -} - -void fmul4(void) -{ - register float r1 asm("f1") = f1; - register float r2 asm("f2") = f2; - - __asm__ volatile ("meebr %[r1],%[r2]\n\t" - : [r1] "+f"(r1) - : [r2] "f"(r2) : "cc"); - printf("%f * %f = %f\n", f1, f2, r1); -} - -void fdiv4(void) -{ - register float r1 asm("f1") = f1; - register float r2 asm("f2") = f2; - - __asm__ volatile ("debr %[r1],%[r2]\n\t" - : [r1] "+f"(r1) - : [r2] "f"(r2) : "cc"); - printf("%f / %f = %f\n", f1, f2, r1); -} - - -int main() -{ - printf("double arithmetic\n"); - d1 = 10.5; - d2 = 1.25; - fadd8(); - fsub8(); - fmul8(); - fdiv8(); - - printf("float arithmetic\n"); - f1 = 10.5f; - f2 = 1.25f; - fadd4(); - fsub4(); - fmul4(); - fdiv4(); - - return 0; -} diff --git a/none/tests/s390x/bfp-1.stdout.exp b/none/tests/s390x/bfp-1.stdout.exp deleted file mode 100644 index 023c598648..0000000000 --- a/none/tests/s390x/bfp-1.stdout.exp +++ /dev/null @@ -1,10 +0,0 @@ -double arithmetic -10.500000 + 1.250000 = 11.750000 -10.500000 - 1.250000 = 9.250000 -10.500000 * 1.250000 = 13.125000 -10.500000 / 1.250000 = 8.400000 -float arithmetic -10.500000 + 1.250000 = 11.750000 -10.500000 - 1.250000 = 9.250000 -10.500000 * 1.250000 = 13.125000 -10.500000 / 1.250000 = 8.400000 diff --git a/none/tests/s390x/bfp-1.vgtest b/none/tests/s390x/bfp-1.vgtest deleted file mode 100644 index 9d67c4abbf..0000000000 --- a/none/tests/s390x/bfp-1.vgtest +++ /dev/null @@ -1 +0,0 @@ -prog: bfp-1 diff --git a/none/tests/s390x/bfp-2.c b/none/tests/s390x/bfp-2.c index b8109ba889..7fbc2cbf3b 100644 --- a/none/tests/s390x/bfp-2.c +++ b/none/tests/s390x/bfp-2.c @@ -1,28 +1,11 @@ #include /* Test various BFP ops: - - square root - load negative - load positive - load complement */ -void sqebr(float in) -{ - float out; - - __asm__ volatile("sqebr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in)); - printf("sqebr %f -> %f\n", in, out); -} - -void sqdbr(double in) -{ - double out; - - __asm__ volatile("sqdbr %[out],%[in]" : [out]"=f"(out) : [in]"f"(in)); - printf("sqdbr %f -> %f\n", in, out); -} - void lnebr(float in) { float out; @@ -73,10 +56,6 @@ void lcdbr(double in) int main(void) { - // square root - sqebr(121.0f); // 4 byte values - sqdbr(144.0); // 8 bytes values - // load negative lnebr(-2.5f); // 4 byte values lnebr(12.5f); // 4 byte values diff --git a/none/tests/s390x/bfp-2.stdout.exp b/none/tests/s390x/bfp-2.stdout.exp index 074180a279..d2bc54136b 100644 --- a/none/tests/s390x/bfp-2.stdout.exp +++ b/none/tests/s390x/bfp-2.stdout.exp @@ -1,5 +1,3 @@ -sqebr 121.000000 -> 11.000000 -sqdbr 144.000000 -> 12.000000 lnebr -2.500000 -> -2.500000 lnebr 12.500000 -> -12.500000 lndbr -0.500000 -> -0.500000 diff --git a/none/tests/s390x/bfp-3.c b/none/tests/s390x/bfp-3.c index 857e1c83ff..d7d66f2632 100644 --- a/none/tests/s390x/bfp-3.c +++ b/none/tests/s390x/bfp-3.c @@ -1,7 +1,9 @@ #include +#include /* Test BFP multiply and add/sub 32/64-bit. There are no such insns - working with 128-bit data */ + working with 128-bit data. + Also test division making sure operand order is preserved. */ void maebr(float v1, float v2, float v3) { @@ -39,8 +41,40 @@ void msdbr(double v1, double v2, double v3) printf("msdbr %f * %f - %f -> %f\n", v2, v3, v1, r1); } +static void debr(float v1, float v2) +{ + float r1 = v1; + + __asm__ volatile("debr %[r1],%[r2]" + : [r1]"+f"(v1) + : [r2]"f"(v2)); + printf("debr %f / %f -> %f\n", r1, v2, v1); +} + +static void ddbr(double v1, double v2) +{ + double r1 = v1; + + __asm__ volatile("ddbr %[r1],%[r2]" + : [r1]"+f"(v1) + : [r2]"f"(v2)); + printf("ddbr %f / %f -> %f\n", r1, v2, v1); +} + +static void dxbr(long double v1, long double v2) +{ + long double r1 = v1; + + __asm__ volatile("dxbr %[r1],%[r2]" + : [r1]"+f"(v1) + : [r2]"f"(v2)); + printf("dxbr %Lf / %Lf -> %Lf\n", r1, v2, v1); +} + int main(void) { + assert(sizeof(long double) == 16); + // multiply and add maebr(10.5f, 20.25, 3.0); // 4 byte values madbr(-10.5, 42.75, -2.0); // 8 byte values @@ -49,5 +83,10 @@ int main(void) msebr(10.5f, 20.25, 3.0); // 4 byte values msdbr(-10.5, 42.75, -2.0); // 8 byte values + /* Just checking that the operand order is not mixed up. */ + debr(10.0f, 2.0f); + ddbr(10.0, 2.0); + dxbr(10.0L, 2.0L); + return 0; } diff --git a/none/tests/s390x/bfp-3.stdout.exp b/none/tests/s390x/bfp-3.stdout.exp index bd9e5c49c3..b1eb0a72e8 100644 --- a/none/tests/s390x/bfp-3.stdout.exp +++ b/none/tests/s390x/bfp-3.stdout.exp @@ -2,3 +2,6 @@ maebr 20.250000 * 3.000000 + 10.500000 -> 71.250000 madbr 42.750000 * -2.000000 + -10.500000 -> -96.000000 msebr 20.250000 * 3.000000 - 10.500000 -> 50.250000 msdbr 42.750000 * -2.000000 - -10.500000 -> -75.000000 +debr 10.000000 / 2.000000 -> 5.000000 +ddbr 10.000000 / 2.000000 -> 5.000000 +dxbr 10.000000 / 2.000000 -> 5.000000 diff --git a/none/tests/s390x/bfp-arith.c b/none/tests/s390x/bfp-arith.c new file mode 100644 index 0000000000..e69b7cf027 --- /dev/null +++ b/none/tests/s390x/bfp-arith.c @@ -0,0 +1,99 @@ +#include +#include +#include + +/* Making sure that the condition code of arithmetic BFP ops is + set correctly. + + Multiply and square root are covered by bfp-emit.pl +*/ + +volatile int cc; + +#define TEST_INSN(insn, fmt, opnd1, opnd2) \ + do { \ + __typeof__(opnd1) v1 = opnd1; \ + __typeof__(opnd2) v2 = opnd2; \ + __asm__ volatile(insn " %[r1],%[r2]\n\t" \ + "ipm %[psw]\n\t" \ + "srl %[psw],28\n\t" \ + : [psw]"=d"(cc) \ + : [r1]"f"(v1), [r2]"f"(v2) \ + : "cc"); \ + printf("%s r1 = "fmt" r2 = "fmt" --> cc = %d\n", \ + insn, opnd1, opnd2, cc); \ + } while (0) + + +static void aebr(float r1, float r2) +{ + TEST_INSN("aebr", "%g", r1, r2); +} + +static void adbr(double r1, double r2) +{ + TEST_INSN("adbr", "%g", r1, r2); +} + +static void axbr(long double r1, long double r2) +{ + TEST_INSN("axbr", "%Lg", r1, r2); +} + +static void sebr(float r1, float r2) +{ + TEST_INSN("sebr", "%g", r1, r2); +} + +static void sdbr(double r1, double r2) +{ + TEST_INSN("sdbr", "%g", r1, r2); +} + +static void sxbr(long double r1, long double r2) +{ + TEST_INSN("sxbr", "%Lg", r1, r2); +} + +int main() +{ + assert(sizeof(long double) == 16); // ensure 128 bit wide + + printf("32-bit ADD\n"); + aebr(2.5f, -2.5f); + aebr(4.75f, -6.25f); + aebr(-2.5f, 8.5f); + aebr(NAN, 0); + + printf("64-bit ADD\n"); + adbr(2.5, -2.5); + adbr(4.75, -6.25); + adbr(-2.5, 8.5); + adbr(NAN, 0); + + printf("128-bit ADD\n"); + axbr(2.5L, -2.5L); + axbr(4.75L, -6.25L); + axbr(-2.5L, 8.5L); + axbr(NAN, 0); + + printf("32-bit SUBTRACT\n"); + sebr(2.5f, 2.5f); + sebr(4.75f, 6.25f); + sebr(8.5f, 2.5f); + sebr(NAN, 0); + + printf("64-bit SUBTRACT\n"); + sdbr(2.5, 2.5); + sdbr(4.75, 6.25); + sdbr(8.5, 2.5f); + sdbr(NAN, 0); + + printf("128-bit SUBTRACT\n"); + sxbr(2.5f, 2.5); + sxbr(4.75f, 6.25); + sxbr(8.5f, 2.5); + sxbr(NAN, 0); + + return 0; +} diff --git a/none/tests/s390x/bfp-1.stderr.exp b/none/tests/s390x/bfp-arith.stderr.exp similarity index 100% rename from none/tests/s390x/bfp-1.stderr.exp rename to none/tests/s390x/bfp-arith.stderr.exp diff --git a/none/tests/s390x/bfp-arith.stdout.exp b/none/tests/s390x/bfp-arith.stdout.exp new file mode 100644 index 0000000000..237b5b3c82 --- /dev/null +++ b/none/tests/s390x/bfp-arith.stdout.exp @@ -0,0 +1,30 @@ +32-bit ADD +aebr r1 = 2.5 r2 = -2.5 --> cc = 0 +aebr r1 = 4.75 r2 = -6.25 --> cc = 1 +aebr r1 = -2.5 r2 = 8.5 --> cc = 2 +aebr r1 = nan r2 = 0 --> cc = 3 +64-bit ADD +adbr r1 = 2.5 r2 = -2.5 --> cc = 0 +adbr r1 = 4.75 r2 = -6.25 --> cc = 1 +adbr r1 = -2.5 r2 = 8.5 --> cc = 2 +adbr r1 = nan r2 = 0 --> cc = 3 +128-bit ADD +axbr r1 = 2.5 r2 = -2.5 --> cc = 0 +axbr r1 = 4.75 r2 = -6.25 --> cc = 1 +axbr r1 = -2.5 r2 = 8.5 --> cc = 2 +axbr r1 = nan r2 = 0 --> cc = 3 +32-bit SUBTRACT +sebr r1 = 2.5 r2 = 2.5 --> cc = 0 +sebr r1 = 4.75 r2 = 6.25 --> cc = 1 +sebr r1 = 8.5 r2 = 2.5 --> cc = 2 +sebr r1 = nan r2 = 0 --> cc = 3 +64-bit SUBTRACT +sdbr r1 = 2.5 r2 = 2.5 --> cc = 0 +sdbr r1 = 4.75 r2 = 6.25 --> cc = 1 +sdbr r1 = 8.5 r2 = 2.5 --> cc = 2 +sdbr r1 = nan r2 = 0 --> cc = 3 +128-bit SUBTRACT +sxbr r1 = 2.5 r2 = 2.5 --> cc = 0 +sxbr r1 = 4.75 r2 = 6.25 --> cc = 1 +sxbr r1 = 8.5 r2 = 2.5 --> cc = 2 +sxbr r1 = nan r2 = 0 --> cc = 3 diff --git a/none/tests/s390x/bfp-arith.vgtest b/none/tests/s390x/bfp-arith.vgtest new file mode 100644 index 0000000000..19b58a066f --- /dev/null +++ b/none/tests/s390x/bfp-arith.vgtest @@ -0,0 +1 @@ +prog: bfp-arith