#include <tgmath.h>
#include <gmp.h>
#include <mpfr.h>
#include <stdio.h>
#include <stdbool.h>

char *name = "FastMath dist4";

double f_if(float d1, float d2, float d3, float d4) {
        float r12656 = d1;
        float r12657 = d2;
        float r12658 = r12656 * r12657;
        float r12659 = d3;
        float r12660 = r12656 * r12659;
        float r12661 = r12658 - r12660;
        float r12662 = d4;
        float r12663 = r12662 * r12656;
        float r12664 = r12661 + r12663;
        float r12665 = r12656 * r12656;
        float r12666 = r12664 - r12665;
        return r12666;
}

double f_id(double d1, double d2, double d3, double d4) {
        double r12667 = d1;
        double r12668 = d2;
        double r12669 = r12667 * r12668;
        double r12670 = d3;
        double r12671 = r12667 * r12670;
        double r12672 = r12669 - r12671;
        double r12673 = d4;
        double r12674 = r12673 * r12667;
        double r12675 = r12672 + r12674;
        double r12676 = r12667 * r12667;
        double r12677 = r12675 - r12676;
        return r12677;
}


double f_of(float d1, float d2, float d3, float d4) {
        float r12678 = d1;
        float r12679 = d2;
        float r12680 = d3;
        float r12681 = r12678 * r12680;
        float r12682 = -r12681;
        float r12683 = fma(r12678, r12679, r12682);
        float r12684 = d4;
        float r12685 = r12684 * r12678;
        float r12686 = r12683 + r12685;
        float r12687 = r12678 * r12678;
        float r12688 = r12686 - r12687;
        return r12688;
}

double f_od(double d1, double d2, double d3, double d4) {
        double r12689 = d1;
        double r12690 = d2;
        double r12691 = d3;
        double r12692 = r12689 * r12691;
        double r12693 = -r12692;
        double r12694 = fma(r12689, r12690, r12693);
        double r12695 = d4;
        double r12696 = r12695 * r12689;
        double r12697 = r12694 + r12696;
        double r12698 = r12689 * r12689;
        double r12699 = r12697 - r12698;
        return r12699;
}

void mpfr_fmod2(mpfr_t r, mpfr_t n, mpfr_t d, mpfr_rnd_t rmd) {
        mpfr_fmod(r, n, d, rmd);
        if (mpfr_cmp_ui(r, 0) < 0) mpfr_add(r, r, d, rmd);
}


static mpfr_t r12700, r12701, r12702, r12703, r12704, r12705, r12706, r12707, r12708, r12709, r12710;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r12700);
        mpfr_init(r12701);
        mpfr_init(r12702);
        mpfr_init(r12703);
        mpfr_init(r12704);
        mpfr_init(r12705);
        mpfr_init(r12706);
        mpfr_init(r12707);
        mpfr_init(r12708);
        mpfr_init(r12709);
        mpfr_init(r12710);
}

double f_im(double d1, double d2, double d3, double d4) {
        mpfr_set_d(r12700, d1, MPFR_RNDN);
        mpfr_set_d(r12701, d2, MPFR_RNDN);
        mpfr_mul(r12702, r12700, r12701, MPFR_RNDN);
        mpfr_set_d(r12703, d3, MPFR_RNDN);
        mpfr_mul(r12704, r12700, r12703, MPFR_RNDN);
        mpfr_sub(r12705, r12702, r12704, MPFR_RNDN);
        mpfr_set_d(r12706, d4, MPFR_RNDN);
        mpfr_mul(r12707, r12706, r12700, MPFR_RNDN);
        mpfr_add(r12708, r12705, r12707, MPFR_RNDN);
        mpfr_mul(r12709, r12700, r12700, MPFR_RNDN);
        mpfr_sub(r12710, r12708, r12709, MPFR_RNDN);
        return mpfr_get_d(r12710, MPFR_RNDN);
}

static mpfr_t r12711, r12712, r12713, r12714, r12715, r12716, r12717, r12718, r12719, r12720, r12721;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r12711);
        mpfr_init(r12712);
        mpfr_init(r12713);
        mpfr_init(r12714);
        mpfr_init(r12715);
        mpfr_init(r12716);
        mpfr_init(r12717);
        mpfr_init(r12718);
        mpfr_init(r12719);
        mpfr_init(r12720);
        mpfr_init(r12721);
}

double f_fm(double d1, double d2, double d3, double d4) {
        mpfr_set_d(r12711, d1, MPFR_RNDN);
        mpfr_set_d(r12712, d2, MPFR_RNDN);
        mpfr_set_d(r12713, d3, MPFR_RNDN);
        mpfr_mul(r12714, r12711, r12713, MPFR_RNDN);
        mpfr_neg(r12715, r12714, MPFR_RNDN);
        mpfr_fma(r12716, r12711, r12712, r12715, MPFR_RNDN);
        mpfr_set_d(r12717, d4, MPFR_RNDN);
        mpfr_mul(r12718, r12717, r12711, MPFR_RNDN);
        mpfr_add(r12719, r12716, r12718, MPFR_RNDN);
        mpfr_mul(r12720, r12711, r12711, MPFR_RNDN);
        mpfr_sub(r12721, r12719, r12720, MPFR_RNDN);
        return mpfr_get_d(r12721, MPFR_RNDN);
}

static mpfr_t r12722, r12723, r12724, r12725, r12726, r12727, r12728, r12729, r12730, r12731, r12732;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r12722);
        mpfr_init(r12723);
        mpfr_init(r12724);
        mpfr_init(r12725);
        mpfr_init(r12726);
        mpfr_init(r12727);
        mpfr_init(r12728);
        mpfr_init(r12729);
        mpfr_init(r12730);
        mpfr_init(r12731);
        mpfr_init(r12732);
}

double f_dm(double d1, double d2, double d3, double d4) {
        mpfr_set_d(r12722, d1, MPFR_RNDN);
        mpfr_set_d(r12723, d2, MPFR_RNDN);
        mpfr_set_d(r12724, d3, MPFR_RNDN);
        mpfr_mul(r12725, r12722, r12724, MPFR_RNDN);
        mpfr_neg(r12726, r12725, MPFR_RNDN);
        mpfr_fma(r12727, r12722, r12723, r12726, MPFR_RNDN);
        mpfr_set_d(r12728, d4, MPFR_RNDN);
        mpfr_mul(r12729, r12728, r12722, MPFR_RNDN);
        mpfr_add(r12730, r12727, r12729, MPFR_RNDN);
        mpfr_mul(r12731, r12722, r12722, MPFR_RNDN);
        mpfr_sub(r12732, r12730, r12731, MPFR_RNDN);
        return mpfr_get_d(r12732, MPFR_RNDN);
}

