xref: /openbmc/qemu/tests/tcg/multiarch/fnmsub.c (revision 5a28fa5ba17254d0398a854657b47af3096bd86a)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #include <stdio.h>
4 #include <math.h>
5 #include <fenv.h>
6 
7 union U {
8   double d;
9   unsigned long long l;
10 };
11 
12 union U x = { .l = 0x4ff0000000000000ULL };
13 union U y = { .l = 0x2ff0000000000000ULL };
14 union U r;
15 
16 int main()
17 {
18 #ifdef FE_DOWNWARD
19     fesetround(FE_DOWNWARD);
20 
21 #if defined(__loongarch__)
22     asm("fnmsub.d %0, %1, %1, %2" : "=f"(r.d) : "f"(x.d), "f"(y.d));
23 #elif defined(__powerpc64__)
24     asm("fnmsub %0,%1,%1,%2" : "=f"(r.d) : "f"(x.d), "f"(y.d));
25 #elif defined(__s390x__) && 0 /* need -march=z14 */
26     asm("vfnms %0,%1,%1,%2,0,3" : "=f"(r.d) : "f"(x.d), "f"(y.d));
27 #else
28     r.d = -fma(x.d, x.d, -y.d);
29 #endif
30 
31     if (r.l != 0xdfefffffffffffffULL) {
32         printf("r = %.18a (%016llx)\n", r.d, r.l);
33         return 1;
34     }
35 #endif
36     return 0;
37 }
38