/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
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 \
+++ /dev/null
-#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;
-}
+++ /dev/null
-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
+++ /dev/null
-prog: bfp-1
#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;
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
-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
#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)
{
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
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;
}
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
--- /dev/null
+#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;
+}
--- /dev/null
+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
--- /dev/null
+prog: bfp-arith