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

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

double f_if(float re, float im) {
        float r8277 = re;
        float r8278 = im;
        float r8279 = r8277 * r8278;
        float r8280 = r8278 * r8277;
        float r8281 = r8279 + r8280;
        return r8281;
}

double f_id(double re, double im) {
        double r8282 = re;
        double r8283 = im;
        double r8284 = r8282 * r8283;
        double r8285 = r8283 * r8282;
        double r8286 = r8284 + r8285;
        return r8286;
}


double f_of(float re, float im) {
        float r8287 = re;
        float r8288 = im;
        float r8289 = r8287 * r8288;
        float r8290 = r8288 * r8287;
        float r8291 = r8289 + r8290;
        return r8291;
}

double f_od(double re, double im) {
        double r8292 = re;
        double r8293 = im;
        double r8294 = r8292 * r8293;
        double r8295 = r8293 * r8292;
        double r8296 = r8294 + r8295;
        return r8296;
}

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 r8297, r8298, r8299, r8300, r8301;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r8297);
        mpfr_init(r8298);
        mpfr_init(r8299);
        mpfr_init(r8300);
        mpfr_init(r8301);
}

double f_im(double re, double im) {
        mpfr_set_d(r8297, re, MPFR_RNDN);
        mpfr_set_d(r8298, im, MPFR_RNDN);
        mpfr_mul(r8299, r8297, r8298, MPFR_RNDN);
        mpfr_mul(r8300, r8298, r8297, MPFR_RNDN);
        mpfr_add(r8301, r8299, r8300, MPFR_RNDN);
        return mpfr_get_d(r8301, MPFR_RNDN);
}

static mpfr_t r8302, r8303, r8304, r8305, r8306;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r8302);
        mpfr_init(r8303);
        mpfr_init(r8304);
        mpfr_init(r8305);
        mpfr_init(r8306);
}

double f_fm(double re, double im) {
        mpfr_set_d(r8302, re, MPFR_RNDN);
        mpfr_set_d(r8303, im, MPFR_RNDN);
        mpfr_mul(r8304, r8302, r8303, MPFR_RNDN);
        mpfr_mul(r8305, r8303, r8302, MPFR_RNDN);
        mpfr_add(r8306, r8304, r8305, MPFR_RNDN);
        return mpfr_get_d(r8306, MPFR_RNDN);
}

static mpfr_t r8307, r8308, r8309, r8310, r8311;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r8307);
        mpfr_init(r8308);
        mpfr_init(r8309);
        mpfr_init(r8310);
        mpfr_init(r8311);
}

double f_dm(double re, double im) {
        mpfr_set_d(r8307, re, MPFR_RNDN);
        mpfr_set_d(r8308, im, MPFR_RNDN);
        mpfr_mul(r8309, r8307, r8308, MPFR_RNDN);
        mpfr_mul(r8310, r8308, r8307, MPFR_RNDN);
        mpfr_add(r8311, r8309, r8310, MPFR_RNDN);
        return mpfr_get_d(r8311, MPFR_RNDN);
}

