#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 r27998 = d1;
        float r27999 = d2;
        float r28000 = r27998 * r27999;
        float r28001 = d3;
        float r28002 = r27998 * r28001;
        float r28003 = r28000 - r28002;
        float r28004 = d4;
        float r28005 = r28004 * r27998;
        float r28006 = r28003 + r28005;
        float r28007 = r27998 * r27998;
        float r28008 = r28006 - r28007;
        return r28008;
}

double f_id(double d1, double d2, double d3, double d4) {
        double r28009 = d1;
        double r28010 = d2;
        double r28011 = r28009 * r28010;
        double r28012 = d3;
        double r28013 = r28009 * r28012;
        double r28014 = r28011 - r28013;
        double r28015 = d4;
        double r28016 = r28015 * r28009;
        double r28017 = r28014 + r28016;
        double r28018 = r28009 * r28009;
        double r28019 = r28017 - r28018;
        return r28019;
}


double f_of(float d1, float d2, float d3, float d4) {
        float r28020 = d1;
        float r28021 = d4;
        float r28022 = r28021 - r28020;
        float r28023 = d2;
        float r28024 = d3;
        float r28025 = r28023 - r28024;
        float r28026 = r28022 + r28025;
        float r28027 = r28020 * r28026;
        return r28027;
}

double f_od(double d1, double d2, double d3, double d4) {
        double r28028 = d1;
        double r28029 = d4;
        double r28030 = r28029 - r28028;
        double r28031 = d2;
        double r28032 = d3;
        double r28033 = r28031 - r28032;
        double r28034 = r28030 + r28033;
        double r28035 = r28028 * r28034;
        return r28035;
}

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 r28036, r28037, r28038, r28039, r28040, r28041, r28042, r28043, r28044, r28045, r28046;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r28036);
        mpfr_init(r28037);
        mpfr_init(r28038);
        mpfr_init(r28039);
        mpfr_init(r28040);
        mpfr_init(r28041);
        mpfr_init(r28042);
        mpfr_init(r28043);
        mpfr_init(r28044);
        mpfr_init(r28045);
        mpfr_init(r28046);
}

double f_im(double d1, double d2, double d3, double d4) {
        mpfr_set_d(r28036, d1, MPFR_RNDN);
        mpfr_set_d(r28037, d2, MPFR_RNDN);
        mpfr_mul(r28038, r28036, r28037, MPFR_RNDN);
        mpfr_set_d(r28039, d3, MPFR_RNDN);
        mpfr_mul(r28040, r28036, r28039, MPFR_RNDN);
        mpfr_sub(r28041, r28038, r28040, MPFR_RNDN);
        mpfr_set_d(r28042, d4, MPFR_RNDN);
        mpfr_mul(r28043, r28042, r28036, MPFR_RNDN);
        mpfr_add(r28044, r28041, r28043, MPFR_RNDN);
        mpfr_mul(r28045, r28036, r28036, MPFR_RNDN);
        mpfr_sub(r28046, r28044, r28045, MPFR_RNDN);
        return mpfr_get_d(r28046, MPFR_RNDN);
}

static mpfr_t r28047, r28048, r28049, r28050, r28051, r28052, r28053, r28054;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r28047);
        mpfr_init(r28048);
        mpfr_init(r28049);
        mpfr_init(r28050);
        mpfr_init(r28051);
        mpfr_init(r28052);
        mpfr_init(r28053);
        mpfr_init(r28054);
}

double f_fm(double d1, double d2, double d3, double d4) {
        mpfr_set_d(r28047, d1, MPFR_RNDN);
        mpfr_set_d(r28048, d4, MPFR_RNDN);
        mpfr_sub(r28049, r28048, r28047, MPFR_RNDN);
        mpfr_set_d(r28050, d2, MPFR_RNDN);
        mpfr_set_d(r28051, d3, MPFR_RNDN);
        mpfr_sub(r28052, r28050, r28051, MPFR_RNDN);
        mpfr_add(r28053, r28049, r28052, MPFR_RNDN);
        mpfr_mul(r28054, r28047, r28053, MPFR_RNDN);
        return mpfr_get_d(r28054, MPFR_RNDN);
}

static mpfr_t r28055, r28056, r28057, r28058, r28059, r28060, r28061, r28062;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r28055);
        mpfr_init(r28056);
        mpfr_init(r28057);
        mpfr_init(r28058);
        mpfr_init(r28059);
        mpfr_init(r28060);
        mpfr_init(r28061);
        mpfr_init(r28062);
}

double f_dm(double d1, double d2, double d3, double d4) {
        mpfr_set_d(r28055, d1, MPFR_RNDN);
        mpfr_set_d(r28056, d4, MPFR_RNDN);
        mpfr_sub(r28057, r28056, r28055, MPFR_RNDN);
        mpfr_set_d(r28058, d2, MPFR_RNDN);
        mpfr_set_d(r28059, d3, MPFR_RNDN);
        mpfr_sub(r28060, r28058, r28059, MPFR_RNDN);
        mpfr_add(r28061, r28057, r28060, MPFR_RNDN);
        mpfr_mul(r28062, r28055, r28061, MPFR_RNDN);
        return mpfr_get_d(r28062, MPFR_RNDN);
}

