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