1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int
isnum (const char *str)
{
const char *p;
for (p = str; *p; p++)
if (!isdigit (*p)) return 0;
return 1;
}
int
main (int argc, char **argv)
{
int i, j, n = -1, *v, first, second, idx, c[4], aligned = 0, assumption;
for (i = 1; i < argc; i++)
{
if (!strcmp (argv[i], "-a"))
{
if (aligned)
{
fprintf (stderr, "*** writechains: multiple '-a' options\n");
exit (1);
}
aligned = 1;
}
else if (isnum (argv[i]))
{
if (n >= 0)
{
fprintf (stderr, "*** writechains: multiple <length> arguments\n");
exit (1);
}
n = atoi (argv[i]);
}
else
{
fprintf (stderr, "*** usage: writechains [-a] <length>\n");
exit (1);
}
}
if (n < 0)
{
fprintf (stderr, "*** writechains: <length> argument missing\n");
exit (1);
}
first = second = idx = 1;
printf ("%d array 8 32\n", idx++);
v = malloc (n * sizeof *v);
for (i = 0; i < 4; i++) printf ("%d constd 32 %d\n", c[i] = idx++, i);
for (i = 0; i < n; i++) printf ("%d var 32\n", v[i] = idx++);
for (i = 0; i < n; i++)
{
for (j = 0; j < 32; j += 8)
{
printf ("%d add 32 %d %d\n", idx++, v[i], c[j / 8]);
printf ("%d slice 8 %d %d %d\n", idx++, v[i], j + 7, j);
printf ("%d write 8 32 %d %d %d\n", idx, first, idx - 2, idx - 1);
first = idx++;
}
}
for (i = n - 1; i >= 0; i--)
{
for (j = 0; j < 32; j += 8)
{
printf ("%d add 32 %d %d\n", idx++, v[i], c[j / 8]);
printf ("%d slice 8 %d %d %d\n", idx++, v[i], j + 7, j);
printf ("%d write 8 32 %d %d %d\n", idx, second, idx - 2, idx - 1);
second = idx++;
}
}
assumption = -idx;
printf ("%d eq 1 %d %d\n", idx++, first, second);
if (aligned)
{
for (i = 0; i < n; i++)
{
printf ("%d slice 2 %d 1 0\n", idx++, v[i]);
printf ("%d redor 1 %d\n", idx, idx - 1);
idx++;
printf ("%d and 1 %d %d\n", idx, assumption, -(idx - 1));
assumption = idx++;
}
}
printf ("%d root 1 %d\n", idx++, assumption);
free (v);
return 0;
}
|