1#include <stdint.h> 2#include <stdio.h> 3#include "mtest.h" 4 5static struct ddd_d t[] = { 6#include "sanity/fma.h" 7#include "special/fma.h" 8}; 9 10int main(void) 11{ 12 #pragma STDC FENV_ACCESS ON 13 double y; 14 float d; 15 int e, i, err = 0; 16 struct ddd_d *p; 17 18 for (i = 0; i < sizeof t/sizeof *t; i++) { 19 p = t + i; 20 21 if (p->r < 0) 22 continue; 23 fesetround(p->r); 24 feclearexcept(FE_ALL_EXCEPT); 25 y = fma(p->x, p->x2, p->x3); 26 e = fetestexcept(INEXACT|INVALID|DIVBYZERO|UNDERFLOW|OVERFLOW); 27 28 /* do not check inexact by default */ 29#if defined CHECK_INEXACT || defined CHECK_INEXACT_OMISSION 30 if (!checkexceptall(e, p->e, p->r)) { 31#else 32 if (!checkexceptall(e|INEXACT, p->e|INEXACT, p->r)) { 33#endif 34 printf("%s:%d: bad fp exception: %s fma(%a,%a,%a)=%a, want %s", 35 p->file, p->line, rstr(p->r), p->x, p->x2, p->x3, p->y, estr(p->e)); 36 printf(" got %s\n", estr(e)); 37 err++; 38 } 39 d = ulperr(y, p->y, p->dy); 40 if (!checkcr(y, p->y, p->r)) { 41 printf("%s:%d: %s fma(%a,%a,%a) want %a got %a ulperr %.3f = %a + %a\n", 42 p->file, p->line, rstr(p->r), p->x, p->x2, p->x3, p->y, y, d, d-p->dy, p->dy); 43 err++; 44 } 45 } 46 return !!err; 47} 48