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