+int mpfmaf(struct t *t)
+{
+ int tn;
+ int r = rmap(t->r);
+ MPFR_DECL_INIT(mx, 24);
+ MPFR_DECL_INIT(mx2, 24);
+ MPFR_DECL_INIT(mx3, 24);
+ MPFR_DECL_INIT(my, 128);
+
+ mpsetupf();
+ mpfr_clear_flags();
+ mpfr_set_flt(mx, t->x, MPFR_RNDN);
+ mpfr_set_flt(mx2, t->x2, MPFR_RNDN);
+ mpfr_set_flt(mx3, t->x3, MPFR_RNDN);
+ tn = mpfr_fma(my, mx, mx2, mx3, r);
+ genf(t, my, tn, r);
+ if ((t->e & INEXACT) && nextafterf(t->y, 0) == 0) {
+ mpfr_set_emin(-(1<<20));
+ tn = mpfr_fma(my, mx, mx2, mx3, r);
+ mpfr_mul_2si(my, my, 149, MPFR_RNDN);
+ t->dy = scalbnl(t->y, 149) - mpfr_get_ld(my, r);
+ mpfr_set_emin(-148);
+ }
+ return 0;
+}
+
+int mpfmal(struct t *t)
+{
+#if LDBL_MANT_DIG == 53
+ return mpfma(t);
+#elif LDBL_MANT_DIG == 64
+ int tn;
+ int r = rmap(t->r);
+ MPFR_DECL_INIT(mx, 64);
+ MPFR_DECL_INIT(mx2, 64);
+ MPFR_DECL_INIT(mx3, 64);
+ MPFR_DECL_INIT(my, 128);
+
+ mpsetupl();
+ mpfr_clear_flags();
+ mpfr_set_ld(mx, t->x, MPFR_RNDN);
+ mpfr_set_ld(mx2, t->x2, MPFR_RNDN);
+ mpfr_set_ld(mx3, t->x3, MPFR_RNDN);
+ tn = mpfr_fma(my, mx, mx2, mx3, r);
+ genl(t, my, tn, r);
+ if ((t->e & INEXACT) && nextafterl(t->y, 0) == 0) {
+ mpfr_set_emin(-(1<<20));
+ tn = mpfr_fma(my, mx, mx2, mx3, r);
+ mpfr_mul_2si(my, my, 16445, MPFR_RNDN);
+ t->dy = scalbnl(t->y, 16445) - mpfr_get_ld(my, r);
+ mpfr_set_emin(-16444);
+ }
+ return 0;
+#else
+ return -1;
+#endif
+}
+
+int mpjn(struct t *t) { mpbessel_n = t->i; return mpd1(t, wrap_jn); }
+int mpjnf(struct t *t) { mpbessel_n = t->i; return mpf1(t, wrap_jn); }
+int mpjnl(struct t *t) { mpbessel_n = t->i; return mpl1(t, wrap_jn); }
+int mpyn(struct t *t) { mpbessel_n = t->i; return mpd1(t, wrap_yn); }
+int mpynf(struct t *t) { mpbessel_n = t->i; return mpf1(t, wrap_yn); }
+int mpynl(struct t *t) { mpbessel_n = t->i; return mpl1(t, wrap_yn); }
+