summaryrefslogtreecommitdiff
path: root/math/gen-auto-libm-tests.c
diff options
context:
space:
mode:
Diffstat (limited to 'math/gen-auto-libm-tests.c')
-rw-r--r--math/gen-auto-libm-tests.c118
1 files changed, 112 insertions, 6 deletions
diff --git a/math/gen-auto-libm-tests.c b/math/gen-auto-libm-tests.c
index 0201b8ae8b..2f521d5c83 100644
--- a/math/gen-auto-libm-tests.c
+++ b/math/gen-auto-libm-tests.c
@@ -1,5 +1,5 @@
/* Generate expected output for libm tests with MPFR and MPC.
- Copyright (C) 2013 Free Software Foundation, Inc.
+ Copyright (C) 2013-2014 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -406,6 +406,12 @@ typedef enum
/* MPC function with a single complex argument and one real
result. */
mpc_c_f,
+ /* MPC function with a single complex argument and one complex
+ result. */
+ mpc_c_c,
+ /* MPC function with two complex arguments and one complex
+ result. */
+ mpc_cc_c,
} func_calc_method;
/* Description of how to calculate a function. */
@@ -422,6 +428,8 @@ typedef struct
int (*mpfr_if_f) (mpfr_t, long, const mpfr_t, mpfr_rnd_t);
int (*mpfr_f_11) (mpfr_t, mpfr_t, const mpfr_t, mpfr_rnd_t);
int (*mpc_c_f) (mpfr_t, const mpc_t, mpfr_rnd_t);
+ int (*mpc_c_c) (mpc_t, const mpc_t, mpc_rnd_t);
+ int (*mpc_cc_c) (mpc_t, const mpc_t, const mpc_t, mpc_rnd_t);
} func;
} func_calc_desc;
@@ -478,6 +486,9 @@ typedef struct
#define FUNC_mpc_c_f(NAME, MPFR_FUNC, EXACT) \
FUNC (NAME, ARGS2 (type_fp, type_fp), RET1 (type_fp), EXACT, true, \
CALC (mpc_c_f, MPFR_FUNC))
+#define FUNC_mpc_c_c(NAME, MPFR_FUNC, EXACT) \
+ FUNC (NAME, ARGS2 (type_fp, type_fp), RET2 (type_fp, type_fp), EXACT, \
+ true, CALC (mpc_c_c, MPFR_FUNC))
/* List of functions handled by this program. */
static test_function test_functions[] =
@@ -490,10 +501,28 @@ static test_function test_functions[] =
FUNC_mpfr_ff_f ("atan2", mpfr_atan2, false),
FUNC_mpfr_f_f ("atanh", mpfr_atanh, false),
FUNC_mpc_c_f ("cabs", mpc_abs, false),
+ FUNC_mpc_c_c ("cacos", mpc_acos, false),
+ FUNC_mpc_c_c ("cacosh", mpc_acosh, false),
FUNC_mpc_c_f ("carg", mpc_arg, false),
+ FUNC_mpc_c_c ("casin", mpc_asin, false),
+ FUNC_mpc_c_c ("casinh", mpc_asinh, false),
+ FUNC_mpc_c_c ("catan", mpc_atan, false),
+ FUNC_mpc_c_c ("catanh", mpc_atanh, false),
FUNC_mpfr_f_f ("cbrt", mpfr_cbrt, false),
+ FUNC_mpc_c_c ("ccos", mpc_cos, false),
+ FUNC_mpc_c_c ("ccosh", mpc_cosh, false),
+ FUNC_mpc_c_c ("cexp", mpc_exp, false),
+ FUNC_mpc_c_c ("clog", mpc_log, false),
+ FUNC_mpc_c_c ("clog10", mpc_log10, false),
FUNC_mpfr_f_f ("cos", mpfr_cos, false),
FUNC_mpfr_f_f ("cosh", mpfr_cosh, false),
+ FUNC ("cpow", ARGS4 (type_fp, type_fp, type_fp, type_fp),
+ RET2 (type_fp, type_fp), false, true, CALC (mpc_cc_c, mpc_pow)),
+ FUNC_mpc_c_c ("csin", mpc_sin, false),
+ FUNC_mpc_c_c ("csinh", mpc_sinh, false),
+ FUNC_mpc_c_c ("csqrt", mpc_sqrt, false),
+ FUNC_mpc_c_c ("ctan", mpc_tan, false),
+ FUNC_mpc_c_c ("ctanh", mpc_tanh, false),
FUNC_mpfr_f_f ("erf", mpfr_erf, false),
FUNC_mpfr_f_f ("erfc", mpfr_erfc, false),
FUNC_mpfr_f_f ("exp", mpfr_exp, false),
@@ -735,6 +764,17 @@ special_fill_minus_min_subnorm (mpfr_t res0,
}
static size_t
+special_fill_min_subnorm_p120 (mpfr_t res0,
+ mpfr_t res1 __attribute__ ((unused)),
+ fp_format format)
+{
+ mpfr_init2 (res0, fp_formats[format].mant_dig);
+ assert_exact (mpfr_mul_2ui (res0, fp_formats[format].subnorm_min,
+ 120, MPFR_RNDN));
+ return 1;
+}
+
+static size_t
special_fill_pi (mpfr_t res0, mpfr_t res1, fp_format format)
{
mpfr_init2 (res0, fp_formats[format].mant_dig);
@@ -843,6 +883,18 @@ special_fill_2pi_3 (mpfr_t res0, mpfr_t res1, fp_format format)
}
static size_t
+special_fill_2pi (mpfr_t res0, mpfr_t res1, fp_format format)
+{
+ mpfr_init2 (res0, fp_formats[format].mant_dig);
+ mpfr_const_pi (res0, MPFR_RNDU);
+ assert_exact (mpfr_mul_ui (res0, res0, 2, MPFR_RNDN));
+ mpfr_init2 (res1, fp_formats[format].mant_dig);
+ mpfr_const_pi (res1, MPFR_RNDD);
+ assert_exact (mpfr_mul_ui (res1, res1, 2, MPFR_RNDN));
+ return 2;
+}
+
+static size_t
special_fill_e (mpfr_t res0, mpfr_t res1, fp_format format)
{
mpfr_init2 (res0, fp_formats[format].mant_dig);
@@ -899,6 +951,7 @@ static const special_real_input special_real_inputs[] =
{ "-min", special_fill_minus_min },
{ "min_subnorm", special_fill_min_subnorm },
{ "-min_subnorm", special_fill_minus_min_subnorm },
+ { "min_subnorm_p120", special_fill_min_subnorm_p120 },
{ "pi", special_fill_pi },
{ "-pi", special_fill_minus_pi },
{ "pi/2", special_fill_pi_2 },
@@ -908,6 +961,7 @@ static const special_real_input special_real_inputs[] =
{ "-pi/6", special_fill_minus_pi_6 },
{ "pi/3", special_fill_pi_3 },
{ "2pi/3", special_fill_2pi_3 },
+ { "2pi", special_fill_2pi },
{ "e", special_fill_e },
{ "1/e", special_fill_1_e },
{ "e-1", special_fill_e_minus_1 },
@@ -1329,6 +1383,9 @@ calc_generic_results (generic_value *outputs, generic_value *inputs,
const func_calc_desc *calc)
{
bool inexact;
+ int mpc_ternary;
+ mpc_t ci1, ci2, co;
+
switch (calc->method)
{
case mpfr_f_f:
@@ -1393,13 +1450,62 @@ calc_generic_results (generic_value *outputs, generic_value *inputs,
assert (inputs[1].type == gtype_fp);
outputs[0].type = gtype_fp;
mpfr_init (outputs[0].value.f);
- mpc_t ci;
- mpc_init2 (ci, internal_precision);
- assert_exact (mpc_set_fr_fr (ci, inputs[0].value.f, inputs[1].value.f,
+ mpc_init2 (ci1, internal_precision);
+ assert_exact (mpc_set_fr_fr (ci1, inputs[0].value.f, inputs[1].value.f,
MPC_RNDNN));
- inexact = calc->func.mpc_c_f (outputs[0].value.f, ci, MPFR_RNDZ);
+ inexact = calc->func.mpc_c_f (outputs[0].value.f, ci1, MPFR_RNDZ);
adjust_real (outputs[0].value.f, inexact);
- mpc_clear (ci);
+ mpc_clear (ci1);
+ break;
+
+ case mpc_c_c:
+ assert (inputs[0].type == gtype_fp);
+ assert (inputs[1].type == gtype_fp);
+ outputs[0].type = gtype_fp;
+ mpfr_init (outputs[0].value.f);
+ outputs[1].type = gtype_fp;
+ mpfr_init (outputs[1].value.f);
+ mpc_init2 (ci1, internal_precision);
+ mpc_init2 (co, internal_precision);
+ assert_exact (mpc_set_fr_fr (ci1, inputs[0].value.f, inputs[1].value.f,
+ MPC_RNDNN));
+ mpc_ternary = calc->func.mpc_c_c (co, ci1, MPC_RNDZZ);
+ assert_exact (mpfr_set (outputs[0].value.f, mpc_realref (co),
+ MPFR_RNDN));
+ assert_exact (mpfr_set (outputs[1].value.f, mpc_imagref (co),
+ MPFR_RNDN));
+ adjust_real (outputs[0].value.f, MPC_INEX_RE (mpc_ternary));
+ adjust_real (outputs[1].value.f, MPC_INEX_IM (mpc_ternary));
+ mpc_clear (ci1);
+ mpc_clear (co);
+ break;
+
+ case mpc_cc_c:
+ assert (inputs[0].type == gtype_fp);
+ assert (inputs[1].type == gtype_fp);
+ assert (inputs[2].type == gtype_fp);
+ assert (inputs[3].type == gtype_fp);
+ outputs[0].type = gtype_fp;
+ mpfr_init (outputs[0].value.f);
+ outputs[1].type = gtype_fp;
+ mpfr_init (outputs[1].value.f);
+ mpc_init2 (ci1, internal_precision);
+ mpc_init2 (ci2, internal_precision);
+ mpc_init2 (co, internal_precision);
+ assert_exact (mpc_set_fr_fr (ci1, inputs[0].value.f, inputs[1].value.f,
+ MPC_RNDNN));
+ assert_exact (mpc_set_fr_fr (ci2, inputs[2].value.f, inputs[3].value.f,
+ MPC_RNDNN));
+ mpc_ternary = calc->func.mpc_cc_c (co, ci1, ci2, MPC_RNDZZ);
+ assert_exact (mpfr_set (outputs[0].value.f, mpc_realref (co),
+ MPFR_RNDN));
+ assert_exact (mpfr_set (outputs[1].value.f, mpc_imagref (co),
+ MPFR_RNDN));
+ adjust_real (outputs[0].value.f, MPC_INEX_RE (mpc_ternary));
+ adjust_real (outputs[1].value.f, MPC_INEX_IM (mpc_ternary));
+ mpc_clear (ci1);
+ mpc_clear (ci2);
+ mpc_clear (co);
break;
default: