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