1/* Generate from machine description: 2 - prototype declarations for operand predicates (tm-preds.h) 3 - function definitions of operand predicates, if defined new-style 4 (insn-preds.c) 5 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009 6 Free Software Foundation, Inc. 7 8This file is part of GCC. 9 10GCC is free software; you can redistribute it and/or modify 11it under the terms of the GNU General Public License as published by 12the Free Software Foundation; either version 3, or (at your option) 13any later version. 14 15GCC is distributed in the hope that it will be useful, 16but WITHOUT ANY WARRANTY; without even the implied warranty of 17MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18GNU General Public License for more details. 19 20You should have received a copy of the GNU General Public License 21along with GCC; see the file COPYING3. If not see 22<http://www.gnu.org/licenses/>. */ 23 24#include "bconfig.h" 25#include "system.h" 26#include "coretypes.h" 27#include "tm.h" 28#include "rtl.h" 29#include "errors.h" 30#include "obstack.h" 31#include "gensupport.h" 32 33/* Given a predicate expression EXP, from form NAME at line LINENO, 34 verify that it does not contain any RTL constructs which are not 35 valid in predicate definitions. Returns true if EXP is 36 INvalid; issues error messages, caller need not. */ 37static bool 38validate_exp (rtx exp, const char *name, int lineno) 39{ 40 if (exp == 0) 41 { 42 message_with_line (lineno, "%s: must give a predicate expression", name); 43 return true; 44 } 45 46 switch (GET_CODE (exp)) 47 { 48 /* Ternary, binary, unary expressions: recurse into subexpressions. */ 49 case IF_THEN_ELSE: 50 if (validate_exp (XEXP (exp, 2), name, lineno)) 51 return true; 52 /* else fall through */ 53 case AND: 54 case IOR: 55 if (validate_exp (XEXP (exp, 1), name, lineno)) 56 return true; 57 /* else fall through */ 58 case NOT: 59 return validate_exp (XEXP (exp, 0), name, lineno); 60 61 /* MATCH_CODE might have a syntax error in its path expression. */ 62 case MATCH_CODE: 63 { 64 const char *p; 65 for (p = XSTR (exp, 1); *p; p++) 66 { 67 if (!ISDIGIT (*p) && !ISLOWER (*p)) 68 { 69 message_with_line (lineno, "%s: invalid character in path " 70 "string '%s'", name, XSTR (exp, 1)); 71 have_error = 1; 72 return true; 73 } 74 } 75 } 76 /* fall through */ 77 78 /* These need no special checking. */ 79 case MATCH_OPERAND: 80 case MATCH_TEST: 81 return false; 82 83 default: 84 message_with_line (lineno, 85 "%s: cannot use '%s' in a predicate expression", 86 name, GET_RTX_NAME (GET_CODE (exp))); 87 have_error = 1; 88 return true; 89 } 90} 91 92/* Predicates are defined with (define_predicate) or 93 (define_special_predicate) expressions in the machine description. */ 94static void 95process_define_predicate (rtx defn, int lineno) 96{ 97 struct pred_data *pred; 98 const char *p; 99 100 if (!ISALPHA (XSTR (defn, 0)[0]) && XSTR (defn, 0)[0] != '_') 101 goto bad_name; 102 for (p = XSTR (defn, 0) + 1; *p; p++) 103 if (!ISALNUM (*p) && *p != '_') 104 goto bad_name; 105 106 if (validate_exp (XEXP (defn, 1), XSTR (defn, 0), lineno)) 107 return; 108 109 pred = XCNEW (struct pred_data); 110 pred->name = XSTR (defn, 0); 111 pred->exp = XEXP (defn, 1); 112 pred->c_block = XSTR (defn, 2); 113 114 if (GET_CODE (defn) == DEFINE_SPECIAL_PREDICATE) 115 pred->special = true; 116 117 add_predicate (pred); 118 return; 119 120 bad_name: 121 message_with_line (lineno, 122 "%s: predicate name must be a valid C function name", 123 XSTR (defn, 0)); 124 have_error = 1; 125 return; 126} 127 128/* Given a predicate, if it has an embedded C block, write the block 129 out as a static inline subroutine, and augment the RTL test with a 130 match_test that calls that subroutine. For instance, 131 132 (define_predicate "basereg_operand" 133 (match_operand 0 "register_operand") 134 { 135 if (GET_CODE (op) == SUBREG) 136 op = SUBREG_REG (op); 137 return REG_POINTER (op); 138 }) 139 140 becomes 141 142 static inline int basereg_operand_1(rtx op, enum machine_mode mode) 143 { 144 if (GET_CODE (op) == SUBREG) 145 op = SUBREG_REG (op); 146 return REG_POINTER (op); 147 } 148 149 (define_predicate "basereg_operand" 150 (and (match_operand 0 "register_operand") 151 (match_test "basereg_operand_1 (op, mode)"))) 152 153 The only wart is that there's no way to insist on a { } string in 154 an RTL template, so we have to handle "" strings. */ 155 156 157static void 158write_predicate_subfunction (struct pred_data *p) 159{ 160 const char *match_test_str; 161 rtx match_test_exp, and_exp; 162 163 if (p->c_block[0] == '\0') 164 return; 165 166 /* Construct the function-call expression. */ 167 obstack_grow (rtl_obstack, p->name, strlen (p->name)); 168 obstack_grow (rtl_obstack, "_1 (op, mode)", 169 sizeof "_1 (op, mode)"); 170 match_test_str = XOBFINISH (rtl_obstack, const char *); 171 172 /* Add the function-call expression to the complete expression to be 173 evaluated. */ 174 match_test_exp = rtx_alloc (MATCH_TEST); 175 XSTR (match_test_exp, 0) = match_test_str; 176 177 and_exp = rtx_alloc (AND); 178 XEXP (and_exp, 0) = p->exp; 179 XEXP (and_exp, 1) = match_test_exp; 180 181 p->exp = and_exp; 182 183 printf ("static inline int\n" 184 "%s_1 (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)\n", 185 p->name); 186 print_rtx_ptr_loc (p->c_block); 187 if (p->c_block[0] == '{') 188 fputs (p->c_block, stdout); 189 else 190 printf ("{\n %s\n}", p->c_block); 191 fputs ("\n\n", stdout); 192} 193 194/* Given a predicate expression EXP, from form NAME, determine whether 195 it refers to the variable given as VAR. */ 196static bool 197needs_variable (rtx exp, const char *var) 198{ 199 switch (GET_CODE (exp)) 200 { 201 /* Ternary, binary, unary expressions need a variable if 202 any of their subexpressions do. */ 203 case IF_THEN_ELSE: 204 if (needs_variable (XEXP (exp, 2), var)) 205 return true; 206 /* else fall through */ 207 case AND: 208 case IOR: 209 if (needs_variable (XEXP (exp, 1), var)) 210 return true; 211 /* else fall through */ 212 case NOT: 213 return needs_variable (XEXP (exp, 0), var); 214 215 /* MATCH_CODE uses "op", but nothing else. */ 216 case MATCH_CODE: 217 return !strcmp (var, "op"); 218 219 /* MATCH_OPERAND uses "op" and may use "mode". */ 220 case MATCH_OPERAND: 221 if (!strcmp (var, "op")) 222 return true; 223 if (!strcmp (var, "mode") && GET_MODE (exp) == VOIDmode) 224 return true; 225 return false; 226 227 /* MATCH_TEST uses var if XSTR (exp, 0) =~ /\b${var}\b/o; */ 228 case MATCH_TEST: 229 { 230 const char *p = XSTR (exp, 0); 231 const char *q = strstr (p, var); 232 if (!q) 233 return false; 234 if (q != p && (ISALNUM (q[-1]) || q[-1] == '_')) 235 return false; 236 q += strlen (var); 237 if (ISALNUM (q[0]) || q[0] == '_') 238 return false; 239 } 240 return true; 241 242 default: 243 gcc_unreachable (); 244 } 245} 246 247/* Given an RTL expression EXP, find all subexpressions which we may 248 assume to perform mode tests. Normal MATCH_OPERAND does; 249 MATCH_CODE does if it applies to the whole expression and accepts 250 CONST_INT or CONST_DOUBLE; and we have to assume that MATCH_TEST 251 does not. These combine in almost-boolean fashion - the only 252 exception is that (not X) must be assumed not to perform a mode 253 test, whether or not X does. 254 255 The mark is the RTL /v flag, which is true for subexpressions which 256 do *not* perform mode tests. 257*/ 258#define NO_MODE_TEST(EXP) RTX_FLAG (EXP, volatil) 259static void 260mark_mode_tests (rtx exp) 261{ 262 switch (GET_CODE (exp)) 263 { 264 case MATCH_OPERAND: 265 { 266 struct pred_data *p = lookup_predicate (XSTR (exp, 1)); 267 if (!p) 268 error ("reference to undefined predicate '%s'", XSTR (exp, 1)); 269 else if (p->special || GET_MODE (exp) != VOIDmode) 270 NO_MODE_TEST (exp) = 1; 271 } 272 break; 273 274 case MATCH_CODE: 275 if (XSTR (exp, 1)[0] != '\0' 276 || (!strstr (XSTR (exp, 0), "const_int") 277 && !strstr (XSTR (exp, 0), "const_double"))) 278 NO_MODE_TEST (exp) = 1; 279 break; 280 281 case MATCH_TEST: 282 case NOT: 283 NO_MODE_TEST (exp) = 1; 284 break; 285 286 case AND: 287 mark_mode_tests (XEXP (exp, 0)); 288 mark_mode_tests (XEXP (exp, 1)); 289 290 NO_MODE_TEST (exp) = (NO_MODE_TEST (XEXP (exp, 0)) 291 && NO_MODE_TEST (XEXP (exp, 1))); 292 break; 293 294 case IOR: 295 mark_mode_tests (XEXP (exp, 0)); 296 mark_mode_tests (XEXP (exp, 1)); 297 298 NO_MODE_TEST (exp) = (NO_MODE_TEST (XEXP (exp, 0)) 299 || NO_MODE_TEST (XEXP (exp, 1))); 300 break; 301 302 case IF_THEN_ELSE: 303 /* A ? B : C does a mode test if (one of A and B) does a mode 304 test, and C does too. */ 305 mark_mode_tests (XEXP (exp, 0)); 306 mark_mode_tests (XEXP (exp, 1)); 307 mark_mode_tests (XEXP (exp, 2)); 308 309 NO_MODE_TEST (exp) = ((NO_MODE_TEST (XEXP (exp, 0)) 310 && NO_MODE_TEST (XEXP (exp, 1))) 311 || NO_MODE_TEST (XEXP (exp, 2))); 312 break; 313 314 default: 315 gcc_unreachable (); 316 } 317} 318 319/* Determine whether the expression EXP is a MATCH_CODE that should 320 be written as a switch statement. */ 321static bool 322generate_switch_p (rtx exp) 323{ 324 return GET_CODE (exp) == MATCH_CODE 325 && strchr (XSTR (exp, 0), ','); 326} 327 328/* Given a predicate, work out where in its RTL expression to add 329 tests for proper modes. Special predicates do not get any such 330 tests. We try to avoid adding tests when we don't have to; in 331 particular, other normal predicates can be counted on to do it for 332 us. */ 333 334static void 335add_mode_tests (struct pred_data *p) 336{ 337 rtx match_test_exp, and_exp; 338 rtx *pos; 339 340 /* Don't touch special predicates. */ 341 if (p->special) 342 return; 343 344 mark_mode_tests (p->exp); 345 346 /* If the whole expression already tests the mode, we're done. */ 347 if (!NO_MODE_TEST (p->exp)) 348 return; 349 350 match_test_exp = rtx_alloc (MATCH_TEST); 351 XSTR (match_test_exp, 0) = "mode == VOIDmode || GET_MODE (op) == mode"; 352 and_exp = rtx_alloc (AND); 353 XEXP (and_exp, 1) = match_test_exp; 354 355 /* It is always correct to rewrite p->exp as 356 357 (and (...) (match_test "mode == VOIDmode || GET_MODE (op) == mode")) 358 359 but there are a couple forms where we can do better. If the 360 top-level pattern is an IOR, and one of the two branches does test 361 the mode, we can wrap just the branch that doesn't. Likewise, if 362 we have an IF_THEN_ELSE, and one side of it tests the mode, we can 363 wrap just the side that doesn't. And, of course, we can repeat this 364 descent as many times as it works. */ 365 366 pos = &p->exp; 367 for (;;) 368 { 369 rtx subexp = *pos; 370 371 switch (GET_CODE (subexp)) 372 { 373 case AND: 374 /* The switch code generation in write_predicate_stmts prefers 375 rtx code tests to be at the top of the expression tree. So 376 push this AND down into the second operand of an existing 377 AND expression. */ 378 if (generate_switch_p (XEXP (subexp, 0))) 379 pos = &XEXP (subexp, 1); 380 goto break_loop; 381 382 case IOR: 383 { 384 int test0 = NO_MODE_TEST (XEXP (subexp, 0)); 385 int test1 = NO_MODE_TEST (XEXP (subexp, 1)); 386 387 gcc_assert (test0 || test1); 388 389 if (test0 && test1) 390 goto break_loop; 391 pos = test0 ? &XEXP (subexp, 0) : &XEXP (subexp, 1); 392 } 393 break; 394 395 case IF_THEN_ELSE: 396 { 397 int test0 = NO_MODE_TEST (XEXP (subexp, 0)); 398 int test1 = NO_MODE_TEST (XEXP (subexp, 1)); 399 int test2 = NO_MODE_TEST (XEXP (subexp, 2)); 400 401 gcc_assert ((test0 && test1) || test2); 402 403 if (test0 && test1 && test2) 404 goto break_loop; 405 if (test0 && test1) 406 /* Must put it on the dependent clause, not the 407 controlling expression, or we change the meaning of 408 the test. */ 409 pos = &XEXP (subexp, 1); 410 else 411 pos = &XEXP (subexp, 2); 412 } 413 break; 414 415 default: 416 goto break_loop; 417 } 418 } 419 break_loop: 420 XEXP (and_exp, 0) = *pos; 421 *pos = and_exp; 422} 423 424/* PATH is a string describing a path from the root of an RTL 425 expression to an inner subexpression to be tested. Output 426 code which computes the subexpression from the variable 427 holding the root of the expression. */ 428static void 429write_extract_subexp (const char *path) 430{ 431 int len = strlen (path); 432 int i; 433 434 /* We first write out the operations (XEXP or XVECEXP) in reverse 435 order, then write "op", then the indices in forward order. */ 436 for (i = len - 1; i >= 0; i--) 437 { 438 if (ISLOWER (path[i])) 439 fputs ("XVECEXP (", stdout); 440 else if (ISDIGIT (path[i])) 441 fputs ("XEXP (", stdout); 442 else 443 gcc_unreachable (); 444 } 445 446 fputs ("op", stdout); 447 448 for (i = 0; i < len; i++) 449 { 450 if (ISLOWER (path[i])) 451 printf (", 0, %d)", path[i] - 'a'); 452 else if (ISDIGIT (path[i])) 453 printf (", %d)", path[i] - '0'); 454 else 455 gcc_unreachable (); 456 } 457} 458 459/* CODES is a list of RTX codes. Write out an expression which 460 determines whether the operand has one of those codes. */ 461static void 462write_match_code (const char *path, const char *codes) 463{ 464 const char *code; 465 466 while ((code = scan_comma_elt (&codes)) != 0) 467 { 468 fputs ("GET_CODE (", stdout); 469 write_extract_subexp (path); 470 fputs (") == ", stdout); 471 while (code < codes) 472 { 473 putchar (TOUPPER (*code)); 474 code++; 475 } 476 477 if (*codes == ',') 478 fputs (" || ", stdout); 479 } 480} 481 482/* EXP is an RTL (sub)expression for a predicate. Recursively 483 descend the expression and write out an equivalent C expression. */ 484static void 485write_predicate_expr (rtx exp) 486{ 487 switch (GET_CODE (exp)) 488 { 489 case AND: 490 putchar ('('); 491 write_predicate_expr (XEXP (exp, 0)); 492 fputs (") && (", stdout); 493 write_predicate_expr (XEXP (exp, 1)); 494 putchar (')'); 495 break; 496 497 case IOR: 498 putchar ('('); 499 write_predicate_expr (XEXP (exp, 0)); 500 fputs (") || (", stdout); 501 write_predicate_expr (XEXP (exp, 1)); 502 putchar (')'); 503 break; 504 505 case NOT: 506 fputs ("!(", stdout); 507 write_predicate_expr (XEXP (exp, 0)); 508 putchar (')'); 509 break; 510 511 case IF_THEN_ELSE: 512 putchar ('('); 513 write_predicate_expr (XEXP (exp, 0)); 514 fputs (") ? (", stdout); 515 write_predicate_expr (XEXP (exp, 1)); 516 fputs (") : (", stdout); 517 write_predicate_expr (XEXP (exp, 2)); 518 putchar (')'); 519 break; 520 521 case MATCH_OPERAND: 522 if (GET_MODE (exp) == VOIDmode) 523 printf ("%s (op, mode)", XSTR (exp, 1)); 524 else 525 printf ("%s (op, %smode)", XSTR (exp, 1), mode_name[GET_MODE (exp)]); 526 break; 527 528 case MATCH_CODE: 529 write_match_code (XSTR (exp, 1), XSTR (exp, 0)); 530 break; 531 532 case MATCH_TEST: 533 print_c_condition (XSTR (exp, 0)); 534 break; 535 536 default: 537 gcc_unreachable (); 538 } 539} 540 541/* Write the MATCH_CODE expression EXP as a switch statement. */ 542 543static void 544write_match_code_switch (rtx exp) 545{ 546 const char *codes = XSTR (exp, 0); 547 const char *path = XSTR (exp, 1); 548 const char *code; 549 550 fputs (" switch (GET_CODE (", stdout); 551 write_extract_subexp (path); 552 fputs ("))\n {\n", stdout); 553 554 while ((code = scan_comma_elt (&codes)) != 0) 555 { 556 fputs (" case ", stdout); 557 while (code < codes) 558 { 559 putchar (TOUPPER (*code)); 560 code++; 561 } 562 fputs(":\n", stdout); 563 } 564} 565 566/* Given a predicate expression EXP, write out a sequence of stmts 567 to evaluate it. This is similar to write_predicate_expr but can 568 generate efficient switch statements. */ 569 570static void 571write_predicate_stmts (rtx exp) 572{ 573 switch (GET_CODE (exp)) 574 { 575 case MATCH_CODE: 576 if (generate_switch_p (exp)) 577 { 578 write_match_code_switch (exp); 579 puts (" return true;\n" 580 " default:\n" 581 " break;\n" 582 " }\n" 583 " return false;"); 584 return; 585 } 586 break; 587 588 case AND: 589 if (generate_switch_p (XEXP (exp, 0))) 590 { 591 write_match_code_switch (XEXP (exp, 0)); 592 puts (" break;\n" 593 " default:\n" 594 " return false;\n" 595 " }"); 596 exp = XEXP (exp, 1); 597 } 598 break; 599 600 case IOR: 601 if (generate_switch_p (XEXP (exp, 0))) 602 { 603 write_match_code_switch (XEXP (exp, 0)); 604 puts (" return true;\n" 605 " default:\n" 606 " break;\n" 607 " }"); 608 exp = XEXP (exp, 1); 609 } 610 break; 611 612 case NOT: 613 if (generate_switch_p (XEXP (exp, 0))) 614 { 615 write_match_code_switch (XEXP (exp, 0)); 616 puts (" return false;\n" 617 " default:\n" 618 " break;\n" 619 " }\n" 620 " return true;"); 621 return; 622 } 623 break; 624 625 default: 626 break; 627 } 628 629 fputs(" return ",stdout); 630 write_predicate_expr (exp); 631 fputs(";\n", stdout); 632} 633 634/* Given a predicate, write out a complete C function to compute it. */ 635static void 636write_one_predicate_function (struct pred_data *p) 637{ 638 if (!p->exp) 639 return; 640 641 write_predicate_subfunction (p); 642 add_mode_tests (p); 643 644 /* A normal predicate can legitimately not look at enum machine_mode 645 if it accepts only CONST_INTs and/or CONST_DOUBLEs. */ 646 printf ("int\n%s (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)\n{\n", 647 p->name); 648 write_predicate_stmts (p->exp); 649 fputs ("}\n\n", stdout); 650} 651 652/* Constraints fall into two categories: register constraints 653 (define_register_constraint), and others (define_constraint, 654 define_memory_constraint, define_address_constraint). We 655 work out automatically which of the various old-style macros 656 they correspond to, and produce appropriate code. They all 657 go in the same hash table so we can verify that there are no 658 duplicate names. */ 659 660/* All data from one constraint definition. */ 661struct constraint_data 662{ 663 struct constraint_data *next_this_letter; 664 struct constraint_data *next_textual; 665 const char *name; 666 const char *c_name; /* same as .name unless mangling is necessary */ 667 size_t namelen; 668 const char *regclass; /* for register constraints */ 669 rtx exp; /* for other constraints */ 670 unsigned int lineno; /* line of definition */ 671 unsigned int is_register : 1; 672 unsigned int is_const_int : 1; 673 unsigned int is_const_dbl : 1; 674 unsigned int is_extra : 1; 675 unsigned int is_memory : 1; 676 unsigned int is_address : 1; 677}; 678 679/* Overview of all constraints beginning with a given letter. */ 680 681static struct constraint_data * 682constraints_by_letter_table[1<<CHAR_BIT]; 683 684/* For looking up all the constraints in the order that they appeared 685 in the machine description. */ 686static struct constraint_data *first_constraint; 687static struct constraint_data **last_constraint_ptr = &first_constraint; 688 689#define FOR_ALL_CONSTRAINTS(iter_) \ 690 for (iter_ = first_constraint; iter_; iter_ = iter_->next_textual) 691 692/* These letters, and all names beginning with them, are reserved for 693 generic constraints. 694 The 'm' constraint is not mentioned here since that constraint 695 letter can be overridden by the back end by defining the 696 TARGET_MEM_CONSTRAINT macro. */ 697static const char generic_constraint_letters[] = "EFVXginoprs"; 698 699/* Machine-independent code expects that constraints with these 700 (initial) letters will allow only (a subset of all) CONST_INTs. */ 701 702static const char const_int_constraints[] = "IJKLMNOP"; 703 704/* Machine-independent code expects that constraints with these 705 (initial) letters will allow only (a subset of all) CONST_DOUBLEs. */ 706 707static const char const_dbl_constraints[] = "GH"; 708 709/* Summary data used to decide whether to output various functions and 710 macro definitions. */ 711static unsigned int constraint_max_namelen; 712static bool have_register_constraints; 713static bool have_memory_constraints; 714static bool have_address_constraints; 715static bool have_extra_constraints; 716static bool have_const_int_constraints; 717static bool have_const_dbl_constraints; 718 719/* Convert NAME, which contains angle brackets and/or underscores, to 720 a string that can be used as part of a C identifier. The string 721 comes from the rtl_obstack. */ 722static const char * 723mangle (const char *name) 724{ 725 for (; *name; name++) 726 switch (*name) 727 { 728 case '_': obstack_grow (rtl_obstack, "__", 2); break; 729 case '<': obstack_grow (rtl_obstack, "_l", 2); break; 730 case '>': obstack_grow (rtl_obstack, "_g", 2); break; 731 default: obstack_1grow (rtl_obstack, *name); break; 732 } 733 734 obstack_1grow (rtl_obstack, '\0'); 735 return XOBFINISH (rtl_obstack, const char *); 736} 737 738/* Add one constraint, of any sort, to the tables. NAME is its name; 739 REGCLASS is the register class, if any; EXP is the expression to 740 test, if any; IS_MEMORY and IS_ADDRESS indicate memory and address 741 constraints, respectively; LINENO is the line number from the MD reader. 742 Not all combinations of arguments are valid; most importantly, REGCLASS 743 is mutually exclusive with EXP, and IS_MEMORY/IS_ADDRESS are only 744 meaningful for constraints with EXP. 745 746 This function enforces all syntactic and semantic rules about what 747 constraints can be defined. */ 748 749static void 750add_constraint (const char *name, const char *regclass, 751 rtx exp, bool is_memory, bool is_address, 752 int lineno) 753{ 754 struct constraint_data *c, **iter, **slot; 755 const char *p; 756 bool need_mangled_name = false; 757 bool is_const_int; 758 bool is_const_dbl; 759 size_t namelen; 760 761 if (exp && validate_exp (exp, name, lineno)) 762 return; 763 764 if (!ISALPHA (name[0]) && name[0] != '_') 765 { 766 if (name[1] == '\0') 767 message_with_line (lineno, "constraint name '%s' is not " 768 "a letter or underscore", name); 769 else 770 message_with_line (lineno, "constraint name '%s' does not begin " 771 "with a letter or underscore", name); 772 have_error = 1; 773 return; 774 } 775 for (p = name; *p; p++) 776 if (!ISALNUM (*p)) 777 { 778 if (*p == '<' || *p == '>' || *p == '_') 779 need_mangled_name = true; 780 else 781 { 782 message_with_line (lineno, 783 "constraint name '%s' must be composed of " 784 "letters, digits, underscores, and " 785 "angle brackets", name); 786 have_error = 1; 787 return; 788 } 789 } 790 791 if (strchr (generic_constraint_letters, name[0])) 792 { 793 if (name[1] == '\0') 794 message_with_line (lineno, "constraint letter '%s' cannot be " 795 "redefined by the machine description", name); 796 else 797 message_with_line (lineno, "constraint name '%s' cannot be defined by " 798 "the machine description, as it begins with '%c'", 799 name, name[0]); 800 have_error = 1; 801 return; 802 } 803 804 805 namelen = strlen (name); 806 slot = &constraints_by_letter_table[(unsigned int)name[0]]; 807 for (iter = slot; *iter; iter = &(*iter)->next_this_letter) 808 { 809 /* This causes slot to end up pointing to the 810 next_this_letter field of the last constraint with a name 811 of equal or greater length than the new constraint; hence 812 the new constraint will be inserted after all previous 813 constraints with names of the same length. */ 814 if ((*iter)->namelen >= namelen) 815 slot = iter; 816 817 if (!strcmp ((*iter)->name, name)) 818 { 819 message_with_line (lineno, "redefinition of constraint '%s'", name); 820 message_with_line ((*iter)->lineno, "previous definition is here"); 821 have_error = 1; 822 return; 823 } 824 else if (!strncmp ((*iter)->name, name, (*iter)->namelen)) 825 { 826 message_with_line (lineno, "defining constraint '%s' here", name); 827 message_with_line ((*iter)->lineno, "renders constraint '%s' " 828 "(defined here) a prefix", (*iter)->name); 829 have_error = 1; 830 return; 831 } 832 else if (!strncmp ((*iter)->name, name, namelen)) 833 { 834 message_with_line (lineno, "constraint '%s' is a prefix", name); 835 message_with_line ((*iter)->lineno, "of constraint '%s' " 836 "(defined here)", (*iter)->name); 837 have_error = 1; 838 return; 839 } 840 } 841 842 is_const_int = strchr (const_int_constraints, name[0]) != 0; 843 is_const_dbl = strchr (const_dbl_constraints, name[0]) != 0; 844 845 if (is_const_int || is_const_dbl) 846 { 847 enum rtx_code appropriate_code 848 = is_const_int ? CONST_INT : CONST_DOUBLE; 849 850 /* Consider relaxing this requirement in the future. */ 851 if (regclass 852 || GET_CODE (exp) != AND 853 || GET_CODE (XEXP (exp, 0)) != MATCH_CODE 854 || strcmp (XSTR (XEXP (exp, 0), 0), 855 GET_RTX_NAME (appropriate_code))) 856 { 857 if (name[1] == '\0') 858 message_with_line (lineno, "constraint letter '%c' is reserved " 859 "for %s constraints", 860 name[0], GET_RTX_NAME (appropriate_code)); 861 else 862 message_with_line (lineno, "constraint names beginning with '%c' " 863 "(%s) are reserved for %s constraints", 864 name[0], name, 865 GET_RTX_NAME (appropriate_code)); 866 867 have_error = 1; 868 return; 869 } 870 871 if (is_memory) 872 { 873 if (name[1] == '\0') 874 message_with_line (lineno, "constraint letter '%c' cannot be a " 875 "memory constraint", name[0]); 876 else 877 message_with_line (lineno, "constraint name '%s' begins with '%c', " 878 "and therefore cannot be a memory constraint", 879 name, name[0]); 880 881 have_error = 1; 882 return; 883 } 884 else if (is_address) 885 { 886 if (name[1] == '\0') 887 message_with_line (lineno, "constraint letter '%c' cannot be a " 888 "memory constraint", name[0]); 889 else 890 message_with_line (lineno, "constraint name '%s' begins with '%c', " 891 "and therefore cannot be a memory constraint", 892 name, name[0]); 893 894 have_error = 1; 895 return; 896 } 897 } 898 899 900 c = XOBNEW (rtl_obstack, struct constraint_data); 901 c->name = name; 902 c->c_name = need_mangled_name ? mangle (name) : name; 903 c->lineno = lineno; 904 c->namelen = namelen; 905 c->regclass = regclass; 906 c->exp = exp; 907 c->is_register = regclass != 0; 908 c->is_const_int = is_const_int; 909 c->is_const_dbl = is_const_dbl; 910 c->is_extra = !(regclass || is_const_int || is_const_dbl); 911 c->is_memory = is_memory; 912 c->is_address = is_address; 913 914 c->next_this_letter = *slot; 915 *slot = c; 916 917 /* Insert this constraint in the list of all constraints in textual 918 order. */ 919 c->next_textual = 0; 920 *last_constraint_ptr = c; 921 last_constraint_ptr = &c->next_textual; 922 923 constraint_max_namelen = MAX (constraint_max_namelen, strlen (name)); 924 have_register_constraints |= c->is_register; 925 have_const_int_constraints |= c->is_const_int; 926 have_const_dbl_constraints |= c->is_const_dbl; 927 have_extra_constraints |= c->is_extra; 928 have_memory_constraints |= c->is_memory; 929 have_address_constraints |= c->is_address; 930} 931 932/* Process a DEFINE_CONSTRAINT, DEFINE_MEMORY_CONSTRAINT, or 933 DEFINE_ADDRESS_CONSTRAINT expression, C. */ 934static void 935process_define_constraint (rtx c, int lineno) 936{ 937 add_constraint (XSTR (c, 0), 0, XEXP (c, 2), 938 GET_CODE (c) == DEFINE_MEMORY_CONSTRAINT, 939 GET_CODE (c) == DEFINE_ADDRESS_CONSTRAINT, 940 lineno); 941} 942 943/* Process a DEFINE_REGISTER_CONSTRAINT expression, C. */ 944static void 945process_define_register_constraint (rtx c, int lineno) 946{ 947 add_constraint (XSTR (c, 0), XSTR (c, 1), 0, false, false, lineno); 948} 949 950/* Write out an enumeration with one entry per machine-specific 951 constraint. */ 952static void 953write_enum_constraint_num (void) 954{ 955 struct constraint_data *c; 956 957 fputs ("#define CONSTRAINT_NUM_DEFINED_P 1\n", stdout); 958 fputs ("enum constraint_num\n" 959 "{\n" 960 " CONSTRAINT__UNKNOWN = 0", stdout); 961 FOR_ALL_CONSTRAINTS (c) 962 printf (",\n CONSTRAINT_%s", c->c_name); 963 puts (",\n CONSTRAINT__LIMIT\n};\n"); 964} 965 966/* Write out a function which looks at a string and determines what 967 constraint name, if any, it begins with. */ 968static void 969write_lookup_constraint (void) 970{ 971 unsigned int i; 972 puts ("enum constraint_num\n" 973 "lookup_constraint (const char *str)\n" 974 "{\n" 975 " switch (str[0])\n" 976 " {"); 977 978 for (i = 0; i < ARRAY_SIZE(constraints_by_letter_table); i++) 979 { 980 struct constraint_data *c = constraints_by_letter_table[i]; 981 if (!c) 982 continue; 983 984 printf (" case '%c':\n", i); 985 if (c->namelen == 1) 986 printf (" return CONSTRAINT_%s;\n", c->c_name); 987 else 988 { 989 do 990 { 991 printf (" if (!strncmp (str, \"%s\", %lu))\n" 992 " return CONSTRAINT_%s;\n", 993 c->name, (unsigned long int) c->namelen, c->c_name); 994 c = c->next_this_letter; 995 } 996 while (c); 997 puts (" break;"); 998 } 999 } 1000 1001 puts (" default: break;\n" 1002 " }\n" 1003 " return CONSTRAINT__UNKNOWN;\n" 1004 "}\n"); 1005} 1006 1007/* Write out a function which looks at a string and determines what 1008 the constraint name length is. */ 1009static void 1010write_insn_constraint_len (void) 1011{ 1012 unsigned int i; 1013 1014 puts ("static inline size_t\n" 1015 "insn_constraint_len (char fc, const char *str ATTRIBUTE_UNUSED)\n" 1016 "{\n" 1017 " switch (fc)\n" 1018 " {"); 1019 1020 for (i = 0; i < ARRAY_SIZE(constraints_by_letter_table); i++) 1021 { 1022 struct constraint_data *c = constraints_by_letter_table[i]; 1023 1024 if (!c 1025 || c->namelen == 1) 1026 continue; 1027 1028 /* Constraints with multiple characters should have the same 1029 length. */ 1030 { 1031 struct constraint_data *c2 = c->next_this_letter; 1032 size_t len = c->namelen; 1033 while (c2) 1034 { 1035 if (c2->namelen != len) 1036 error ("Multi-letter constraints with first letter '%c' " 1037 "should have same length", i); 1038 c2 = c2->next_this_letter; 1039 } 1040 } 1041 1042 printf (" case '%c': return %lu;\n", 1043 i, (unsigned long int) c->namelen); 1044 } 1045 1046 puts (" default: break;\n" 1047 " }\n" 1048 " return 1;\n" 1049 "}\n"); 1050} 1051 1052/* Write out the function which computes the register class corresponding 1053 to a register constraint. */ 1054static void 1055write_regclass_for_constraint (void) 1056{ 1057 struct constraint_data *c; 1058 1059 puts ("enum reg_class\n" 1060 "regclass_for_constraint (enum constraint_num c)\n" 1061 "{\n" 1062 " switch (c)\n" 1063 " {"); 1064 1065 FOR_ALL_CONSTRAINTS (c) 1066 if (c->is_register) 1067 printf (" case CONSTRAINT_%s: return %s;\n", c->c_name, c->regclass); 1068 1069 puts (" default: break;\n" 1070 " }\n" 1071 " return NO_REGS;\n" 1072 "}\n"); 1073} 1074 1075/* Write out the functions which compute whether a given value matches 1076 a given non-register constraint. */ 1077static void 1078write_tm_constrs_h (void) 1079{ 1080 struct constraint_data *c; 1081 1082 printf ("\ 1083/* Generated automatically by the program '%s'\n\ 1084 from the machine description file '%s'. */\n\n", progname, in_fname); 1085 1086 puts ("\ 1087#ifndef GCC_TM_CONSTRS_H\n\ 1088#define GCC_TM_CONSTRS_H\n"); 1089 1090 FOR_ALL_CONSTRAINTS (c) 1091 if (!c->is_register) 1092 { 1093 bool needs_ival = needs_variable (c->exp, "ival"); 1094 bool needs_hval = needs_variable (c->exp, "hval"); 1095 bool needs_lval = needs_variable (c->exp, "lval"); 1096 bool needs_rval = needs_variable (c->exp, "rval"); 1097 bool needs_mode = (needs_variable (c->exp, "mode") 1098 || needs_hval || needs_lval || needs_rval); 1099 bool needs_op = (needs_variable (c->exp, "op") 1100 || needs_ival || needs_mode); 1101 1102 printf ("static inline bool\n" 1103 "satisfies_constraint_%s (rtx %s)\n" 1104 "{\n", c->c_name, 1105 needs_op ? "op" : "ARG_UNUSED (op)"); 1106 if (needs_mode) 1107 puts (" enum machine_mode mode = GET_MODE (op);"); 1108 if (needs_ival) 1109 puts (" HOST_WIDE_INT ival = 0;"); 1110 if (needs_hval) 1111 puts (" HOST_WIDE_INT hval = 0;"); 1112 if (needs_lval) 1113 puts (" unsigned HOST_WIDE_INT lval = 0;"); 1114 if (needs_rval) 1115 puts (" const REAL_VALUE_TYPE *rval = 0;"); 1116 1117 if (needs_ival) 1118 puts (" if (CONST_INT_P (op))\n" 1119 " ival = INTVAL (op);"); 1120 if (needs_hval) 1121 puts (" if (GET_CODE (op) == CONST_DOUBLE && mode == VOIDmode)" 1122 " hval = CONST_DOUBLE_HIGH (op);"); 1123 if (needs_lval) 1124 puts (" if (GET_CODE (op) == CONST_DOUBLE && mode == VOIDmode)" 1125 " lval = CONST_DOUBLE_LOW (op);"); 1126 if (needs_rval) 1127 puts (" if (GET_CODE (op) == CONST_DOUBLE && mode != VOIDmode)" 1128 " rval = CONST_DOUBLE_REAL_VALUE (op);"); 1129 1130 write_predicate_stmts (c->exp); 1131 fputs ("}\n", stdout); 1132 } 1133 puts ("#endif /* tm-constrs.h */"); 1134} 1135 1136/* Write out the wrapper function, constraint_satisfied_p, that maps 1137 a CONSTRAINT_xxx constant to one of the predicate functions generated 1138 above. */ 1139static void 1140write_constraint_satisfied_p (void) 1141{ 1142 struct constraint_data *c; 1143 1144 puts ("bool\n" 1145 "constraint_satisfied_p (rtx op, enum constraint_num c)\n" 1146 "{\n" 1147 " switch (c)\n" 1148 " {"); 1149 1150 FOR_ALL_CONSTRAINTS (c) 1151 if (!c->is_register) 1152 printf (" case CONSTRAINT_%s: " 1153 "return satisfies_constraint_%s (op);\n", 1154 c->c_name, c->c_name); 1155 1156 puts (" default: break;\n" 1157 " }\n" 1158 " return false;\n" 1159 "}\n"); 1160} 1161 1162/* Write out the function which computes whether a given value matches 1163 a given CONST_INT constraint. This doesn't just forward to 1164 constraint_satisfied_p because caller passes the INTVAL, not the RTX. */ 1165static void 1166write_insn_const_int_ok_for_constraint (void) 1167{ 1168 struct constraint_data *c; 1169 1170 puts ("bool\n" 1171 "insn_const_int_ok_for_constraint (HOST_WIDE_INT ival, " 1172 "enum constraint_num c)\n" 1173 "{\n" 1174 " switch (c)\n" 1175 " {"); 1176 1177 FOR_ALL_CONSTRAINTS (c) 1178 if (c->is_const_int) 1179 { 1180 printf (" case CONSTRAINT_%s:\n return ", c->c_name); 1181 /* c->exp is guaranteed to be (and (match_code "const_int") (...)); 1182 we know at this point that we have a const_int, so we need not 1183 bother with that part of the test. */ 1184 write_predicate_expr (XEXP (c->exp, 1)); 1185 fputs (";\n\n", stdout); 1186 } 1187 1188 puts (" default: break;\n" 1189 " }\n" 1190 " return false;\n" 1191 "}\n"); 1192} 1193 1194 1195/* Write out the function which computes whether a given constraint is 1196 a memory constraint. */ 1197static void 1198write_insn_extra_memory_constraint (void) 1199{ 1200 struct constraint_data *c; 1201 1202 puts ("bool\n" 1203 "insn_extra_memory_constraint (enum constraint_num c)\n" 1204 "{\n" 1205 " switch (c)\n" 1206 " {"); 1207 1208 FOR_ALL_CONSTRAINTS (c) 1209 if (c->is_memory) 1210 printf (" case CONSTRAINT_%s:\n return true;\n\n", c->c_name); 1211 1212 puts (" default: break;\n" 1213 " }\n" 1214 " return false;\n" 1215 "}\n"); 1216} 1217 1218/* Write out the function which computes whether a given constraint is 1219 an address constraint. */ 1220static void 1221write_insn_extra_address_constraint (void) 1222{ 1223 struct constraint_data *c; 1224 1225 puts ("bool\n" 1226 "insn_extra_address_constraint (enum constraint_num c)\n" 1227 "{\n" 1228 " switch (c)\n" 1229 " {"); 1230 1231 FOR_ALL_CONSTRAINTS (c) 1232 if (c->is_address) 1233 printf (" case CONSTRAINT_%s:\n return true;\n\n", c->c_name); 1234 1235 puts (" default: break;\n" 1236 " }\n" 1237 " return false;\n" 1238 "}\n"); 1239} 1240 1241 1242/* Write tm-preds.h. Unfortunately, it is impossible to forward-declare 1243 an enumeration in portable C, so we have to condition all these 1244 prototypes on HAVE_MACHINE_MODES. */ 1245static void 1246write_tm_preds_h (void) 1247{ 1248 struct pred_data *p; 1249 1250 printf ("\ 1251/* Generated automatically by the program '%s'\n\ 1252 from the machine description file '%s'. */\n\n", progname, in_fname); 1253 1254 puts ("\ 1255#ifndef GCC_TM_PREDS_H\n\ 1256#define GCC_TM_PREDS_H\n\ 1257\n\ 1258#ifdef HAVE_MACHINE_MODES"); 1259 1260 FOR_ALL_PREDICATES (p) 1261 printf ("extern int %s (rtx, enum machine_mode);\n", p->name); 1262 1263 puts ("#endif /* HAVE_MACHINE_MODES */\n"); 1264 1265 if (constraint_max_namelen > 0) 1266 { 1267 write_enum_constraint_num (); 1268 puts ("extern enum constraint_num lookup_constraint (const char *);\n" 1269 "extern bool constraint_satisfied_p (rtx, enum constraint_num);\n"); 1270 1271 if (constraint_max_namelen > 1) 1272 { 1273 write_insn_constraint_len (); 1274 puts ("#define CONSTRAINT_LEN(c_,s_) " 1275 "insn_constraint_len (c_,s_)\n"); 1276 } 1277 else 1278 puts ("#define CONSTRAINT_LEN(c_,s_) 1\n"); 1279 if (have_register_constraints) 1280 puts ("extern enum reg_class regclass_for_constraint " 1281 "(enum constraint_num);\n" 1282 "#define REG_CLASS_FROM_CONSTRAINT(c_,s_) \\\n" 1283 " regclass_for_constraint (lookup_constraint (s_))\n" 1284 "#define REG_CLASS_FOR_CONSTRAINT(x_) \\\n" 1285 " regclass_for_constraint (x_)\n"); 1286 else 1287 puts ("#define REG_CLASS_FROM_CONSTRAINT(c_,s_) NO_REGS\n" 1288 "#define REG_CLASS_FOR_CONSTRAINT(x_) \\\n" 1289 " NO_REGS\n"); 1290 if (have_const_int_constraints) 1291 puts ("extern bool insn_const_int_ok_for_constraint " 1292 "(HOST_WIDE_INT, enum constraint_num);\n" 1293 "#define CONST_OK_FOR_CONSTRAINT_P(v_,c_,s_) \\\n" 1294 " insn_const_int_ok_for_constraint (v_, " 1295 "lookup_constraint (s_))\n"); 1296 if (have_const_dbl_constraints) 1297 puts ("#define CONST_DOUBLE_OK_FOR_CONSTRAINT_P(v_,c_,s_) \\\n" 1298 " constraint_satisfied_p (v_, lookup_constraint (s_))\n"); 1299 else 1300 puts ("#define CONST_DOUBLE_OK_FOR_CONSTRAINT_P(v_,c_,s_) 0\n"); 1301 if (have_extra_constraints) 1302 puts ("#define EXTRA_CONSTRAINT_STR(v_,c_,s_) \\\n" 1303 " constraint_satisfied_p (v_, lookup_constraint (s_))\n"); 1304 if (have_memory_constraints) 1305 puts ("extern bool " 1306 "insn_extra_memory_constraint (enum constraint_num);\n" 1307 "#define EXTRA_MEMORY_CONSTRAINT(c_,s_) " 1308 "insn_extra_memory_constraint (lookup_constraint (s_))\n"); 1309 else 1310 puts ("#define EXTRA_MEMORY_CONSTRAINT(c_,s_) false\n"); 1311 if (have_address_constraints) 1312 puts ("extern bool " 1313 "insn_extra_address_constraint (enum constraint_num);\n" 1314 "#define EXTRA_ADDRESS_CONSTRAINT(c_,s_) " 1315 "insn_extra_address_constraint (lookup_constraint (s_))\n"); 1316 else 1317 puts ("#define EXTRA_ADDRESS_CONSTRAINT(c_,s_) false\n"); 1318 } 1319 1320 puts ("#endif /* tm-preds.h */"); 1321} 1322 1323/* Write insn-preds.c. 1324 N.B. the list of headers to include was copied from genrecog; it 1325 may not be ideal. 1326 1327 FUTURE: Write #line markers referring back to the machine 1328 description. (Can't practically do this now since we don't know 1329 the line number of the C block - just the line number of the enclosing 1330 expression.) */ 1331static void 1332write_insn_preds_c (void) 1333{ 1334 struct pred_data *p; 1335 1336 printf ("\ 1337/* Generated automatically by the program '%s'\n\ 1338 from the machine description file '%s'. */\n\n", progname, in_fname); 1339 1340 puts ("\ 1341#include \"config.h\"\n\ 1342#include \"system.h\"\n\ 1343#include \"coretypes.h\"\n\ 1344#include \"tm.h\"\n\ 1345#include \"rtl.h\"\n\ 1346#include \"tree.h\"\n\ 1347#include \"tm_p.h\"\n\ 1348#include \"function.h\"\n\ 1349#include \"insn-config.h\"\n\ 1350#include \"recog.h\"\n\ 1351#include \"real.h\"\n\ 1352#include \"output.h\"\n\ 1353#include \"flags.h\"\n\ 1354#include \"hard-reg-set.h\"\n\ 1355#include \"resource.h\"\n\ 1356#include \"toplev.h\"\n\ 1357#include \"reload.h\"\n\ 1358#include \"regs.h\"\n\ 1359#include \"tm-constrs.h\"\n"); 1360 1361 FOR_ALL_PREDICATES (p) 1362 write_one_predicate_function (p); 1363 1364 if (constraint_max_namelen > 0) 1365 { 1366 write_lookup_constraint (); 1367 if (have_register_constraints) 1368 write_regclass_for_constraint (); 1369 write_constraint_satisfied_p (); 1370 1371 if (have_const_int_constraints) 1372 write_insn_const_int_ok_for_constraint (); 1373 1374 if (have_memory_constraints) 1375 write_insn_extra_memory_constraint (); 1376 if (have_address_constraints) 1377 write_insn_extra_address_constraint (); 1378 } 1379} 1380 1381/* Argument parsing. */ 1382static bool gen_header; 1383static bool gen_constrs; 1384 1385static bool 1386parse_option (const char *opt) 1387{ 1388 if (!strcmp (opt, "-h")) 1389 { 1390 gen_header = true; 1391 return 1; 1392 } 1393 else if (!strcmp (opt, "-c")) 1394 { 1395 gen_constrs = true; 1396 return 1; 1397 } 1398 else 1399 return 0; 1400} 1401 1402/* Master control. */ 1403int 1404main (int argc, char **argv) 1405{ 1406 rtx defn; 1407 int pattern_lineno, next_insn_code = 0; 1408 1409 progname = argv[0]; 1410 if (argc <= 1) 1411 fatal ("no input file name"); 1412 if (init_md_reader_args_cb (argc, argv, parse_option) != SUCCESS_EXIT_CODE) 1413 return FATAL_EXIT_CODE; 1414 1415 while ((defn = read_md_rtx (&pattern_lineno, &next_insn_code)) != 0) 1416 switch (GET_CODE (defn)) 1417 { 1418 case DEFINE_PREDICATE: 1419 case DEFINE_SPECIAL_PREDICATE: 1420 process_define_predicate (defn, pattern_lineno); 1421 break; 1422 1423 case DEFINE_CONSTRAINT: 1424 case DEFINE_MEMORY_CONSTRAINT: 1425 case DEFINE_ADDRESS_CONSTRAINT: 1426 process_define_constraint (defn, pattern_lineno); 1427 break; 1428 1429 case DEFINE_REGISTER_CONSTRAINT: 1430 process_define_register_constraint (defn, pattern_lineno); 1431 break; 1432 1433 default: 1434 break; 1435 } 1436 1437 if (gen_header) 1438 write_tm_preds_h (); 1439 else if (gen_constrs) 1440 write_tm_constrs_h (); 1441 else 1442 write_insn_preds_c (); 1443 1444 if (have_error || ferror (stdout) || fflush (stdout) || fclose (stdout)) 1445 return FATAL_EXIT_CODE; 1446 1447 return SUCCESS_EXIT_CODE; 1448} 1449