about summary refs log tree commit diff
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.c149
1 files changed, 149 insertions, 0 deletions
diff --git a/math/gen-auto-libm-tests.c b/math/gen-auto-libm-tests.c
index 57053ad420..2b8d766762 100644
--- a/math/gen-auto-libm-tests.c
+++ b/math/gen-auto-libm-tests.c
@@ -439,7 +439,35 @@ typedef struct
 /* List of functions handled by this program.  */
 static test_function test_functions[] =
   {
+    FUNC_mpfr_f_f ("acos", mpfr_acos, false),
+    FUNC_mpfr_f_f ("acosh", mpfr_acosh, false),
+    FUNC_mpfr_f_f ("asin", mpfr_asin, false),
+    FUNC_mpfr_f_f ("asinh", mpfr_asinh, false),
+    FUNC_mpfr_f_f ("atan", mpfr_atan, false),
+    FUNC_mpfr_f_f ("atanh", mpfr_atanh, false),
+    FUNC_mpfr_f_f ("cbrt", mpfr_cbrt, false),
+    FUNC_mpfr_f_f ("cos", mpfr_cos, false),
+    FUNC_mpfr_f_f ("cosh", mpfr_cosh, 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),
+    FUNC_mpfr_f_f ("exp10", mpfr_exp10, false),
+    FUNC_mpfr_f_f ("exp2", mpfr_exp2, false),
+    FUNC_mpfr_f_f ("expm1", mpfr_expm1, false),
+    FUNC_mpfr_f_f ("j0", mpfr_j0, false),
+    FUNC_mpfr_f_f ("j1", mpfr_j1, false),
+    FUNC_mpfr_f_f ("log", mpfr_log, false),
+    FUNC_mpfr_f_f ("log10", mpfr_log10, false),
+    FUNC_mpfr_f_f ("log1p", mpfr_log1p, false),
+    FUNC_mpfr_f_f ("log2", mpfr_log2, false),
+    FUNC_mpfr_f_f ("sin", mpfr_sin, false),
+    FUNC_mpfr_f_f ("sinh", mpfr_sinh, false),
     FUNC_mpfr_f_f ("sqrt", mpfr_sqrt, true),
+    FUNC_mpfr_f_f ("tan", mpfr_tan, false),
+    FUNC_mpfr_f_f ("tanh", mpfr_tanh, false),
+    FUNC_mpfr_f_f ("tgamma", mpfr_gamma, false),
+    FUNC_mpfr_f_f ("y0", mpfr_y0, false),
+    FUNC_mpfr_f_f ("y1", mpfr_y1, false),
   };
 
 /* Allocate memory, with error checking.  */
@@ -637,6 +665,116 @@ special_fill_minus_pi (mpfr_t res0, mpfr_t res1, fp_format format)
   return 2;
 }
 
+static size_t
+special_fill_pi_2 (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_div_ui (res0, res0, 2, MPFR_RNDN));
+  mpfr_init2 (res1, fp_formats[format].mant_dig);
+  mpfr_const_pi (res1, MPFR_RNDD);
+  assert_exact (mpfr_div_ui (res1, res1, 2, MPFR_RNDN));
+  return 2;
+}
+
+static size_t
+special_fill_minus_pi_2 (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_div_ui (res0, res0, 2, MPFR_RNDN));
+  assert_exact (mpfr_neg (res0, res0, MPFR_RNDN));
+  mpfr_init2 (res1, fp_formats[format].mant_dig);
+  mpfr_const_pi (res1, MPFR_RNDD);
+  assert_exact (mpfr_div_ui (res1, res1, 2, MPFR_RNDN));
+  assert_exact (mpfr_neg (res1, res1, MPFR_RNDN));
+  return 2;
+}
+
+static size_t
+special_fill_pi_6 (mpfr_t res0, mpfr_t res1, fp_format format)
+{
+  mpfr_init2 (res0, fp_formats[format].mant_dig);
+  assert_exact (mpfr_set_si_2exp (res0, 1, -1, MPFR_RNDN));
+  mpfr_asin (res0, res0, MPFR_RNDU);
+  mpfr_init2 (res1, fp_formats[format].mant_dig);
+  assert_exact (mpfr_set_si_2exp (res1, 1, -1, MPFR_RNDN));
+  mpfr_asin (res1, res1, MPFR_RNDD);
+  return 2;
+}
+
+static size_t
+special_fill_minus_pi_6 (mpfr_t res0, mpfr_t res1, fp_format format)
+{
+  mpfr_init2 (res0, fp_formats[format].mant_dig);
+  assert_exact (mpfr_set_si_2exp (res0, -1, -1, MPFR_RNDN));
+  mpfr_asin (res0, res0, MPFR_RNDU);
+  mpfr_init2 (res1, fp_formats[format].mant_dig);
+  assert_exact (mpfr_set_si_2exp (res1, -1, -1, MPFR_RNDN));
+  mpfr_asin (res1, res1, MPFR_RNDD);
+  return 2;
+}
+
+static size_t
+special_fill_pi_3 (mpfr_t res0, mpfr_t res1, fp_format format)
+{
+  mpfr_init2 (res0, fp_formats[format].mant_dig);
+  assert_exact (mpfr_set_si_2exp (res0, 1, -1, MPFR_RNDN));
+  mpfr_acos (res0, res0, MPFR_RNDU);
+  mpfr_init2 (res1, fp_formats[format].mant_dig);
+  assert_exact (mpfr_set_si_2exp (res1, 1, -1, MPFR_RNDN));
+  mpfr_acos (res1, res1, MPFR_RNDD);
+  return 2;
+}
+
+static size_t
+special_fill_2pi_3 (mpfr_t res0, mpfr_t res1, fp_format format)
+{
+  mpfr_init2 (res0, fp_formats[format].mant_dig);
+  assert_exact (mpfr_set_si_2exp (res0, -1, -1, MPFR_RNDN));
+  mpfr_acos (res0, res0, MPFR_RNDU);
+  mpfr_init2 (res1, fp_formats[format].mant_dig);
+  assert_exact (mpfr_set_si_2exp (res1, -1, -1, MPFR_RNDN));
+  mpfr_acos (res1, res1, MPFR_RNDD);
+  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);
+  assert_exact (mpfr_set_si (res0, 1, MPFR_RNDN));
+  mpfr_exp (res0, res0, MPFR_RNDU);
+  mpfr_init2 (res1, fp_formats[format].mant_dig);
+  assert_exact (mpfr_set_si (res1, 1, MPFR_RNDN));
+  mpfr_exp (res1, res1, MPFR_RNDD);
+  return 2;
+}
+
+static size_t
+special_fill_1_e (mpfr_t res0, mpfr_t res1, fp_format format)
+{
+  mpfr_init2 (res0, fp_formats[format].mant_dig);
+  assert_exact (mpfr_set_si (res0, -1, MPFR_RNDN));
+  mpfr_exp (res0, res0, MPFR_RNDU);
+  mpfr_init2 (res1, fp_formats[format].mant_dig);
+  assert_exact (mpfr_set_si (res1, -1, MPFR_RNDN));
+  mpfr_exp (res1, res1, MPFR_RNDD);
+  return 2;
+}
+
+static size_t
+special_fill_e_minus_1 (mpfr_t res0, mpfr_t res1, fp_format format)
+{
+  mpfr_init2 (res0, fp_formats[format].mant_dig);
+  assert_exact (mpfr_set_si (res0, 1, MPFR_RNDN));
+  mpfr_expm1 (res0, res0, MPFR_RNDU);
+  mpfr_init2 (res1, fp_formats[format].mant_dig);
+  assert_exact (mpfr_set_si (res1, 1, MPFR_RNDN));
+  mpfr_expm1 (res1, res1, MPFR_RNDD);
+  return 2;
+}
+
 /* A special string accepted in input arguments.  */
 typedef struct
 {
@@ -656,6 +794,15 @@ static const special_real_input special_real_inputs[] =
     { "-max", special_fill_minus_max },
     { "pi", special_fill_pi },
     { "-pi", special_fill_minus_pi },
+    { "pi/2", special_fill_pi_2 },
+    { "-pi/2", special_fill_minus_pi_2 },
+    { "pi/6", special_fill_pi_6 },
+    { "-pi/6", special_fill_minus_pi_6 },
+    { "pi/3", special_fill_pi_3 },
+    { "2pi/3", special_fill_2pi_3 },
+    { "e", special_fill_e },
+    { "1/e", special_fill_1_e },
+    { "e-1", special_fill_e_minus_1 },
   };
 
 /* Given a real number R computed in round-to-zero mode, set the
@@ -1405,6 +1552,8 @@ output_for_one_input_case (FILE *fp, const char *filename, test_function *tf,
 				  & (1U << exc_overflow)) != 0)
 			    must_erange = true;
 			  if (mpfr_zero_p (all_res[i][m])
+			      && (tf->exact
+				  || mpfr_zero_p (all_res[i][rm_tonearest]))
 			      && (all_exc_before[i][m]
 				  & (1U << exc_underflow)) != 0)
 			    must_erange = true;