Annotation of gcc/genextract.c, revision 1.1.1.1

1.1       root        1: /* Generate code from machine description to extract operands from insn as rtl.
                      2:    Copyright (C) 1987 Free Software Foundation, Inc.
                      3: 
                      4: This file is part of GNU CC.
                      5: 
                      6: GNU CC is distributed in the hope that it will be useful,
                      7: but WITHOUT ANY WARRANTY.  No author or distributor
                      8: accepts responsibility to anyone for the consequences of using it
                      9: or for whether it serves any particular purpose or works at all,
                     10: unless he says so in writing.  Refer to the GNU CC General Public
                     11: License for full details.
                     12: 
                     13: Everyone is granted permission to copy, modify and redistribute
                     14: GNU CC, but only under the conditions described in the
                     15: GNU CC General Public License.   A copy of this license is
                     16: supposed to have been given to you along with GNU CC so you
                     17: can know your rights and responsibilities.  It should be in a
                     18: file named COPYING.  Among other things, the copyright notice
                     19: and this notice must be preserved on all copies.  */
                     20: 
                     21: 
                     22: #include <stdio.h>
                     23: #include "rtl.h"
                     24: #include <obstack.h>
                     25: 
                     26: struct obstack obstack;
                     27: struct obstack *current_obstack = &obstack;
                     28: 
                     29: #define obstack_chunk_alloc xmalloc
                     30: #define obstack_chunk_free free
                     31: extern int xmalloc ();
                     32: extern void free ();
                     33: 
                     34: void fatal ();
                     35: 
                     36: /* Number instruction patterns handled, starting at 0 for first one.  */
                     37: 
                     38: int insn_code_number;
                     39: 
                     40: /* Number the occurrences of MATCH_DUP in each instruction,
                     41:    starting at 0 for the first occurrence.  */
                     42: 
                     43: int dup_count;
                     44: 
                     45: /* While tree-walking an instruction pattern, we keep a chain
                     46:    of these `struct link's to record how to get down to the
                     47:    current position.  In each one, POS is the operand number
                     48:    or vector element number, and VEC is nonzero for a vector.  */
                     49: 
                     50: struct link
                     51: {
                     52:   struct link *next;
                     53:   int pos;
                     54:   int vec;
                     55: };
                     56: 
                     57: void
                     58: gen_insn (insn)
                     59:      rtx insn;
                     60: {
                     61:   register int i;
                     62: 
                     63:   dup_count = 0;
                     64: 
                     65:   /* Output the function name and argument declaration.  */
                     66:   /* It would be cleaner to make `int' the return type
                     67:      but 4.2 vax compiler doesn't accept that in the array
                     68:      that these functions are supposed to go in.  */
                     69:   printf ("int\nextract_%d (insn)\n     rtx insn;\n", insn_code_number);
                     70:   printf ("{\n");
                     71: 
                     72:   /* Walk the insn's pattern, remembering at all times the path
                     73:      down to the walking point.  */
                     74: 
                     75:   if (XVECLEN (insn, 1) == 1)
                     76:     walk_rtx (XVECEXP (insn, 1, 0), 0);
                     77:   else
                     78:     for (i = XVECLEN (insn, 1) - 1; i >= 0; i--)
                     79:       {
                     80:        struct link link;
                     81:        link.next = 0;
                     82:        link.pos = i;
                     83:        link.vec = 1;
                     84:        walk_rtx (XVECEXP (insn, 1, i), &link);
                     85:       }
                     86:   printf ("}\n\n");
                     87: }
                     88: 
                     89: walk_rtx (x, path)
                     90:      rtx x;
                     91:      struct link *path;
                     92: {
                     93:   register RTX_CODE code = GET_CODE (x);
                     94:   register int i;
                     95:   register int len;
                     96:   register char *fmt;
                     97:   struct link link;
                     98: 
                     99:   switch (code)
                    100:     {
                    101:     case PC:
                    102:     case CC0:
                    103:     case CONST_INT:
                    104:     case SYMBOL_REF:
                    105:       return;
                    106: 
                    107:     case MATCH_OPERAND:
                    108:       printf ("  recog_operand[%d] = *(recog_operand_loc[%d]\n    = &",
                    109:              XINT (x, 0), XINT (x, 0));
                    110:       print_path (path);
                    111:       printf (");\n");
                    112:       break;
                    113: 
                    114:     case MATCH_DUP:
                    115:       printf ("  recog_dup_loc[%d] = &", dup_count);
                    116:       print_path (path);
                    117:       printf (";\n");
                    118:       printf ("  recog_dup_num[%d] = %d;\n", dup_count, XINT (x, 0));
                    119:       dup_count++;
                    120:       break;
                    121: 
                    122:     case ADDRESS:
                    123:       walk_rtx (XEXP (x, 0), path);
                    124:       return;
                    125:     }
                    126: 
                    127:   link.next = path;
                    128:   link.vec = 0;
                    129:   fmt = GET_RTX_FORMAT (code);
                    130:   len = GET_RTX_LENGTH (code);
                    131:   for (i = 0; i < len; i++)
                    132:     if (fmt[i] == 'e' || fmt[i] == 'u')
                    133:       {
                    134:        link.pos = i;
                    135:        walk_rtx (XEXP (x, i), &link);
                    136:       }
                    137: }
                    138: 
                    139: /* Given a PATH, representing a path down the instruction's
                    140:    pattern from the root to a certain point, output code to
                    141:    evaluate to the rtx at that point.  */
                    142: 
                    143: print_path (path)
                    144:      struct link *path;
                    145: {
                    146:   if (path == 0)
                    147:     printf ("insn");
                    148:   else if (path->vec)
                    149:     {
                    150:       printf ("XVECEXP (");
                    151:       print_path (path->next);
                    152:       printf (", 0, %d)", path->pos);
                    153:     }
                    154:   else
                    155:     {
                    156:       printf ("XEXP (");
                    157:       print_path (path->next);
                    158:       printf (", %d)", path->pos);
                    159:     }
                    160: }
                    161: 
                    162: xmalloc (size)
                    163: {
                    164:   register int val = malloc (size);
                    165: 
                    166:   if (val == 0)
                    167:     abort ();
                    168: 
                    169:   return val;
                    170: }
                    171: 
                    172: int
                    173: xrealloc (ptr, size)
                    174:      char *ptr;
                    175:      int size;
                    176: {
                    177:   int result = realloc (ptr, size);
                    178:   if (!result)
                    179:     abort ();
                    180:   return result;
                    181: }
                    182: 
                    183: void
                    184: fatal (s, a1, a2)
                    185: {
                    186:   fprintf (stderr, "genemit: ");
                    187:   fprintf (stderr, s, a1, a2);
                    188:   fprintf (stderr, "\n");
                    189:   exit (1);
                    190: }
                    191: 
                    192: main (argc, argv)
                    193:      int argc;
                    194:      char **argv;
                    195: {
                    196:   rtx desc;
                    197:   FILE *infile;
                    198:   extern rtx read_rtx ();
                    199:   register int c, i;
                    200: 
                    201:   obstack_begin (current_obstack, 4060);
                    202: 
                    203:   if (argc <= 1)
                    204:     fatal ("No input file name.");
                    205: 
                    206:   infile = fopen (argv[1], "r");
                    207:   if (infile == 0)
                    208:     {
                    209:       perror (argv[1]);
                    210:       exit (1);
                    211:     }
                    212: 
                    213:   init_rtl ();
                    214: 
                    215:   /* Assign sequential codes to all entries in the machine description
                    216:      in parallel with the tables in insn-output.c.  */
                    217: 
                    218:   insn_code_number = 0;
                    219: 
                    220:   printf ("/* Generated automatically by the program `genextract'\n\
                    221: from the machine description file `md'.  */\n\n");
                    222: 
                    223:   printf ("#include \"rtl.h\"\n\n");
                    224: 
                    225:   printf ("extern rtx recog_operand[];\n");
                    226:   printf ("extern rtx *recog_operand_loc[];\n");
                    227:   printf ("extern rtx *recog_dup_loc[];\n");
                    228:   printf ("extern char recog_dup_num[];\n\n");
                    229: 
                    230:   /* Read the machine description.  */
                    231: 
                    232:   while (1)
                    233:     {
                    234:       c = read_skip_spaces (infile);
                    235:       if (c == EOF)
                    236:        break;
                    237:       ungetc (c, infile);
                    238: 
                    239:       desc = read_rtx (infile);
                    240:       gen_insn (desc);
                    241:       ++insn_code_number;
                    242:     }
                    243: 
                    244:   printf ("int (*insn_extract_fn[]) () =\n{ ");
                    245:   for (i = 0; i < insn_code_number; i++)
                    246:     {
                    247:       if (i % 4 != 0)
                    248:        printf (", ");
                    249:       else if (i != 0)
                    250:        printf (",\n  ");
                    251:       printf ("extract_%d", i);
                    252:     }
                    253:   printf ("\n};\n\n");
                    254: 
                    255:   printf ("void\ninsn_extract (insn)\n");
                    256:   printf ("     rtx insn;\n");
                    257:   printf ("{\n  if (INSN_CODE (insn) == -1) abort ();\n");
                    258:   printf ("  (*insn_extract_fn[INSN_CODE (insn)]) (PATTERN (insn));\n}\n");
                    259:   return 0;
                    260: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.