1/* Generate code from machine description to recognize rtl as insns. 2 Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1997, 1998, 3 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009 4 Free Software Foundation, Inc. 5 6 This file is part of GCC. 7 8 GCC is free software; you can redistribute it and/or modify it 9 under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3, or (at your option) 11 any later version. 12 13 GCC is distributed in the hope that it will be useful, but WITHOUT 14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 16 License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with GCC; see the file COPYING3. If not see 20 <http://www.gnu.org/licenses/>. */ 21 22 23/* This program is used to produce insn-recog.c, which contains a 24 function called `recog' plus its subroutines. These functions 25 contain a decision tree that recognizes whether an rtx, the 26 argument given to recog, is a valid instruction. 27 28 recog returns -1 if the rtx is not valid. If the rtx is valid, 29 recog returns a nonnegative number which is the insn code number 30 for the pattern that matched. This is the same as the order in the 31 machine description of the entry that matched. This number can be 32 used as an index into various insn_* tables, such as insn_template, 33 insn_outfun, and insn_n_operands (found in insn-output.c). 34 35 The third argument to recog is an optional pointer to an int. If 36 present, recog will accept a pattern if it matches except for 37 missing CLOBBER expressions at the end. In that case, the value 38 pointed to by the optional pointer will be set to the number of 39 CLOBBERs that need to be added (it should be initialized to zero by 40 the caller). If it is set nonzero, the caller should allocate a 41 PARALLEL of the appropriate size, copy the initial entries, and 42 call add_clobbers (found in insn-emit.c) to fill in the CLOBBERs. 43 44 This program also generates the function `split_insns', which 45 returns 0 if the rtl could not be split, or it returns the split 46 rtl as an INSN list. 47 48 This program also generates the function `peephole2_insns', which 49 returns 0 if the rtl could not be matched. If there was a match, 50 the new rtl is returned in an INSN list, and LAST_INSN will point 51 to the last recognized insn in the old sequence. */ 52 53#include "bconfig.h" 54#include "system.h" 55#include "coretypes.h" 56#include "tm.h" 57#include "rtl.h" 58#include "errors.h" 59#include "gensupport.h" 60 61#define OUTPUT_LABEL(INDENT_STRING, LABEL_NUMBER) \ 62 printf("%sL%d: ATTRIBUTE_UNUSED_LABEL\n", (INDENT_STRING), (LABEL_NUMBER)) 63 64/* A listhead of decision trees. The alternatives to a node are kept 65 in a doubly-linked list so we can easily add nodes to the proper 66 place when merging. */ 67 68struct decision_head 69{ 70 struct decision *first; 71 struct decision *last; 72}; 73 74/* These types are roughly in the order in which we'd like to test them. */ 75enum decision_type 76{ 77 DT_num_insns, 78 DT_mode, DT_code, DT_veclen, 79 DT_elt_zero_int, DT_elt_one_int, DT_elt_zero_wide, DT_elt_zero_wide_safe, 80 DT_const_int, 81 DT_veclen_ge, DT_dup, DT_pred, DT_c_test, 82 DT_accept_op, DT_accept_insn 83}; 84 85/* A single test. The two accept types aren't tests per-se, but 86 their equality (or lack thereof) does affect tree merging so 87 it is convenient to keep them here. */ 88 89struct decision_test 90{ 91 /* A linked list through the tests attached to a node. */ 92 struct decision_test *next; 93 94 enum decision_type type; 95 96 union 97 { 98 int num_insns; /* Number if insn in a define_peephole2. */ 99 enum machine_mode mode; /* Machine mode of node. */ 100 RTX_CODE code; /* Code to test. */ 101 102 struct 103 { 104 const char *name; /* Predicate to call. */ 105 const struct pred_data *data; 106 /* Optimization hints for this predicate. */ 107 enum machine_mode mode; /* Machine mode for node. */ 108 } pred; 109 110 const char *c_test; /* Additional test to perform. */ 111 int veclen; /* Length of vector. */ 112 int dup; /* Number of operand to compare against. */ 113 HOST_WIDE_INT intval; /* Value for XINT for XWINT. */ 114 int opno; /* Operand number matched. */ 115 116 struct { 117 int code_number; /* Insn number matched. */ 118 int lineno; /* Line number of the insn. */ 119 int num_clobbers_to_add; /* Number of CLOBBERs to be added. */ 120 } insn; 121 } u; 122}; 123 124/* Data structure for decision tree for recognizing legitimate insns. */ 125 126struct decision 127{ 128 struct decision_head success; /* Nodes to test on success. */ 129 struct decision *next; /* Node to test on failure. */ 130 struct decision *prev; /* Node whose failure tests us. */ 131 struct decision *afterward; /* Node to test on success, 132 but failure of successor nodes. */ 133 134 const char *position; /* String denoting position in pattern. */ 135 136 struct decision_test *tests; /* The tests for this node. */ 137 138 int number; /* Node number, used for labels */ 139 int subroutine_number; /* Number of subroutine this node starts */ 140 int need_label; /* Label needs to be output. */ 141}; 142 143#define SUBROUTINE_THRESHOLD 100 144 145static int next_subroutine_number; 146 147/* We can write three types of subroutines: One for insn recognition, 148 one to split insns, and one for peephole-type optimizations. This 149 defines which type is being written. */ 150 151enum routine_type { 152 RECOG, SPLIT, PEEPHOLE2 153}; 154 155#define IS_SPLIT(X) ((X) != RECOG) 156 157/* Next available node number for tree nodes. */ 158 159static int next_number; 160 161/* Next number to use as an insn_code. */ 162 163static int next_insn_code; 164 165/* Record the highest depth we ever have so we know how many variables to 166 allocate in each subroutine we make. */ 167 168static int max_depth; 169 170/* The line number of the start of the pattern currently being processed. */ 171static int pattern_lineno; 172 173/* Count of errors. */ 174static int error_count; 175 176/* Predicate handling. 177 178 We construct from the machine description a table mapping each 179 predicate to a list of the rtl codes it can possibly match. The 180 function 'maybe_both_true' uses it to deduce that there are no 181 expressions that can be matches by certain pairs of tree nodes. 182 Also, if a predicate can match only one code, we can hardwire that 183 code into the node testing the predicate. 184 185 Some predicates are flagged as special. validate_pattern will not 186 warn about modeless match_operand expressions if they have a 187 special predicate. Predicates that allow only constants are also 188 treated as special, for this purpose. 189 190 validate_pattern will warn about predicates that allow non-lvalues 191 when they appear in destination operands. 192 193 Calculating the set of rtx codes that can possibly be accepted by a 194 predicate expression EXP requires a three-state logic: any given 195 subexpression may definitively accept a code C (Y), definitively 196 reject a code C (N), or may have an indeterminate effect (I). N 197 and I is N; Y or I is Y; Y and I, N or I are both I. Here are full 198 truth tables. 199 200 a b a&b a|b 201 Y Y Y Y 202 N Y N Y 203 N N N N 204 I Y I Y 205 I N N I 206 I I I I 207 208 We represent Y with 1, N with 0, I with 2. If any code is left in 209 an I state by the complete expression, we must assume that that 210 code can be accepted. */ 211 212#define N 0 213#define Y 1 214#define I 2 215 216#define TRISTATE_AND(a,b) \ 217 ((a) == I ? ((b) == N ? N : I) : \ 218 (b) == I ? ((a) == N ? N : I) : \ 219 (a) && (b)) 220 221#define TRISTATE_OR(a,b) \ 222 ((a) == I ? ((b) == Y ? Y : I) : \ 223 (b) == I ? ((a) == Y ? Y : I) : \ 224 (a) || (b)) 225 226#define TRISTATE_NOT(a) \ 227 ((a) == I ? I : !(a)) 228 229/* 0 means no warning about that code yet, 1 means warned. */ 230static char did_you_mean_codes[NUM_RTX_CODE]; 231 232/* Recursively calculate the set of rtx codes accepted by the 233 predicate expression EXP, writing the result to CODES. */ 234static void 235compute_predicate_codes (rtx exp, char codes[NUM_RTX_CODE]) 236{ 237 char op0_codes[NUM_RTX_CODE]; 238 char op1_codes[NUM_RTX_CODE]; 239 char op2_codes[NUM_RTX_CODE]; 240 int i; 241 242 switch (GET_CODE (exp)) 243 { 244 case AND: 245 compute_predicate_codes (XEXP (exp, 0), op0_codes); 246 compute_predicate_codes (XEXP (exp, 1), op1_codes); 247 for (i = 0; i < NUM_RTX_CODE; i++) 248 codes[i] = TRISTATE_AND (op0_codes[i], op1_codes[i]); 249 break; 250 251 case IOR: 252 compute_predicate_codes (XEXP (exp, 0), op0_codes); 253 compute_predicate_codes (XEXP (exp, 1), op1_codes); 254 for (i = 0; i < NUM_RTX_CODE; i++) 255 codes[i] = TRISTATE_OR (op0_codes[i], op1_codes[i]); 256 break; 257 case NOT: 258 compute_predicate_codes (XEXP (exp, 0), op0_codes); 259 for (i = 0; i < NUM_RTX_CODE; i++) 260 codes[i] = TRISTATE_NOT (op0_codes[i]); 261 break; 262 263 case IF_THEN_ELSE: 264 /* a ? b : c accepts the same codes as (a & b) | (!a & c). */ 265 compute_predicate_codes (XEXP (exp, 0), op0_codes); 266 compute_predicate_codes (XEXP (exp, 1), op1_codes); 267 compute_predicate_codes (XEXP (exp, 2), op2_codes); 268 for (i = 0; i < NUM_RTX_CODE; i++) 269 codes[i] = TRISTATE_OR (TRISTATE_AND (op0_codes[i], op1_codes[i]), 270 TRISTATE_AND (TRISTATE_NOT (op0_codes[i]), 271 op2_codes[i])); 272 break; 273 274 case MATCH_CODE: 275 /* MATCH_CODE allows a specified list of codes. However, if it 276 does not apply to the top level of the expression, it does not 277 constrain the set of codes for the top level. */ 278 if (XSTR (exp, 1)[0] != '\0') 279 { 280 memset (codes, Y, NUM_RTX_CODE); 281 break; 282 } 283 284 memset (codes, N, NUM_RTX_CODE); 285 { 286 const char *next_code = XSTR (exp, 0); 287 const char *code; 288 289 if (*next_code == '\0') 290 { 291 message_with_line (pattern_lineno, "empty match_code expression"); 292 error_count++; 293 break; 294 } 295 296 while ((code = scan_comma_elt (&next_code)) != 0) 297 { 298 size_t n = next_code - code; 299 int found_it = 0; 300 301 for (i = 0; i < NUM_RTX_CODE; i++) 302 if (!strncmp (code, GET_RTX_NAME (i), n) 303 && GET_RTX_NAME (i)[n] == '\0') 304 { 305 codes[i] = Y; 306 found_it = 1; 307 break; 308 } 309 if (!found_it) 310 { 311 message_with_line (pattern_lineno, "match_code \"%.*s\" matches nothing", 312 (int) n, code); 313 error_count ++; 314 for (i = 0; i < NUM_RTX_CODE; i++) 315 if (!strncasecmp (code, GET_RTX_NAME (i), n) 316 && GET_RTX_NAME (i)[n] == '\0' 317 && !did_you_mean_codes[i]) 318 { 319 did_you_mean_codes[i] = 1; 320 message_with_line (pattern_lineno, "(did you mean \"%s\"?)", GET_RTX_NAME (i)); 321 } 322 } 323 324 } 325 } 326 break; 327 328 case MATCH_OPERAND: 329 /* MATCH_OPERAND disallows the set of codes that the named predicate 330 disallows, and is indeterminate for the codes that it does allow. */ 331 { 332 struct pred_data *p = lookup_predicate (XSTR (exp, 1)); 333 if (!p) 334 { 335 message_with_line (pattern_lineno, 336 "reference to unknown predicate '%s'", 337 XSTR (exp, 1)); 338 error_count++; 339 break; 340 } 341 for (i = 0; i < NUM_RTX_CODE; i++) 342 codes[i] = p->codes[i] ? I : N; 343 } 344 break; 345 346 347 case MATCH_TEST: 348 /* (match_test WHATEVER) is completely indeterminate. */ 349 memset (codes, I, NUM_RTX_CODE); 350 break; 351 352 default: 353 message_with_line (pattern_lineno, 354 "'%s' cannot be used in a define_predicate expression", 355 GET_RTX_NAME (GET_CODE (exp))); 356 error_count++; 357 memset (codes, I, NUM_RTX_CODE); 358 break; 359 } 360} 361 362#undef TRISTATE_OR 363#undef TRISTATE_AND 364#undef TRISTATE_NOT 365 366/* Process a define_predicate expression: compute the set of predicates 367 that can be matched, and record this as a known predicate. */ 368static void 369process_define_predicate (rtx desc) 370{ 371 struct pred_data *pred = XCNEW (struct pred_data); 372 char codes[NUM_RTX_CODE]; 373 int i; 374 375 pred->name = XSTR (desc, 0); 376 if (GET_CODE (desc) == DEFINE_SPECIAL_PREDICATE) 377 pred->special = 1; 378 379 compute_predicate_codes (XEXP (desc, 1), codes); 380 381 for (i = 0; i < NUM_RTX_CODE; i++) 382 if (codes[i] != N) 383 add_predicate_code (pred, (enum rtx_code) i); 384 385 add_predicate (pred); 386} 387#undef I 388#undef N 389#undef Y 390 391 392static struct decision *new_decision 393 (const char *, struct decision_head *); 394static struct decision_test *new_decision_test 395 (enum decision_type, struct decision_test ***); 396static rtx find_operand 397 (rtx, int, rtx); 398static rtx find_matching_operand 399 (rtx, int); 400static void validate_pattern 401 (rtx, rtx, rtx, int); 402static struct decision *add_to_sequence 403 (rtx, struct decision_head *, const char *, enum routine_type, int); 404 405static int maybe_both_true_2 406 (struct decision_test *, struct decision_test *); 407static int maybe_both_true_1 408 (struct decision_test *, struct decision_test *); 409static int maybe_both_true 410 (struct decision *, struct decision *, int); 411 412static int nodes_identical_1 413 (struct decision_test *, struct decision_test *); 414static int nodes_identical 415 (struct decision *, struct decision *); 416static void merge_accept_insn 417 (struct decision *, struct decision *); 418static void merge_trees 419 (struct decision_head *, struct decision_head *); 420 421static void factor_tests 422 (struct decision_head *); 423static void simplify_tests 424 (struct decision_head *); 425static int break_out_subroutines 426 (struct decision_head *, int); 427static void find_afterward 428 (struct decision_head *, struct decision *); 429 430static void change_state 431 (const char *, const char *, const char *); 432static void print_code 433 (enum rtx_code); 434static void write_afterward 435 (struct decision *, struct decision *, const char *); 436static struct decision *write_switch 437 (struct decision *, int); 438static void write_cond 439 (struct decision_test *, int, enum routine_type); 440static void write_action 441 (struct decision *, struct decision_test *, int, int, 442 struct decision *, enum routine_type); 443static int is_unconditional 444 (struct decision_test *, enum routine_type); 445static int write_node 446 (struct decision *, int, enum routine_type); 447static void write_tree_1 448 (struct decision_head *, int, enum routine_type); 449static void write_tree 450 (struct decision_head *, const char *, enum routine_type, int); 451static void write_subroutine 452 (struct decision_head *, enum routine_type); 453static void write_subroutines 454 (struct decision_head *, enum routine_type); 455static void write_header 456 (void); 457 458static struct decision_head make_insn_sequence 459 (rtx, enum routine_type); 460static void process_tree 461 (struct decision_head *, enum routine_type); 462 463static void debug_decision_0 464 (struct decision *, int, int); 465static void debug_decision_1 466 (struct decision *, int); 467static void debug_decision_2 468 (struct decision_test *); 469extern void debug_decision 470 (struct decision *); 471extern void debug_decision_list 472 (struct decision *); 473 474/* Create a new node in sequence after LAST. */ 475 476static struct decision * 477new_decision (const char *position, struct decision_head *last) 478{ 479 struct decision *new_decision = XCNEW (struct decision); 480 481 new_decision->success = *last; 482 new_decision->position = xstrdup (position); 483 new_decision->number = next_number++; 484 485 last->first = last->last = new_decision; 486 return new_decision; 487} 488 489/* Create a new test and link it in at PLACE. */ 490 491static struct decision_test * 492new_decision_test (enum decision_type type, struct decision_test ***pplace) 493{ 494 struct decision_test **place = *pplace; 495 struct decision_test *test; 496 497 test = XNEW (struct decision_test); 498 test->next = *place; 499 test->type = type; 500 *place = test; 501 502 place = &test->next; 503 *pplace = place; 504 505 return test; 506} 507 508/* Search for and return operand N, stop when reaching node STOP. */ 509 510static rtx 511find_operand (rtx pattern, int n, rtx stop) 512{ 513 const char *fmt; 514 RTX_CODE code; 515 int i, j, len; 516 rtx r; 517 518 if (pattern == stop) 519 return stop; 520 521 code = GET_CODE (pattern); 522 if ((code == MATCH_SCRATCH 523 || code == MATCH_OPERAND 524 || code == MATCH_OPERATOR 525 || code == MATCH_PARALLEL) 526 && XINT (pattern, 0) == n) 527 return pattern; 528 529 fmt = GET_RTX_FORMAT (code); 530 len = GET_RTX_LENGTH (code); 531 for (i = 0; i < len; i++) 532 { 533 switch (fmt[i]) 534 { 535 case 'e': case 'u': 536 if ((r = find_operand (XEXP (pattern, i), n, stop)) != NULL_RTX) 537 return r; 538 break; 539 540 case 'V': 541 if (! XVEC (pattern, i)) 542 break; 543 /* Fall through. */ 544 545 case 'E': 546 for (j = 0; j < XVECLEN (pattern, i); j++) 547 if ((r = find_operand (XVECEXP (pattern, i, j), n, stop)) 548 != NULL_RTX) 549 return r; 550 break; 551 552 case 'i': case 'w': case '0': case 's': 553 break; 554 555 default: 556 gcc_unreachable (); 557 } 558 } 559 560 return NULL; 561} 562 563/* Search for and return operand M, such that it has a matching 564 constraint for operand N. */ 565 566static rtx 567find_matching_operand (rtx pattern, int n) 568{ 569 const char *fmt; 570 RTX_CODE code; 571 int i, j, len; 572 rtx r; 573 574 code = GET_CODE (pattern); 575 if (code == MATCH_OPERAND 576 && (XSTR (pattern, 2)[0] == '0' + n 577 || (XSTR (pattern, 2)[0] == '%' 578 && XSTR (pattern, 2)[1] == '0' + n))) 579 return pattern; 580 581 fmt = GET_RTX_FORMAT (code); 582 len = GET_RTX_LENGTH (code); 583 for (i = 0; i < len; i++) 584 { 585 switch (fmt[i]) 586 { 587 case 'e': case 'u': 588 if ((r = find_matching_operand (XEXP (pattern, i), n))) 589 return r; 590 break; 591 592 case 'V': 593 if (! XVEC (pattern, i)) 594 break; 595 /* Fall through. */ 596 597 case 'E': 598 for (j = 0; j < XVECLEN (pattern, i); j++) 599 if ((r = find_matching_operand (XVECEXP (pattern, i, j), n))) 600 return r; 601 break; 602 603 case 'i': case 'w': case '0': case 's': 604 break; 605 606 default: 607 gcc_unreachable (); 608 } 609 } 610 611 return NULL; 612} 613 614 615/* Check for various errors in patterns. SET is nonnull for a destination, 616 and is the complete set pattern. SET_CODE is '=' for normal sets, and 617 '+' within a context that requires in-out constraints. */ 618 619static void 620validate_pattern (rtx pattern, rtx insn, rtx set, int set_code) 621{ 622 const char *fmt; 623 RTX_CODE code; 624 size_t i, len; 625 int j; 626 627 code = GET_CODE (pattern); 628 switch (code) 629 { 630 case MATCH_SCRATCH: 631 return; 632 case MATCH_DUP: 633 case MATCH_OP_DUP: 634 case MATCH_PAR_DUP: 635 if (find_operand (insn, XINT (pattern, 0), pattern) == pattern) 636 { 637 message_with_line (pattern_lineno, 638 "operand %i duplicated before defined", 639 XINT (pattern, 0)); 640 error_count++; 641 } 642 break; 643 case MATCH_OPERAND: 644 case MATCH_OPERATOR: 645 { 646 const char *pred_name = XSTR (pattern, 1); 647 const struct pred_data *pred; 648 const char *c_test; 649 650 if (GET_CODE (insn) == DEFINE_INSN) 651 c_test = XSTR (insn, 2); 652 else 653 c_test = XSTR (insn, 1); 654 655 if (pred_name[0] != 0) 656 { 657 pred = lookup_predicate (pred_name); 658 if (!pred) 659 message_with_line (pattern_lineno, 660 "warning: unknown predicate '%s'", 661 pred_name); 662 } 663 else 664 pred = 0; 665 666 if (code == MATCH_OPERAND) 667 { 668 const char constraints0 = XSTR (pattern, 2)[0]; 669 670 /* In DEFINE_EXPAND, DEFINE_SPLIT, and DEFINE_PEEPHOLE2, we 671 don't use the MATCH_OPERAND constraint, only the predicate. 672 This is confusing to folks doing new ports, so help them 673 not make the mistake. */ 674 if (GET_CODE (insn) == DEFINE_EXPAND 675 || GET_CODE (insn) == DEFINE_SPLIT 676 || GET_CODE (insn) == DEFINE_PEEPHOLE2) 677 { 678 if (constraints0) 679 message_with_line (pattern_lineno, 680 "warning: constraints not supported in %s", 681 rtx_name[GET_CODE (insn)]); 682 } 683 684 /* A MATCH_OPERAND that is a SET should have an output reload. */ 685 else if (set && constraints0) 686 { 687 if (set_code == '+') 688 { 689 if (constraints0 == '+') 690 ; 691 /* If we've only got an output reload for this operand, 692 we'd better have a matching input operand. */ 693 else if (constraints0 == '=' 694 && find_matching_operand (insn, XINT (pattern, 0))) 695 ; 696 else 697 { 698 message_with_line (pattern_lineno, 699 "operand %d missing in-out reload", 700 XINT (pattern, 0)); 701 error_count++; 702 } 703 } 704 else if (constraints0 != '=' && constraints0 != '+') 705 { 706 message_with_line (pattern_lineno, 707 "operand %d missing output reload", 708 XINT (pattern, 0)); 709 error_count++; 710 } 711 } 712 } 713 714 /* Allowing non-lvalues in destinations -- particularly CONST_INT -- 715 while not likely to occur at runtime, results in less efficient 716 code from insn-recog.c. */ 717 if (set && pred && pred->allows_non_lvalue) 718 message_with_line (pattern_lineno, 719 "warning: destination operand %d " 720 "allows non-lvalue", 721 XINT (pattern, 0)); 722 723 /* A modeless MATCH_OPERAND can be handy when we can check for 724 multiple modes in the c_test. In most other cases, it is a 725 mistake. Only DEFINE_INSN is eligible, since SPLIT and 726 PEEP2 can FAIL within the output pattern. Exclude special 727 predicates, which check the mode themselves. Also exclude 728 predicates that allow only constants. Exclude the SET_DEST 729 of a call instruction, as that is a common idiom. */ 730 731 if (GET_MODE (pattern) == VOIDmode 732 && code == MATCH_OPERAND 733 && GET_CODE (insn) == DEFINE_INSN 734 && pred 735 && !pred->special 736 && pred->allows_non_const 737 && strstr (c_test, "operands") == NULL 738 && ! (set 739 && GET_CODE (set) == SET 740 && GET_CODE (SET_SRC (set)) == CALL)) 741 message_with_line (pattern_lineno, 742 "warning: operand %d missing mode?", 743 XINT (pattern, 0)); 744 return; 745 } 746 747 case SET: 748 { 749 enum machine_mode dmode, smode; 750 rtx dest, src; 751 752 dest = SET_DEST (pattern); 753 src = SET_SRC (pattern); 754 755 /* STRICT_LOW_PART is a wrapper. Its argument is the real 756 destination, and it's mode should match the source. */ 757 if (GET_CODE (dest) == STRICT_LOW_PART) 758 dest = XEXP (dest, 0); 759 760 /* Find the referent for a DUP. */ 761 762 if (GET_CODE (dest) == MATCH_DUP 763 || GET_CODE (dest) == MATCH_OP_DUP 764 || GET_CODE (dest) == MATCH_PAR_DUP) 765 dest = find_operand (insn, XINT (dest, 0), NULL); 766 767 if (GET_CODE (src) == MATCH_DUP 768 || GET_CODE (src) == MATCH_OP_DUP 769 || GET_CODE (src) == MATCH_PAR_DUP) 770 src = find_operand (insn, XINT (src, 0), NULL); 771 772 dmode = GET_MODE (dest); 773 smode = GET_MODE (src); 774 775 /* The mode of an ADDRESS_OPERAND is the mode of the memory 776 reference, not the mode of the address. */ 777 if (GET_CODE (src) == MATCH_OPERAND 778 && ! strcmp (XSTR (src, 1), "address_operand")) 779 ; 780 781 /* The operands of a SET must have the same mode unless one 782 is VOIDmode. */ 783 else if (dmode != VOIDmode && smode != VOIDmode && dmode != smode) 784 { 785 message_with_line (pattern_lineno, 786 "mode mismatch in set: %smode vs %smode", 787 GET_MODE_NAME (dmode), GET_MODE_NAME (smode)); 788 error_count++; 789 } 790 791 /* If only one of the operands is VOIDmode, and PC or CC0 is 792 not involved, it's probably a mistake. */ 793 else if (dmode != smode 794 && GET_CODE (dest) != PC 795 && GET_CODE (dest) != CC0 796 && GET_CODE (src) != PC 797 && GET_CODE (src) != CC0 798 && !CONST_INT_P (src) 799 && GET_CODE (src) != CALL) 800 { 801 const char *which; 802 which = (dmode == VOIDmode ? "destination" : "source"); 803 message_with_line (pattern_lineno, 804 "warning: %s missing a mode?", which); 805 } 806 807 if (dest != SET_DEST (pattern)) 808 validate_pattern (dest, insn, pattern, '='); 809 validate_pattern (SET_DEST (pattern), insn, pattern, '='); 810 validate_pattern (SET_SRC (pattern), insn, NULL_RTX, 0); 811 return; 812 } 813 814 case CLOBBER: 815 validate_pattern (SET_DEST (pattern), insn, pattern, '='); 816 return; 817 818 case ZERO_EXTRACT: 819 validate_pattern (XEXP (pattern, 0), insn, set, set ? '+' : 0); 820 validate_pattern (XEXP (pattern, 1), insn, NULL_RTX, 0); 821 validate_pattern (XEXP (pattern, 2), insn, NULL_RTX, 0); 822 return; 823 824 case STRICT_LOW_PART: 825 validate_pattern (XEXP (pattern, 0), insn, set, set ? '+' : 0); 826 return; 827 828 case LABEL_REF: 829 if (GET_MODE (XEXP (pattern, 0)) != VOIDmode) 830 { 831 message_with_line (pattern_lineno, 832 "operand to label_ref %smode not VOIDmode", 833 GET_MODE_NAME (GET_MODE (XEXP (pattern, 0)))); 834 error_count++; 835 } 836 break; 837 838 default: 839 break; 840 } 841 842 fmt = GET_RTX_FORMAT (code); 843 len = GET_RTX_LENGTH (code); 844 for (i = 0; i < len; i++) 845 { 846 switch (fmt[i]) 847 { 848 case 'e': case 'u': 849 validate_pattern (XEXP (pattern, i), insn, NULL_RTX, 0); 850 break; 851 852 case 'E': 853 for (j = 0; j < XVECLEN (pattern, i); j++) 854 validate_pattern (XVECEXP (pattern, i, j), insn, NULL_RTX, 0); 855 break; 856 857 case 'i': case 'w': case '0': case 's': 858 break; 859 860 default: 861 gcc_unreachable (); 862 } 863 } 864} 865 866/* Create a chain of nodes to verify that an rtl expression matches 867 PATTERN. 868 869 LAST is a pointer to the listhead in the previous node in the chain (or 870 in the calling function, for the first node). 871 872 POSITION is the string representing the current position in the insn. 873 874 INSN_TYPE is the type of insn for which we are emitting code. 875 876 A pointer to the final node in the chain is returned. */ 877 878static struct decision * 879add_to_sequence (rtx pattern, struct decision_head *last, const char *position, 880 enum routine_type insn_type, int top) 881{ 882 RTX_CODE code; 883 struct decision *this_decision, *sub; 884 struct decision_test *test; 885 struct decision_test **place; 886 char *subpos; 887 size_t i; 888 const char *fmt; 889 int depth = strlen (position); 890 int len; 891 enum machine_mode mode; 892 893 if (depth > max_depth) 894 max_depth = depth; 895 896 subpos = XNEWVAR (char, depth + 2); 897 strcpy (subpos, position); 898 subpos[depth + 1] = 0; 899 900 sub = this_decision = new_decision (position, last); 901 place = &this_decision->tests; 902 903 restart: 904 mode = GET_MODE (pattern); 905 code = GET_CODE (pattern); 906 907 switch (code) 908 { 909 case PARALLEL: 910 /* Toplevel peephole pattern. */ 911 if (insn_type == PEEPHOLE2 && top) 912 { 913 int num_insns; 914 915 /* Check we have sufficient insns. This avoids complications 916 because we then know peep2_next_insn never fails. */ 917 num_insns = XVECLEN (pattern, 0); 918 if (num_insns > 1) 919 { 920 test = new_decision_test (DT_num_insns, &place); 921 test->u.num_insns = num_insns; 922 last = &sub->success; 923 } 924 else 925 { 926 /* We don't need the node we just created -- unlink it. */ 927 last->first = last->last = NULL; 928 } 929 930 for (i = 0; i < (size_t) XVECLEN (pattern, 0); i++) 931 { 932 /* Which insn we're looking at is represented by A-Z. We don't 933 ever use 'A', however; it is always implied. */ 934 935 subpos[depth] = (i > 0 ? 'A' + i : 0); 936 sub = add_to_sequence (XVECEXP (pattern, 0, i), 937 last, subpos, insn_type, 0); 938 last = &sub->success; 939 } 940 goto ret; 941 } 942 943 /* Else nothing special. */ 944 break; 945 946 case MATCH_PARALLEL: 947 /* The explicit patterns within a match_parallel enforce a minimum 948 length on the vector. The match_parallel predicate may allow 949 for more elements. We do need to check for this minimum here 950 or the code generated to match the internals may reference data 951 beyond the end of the vector. */ 952 test = new_decision_test (DT_veclen_ge, &place); 953 test->u.veclen = XVECLEN (pattern, 2); 954 /* Fall through. */ 955 956 case MATCH_OPERAND: 957 case MATCH_SCRATCH: 958 case MATCH_OPERATOR: 959 { 960 RTX_CODE was_code = code; 961 const char *pred_name; 962 bool allows_const_int = true; 963 964 if (code == MATCH_SCRATCH) 965 { 966 pred_name = "scratch_operand"; 967 code = UNKNOWN; 968 } 969 else 970 { 971 pred_name = XSTR (pattern, 1); 972 if (code == MATCH_PARALLEL) 973 code = PARALLEL; 974 else 975 code = UNKNOWN; 976 } 977 978 if (pred_name[0] != 0) 979 { 980 const struct pred_data *pred; 981 982 test = new_decision_test (DT_pred, &place); 983 test->u.pred.name = pred_name; 984 test->u.pred.mode = mode; 985 986 /* See if we know about this predicate. 987 If we do, remember it for use below. 988 989 We can optimize the generated code a little if either 990 (a) the predicate only accepts one code, or (b) the 991 predicate does not allow CONST_INT, in which case it 992 can match only if the modes match. */ 993 pred = lookup_predicate (pred_name); 994 if (pred) 995 { 996 test->u.pred.data = pred; 997 allows_const_int = pred->codes[CONST_INT]; 998 if (was_code == MATCH_PARALLEL 999 && pred->singleton != PARALLEL) 1000 message_with_line (pattern_lineno, 1001 "predicate '%s' used in match_parallel " 1002 "does not allow only PARALLEL", pred->name); 1003 else 1004 code = pred->singleton; 1005 } 1006 else 1007 message_with_line (pattern_lineno, 1008 "warning: unknown predicate '%s' in '%s' expression", 1009 pred_name, GET_RTX_NAME (was_code)); 1010 } 1011 1012 /* Can't enforce a mode if we allow const_int. */ 1013 if (allows_const_int) 1014 mode = VOIDmode; 1015 1016 /* Accept the operand, i.e. record it in `operands'. */ 1017 test = new_decision_test (DT_accept_op, &place); 1018 test->u.opno = XINT (pattern, 0); 1019 1020 if (was_code == MATCH_OPERATOR || was_code == MATCH_PARALLEL) 1021 { 1022 char base = (was_code == MATCH_OPERATOR ? '0' : 'a'); 1023 for (i = 0; i < (size_t) XVECLEN (pattern, 2); i++) 1024 { 1025 subpos[depth] = i + base; 1026 sub = add_to_sequence (XVECEXP (pattern, 2, i), 1027 &sub->success, subpos, insn_type, 0); 1028 } 1029 } 1030 goto fini; 1031 } 1032 1033 case MATCH_OP_DUP: 1034 code = UNKNOWN; 1035 1036 test = new_decision_test (DT_dup, &place); 1037 test->u.dup = XINT (pattern, 0); 1038 1039 test = new_decision_test (DT_accept_op, &place); 1040 test->u.opno = XINT (pattern, 0); 1041 1042 for (i = 0; i < (size_t) XVECLEN (pattern, 1); i++) 1043 { 1044 subpos[depth] = i + '0'; 1045 sub = add_to_sequence (XVECEXP (pattern, 1, i), 1046 &sub->success, subpos, insn_type, 0); 1047 } 1048 goto fini; 1049 1050 case MATCH_DUP: 1051 case MATCH_PAR_DUP: 1052 code = UNKNOWN; 1053 1054 test = new_decision_test (DT_dup, &place); 1055 test->u.dup = XINT (pattern, 0); 1056 goto fini; 1057 1058 case ADDRESS: 1059 pattern = XEXP (pattern, 0); 1060 goto restart; 1061 1062 default: 1063 break; 1064 } 1065 1066 fmt = GET_RTX_FORMAT (code); 1067 len = GET_RTX_LENGTH (code); 1068 1069 /* Do tests against the current node first. */ 1070 for (i = 0; i < (size_t) len; i++) 1071 { 1072 if (fmt[i] == 'i') 1073 { 1074 gcc_assert (i < 2); 1075 1076 if (!i) 1077 { 1078 test = new_decision_test (DT_elt_zero_int, &place); 1079 test->u.intval = XINT (pattern, i); 1080 } 1081 else 1082 { 1083 test = new_decision_test (DT_elt_one_int, &place); 1084 test->u.intval = XINT (pattern, i); 1085 } 1086 } 1087 else if (fmt[i] == 'w') 1088 { 1089 /* If this value actually fits in an int, we can use a switch 1090 statement here, so indicate that. */ 1091 enum decision_type type 1092 = ((int) XWINT (pattern, i) == XWINT (pattern, i)) 1093 ? DT_elt_zero_wide_safe : DT_elt_zero_wide; 1094 1095 gcc_assert (!i); 1096 1097 test = new_decision_test (type, &place); 1098 test->u.intval = XWINT (pattern, i); 1099 } 1100 else if (fmt[i] == 'E') 1101 { 1102 gcc_assert (!i); 1103 1104 test = new_decision_test (DT_veclen, &place); 1105 test->u.veclen = XVECLEN (pattern, i); 1106 } 1107 } 1108 1109 /* Now test our sub-patterns. */ 1110 for (i = 0; i < (size_t) len; i++) 1111 { 1112 switch (fmt[i]) 1113 { 1114 case 'e': case 'u': 1115 subpos[depth] = '0' + i; 1116 sub = add_to_sequence (XEXP (pattern, i), &sub->success, 1117 subpos, insn_type, 0); 1118 break; 1119 1120 case 'E': 1121 { 1122 int j; 1123 for (j = 0; j < XVECLEN (pattern, i); j++) 1124 { 1125 subpos[depth] = 'a' + j; 1126 sub = add_to_sequence (XVECEXP (pattern, i, j), 1127 &sub->success, subpos, insn_type, 0); 1128 } 1129 break; 1130 } 1131 1132 case 'i': case 'w': 1133 /* Handled above. */ 1134 break; 1135 case '0': 1136 break; 1137 1138 default: 1139 gcc_unreachable (); 1140 } 1141 } 1142 1143 fini: 1144 /* Insert nodes testing mode and code, if they're still relevant, 1145 before any of the nodes we may have added above. */ 1146 if (code != UNKNOWN) 1147 { 1148 place = &this_decision->tests; 1149 test = new_decision_test (DT_code, &place); 1150 test->u.code = code; 1151 } 1152 1153 if (mode != VOIDmode) 1154 { 1155 place = &this_decision->tests; 1156 test = new_decision_test (DT_mode, &place); 1157 test->u.mode = mode; 1158 } 1159 1160 /* If we didn't insert any tests or accept nodes, hork. */ 1161 gcc_assert (this_decision->tests); 1162 1163 ret: 1164 free (subpos); 1165 return sub; 1166} 1167 1168/* A subroutine of maybe_both_true; examines only one test. 1169 Returns > 0 for "definitely both true" and < 0 for "maybe both true". */ 1170 1171static int 1172maybe_both_true_2 (struct decision_test *d1, struct decision_test *d2) 1173{ 1174 if (d1->type == d2->type) 1175 { 1176 switch (d1->type) 1177 { 1178 case DT_num_insns: 1179 if (d1->u.num_insns == d2->u.num_insns) 1180 return 1; 1181 else 1182 return -1; 1183 1184 case DT_mode: 1185 return d1->u.mode == d2->u.mode; 1186 1187 case DT_code: 1188 return d1->u.code == d2->u.code; 1189 1190 case DT_veclen: 1191 return d1->u.veclen == d2->u.veclen; 1192 1193 case DT_elt_zero_int: 1194 case DT_elt_one_int: 1195 case DT_elt_zero_wide: 1196 case DT_elt_zero_wide_safe: 1197 return d1->u.intval == d2->u.intval; 1198 1199 default: 1200 break; 1201 } 1202 } 1203 1204 /* If either has a predicate that we know something about, set 1205 things up so that D1 is the one that always has a known 1206 predicate. Then see if they have any codes in common. */ 1207 1208 if (d1->type == DT_pred || d2->type == DT_pred) 1209 { 1210 if (d2->type == DT_pred) 1211 { 1212 struct decision_test *tmp; 1213 tmp = d1, d1 = d2, d2 = tmp; 1214 } 1215 1216 /* If D2 tests a mode, see if it matches D1. */ 1217 if (d1->u.pred.mode != VOIDmode) 1218 { 1219 if (d2->type == DT_mode) 1220 { 1221 if (d1->u.pred.mode != d2->u.mode 1222 /* The mode of an address_operand predicate is the 1223 mode of the memory, not the operand. It can only 1224 be used for testing the predicate, so we must 1225 ignore it here. */ 1226 && strcmp (d1->u.pred.name, "address_operand") != 0) 1227 return 0; 1228 } 1229 /* Don't check two predicate modes here, because if both predicates 1230 accept CONST_INT, then both can still be true even if the modes 1231 are different. If they don't accept CONST_INT, there will be a 1232 separate DT_mode that will make maybe_both_true_1 return 0. */ 1233 } 1234 1235 if (d1->u.pred.data) 1236 { 1237 /* If D2 tests a code, see if it is in the list of valid 1238 codes for D1's predicate. */ 1239 if (d2->type == DT_code) 1240 { 1241 if (!d1->u.pred.data->codes[d2->u.code]) 1242 return 0; 1243 } 1244 1245 /* Otherwise see if the predicates have any codes in common. */ 1246 else if (d2->type == DT_pred && d2->u.pred.data) 1247 { 1248 bool common = false; 1249 int c; 1250 1251 for (c = 0; c < NUM_RTX_CODE; c++) 1252 if (d1->u.pred.data->codes[c] && d2->u.pred.data->codes[c]) 1253 { 1254 common = true; 1255 break; 1256 } 1257 1258 if (!common) 1259 return 0; 1260 } 1261 } 1262 } 1263 1264 /* Tests vs veclen may be known when strict equality is involved. */ 1265 if (d1->type == DT_veclen && d2->type == DT_veclen_ge) 1266 return d1->u.veclen >= d2->u.veclen; 1267 if (d1->type == DT_veclen_ge && d2->type == DT_veclen) 1268 return d2->u.veclen >= d1->u.veclen; 1269 1270 return -1; 1271} 1272 1273/* A subroutine of maybe_both_true; examines all the tests for a given node. 1274 Returns > 0 for "definitely both true" and < 0 for "maybe both true". */ 1275 1276static int 1277maybe_both_true_1 (struct decision_test *d1, struct decision_test *d2) 1278{ 1279 struct decision_test *t1, *t2; 1280 1281 /* A match_operand with no predicate can match anything. Recognize 1282 this by the existence of a lone DT_accept_op test. */ 1283 if (d1->type == DT_accept_op || d2->type == DT_accept_op) 1284 return 1; 1285 1286 /* Eliminate pairs of tests while they can exactly match. */ 1287 while (d1 && d2 && d1->type == d2->type) 1288 { 1289 if (maybe_both_true_2 (d1, d2) == 0) 1290 return 0; 1291 d1 = d1->next, d2 = d2->next; 1292 } 1293 1294 /* After that, consider all pairs. */ 1295 for (t1 = d1; t1 ; t1 = t1->next) 1296 for (t2 = d2; t2 ; t2 = t2->next) 1297 if (maybe_both_true_2 (t1, t2) == 0) 1298 return 0; 1299 1300 return -1; 1301} 1302 1303/* Return 0 if we can prove that there is no RTL that can match both 1304 D1 and D2. Otherwise, return 1 (it may be that there is an RTL that 1305 can match both or just that we couldn't prove there wasn't such an RTL). 1306 1307 TOPLEVEL is nonzero if we are to only look at the top level and not 1308 recursively descend. */ 1309 1310static int 1311maybe_both_true (struct decision *d1, struct decision *d2, 1312 int toplevel) 1313{ 1314 struct decision *p1, *p2; 1315 int cmp; 1316 1317 /* Don't compare strings on the different positions in insn. Doing so 1318 is incorrect and results in false matches from constructs like 1319 1320 [(set (subreg:HI (match_operand:SI "register_operand" "r") 0) 1321 (subreg:HI (match_operand:SI "register_operand" "r") 0))] 1322 vs 1323 [(set (match_operand:HI "register_operand" "r") 1324 (match_operand:HI "register_operand" "r"))] 1325 1326 If we are presented with such, we are recursing through the remainder 1327 of a node's success nodes (from the loop at the end of this function). 1328 Skip forward until we come to a position that matches. 1329 1330 Due to the way position strings are constructed, we know that iterating 1331 forward from the lexically lower position (e.g. "00") will run into 1332 the lexically higher position (e.g. "1") and not the other way around. 1333 This saves a bit of effort. */ 1334 1335 cmp = strcmp (d1->position, d2->position); 1336 if (cmp != 0) 1337 { 1338 gcc_assert (!toplevel); 1339 1340 /* If the d2->position was lexically lower, swap. */ 1341 if (cmp > 0) 1342 p1 = d1, d1 = d2, d2 = p1; 1343 1344 if (d1->success.first == 0) 1345 return 1; 1346 for (p1 = d1->success.first; p1; p1 = p1->next) 1347 if (maybe_both_true (p1, d2, 0)) 1348 return 1; 1349 1350 return 0; 1351 } 1352 1353 /* Test the current level. */ 1354 cmp = maybe_both_true_1 (d1->tests, d2->tests); 1355 if (cmp >= 0) 1356 return cmp; 1357 1358 /* We can't prove that D1 and D2 cannot both be true. If we are only 1359 to check the top level, return 1. Otherwise, see if we can prove 1360 that all choices in both successors are mutually exclusive. If 1361 either does not have any successors, we can't prove they can't both 1362 be true. */ 1363 1364 if (toplevel || d1->success.first == 0 || d2->success.first == 0) 1365 return 1; 1366 1367 for (p1 = d1->success.first; p1; p1 = p1->next) 1368 for (p2 = d2->success.first; p2; p2 = p2->next) 1369 if (maybe_both_true (p1, p2, 0)) 1370 return 1; 1371 1372 return 0; 1373} 1374 1375/* A subroutine of nodes_identical. Examine two tests for equivalence. */ 1376 1377static int 1378nodes_identical_1 (struct decision_test *d1, struct decision_test *d2) 1379{ 1380 switch (d1->type) 1381 { 1382 case DT_num_insns: 1383 return d1->u.num_insns == d2->u.num_insns; 1384 1385 case DT_mode: 1386 return d1->u.mode == d2->u.mode; 1387 1388 case DT_code: 1389 return d1->u.code == d2->u.code; 1390 1391 case DT_pred: 1392 return (d1->u.pred.mode == d2->u.pred.mode 1393 && strcmp (d1->u.pred.name, d2->u.pred.name) == 0); 1394 1395 case DT_c_test: 1396 return strcmp (d1->u.c_test, d2->u.c_test) == 0; 1397 1398 case DT_veclen: 1399 case DT_veclen_ge: 1400 return d1->u.veclen == d2->u.veclen; 1401 1402 case DT_dup: 1403 return d1->u.dup == d2->u.dup; 1404 1405 case DT_elt_zero_int: 1406 case DT_elt_one_int: 1407 case DT_elt_zero_wide: 1408 case DT_elt_zero_wide_safe: 1409 return d1->u.intval == d2->u.intval; 1410 1411 case DT_accept_op: 1412 return d1->u.opno == d2->u.opno; 1413 1414 case DT_accept_insn: 1415 /* Differences will be handled in merge_accept_insn. */ 1416 return 1; 1417 1418 default: 1419 gcc_unreachable (); 1420 } 1421} 1422 1423/* True iff the two nodes are identical (on one level only). Due 1424 to the way these lists are constructed, we shouldn't have to 1425 consider different orderings on the tests. */ 1426 1427static int 1428nodes_identical (struct decision *d1, struct decision *d2) 1429{ 1430 struct decision_test *t1, *t2; 1431 1432 for (t1 = d1->tests, t2 = d2->tests; t1 && t2; t1 = t1->next, t2 = t2->next) 1433 { 1434 if (t1->type != t2->type) 1435 return 0; 1436 if (! nodes_identical_1 (t1, t2)) 1437 return 0; 1438 } 1439 1440 /* For success, they should now both be null. */ 1441 if (t1 != t2) 1442 return 0; 1443 1444 /* Check that their subnodes are at the same position, as any one set 1445 of sibling decisions must be at the same position. Allowing this 1446 requires complications to find_afterward and when change_state is 1447 invoked. */ 1448 if (d1->success.first 1449 && d2->success.first 1450 && strcmp (d1->success.first->position, d2->success.first->position)) 1451 return 0; 1452 1453 return 1; 1454} 1455 1456/* A subroutine of merge_trees; given two nodes that have been declared 1457 identical, cope with two insn accept states. If they differ in the 1458 number of clobbers, then the conflict was created by make_insn_sequence 1459 and we can drop the with-clobbers version on the floor. If both 1460 nodes have no additional clobbers, we have found an ambiguity in the 1461 source machine description. */ 1462 1463static void 1464merge_accept_insn (struct decision *oldd, struct decision *addd) 1465{ 1466 struct decision_test *old, *add; 1467 1468 for (old = oldd->tests; old; old = old->next) 1469 if (old->type == DT_accept_insn) 1470 break; 1471 if (old == NULL) 1472 return; 1473 1474 for (add = addd->tests; add; add = add->next) 1475 if (add->type == DT_accept_insn) 1476 break; 1477 if (add == NULL) 1478 return; 1479 1480 /* If one node is for a normal insn and the second is for the base 1481 insn with clobbers stripped off, the second node should be ignored. */ 1482 1483 if (old->u.insn.num_clobbers_to_add == 0 1484 && add->u.insn.num_clobbers_to_add > 0) 1485 { 1486 /* Nothing to do here. */ 1487 } 1488 else if (old->u.insn.num_clobbers_to_add > 0 1489 && add->u.insn.num_clobbers_to_add == 0) 1490 { 1491 /* In this case, replace OLD with ADD. */ 1492 old->u.insn = add->u.insn; 1493 } 1494 else 1495 { 1496 message_with_line (add->u.insn.lineno, "`%s' matches `%s'", 1497 get_insn_name (add->u.insn.code_number), 1498 get_insn_name (old->u.insn.code_number)); 1499 message_with_line (old->u.insn.lineno, "previous definition of `%s'", 1500 get_insn_name (old->u.insn.code_number)); 1501 error_count++; 1502 } 1503} 1504 1505/* Merge two decision trees OLDH and ADDH, modifying OLDH destructively. */ 1506 1507static void 1508merge_trees (struct decision_head *oldh, struct decision_head *addh) 1509{ 1510 struct decision *next, *add; 1511 1512 if (addh->first == 0) 1513 return; 1514 if (oldh->first == 0) 1515 { 1516 *oldh = *addh; 1517 return; 1518 } 1519 1520 /* Trying to merge bits at different positions isn't possible. */ 1521 gcc_assert (!strcmp (oldh->first->position, addh->first->position)); 1522 1523 for (add = addh->first; add ; add = next) 1524 { 1525 struct decision *old, *insert_before = NULL; 1526 1527 next = add->next; 1528 1529 /* The semantics of pattern matching state that the tests are 1530 done in the order given in the MD file so that if an insn 1531 matches two patterns, the first one will be used. However, 1532 in practice, most, if not all, patterns are unambiguous so 1533 that their order is independent. In that case, we can merge 1534 identical tests and group all similar modes and codes together. 1535 1536 Scan starting from the end of OLDH until we reach a point 1537 where we reach the head of the list or where we pass a 1538 pattern that could also be true if NEW is true. If we find 1539 an identical pattern, we can merge them. Also, record the 1540 last node that tests the same code and mode and the last one 1541 that tests just the same mode. 1542 1543 If we have no match, place NEW after the closest match we found. */ 1544 1545 for (old = oldh->last; old; old = old->prev) 1546 { 1547 if (nodes_identical (old, add)) 1548 { 1549 merge_accept_insn (old, add); 1550 merge_trees (&old->success, &add->success); 1551 goto merged_nodes; 1552 } 1553 1554 if (maybe_both_true (old, add, 0)) 1555 break; 1556 1557 /* Insert the nodes in DT test type order, which is roughly 1558 how expensive/important the test is. Given that the tests 1559 are also ordered within the list, examining the first is 1560 sufficient. */ 1561 if ((int) add->tests->type < (int) old->tests->type) 1562 insert_before = old; 1563 } 1564 1565 if (insert_before == NULL) 1566 { 1567 add->next = NULL; 1568 add->prev = oldh->last; 1569 oldh->last->next = add; 1570 oldh->last = add; 1571 } 1572 else 1573 { 1574 if ((add->prev = insert_before->prev) != NULL) 1575 add->prev->next = add; 1576 else 1577 oldh->first = add; 1578 add->next = insert_before; 1579 insert_before->prev = add; 1580 } 1581 1582 merged_nodes:; 1583 } 1584} 1585 1586/* Walk the tree looking for sub-nodes that perform common tests. 1587 Factor out the common test into a new node. This enables us 1588 (depending on the test type) to emit switch statements later. */ 1589 1590static void 1591factor_tests (struct decision_head *head) 1592{ 1593 struct decision *first, *next; 1594 1595 for (first = head->first; first && first->next; first = next) 1596 { 1597 enum decision_type type; 1598 struct decision *new_dec, *old_last; 1599 1600 type = first->tests->type; 1601 next = first->next; 1602 1603 /* Want at least two compatible sequential nodes. */ 1604 if (next->tests->type != type) 1605 continue; 1606 1607 /* Don't want all node types, just those we can turn into 1608 switch statements. */ 1609 if (type != DT_mode 1610 && type != DT_code 1611 && type != DT_veclen 1612 && type != DT_elt_zero_int 1613 && type != DT_elt_one_int 1614 && type != DT_elt_zero_wide_safe) 1615 continue; 1616 1617 /* If we'd been performing more than one test, create a new node 1618 below our first test. */ 1619 if (first->tests->next != NULL) 1620 { 1621 new_dec = new_decision (first->position, &first->success); 1622 new_dec->tests = first->tests->next; 1623 first->tests->next = NULL; 1624 } 1625 1626 /* Crop the node tree off after our first test. */ 1627 first->next = NULL; 1628 old_last = head->last; 1629 head->last = first; 1630 1631 /* For each compatible test, adjust to perform only one test in 1632 the top level node, then merge the node back into the tree. */ 1633 do 1634 { 1635 struct decision_head h; 1636 1637 if (next->tests->next != NULL) 1638 { 1639 new_dec = new_decision (next->position, &next->success); 1640 new_dec->tests = next->tests->next; 1641 next->tests->next = NULL; 1642 } 1643 new_dec = next; 1644 next = next->next; 1645 new_dec->next = NULL; 1646 h.first = h.last = new_dec; 1647 1648 merge_trees (head, &h); 1649 } 1650 while (next && next->tests->type == type); 1651 1652 /* After we run out of compatible tests, graft the remaining nodes 1653 back onto the tree. */ 1654 if (next) 1655 { 1656 next->prev = head->last; 1657 head->last->next = next; 1658 head->last = old_last; 1659 } 1660 } 1661 1662 /* Recurse. */ 1663 for (first = head->first; first; first = first->next) 1664 factor_tests (&first->success); 1665} 1666 1667/* After factoring, try to simplify the tests on any one node. 1668 Tests that are useful for switch statements are recognizable 1669 by having only a single test on a node -- we'll be manipulating 1670 nodes with multiple tests: 1671 1672 If we have mode tests or code tests that are redundant with 1673 predicates, remove them. */ 1674 1675static void 1676simplify_tests (struct decision_head *head) 1677{ 1678 struct decision *tree; 1679 1680 for (tree = head->first; tree; tree = tree->next) 1681 { 1682 struct decision_test *a, *b; 1683 1684 a = tree->tests; 1685 b = a->next; 1686 if (b == NULL) 1687 continue; 1688 1689 /* Find a predicate node. */ 1690 while (b && b->type != DT_pred) 1691 b = b->next; 1692 if (b) 1693 { 1694 /* Due to how these tests are constructed, we don't even need 1695 to check that the mode and code are compatible -- they were 1696 generated from the predicate in the first place. */ 1697 while (a->type == DT_mode || a->type == DT_code) 1698 a = a->next; 1699 tree->tests = a; 1700 } 1701 } 1702 1703 /* Recurse. */ 1704 for (tree = head->first; tree; tree = tree->next) 1705 simplify_tests (&tree->success); 1706} 1707 1708/* Count the number of subnodes of HEAD. If the number is high enough, 1709 make the first node in HEAD start a separate subroutine in the C code 1710 that is generated. */ 1711 1712static int 1713break_out_subroutines (struct decision_head *head, int initial) 1714{ 1715 int size = 0; 1716 struct decision *sub; 1717 1718 for (sub = head->first; sub; sub = sub->next) 1719 size += 1 + break_out_subroutines (&sub->success, 0); 1720 1721 if (size > SUBROUTINE_THRESHOLD && ! initial) 1722 { 1723 head->first->subroutine_number = ++next_subroutine_number; 1724 size = 1; 1725 } 1726 return size; 1727} 1728 1729/* For each node p, find the next alternative that might be true 1730 when p is true. */ 1731 1732static void 1733find_afterward (struct decision_head *head, struct decision *real_afterward) 1734{ 1735 struct decision *p, *q, *afterward; 1736 1737 /* We can't propagate alternatives across subroutine boundaries. 1738 This is not incorrect, merely a minor optimization loss. */ 1739 1740 p = head->first; 1741 afterward = (p->subroutine_number > 0 ? NULL : real_afterward); 1742 1743 for ( ; p ; p = p->next) 1744 { 1745 /* Find the next node that might be true if this one fails. */ 1746 for (q = p->next; q ; q = q->next) 1747 if (maybe_both_true (p, q, 1)) 1748 break; 1749 1750 /* If we reached the end of the list without finding one, 1751 use the incoming afterward position. */ 1752 if (!q) 1753 q = afterward; 1754 p->afterward = q; 1755 if (q) 1756 q->need_label = 1; 1757 } 1758 1759 /* Recurse. */ 1760 for (p = head->first; p ; p = p->next) 1761 if (p->success.first) 1762 find_afterward (&p->success, p->afterward); 1763 1764 /* When we are generating a subroutine, record the real afterward 1765 position in the first node where write_tree can find it, and we 1766 can do the right thing at the subroutine call site. */ 1767 p = head->first; 1768 if (p->subroutine_number > 0) 1769 p->afterward = real_afterward; 1770} 1771 1772/* Assuming that the state of argument is denoted by OLDPOS, take whatever 1773 actions are necessary to move to NEWPOS. If we fail to move to the 1774 new state, branch to node AFTERWARD if nonzero, otherwise return. 1775 1776 Failure to move to the new state can only occur if we are trying to 1777 match multiple insns and we try to step past the end of the stream. */ 1778 1779static void 1780change_state (const char *oldpos, const char *newpos, const char *indent) 1781{ 1782 int odepth = strlen (oldpos); 1783 int ndepth = strlen (newpos); 1784 int depth; 1785 int old_has_insn, new_has_insn; 1786 1787 /* Pop up as many levels as necessary. */ 1788 for (depth = odepth; strncmp (oldpos, newpos, depth) != 0; --depth) 1789 continue; 1790 1791 /* Hunt for the last [A-Z] in both strings. */ 1792 for (old_has_insn = odepth - 1; old_has_insn >= 0; --old_has_insn) 1793 if (ISUPPER (oldpos[old_has_insn])) 1794 break; 1795 for (new_has_insn = ndepth - 1; new_has_insn >= 0; --new_has_insn) 1796 if (ISUPPER (newpos[new_has_insn])) 1797 break; 1798 1799 /* Go down to desired level. */ 1800 while (depth < ndepth) 1801 { 1802 /* It's a different insn from the first one. */ 1803 if (ISUPPER (newpos[depth])) 1804 { 1805 printf ("%stem = peep2_next_insn (%d);\n", 1806 indent, newpos[depth] - 'A'); 1807 printf ("%sx%d = PATTERN (tem);\n", indent, depth + 1); 1808 } 1809 else if (ISLOWER (newpos[depth])) 1810 printf ("%sx%d = XVECEXP (x%d, 0, %d);\n", 1811 indent, depth + 1, depth, newpos[depth] - 'a'); 1812 else 1813 printf ("%sx%d = XEXP (x%d, %c);\n", 1814 indent, depth + 1, depth, newpos[depth]); 1815 ++depth; 1816 } 1817} 1818 1819/* Print the enumerator constant for CODE -- the upcase version of 1820 the name. */ 1821 1822static void 1823print_code (enum rtx_code code) 1824{ 1825 const char *p; 1826 for (p = GET_RTX_NAME (code); *p; p++) 1827 putchar (TOUPPER (*p)); 1828} 1829 1830/* Emit code to cross an afterward link -- change state and branch. */ 1831 1832static void 1833write_afterward (struct decision *start, struct decision *afterward, 1834 const char *indent) 1835{ 1836 if (!afterward || start->subroutine_number > 0) 1837 printf("%sgoto ret0;\n", indent); 1838 else 1839 { 1840 change_state (start->position, afterward->position, indent); 1841 printf ("%sgoto L%d;\n", indent, afterward->number); 1842 } 1843} 1844 1845/* Emit a HOST_WIDE_INT as an integer constant expression. We need to take 1846 special care to avoid "decimal constant is so large that it is unsigned" 1847 warnings in the resulting code. */ 1848 1849static void 1850print_host_wide_int (HOST_WIDE_INT val) 1851{ 1852 /* XXX: the "min" below is computed for build, not host!!! */ 1853 HOST_WIDE_INT min = (unsigned HOST_WIDE_INT)1 << (HOST_BITS_PER_WIDE_INT-1); 1854 if (val == min) 1855 printf ("(HOST_WIDE_INT_CONSTANT (" HOST_WIDE_INT_PRINT_DEC ")-1)", 1856 val + 1); 1857 else 1858 printf ("HOST_WIDE_INT_CONSTANT (" HOST_WIDE_INT_PRINT_DEC")", val); 1859} 1860 1861/* Emit a switch statement, if possible, for an initial sequence of 1862 nodes at START. Return the first node yet untested. */ 1863 1864static struct decision * 1865write_switch (struct decision *start, int depth) 1866{ 1867 struct decision *p = start; 1868 enum decision_type type = p->tests->type; 1869 struct decision *needs_label = NULL; 1870 1871 /* If we have two or more nodes in sequence that test the same one 1872 thing, we may be able to use a switch statement. */ 1873 1874 if (!p->next 1875 || p->tests->next 1876 || p->next->tests->type != type 1877 || p->next->tests->next 1878 || nodes_identical_1 (p->tests, p->next->tests)) 1879 return p; 1880 1881 /* DT_code is special in that we can do interesting things with 1882 known predicates at the same time. */ 1883 if (type == DT_code) 1884 { 1885 char codemap[NUM_RTX_CODE]; 1886 struct decision *ret; 1887 RTX_CODE code; 1888 1889 memset (codemap, 0, sizeof(codemap)); 1890 1891 printf (" switch (GET_CODE (x%d))\n {\n", depth); 1892 code = p->tests->u.code; 1893 do 1894 { 1895 if (p != start && p->need_label && needs_label == NULL) 1896 needs_label = p; 1897 1898 printf (" case "); 1899 print_code (code); 1900 printf (":\n goto L%d;\n", p->success.first->number); 1901 p->success.first->need_label = 1; 1902 1903 codemap[code] = 1; 1904 p = p->next; 1905 } 1906 while (p 1907 && ! p->tests->next 1908 && p->tests->type == DT_code 1909 && ! codemap[code = p->tests->u.code]); 1910 1911 /* If P is testing a predicate that we know about and we haven't 1912 seen any of the codes that are valid for the predicate, we can 1913 write a series of "case" statement, one for each possible code. 1914 Since we are already in a switch, these redundant tests are very 1915 cheap and will reduce the number of predicates called. */ 1916 1917 /* Note that while we write out cases for these predicates here, 1918 we don't actually write the test here, as it gets kinda messy. 1919 It is trivial to leave this to later by telling our caller that 1920 we only processed the CODE tests. */ 1921 if (needs_label != NULL) 1922 ret = needs_label; 1923 else 1924 ret = p; 1925 1926 while (p && p->tests->type == DT_pred && p->tests->u.pred.data) 1927 { 1928 const struct pred_data *data = p->tests->u.pred.data; 1929 int c; 1930 1931 for (c = 0; c < NUM_RTX_CODE; c++) 1932 if (codemap[c] && data->codes[c]) 1933 goto pred_done; 1934 1935 for (c = 0; c < NUM_RTX_CODE; c++) 1936 if (data->codes[c]) 1937 { 1938 fputs (" case ", stdout); 1939 print_code ((enum rtx_code) c); 1940 fputs (":\n", stdout); 1941 codemap[c] = 1; 1942 } 1943 1944 printf (" goto L%d;\n", p->number); 1945 p->need_label = 1; 1946 p = p->next; 1947 } 1948 1949 pred_done: 1950 /* Make the default case skip the predicates we managed to match. */ 1951 1952 printf (" default:\n"); 1953 if (p != ret) 1954 { 1955 if (p) 1956 { 1957 printf (" goto L%d;\n", p->number); 1958 p->need_label = 1; 1959 } 1960 else 1961 write_afterward (start, start->afterward, " "); 1962 } 1963 else 1964 printf (" break;\n"); 1965 printf (" }\n"); 1966 1967 return ret; 1968 } 1969 else if (type == DT_mode 1970 || type == DT_veclen 1971 || type == DT_elt_zero_int 1972 || type == DT_elt_one_int 1973 || type == DT_elt_zero_wide_safe) 1974 { 1975 const char *indent = ""; 1976 1977 /* We cast switch parameter to integer, so we must ensure that the value 1978 fits. */ 1979 if (type == DT_elt_zero_wide_safe) 1980 { 1981 indent = " "; 1982 printf(" if ((int) XWINT (x%d, 0) == XWINT (x%d, 0))\n", depth, depth); 1983 } 1984 printf ("%s switch (", indent); 1985 switch (type) 1986 { 1987 case DT_mode: 1988 printf ("GET_MODE (x%d)", depth); 1989 break; 1990 case DT_veclen: 1991 printf ("XVECLEN (x%d, 0)", depth); 1992 break; 1993 case DT_elt_zero_int: 1994 printf ("XINT (x%d, 0)", depth); 1995 break; 1996 case DT_elt_one_int: 1997 printf ("XINT (x%d, 1)", depth); 1998 break; 1999 case DT_elt_zero_wide_safe: 2000 /* Convert result of XWINT to int for portability since some C 2001 compilers won't do it and some will. */ 2002 printf ("(int) XWINT (x%d, 0)", depth); 2003 break; 2004 default: 2005 gcc_unreachable (); 2006 } 2007 printf (")\n%s {\n", indent); 2008 2009 do 2010 { 2011 /* Merge trees will not unify identical nodes if their 2012 sub-nodes are at different levels. Thus we must check 2013 for duplicate cases. */ 2014 struct decision *q; 2015 for (q = start; q != p; q = q->next) 2016 if (nodes_identical_1 (p->tests, q->tests)) 2017 goto case_done; 2018 2019 if (p != start && p->need_label && needs_label == NULL) 2020 needs_label = p; 2021 2022 printf ("%s case ", indent); 2023 switch (type) 2024 { 2025 case DT_mode: 2026 printf ("%smode", GET_MODE_NAME (p->tests->u.mode)); 2027 break; 2028 case DT_veclen: 2029 printf ("%d", p->tests->u.veclen); 2030 break; 2031 case DT_elt_zero_int: 2032 case DT_elt_one_int: 2033 case DT_elt_zero_wide: 2034 case DT_elt_zero_wide_safe: 2035 print_host_wide_int (p->tests->u.intval); 2036 break; 2037 default: 2038 gcc_unreachable (); 2039 } 2040 printf (":\n%s goto L%d;\n", indent, p->success.first->number); 2041 p->success.first->need_label = 1; 2042 2043 p = p->next; 2044 } 2045 while (p && p->tests->type == type && !p->tests->next); 2046 2047 case_done: 2048 printf ("%s default:\n%s break;\n%s }\n", 2049 indent, indent, indent); 2050 2051 return needs_label != NULL ? needs_label : p; 2052 } 2053 else 2054 { 2055 /* None of the other tests are amenable. */ 2056 return p; 2057 } 2058} 2059 2060/* Emit code for one test. */ 2061 2062static void 2063write_cond (struct decision_test *p, int depth, 2064 enum routine_type subroutine_type) 2065{ 2066 switch (p->type) 2067 { 2068 case DT_num_insns: 2069 printf ("peep2_current_count >= %d", p->u.num_insns); 2070 break; 2071 2072 case DT_mode: 2073 printf ("GET_MODE (x%d) == %smode", depth, GET_MODE_NAME (p->u.mode)); 2074 break; 2075 2076 case DT_code: 2077 printf ("GET_CODE (x%d) == ", depth); 2078 print_code (p->u.code); 2079 break; 2080 2081 case DT_veclen: 2082 printf ("XVECLEN (x%d, 0) == %d", depth, p->u.veclen); 2083 break; 2084 2085 case DT_elt_zero_int: 2086 printf ("XINT (x%d, 0) == %d", depth, (int) p->u.intval); 2087 break; 2088 2089 case DT_elt_one_int: 2090 printf ("XINT (x%d, 1) == %d", depth, (int) p->u.intval); 2091 break; 2092 2093 case DT_elt_zero_wide: 2094 case DT_elt_zero_wide_safe: 2095 printf ("XWINT (x%d, 0) == ", depth); 2096 print_host_wide_int (p->u.intval); 2097 break; 2098 2099 case DT_const_int: 2100 printf ("x%d == const_int_rtx[MAX_SAVED_CONST_INT + (%d)]", 2101 depth, (int) p->u.intval); 2102 break; 2103 2104 case DT_veclen_ge: 2105 printf ("XVECLEN (x%d, 0) >= %d", depth, p->u.veclen); 2106 break; 2107 2108 case DT_dup: 2109 printf ("rtx_equal_p (x%d, operands[%d])", depth, p->u.dup); 2110 break; 2111 2112 case DT_pred: 2113 printf ("%s (x%d, %smode)", p->u.pred.name, depth, 2114 GET_MODE_NAME (p->u.pred.mode)); 2115 break; 2116 2117 case DT_c_test: 2118 print_c_condition (p->u.c_test); 2119 break; 2120 2121 case DT_accept_insn: 2122 gcc_assert (subroutine_type == RECOG); 2123 gcc_assert (p->u.insn.num_clobbers_to_add); 2124 printf ("pnum_clobbers != NULL"); 2125 break; 2126 2127 default: 2128 gcc_unreachable (); 2129 } 2130} 2131 2132/* Emit code for one action. The previous tests have succeeded; 2133 TEST is the last of the chain. In the normal case we simply 2134 perform a state change. For the `accept' tests we must do more work. */ 2135 2136static void 2137write_action (struct decision *p, struct decision_test *test, 2138 int depth, int uncond, struct decision *success, 2139 enum routine_type subroutine_type) 2140{ 2141 const char *indent; 2142 int want_close = 0; 2143 2144 if (uncond) 2145 indent = " "; 2146 else if (test->type == DT_accept_op || test->type == DT_accept_insn) 2147 { 2148 fputs (" {\n", stdout); 2149 indent = " "; 2150 want_close = 1; 2151 } 2152 else 2153 indent = " "; 2154 2155 if (test->type == DT_accept_op) 2156 { 2157 printf("%soperands[%d] = x%d;\n", indent, test->u.opno, depth); 2158 2159 /* Only allow DT_accept_insn to follow. */ 2160 if (test->next) 2161 { 2162 test = test->next; 2163 gcc_assert (test->type == DT_accept_insn); 2164 } 2165 } 2166 2167 /* Sanity check that we're now at the end of the list of tests. */ 2168 gcc_assert (!test->next); 2169 2170 if (test->type == DT_accept_insn) 2171 { 2172 switch (subroutine_type) 2173 { 2174 case RECOG: 2175 if (test->u.insn.num_clobbers_to_add != 0) 2176 printf ("%s*pnum_clobbers = %d;\n", 2177 indent, test->u.insn.num_clobbers_to_add); 2178 printf ("%sreturn %d; /* %s */\n", indent, 2179 test->u.insn.code_number, 2180 get_insn_name (test->u.insn.code_number)); 2181 break; 2182 2183 case SPLIT: 2184 printf ("%sreturn gen_split_%d (insn, operands);\n", 2185 indent, test->u.insn.code_number); 2186 break; 2187 2188 case PEEPHOLE2: 2189 { 2190 int match_len = 0, i; 2191 2192 for (i = strlen (p->position) - 1; i >= 0; --i) 2193 if (ISUPPER (p->position[i])) 2194 { 2195 match_len = p->position[i] - 'A'; 2196 break; 2197 } 2198 printf ("%s*_pmatch_len = %d;\n", indent, match_len); 2199 printf ("%stem = gen_peephole2_%d (insn, operands);\n", 2200 indent, test->u.insn.code_number); 2201 printf ("%sif (tem != 0)\n%s return tem;\n", indent, indent); 2202 } 2203 break; 2204 2205 default: 2206 gcc_unreachable (); 2207 } 2208 } 2209 else 2210 { 2211 printf("%sgoto L%d;\n", indent, success->number); 2212 success->need_label = 1; 2213 } 2214 2215 if (want_close) 2216 fputs (" }\n", stdout); 2217} 2218 2219/* Return 1 if the test is always true and has no fallthru path. Return -1 2220 if the test does have a fallthru path, but requires that the condition be 2221 terminated. Otherwise return 0 for a normal test. */ 2222/* ??? is_unconditional is a stupid name for a tri-state function. */ 2223 2224static int 2225is_unconditional (struct decision_test *t, enum routine_type subroutine_type) 2226{ 2227 if (t->type == DT_accept_op) 2228 return 1; 2229 2230 if (t->type == DT_accept_insn) 2231 { 2232 switch (subroutine_type) 2233 { 2234 case RECOG: 2235 return (t->u.insn.num_clobbers_to_add == 0); 2236 case SPLIT: 2237 return 1; 2238 case PEEPHOLE2: 2239 return -1; 2240 default: 2241 gcc_unreachable (); 2242 } 2243 } 2244 2245 return 0; 2246} 2247 2248/* Emit code for one node -- the conditional and the accompanying action. 2249 Return true if there is no fallthru path. */ 2250 2251static int 2252write_node (struct decision *p, int depth, 2253 enum routine_type subroutine_type) 2254{ 2255 struct decision_test *test, *last_test; 2256 int uncond; 2257 2258 /* Scan the tests and simplify comparisons against small 2259 constants. */ 2260 for (test = p->tests; test; test = test->next) 2261 { 2262 if (test->type == DT_code 2263 && test->u.code == CONST_INT 2264 && test->next 2265 && test->next->type == DT_elt_zero_wide_safe 2266 && -MAX_SAVED_CONST_INT <= test->next->u.intval 2267 && test->next->u.intval <= MAX_SAVED_CONST_INT) 2268 { 2269 test->type = DT_const_int; 2270 test->u.intval = test->next->u.intval; 2271 test->next = test->next->next; 2272 } 2273 } 2274 2275 last_test = test = p->tests; 2276 uncond = is_unconditional (test, subroutine_type); 2277 if (uncond == 0) 2278 { 2279 printf (" if ("); 2280 write_cond (test, depth, subroutine_type); 2281 2282 while ((test = test->next) != NULL) 2283 { 2284 last_test = test; 2285 if (is_unconditional (test, subroutine_type)) 2286 break; 2287 2288 printf ("\n && "); 2289 write_cond (test, depth, subroutine_type); 2290 } 2291 2292 printf (")\n"); 2293 } 2294 2295 write_action (p, last_test, depth, uncond, p->success.first, subroutine_type); 2296 2297 return uncond > 0; 2298} 2299 2300/* Emit code for all of the sibling nodes of HEAD. */ 2301 2302static void 2303write_tree_1 (struct decision_head *head, int depth, 2304 enum routine_type subroutine_type) 2305{ 2306 struct decision *p, *next; 2307 int uncond = 0; 2308 2309 for (p = head->first; p ; p = next) 2310 { 2311 /* The label for the first element was printed in write_tree. */ 2312 if (p != head->first && p->need_label) 2313 OUTPUT_LABEL (" ", p->number); 2314 2315 /* Attempt to write a switch statement for a whole sequence. */ 2316 next = write_switch (p, depth); 2317 if (p != next) 2318 uncond = 0; 2319 else 2320 { 2321 /* Failed -- fall back and write one node. */ 2322 uncond = write_node (p, depth, subroutine_type); 2323 next = p->next; 2324 } 2325 } 2326 2327 /* Finished with this chain. Close a fallthru path by branching 2328 to the afterward node. */ 2329 if (! uncond) 2330 write_afterward (head->last, head->last->afterward, " "); 2331} 2332 2333/* Write out the decision tree starting at HEAD. PREVPOS is the 2334 position at the node that branched to this node. */ 2335 2336static void 2337write_tree (struct decision_head *head, const char *prevpos, 2338 enum routine_type type, int initial) 2339{ 2340 struct decision *p = head->first; 2341 2342 putchar ('\n'); 2343 if (p->need_label) 2344 OUTPUT_LABEL (" ", p->number); 2345 2346 if (! initial && p->subroutine_number > 0) 2347 { 2348 static const char * const name_prefix[] = { 2349 "recog", "split", "peephole2" 2350 }; 2351 2352 static const char * const call_suffix[] = { 2353 ", pnum_clobbers", "", ", _pmatch_len" 2354 }; 2355 2356 /* This node has been broken out into a separate subroutine. 2357 Call it, test the result, and branch accordingly. */ 2358 2359 if (p->afterward) 2360 { 2361 printf (" tem = %s_%d (x0, insn%s);\n", 2362 name_prefix[type], p->subroutine_number, call_suffix[type]); 2363 if (IS_SPLIT (type)) 2364 printf (" if (tem != 0)\n return tem;\n"); 2365 else 2366 printf (" if (tem >= 0)\n return tem;\n"); 2367 2368 change_state (p->position, p->afterward->position, " "); 2369 printf (" goto L%d;\n", p->afterward->number); 2370 } 2371 else 2372 { 2373 printf (" return %s_%d (x0, insn%s);\n", 2374 name_prefix[type], p->subroutine_number, call_suffix[type]); 2375 } 2376 } 2377 else 2378 { 2379 int depth = strlen (p->position); 2380 2381 change_state (prevpos, p->position, " "); 2382 write_tree_1 (head, depth, type); 2383 2384 for (p = head->first; p; p = p->next) 2385 if (p->success.first) 2386 write_tree (&p->success, p->position, type, 0); 2387 } 2388} 2389 2390/* Write out a subroutine of type TYPE to do comparisons starting at 2391 node TREE. */ 2392 2393static void 2394write_subroutine (struct decision_head *head, enum routine_type type) 2395{ 2396 int subfunction = head->first ? head->first->subroutine_number : 0; 2397 const char *s_or_e; 2398 char extension[32]; 2399 int i; 2400 2401 s_or_e = subfunction ? "static " : ""; 2402 2403 if (subfunction) 2404 sprintf (extension, "_%d", subfunction); 2405 else if (type == RECOG) 2406 extension[0] = '\0'; 2407 else 2408 strcpy (extension, "_insns"); 2409 2410 switch (type) 2411 { 2412 case RECOG: 2413 printf ("%sint\n\ 2414recog%s (rtx x0 ATTRIBUTE_UNUSED,\n\trtx insn ATTRIBUTE_UNUSED,\n\tint *pnum_clobbers ATTRIBUTE_UNUSED)\n", s_or_e, extension); 2415 break; 2416 case SPLIT: 2417 printf ("%srtx\n\ 2418split%s (rtx x0 ATTRIBUTE_UNUSED, rtx insn ATTRIBUTE_UNUSED)\n", 2419 s_or_e, extension); 2420 break; 2421 case PEEPHOLE2: 2422 printf ("%srtx\n\ 2423peephole2%s (rtx x0 ATTRIBUTE_UNUSED,\n\trtx insn ATTRIBUTE_UNUSED,\n\tint *_pmatch_len ATTRIBUTE_UNUSED)\n", 2424 s_or_e, extension); 2425 break; 2426 } 2427 2428 printf ("{\n rtx * const operands ATTRIBUTE_UNUSED = &recog_data.operand[0];\n"); 2429 for (i = 1; i <= max_depth; i++) 2430 printf (" rtx x%d ATTRIBUTE_UNUSED;\n", i); 2431 2432 printf (" %s tem ATTRIBUTE_UNUSED;\n", IS_SPLIT (type) ? "rtx" : "int"); 2433 2434 if (!subfunction) 2435 printf (" recog_data.insn = NULL_RTX;\n"); 2436 2437 if (head->first) 2438 write_tree (head, "", type, 1); 2439 else 2440 printf (" goto ret0;\n"); 2441 2442 printf (" ret0:\n return %d;\n}\n\n", IS_SPLIT (type) ? 0 : -1); 2443} 2444 2445/* In break_out_subroutines, we discovered the boundaries for the 2446 subroutines, but did not write them out. Do so now. */ 2447 2448static void 2449write_subroutines (struct decision_head *head, enum routine_type type) 2450{ 2451 struct decision *p; 2452 2453 for (p = head->first; p ; p = p->next) 2454 if (p->success.first) 2455 write_subroutines (&p->success, type); 2456 2457 if (head->first->subroutine_number > 0) 2458 write_subroutine (head, type); 2459} 2460 2461/* Begin the output file. */ 2462 2463static void 2464write_header (void) 2465{ 2466 puts ("\ 2467/* Generated automatically by the program `genrecog' from the target\n\ 2468 machine description file. */\n\ 2469\n\ 2470#include \"config.h\"\n\ 2471#include \"system.h\"\n\ 2472#include \"coretypes.h\"\n\ 2473#include \"tm.h\"\n\ 2474#include \"rtl.h\"\n\ 2475#include \"tm_p.h\"\n\ 2476#include \"function.h\"\n\ 2477#include \"insn-config.h\"\n\ 2478#include \"recog.h\"\n\ 2479#include \"real.h\"\n\ 2480#include \"output.h\"\n\ 2481#include \"flags.h\"\n\ 2482#include \"hard-reg-set.h\"\n\ 2483#include \"resource.h\"\n\ 2484#include \"toplev.h\"\n\ 2485#include \"reload.h\"\n\ 2486#include \"regs.h\"\n\ 2487#include \"tm-constrs.h\"\n\ 2488\n"); 2489 2490 puts ("\n\ 2491/* `recog' contains a decision tree that recognizes whether the rtx\n\ 2492 X0 is a valid instruction.\n\ 2493\n\ 2494 recog returns -1 if the rtx is not valid. If the rtx is valid, recog\n\ 2495 returns a nonnegative number which is the insn code number for the\n\ 2496 pattern that matched. This is the same as the order in the machine\n\ 2497 description of the entry that matched. This number can be used as an\n\ 2498 index into `insn_data' and other tables.\n"); 2499 puts ("\ 2500 The third argument to recog is an optional pointer to an int. If\n\ 2501 present, recog will accept a pattern if it matches except for missing\n\ 2502 CLOBBER expressions at the end. In that case, the value pointed to by\n\ 2503 the optional pointer will be set to the number of CLOBBERs that need\n\ 2504 to be added (it should be initialized to zero by the caller). If it"); 2505 puts ("\ 2506 is set nonzero, the caller should allocate a PARALLEL of the\n\ 2507 appropriate size, copy the initial entries, and call add_clobbers\n\ 2508 (found in insn-emit.c) to fill in the CLOBBERs.\n\ 2509"); 2510 2511 puts ("\n\ 2512 The function split_insns returns 0 if the rtl could not\n\ 2513 be split or the split rtl as an INSN list if it can be.\n\ 2514\n\ 2515 The function peephole2_insns returns 0 if the rtl could not\n\ 2516 be matched. If there was a match, the new rtl is returned in an INSN list,\n\ 2517 and LAST_INSN will point to the last recognized insn in the old sequence.\n\ 2518*/\n\n"); 2519} 2520 2521 2522/* Construct and return a sequence of decisions 2523 that will recognize INSN. 2524 2525 TYPE says what type of routine we are recognizing (RECOG or SPLIT). */ 2526 2527static struct decision_head 2528make_insn_sequence (rtx insn, enum routine_type type) 2529{ 2530 rtx x; 2531 const char *c_test = XSTR (insn, type == RECOG ? 2 : 1); 2532 int truth = maybe_eval_c_test (c_test); 2533 struct decision *last; 2534 struct decision_test *test, **place; 2535 struct decision_head head; 2536 char c_test_pos[2]; 2537 2538 /* We should never see an insn whose C test is false at compile time. */ 2539 gcc_assert (truth); 2540 2541 c_test_pos[0] = '\0'; 2542 if (type == PEEPHOLE2) 2543 { 2544 int i, j; 2545 2546 /* peephole2 gets special treatment: 2547 - X always gets an outer parallel even if it's only one entry 2548 - we remove all traces of outer-level match_scratch and match_dup 2549 expressions here. */ 2550 x = rtx_alloc (PARALLEL); 2551 PUT_MODE (x, VOIDmode); 2552 XVEC (x, 0) = rtvec_alloc (XVECLEN (insn, 0)); 2553 for (i = j = 0; i < XVECLEN (insn, 0); i++) 2554 { 2555 rtx tmp = XVECEXP (insn, 0, i); 2556 if (GET_CODE (tmp) != MATCH_SCRATCH && GET_CODE (tmp) != MATCH_DUP) 2557 { 2558 XVECEXP (x, 0, j) = tmp; 2559 j++; 2560 } 2561 } 2562 XVECLEN (x, 0) = j; 2563 2564 c_test_pos[0] = 'A' + j - 1; 2565 c_test_pos[1] = '\0'; 2566 } 2567 else if (XVECLEN (insn, type == RECOG) == 1) 2568 x = XVECEXP (insn, type == RECOG, 0); 2569 else 2570 { 2571 x = rtx_alloc (PARALLEL); 2572 XVEC (x, 0) = XVEC (insn, type == RECOG); 2573 PUT_MODE (x, VOIDmode); 2574 } 2575 2576 validate_pattern (x, insn, NULL_RTX, 0); 2577 2578 memset(&head, 0, sizeof(head)); 2579 last = add_to_sequence (x, &head, "", type, 1); 2580 2581 /* Find the end of the test chain on the last node. */ 2582 for (test = last->tests; test->next; test = test->next) 2583 continue; 2584 place = &test->next; 2585 2586 /* Skip the C test if it's known to be true at compile time. */ 2587 if (truth == -1) 2588 { 2589 /* Need a new node if we have another test to add. */ 2590 if (test->type == DT_accept_op) 2591 { 2592 last = new_decision (c_test_pos, &last->success); 2593 place = &last->tests; 2594 } 2595 test = new_decision_test (DT_c_test, &place); 2596 test->u.c_test = c_test; 2597 } 2598 2599 test = new_decision_test (DT_accept_insn, &place); 2600 test->u.insn.code_number = next_insn_code; 2601 test->u.insn.lineno = pattern_lineno; 2602 test->u.insn.num_clobbers_to_add = 0; 2603 2604 switch (type) 2605 { 2606 case RECOG: 2607 /* If this is a DEFINE_INSN and X is a PARALLEL, see if it ends 2608 with a group of CLOBBERs of (hard) registers or MATCH_SCRATCHes. 2609 If so, set up to recognize the pattern without these CLOBBERs. */ 2610 2611 if (GET_CODE (x) == PARALLEL) 2612 { 2613 int i; 2614 2615 /* Find the last non-clobber in the parallel. */ 2616 for (i = XVECLEN (x, 0); i > 0; i--) 2617 { 2618 rtx y = XVECEXP (x, 0, i - 1); 2619 if (GET_CODE (y) != CLOBBER 2620 || (!REG_P (XEXP (y, 0)) 2621 && GET_CODE (XEXP (y, 0)) != MATCH_SCRATCH)) 2622 break; 2623 } 2624 2625 if (i != XVECLEN (x, 0)) 2626 { 2627 rtx new_rtx; 2628 struct decision_head clobber_head; 2629 2630 /* Build a similar insn without the clobbers. */ 2631 if (i == 1) 2632 new_rtx = XVECEXP (x, 0, 0); 2633 else 2634 { 2635 int j; 2636 2637 new_rtx = rtx_alloc (PARALLEL); 2638 XVEC (new_rtx, 0) = rtvec_alloc (i); 2639 for (j = i - 1; j >= 0; j--) 2640 XVECEXP (new_rtx, 0, j) = XVECEXP (x, 0, j); 2641 } 2642 2643 /* Recognize it. */ 2644 memset (&clobber_head, 0, sizeof(clobber_head)); 2645 last = add_to_sequence (new_rtx, &clobber_head, "", type, 1); 2646 2647 /* Find the end of the test chain on the last node. */ 2648 for (test = last->tests; test->next; test = test->next) 2649 continue; 2650 2651 /* We definitely have a new test to add -- create a new 2652 node if needed. */ 2653 place = &test->next; 2654 if (test->type == DT_accept_op) 2655 { 2656 last = new_decision ("", &last->success); 2657 place = &last->tests; 2658 } 2659 2660 /* Skip the C test if it's known to be true at compile 2661 time. */ 2662 if (truth == -1) 2663 { 2664 test = new_decision_test (DT_c_test, &place); 2665 test->u.c_test = c_test; 2666 } 2667 2668 test = new_decision_test (DT_accept_insn, &place); 2669 test->u.insn.code_number = next_insn_code; 2670 test->u.insn.lineno = pattern_lineno; 2671 test->u.insn.num_clobbers_to_add = XVECLEN (x, 0) - i; 2672 2673 merge_trees (&head, &clobber_head); 2674 } 2675 } 2676 break; 2677 2678 case SPLIT: 2679 /* Define the subroutine we will call below and emit in genemit. */ 2680 printf ("extern rtx gen_split_%d (rtx, rtx *);\n", next_insn_code); 2681 break; 2682 2683 case PEEPHOLE2: 2684 /* Define the subroutine we will call below and emit in genemit. */ 2685 printf ("extern rtx gen_peephole2_%d (rtx, rtx *);\n", 2686 next_insn_code); 2687 break; 2688 } 2689 2690 return head; 2691} 2692 2693static void 2694process_tree (struct decision_head *head, enum routine_type subroutine_type) 2695{ 2696 if (head->first == NULL) 2697 { 2698 /* We can elide peephole2_insns, but not recog or split_insns. */ 2699 if (subroutine_type == PEEPHOLE2) 2700 return; 2701 } 2702 else 2703 { 2704 factor_tests (head); 2705 2706 next_subroutine_number = 0; 2707 break_out_subroutines (head, 1); 2708 find_afterward (head, NULL); 2709 2710 /* We run this after find_afterward, because find_afterward needs 2711 the redundant DT_mode tests on predicates to determine whether 2712 two tests can both be true or not. */ 2713 simplify_tests(head); 2714 2715 write_subroutines (head, subroutine_type); 2716 } 2717 2718 write_subroutine (head, subroutine_type); 2719} 2720 2721extern int main (int, char **); 2722 2723int 2724main (int argc, char **argv) 2725{ 2726 rtx desc; 2727 struct decision_head recog_tree, split_tree, peephole2_tree, h; 2728 2729 progname = "genrecog"; 2730 2731 memset (&recog_tree, 0, sizeof recog_tree); 2732 memset (&split_tree, 0, sizeof split_tree); 2733 memset (&peephole2_tree, 0, sizeof peephole2_tree); 2734 2735 if (init_md_reader_args (argc, argv) != SUCCESS_EXIT_CODE) 2736 return (FATAL_EXIT_CODE); 2737 2738 next_insn_code = 0; 2739 2740 write_header (); 2741 2742 /* Read the machine description. */ 2743 2744 while (1) 2745 { 2746 desc = read_md_rtx (&pattern_lineno, &next_insn_code); 2747 if (desc == NULL) 2748 break; 2749 2750 switch (GET_CODE (desc)) 2751 { 2752 case DEFINE_PREDICATE: 2753 case DEFINE_SPECIAL_PREDICATE: 2754 process_define_predicate (desc); 2755 break; 2756 2757 case DEFINE_INSN: 2758 h = make_insn_sequence (desc, RECOG); 2759 merge_trees (&recog_tree, &h); 2760 break; 2761 2762 case DEFINE_SPLIT: 2763 h = make_insn_sequence (desc, SPLIT); 2764 merge_trees (&split_tree, &h); 2765 break; 2766 2767 case DEFINE_PEEPHOLE2: 2768 h = make_insn_sequence (desc, PEEPHOLE2); 2769 merge_trees (&peephole2_tree, &h); 2770 2771 default: 2772 /* do nothing */; 2773 } 2774 } 2775 2776 if (error_count || have_error) 2777 return FATAL_EXIT_CODE; 2778 2779 puts ("\n\n"); 2780 2781 process_tree (&recog_tree, RECOG); 2782 process_tree (&split_tree, SPLIT); 2783 process_tree (&peephole2_tree, PEEPHOLE2); 2784 2785 fflush (stdout); 2786 return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE); 2787} 2788 2789static void 2790debug_decision_2 (struct decision_test *test) 2791{ 2792 switch (test->type) 2793 { 2794 case DT_num_insns: 2795 fprintf (stderr, "num_insns=%d", test->u.num_insns); 2796 break; 2797 case DT_mode: 2798 fprintf (stderr, "mode=%s", GET_MODE_NAME (test->u.mode)); 2799 break; 2800 case DT_code: 2801 fprintf (stderr, "code=%s", GET_RTX_NAME (test->u.code)); 2802 break; 2803 case DT_veclen: 2804 fprintf (stderr, "veclen=%d", test->u.veclen); 2805 break; 2806 case DT_elt_zero_int: 2807 fprintf (stderr, "elt0_i=%d", (int) test->u.intval); 2808 break; 2809 case DT_elt_one_int: 2810 fprintf (stderr, "elt1_i=%d", (int) test->u.intval); 2811 break; 2812 case DT_elt_zero_wide: 2813 fprintf (stderr, "elt0_w=" HOST_WIDE_INT_PRINT_DEC, test->u.intval); 2814 break; 2815 case DT_elt_zero_wide_safe: 2816 fprintf (stderr, "elt0_ws=" HOST_WIDE_INT_PRINT_DEC, test->u.intval); 2817 break; 2818 case DT_veclen_ge: 2819 fprintf (stderr, "veclen>=%d", test->u.veclen); 2820 break; 2821 case DT_dup: 2822 fprintf (stderr, "dup=%d", test->u.dup); 2823 break; 2824 case DT_pred: 2825 fprintf (stderr, "pred=(%s,%s)", 2826 test->u.pred.name, GET_MODE_NAME(test->u.pred.mode)); 2827 break; 2828 case DT_c_test: 2829 { 2830 char sub[16+4]; 2831 strncpy (sub, test->u.c_test, sizeof(sub)); 2832 memcpy (sub+16, "...", 4); 2833 fprintf (stderr, "c_test=\"%s\"", sub); 2834 } 2835 break; 2836 case DT_accept_op: 2837 fprintf (stderr, "A_op=%d", test->u.opno); 2838 break; 2839 case DT_accept_insn: 2840 fprintf (stderr, "A_insn=(%d,%d)", 2841 test->u.insn.code_number, test->u.insn.num_clobbers_to_add); 2842 break; 2843 2844 default: 2845 gcc_unreachable (); 2846 } 2847} 2848 2849static void 2850debug_decision_1 (struct decision *d, int indent) 2851{ 2852 int i; 2853 struct decision_test *test; 2854 2855 if (d == NULL) 2856 { 2857 for (i = 0; i < indent; ++i) 2858 putc (' ', stderr); 2859 fputs ("(nil)\n", stderr); 2860 return; 2861 } 2862 2863 for (i = 0; i < indent; ++i) 2864 putc (' ', stderr); 2865 2866 putc ('{', stderr); 2867 test = d->tests; 2868 if (test) 2869 { 2870 debug_decision_2 (test); 2871 while ((test = test->next) != NULL) 2872 { 2873 fputs (" + ", stderr); 2874 debug_decision_2 (test); 2875 } 2876 } 2877 fprintf (stderr, "} %d n %d a %d\n", d->number, 2878 (d->next ? d->next->number : -1), 2879 (d->afterward ? d->afterward->number : -1)); 2880} 2881 2882static void 2883debug_decision_0 (struct decision *d, int indent, int maxdepth) 2884{ 2885 struct decision *n; 2886 int i; 2887 2888 if (maxdepth < 0) 2889 return; 2890 if (d == NULL) 2891 { 2892 for (i = 0; i < indent; ++i) 2893 putc (' ', stderr); 2894 fputs ("(nil)\n", stderr); 2895 return; 2896 } 2897 2898 debug_decision_1 (d, indent); 2899 for (n = d->success.first; n ; n = n->next) 2900 debug_decision_0 (n, indent + 2, maxdepth - 1); 2901} 2902 2903void 2904debug_decision (struct decision *d) 2905{ 2906 debug_decision_0 (d, 0, 1000000); 2907} 2908 2909void 2910debug_decision_list (struct decision *d) 2911{ 2912 while (d) 2913 { 2914 debug_decision_0 (d, 0, 0); 2915 d = d->next; 2916 } 2917} 2918