]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
s390: BFP testsuite tweaks
authorFlorian Krohm <flo2030@eich-krohm.de>
Mon, 22 Sep 2025 19:31:50 +0000 (19:31 +0000)
committerFlorian Krohm <flo2030@eich-krohm.de>
Mon, 22 Sep 2025 19:33:02 +0000 (19:33 +0000)
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

13 files changed:
.gitignore
none/tests/s390x/Makefile.am
none/tests/s390x/bfp-1.c [deleted file]
none/tests/s390x/bfp-1.stdout.exp [deleted file]
none/tests/s390x/bfp-1.vgtest [deleted file]
none/tests/s390x/bfp-2.c
none/tests/s390x/bfp-2.stdout.exp
none/tests/s390x/bfp-3.c
none/tests/s390x/bfp-3.stdout.exp
none/tests/s390x/bfp-arith.c [new file with mode: 0644]
none/tests/s390x/bfp-arith.stderr.exp [moved from none/tests/s390x/bfp-1.stderr.exp with 100% similarity]
none/tests/s390x/bfp-arith.stdout.exp [new file with mode: 0644]
none/tests/s390x/bfp-arith.vgtest [new file with mode: 0644]

index 00233d852f8d92e5c1d6175958cc00fca7fa7d8a..fb3c9cc43bd0fc724c1a157f8330f25da9cf2ce5 100644 (file)
 /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
index 8a373c4c8800def25dc6a7562ba00c3f1cf46aa1..234ed656ea06b539d20f7952b27226f76e5880ad 100644 (file)
@@ -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 (file)
index 2cf558e..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-#include <stdio.h>
-
-/* 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 (file)
index 023c598..0000000
+++ /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 (file)
index 9d67c4a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-prog: bfp-1
index b8109ba8899bfc382a11be7cbf576d083c2de5e2..7fbc2cbf3be86d336994b21091b5f6499036eb59 100644 (file)
@@ -1,28 +1,11 @@
 #include <stdio.h>
 
 /* 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
index 074180a279d1dbfd0a389d812fd687c377150bdf..d2bc54136b716d4ff37f70a2453515333563f6a2 100644 (file)
@@ -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
index 857e1c83ff8c47563f0969a5f292ce638603d58c..d7d66f263287cba6897110845e2b7e0624c75f9e 100644 (file)
@@ -1,7 +1,9 @@
 #include <stdio.h>
+#include <assert.h>
 
 /* 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;
 }
index bd9e5c49c30654cff60039b795e4c40ff99b611c..b1eb0a72e859a136440d8d837818b006291e8652 100644 (file)
@@ -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 (file)
index 0000000..e69b7cf
--- /dev/null
@@ -0,0 +1,99 @@
+#include <stdio.h>
+#include <math.h>
+#include <assert.h>
+
+/* 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-arith.stdout.exp b/none/tests/s390x/bfp-arith.stdout.exp
new file mode 100644 (file)
index 0000000..237b5b3
--- /dev/null
@@ -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 (file)
index 0000000..19b58a0
--- /dev/null
@@ -0,0 +1 @@
+prog: bfp-arith