1 /* Generate code from to output assembler insns as recognized from rtl. 2 Copyright (C) 1987, 1988, 1992, 1994, 1995, 1997, 1998, 1999, 2000, 2002, 3 2003, 2004, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. 4 5 This file is part of GCC. 6 7 GCC is free software; you can redistribute it and/or modify it under 8 the terms of the GNU General Public License as published by the Free 9 Software Foundation; either version 3, or (at your option) any later 10 version. 11 12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13 WARRANTY; without even the implied warranty of MERCHANTABILITY or 14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15 for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with GCC; see the file COPYING3. If not see 19 <http://www.gnu.org/licenses/>. */ 20 21 22 /* This program reads the machine description for the compiler target machine 23 and produces a file containing these things: 24 25 1. An array of `struct insn_data_d', which is indexed by insn code number, 26 which contains: 27 28 a. `name' is the name for that pattern. Nameless patterns are 29 given a name. 30 31 b. `output' hold either the output template, an array of output 32 templates, or an output function. 33 34 c. `genfun' is the function to generate a body for that pattern, 35 given operands as arguments. 36 37 d. `n_operands' is the number of distinct operands in the pattern 38 for that insn, 39 40 e. `n_dups' is the number of match_dup's that appear in the insn's 41 pattern. This says how many elements of `recog_data.dup_loc' are 42 significant after an insn has been recognized. 43 44 f. `n_alternatives' is the number of alternatives in the constraints 45 of each pattern. 46 47 g. `output_format' tells what type of thing `output' is. 48 49 h. `operand' is the base of an array of operand data for the insn. 50 51 2. An array of `struct insn_operand data', used by `operand' above. 52 53 a. `predicate', an int-valued function, is the match_operand predicate 54 for this operand. 55 56 b. `constraint' is the constraint for this operand. 57 58 c. `address_p' indicates that the operand appears within ADDRESS 59 rtx's. 60 61 d. `mode' is the machine mode that that operand is supposed to have. 62 63 e. `strict_low', is nonzero for operands contained in a STRICT_LOW_PART. 64 65 f. `eliminable', is nonzero for operands that are matched normally by 66 MATCH_OPERAND; it is zero for operands that should not be changed during 67 register elimination such as MATCH_OPERATORs. 68 69 g. `allows_mem', is true for operands that accept MEM rtxes. 70 71 The code number of an insn is simply its position in the machine 72 description; code numbers are assigned sequentially to entries in 73 the description, starting with code number 0. 74 75 Thus, the following entry in the machine description 76 77 (define_insn "clrdf" 78 [(set (match_operand:DF 0 "general_operand" "") 79 (const_int 0))] 80 "" 81 "clrd %0") 82 83 assuming it is the 25th entry present, would cause 84 insn_data[24].template to be "clrd %0", and 85 insn_data[24].n_operands to be 1. */ 86 87 #include "bconfig.h" 88 #include "system.h" 89 #include "coretypes.h" 90 #include "tm.h" 91 #include "rtl.h" 92 #include "errors.h" 93 #include "read-md.h" 94 #include "gensupport.h" 95 96 /* No instruction can have more operands than this. Sorry for this 97 arbitrary limit, but what machine will have an instruction with 98 this many operands? */ 99 100 #define MAX_MAX_OPERANDS 40 101 102 static int n_occurrences (int, const char *); 103 static const char *strip_whitespace (const char *); 104 105 /* insns in the machine description are assigned sequential code numbers 106 that are used by insn-recog.c (produced by genrecog) to communicate 107 to insn-output.c (produced by this program). */ 108 109 static int next_code_number; 110 111 /* This counts all definitions in the md file, 112 for the sake of error messages. */ 113 114 static int next_index_number; 115 116 /* This counts all operands used in the md file. The first is null. */ 117 118 static int next_operand_number = 1; 119 120 /* Record in this chain all information about the operands we will output. */ 121 122 struct operand_data 123 { 124 struct operand_data *next; 125 int index; 126 const char *predicate; 127 const char *constraint; 128 enum machine_mode mode; 129 unsigned char n_alternatives; 130 char address_p; 131 char strict_low; 132 char eliminable; 133 char seen; 134 }; 135 136 /* Begin with a null operand at index 0. */ 137 138 static struct operand_data null_operand = 139 { 140 0, 0, "", "", VOIDmode, 0, 0, 0, 0, 0 141 }; 142 143 static struct operand_data *odata = &null_operand; 144 static struct operand_data **odata_end = &null_operand.next; 145 146 /* Must match the constants in recog.h. */ 147 148 #define INSN_OUTPUT_FORMAT_NONE 0 /* abort */ 149 #define INSN_OUTPUT_FORMAT_SINGLE 1 /* const char * */ 150 #define INSN_OUTPUT_FORMAT_MULTI 2 /* const char * const * */ 151 #define INSN_OUTPUT_FORMAT_FUNCTION 3 /* const char * (*)(...) */ 152 153 /* Record in this chain all information that we will output, 154 associated with the code number of the insn. */ 155 156 struct data 157 { 158 struct data *next; 159 const char *name; 160 const char *template_code; 161 int code_number; 162 int index_number; 163 const char *filename; 164 int lineno; 165 int n_generator_args; /* Number of arguments passed to generator */ 166 int n_operands; /* Number of operands this insn recognizes */ 167 int n_dups; /* Number times match_dup appears in pattern */ 168 int n_alternatives; /* Number of alternatives in each constraint */ 169 int operand_number; /* Operand index in the big array. */ 170 int output_format; /* INSN_OUTPUT_FORMAT_*. */ 171 struct operand_data operand[MAX_MAX_OPERANDS]; 172 }; 173 174 /* This variable points to the first link in the insn chain. */ 175 176 static struct data *idata, **idata_end = &idata; 177 178 static void output_prologue (void); 179 static void output_operand_data (void); 180 static void output_insn_data (void); 181 static void output_get_insn_name (void); 182 static void scan_operands (struct data *, rtx, int, int); 183 static int compare_operands (struct operand_data *, 184 struct operand_data *); 185 static void place_operands (struct data *); 186 static void process_template (struct data *, const char *); 187 static void validate_insn_alternatives (struct data *); 188 static void validate_insn_operands (struct data *); 189 static void gen_insn (rtx, int); 190 static void gen_peephole (rtx, int); 191 static void gen_expand (rtx, int); 192 static void gen_split (rtx, int); 193 194 #ifdef USE_MD_CONSTRAINTS 195 196 struct constraint_data 197 { 198 struct constraint_data *next_this_letter; 199 int lineno; 200 unsigned int namelen; 201 const char name[1]; 202 }; 203 204 /* This is a complete list (unlike the one in genpreds.c) of constraint 205 letters and modifiers with machine-independent meaning. The only 206 omission is digits, as these are handled specially. */ 207 static const char indep_constraints[] = ",=+%*?!#&<>EFVXgimnoprs"; 208 209 static struct constraint_data * 210 constraints_by_letter_table[1 << CHAR_BIT]; 211 212 static int mdep_constraint_len (const char *, int, int); 213 static void note_constraint (rtx, int); 214 215 #else /* !USE_MD_CONSTRAINTS */ 216 217 static void check_constraint_len (void); 218 static int constraint_len (const char *, int); 219 220 #endif /* !USE_MD_CONSTRAINTS */ 221 222 223 static void 224 output_prologue (void) 225 { 226 printf ("/* Generated automatically by the program `genoutput'\n\ 227 from the machine description file `md'. */\n\n"); 228 229 printf ("#include \"config.h\"\n"); 230 printf ("#include \"system.h\"\n"); 231 printf ("#include \"coretypes.h\"\n"); 232 printf ("#include \"tm.h\"\n"); 233 printf ("#include \"flags.h\"\n"); 234 printf ("#include \"ggc.h\"\n"); 235 printf ("#include \"rtl.h\"\n"); 236 printf ("#include \"expr.h\"\n"); 237 printf ("#include \"insn-codes.h\"\n"); 238 printf ("#include \"tm_p.h\"\n"); 239 printf ("#include \"function.h\"\n"); 240 printf ("#include \"regs.h\"\n"); 241 printf ("#include \"hard-reg-set.h\"\n"); 242 printf ("#include \"insn-config.h\"\n\n"); 243 printf ("#include \"conditions.h\"\n"); 244 printf ("#include \"insn-attr.h\"\n\n"); 245 printf ("#include \"recog.h\"\n\n"); 246 printf ("#include \"diagnostic-core.h\"\n"); 247 printf ("#include \"output.h\"\n"); 248 printf ("#include \"target.h\"\n"); 249 printf ("#include \"tm-constrs.h\"\n"); 250 } 251 252 static void 253 output_operand_data (void) 254 { 255 struct operand_data *d; 256 257 printf ("\nstatic const struct insn_operand_data operand_data[] = \n{\n"); 258 259 for (d = odata; d; d = d->next) 260 { 261 struct pred_data *pred; 262 263 printf (" {\n"); 264 265 printf (" %s,\n", 266 d->predicate && d->predicate[0] ? d->predicate : "0"); 267 268 printf (" \"%s\",\n", d->constraint ? d->constraint : ""); 269 270 printf (" %smode,\n", GET_MODE_NAME (d->mode)); 271 272 printf (" %d,\n", d->strict_low); 273 274 printf (" %d,\n", d->constraint == NULL ? 1 : 0); 275 276 printf (" %d,\n", d->eliminable); 277 278 pred = NULL; 279 if (d->predicate) 280 pred = lookup_predicate (d->predicate); 281 printf (" %d\n", pred && pred->codes[MEM]); 282 283 printf(" },\n"); 284 } 285 printf("};\n\n\n"); 286 } 287 288 static void 289 output_insn_data (void) 290 { 291 struct data *d; 292 int name_offset = 0; 293 int next_name_offset; 294 const char * last_name = 0; 295 const char * next_name = 0; 296 struct data *n; 297 298 for (n = idata, next_name_offset = 1; n; n = n->next, next_name_offset++) 299 if (n->name) 300 { 301 next_name = n->name; 302 break; 303 } 304 305 printf ("#if GCC_VERSION >= 2007\n__extension__\n#endif\n"); 306 printf ("\nconst struct insn_data_d insn_data[] = \n{\n"); 307 308 for (d = idata; d; d = d->next) 309 { 310 printf (" /* %s:%d */\n", d->filename, d->lineno); 311 printf (" {\n"); 312 313 if (d->name) 314 { 315 printf (" \"%s\",\n", d->name); 316 name_offset = 0; 317 last_name = d->name; 318 next_name = 0; 319 for (n = d->next, next_name_offset = 1; n; 320 n = n->next, next_name_offset++) 321 { 322 if (n->name) 323 { 324 next_name = n->name; 325 break; 326 } 327 } 328 } 329 else 330 { 331 name_offset++; 332 if (next_name && (last_name == 0 333 || name_offset > next_name_offset / 2)) 334 printf (" \"%s-%d\",\n", next_name, 335 next_name_offset - name_offset); 336 else 337 printf (" \"%s+%d\",\n", last_name, name_offset); 338 } 339 340 switch (d->output_format) 341 { 342 case INSN_OUTPUT_FORMAT_NONE: 343 printf ("#if HAVE_DESIGNATED_UNION_INITIALIZERS\n"); 344 printf (" { 0 },\n"); 345 printf ("#else\n"); 346 printf (" { 0, 0, 0 },\n"); 347 printf ("#endif\n"); 348 break; 349 case INSN_OUTPUT_FORMAT_SINGLE: 350 { 351 const char *p = d->template_code; 352 char prev = 0; 353 354 printf ("#if HAVE_DESIGNATED_UNION_INITIALIZERS\n"); 355 printf (" { .single =\n"); 356 printf ("#else\n"); 357 printf (" {\n"); 358 printf ("#endif\n"); 359 printf (" \""); 360 while (*p) 361 { 362 if (IS_VSPACE (*p) && prev != '\\') 363 { 364 /* Preserve two consecutive \n's or \r's, but treat \r\n 365 as a single newline. */ 366 if (*p == '\n' && prev != '\r') 367 printf ("\\n\\\n"); 368 } 369 else 370 putchar (*p); 371 prev = *p; 372 ++p; 373 } 374 printf ("\",\n"); 375 printf ("#if HAVE_DESIGNATED_UNION_INITIALIZERS\n"); 376 printf (" },\n"); 377 printf ("#else\n"); 378 printf (" 0, 0 },\n"); 379 printf ("#endif\n"); 380 } 381 break; 382 case INSN_OUTPUT_FORMAT_MULTI: 383 printf ("#if HAVE_DESIGNATED_UNION_INITIALIZERS\n"); 384 printf (" { .multi = output_%d },\n", d->code_number); 385 printf ("#else\n"); 386 printf (" { 0, output_%d, 0 },\n", d->code_number); 387 printf ("#endif\n"); 388 break; 389 case INSN_OUTPUT_FORMAT_FUNCTION: 390 printf ("#if HAVE_DESIGNATED_UNION_INITIALIZERS\n"); 391 printf (" { .function = output_%d },\n", d->code_number); 392 printf ("#else\n"); 393 printf (" { 0, 0, output_%d },\n", d->code_number); 394 printf ("#endif\n"); 395 break; 396 default: 397 gcc_unreachable (); 398 } 399 400 if (d->name && d->name[0] != '*') 401 printf (" (insn_gen_fn) gen_%s,\n", d->name); 402 else 403 printf (" 0,\n"); 404 405 printf (" &operand_data[%d],\n", d->operand_number); 406 printf (" %d,\n", d->n_generator_args); 407 printf (" %d,\n", d->n_operands); 408 printf (" %d,\n", d->n_dups); 409 printf (" %d,\n", d->n_alternatives); 410 printf (" %d\n", d->output_format); 411 412 printf(" },\n"); 413 } 414 printf ("};\n\n\n"); 415 } 416 417 static void 418 output_get_insn_name (void) 419 { 420 printf ("const char *\n"); 421 printf ("get_insn_name (int code)\n"); 422 printf ("{\n"); 423 printf (" if (code == NOOP_MOVE_INSN_CODE)\n"); 424 printf (" return \"NOOP_MOVE\";\n"); 425 printf (" else\n"); 426 printf (" return insn_data[code].name;\n"); 427 printf ("}\n"); 428 } 429 430 431 /* Stores the operand data into `d->operand[i]'. 432 433 THIS_ADDRESS_P is nonzero if the containing rtx was an ADDRESS. 434 THIS_STRICT_LOW is nonzero if the containing rtx was a STRICT_LOW_PART. */ 435 436 static void 437 scan_operands (struct data *d, rtx part, int this_address_p, 438 int this_strict_low) 439 { 440 int i, j; 441 const char *format_ptr; 442 int opno; 443 444 if (part == 0) 445 return; 446 447 switch (GET_CODE (part)) 448 { 449 case MATCH_OPERAND: 450 opno = XINT (part, 0); 451 if (opno >= MAX_MAX_OPERANDS) 452 { 453 error_with_line (d->lineno, "maximum number of operands exceeded"); 454 return; 455 } 456 if (d->operand[opno].seen) 457 error_with_line (d->lineno, "repeated operand number %d\n", opno); 458 459 d->operand[opno].seen = 1; 460 d->operand[opno].mode = GET_MODE (part); 461 d->operand[opno].strict_low = this_strict_low; 462 d->operand[opno].predicate = XSTR (part, 1); 463 d->operand[opno].constraint = strip_whitespace (XSTR (part, 2)); 464 d->operand[opno].n_alternatives 465 = n_occurrences (',', d->operand[opno].constraint) + 1; 466 d->operand[opno].address_p = this_address_p; 467 d->operand[opno].eliminable = 1; 468 return; 469 470 case MATCH_SCRATCH: 471 opno = XINT (part, 0); 472 if (opno >= MAX_MAX_OPERANDS) 473 { 474 error_with_line (d->lineno, "maximum number of operands exceeded"); 475 return; 476 } 477 if (d->operand[opno].seen) 478 error_with_line (d->lineno, "repeated operand number %d\n", opno); 479 480 d->operand[opno].seen = 1; 481 d->operand[opno].mode = GET_MODE (part); 482 d->operand[opno].strict_low = 0; 483 d->operand[opno].predicate = "scratch_operand"; 484 d->operand[opno].constraint = strip_whitespace (XSTR (part, 1)); 485 d->operand[opno].n_alternatives 486 = n_occurrences (',', d->operand[opno].constraint) + 1; 487 d->operand[opno].address_p = 0; 488 d->operand[opno].eliminable = 0; 489 return; 490 491 case MATCH_OPERATOR: 492 case MATCH_PARALLEL: 493 opno = XINT (part, 0); 494 if (opno >= MAX_MAX_OPERANDS) 495 { 496 error_with_line (d->lineno, "maximum number of operands exceeded"); 497 return; 498 } 499 if (d->operand[opno].seen) 500 error_with_line (d->lineno, "repeated operand number %d\n", opno); 501 502 d->operand[opno].seen = 1; 503 d->operand[opno].mode = GET_MODE (part); 504 d->operand[opno].strict_low = 0; 505 d->operand[opno].predicate = XSTR (part, 1); 506 d->operand[opno].constraint = 0; 507 d->operand[opno].address_p = 0; 508 d->operand[opno].eliminable = 0; 509 for (i = 0; i < XVECLEN (part, 2); i++) 510 scan_operands (d, XVECEXP (part, 2, i), 0, 0); 511 return; 512 513 case ADDRESS: 514 scan_operands (d, XEXP (part, 0), 1, 0); 515 return; 516 517 case STRICT_LOW_PART: 518 scan_operands (d, XEXP (part, 0), 0, 1); 519 return; 520 521 default: 522 break; 523 } 524 525 format_ptr = GET_RTX_FORMAT (GET_CODE (part)); 526 527 for (i = 0; i < GET_RTX_LENGTH (GET_CODE (part)); i++) 528 switch (*format_ptr++) 529 { 530 case 'e': 531 case 'u': 532 scan_operands (d, XEXP (part, i), 0, 0); 533 break; 534 case 'E': 535 if (XVEC (part, i) != NULL) 536 for (j = 0; j < XVECLEN (part, i); j++) 537 scan_operands (d, XVECEXP (part, i, j), 0, 0); 538 break; 539 } 540 } 541 542 /* Compare two operands for content equality. */ 543 544 static int 545 compare_operands (struct operand_data *d0, struct operand_data *d1) 546 { 547 const char *p0, *p1; 548 549 p0 = d0->predicate; 550 if (!p0) 551 p0 = ""; 552 p1 = d1->predicate; 553 if (!p1) 554 p1 = ""; 555 if (strcmp (p0, p1) != 0) 556 return 0; 557 558 p0 = d0->constraint; 559 if (!p0) 560 p0 = ""; 561 p1 = d1->constraint; 562 if (!p1) 563 p1 = ""; 564 if (strcmp (p0, p1) != 0) 565 return 0; 566 567 if (d0->mode != d1->mode) 568 return 0; 569 570 if (d0->strict_low != d1->strict_low) 571 return 0; 572 573 if (d0->eliminable != d1->eliminable) 574 return 0; 575 576 return 1; 577 } 578 579 /* Scan the list of operands we've already committed to output and either 580 find a subsequence that is the same, or allocate a new one at the end. */ 581 582 static void 583 place_operands (struct data *d) 584 { 585 struct operand_data *od, *od2; 586 int i; 587 588 if (d->n_operands == 0) 589 { 590 d->operand_number = 0; 591 return; 592 } 593 594 /* Brute force substring search. */ 595 for (od = odata, i = 0; od; od = od->next, i = 0) 596 if (compare_operands (od, &d->operand[0])) 597 { 598 od2 = od->next; 599 i = 1; 600 while (1) 601 { 602 if (i == d->n_operands) 603 goto full_match; 604 if (od2 == NULL) 605 goto partial_match; 606 if (! compare_operands (od2, &d->operand[i])) 607 break; 608 ++i, od2 = od2->next; 609 } 610 } 611 612 /* Either partial match at the end of the list, or no match. In either 613 case, we tack on what operands are remaining to the end of the list. */ 614 partial_match: 615 d->operand_number = next_operand_number - i; 616 for (; i < d->n_operands; ++i) 617 { 618 od2 = &d->operand[i]; 619 *odata_end = od2; 620 odata_end = &od2->next; 621 od2->index = next_operand_number++; 622 } 623 *odata_end = NULL; 624 return; 625 626 full_match: 627 d->operand_number = od->index; 628 return; 629 } 630 631 632 /* Process an assembler template from a define_insn or a define_peephole. 633 It is either the assembler code template, a list of assembler code 634 templates, or C code to generate the assembler code template. */ 635 636 static void 637 process_template (struct data *d, const char *template_code) 638 { 639 const char *cp; 640 int i; 641 642 /* Templates starting with * contain straight code to be run. */ 643 if (template_code[0] == '*') 644 { 645 d->template_code = 0; 646 d->output_format = INSN_OUTPUT_FORMAT_FUNCTION; 647 648 puts ("\nstatic const char *"); 649 printf ("output_%d (rtx *operands ATTRIBUTE_UNUSED, rtx insn ATTRIBUTE_UNUSED)\n", 650 d->code_number); 651 puts ("{"); 652 print_md_ptr_loc (template_code); 653 puts (template_code + 1); 654 puts ("}"); 655 } 656 657 /* If the assembler code template starts with a @ it is a newline-separated 658 list of assembler code templates, one for each alternative. */ 659 else if (template_code[0] == '@') 660 { 661 d->template_code = 0; 662 d->output_format = INSN_OUTPUT_FORMAT_MULTI; 663 664 printf ("\nstatic const char * const output_%d[] = {\n", d->code_number); 665 666 for (i = 0, cp = &template_code[1]; *cp; ) 667 { 668 const char *ep, *sp; 669 670 while (ISSPACE (*cp)) 671 cp++; 672 673 printf (" \""); 674 675 for (ep = sp = cp; !IS_VSPACE (*ep) && *ep != '\0'; ++ep) 676 if (!ISSPACE (*ep)) 677 sp = ep + 1; 678 679 if (sp != ep) 680 message_with_line (d->lineno, 681 "trailing whitespace in output template"); 682 683 while (cp < sp) 684 { 685 putchar (*cp); 686 cp++; 687 } 688 689 printf ("\",\n"); 690 i++; 691 } 692 if (i == 1) 693 message_with_line (d->lineno, 694 "'@' is redundant for output template with single alternative"); 695 if (i != d->n_alternatives) 696 error_with_line (d->lineno, 697 "wrong number of alternatives in the output template"); 698 699 printf ("};\n"); 700 } 701 else 702 { 703 d->template_code = template_code; 704 d->output_format = INSN_OUTPUT_FORMAT_SINGLE; 705 } 706 } 707 708 /* Check insn D for consistency in number of constraint alternatives. */ 709 710 static void 711 validate_insn_alternatives (struct data *d) 712 { 713 int n = 0, start; 714 715 /* Make sure all the operands have the same number of alternatives 716 in their constraints. Let N be that number. */ 717 for (start = 0; start < d->n_operands; start++) 718 if (d->operand[start].n_alternatives > 0) 719 { 720 int len, i; 721 const char *p; 722 char c; 723 int which_alternative = 0; 724 int alternative_count_unsure = 0; 725 726 for (p = d->operand[start].constraint; (c = *p); p += len) 727 { 728 #ifdef USE_MD_CONSTRAINTS 729 if (ISSPACE (c) || strchr (indep_constraints, c)) 730 len = 1; 731 else if (ISDIGIT (c)) 732 { 733 const char *q = p; 734 do 735 q++; 736 while (ISDIGIT (*q)); 737 len = q - p; 738 } 739 else 740 len = mdep_constraint_len (p, d->lineno, start); 741 #else 742 len = CONSTRAINT_LEN (c, p); 743 744 if (len < 1 || (len > 1 && strchr (",#*+=&%!0123456789", c))) 745 { 746 error_with_line (d->lineno, 747 "invalid length %d for char '%c' in" 748 " alternative %d of operand %d", 749 len, c, which_alternative, start); 750 len = 1; 751 } 752 #endif 753 754 if (c == ',') 755 { 756 which_alternative++; 757 continue; 758 } 759 760 for (i = 1; i < len; i++) 761 if (p[i] == '\0') 762 { 763 error_with_line (d->lineno, 764 "NUL in alternative %d of operand %d", 765 which_alternative, start); 766 alternative_count_unsure = 1; 767 break; 768 } 769 else if (strchr (",#*", p[i])) 770 { 771 error_with_line (d->lineno, 772 "'%c' in alternative %d of operand %d", 773 p[i], which_alternative, start); 774 alternative_count_unsure = 1; 775 } 776 } 777 if (!alternative_count_unsure) 778 { 779 if (n == 0) 780 n = d->operand[start].n_alternatives; 781 else if (n != d->operand[start].n_alternatives) 782 error_with_line (d->lineno, 783 "wrong number of alternatives in operand %d", 784 start); 785 } 786 } 787 788 /* Record the insn's overall number of alternatives. */ 789 d->n_alternatives = n; 790 } 791 792 /* Verify that there are no gaps in operand numbers for INSNs. */ 793 794 static void 795 validate_insn_operands (struct data *d) 796 { 797 int i; 798 799 for (i = 0; i < d->n_operands; ++i) 800 if (d->operand[i].seen == 0) 801 error_with_line (d->lineno, "missing operand %d", i); 802 } 803 804 static void 805 validate_optab_operands (struct data *d) 806 { 807 if (!d->name || d->name[0] == '\0' || d->name[0] == '*') 808 return; 809 810 /* Miscellaneous tests. */ 811 if (strncmp (d->name, "cstore", 6) == 0 812 && d->name[strlen (d->name) - 1] == '4' 813 && d->operand[0].mode == VOIDmode) 814 { 815 message_with_line (d->lineno, "missing mode for operand 0 of cstore"); 816 have_error = 1; 817 } 818 } 819 820 /* Look at a define_insn just read. Assign its code number. Record 821 on idata the template and the number of arguments. If the insn has 822 a hairy output action, output a function for now. */ 823 824 static void 825 gen_insn (rtx insn, int lineno) 826 { 827 struct pattern_stats stats; 828 struct data *d = XNEW (struct data); 829 int i; 830 831 d->code_number = next_code_number; 832 d->index_number = next_index_number; 833 d->filename = read_md_filename; 834 d->lineno = lineno; 835 if (XSTR (insn, 0)[0]) 836 d->name = XSTR (insn, 0); 837 else 838 d->name = 0; 839 840 /* Build up the list in the same order as the insns are seen 841 in the machine description. */ 842 d->next = 0; 843 *idata_end = d; 844 idata_end = &d->next; 845 846 memset (d->operand, 0, sizeof (d->operand)); 847 848 for (i = 0; i < XVECLEN (insn, 1); i++) 849 scan_operands (d, XVECEXP (insn, 1, i), 0, 0); 850 851 get_pattern_stats (&stats, XVEC (insn, 1)); 852 d->n_generator_args = stats.num_generator_args; 853 d->n_operands = stats.num_insn_operands; 854 d->n_dups = stats.num_dups; 855 856 #ifndef USE_MD_CONSTRAINTS 857 check_constraint_len (); 858 #endif 859 validate_insn_operands (d); 860 validate_insn_alternatives (d); 861 validate_optab_operands (d); 862 place_operands (d); 863 process_template (d, XTMPL (insn, 3)); 864 } 865 866 /* Look at a define_peephole just read. Assign its code number. 867 Record on idata the template and the number of arguments. 868 If the insn has a hairy output action, output it now. */ 869 870 static void 871 gen_peephole (rtx peep, int lineno) 872 { 873 struct pattern_stats stats; 874 struct data *d = XNEW (struct data); 875 int i; 876 877 d->code_number = next_code_number; 878 d->index_number = next_index_number; 879 d->filename = read_md_filename; 880 d->lineno = lineno; 881 d->name = 0; 882 883 /* Build up the list in the same order as the insns are seen 884 in the machine description. */ 885 d->next = 0; 886 *idata_end = d; 887 idata_end = &d->next; 888 889 memset (d->operand, 0, sizeof (d->operand)); 890 891 /* Get the number of operands by scanning all the patterns of the 892 peephole optimizer. But ignore all the rest of the information 893 thus obtained. */ 894 for (i = 0; i < XVECLEN (peep, 0); i++) 895 scan_operands (d, XVECEXP (peep, 0, i), 0, 0); 896 897 get_pattern_stats (&stats, XVEC (peep, 0)); 898 d->n_generator_args = 0; 899 d->n_operands = stats.num_insn_operands; 900 d->n_dups = 0; 901 902 validate_insn_alternatives (d); 903 place_operands (d); 904 process_template (d, XTMPL (peep, 2)); 905 } 906 907 /* Process a define_expand just read. Assign its code number, 908 only for the purposes of `insn_gen_function'. */ 909 910 static void 911 gen_expand (rtx insn, int lineno) 912 { 913 struct pattern_stats stats; 914 struct data *d = XNEW (struct data); 915 int i; 916 917 d->code_number = next_code_number; 918 d->index_number = next_index_number; 919 d->filename = read_md_filename; 920 d->lineno = lineno; 921 if (XSTR (insn, 0)[0]) 922 d->name = XSTR (insn, 0); 923 else 924 d->name = 0; 925 926 /* Build up the list in the same order as the insns are seen 927 in the machine description. */ 928 d->next = 0; 929 *idata_end = d; 930 idata_end = &d->next; 931 932 memset (d->operand, 0, sizeof (d->operand)); 933 934 /* Scan the operands to get the specified predicates and modes, 935 since expand_binop needs to know them. */ 936 937 if (XVEC (insn, 1)) 938 for (i = 0; i < XVECLEN (insn, 1); i++) 939 scan_operands (d, XVECEXP (insn, 1, i), 0, 0); 940 941 get_pattern_stats (&stats, XVEC (insn, 1)); 942 d->n_generator_args = stats.num_generator_args; 943 d->n_operands = stats.num_insn_operands; 944 d->n_dups = stats.num_dups; 945 d->template_code = 0; 946 d->output_format = INSN_OUTPUT_FORMAT_NONE; 947 948 validate_insn_alternatives (d); 949 validate_optab_operands (d); 950 place_operands (d); 951 } 952 953 /* Process a define_split just read. Assign its code number, 954 only for reasons of consistency and to simplify genrecog. */ 955 956 static void 957 gen_split (rtx split, int lineno) 958 { 959 struct pattern_stats stats; 960 struct data *d = XNEW (struct data); 961 int i; 962 963 d->code_number = next_code_number; 964 d->index_number = next_index_number; 965 d->filename = read_md_filename; 966 d->lineno = lineno; 967 d->name = 0; 968 969 /* Build up the list in the same order as the insns are seen 970 in the machine description. */ 971 d->next = 0; 972 *idata_end = d; 973 idata_end = &d->next; 974 975 memset (d->operand, 0, sizeof (d->operand)); 976 977 /* Get the number of operands by scanning all the patterns of the 978 split patterns. But ignore all the rest of the information thus 979 obtained. */ 980 for (i = 0; i < XVECLEN (split, 0); i++) 981 scan_operands (d, XVECEXP (split, 0, i), 0, 0); 982 983 get_pattern_stats (&stats, XVEC (split, 0)); 984 d->n_generator_args = 0; 985 d->n_operands = stats.num_insn_operands; 986 d->n_dups = 0; 987 d->n_alternatives = 0; 988 d->template_code = 0; 989 d->output_format = INSN_OUTPUT_FORMAT_NONE; 990 991 place_operands (d); 992 } 993 994 extern int main (int, char **); 995 996 int 997 main (int argc, char **argv) 998 { 999 rtx desc; 1000 1001 progname = "genoutput"; 1002 1003 if (!init_rtx_reader_args (argc, argv)) 1004 return (FATAL_EXIT_CODE); 1005 1006 output_prologue (); 1007 next_code_number = 0; 1008 next_index_number = 0; 1009 1010 /* Read the machine description. */ 1011 1012 while (1) 1013 { 1014 int line_no; 1015 1016 desc = read_md_rtx (&line_no, &next_code_number); 1017 if (desc == NULL) 1018 break; 1019 1020 switch (GET_CODE (desc)) 1021 { 1022 case DEFINE_INSN: 1023 gen_insn (desc, line_no); 1024 break; 1025 1026 case DEFINE_PEEPHOLE: 1027 gen_peephole (desc, line_no); 1028 break; 1029 1030 case DEFINE_EXPAND: 1031 gen_expand (desc, line_no); 1032 break; 1033 1034 case DEFINE_SPLIT: 1035 case DEFINE_PEEPHOLE2: 1036 gen_split (desc, line_no); 1037 break; 1038 1039 #ifdef USE_MD_CONSTRAINTS 1040 case DEFINE_CONSTRAINT: 1041 case DEFINE_REGISTER_CONSTRAINT: 1042 case DEFINE_ADDRESS_CONSTRAINT: 1043 case DEFINE_MEMORY_CONSTRAINT: 1044 note_constraint (desc, line_no); 1045 break; 1046 #endif 1047 1048 default: 1049 break; 1050 } 1051 next_index_number++; 1052 } 1053 1054 printf("\n\n"); 1055 output_operand_data (); 1056 output_insn_data (); 1057 output_get_insn_name (); 1058 1059 fflush (stdout); 1060 return (ferror (stdout) != 0 || have_error 1061 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE); 1062 } 1063 1064 /* Return the number of occurrences of character C in string S or 1065 -1 if S is the null string. */ 1066 1067 static int 1068 n_occurrences (int c, const char *s) 1069 { 1070 int n = 0; 1071 1072 if (s == 0 || *s == '\0') 1073 return -1; 1074 1075 while (*s) 1076 n += (*s++ == c); 1077 1078 return n; 1079 } 1080 1081 /* Remove whitespace in `s' by moving up characters until the end. 1082 Return a new string. */ 1083 1084 static const char * 1085 strip_whitespace (const char *s) 1086 { 1087 char *p, *q; 1088 char ch; 1089 1090 if (s == 0) 1091 return 0; 1092 1093 p = q = XNEWVEC (char, strlen (s) + 1); 1094 while ((ch = *s++) != '\0') 1095 if (! ISSPACE (ch)) 1096 *p++ = ch; 1097 1098 *p = '\0'; 1099 return q; 1100 } 1101 1102 #ifdef USE_MD_CONSTRAINTS 1103 1104 /* Record just enough information about a constraint to allow checking 1105 of operand constraint strings above, in validate_insn_alternatives. 1106 Does not validate most properties of the constraint itself; does 1107 enforce no duplicate names, no overlap with MI constraints, and no 1108 prefixes. EXP is the define_*constraint form, LINENO the line number 1109 reported by the reader. */ 1110 static void 1111 note_constraint (rtx exp, int lineno) 1112 { 1113 const char *name = XSTR (exp, 0); 1114 unsigned int namelen = strlen (name); 1115 struct constraint_data **iter, **slot, *new_cdata; 1116 1117 /* The 'm' constraint is special here since that constraint letter 1118 can be overridden by the back end by defining the 1119 TARGET_MEM_CONSTRAINT macro. */ 1120 if (strchr (indep_constraints, name[0]) && name[0] != 'm') 1121 { 1122 if (name[1] == '\0') 1123 error_with_line (lineno, "constraint letter '%s' cannot be " 1124 "redefined by the machine description", name); 1125 else 1126 error_with_line (lineno, "constraint name '%s' cannot be defined by " 1127 "the machine description, as it begins with '%c'", 1128 name, name[0]); 1129 return; 1130 } 1131 1132 slot = &constraints_by_letter_table[(unsigned int)name[0]]; 1133 for (iter = slot; *iter; iter = &(*iter)->next_this_letter) 1134 { 1135 /* This causes slot to end up pointing to the 1136 next_this_letter field of the last constraint with a name 1137 of equal or greater length than the new constraint; hence 1138 the new constraint will be inserted after all previous 1139 constraints with names of the same length. */ 1140 if ((*iter)->namelen >= namelen) 1141 slot = iter; 1142 1143 if (!strcmp ((*iter)->name, name)) 1144 { 1145 error_with_line (lineno, "redefinition of constraint '%s'", name); 1146 message_with_line ((*iter)->lineno, "previous definition is here"); 1147 return; 1148 } 1149 else if (!strncmp ((*iter)->name, name, (*iter)->namelen)) 1150 { 1151 error_with_line (lineno, "defining constraint '%s' here", name); 1152 message_with_line ((*iter)->lineno, "renders constraint '%s' " 1153 "(defined here) a prefix", (*iter)->name); 1154 return; 1155 } 1156 else if (!strncmp ((*iter)->name, name, namelen)) 1157 { 1158 error_with_line (lineno, "constraint '%s' is a prefix", name); 1159 message_with_line ((*iter)->lineno, "of constraint '%s' " 1160 "(defined here)", (*iter)->name); 1161 return; 1162 } 1163 } 1164 new_cdata = XNEWVAR (struct constraint_data, sizeof (struct constraint_data) + namelen); 1165 strcpy ((char *)new_cdata + offsetof(struct constraint_data, name), name); 1166 new_cdata->namelen = namelen; 1167 new_cdata->lineno = lineno; 1168 new_cdata->next_this_letter = *slot; 1169 *slot = new_cdata; 1170 } 1171 1172 /* Return the length of the constraint name beginning at position S 1173 of an operand constraint string, or issue an error message if there 1174 is no such constraint. Does not expect to be called for generic 1175 constraints. */ 1176 static int 1177 mdep_constraint_len (const char *s, int lineno, int opno) 1178 { 1179 struct constraint_data *p; 1180 1181 p = constraints_by_letter_table[(unsigned int)s[0]]; 1182 1183 if (p) 1184 for (; p; p = p->next_this_letter) 1185 if (!strncmp (s, p->name, p->namelen)) 1186 return p->namelen; 1187 1188 error_with_line (lineno, 1189 "error: undefined machine-specific constraint " 1190 "at this point: \"%s\"", s); 1191 message_with_line (lineno, "note: in operand %d", opno); 1192 return 1; /* safe */ 1193 } 1194 1195 #else 1196 /* Verify that DEFAULT_CONSTRAINT_LEN is used properly and not 1197 tampered with. This isn't bullet-proof, but it should catch 1198 most genuine mistakes. */ 1199 static void 1200 check_constraint_len (void) 1201 { 1202 const char *p; 1203 int d; 1204 1205 for (p = ",#*+=&%!1234567890"; *p; p++) 1206 for (d = -9; d < 9; d++) 1207 gcc_assert (constraint_len (p, d) == d); 1208 } 1209 1210 static int 1211 constraint_len (const char *p, int genoutput_default_constraint_len) 1212 { 1213 /* Check that we still match defaults.h . First we do a generation-time 1214 check that fails if the value is not the expected one... */ 1215 gcc_assert (DEFAULT_CONSTRAINT_LEN (*p, p) == 1); 1216 /* And now a compile-time check that should give a diagnostic if the 1217 definition doesn't exactly match. */ 1218 #define DEFAULT_CONSTRAINT_LEN(C,STR) 1 1219 /* Now re-define DEFAULT_CONSTRAINT_LEN so that we can verify it is 1220 being used. */ 1221 #undef DEFAULT_CONSTRAINT_LEN 1222 #define DEFAULT_CONSTRAINT_LEN(C,STR) \ 1223 ((C) != *p || STR != p ? -1 : genoutput_default_constraint_len) 1224 return CONSTRAINT_LEN (*p, p); 1225 /* And set it back. */ 1226 #undef DEFAULT_CONSTRAINT_LEN 1227 #define DEFAULT_CONSTRAINT_LEN(C,STR) 1 1228 } 1229 #endif 1230