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

char *name = "math.square on complex, real part";

double f_if(float re, float im) {
        float r8174 = re;
        float r8175 = r8174 * r8174;
        float r8176 = im;
        float r8177 = r8176 * r8176;
        float r8178 = r8175 - r8177;
        return r8178;
}

double f_id(double re, double im) {
        double r8179 = re;
        double r8180 = r8179 * r8179;
        double r8181 = im;
        double r8182 = r8181 * r8181;
        double r8183 = r8180 - r8182;
        return r8183;
}


double f_of(float re, float im) {
        float r8184 = re;
        float r8185 = im;
        float r8186 = r8184 + r8185;
        float r8187 = r8184 - r8185;
        float r8188 = r8186 * r8187;
        return r8188;
}

double f_od(double re, double im) {
        double r8189 = re;
        double r8190 = im;
        double r8191 = r8189 + r8190;
        double r8192 = r8189 - r8190;
        double r8193 = r8191 * r8192;
        return r8193;
}

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 r8194, r8195, r8196, r8197, r8198;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(592);
        mpfr_init(r8194);
        mpfr_init(r8195);
        mpfr_init(r8196);
        mpfr_init(r8197);
        mpfr_init(r8198);
}

double f_im(double re, double im) {
        mpfr_set_d(r8194, re, MPFR_RNDN);
        mpfr_mul(r8195, r8194, r8194, MPFR_RNDN);
        mpfr_set_d(r8196, im, MPFR_RNDN);
        mpfr_mul(r8197, r8196, r8196, MPFR_RNDN);
        mpfr_sub(r8198, r8195, r8197, MPFR_RNDN);
        return mpfr_get_d(r8198, MPFR_RNDN);
}

static mpfr_t r8199, r8200, r8201, r8202, r8203;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(592);
        mpfr_init(r8199);
        mpfr_init(r8200);
        mpfr_init(r8201);
        mpfr_init(r8202);
        mpfr_init(r8203);
}

double f_fm(double re, double im) {
        mpfr_set_d(r8199, re, MPFR_RNDN);
        mpfr_set_d(r8200, im, MPFR_RNDN);
        mpfr_add(r8201, r8199, r8200, MPFR_RNDN);
        mpfr_sub(r8202, r8199, r8200, MPFR_RNDN);
        mpfr_mul(r8203, r8201, r8202, MPFR_RNDN);
        return mpfr_get_d(r8203, MPFR_RNDN);
}

static mpfr_t r8204, r8205, r8206, r8207, r8208;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(592);
        mpfr_init(r8204);
        mpfr_init(r8205);
        mpfr_init(r8206);
        mpfr_init(r8207);
        mpfr_init(r8208);
}

double f_dm(double re, double im) {
        mpfr_set_d(r8204, re, MPFR_RNDN);
        mpfr_set_d(r8205, im, MPFR_RNDN);
        mpfr_add(r8206, r8204, r8205, MPFR_RNDN);
        mpfr_sub(r8207, r8204, r8205, MPFR_RNDN);
        mpfr_mul(r8208, r8206, r8207, MPFR_RNDN);
        return mpfr_get_d(r8208, MPFR_RNDN);
}

