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