/* Copyright (C) 2004-2021 Free Software Foundation, Inc.

This file is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3, or (at your option) any
later version.

This file 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
General Public License for more details.

Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.

You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
<http://www.gnu.org/licenses/>.  */

/* Calculate division table for SH2..4 integer division
   Contributed by Joern Rernnecke
   joern.rennecke@superh.com  */

#include <stdio.h>
#include <math.h>

int
main ()
{
  int i, j;
  double q, r, err, max_err = 0, max_s_err = 0;

  puts("/* This table has been generated by divtab-sh4.c.  */");
  puts ("\t.balign 4");
  puts ("LOCAL(div_table_clz):");
  /* output some dummy number for 1/0.  */
  printf ("\t.byte\t%d\n", 0);
  for (i = 1; i <= 128; i++)
    {
      int n = 0;
      if (i == 128)
	puts ("\
/* Lookup table translating positive divisor to index into table of\n\
   normalized inverse.  N.B. the '0' entry is also the last entry of the\n\
 previous table, and causes an unaligned access for division by zero.  */\n\
LOCAL(div_table_ix):");
      for (j = i; j <= 128; j += j)
	n++;
      printf ("\t.byte\t%d\n", n - 7);
    }
  for (i = 1; i <= 128; i++)
    {
      j = i < 0 ? -i : i;
      while (j < 128)
	j += j;
      printf ("\t.byte\t%d\n", j * 2 - 96*4);
    }
  puts("\
/* 1/64 .. 1/127, normalized.  There is an implicit leading 1 in bit 32.  */\n\
	.balign 4\n\
LOCAL(zero_l):");
  for (i = 64; i < 128; i++)
    {
      if (i == 96)
	puts ("LOCAL(div_table):");
      q = 4.*(1<<30)*128/i;
      r = ceil (q);
      /* The value for 64 is actually differently scaled that it would
	 appear from this calculation.  The implicit part is %01, not 10.
	 Still, since the value in the table is 0 either way, this
	 doesn't matter here.  Still, the 1/64 entry is effectively a 1/128
	 entry.  */
      printf ("\t.long\t0x%X\n", (unsigned) r);
      err = r - q;
      if (err > max_err)
	max_err = err;
      err = err * i / 128;
      if (err > max_s_err)
	max_s_err = err;
    }
  printf ("\t/* maximum error: %f scaled: %f*/\n", max_err, max_s_err);
  exit (0);
}
