| 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 | } |