00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include <stdio.h>
00032 #include <math.h>
00033
00034 int
00035 main ()
00036 {
00037 int i, j;
00038 double q, r, err, max_err = 0, max_s_err = 0;
00039
00040 puts("/* This table has been generated by divtab-sh4.c. */");
00041 puts ("\t.balign 4");
00042 puts ("LOCAL(div_table_clz):");
00043
00044 printf ("\t.byte\t%d\n", 0);
00045 for (i = 1; i <= 128; i++)
00046 {
00047 int n = 0;
00048 if (i == 128)
00049 puts ("\
00050 /* Lookup table translating positive divisor to index into table of\n\
00051 normalized inverse. N.B. the '0' entry is also the last entry of the\n\
00052 previous table, and causes an unaligned access for division by zero. */\n\
00053 LOCAL(div_table_ix):");
00054 for (j = i; j <= 128; j += j)
00055 n++;
00056 printf ("\t.byte\t%d\n", n - 7);
00057 }
00058 for (i = 1; i <= 128; i++)
00059 {
00060 j = i < 0 ? -i : i;
00061 while (j < 128)
00062 j += j;
00063 printf ("\t.byte\t%d\n", j * 2 - 96*4);
00064 }
00065 puts("\
00066 /* 1/64 .. 1/127, normalized. There is an implicit leading 1 in bit 32. */\n\
00067 .balign 4\n\
00068 LOCAL(zero_l):");
00069 for (i = 64; i < 128; i++)
00070 {
00071 if (i == 96)
00072 puts ("LOCAL(div_table):");
00073 q = 4.*(1<<30)*128/i;
00074 r = ceil (q);
00075
00076
00077
00078
00079
00080 printf ("\t.long\t0x%X\n", (unsigned) r);
00081 err = r - q;
00082 if (err > max_err)
00083 max_err = err;
00084 err = err * i / 128;
00085 if (err > max_s_err)
00086 max_s_err = err;
00087 }
00088 printf ("\t/* maximum error: %f scaled: %f*/\n", max_err, max_s_err);
00089 exit (0);
00090 }