Deleted Added
sdiff udiff text old ( 18334 ) new ( 50397 )
full compact
1/* Generate code from machine description to extract operands from insn as rtl.
2 Copyright (C) 1987, 1991, 1992, 1993 Free Software Foundation, Inc.
3
4This file is part of GNU CC.
5
6GNU CC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU CC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU CC; see the file COPYING. If not, write to
18the Free Software Foundation, 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
20
21
22#include <stdio.h>
23#include "hconfig.h"
24#include "rtl.h"
25#include "obstack.h"
26#include "insn-config.h"
27
28static struct obstack obstack;
29struct obstack *rtl_obstack = &obstack;
30
31#define obstack_chunk_alloc xmalloc
32#define obstack_chunk_free free
33
34extern void free ();
35extern rtx read_rtx ();
36
37/* Names for patterns. Need to allow linking with print-rtl. */
38char **insn_name_ptr;
39
40/* This structure contains all the information needed to describe one
41 set of extractions methods. Each method may be used by more than
42 one pattern if the operands are in the same place.
43
44 The string for each operand describes that path to the operand and

--- 48 unchanged lines hidden (view full) ---

93/* Record the operand number of any MATCH_DUPs. */
94
95static int dupnums[MAX_DUP_OPERANDS];
96
97/* Record the list of insn_codes for peepholes. */
98
99static struct code_ptr *peepholes;
100
101static void walk_rtx ();
102static void print_path ();
103char *xmalloc ();
104char *xrealloc ();
105static void fatal ();
106static char *copystr ();
107static void mybzero ();
108void fancy_abort ();
109
110static void
111gen_insn (insn)
112 rtx insn;
113{
114 register int i;
115 register struct extraction *p;
116 register struct code_ptr *link;

--- 18 unchanged lines hidden (view full) ---

135 path[1] = 0;
136
137 walk_rtx (XVECEXP (insn, 1, i), path);
138 }
139
140 link = (struct code_ptr *) xmalloc (sizeof (struct code_ptr));
141 link->insn_code = insn_code_number;
142
143 /* See if we find something that already had this extraction method. */
144
145 for (p = extractions; p; p = p->next)
146 {
147 if (p->op_count != op_count || p->dup_count != dup_count)
148 continue;
149
150 for (i = 0; i < op_count; i++)
151 if (p->oplocs[i] != oplocs[i]

--- 39 unchanged lines hidden (view full) ---

191walk_rtx (x, path)
192 rtx x;
193 char *path;
194{
195 register RTX_CODE code;
196 register int i;
197 register int len;
198 register char *fmt;
199 register struct code_ptr *link;
200 int depth = strlen (path);
201 char *newpath;
202
203 if (x == 0)
204 return;
205
206 code = GET_CODE (x);
207

--- 62 unchanged lines hidden (view full) ---

270 newpath[depth] = 'a' + i;
271 walk_rtx (XVECEXP (x, 2, i), newpath);
272 }
273 return;
274
275 case ADDRESS:
276 walk_rtx (XEXP (x, 0), path);
277 return;
278 }
279
280 newpath = (char *) alloca (depth + 2);
281 strcpy (newpath, path);
282 newpath[depth + 1] = 0;
283
284 fmt = GET_RTX_FORMAT (code);
285 len = GET_RTX_LENGTH (code);

--- 22 unchanged lines hidden (view full) ---

308
309static void
310print_path (path)
311 char *path;
312{
313 register int len = strlen (path);
314 register int i;
315
316 /* We first write out the operations (XEXP or XVECEXP) in reverse
317 order, then write "insn", then the indices in forward order. */
318
319 for (i = len - 1; i >=0 ; i--)
320 {
321 if (path[i] >= 'a' && path[i] <= 'z')
322 printf ("XVECEXP (");
323 else if (path[i] >= '0' && path[i] <= '9')

--- 33 unchanged lines hidden (view full) ---

357{
358 char *result = (char *) realloc (ptr, size);
359 if (!result)
360 fatal ("virtual memory exhausted");
361 return result;
362}
363
364static void
365fatal (s, a1, a2)
366 char *s;
367{
368 fprintf (stderr, "genextract: ");
369 fprintf (stderr, s, a1, a2);
370 fprintf (stderr, "\n");
371 exit (FATAL_EXIT_CODE);
372}
373
374/* More 'friendly' abort that prints the line and file.
375 config.h can #define abort fancy_abort if you like that sort of thing. */
376
377void

--- 55 unchanged lines hidden (view full) ---

433 in parallel with the tables in insn-output.c. */
434
435 insn_code_number = 0;
436
437 printf ("/* Generated automatically by the program `genextract'\n\
438from the machine description file `md'. */\n\n");
439
440 printf ("#include \"config.h\"\n");
441 printf ("#include \"rtl.h\"\n\n");
442
443 /* This variable exists only so it can be the "location"
444 of any missing operand whose numbers are skipped by a given pattern. */
445 printf ("static rtx junk;\n");
446
447 printf ("extern rtx recog_operand[];\n");
448 printf ("extern rtx *recog_operand_loc[];\n");
449 printf ("extern rtx *recog_dup_loc[];\n");
450 printf ("extern char recog_dup_num[];\n");
451
452 printf ("void\ninsn_extract (insn)\n");
453 printf (" rtx insn;\n");
454 printf ("{\n");
455 printf (" register rtx *ro = recog_operand;\n");
456 printf (" register rtx **ro_loc = recog_operand_loc;\n");
457 printf (" rtx pat = PATTERN (insn);\n");
458 printf (" switch (INSN_CODE (insn))\n");
459 printf (" {\n");
460 printf (" case -1:\n");
461 printf (" fatal_insn_not_found (insn);\n\n");
462
463 /* Read the machine description. */
464
465 while (1)

--- 31 unchanged lines hidden (view full) ---

497 if (peepholes)
498 {
499 for (link = peepholes; link; link = link->next)
500 printf (" case %d:\n", link->insn_code);
501
502 /* The vector in the insn says how many operands it has.
503 And all it contains are operands. In fact, the vector was
504 created just for the sake of this function. */
505 printf ("#if __GNUC__ > 1 && !defined (bcopy)\n");
506 printf ("#define bcopy(FROM,TO,COUNT) __builtin_memcpy(TO,FROM,COUNT)\n");
507 printf ("#endif\n");
508 printf (" bcopy (&XVECEXP (pat, 0, 0), ro,\n");
509 printf (" sizeof (rtx) * XVECLEN (pat, 0));\n");
510 printf (" break;\n\n");
511 }
512
513 /* Write out all the ways to extract insn operands. */
514 for (p = extractions; p; p = p->next)
515 {
516 for (link = p->insns; link; link = link->next)
517 printf (" case %d:\n", link->insn_code);

--- 39 unchanged lines hidden ---