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

char *name = "simple fma test";

double f_if(float x, float y, float z) {
        float r8582 = x;
        float r8583 = y;
        float r8584 = z;
        float r8585 = fma(r8582, r8583, r8584);
        float r8586 = 1.0f;
        float r8587 = r8582 * r8583;
        float r8588 = r8587 + r8584;
        float r8589 = r8586 + r8588;
        float r8590 = r8585 - r8589;
        return r8590;
}

double f_id(double x, double y, double z) {
        double r8591 = x;
        double r8592 = y;
        double r8593 = z;
        double r8594 = fma(r8591, r8592, r8593);
        double r8595 = 1.0;
        double r8596 = r8591 * r8592;
        double r8597 = r8596 + r8593;
        double r8598 = r8595 + r8597;
        double r8599 = r8594 - r8598;
        return r8599;
}


double f_of(float x, float y, float z) {
        float r8600 = x;
        float r8601 = y;
        float r8602 = z;
        float r8603 = fma(r8600, r8601, r8602);
        float r8604 = r8600 * r8601;
        float r8605 = r8603 - r8604;
        float r8606 = r8605 - r8602;
        float r8607 = 1.0f;
        float r8608 = r8606 - r8607;
        return r8608;
}

double f_od(double x, double y, double z) {
        double r8609 = x;
        double r8610 = y;
        double r8611 = z;
        double r8612 = fma(r8609, r8610, r8611);
        double r8613 = r8609 * r8610;
        double r8614 = r8612 - r8613;
        double r8615 = r8614 - r8611;
        double r8616 = 1.0;
        double r8617 = r8615 - r8616;
        return r8617;
}

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 r8618, r8619, r8620, r8621, r8622, r8623, r8624, r8625, r8626;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(2384);
        mpfr_init(r8618);
        mpfr_init(r8619);
        mpfr_init(r8620);
        mpfr_init(r8621);
        mpfr_init_set_str(r8622, "1", 10, MPFR_RNDN);
        mpfr_init(r8623);
        mpfr_init(r8624);
        mpfr_init(r8625);
        mpfr_init(r8626);
}

double f_im(double x, double y, double z) {
        mpfr_set_d(r8618, x, MPFR_RNDN);
        mpfr_set_d(r8619, y, MPFR_RNDN);
        mpfr_set_d(r8620, z, MPFR_RNDN);
        mpfr_fma(r8621, r8618, r8619, r8620, MPFR_RNDN);
        ;
        mpfr_mul(r8623, r8618, r8619, MPFR_RNDN);
        mpfr_add(r8624, r8623, r8620, MPFR_RNDN);
        mpfr_add(r8625, r8622, r8624, MPFR_RNDN);
        mpfr_sub(r8626, r8621, r8625, MPFR_RNDN);
        return mpfr_get_d(r8626, MPFR_RNDN);
}

static mpfr_t r8627, r8628, r8629, r8630, r8631, r8632, r8633, r8634, r8635;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(2384);
        mpfr_init(r8627);
        mpfr_init(r8628);
        mpfr_init(r8629);
        mpfr_init(r8630);
        mpfr_init(r8631);
        mpfr_init(r8632);
        mpfr_init(r8633);
        mpfr_init_set_str(r8634, "1", 10, MPFR_RNDN);
        mpfr_init(r8635);
}

double f_fm(double x, double y, double z) {
        mpfr_set_d(r8627, x, MPFR_RNDN);
        mpfr_set_d(r8628, y, MPFR_RNDN);
        mpfr_set_d(r8629, z, MPFR_RNDN);
        mpfr_fma(r8630, r8627, r8628, r8629, MPFR_RNDN);
        mpfr_mul(r8631, r8627, r8628, MPFR_RNDN);
        mpfr_sub(r8632, r8630, r8631, MPFR_RNDN);
        mpfr_sub(r8633, r8632, r8629, MPFR_RNDN);
        ;
        mpfr_sub(r8635, r8633, r8634, MPFR_RNDN);
        return mpfr_get_d(r8635, MPFR_RNDN);
}

static mpfr_t r8636, r8637, r8638, r8639, r8640, r8641, r8642, r8643, r8644;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(2384);
        mpfr_init(r8636);
        mpfr_init(r8637);
        mpfr_init(r8638);
        mpfr_init(r8639);
        mpfr_init(r8640);
        mpfr_init(r8641);
        mpfr_init(r8642);
        mpfr_init_set_str(r8643, "1", 10, MPFR_RNDN);
        mpfr_init(r8644);
}

double f_dm(double x, double y, double z) {
        mpfr_set_d(r8636, x, MPFR_RNDN);
        mpfr_set_d(r8637, y, MPFR_RNDN);
        mpfr_set_d(r8638, z, MPFR_RNDN);
        mpfr_fma(r8639, r8636, r8637, r8638, MPFR_RNDN);
        mpfr_mul(r8640, r8636, r8637, MPFR_RNDN);
        mpfr_sub(r8641, r8639, r8640, MPFR_RNDN);
        mpfr_sub(r8642, r8641, r8638, MPFR_RNDN);
        ;
        mpfr_sub(r8644, r8642, r8643, MPFR_RNDN);
        return mpfr_get_d(r8644, MPFR_RNDN);
}

