#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 r8501 = re;
        float r8502 = im;
        float r8503 = r8501 * r8502;
        float r8504 = r8502 * r8501;
        float r8505 = r8503 + r8504;
        return r8505;
}

double f_id(double re, double im) {
        double r8506 = re;
        double r8507 = im;
        double r8508 = r8506 * r8507;
        double r8509 = r8507 * r8506;
        double r8510 = r8508 + r8509;
        return r8510;
}


double f_of(float re, float im) {
        float r8511 = re;
        float r8512 = r8511 + r8511;
        float r8513 = im;
        float r8514 = r8512 * r8513;
        return r8514;
}

double f_od(double re, double im) {
        double r8515 = re;
        double r8516 = r8515 + r8515;
        double r8517 = im;
        double r8518 = r8516 * r8517;
        return r8518;
}

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 r8519, r8520, r8521, r8522, r8523;

void setup_mpfr_f_im() {
        mpfr_set_default_prec(336);
        mpfr_init(r8519);
        mpfr_init(r8520);
        mpfr_init(r8521);
        mpfr_init(r8522);
        mpfr_init(r8523);
}

double f_im(double re, double im) {
        mpfr_set_d(r8519, re, MPFR_RNDN);
        mpfr_set_d(r8520, im, MPFR_RNDN);
        mpfr_mul(r8521, r8519, r8520, MPFR_RNDN);
        mpfr_mul(r8522, r8520, r8519, MPFR_RNDN);
        mpfr_add(r8523, r8521, r8522, MPFR_RNDN);
        return mpfr_get_d(r8523, MPFR_RNDN);
}

static mpfr_t r8524, r8525, r8526, r8527;

void setup_mpfr_f_fm() {
        mpfr_set_default_prec(336);
        mpfr_init(r8524);
        mpfr_init(r8525);
        mpfr_init(r8526);
        mpfr_init(r8527);
}

double f_fm(double re, double im) {
        mpfr_set_d(r8524, re, MPFR_RNDN);
        mpfr_add(r8525, r8524, r8524, MPFR_RNDN);
        mpfr_set_d(r8526, im, MPFR_RNDN);
        mpfr_mul(r8527, r8525, r8526, MPFR_RNDN);
        return mpfr_get_d(r8527, MPFR_RNDN);
}

static mpfr_t r8528, r8529, r8530, r8531;

void setup_mpfr_f_dm() {
        mpfr_set_default_prec(336);
        mpfr_init(r8528);
        mpfr_init(r8529);
        mpfr_init(r8530);
        mpfr_init(r8531);
}

double f_dm(double re, double im) {
        mpfr_set_d(r8528, re, MPFR_RNDN);
        mpfr_add(r8529, r8528, r8528, MPFR_RNDN);
        mpfr_set_d(r8530, im, MPFR_RNDN);
        mpfr_mul(r8531, r8529, r8530, MPFR_RNDN);
        return mpfr_get_d(r8531, MPFR_RNDN);
}

