| /* Copyright (C) 2004-2023 Free Software Foundation, Inc. |
| Contributor: Joern Rennecke <joern.rennecke@embecosm.com> |
| on behalf of Synopsys 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. |
| |
| In addition to the permissions in the GNU General Public License, the |
| Free Software Foundation gives you unlimited permission to link the |
| compiled version of this file into combinations with other programs, |
| and to distribute those combinations without any restriction coming |
| from the use of this file. (The General Public License restrictions |
| do apply in other respects; for example, they cover modification of |
| the file, and distribution when not linked into a combine |
| executable.) |
| |
| 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. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program; see the file COPYING3. If not see |
| <http://www.gnu.org/licenses/>. */ |
| |
| /* Calculate division table for ARC700 integer division |
| Contributed by Joern Rennecke |
| joern.rennecke@arc.com */ |
| |
| #include <stdio.h> |
| #include <math.h> |
| |
| int |
| main () |
| { |
| int i, j; |
| unsigned x; |
| double q, r, err, max_err = -1; |
| |
| puts("/* This table has been generated by divtab-arc700.c. */"); |
| puts("\ |
| /* 1/512 .. 1/256, normalized. There is a leading 1 in bit 31.\n\ |
| For powers of two, we list unnormalized numbers instead. The values\n\ |
| for powers of 2 are loaded, but not used. The value for 1 is actually\n\ |
| the first instruction after .Lmuldiv. */\n\ |
| .balign 4"); |
| puts (".Ldivtab:\n"); |
| for (i = 256; i >= 2; --i) |
| { |
| j = i < 0 ? -i : i; |
| if (j & (j-1)) |
| while (j < 128) |
| j += j; |
| else |
| /* Power of two. */ |
| j *= 128; |
| q = 4.*(1<<30)*128/j; |
| r = ceil (q); |
| printf ("\t.long\t0x%X\n", (unsigned) r); |
| err = r - q; |
| if (err > max_err) |
| max_err = err; |
| } |
| #if 0 |
| printf ("\t/* maximum error: %f */\n", max_err); |
| #endif |
| exit (0); |
| } |