/* Measure strtod implementation.
   Copyright (C) 2013-2016 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
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#define TEST_MAIN
#define TEST_NAME "strtod"

#include <stdio.h>
#include <stdlib.h>
#include "bench-timing.h"

#undef INNER_LOOP_ITERS
#define INNER_LOOP_ITERS 65536

static const char *inputs[] =
{
  "1e308",
  "100000000e300",
  "0x1p1023",
  "0x1000p1011",
  "0x1p1020",
  "0x0.00001p1040" "1e-307",
  "0.000001e-301",
  "0.0000001e-300",
  "0.00000001e-299",
  "1000000e-313",
  "10000000e-314",
  "100000000e-315",
  "0x1p-1021",
  "0x1000p-1033",
  "0x10000p-1037",
  "0x0.001p-1009",
  "0x0.0001p-1005",
  "12.345",
  "12.345e19",
  "-.1e+9",
  ".125",
  "1e20",
  "0e-19",
  "4\00012",
  "5.9e-76",
  "0x1.4p+3",
  "0xAp0",
  "0x0Ap0",
  "0x0A",
  "0xA0",
  "0x0.A0p8",
  "0x0.50p9",
  "0x0.28p10",
  "0x0.14p11",
  "0x0.0A0p12",
  "0x0.050p13",
  "0x0.028p14",
  "0x0.014p15",
  "0x00.00A0p16",
  "0x00.0050p17",
  "0x00.0028p18",
  "0x00.0014p19",
  "0x1p-1023",
  "0x0.8p-1022",
  "Inf",
  "-Inf",
  "+InFiNiTy",
  "0x80000Ap-23",
  "1e-324",
  "0x100000000000008p0",
  "0x100000000000008.p0",
  "0x100000000000008.00p0",
  "0x10000000000000800p0",
  "0x10000000000000801p0",
  NULL
};

int
do_bench (void)
{
  const size_t iters = INNER_LOOP_ITERS;
  timing_t res __attribute__ ((unused));

  TIMING_INIT (res);

  for (size_t i = 0; inputs[i] != NULL; ++i)
    {
      char *ep;
      timing_t start, stop, cur;

      printf ("Input %-24s:", inputs[i]);
      TIMING_NOW (start);
      for (size_t j = 0; j < iters; ++j)
	strtod (inputs[i], &ep);
      TIMING_NOW (stop);

      TIMING_DIFF (cur, start, stop);
      TIMING_PRINT_MEAN ((double) cur, (double) iters);
      putchar ('\n');
    }

  return 0;
}

#define TEST_FUNCTION do_bench ()

/* On slower platforms this test needs more than the default 2 seconds.  */
#define TIMEOUT 10

#include "../test-skeleton.c"