genextract.c (18334) | genextract.c (50397) |
---|---|
1/* Generate code from machine description to extract operands from insn as rtl. | 1/* Generate code from machine description to extract operands from insn as rtl. |
2 Copyright (C) 1987, 1991, 1992, 1993 Free Software Foundation, Inc. | 2 Copyright (C) 1987, 91, 92, 93, 97, 1998 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 | 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" | 22#include "hconfig.h" |
23#ifdef __STDC__ 24#include <stdarg.h> 25#else 26#include <varargs.h> 27#endif 28#include "system.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 | 29#include "rtl.h" 30#include "obstack.h" 31#include "insn-config.h" 32 33static struct obstack obstack; 34struct obstack *rtl_obstack = &obstack; 35 36#define obstack_chunk_alloc xmalloc 37#define obstack_chunk_free free 38 |
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 | 39/* Names for patterns. Need to allow linking with print-rtl. */ 40char **insn_name_ptr; 41 42/* This structure contains all the information needed to describe one 43 set of extractions methods. Each method may be used by more than 44 one pattern if the operands are in the same place. 45 46 The string for each operand describes that path to the operand and --- 48 unchanged lines hidden (view full) --- 95/* Record the operand number of any MATCH_DUPs. */ 96 97static int dupnums[MAX_DUP_OPERANDS]; 98 99/* Record the list of insn_codes for peepholes. */ 100 101static struct code_ptr *peepholes; 102 |
101static void walk_rtx (); 102static void print_path (); 103char *xmalloc (); 104char *xrealloc (); 105static void fatal (); 106static char *copystr (); | 103static void gen_insn PROTO ((rtx)); 104static void walk_rtx PROTO ((rtx, char *)); 105static void print_path PROTO ((char *)); 106char *xmalloc PROTO ((unsigned)); 107char *xrealloc PROTO ((char *, unsigned)); 108static void fatal PVPROTO ((char *, ...)) ATTRIBUTE_PRINTF_1; 109static char *copystr PROTO ((char *)); |
107static void mybzero (); | 110static void mybzero (); |
108void fancy_abort (); | 111void fancy_abort PROTO ((void)); |
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 | 112 113static void 114gen_insn (insn) 115 rtx insn; 116{ 117 register int i; 118 register struct extraction *p; 119 register struct code_ptr *link; --- 18 unchanged lines hidden (view full) --- 138 path[1] = 0; 139 140 walk_rtx (XVECEXP (insn, 1, i), path); 141 } 142 143 link = (struct code_ptr *) xmalloc (sizeof (struct code_ptr)); 144 link->insn_code = insn_code_number; 145 |
143 /* See if we find something that already had this extraction method. */ | 146 /* 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; | 147 148 for (p = extractions; p; p = p->next) 149 { 150 if (p->op_count != op_count || p->dup_count != dup_count) 151 continue; 152 153 for (i = 0; i < op_count; i++) 154 if (p->oplocs[i] != oplocs[i] --- 39 unchanged lines hidden (view full) --- 194walk_rtx (x, path) 195 rtx x; 196 char *path; 197{ 198 register RTX_CODE code; 199 register int i; 200 register int len; 201 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; | 202 int depth = strlen (path); 203 char *newpath; 204 205 if (x == 0) 206 return; 207 208 code = GET_CODE (x); 209 --- 62 unchanged lines hidden (view full) --- 272 newpath[depth] = 'a' + i; 273 walk_rtx (XVECEXP (x, 2, i), newpath); 274 } 275 return; 276 277 case ADDRESS: 278 walk_rtx (XEXP (x, 0), path); 279 return; |
280 281 default: 282 break; |
|
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 | 283 } 284 285 newpath = (char *) alloca (depth + 2); 286 strcpy (newpath, path); 287 newpath[depth + 1] = 0; 288 289 fmt = GET_RTX_FORMAT (code); 290 len = GET_RTX_LENGTH (code); --- 22 unchanged lines hidden (view full) --- 313 314static void 315print_path (path) 316 char *path; 317{ 318 register int len = strlen (path); 319 register int i; 320 |
321 if (len == 0) 322 { 323 /* Don't emit "pat", since we may try to take the address of it, 324 which isn't what is intended. */ 325 printf("PATTERN (insn)"); 326 return; 327 } 328 |
|
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 | 329 /* We first write out the operations (XEXP or XVECEXP) in reverse 330 order, then write "insn", then the indices in forward order. */ 331 332 for (i = len - 1; i >=0 ; i--) 333 { 334 if (path[i] >= 'a' && path[i] <= 'z') 335 printf ("XVECEXP ("); 336 else if (path[i] >= '0' && path[i] <= '9') --- 33 unchanged lines hidden (view full) --- 370{ 371 char *result = (char *) realloc (ptr, size); 372 if (!result) 373 fatal ("virtual memory exhausted"); 374 return result; 375} 376 377static void |
365fatal (s, a1, a2) 366 char *s; | 378fatal VPROTO ((char *format, ...)) |
367{ | 379{ |
380#ifndef __STDC__ 381 char *format; 382#endif 383 va_list ap; 384 385 VA_START (ap, format); 386 387#ifndef __STDC__ 388 format = va_arg (ap, char *); 389#endif 390 |
|
368 fprintf (stderr, "genextract: "); | 391 fprintf (stderr, "genextract: "); |
369 fprintf (stderr, s, a1, a2); | 392 vfprintf (stderr, format, ap); 393 va_end (ap); |
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"); | 394 fprintf (stderr, "\n"); 395 exit (FATAL_EXIT_CODE); 396} 397 398/* More 'friendly' abort that prints the line and file. 399 config.h can #define abort fancy_abort if you like that sort of thing. */ 400 401void --- 55 unchanged lines hidden (view full) --- 457 in parallel with the tables in insn-output.c. */ 458 459 insn_code_number = 0; 460 461 printf ("/* Generated automatically by the program `genextract'\n\ 462from the machine description file `md'. */\n\n"); 463 464 printf ("#include \"config.h\"\n"); |
465 printf ("#include \"system.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. */ | 466 printf ("#include \"rtl.h\"\n\n"); 467 468 /* This variable exists only so it can be the "location" 469 of any missing operand whose numbers are skipped by a given pattern. */ |
445 printf ("static rtx junk;\n"); | 470 printf ("static rtx junk ATTRIBUTE_UNUSED;\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"); | 471 472 printf ("extern rtx recog_operand[];\n"); 473 printf ("extern rtx *recog_operand_loc[];\n"); 474 printf ("extern rtx *recog_dup_loc[];\n"); 475 printf ("extern char recog_dup_num[];\n"); 476 477 printf ("void\ninsn_extract (insn)\n"); 478 printf (" rtx insn;\n"); 479 printf ("{\n"); 480 printf (" register rtx *ro = recog_operand;\n"); 481 printf (" register rtx **ro_loc = recog_operand_loc;\n"); 482 printf (" rtx pat = PATTERN (insn);\n"); |
483 printf (" int i ATTRIBUTE_UNUSED;\n\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. */ | 484 printf (" switch (INSN_CODE (insn))\n"); 485 printf (" {\n"); 486 printf (" case -1:\n"); 487 printf (" fatal_insn_not_found (insn);\n\n"); 488 489 /* Read the machine description. */ 490 491 while (1) --- 31 unchanged lines hidden (view full) --- 523 if (peepholes) 524 { 525 for (link = peepholes; link; link = link->next) 526 printf (" case %d:\n", link->insn_code); 527 528 /* The vector in the insn says how many operands it has. 529 And all it contains are operands. In fact, the vector was 530 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"); | 531 printf (" for (i = XVECLEN (pat, 0) - 1; i >= 0; i--)\n"); 532 printf (" ro[i] = XVECEXP (pat, 0, i);\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 --- | 533 printf (" break;\n\n"); 534 } 535 536 /* Write out all the ways to extract insn operands. */ 537 for (p = extractions; p; p = p->next) 538 { 539 for (link = p->insns; link; link = link->next) 540 printf (" case %d:\n", link->insn_code); --- 39 unchanged lines hidden --- |