1 /* 2 * Copyright (c) 1998, 2019, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 // FORMS.CPP - Definitions for ADL Parser Forms Classes 26 #include "adlc.hpp" 27 28 //==============================Instructions=================================== 29 //------------------------------InstructForm----------------------------------- 30 InstructForm::InstructForm(const char *id, bool ideal_only) 31 : _ident(id), _ideal_only(ideal_only), 32 _localNames(cmpstr, hashstr, Form::arena), 33 _effects(cmpstr, hashstr, Form::arena), 34 _is_mach_constant(false), 35 _needs_constant_base(false), 36 _has_call(false) 37 { 38 _ftype = Form::INS; 39 40 _matrule = NULL; 41 _insencode = NULL; 42 _constant = NULL; 43 _is_postalloc_expand = false; 44 _opcode = NULL; 45 _size = NULL; 46 _attribs = NULL; 47 _predicate = NULL; 48 _exprule = NULL; 49 _rewrule = NULL; 50 _format = NULL; 51 _peephole = NULL; 52 _ins_pipe = NULL; 53 _uniq_idx = NULL; 54 _num_uniq = 0; 55 _cisc_spill_operand = Not_cisc_spillable;// Which operand may cisc-spill 56 _cisc_spill_alternate = NULL; // possible cisc replacement 57 _cisc_reg_mask_name = NULL; 58 _is_cisc_alternate = false; 59 _is_short_branch = false; 60 _short_branch_form = NULL; 61 _alignment = 1; 62 } 63 64 InstructForm::InstructForm(const char *id, InstructForm *instr, MatchRule *rule) 65 : _ident(id), _ideal_only(false), 66 _localNames(instr->_localNames), 67 _effects(instr->_effects), 68 _is_mach_constant(false), 69 _needs_constant_base(false), 70 _has_call(false) 71 { 72 _ftype = Form::INS; 73 74 _matrule = rule; 75 _insencode = instr->_insencode; 76 _constant = instr->_constant; 77 _is_postalloc_expand = instr->_is_postalloc_expand; 78 _opcode = instr->_opcode; 79 _size = instr->_size; 80 _attribs = instr->_attribs; 81 _predicate = instr->_predicate; 82 _exprule = instr->_exprule; 83 _rewrule = instr->_rewrule; 84 _format = instr->_format; 85 _peephole = instr->_peephole; 86 _ins_pipe = instr->_ins_pipe; 87 _uniq_idx = instr->_uniq_idx; 88 _num_uniq = instr->_num_uniq; 89 _cisc_spill_operand = Not_cisc_spillable; // Which operand may cisc-spill 90 _cisc_spill_alternate = NULL; // possible cisc replacement 91 _cisc_reg_mask_name = NULL; 92 _is_cisc_alternate = false; 93 _is_short_branch = false; 94 _short_branch_form = NULL; 95 _alignment = 1; 96 // Copy parameters 97 const char *name; 98 instr->_parameters.reset(); 99 for (; (name = instr->_parameters.iter()) != NULL;) 100 _parameters.addName(name); 101 } 102 103 InstructForm::~InstructForm() { 104 } 105 106 InstructForm *InstructForm::is_instruction() const { 107 return (InstructForm*)this; 108 } 109 110 bool InstructForm::ideal_only() const { 111 return _ideal_only; 112 } 113 114 bool InstructForm::sets_result() const { 115 return (_matrule != NULL && _matrule->sets_result()); 116 } 117 118 bool InstructForm::needs_projections() { 119 _components.reset(); 120 for( Component *comp; (comp = _components.iter()) != NULL; ) { 121 if (comp->isa(Component::KILL)) { 122 return true; 123 } 124 } 125 return false; 126 } 127 128 129 bool InstructForm::has_temps() { 130 if (_matrule) { 131 // Examine each component to see if it is a TEMP 132 _components.reset(); 133 // Skip the first component, if already handled as (SET dst (...)) 134 Component *comp = NULL; 135 if (sets_result()) comp = _components.iter(); 136 while ((comp = _components.iter()) != NULL) { 137 if (comp->isa(Component::TEMP)) { 138 return true; 139 } 140 } 141 } 142 143 return false; 144 } 145 146 uint InstructForm::num_defs_or_kills() { 147 uint defs_or_kills = 0; 148 149 _components.reset(); 150 for( Component *comp; (comp = _components.iter()) != NULL; ) { 151 if( comp->isa(Component::DEF) || comp->isa(Component::KILL) ) { 152 ++defs_or_kills; 153 } 154 } 155 156 return defs_or_kills; 157 } 158 159 // This instruction has an expand rule? 160 bool InstructForm::expands() const { 161 return ( _exprule != NULL ); 162 } 163 164 // This instruction has a late expand rule? 165 bool InstructForm::postalloc_expands() const { 166 return _is_postalloc_expand; 167 } 168 169 // This instruction has a peephole rule? 170 Peephole *InstructForm::peepholes() const { 171 return _peephole; 172 } 173 174 // This instruction has a peephole rule? 175 void InstructForm::append_peephole(Peephole *peephole) { 176 if( _peephole == NULL ) { 177 _peephole = peephole; 178 } else { 179 _peephole->append_peephole(peephole); 180 } 181 } 182 183 184 // ideal opcode enumeration 185 const char *InstructForm::ideal_Opcode( FormDict &globalNames ) const { 186 if( !_matrule ) return "Node"; // Something weird 187 // Chain rules do not really have ideal Opcodes; use their source 188 // operand ideal Opcode instead. 189 if( is_simple_chain_rule(globalNames) ) { 190 const char *src = _matrule->_rChild->_opType; 191 OperandForm *src_op = globalNames[src]->is_operand(); 192 assert( src_op, "Not operand class of chain rule" ); 193 if( !src_op->_matrule ) return "Node"; 194 return src_op->_matrule->_opType; 195 } 196 // Operand chain rules do not really have ideal Opcodes 197 if( _matrule->is_chain_rule(globalNames) ) 198 return "Node"; 199 return strcmp(_matrule->_opType,"Set") 200 ? _matrule->_opType 201 : _matrule->_rChild->_opType; 202 } 203 204 // Recursive check on all operands' match rules in my match rule 205 bool InstructForm::is_pinned(FormDict &globals) { 206 if ( ! _matrule) return false; 207 208 int index = 0; 209 if (_matrule->find_type("Goto", index)) return true; 210 if (_matrule->find_type("If", index)) return true; 211 if (_matrule->find_type("CountedLoopEnd",index)) return true; 212 if (_matrule->find_type("Return", index)) return true; 213 if (_matrule->find_type("Rethrow", index)) return true; 214 if (_matrule->find_type("TailCall", index)) return true; 215 if (_matrule->find_type("TailJump", index)) return true; 216 if (_matrule->find_type("Halt", index)) return true; 217 if (_matrule->find_type("Jump", index)) return true; 218 219 return is_parm(globals); 220 } 221 222 // Recursive check on all operands' match rules in my match rule 223 bool InstructForm::is_projection(FormDict &globals) { 224 if ( ! _matrule) return false; 225 226 int index = 0; 227 if (_matrule->find_type("Goto", index)) return true; 228 if (_matrule->find_type("Return", index)) return true; 229 if (_matrule->find_type("Rethrow", index)) return true; 230 if (_matrule->find_type("TailCall",index)) return true; 231 if (_matrule->find_type("TailJump",index)) return true; 232 if (_matrule->find_type("Halt", index)) return true; 233 234 return false; 235 } 236 237 // Recursive check on all operands' match rules in my match rule 238 bool InstructForm::is_parm(FormDict &globals) { 239 if ( ! _matrule) return false; 240 241 int index = 0; 242 if (_matrule->find_type("Parm",index)) return true; 243 244 return false; 245 } 246 247 bool InstructForm::is_ideal_negD() const { 248 return (_matrule && _matrule->_rChild && strcmp(_matrule->_rChild->_opType, "NegD") == 0); 249 } 250 251 // Return 'true' if this instruction matches an ideal 'Copy*' node 252 int InstructForm::is_ideal_copy() const { 253 return _matrule ? _matrule->is_ideal_copy() : 0; 254 } 255 256 // Return 'true' if this instruction is too complex to rematerialize. 257 int InstructForm::is_expensive() const { 258 // We can prove it is cheap if it has an empty encoding. 259 // This helps with platform-specific nops like ThreadLocal and RoundFloat. 260 if (is_empty_encoding()) 261 return 0; 262 263 if (is_tls_instruction()) 264 return 1; 265 266 if (_matrule == NULL) return 0; 267 268 return _matrule->is_expensive(); 269 } 270 271 // Has an empty encoding if _size is a constant zero or there 272 // are no ins_encode tokens. 273 int InstructForm::is_empty_encoding() const { 274 if (_insencode != NULL) { 275 _insencode->reset(); 276 if (_insencode->encode_class_iter() == NULL) { 277 return 1; 278 } 279 } 280 if (_size != NULL && strcmp(_size, "0") == 0) { 281 return 1; 282 } 283 return 0; 284 } 285 286 int InstructForm::is_tls_instruction() const { 287 if (_ident != NULL && 288 ( ! strcmp( _ident,"tlsLoadP") || 289 ! strncmp(_ident,"tlsLoadP_",9)) ) { 290 return 1; 291 } 292 293 if (_matrule != NULL && _insencode != NULL) { 294 const char* opType = _matrule->_opType; 295 if (strcmp(opType, "Set")==0) 296 opType = _matrule->_rChild->_opType; 297 if (strcmp(opType,"ThreadLocal")==0) { 298 fprintf(stderr, "Warning: ThreadLocal instruction %s should be named 'tlsLoadP_*'\n", 299 (_ident == NULL ? "NULL" : _ident)); 300 return 1; 301 } 302 } 303 304 return 0; 305 } 306 307 308 // Return 'true' if this instruction matches an ideal 'If' node 309 bool InstructForm::is_ideal_if() const { 310 if( _matrule == NULL ) return false; 311 312 return _matrule->is_ideal_if(); 313 } 314 315 // Return 'true' if this instruction matches an ideal 'FastLock' node 316 bool InstructForm::is_ideal_fastlock() const { 317 if( _matrule == NULL ) return false; 318 319 return _matrule->is_ideal_fastlock(); 320 } 321 322 // Return 'true' if this instruction matches an ideal 'MemBarXXX' node 323 bool InstructForm::is_ideal_membar() const { 324 if( _matrule == NULL ) return false; 325 326 return _matrule->is_ideal_membar(); 327 } 328 329 // Return 'true' if this instruction matches an ideal 'LoadPC' node 330 bool InstructForm::is_ideal_loadPC() const { 331 if( _matrule == NULL ) return false; 332 333 return _matrule->is_ideal_loadPC(); 334 } 335 336 // Return 'true' if this instruction matches an ideal 'Box' node 337 bool InstructForm::is_ideal_box() const { 338 if( _matrule == NULL ) return false; 339 340 return _matrule->is_ideal_box(); 341 } 342 343 // Return 'true' if this instruction matches an ideal 'Goto' node 344 bool InstructForm::is_ideal_goto() const { 345 if( _matrule == NULL ) return false; 346 347 return _matrule->is_ideal_goto(); 348 } 349 350 // Return 'true' if this instruction matches an ideal 'Jump' node 351 bool InstructForm::is_ideal_jump() const { 352 if( _matrule == NULL ) return false; 353 354 return _matrule->is_ideal_jump(); 355 } 356 357 // Return 'true' if instruction matches ideal 'If' | 'Goto' | 'CountedLoopEnd' 358 bool InstructForm::is_ideal_branch() const { 359 if( _matrule == NULL ) return false; 360 361 return _matrule->is_ideal_if() || _matrule->is_ideal_goto(); 362 } 363 364 365 // Return 'true' if this instruction matches an ideal 'Return' node 366 bool InstructForm::is_ideal_return() const { 367 if( _matrule == NULL ) return false; 368 369 // Check MatchRule to see if the first entry is the ideal "Return" node 370 int index = 0; 371 if (_matrule->find_type("Return",index)) return true; 372 if (_matrule->find_type("Rethrow",index)) return true; 373 if (_matrule->find_type("TailCall",index)) return true; 374 if (_matrule->find_type("TailJump",index)) return true; 375 376 return false; 377 } 378 379 // Return 'true' if this instruction matches an ideal 'Halt' node 380 bool InstructForm::is_ideal_halt() const { 381 int index = 0; 382 return _matrule && _matrule->find_type("Halt",index); 383 } 384 385 // Return 'true' if this instruction matches an ideal 'SafePoint' node 386 bool InstructForm::is_ideal_safepoint() const { 387 int index = 0; 388 return _matrule && _matrule->find_type("SafePoint",index); 389 } 390 391 // Return 'true' if this instruction matches an ideal 'Nop' node 392 bool InstructForm::is_ideal_nop() const { 393 return _ident && _ident[0] == 'N' && _ident[1] == 'o' && _ident[2] == 'p' && _ident[3] == '_'; 394 } 395 396 bool InstructForm::is_ideal_control() const { 397 if ( ! _matrule) return false; 398 399 return is_ideal_return() || is_ideal_branch() || _matrule->is_ideal_jump() || is_ideal_halt(); 400 } 401 402 // Return 'true' if this instruction matches an ideal 'Call' node 403 Form::CallType InstructForm::is_ideal_call() const { 404 if( _matrule == NULL ) return Form::invalid_type; 405 406 // Check MatchRule to see if the first entry is the ideal "Call" node 407 int idx = 0; 408 if(_matrule->find_type("CallStaticJava",idx)) return Form::JAVA_STATIC; 409 idx = 0; 410 if(_matrule->find_type("Lock",idx)) return Form::JAVA_STATIC; 411 idx = 0; 412 if(_matrule->find_type("Unlock",idx)) return Form::JAVA_STATIC; 413 idx = 0; 414 if(_matrule->find_type("CallDynamicJava",idx)) return Form::JAVA_DYNAMIC; 415 idx = 0; 416 if(_matrule->find_type("CallRuntime",idx)) return Form::JAVA_RUNTIME; 417 idx = 0; 418 if(_matrule->find_type("CallLeaf",idx)) return Form::JAVA_LEAF; 419 idx = 0; 420 if(_matrule->find_type("CallLeafNoFP",idx)) return Form::JAVA_LEAF; 421 idx = 0; 422 423 return Form::invalid_type; 424 } 425 426 // Return 'true' if this instruction matches an ideal 'Load?' node 427 Form::DataType InstructForm::is_ideal_load() const { 428 if( _matrule == NULL ) return Form::none; 429 430 return _matrule->is_ideal_load(); 431 } 432 433 // Return 'true' if this instruction matches an ideal 'LoadKlass' node 434 bool InstructForm::skip_antidep_check() const { 435 if( _matrule == NULL ) return false; 436 437 return _matrule->skip_antidep_check(); 438 } 439 440 // Return 'true' if this instruction matches an ideal 'Load?' node 441 Form::DataType InstructForm::is_ideal_store() const { 442 if( _matrule == NULL ) return Form::none; 443 444 return _matrule->is_ideal_store(); 445 } 446 447 // Return 'true' if this instruction matches an ideal vector node 448 bool InstructForm::is_vector() const { 449 if( _matrule == NULL ) return false; 450 451 return _matrule->is_vector(); 452 } 453 454 455 // Return the input register that must match the output register 456 // If this is not required, return 0 457 uint InstructForm::two_address(FormDict &globals) { 458 uint matching_input = 0; 459 if(_components.count() == 0) return 0; 460 461 _components.reset(); 462 Component *comp = _components.iter(); 463 // Check if there is a DEF 464 if( comp->isa(Component::DEF) ) { 465 // Check that this is a register 466 const char *def_type = comp->_type; 467 const Form *form = globals[def_type]; 468 OperandForm *op = form->is_operand(); 469 if( op ) { 470 if( op->constrained_reg_class() != NULL && 471 op->interface_type(globals) == Form::register_interface ) { 472 // Remember the local name for equality test later 473 const char *def_name = comp->_name; 474 // Check if a component has the same name and is a USE 475 do { 476 if( comp->isa(Component::USE) && strcmp(comp->_name,def_name)==0 ) { 477 return operand_position_format(def_name); 478 } 479 } while( (comp = _components.iter()) != NULL); 480 } 481 } 482 } 483 484 return 0; 485 } 486 487 488 // when chaining a constant to an instruction, returns 'true' and sets opType 489 Form::DataType InstructForm::is_chain_of_constant(FormDict &globals) { 490 const char *dummy = NULL; 491 const char *dummy2 = NULL; 492 return is_chain_of_constant(globals, dummy, dummy2); 493 } 494 Form::DataType InstructForm::is_chain_of_constant(FormDict &globals, 495 const char * &opTypeParam) { 496 const char *result = NULL; 497 498 return is_chain_of_constant(globals, opTypeParam, result); 499 } 500 501 Form::DataType InstructForm::is_chain_of_constant(FormDict &globals, 502 const char * &opTypeParam, const char * &resultParam) { 503 Form::DataType data_type = Form::none; 504 if ( ! _matrule) return data_type; 505 506 // !!!!! 507 // The source of the chain rule is 'position = 1' 508 uint position = 1; 509 const char *result = NULL; 510 const char *name = NULL; 511 const char *opType = NULL; 512 // Here base_operand is looking for an ideal type to be returned (opType). 513 if ( _matrule->is_chain_rule(globals) 514 && _matrule->base_operand(position, globals, result, name, opType) ) { 515 data_type = ideal_to_const_type(opType); 516 517 // if it isn't an ideal constant type, just return 518 if ( data_type == Form::none ) return data_type; 519 520 // Ideal constant types also adjust the opType parameter. 521 resultParam = result; 522 opTypeParam = opType; 523 return data_type; 524 } 525 526 return data_type; 527 } 528 529 // Check if a simple chain rule 530 bool InstructForm::is_simple_chain_rule(FormDict &globals) const { 531 if( _matrule && _matrule->sets_result() 532 && _matrule->_rChild->_lChild == NULL 533 && globals[_matrule->_rChild->_opType] 534 && globals[_matrule->_rChild->_opType]->is_opclass() ) { 535 return true; 536 } 537 return false; 538 } 539 540 // check for structural rematerialization 541 bool InstructForm::rematerialize(FormDict &globals, RegisterForm *registers ) { 542 bool rematerialize = false; 543 544 Form::DataType data_type = is_chain_of_constant(globals); 545 if( data_type != Form::none ) 546 rematerialize = true; 547 548 // Constants 549 if( _components.count() == 1 && _components[0]->is(Component::USE_DEF) ) 550 rematerialize = true; 551 552 // Pseudo-constants (values easily available to the runtime) 553 if (is_empty_encoding() && is_tls_instruction()) 554 rematerialize = true; 555 556 // 1-input, 1-output, such as copies or increments. 557 if( _components.count() == 2 && 558 _components[0]->is(Component::DEF) && 559 _components[1]->isa(Component::USE) ) 560 rematerialize = true; 561 562 // Check for an ideal 'Load?' and eliminate rematerialize option 563 if ( is_ideal_load() != Form::none || // Ideal load? Do not rematerialize 564 is_ideal_copy() != Form::none || // Ideal copy? Do not rematerialize 565 is_expensive() != Form::none) { // Expensive? Do not rematerialize 566 rematerialize = false; 567 } 568 569 // Always rematerialize the flags. They are more expensive to save & 570 // restore than to recompute (and possibly spill the compare's inputs). 571 if( _components.count() >= 1 ) { 572 Component *c = _components[0]; 573 const Form *form = globals[c->_type]; 574 OperandForm *opform = form->is_operand(); 575 if( opform ) { 576 // Avoid the special stack_slots register classes 577 const char *rc_name = opform->constrained_reg_class(); 578 if( rc_name ) { 579 if( strcmp(rc_name,"stack_slots") ) { 580 // Check for ideal_type of RegFlags 581 const char *type = opform->ideal_type( globals, registers ); 582 if( (type != NULL) && !strcmp(type, "RegFlags") ) 583 rematerialize = true; 584 } else 585 rematerialize = false; // Do not rematerialize things target stk 586 } 587 } 588 } 589 590 return rematerialize; 591 } 592 593 // loads from memory, so must check for anti-dependence 594 bool InstructForm::needs_anti_dependence_check(FormDict &globals) const { 595 if ( skip_antidep_check() ) return false; 596 597 // Machine independent loads must be checked for anti-dependences 598 if( is_ideal_load() != Form::none ) return true; 599 600 // !!!!! !!!!! !!!!! 601 // TEMPORARY 602 // if( is_simple_chain_rule(globals) ) return false; 603 604 // String.(compareTo/equals/indexOf) and Arrays.equals use many memorys edges, 605 // but writes none 606 if( _matrule && _matrule->_rChild && 607 ( strcmp(_matrule->_rChild->_opType,"StrComp" )==0 || 608 strcmp(_matrule->_rChild->_opType,"StrEquals" )==0 || 609 strcmp(_matrule->_rChild->_opType,"StrIndexOf" )==0 || 610 strcmp(_matrule->_rChild->_opType,"StrIndexOfChar" )==0 || 611 strcmp(_matrule->_rChild->_opType,"HasNegatives" )==0 || 612 strcmp(_matrule->_rChild->_opType,"AryEq" )==0 )) 613 return true; 614 615 // Check if instruction has a USE of a memory operand class, but no defs 616 bool USE_of_memory = false; 617 bool DEF_of_memory = false; 618 Component *comp = NULL; 619 ComponentList &components = (ComponentList &)_components; 620 621 components.reset(); 622 while( (comp = components.iter()) != NULL ) { 623 const Form *form = globals[comp->_type]; 624 if( !form ) continue; 625 OpClassForm *op = form->is_opclass(); 626 if( !op ) continue; 627 if( form->interface_type(globals) == Form::memory_interface ) { 628 if( comp->isa(Component::USE) ) USE_of_memory = true; 629 if( comp->isa(Component::DEF) ) { 630 OperandForm *oper = form->is_operand(); 631 if( oper && oper->is_user_name_for_sReg() ) { 632 // Stack slots are unaliased memory handled by allocator 633 oper = oper; // debug stopping point !!!!! 634 } else { 635 DEF_of_memory = true; 636 } 637 } 638 } 639 } 640 return (USE_of_memory && !DEF_of_memory); 641 } 642 643 644 int InstructForm::memory_operand(FormDict &globals) const { 645 // Machine independent loads must be checked for anti-dependences 646 // Check if instruction has a USE of a memory operand class, or a def. 647 int USE_of_memory = 0; 648 int DEF_of_memory = 0; 649 const char* last_memory_DEF = NULL; // to test DEF/USE pairing in asserts 650 const char* last_memory_USE = NULL; 651 Component *unique = NULL; 652 Component *comp = NULL; 653 ComponentList &components = (ComponentList &)_components; 654 655 components.reset(); 656 while( (comp = components.iter()) != NULL ) { 657 const Form *form = globals[comp->_type]; 658 if( !form ) continue; 659 OpClassForm *op = form->is_opclass(); 660 if( !op ) continue; 661 if( op->stack_slots_only(globals) ) continue; 662 if( form->interface_type(globals) == Form::memory_interface ) { 663 if( comp->isa(Component::DEF) ) { 664 last_memory_DEF = comp->_name; 665 DEF_of_memory++; 666 unique = comp; 667 } else if( comp->isa(Component::USE) ) { 668 if( last_memory_DEF != NULL ) { 669 assert(0 == strcmp(last_memory_DEF, comp->_name), "every memory DEF is followed by a USE of the same name"); 670 last_memory_DEF = NULL; 671 } 672 // Handles same memory being used multiple times in the case of BMI1 instructions. 673 if (last_memory_USE != NULL) { 674 if (strcmp(comp->_name, last_memory_USE) != 0) { 675 USE_of_memory++; 676 } 677 } else { 678 USE_of_memory++; 679 } 680 last_memory_USE = comp->_name; 681 682 if (DEF_of_memory == 0) // defs take precedence 683 unique = comp; 684 } else { 685 assert(last_memory_DEF == NULL, "unpaired memory DEF"); 686 } 687 } 688 } 689 assert(last_memory_DEF == NULL, "unpaired memory DEF"); 690 assert(USE_of_memory >= DEF_of_memory, "unpaired memory DEF"); 691 USE_of_memory -= DEF_of_memory; // treat paired DEF/USE as one occurrence 692 if( (USE_of_memory + DEF_of_memory) > 0 ) { 693 if( is_simple_chain_rule(globals) ) { 694 //fprintf(stderr, "Warning: chain rule is not really a memory user.\n"); 695 //((InstructForm*)this)->dump(); 696 // Preceding code prints nothing on sparc and these insns on intel: 697 // leaP8 leaP32 leaPIdxOff leaPIdxScale leaPIdxScaleOff leaP8 leaP32 698 // leaPIdxOff leaPIdxScale leaPIdxScaleOff 699 return NO_MEMORY_OPERAND; 700 } 701 702 if( DEF_of_memory == 1 ) { 703 assert(unique != NULL, ""); 704 if( USE_of_memory == 0 ) { 705 // unique def, no uses 706 } else { 707 // // unique def, some uses 708 // // must return bottom unless all uses match def 709 // unique = NULL; 710 #ifdef S390 711 // This case is important for move instructions on s390x. 712 // On other platforms (e.g. x86), all uses always match the def. 713 unique = NULL; 714 #endif 715 } 716 } else if( DEF_of_memory > 0 ) { 717 // multiple defs, don't care about uses 718 unique = NULL; 719 } else if( USE_of_memory == 1) { 720 // unique use, no defs 721 assert(unique != NULL, ""); 722 } else if( USE_of_memory > 0 ) { 723 // multiple uses, no defs 724 unique = NULL; 725 } else { 726 assert(false, "bad case analysis"); 727 } 728 // process the unique DEF or USE, if there is one 729 if( unique == NULL ) { 730 return MANY_MEMORY_OPERANDS; 731 } else { 732 int pos = components.operand_position(unique->_name); 733 if( unique->isa(Component::DEF) ) { 734 pos += 1; // get corresponding USE from DEF 735 } 736 assert(pos >= 1, "I was just looking at it!"); 737 return pos; 738 } 739 } 740 741 // missed the memory op?? 742 if( true ) { // %%% should not be necessary 743 if( is_ideal_store() != Form::none ) { 744 fprintf(stderr, "Warning: cannot find memory opnd in instr.\n"); 745 ((InstructForm*)this)->dump(); 746 // pretend it has multiple defs and uses 747 return MANY_MEMORY_OPERANDS; 748 } 749 if( is_ideal_load() != Form::none ) { 750 fprintf(stderr, "Warning: cannot find memory opnd in instr.\n"); 751 ((InstructForm*)this)->dump(); 752 // pretend it has multiple uses and no defs 753 return MANY_MEMORY_OPERANDS; 754 } 755 } 756 757 return NO_MEMORY_OPERAND; 758 } 759 760 // This instruction captures the machine-independent bottom_type 761 // Expected use is for pointer vs oop determination for LoadP 762 bool InstructForm::captures_bottom_type(FormDict &globals) const { 763 if (_matrule && _matrule->_rChild && 764 (!strcmp(_matrule->_rChild->_opType,"CastPP") || // new result type 765 !strcmp(_matrule->_rChild->_opType,"CastX2P") || // new result type 766 !strcmp(_matrule->_rChild->_opType,"DecodeN") || 767 !strcmp(_matrule->_rChild->_opType,"EncodeP") || 768 !strcmp(_matrule->_rChild->_opType,"DecodeNKlass") || 769 !strcmp(_matrule->_rChild->_opType,"EncodePKlass") || 770 !strcmp(_matrule->_rChild->_opType,"LoadN") || 771 !strcmp(_matrule->_rChild->_opType,"LoadNKlass") || 772 !strcmp(_matrule->_rChild->_opType,"CreateEx") || // type of exception 773 !strcmp(_matrule->_rChild->_opType,"CheckCastPP") || 774 !strcmp(_matrule->_rChild->_opType,"GetAndSetP") || 775 !strcmp(_matrule->_rChild->_opType,"GetAndSetN") || 776 #if INCLUDE_SHENANDOAHGC 777 !strcmp(_matrule->_rChild->_opType,"ShenandoahCompareAndExchangeP") || 778 !strcmp(_matrule->_rChild->_opType,"ShenandoahCompareAndExchangeN") || 779 #endif 780 !strcmp(_matrule->_rChild->_opType,"CompareAndExchangeP") || 781 !strcmp(_matrule->_rChild->_opType,"CompareAndExchangeN"))) return true; 782 else if ( is_ideal_load() == Form::idealP ) return true; 783 else if ( is_ideal_store() != Form::none ) return true; 784 785 if (needs_base_oop_edge(globals)) return true; 786 787 if (is_vector()) return true; 788 if (is_mach_constant()) return true; 789 790 return false; 791 } 792 793 794 // Access instr_cost attribute or return NULL. 795 const char* InstructForm::cost() { 796 for (Attribute* cur = _attribs; cur != NULL; cur = (Attribute*)cur->_next) { 797 if( strcmp(cur->_ident,AttributeForm::_ins_cost) == 0 ) { 798 return cur->_val; 799 } 800 } 801 return NULL; 802 } 803 804 // Return count of top-level operands. 805 uint InstructForm::num_opnds() { 806 int num_opnds = _components.num_operands(); 807 808 // Need special handling for matching some ideal nodes 809 // i.e. Matching a return node 810 /* 811 if( _matrule ) { 812 if( strcmp(_matrule->_opType,"Return" )==0 || 813 strcmp(_matrule->_opType,"Halt" )==0 ) 814 return 3; 815 } 816 */ 817 return num_opnds; 818 } 819 820 const char* InstructForm::opnd_ident(int idx) { 821 return _components.at(idx)->_name; 822 } 823 824 const char* InstructForm::unique_opnd_ident(uint idx) { 825 uint i; 826 for (i = 1; i < num_opnds(); ++i) { 827 if (unique_opnds_idx(i) == idx) { 828 break; 829 } 830 } 831 return (_components.at(i) != NULL) ? _components.at(i)->_name : ""; 832 } 833 834 // Return count of unmatched operands. 835 uint InstructForm::num_post_match_opnds() { 836 uint num_post_match_opnds = _components.count(); 837 uint num_match_opnds = _components.match_count(); 838 num_post_match_opnds = num_post_match_opnds - num_match_opnds; 839 840 return num_post_match_opnds; 841 } 842 843 // Return the number of leaves below this complex operand 844 uint InstructForm::num_consts(FormDict &globals) const { 845 if ( ! _matrule) return 0; 846 847 // This is a recursive invocation on all operands in the matchrule 848 return _matrule->num_consts(globals); 849 } 850 851 // Constants in match rule with specified type 852 uint InstructForm::num_consts(FormDict &globals, Form::DataType type) const { 853 if ( ! _matrule) return 0; 854 855 // This is a recursive invocation on all operands in the matchrule 856 return _matrule->num_consts(globals, type); 857 } 858 859 860 // Return the register class associated with 'leaf'. 861 const char *InstructForm::out_reg_class(FormDict &globals) { 862 assert( false, "InstructForm::out_reg_class(FormDict &globals); Not Implemented"); 863 864 return NULL; 865 } 866 867 868 869 // Lookup the starting position of inputs we are interested in wrt. ideal nodes 870 uint InstructForm::oper_input_base(FormDict &globals) { 871 if( !_matrule ) return 1; // Skip control for most nodes 872 873 // Need special handling for matching some ideal nodes 874 // i.e. Matching a return node 875 if( strcmp(_matrule->_opType,"Return" )==0 || 876 strcmp(_matrule->_opType,"Rethrow" )==0 || 877 strcmp(_matrule->_opType,"TailCall" )==0 || 878 strcmp(_matrule->_opType,"TailJump" )==0 || 879 strcmp(_matrule->_opType,"SafePoint" )==0 || 880 strcmp(_matrule->_opType,"Halt" )==0 ) 881 return AdlcVMDeps::Parms; // Skip the machine-state edges 882 883 if( _matrule->_rChild && 884 ( strcmp(_matrule->_rChild->_opType,"AryEq" )==0 || 885 strcmp(_matrule->_rChild->_opType,"StrComp" )==0 || 886 strcmp(_matrule->_rChild->_opType,"StrEquals" )==0 || 887 strcmp(_matrule->_rChild->_opType,"StrInflatedCopy" )==0 || 888 strcmp(_matrule->_rChild->_opType,"StrCompressedCopy" )==0 || 889 strcmp(_matrule->_rChild->_opType,"StrIndexOf")==0 || 890 strcmp(_matrule->_rChild->_opType,"StrIndexOfChar")==0 || 891 strcmp(_matrule->_rChild->_opType,"HasNegatives")==0 || 892 strcmp(_matrule->_rChild->_opType,"EncodeISOArray")==0)) { 893 // String.(compareTo/equals/indexOf) and Arrays.equals 894 // and sun.nio.cs.iso8859_1$Encoder.EncodeISOArray 895 // take 1 control and 1 memory edges. 896 // Also String.(compressedCopy/inflatedCopy). 897 return 2; 898 } 899 900 // Check for handling of 'Memory' input/edge in the ideal world. 901 // The AD file writer is shielded from knowledge of these edges. 902 int base = 1; // Skip control 903 base += _matrule->needs_ideal_memory_edge(globals); 904 905 // Also skip the base-oop value for uses of derived oops. 906 // The AD file writer is shielded from knowledge of these edges. 907 base += needs_base_oop_edge(globals); 908 909 return base; 910 } 911 912 // This function determines the order of the MachOper in _opnds[] 913 // by writing the operand names into the _components list. 914 // 915 // Implementation does not modify state of internal structures 916 void InstructForm::build_components() { 917 // Add top-level operands to the components 918 if (_matrule) _matrule->append_components(_localNames, _components); 919 920 // Add parameters that "do not appear in match rule". 921 bool has_temp = false; 922 const char *name; 923 const char *kill_name = NULL; 924 for (_parameters.reset(); (name = _parameters.iter()) != NULL;) { 925 OpClassForm *opForm = _localNames[name]->is_opclass(); 926 assert(opForm != NULL, "sanity"); 927 928 Effect* e = NULL; 929 { 930 const Form* form = _effects[name]; 931 e = form ? form->is_effect() : NULL; 932 } 933 934 if (e != NULL) { 935 has_temp |= e->is(Component::TEMP); 936 937 // KILLs must be declared after any TEMPs because TEMPs are real 938 // uses so their operand numbering must directly follow the real 939 // inputs from the match rule. Fixing the numbering seems 940 // complex so simply enforce the restriction during parse. 941 if (kill_name != NULL && 942 e->isa(Component::TEMP) && !e->isa(Component::DEF)) { 943 OpClassForm* kill = _localNames[kill_name]->is_opclass(); 944 assert(kill != NULL, "sanity"); 945 globalAD->syntax_err(_linenum, "%s: %s %s must be at the end of the argument list\n", 946 _ident, kill->_ident, kill_name); 947 } else if (e->isa(Component::KILL) && !e->isa(Component::USE)) { 948 kill_name = name; 949 } 950 } 951 952 const Component *component = _components.search(name); 953 if ( component == NULL ) { 954 if (e) { 955 _components.insert(name, opForm->_ident, e->_use_def, false); 956 component = _components.search(name); 957 if (component->isa(Component::USE) && !component->isa(Component::TEMP) && _matrule) { 958 const Form *form = globalAD->globalNames()[component->_type]; 959 assert( form, "component type must be a defined form"); 960 OperandForm *op = form->is_operand(); 961 if (op->_interface && op->_interface->is_RegInterface()) { 962 globalAD->syntax_err(_linenum, "%s: illegal USE of non-input: %s %s\n", 963 _ident, opForm->_ident, name); 964 } 965 } 966 } else { 967 // This would be a nice warning but it triggers in a few places in a benign way 968 // if (_matrule != NULL && !expands()) { 969 // globalAD->syntax_err(_linenum, "%s: %s %s not mentioned in effect or match rule\n", 970 // _ident, opForm->_ident, name); 971 // } 972 _components.insert(name, opForm->_ident, Component::INVALID, false); 973 } 974 } 975 else if (e) { 976 // Component was found in the list 977 // Check if there is a new effect that requires an extra component. 978 // This happens when adding 'USE' to a component that is not yet one. 979 if ((!component->isa( Component::USE) && ((e->_use_def & Component::USE) != 0))) { 980 if (component->isa(Component::USE) && _matrule) { 981 const Form *form = globalAD->globalNames()[component->_type]; 982 assert( form, "component type must be a defined form"); 983 OperandForm *op = form->is_operand(); 984 if (op->_interface && op->_interface->is_RegInterface()) { 985 globalAD->syntax_err(_linenum, "%s: illegal USE of non-input: %s %s\n", 986 _ident, opForm->_ident, name); 987 } 988 } 989 _components.insert(name, opForm->_ident, e->_use_def, false); 990 } else { 991 Component *comp = (Component*)component; 992 comp->promote_use_def_info(e->_use_def); 993 } 994 // Component positions are zero based. 995 int pos = _components.operand_position(name); 996 assert( ! (component->isa(Component::DEF) && (pos >= 1)), 997 "Component::DEF can only occur in the first position"); 998 } 999 } 1000 1001 // Resolving the interactions between expand rules and TEMPs would 1002 // be complex so simply disallow it. 1003 if (_matrule == NULL && has_temp) { 1004 globalAD->syntax_err(_linenum, "%s: TEMPs without match rule isn't supported\n", _ident); 1005 } 1006 1007 return; 1008 } 1009 1010 // Return zero-based position in component list; -1 if not in list. 1011 int InstructForm::operand_position(const char *name, int usedef) { 1012 return unique_opnds_idx(_components.operand_position(name, usedef, this)); 1013 } 1014 1015 int InstructForm::operand_position_format(const char *name) { 1016 return unique_opnds_idx(_components.operand_position_format(name, this)); 1017 } 1018 1019 // Return zero-based position in component list; -1 if not in list. 1020 int InstructForm::label_position() { 1021 return unique_opnds_idx(_components.label_position()); 1022 } 1023 1024 int InstructForm::method_position() { 1025 return unique_opnds_idx(_components.method_position()); 1026 } 1027 1028 // Return number of relocation entries needed for this instruction. 1029 uint InstructForm::reloc(FormDict &globals) { 1030 uint reloc_entries = 0; 1031 // Check for "Call" nodes 1032 if ( is_ideal_call() ) ++reloc_entries; 1033 if ( is_ideal_return() ) ++reloc_entries; 1034 if ( is_ideal_safepoint() ) ++reloc_entries; 1035 1036 1037 // Check if operands MAYBE oop pointers, by checking for ConP elements 1038 // Proceed through the leaves of the match-tree and check for ConPs 1039 if ( _matrule != NULL ) { 1040 uint position = 0; 1041 const char *result = NULL; 1042 const char *name = NULL; 1043 const char *opType = NULL; 1044 while (_matrule->base_operand(position, globals, result, name, opType)) { 1045 if ( strcmp(opType,"ConP") == 0 ) { 1046 #ifdef SPARC 1047 reloc_entries += 2; // 1 for sethi + 1 for setlo 1048 #else 1049 ++reloc_entries; 1050 #endif 1051 } 1052 ++position; 1053 } 1054 } 1055 1056 // Above is only a conservative estimate 1057 // because it did not check contents of operand classes. 1058 // !!!!! !!!!! 1059 // Add 1 to reloc info for each operand class in the component list. 1060 Component *comp; 1061 _components.reset(); 1062 while ( (comp = _components.iter()) != NULL ) { 1063 const Form *form = globals[comp->_type]; 1064 assert( form, "Did not find component's type in global names"); 1065 const OpClassForm *opc = form->is_opclass(); 1066 const OperandForm *oper = form->is_operand(); 1067 if ( opc && (oper == NULL) ) { 1068 ++reloc_entries; 1069 } else if ( oper ) { 1070 // floats and doubles loaded out of method's constant pool require reloc info 1071 Form::DataType type = oper->is_base_constant(globals); 1072 if ( (type == Form::idealF) || (type == Form::idealD) ) { 1073 ++reloc_entries; 1074 } 1075 } 1076 } 1077 1078 // Float and Double constants may come from the CodeBuffer table 1079 // and require relocatable addresses for access 1080 // !!!!! 1081 // Check for any component being an immediate float or double. 1082 Form::DataType data_type = is_chain_of_constant(globals); 1083 if( data_type==idealD || data_type==idealF ) { 1084 #ifdef SPARC 1085 // sparc required more relocation entries for floating constants 1086 // (expires 9/98) 1087 reloc_entries += 6; 1088 #else 1089 reloc_entries++; 1090 #endif 1091 } 1092 1093 return reloc_entries; 1094 } 1095 1096 // Utility function defined in archDesc.cpp 1097 extern bool is_def(int usedef); 1098 1099 // Return the result of reducing an instruction 1100 const char *InstructForm::reduce_result() { 1101 const char* result = "Universe"; // default 1102 _components.reset(); 1103 Component *comp = _components.iter(); 1104 if (comp != NULL && comp->isa(Component::DEF)) { 1105 result = comp->_type; 1106 // Override this if the rule is a store operation: 1107 if (_matrule && _matrule->_rChild && 1108 is_store_to_memory(_matrule->_rChild->_opType)) 1109 result = "Universe"; 1110 } 1111 return result; 1112 } 1113 1114 // Return the name of the operand on the right hand side of the binary match 1115 // Return NULL if there is no right hand side 1116 const char *InstructForm::reduce_right(FormDict &globals) const { 1117 if( _matrule == NULL ) return NULL; 1118 return _matrule->reduce_right(globals); 1119 } 1120 1121 // Similar for left 1122 const char *InstructForm::reduce_left(FormDict &globals) const { 1123 if( _matrule == NULL ) return NULL; 1124 return _matrule->reduce_left(globals); 1125 } 1126 1127 1128 // Base class for this instruction, MachNode except for calls 1129 const char *InstructForm::mach_base_class(FormDict &globals) const { 1130 if( is_ideal_call() == Form::JAVA_STATIC ) { 1131 return "MachCallStaticJavaNode"; 1132 } 1133 else if( is_ideal_call() == Form::JAVA_DYNAMIC ) { 1134 return "MachCallDynamicJavaNode"; 1135 } 1136 else if( is_ideal_call() == Form::JAVA_RUNTIME ) { 1137 return "MachCallRuntimeNode"; 1138 } 1139 else if( is_ideal_call() == Form::JAVA_LEAF ) { 1140 return "MachCallLeafNode"; 1141 } 1142 else if (is_ideal_return()) { 1143 return "MachReturnNode"; 1144 } 1145 else if (is_ideal_halt()) { 1146 return "MachHaltNode"; 1147 } 1148 else if (is_ideal_safepoint()) { 1149 return "MachSafePointNode"; 1150 } 1151 else if (is_ideal_if()) { 1152 return "MachIfNode"; 1153 } 1154 else if (is_ideal_goto()) { 1155 return "MachGotoNode"; 1156 } 1157 else if (is_ideal_fastlock()) { 1158 return "MachFastLockNode"; 1159 } 1160 else if (is_ideal_nop()) { 1161 return "MachNopNode"; 1162 } 1163 else if( is_ideal_membar()) { 1164 return "MachMemBarNode"; 1165 } 1166 else if (is_ideal_jump()) { 1167 return "MachJumpNode"; 1168 } 1169 else if (is_mach_constant()) { 1170 return "MachConstantNode"; 1171 } 1172 else if (captures_bottom_type(globals)) { 1173 return "MachTypeNode"; 1174 } else { 1175 return "MachNode"; 1176 } 1177 assert( false, "ShouldNotReachHere()"); 1178 return NULL; 1179 } 1180 1181 // Compare the instruction predicates for textual equality 1182 bool equivalent_predicates( const InstructForm *instr1, const InstructForm *instr2 ) { 1183 const Predicate *pred1 = instr1->_predicate; 1184 const Predicate *pred2 = instr2->_predicate; 1185 if( pred1 == NULL && pred2 == NULL ) { 1186 // no predicates means they are identical 1187 return true; 1188 } 1189 if( pred1 != NULL && pred2 != NULL ) { 1190 // compare the predicates 1191 if (ADLParser::equivalent_expressions(pred1->_pred, pred2->_pred)) { 1192 return true; 1193 } 1194 } 1195 1196 return false; 1197 } 1198 1199 // Check if this instruction can cisc-spill to 'alternate' 1200 bool InstructForm::cisc_spills_to(ArchDesc &AD, InstructForm *instr) { 1201 assert( _matrule != NULL && instr->_matrule != NULL, "must have match rules"); 1202 // Do not replace if a cisc-version has been found. 1203 if( cisc_spill_operand() != Not_cisc_spillable ) return false; 1204 1205 int cisc_spill_operand = Maybe_cisc_spillable; 1206 char *result = NULL; 1207 char *result2 = NULL; 1208 const char *op_name = NULL; 1209 const char *reg_type = NULL; 1210 FormDict &globals = AD.globalNames(); 1211 cisc_spill_operand = _matrule->matchrule_cisc_spill_match(globals, AD.get_registers(), instr->_matrule, op_name, reg_type); 1212 if( (cisc_spill_operand != Not_cisc_spillable) && (op_name != NULL) && equivalent_predicates(this, instr) ) { 1213 cisc_spill_operand = operand_position(op_name, Component::USE); 1214 int def_oper = operand_position(op_name, Component::DEF); 1215 if( def_oper == NameList::Not_in_list && instr->num_opnds() == num_opnds()) { 1216 // Do not support cisc-spilling for destination operands and 1217 // make sure they have the same number of operands. 1218 _cisc_spill_alternate = instr; 1219 instr->set_cisc_alternate(true); 1220 if( AD._cisc_spill_debug ) { 1221 fprintf(stderr, "Instruction %s cisc-spills-to %s\n", _ident, instr->_ident); 1222 fprintf(stderr, " using operand %s %s at index %d\n", reg_type, op_name, cisc_spill_operand); 1223 } 1224 // Record that a stack-version of the reg_mask is needed 1225 // !!!!! 1226 OperandForm *oper = (OperandForm*)(globals[reg_type]->is_operand()); 1227 assert( oper != NULL, "cisc-spilling non operand"); 1228 const char *reg_class_name = oper->constrained_reg_class(); 1229 AD.set_stack_or_reg(reg_class_name); 1230 const char *reg_mask_name = AD.reg_mask(*oper); 1231 set_cisc_reg_mask_name(reg_mask_name); 1232 const char *stack_or_reg_mask_name = AD.stack_or_reg_mask(*oper); 1233 } else { 1234 cisc_spill_operand = Not_cisc_spillable; 1235 } 1236 } else { 1237 cisc_spill_operand = Not_cisc_spillable; 1238 } 1239 1240 set_cisc_spill_operand(cisc_spill_operand); 1241 return (cisc_spill_operand != Not_cisc_spillable); 1242 } 1243 1244 // Check to see if this instruction can be replaced with the short branch 1245 // instruction `short-branch' 1246 bool InstructForm::check_branch_variant(ArchDesc &AD, InstructForm *short_branch) { 1247 if (_matrule != NULL && 1248 this != short_branch && // Don't match myself 1249 !is_short_branch() && // Don't match another short branch variant 1250 reduce_result() != NULL && 1251 strstr(_ident, "restoreMask") == NULL && // Don't match side effects 1252 strcmp(reduce_result(), short_branch->reduce_result()) == 0 && 1253 _matrule->equivalent(AD.globalNames(), short_branch->_matrule)) { 1254 // The instructions are equivalent. 1255 1256 // Now verify that both instructions have the same parameters and 1257 // the same effects. Both branch forms should have the same inputs 1258 // and resulting projections to correctly replace a long branch node 1259 // with corresponding short branch node during code generation. 1260 1261 bool different = false; 1262 if (short_branch->_components.count() != _components.count()) { 1263 different = true; 1264 } else if (_components.count() > 0) { 1265 short_branch->_components.reset(); 1266 _components.reset(); 1267 Component *comp; 1268 while ((comp = _components.iter()) != NULL) { 1269 Component *short_comp = short_branch->_components.iter(); 1270 if (short_comp == NULL || 1271 short_comp->_type != comp->_type || 1272 short_comp->_usedef != comp->_usedef) { 1273 different = true; 1274 break; 1275 } 1276 } 1277 if (short_branch->_components.iter() != NULL) 1278 different = true; 1279 } 1280 if (different) { 1281 globalAD->syntax_err(short_branch->_linenum, "Instruction %s and its short form %s have different parameters\n", _ident, short_branch->_ident); 1282 } 1283 if (AD._adl_debug > 1 || AD._short_branch_debug) { 1284 fprintf(stderr, "Instruction %s has short form %s\n", _ident, short_branch->_ident); 1285 } 1286 _short_branch_form = short_branch; 1287 return true; 1288 } 1289 return false; 1290 } 1291 1292 1293 // --------------------------- FILE *output_routines 1294 // 1295 // Generate the format call for the replacement variable 1296 void InstructForm::rep_var_format(FILE *fp, const char *rep_var) { 1297 // Handle special constant table variables. 1298 if (strcmp(rep_var, "constanttablebase") == 0) { 1299 fprintf(fp, "char reg[128]; ra->dump_register(in(mach_constant_base_node_input()), reg);\n"); 1300 fprintf(fp, " st->print(\"%%s\", reg);\n"); 1301 return; 1302 } 1303 if (strcmp(rep_var, "constantoffset") == 0) { 1304 fprintf(fp, "st->print(\"#%%d\", constant_offset_unchecked());\n"); 1305 return; 1306 } 1307 if (strcmp(rep_var, "constantaddress") == 0) { 1308 fprintf(fp, "st->print(\"constant table base + #%%d\", constant_offset_unchecked());\n"); 1309 return; 1310 } 1311 1312 // Find replacement variable's type 1313 const Form *form = _localNames[rep_var]; 1314 if (form == NULL) { 1315 globalAD->syntax_err(_linenum, "Unknown replacement variable %s in format statement of %s.", 1316 rep_var, _ident); 1317 return; 1318 } 1319 OpClassForm *opc = form->is_opclass(); 1320 assert( opc, "replacement variable was not found in local names"); 1321 // Lookup the index position of the replacement variable 1322 int idx = operand_position_format(rep_var); 1323 if ( idx == -1 ) { 1324 globalAD->syntax_err(_linenum, "Could not find replacement variable %s in format statement of %s.\n", 1325 rep_var, _ident); 1326 assert(strcmp(opc->_ident, "label") == 0, "Unimplemented"); 1327 return; 1328 } 1329 1330 if (is_noninput_operand(idx)) { 1331 // This component isn't in the input array. Print out the static 1332 // name of the register. 1333 OperandForm* oper = form->is_operand(); 1334 if (oper != NULL && oper->is_bound_register()) { 1335 const RegDef* first = oper->get_RegClass()->find_first_elem(); 1336 fprintf(fp, " st->print_raw(\"%s\");\n", first->_regname); 1337 } else { 1338 globalAD->syntax_err(_linenum, "In %s can't find format for %s %s", _ident, opc->_ident, rep_var); 1339 } 1340 } else { 1341 // Output the format call for this operand 1342 fprintf(fp,"opnd_array(%d)->",idx); 1343 if (idx == 0) 1344 fprintf(fp,"int_format(ra, this, st); // %s\n", rep_var); 1345 else 1346 fprintf(fp,"ext_format(ra, this,idx%d, st); // %s\n", idx, rep_var ); 1347 } 1348 } 1349 1350 // Seach through operands to determine parameters unique positions. 1351 void InstructForm::set_unique_opnds() { 1352 uint* uniq_idx = NULL; 1353 uint nopnds = num_opnds(); 1354 uint num_uniq = nopnds; 1355 uint i; 1356 _uniq_idx_length = 0; 1357 if (nopnds > 0) { 1358 // Allocate index array. Worst case we're mapping from each 1359 // component back to an index and any DEF always goes at 0 so the 1360 // length of the array has to be the number of components + 1. 1361 _uniq_idx_length = _components.count() + 1; 1362 uniq_idx = (uint*) AllocateHeap(sizeof(uint) * _uniq_idx_length); 1363 for (i = 0; i < _uniq_idx_length; i++) { 1364 uniq_idx[i] = i; 1365 } 1366 } 1367 // Do it only if there is a match rule and no expand rule. With an 1368 // expand rule it is done by creating new mach node in Expand() 1369 // method. 1370 if (nopnds > 0 && _matrule != NULL && _exprule == NULL) { 1371 const char *name; 1372 uint count; 1373 bool has_dupl_use = false; 1374 1375 _parameters.reset(); 1376 while ((name = _parameters.iter()) != NULL) { 1377 count = 0; 1378 uint position = 0; 1379 uint uniq_position = 0; 1380 _components.reset(); 1381 Component *comp = NULL; 1382 if (sets_result()) { 1383 comp = _components.iter(); 1384 position++; 1385 } 1386 // The next code is copied from the method operand_position(). 1387 for (; (comp = _components.iter()) != NULL; ++position) { 1388 // When the first component is not a DEF, 1389 // leave space for the result operand! 1390 if (position==0 && (!comp->isa(Component::DEF))) { 1391 ++position; 1392 } 1393 if (strcmp(name, comp->_name) == 0) { 1394 if (++count > 1) { 1395 assert(position < _uniq_idx_length, "out of bounds"); 1396 uniq_idx[position] = uniq_position; 1397 has_dupl_use = true; 1398 } else { 1399 uniq_position = position; 1400 } 1401 } 1402 if (comp->isa(Component::DEF) && comp->isa(Component::USE)) { 1403 ++position; 1404 if (position != 1) 1405 --position; // only use two slots for the 1st USE_DEF 1406 } 1407 } 1408 } 1409 if (has_dupl_use) { 1410 for (i = 1; i < nopnds; i++) { 1411 if (i != uniq_idx[i]) { 1412 break; 1413 } 1414 } 1415 uint j = i; 1416 for (; i < nopnds; i++) { 1417 if (i == uniq_idx[i]) { 1418 uniq_idx[i] = j++; 1419 } 1420 } 1421 num_uniq = j; 1422 } 1423 } 1424 _uniq_idx = uniq_idx; 1425 _num_uniq = num_uniq; 1426 } 1427 1428 // Generate index values needed for determining the operand position 1429 void InstructForm::index_temps(FILE *fp, FormDict &globals, const char *prefix, const char *receiver) { 1430 uint idx = 0; // position of operand in match rule 1431 int cur_num_opnds = num_opnds(); 1432 1433 // Compute the index into vector of operand pointers: 1434 // idx0=0 is used to indicate that info comes from this same node, not from input edge. 1435 // idx1 starts at oper_input_base() 1436 if ( cur_num_opnds >= 1 ) { 1437 fprintf(fp," // Start at oper_input_base() and count operands\n"); 1438 fprintf(fp," unsigned %sidx0 = %d;\n", prefix, oper_input_base(globals)); 1439 fprintf(fp," unsigned %sidx1 = %d;", prefix, oper_input_base(globals)); 1440 fprintf(fp," \t// %s\n", unique_opnd_ident(1)); 1441 1442 // Generate starting points for other unique operands if they exist 1443 for ( idx = 2; idx < num_unique_opnds(); ++idx ) { 1444 if( *receiver == 0 ) { 1445 fprintf(fp," unsigned %sidx%d = %sidx%d + opnd_array(%d)->num_edges();", 1446 prefix, idx, prefix, idx-1, idx-1 ); 1447 } else { 1448 fprintf(fp," unsigned %sidx%d = %sidx%d + %s_opnds[%d]->num_edges();", 1449 prefix, idx, prefix, idx-1, receiver, idx-1 ); 1450 } 1451 fprintf(fp," \t// %s\n", unique_opnd_ident(idx)); 1452 } 1453 } 1454 if( *receiver != 0 ) { 1455 // This value is used by generate_peepreplace when copying a node. 1456 // Don't emit it in other cases since it can hide bugs with the 1457 // use invalid idx's. 1458 fprintf(fp," unsigned %sidx%d = %sreq(); \n", prefix, idx, receiver); 1459 } 1460 1461 } 1462 1463 // --------------------------- 1464 bool InstructForm::verify() { 1465 // !!!!! !!!!! 1466 // Check that a "label" operand occurs last in the operand list, if present 1467 return true; 1468 } 1469 1470 void InstructForm::dump() { 1471 output(stderr); 1472 } 1473 1474 void InstructForm::output(FILE *fp) { 1475 fprintf(fp,"\nInstruction: %s\n", (_ident?_ident:"")); 1476 if (_matrule) _matrule->output(fp); 1477 if (_insencode) _insencode->output(fp); 1478 if (_constant) _constant->output(fp); 1479 if (_opcode) _opcode->output(fp); 1480 if (_attribs) _attribs->output(fp); 1481 if (_predicate) _predicate->output(fp); 1482 if (_effects.Size()) { 1483 fprintf(fp,"Effects\n"); 1484 _effects.dump(); 1485 } 1486 if (_exprule) _exprule->output(fp); 1487 if (_rewrule) _rewrule->output(fp); 1488 if (_format) _format->output(fp); 1489 if (_peephole) _peephole->output(fp); 1490 } 1491 1492 void MachNodeForm::dump() { 1493 output(stderr); 1494 } 1495 1496 void MachNodeForm::output(FILE *fp) { 1497 fprintf(fp,"\nMachNode: %s\n", (_ident?_ident:"")); 1498 } 1499 1500 //------------------------------build_predicate-------------------------------- 1501 // Build instruction predicates. If the user uses the same operand name 1502 // twice, we need to check that the operands are pointer-eequivalent in 1503 // the DFA during the labeling process. 1504 Predicate *InstructForm::build_predicate() { 1505 const int buflen = 1024; 1506 char buf[buflen], *s=buf; 1507 Dict names(cmpstr,hashstr,Form::arena); // Map Names to counts 1508 1509 MatchNode *mnode = 1510 strcmp(_matrule->_opType, "Set") ? _matrule : _matrule->_rChild; 1511 if (mnode != NULL) mnode->count_instr_names(names); 1512 1513 uint first = 1; 1514 // Start with the predicate supplied in the .ad file. 1515 if (_predicate) { 1516 if (first) first = 0; 1517 strcpy(s, "("); s += strlen(s); 1518 strncpy(s, _predicate->_pred, buflen - strlen(s) - 1); 1519 s += strlen(s); 1520 strcpy(s, ")"); s += strlen(s); 1521 } 1522 for( DictI i(&names); i.test(); ++i ) { 1523 uintptr_t cnt = (uintptr_t)i._value; 1524 if( cnt > 1 ) { // Need a predicate at all? 1525 assert( cnt == 2, "Unimplemented" ); 1526 // Handle many pairs 1527 if( first ) first=0; 1528 else { // All tests must pass, so use '&&' 1529 strcpy(s," && "); 1530 s += strlen(s); 1531 } 1532 // Add predicate to working buffer 1533 sprintf(s,"/*%s*/(",(char*)i._key); 1534 s += strlen(s); 1535 mnode->build_instr_pred(s,(char*)i._key,0); 1536 s += strlen(s); 1537 strcpy(s," == "); s += strlen(s); 1538 mnode->build_instr_pred(s,(char*)i._key,1); 1539 s += strlen(s); 1540 strcpy(s,")"); s += strlen(s); 1541 } 1542 } 1543 if( s == buf ) s = NULL; 1544 else { 1545 assert( strlen(buf) < sizeof(buf), "String buffer overflow" ); 1546 s = strdup(buf); 1547 } 1548 return new Predicate(s); 1549 } 1550 1551 //------------------------------EncodeForm------------------------------------- 1552 // Constructor 1553 EncodeForm::EncodeForm() 1554 : _encClass(cmpstr,hashstr, Form::arena) { 1555 } 1556 EncodeForm::~EncodeForm() { 1557 } 1558 1559 // record a new register class 1560 EncClass *EncodeForm::add_EncClass(const char *className) { 1561 EncClass *encClass = new EncClass(className); 1562 _eclasses.addName(className); 1563 _encClass.Insert(className,encClass); 1564 return encClass; 1565 } 1566 1567 // Lookup the function body for an encoding class 1568 EncClass *EncodeForm::encClass(const char *className) { 1569 assert( className != NULL, "Must provide a defined encoding name"); 1570 1571 EncClass *encClass = (EncClass*)_encClass[className]; 1572 return encClass; 1573 } 1574 1575 // Lookup the function body for an encoding class 1576 const char *EncodeForm::encClassBody(const char *className) { 1577 if( className == NULL ) return NULL; 1578 1579 EncClass *encClass = (EncClass*)_encClass[className]; 1580 assert( encClass != NULL, "Encode Class is missing."); 1581 encClass->_code.reset(); 1582 const char *code = (const char*)encClass->_code.iter(); 1583 assert( code != NULL, "Found an empty encode class body."); 1584 1585 return code; 1586 } 1587 1588 // Lookup the function body for an encoding class 1589 const char *EncodeForm::encClassPrototype(const char *className) { 1590 assert( className != NULL, "Encode class name must be non NULL."); 1591 1592 return className; 1593 } 1594 1595 void EncodeForm::dump() { // Debug printer 1596 output(stderr); 1597 } 1598 1599 void EncodeForm::output(FILE *fp) { // Write info to output files 1600 const char *name; 1601 fprintf(fp,"\n"); 1602 fprintf(fp,"-------------------- Dump EncodeForm --------------------\n"); 1603 for (_eclasses.reset(); (name = _eclasses.iter()) != NULL;) { 1604 ((EncClass*)_encClass[name])->output(fp); 1605 } 1606 fprintf(fp,"-------------------- end EncodeForm --------------------\n"); 1607 } 1608 //------------------------------EncClass--------------------------------------- 1609 EncClass::EncClass(const char *name) 1610 : _localNames(cmpstr,hashstr, Form::arena), _name(name) { 1611 } 1612 EncClass::~EncClass() { 1613 } 1614 1615 // Add a parameter <type,name> pair 1616 void EncClass::add_parameter(const char *parameter_type, const char *parameter_name) { 1617 _parameter_type.addName( parameter_type ); 1618 _parameter_name.addName( parameter_name ); 1619 } 1620 1621 // Verify operand types in parameter list 1622 bool EncClass::check_parameter_types(FormDict &globals) { 1623 // !!!!! 1624 return false; 1625 } 1626 1627 // Add the decomposed "code" sections of an encoding's code-block 1628 void EncClass::add_code(const char *code) { 1629 _code.addName(code); 1630 } 1631 1632 // Add the decomposed "replacement variables" of an encoding's code-block 1633 void EncClass::add_rep_var(char *replacement_var) { 1634 _code.addName(NameList::_signal); 1635 _rep_vars.addName(replacement_var); 1636 } 1637 1638 // Lookup the function body for an encoding class 1639 int EncClass::rep_var_index(const char *rep_var) { 1640 uint position = 0; 1641 const char *name = NULL; 1642 1643 _parameter_name.reset(); 1644 while ( (name = _parameter_name.iter()) != NULL ) { 1645 if ( strcmp(rep_var,name) == 0 ) return position; 1646 ++position; 1647 } 1648 1649 return -1; 1650 } 1651 1652 // Check after parsing 1653 bool EncClass::verify() { 1654 // 1!!!! 1655 // Check that each replacement variable, '$name' in architecture description 1656 // is actually a local variable for this encode class, or a reserved name 1657 // "primary, secondary, tertiary" 1658 return true; 1659 } 1660 1661 void EncClass::dump() { 1662 output(stderr); 1663 } 1664 1665 // Write info to output files 1666 void EncClass::output(FILE *fp) { 1667 fprintf(fp,"EncClass: %s", (_name ? _name : "")); 1668 1669 // Output the parameter list 1670 _parameter_type.reset(); 1671 _parameter_name.reset(); 1672 const char *type = _parameter_type.iter(); 1673 const char *name = _parameter_name.iter(); 1674 fprintf(fp, " ( "); 1675 for ( ; (type != NULL) && (name != NULL); 1676 (type = _parameter_type.iter()), (name = _parameter_name.iter()) ) { 1677 fprintf(fp, " %s %s,", type, name); 1678 } 1679 fprintf(fp, " ) "); 1680 1681 // Output the code block 1682 _code.reset(); 1683 _rep_vars.reset(); 1684 const char *code; 1685 while ( (code = _code.iter()) != NULL ) { 1686 if ( _code.is_signal(code) ) { 1687 // A replacement variable 1688 const char *rep_var = _rep_vars.iter(); 1689 fprintf(fp,"($%s)", rep_var); 1690 } else { 1691 // A section of code 1692 fprintf(fp,"%s", code); 1693 } 1694 } 1695 1696 } 1697 1698 //------------------------------Opcode----------------------------------------- 1699 Opcode::Opcode(char *primary, char *secondary, char *tertiary) 1700 : _primary(primary), _secondary(secondary), _tertiary(tertiary) { 1701 } 1702 1703 Opcode::~Opcode() { 1704 } 1705 1706 Opcode::opcode_type Opcode::as_opcode_type(const char *param) { 1707 if( strcmp(param,"primary") == 0 ) { 1708 return Opcode::PRIMARY; 1709 } 1710 else if( strcmp(param,"secondary") == 0 ) { 1711 return Opcode::SECONDARY; 1712 } 1713 else if( strcmp(param,"tertiary") == 0 ) { 1714 return Opcode::TERTIARY; 1715 } 1716 return Opcode::NOT_AN_OPCODE; 1717 } 1718 1719 bool Opcode::print_opcode(FILE *fp, Opcode::opcode_type desired_opcode) { 1720 // Default values previously provided by MachNode::primary()... 1721 const char *description = NULL; 1722 const char *value = NULL; 1723 // Check if user provided any opcode definitions 1724 // Update 'value' if user provided a definition in the instruction 1725 switch (desired_opcode) { 1726 case PRIMARY: 1727 description = "primary()"; 1728 if( _primary != NULL) { value = _primary; } 1729 break; 1730 case SECONDARY: 1731 description = "secondary()"; 1732 if( _secondary != NULL ) { value = _secondary; } 1733 break; 1734 case TERTIARY: 1735 description = "tertiary()"; 1736 if( _tertiary != NULL ) { value = _tertiary; } 1737 break; 1738 default: 1739 assert( false, "ShouldNotReachHere();"); 1740 break; 1741 } 1742 1743 if (value != NULL) { 1744 fprintf(fp, "(%s /*%s*/)", value, description); 1745 } 1746 return value != NULL; 1747 } 1748 1749 void Opcode::dump() { 1750 output(stderr); 1751 } 1752 1753 // Write info to output files 1754 void Opcode::output(FILE *fp) { 1755 if (_primary != NULL) fprintf(fp,"Primary opcode: %s\n", _primary); 1756 if (_secondary != NULL) fprintf(fp,"Secondary opcode: %s\n", _secondary); 1757 if (_tertiary != NULL) fprintf(fp,"Tertiary opcode: %s\n", _tertiary); 1758 } 1759 1760 //------------------------------InsEncode-------------------------------------- 1761 InsEncode::InsEncode() { 1762 } 1763 InsEncode::~InsEncode() { 1764 } 1765 1766 // Add "encode class name" and its parameters 1767 NameAndList *InsEncode::add_encode(char *encoding) { 1768 assert( encoding != NULL, "Must provide name for encoding"); 1769 1770 // add_parameter(NameList::_signal); 1771 NameAndList *encode = new NameAndList(encoding); 1772 _encoding.addName((char*)encode); 1773 1774 return encode; 1775 } 1776 1777 // Access the list of encodings 1778 void InsEncode::reset() { 1779 _encoding.reset(); 1780 // _parameter.reset(); 1781 } 1782 const char* InsEncode::encode_class_iter() { 1783 NameAndList *encode_class = (NameAndList*)_encoding.iter(); 1784 return ( encode_class != NULL ? encode_class->name() : NULL ); 1785 } 1786 // Obtain parameter name from zero based index 1787 const char *InsEncode::rep_var_name(InstructForm &inst, uint param_no) { 1788 NameAndList *params = (NameAndList*)_encoding.current(); 1789 assert( params != NULL, "Internal Error"); 1790 const char *param = (*params)[param_no]; 1791 1792 // Remove '$' if parser placed it there. 1793 return ( param != NULL && *param == '$') ? (param+1) : param; 1794 } 1795 1796 void InsEncode::dump() { 1797 output(stderr); 1798 } 1799 1800 // Write info to output files 1801 void InsEncode::output(FILE *fp) { 1802 NameAndList *encoding = NULL; 1803 const char *parameter = NULL; 1804 1805 fprintf(fp,"InsEncode: "); 1806 _encoding.reset(); 1807 1808 while ( (encoding = (NameAndList*)_encoding.iter()) != 0 ) { 1809 // Output the encoding being used 1810 fprintf(fp,"%s(", encoding->name() ); 1811 1812 // Output its parameter list, if any 1813 bool first_param = true; 1814 encoding->reset(); 1815 while ( (parameter = encoding->iter()) != 0 ) { 1816 // Output the ',' between parameters 1817 if ( ! first_param ) fprintf(fp,", "); 1818 first_param = false; 1819 // Output the parameter 1820 fprintf(fp,"%s", parameter); 1821 } // done with parameters 1822 fprintf(fp,") "); 1823 } // done with encodings 1824 1825 fprintf(fp,"\n"); 1826 } 1827 1828 //------------------------------Effect----------------------------------------- 1829 static int effect_lookup(const char *name) { 1830 if (!strcmp(name, "USE")) return Component::USE; 1831 if (!strcmp(name, "DEF")) return Component::DEF; 1832 if (!strcmp(name, "USE_DEF")) return Component::USE_DEF; 1833 if (!strcmp(name, "KILL")) return Component::KILL; 1834 if (!strcmp(name, "USE_KILL")) return Component::USE_KILL; 1835 if (!strcmp(name, "TEMP")) return Component::TEMP; 1836 if (!strcmp(name, "TEMP_DEF")) return Component::TEMP_DEF; 1837 if (!strcmp(name, "INVALID")) return Component::INVALID; 1838 if (!strcmp(name, "CALL")) return Component::CALL; 1839 assert(false,"Invalid effect name specified\n"); 1840 return Component::INVALID; 1841 } 1842 1843 const char *Component::getUsedefName() { 1844 switch (_usedef) { 1845 case Component::INVALID: return "INVALID"; break; 1846 case Component::USE: return "USE"; break; 1847 case Component::USE_DEF: return "USE_DEF"; break; 1848 case Component::USE_KILL: return "USE_KILL"; break; 1849 case Component::KILL: return "KILL"; break; 1850 case Component::TEMP: return "TEMP"; break; 1851 case Component::TEMP_DEF: return "TEMP_DEF"; break; 1852 case Component::DEF: return "DEF"; break; 1853 case Component::CALL: return "CALL"; break; 1854 default: assert(false, "unknown effect"); 1855 } 1856 return "Undefined Use/Def info"; 1857 } 1858 1859 Effect::Effect(const char *name) : _name(name), _use_def(effect_lookup(name)) { 1860 _ftype = Form::EFF; 1861 } 1862 1863 Effect::~Effect() { 1864 } 1865 1866 // Dynamic type check 1867 Effect *Effect::is_effect() const { 1868 return (Effect*)this; 1869 } 1870 1871 1872 // True if this component is equal to the parameter. 1873 bool Effect::is(int use_def_kill_enum) const { 1874 return (_use_def == use_def_kill_enum ? true : false); 1875 } 1876 // True if this component is used/def'd/kill'd as the parameter suggests. 1877 bool Effect::isa(int use_def_kill_enum) const { 1878 return (_use_def & use_def_kill_enum) == use_def_kill_enum; 1879 } 1880 1881 void Effect::dump() { 1882 output(stderr); 1883 } 1884 1885 void Effect::output(FILE *fp) { // Write info to output files 1886 fprintf(fp,"Effect: %s\n", (_name?_name:"")); 1887 } 1888 1889 //------------------------------ExpandRule------------------------------------- 1890 ExpandRule::ExpandRule() : _expand_instrs(), 1891 _newopconst(cmpstr, hashstr, Form::arena) { 1892 _ftype = Form::EXP; 1893 } 1894 1895 ExpandRule::~ExpandRule() { // Destructor 1896 } 1897 1898 void ExpandRule::add_instruction(NameAndList *instruction_name_and_operand_list) { 1899 _expand_instrs.addName((char*)instruction_name_and_operand_list); 1900 } 1901 1902 void ExpandRule::reset_instructions() { 1903 _expand_instrs.reset(); 1904 } 1905 1906 NameAndList* ExpandRule::iter_instructions() { 1907 return (NameAndList*)_expand_instrs.iter(); 1908 } 1909 1910 1911 void ExpandRule::dump() { 1912 output(stderr); 1913 } 1914 1915 void ExpandRule::output(FILE *fp) { // Write info to output files 1916 NameAndList *expand_instr = NULL; 1917 const char *opid = NULL; 1918 1919 fprintf(fp,"\nExpand Rule:\n"); 1920 1921 // Iterate over the instructions 'node' expands into 1922 for(reset_instructions(); (expand_instr = iter_instructions()) != NULL; ) { 1923 fprintf(fp,"%s(", expand_instr->name()); 1924 1925 // iterate over the operand list 1926 for( expand_instr->reset(); (opid = expand_instr->iter()) != NULL; ) { 1927 fprintf(fp,"%s ", opid); 1928 } 1929 fprintf(fp,");\n"); 1930 } 1931 } 1932 1933 //------------------------------RewriteRule------------------------------------ 1934 RewriteRule::RewriteRule(char* params, char* block) 1935 : _tempParams(params), _tempBlock(block) { }; // Constructor 1936 RewriteRule::~RewriteRule() { // Destructor 1937 } 1938 1939 void RewriteRule::dump() { 1940 output(stderr); 1941 } 1942 1943 void RewriteRule::output(FILE *fp) { // Write info to output files 1944 fprintf(fp,"\nRewrite Rule:\n%s\n%s\n", 1945 (_tempParams?_tempParams:""), 1946 (_tempBlock?_tempBlock:"")); 1947 } 1948 1949 1950 //==============================MachNodes====================================== 1951 //------------------------------MachNodeForm----------------------------------- 1952 MachNodeForm::MachNodeForm(char *id) 1953 : _ident(id) { 1954 } 1955 1956 MachNodeForm::~MachNodeForm() { 1957 } 1958 1959 MachNodeForm *MachNodeForm::is_machnode() const { 1960 return (MachNodeForm*)this; 1961 } 1962 1963 //==============================Operand Classes================================ 1964 //------------------------------OpClassForm------------------------------------ 1965 OpClassForm::OpClassForm(const char* id) : _ident(id) { 1966 _ftype = Form::OPCLASS; 1967 } 1968 1969 OpClassForm::~OpClassForm() { 1970 } 1971 1972 bool OpClassForm::ideal_only() const { return 0; } 1973 1974 OpClassForm *OpClassForm::is_opclass() const { 1975 return (OpClassForm*)this; 1976 } 1977 1978 Form::InterfaceType OpClassForm::interface_type(FormDict &globals) const { 1979 if( _oplst.count() == 0 ) return Form::no_interface; 1980 1981 // Check that my operands have the same interface type 1982 Form::InterfaceType interface; 1983 bool first = true; 1984 NameList &op_list = (NameList &)_oplst; 1985 op_list.reset(); 1986 const char *op_name; 1987 while( (op_name = op_list.iter()) != NULL ) { 1988 const Form *form = globals[op_name]; 1989 OperandForm *operand = form->is_operand(); 1990 assert( operand, "Entry in operand class that is not an operand"); 1991 if( first ) { 1992 first = false; 1993 interface = operand->interface_type(globals); 1994 } else { 1995 interface = (interface == operand->interface_type(globals) ? interface : Form::no_interface); 1996 } 1997 } 1998 return interface; 1999 } 2000 2001 bool OpClassForm::stack_slots_only(FormDict &globals) const { 2002 if( _oplst.count() == 0 ) return false; // how? 2003 2004 NameList &op_list = (NameList &)_oplst; 2005 op_list.reset(); 2006 const char *op_name; 2007 while( (op_name = op_list.iter()) != NULL ) { 2008 const Form *form = globals[op_name]; 2009 OperandForm *operand = form->is_operand(); 2010 assert( operand, "Entry in operand class that is not an operand"); 2011 if( !operand->stack_slots_only(globals) ) return false; 2012 } 2013 return true; 2014 } 2015 2016 2017 void OpClassForm::dump() { 2018 output(stderr); 2019 } 2020 2021 void OpClassForm::output(FILE *fp) { 2022 const char *name; 2023 fprintf(fp,"\nOperand Class: %s\n", (_ident?_ident:"")); 2024 fprintf(fp,"\nCount = %d\n", _oplst.count()); 2025 for(_oplst.reset(); (name = _oplst.iter()) != NULL;) { 2026 fprintf(fp,"%s, ",name); 2027 } 2028 fprintf(fp,"\n"); 2029 } 2030 2031 2032 //==============================Operands======================================= 2033 //------------------------------OperandForm------------------------------------ 2034 OperandForm::OperandForm(const char* id) 2035 : OpClassForm(id), _ideal_only(false), 2036 _localNames(cmpstr, hashstr, Form::arena) { 2037 _ftype = Form::OPER; 2038 2039 _matrule = NULL; 2040 _interface = NULL; 2041 _attribs = NULL; 2042 _predicate = NULL; 2043 _constraint= NULL; 2044 _construct = NULL; 2045 _format = NULL; 2046 } 2047 OperandForm::OperandForm(const char* id, bool ideal_only) 2048 : OpClassForm(id), _ideal_only(ideal_only), 2049 _localNames(cmpstr, hashstr, Form::arena) { 2050 _ftype = Form::OPER; 2051 2052 _matrule = NULL; 2053 _interface = NULL; 2054 _attribs = NULL; 2055 _predicate = NULL; 2056 _constraint= NULL; 2057 _construct = NULL; 2058 _format = NULL; 2059 } 2060 OperandForm::~OperandForm() { 2061 } 2062 2063 2064 OperandForm *OperandForm::is_operand() const { 2065 return (OperandForm*)this; 2066 } 2067 2068 bool OperandForm::ideal_only() const { 2069 return _ideal_only; 2070 } 2071 2072 Form::InterfaceType OperandForm::interface_type(FormDict &globals) const { 2073 if( _interface == NULL ) return Form::no_interface; 2074 2075 return _interface->interface_type(globals); 2076 } 2077 2078 2079 bool OperandForm::stack_slots_only(FormDict &globals) const { 2080 if( _constraint == NULL ) return false; 2081 return _constraint->stack_slots_only(); 2082 } 2083 2084 2085 // Access op_cost attribute or return NULL. 2086 const char* OperandForm::cost() { 2087 for (Attribute* cur = _attribs; cur != NULL; cur = (Attribute*)cur->_next) { 2088 if( strcmp(cur->_ident,AttributeForm::_op_cost) == 0 ) { 2089 return cur->_val; 2090 } 2091 } 2092 return NULL; 2093 } 2094 2095 // Return the number of leaves below this complex operand 2096 uint OperandForm::num_leaves() const { 2097 if ( ! _matrule) return 0; 2098 2099 int num_leaves = _matrule->_numleaves; 2100 return num_leaves; 2101 } 2102 2103 // Return the number of constants contained within this complex operand 2104 uint OperandForm::num_consts(FormDict &globals) const { 2105 if ( ! _matrule) return 0; 2106 2107 // This is a recursive invocation on all operands in the matchrule 2108 return _matrule->num_consts(globals); 2109 } 2110 2111 // Return the number of constants in match rule with specified type 2112 uint OperandForm::num_consts(FormDict &globals, Form::DataType type) const { 2113 if ( ! _matrule) return 0; 2114 2115 // This is a recursive invocation on all operands in the matchrule 2116 return _matrule->num_consts(globals, type); 2117 } 2118 2119 // Return the number of pointer constants contained within this complex operand 2120 uint OperandForm::num_const_ptrs(FormDict &globals) const { 2121 if ( ! _matrule) return 0; 2122 2123 // This is a recursive invocation on all operands in the matchrule 2124 return _matrule->num_const_ptrs(globals); 2125 } 2126 2127 uint OperandForm::num_edges(FormDict &globals) const { 2128 uint edges = 0; 2129 uint leaves = num_leaves(); 2130 uint consts = num_consts(globals); 2131 2132 // If we are matching a constant directly, there are no leaves. 2133 edges = ( leaves > consts ) ? leaves - consts : 0; 2134 2135 // !!!!! 2136 // Special case operands that do not have a corresponding ideal node. 2137 if( (edges == 0) && (consts == 0) ) { 2138 if( constrained_reg_class() != NULL ) { 2139 edges = 1; 2140 } else { 2141 if( _matrule 2142 && (_matrule->_lChild == NULL) && (_matrule->_rChild == NULL) ) { 2143 const Form *form = globals[_matrule->_opType]; 2144 OperandForm *oper = form ? form->is_operand() : NULL; 2145 if( oper ) { 2146 return oper->num_edges(globals); 2147 } 2148 } 2149 } 2150 } 2151 2152 return edges; 2153 } 2154 2155 2156 // Check if this operand is usable for cisc-spilling 2157 bool OperandForm::is_cisc_reg(FormDict &globals) const { 2158 const char *ideal = ideal_type(globals); 2159 bool is_cisc_reg = (ideal && (ideal_to_Reg_type(ideal) != none)); 2160 return is_cisc_reg; 2161 } 2162 2163 bool OpClassForm::is_cisc_mem(FormDict &globals) const { 2164 Form::InterfaceType my_interface = interface_type(globals); 2165 return (my_interface == memory_interface); 2166 } 2167 2168 2169 // node matches ideal 'Bool' 2170 bool OperandForm::is_ideal_bool() const { 2171 if( _matrule == NULL ) return false; 2172 2173 return _matrule->is_ideal_bool(); 2174 } 2175 2176 // Require user's name for an sRegX to be stackSlotX 2177 Form::DataType OperandForm::is_user_name_for_sReg() const { 2178 DataType data_type = none; 2179 if( _ident != NULL ) { 2180 if( strcmp(_ident,"stackSlotI") == 0 ) data_type = Form::idealI; 2181 else if( strcmp(_ident,"stackSlotP") == 0 ) data_type = Form::idealP; 2182 else if( strcmp(_ident,"stackSlotD") == 0 ) data_type = Form::idealD; 2183 else if( strcmp(_ident,"stackSlotF") == 0 ) data_type = Form::idealF; 2184 else if( strcmp(_ident,"stackSlotL") == 0 ) data_type = Form::idealL; 2185 } 2186 assert((data_type == none) || (_matrule == NULL), "No match-rule for stackSlotX"); 2187 2188 return data_type; 2189 } 2190 2191 2192 // Return ideal type, if there is a single ideal type for this operand 2193 const char *OperandForm::ideal_type(FormDict &globals, RegisterForm *registers) const { 2194 const char *type = NULL; 2195 if (ideal_only()) type = _ident; 2196 else if( _matrule == NULL ) { 2197 // Check for condition code register 2198 const char *rc_name = constrained_reg_class(); 2199 // !!!!! 2200 if (rc_name == NULL) return NULL; 2201 // !!!!! !!!!! 2202 // Check constraints on result's register class 2203 if( registers ) { 2204 RegClass *reg_class = registers->getRegClass(rc_name); 2205 assert( reg_class != NULL, "Register class is not defined"); 2206 2207 // Check for ideal type of entries in register class, all are the same type 2208 reg_class->reset(); 2209 RegDef *reg_def = reg_class->RegDef_iter(); 2210 assert( reg_def != NULL, "No entries in register class"); 2211 assert( reg_def->_idealtype != NULL, "Did not define ideal type for register"); 2212 // Return substring that names the register's ideal type 2213 type = reg_def->_idealtype + 3; 2214 assert( *(reg_def->_idealtype + 0) == 'O', "Expect Op_ prefix"); 2215 assert( *(reg_def->_idealtype + 1) == 'p', "Expect Op_ prefix"); 2216 assert( *(reg_def->_idealtype + 2) == '_', "Expect Op_ prefix"); 2217 } 2218 } 2219 else if( _matrule->_lChild == NULL && _matrule->_rChild == NULL ) { 2220 // This operand matches a single type, at the top level. 2221 // Check for ideal type 2222 type = _matrule->_opType; 2223 if( strcmp(type,"Bool") == 0 ) 2224 return "Bool"; 2225 // transitive lookup 2226 const Form *frm = globals[type]; 2227 OperandForm *op = frm->is_operand(); 2228 type = op->ideal_type(globals, registers); 2229 } 2230 return type; 2231 } 2232 2233 2234 // If there is a single ideal type for this interface field, return it. 2235 const char *OperandForm::interface_ideal_type(FormDict &globals, 2236 const char *field) const { 2237 const char *ideal_type = NULL; 2238 const char *value = NULL; 2239 2240 // Check if "field" is valid for this operand's interface 2241 if ( ! is_interface_field(field, value) ) return ideal_type; 2242 2243 // !!!!! !!!!! !!!!! 2244 // If a valid field has a constant value, identify "ConI" or "ConP" or ... 2245 2246 // Else, lookup type of field's replacement variable 2247 2248 return ideal_type; 2249 } 2250 2251 2252 RegClass* OperandForm::get_RegClass() const { 2253 if (_interface && !_interface->is_RegInterface()) return NULL; 2254 return globalAD->get_registers()->getRegClass(constrained_reg_class()); 2255 } 2256 2257 2258 bool OperandForm::is_bound_register() const { 2259 RegClass* reg_class = get_RegClass(); 2260 if (reg_class == NULL) { 2261 return false; 2262 } 2263 2264 const char* name = ideal_type(globalAD->globalNames()); 2265 if (name == NULL) { 2266 return false; 2267 } 2268 2269 uint size = 0; 2270 if (strcmp(name, "RegFlags") == 0) size = 1; 2271 if (strcmp(name, "RegI") == 0) size = 1; 2272 if (strcmp(name, "RegF") == 0) size = 1; 2273 if (strcmp(name, "RegD") == 0) size = 2; 2274 if (strcmp(name, "RegL") == 0) size = 2; 2275 if (strcmp(name, "RegN") == 0) size = 1; 2276 if (strcmp(name, "VecX") == 0) size = 4; 2277 if (strcmp(name, "VecY") == 0) size = 8; 2278 if (strcmp(name, "VecZ") == 0) size = 16; 2279 if (strcmp(name, "RegP") == 0) size = globalAD->get_preproc_def("_LP64") ? 2 : 1; 2280 if (size == 0) { 2281 return false; 2282 } 2283 return size == reg_class->size(); 2284 } 2285 2286 2287 // Check if this is a valid field for this operand, 2288 // Return 'true' if valid, and set the value to the string the user provided. 2289 bool OperandForm::is_interface_field(const char *field, 2290 const char * &value) const { 2291 return false; 2292 } 2293 2294 2295 // Return register class name if a constraint specifies the register class. 2296 const char *OperandForm::constrained_reg_class() const { 2297 const char *reg_class = NULL; 2298 if ( _constraint ) { 2299 // !!!!! 2300 Constraint *constraint = _constraint; 2301 if ( strcmp(_constraint->_func,"ALLOC_IN_RC") == 0 ) { 2302 reg_class = _constraint->_arg; 2303 } 2304 } 2305 2306 return reg_class; 2307 } 2308 2309 2310 // Return the register class associated with 'leaf'. 2311 const char *OperandForm::in_reg_class(uint leaf, FormDict &globals) { 2312 const char *reg_class = NULL; // "RegMask::Empty"; 2313 2314 if((_matrule == NULL) || (_matrule->is_chain_rule(globals))) { 2315 reg_class = constrained_reg_class(); 2316 return reg_class; 2317 } 2318 const char *result = NULL; 2319 const char *name = NULL; 2320 const char *type = NULL; 2321 // iterate through all base operands 2322 // until we reach the register that corresponds to "leaf" 2323 // This function is not looking for an ideal type. It needs the first 2324 // level user type associated with the leaf. 2325 for(uint idx = 0;_matrule->base_operand(idx,globals,result,name,type);++idx) { 2326 const Form *form = (_localNames[name] ? _localNames[name] : globals[result]); 2327 OperandForm *oper = form ? form->is_operand() : NULL; 2328 if( oper ) { 2329 reg_class = oper->constrained_reg_class(); 2330 if( reg_class ) { 2331 reg_class = reg_class; 2332 } else { 2333 // ShouldNotReachHere(); 2334 } 2335 } else { 2336 // ShouldNotReachHere(); 2337 } 2338 2339 // Increment our target leaf position if current leaf is not a candidate. 2340 if( reg_class == NULL) ++leaf; 2341 // Exit the loop with the value of reg_class when at the correct index 2342 if( idx == leaf ) break; 2343 // May iterate through all base operands if reg_class for 'leaf' is NULL 2344 } 2345 return reg_class; 2346 } 2347 2348 2349 // Recursive call to construct list of top-level operands. 2350 // Implementation does not modify state of internal structures 2351 void OperandForm::build_components() { 2352 if (_matrule) _matrule->append_components(_localNames, _components); 2353 2354 // Add parameters that "do not appear in match rule". 2355 const char *name; 2356 for (_parameters.reset(); (name = _parameters.iter()) != NULL;) { 2357 OpClassForm *opForm = _localNames[name]->is_opclass(); 2358 assert(opForm != NULL, "sanity"); 2359 2360 if ( _components.operand_position(name) == -1 ) { 2361 _components.insert(name, opForm->_ident, Component::INVALID, false); 2362 } 2363 } 2364 2365 return; 2366 } 2367 2368 int OperandForm::operand_position(const char *name, int usedef) { 2369 return _components.operand_position(name, usedef, this); 2370 } 2371 2372 2373 // Return zero-based position in component list, only counting constants; 2374 // Return -1 if not in list. 2375 int OperandForm::constant_position(FormDict &globals, const Component *last) { 2376 // Iterate through components and count constants preceding 'constant' 2377 int position = 0; 2378 Component *comp; 2379 _components.reset(); 2380 while( (comp = _components.iter()) != NULL && (comp != last) ) { 2381 // Special case for operands that take a single user-defined operand 2382 // Skip the initial definition in the component list. 2383 if( strcmp(comp->_name,this->_ident) == 0 ) continue; 2384 2385 const char *type = comp->_type; 2386 // Lookup operand form for replacement variable's type 2387 const Form *form = globals[type]; 2388 assert( form != NULL, "Component's type not found"); 2389 OperandForm *oper = form ? form->is_operand() : NULL; 2390 if( oper ) { 2391 if( oper->_matrule->is_base_constant(globals) != Form::none ) { 2392 ++position; 2393 } 2394 } 2395 } 2396 2397 // Check for being passed a component that was not in the list 2398 if( comp != last ) position = -1; 2399 2400 return position; 2401 } 2402 // Provide position of constant by "name" 2403 int OperandForm::constant_position(FormDict &globals, const char *name) { 2404 const Component *comp = _components.search(name); 2405 int idx = constant_position( globals, comp ); 2406 2407 return idx; 2408 } 2409 2410 2411 // Return zero-based position in component list, only counting constants; 2412 // Return -1 if not in list. 2413 int OperandForm::register_position(FormDict &globals, const char *reg_name) { 2414 // Iterate through components and count registers preceding 'last' 2415 uint position = 0; 2416 Component *comp; 2417 _components.reset(); 2418 while( (comp = _components.iter()) != NULL 2419 && (strcmp(comp->_name,reg_name) != 0) ) { 2420 // Special case for operands that take a single user-defined operand 2421 // Skip the initial definition in the component list. 2422 if( strcmp(comp->_name,this->_ident) == 0 ) continue; 2423 2424 const char *type = comp->_type; 2425 // Lookup operand form for component's type 2426 const Form *form = globals[type]; 2427 assert( form != NULL, "Component's type not found"); 2428 OperandForm *oper = form ? form->is_operand() : NULL; 2429 if( oper ) { 2430 if( oper->_matrule->is_base_register(globals) ) { 2431 ++position; 2432 } 2433 } 2434 } 2435 2436 return position; 2437 } 2438 2439 2440 const char *OperandForm::reduce_result() const { 2441 return _ident; 2442 } 2443 // Return the name of the operand on the right hand side of the binary match 2444 // Return NULL if there is no right hand side 2445 const char *OperandForm::reduce_right(FormDict &globals) const { 2446 return ( _matrule ? _matrule->reduce_right(globals) : NULL ); 2447 } 2448 2449 // Similar for left 2450 const char *OperandForm::reduce_left(FormDict &globals) const { 2451 return ( _matrule ? _matrule->reduce_left(globals) : NULL ); 2452 } 2453 2454 2455 // --------------------------- FILE *output_routines 2456 // 2457 // Output code for disp_is_oop, if true. 2458 void OperandForm::disp_is_oop(FILE *fp, FormDict &globals) { 2459 // Check it is a memory interface with a non-user-constant disp field 2460 if ( this->_interface == NULL ) return; 2461 MemInterface *mem_interface = this->_interface->is_MemInterface(); 2462 if ( mem_interface == NULL ) return; 2463 const char *disp = mem_interface->_disp; 2464 if ( *disp != '$' ) return; 2465 2466 // Lookup replacement variable in operand's component list 2467 const char *rep_var = disp + 1; 2468 const Component *comp = this->_components.search(rep_var); 2469 assert( comp != NULL, "Replacement variable not found in components"); 2470 // Lookup operand form for replacement variable's type 2471 const char *type = comp->_type; 2472 Form *form = (Form*)globals[type]; 2473 assert( form != NULL, "Replacement variable's type not found"); 2474 OperandForm *op = form->is_operand(); 2475 assert( op, "Memory Interface 'disp' can only emit an operand form"); 2476 // Check if this is a ConP, which may require relocation 2477 if ( op->is_base_constant(globals) == Form::idealP ) { 2478 // Find the constant's index: _c0, _c1, _c2, ... , _cN 2479 uint idx = op->constant_position( globals, rep_var); 2480 fprintf(fp," virtual relocInfo::relocType disp_reloc() const {"); 2481 fprintf(fp, " return _c%d->reloc();", idx); 2482 fprintf(fp, " }\n"); 2483 } 2484 } 2485 2486 // Generate code for internal and external format methods 2487 // 2488 // internal access to reg# node->_idx 2489 // access to subsumed constant _c0, _c1, 2490 void OperandForm::int_format(FILE *fp, FormDict &globals, uint index) { 2491 Form::DataType dtype; 2492 if (_matrule && (_matrule->is_base_register(globals) || 2493 strcmp(ideal_type(globalAD->globalNames()), "RegFlags") == 0)) { 2494 // !!!!! !!!!! 2495 fprintf(fp," { char reg_str[128];\n"); 2496 fprintf(fp," ra->dump_register(node,reg_str);\n"); 2497 fprintf(fp," st->print(\"%cs\",reg_str);\n",'%'); 2498 fprintf(fp," }\n"); 2499 } else if (_matrule && (dtype = _matrule->is_base_constant(globals)) != Form::none) { 2500 format_constant( fp, index, dtype ); 2501 } else if (ideal_to_sReg_type(_ident) != Form::none) { 2502 // Special format for Stack Slot Register 2503 fprintf(fp," { char reg_str[128];\n"); 2504 fprintf(fp," ra->dump_register(node,reg_str);\n"); 2505 fprintf(fp," st->print(\"%cs\",reg_str);\n",'%'); 2506 fprintf(fp," }\n"); 2507 } else { 2508 fprintf(fp," st->print(\"No format defined for %s\n\");\n", _ident); 2509 fflush(fp); 2510 fprintf(stderr,"No format defined for %s\n", _ident); 2511 dump(); 2512 assert( false,"Internal error:\n output_internal_operand() attempting to output other than a Register or Constant"); 2513 } 2514 } 2515 2516 // Similar to "int_format" but for cases where data is external to operand 2517 // external access to reg# node->in(idx)->_idx, 2518 void OperandForm::ext_format(FILE *fp, FormDict &globals, uint index) { 2519 Form::DataType dtype; 2520 if (_matrule && (_matrule->is_base_register(globals) || 2521 strcmp(ideal_type(globalAD->globalNames()), "RegFlags") == 0)) { 2522 fprintf(fp," { char reg_str[128];\n"); 2523 fprintf(fp," ra->dump_register(node->in(idx"); 2524 if ( index != 0 ) fprintf(fp, "+%d",index); 2525 fprintf(fp, "),reg_str);\n"); 2526 fprintf(fp," st->print(\"%cs\",reg_str);\n",'%'); 2527 fprintf(fp," }\n"); 2528 } else if (_matrule && (dtype = _matrule->is_base_constant(globals)) != Form::none) { 2529 format_constant( fp, index, dtype ); 2530 } else if (ideal_to_sReg_type(_ident) != Form::none) { 2531 // Special format for Stack Slot Register 2532 fprintf(fp," { char reg_str[128];\n"); 2533 fprintf(fp," ra->dump_register(node->in(idx"); 2534 if ( index != 0 ) fprintf(fp, "+%d",index); 2535 fprintf(fp, "),reg_str);\n"); 2536 fprintf(fp," st->print(\"%cs\",reg_str);\n",'%'); 2537 fprintf(fp," }\n"); 2538 } else { 2539 fprintf(fp," st->print(\"No format defined for %s\n\");\n", _ident); 2540 assert( false,"Internal error:\n output_external_operand() attempting to output other than a Register or Constant"); 2541 } 2542 } 2543 2544 void OperandForm::format_constant(FILE *fp, uint const_index, uint const_type) { 2545 switch(const_type) { 2546 case Form::idealI: fprintf(fp," st->print(\"#%%d\", _c%d);\n", const_index); break; 2547 case Form::idealP: fprintf(fp," if (_c%d) _c%d->dump_on(st);\n", const_index, const_index); break; 2548 case Form::idealNKlass: 2549 case Form::idealN: fprintf(fp," if (_c%d) _c%d->dump_on(st);\n", const_index, const_index); break; 2550 case Form::idealL: fprintf(fp," st->print(\"#\" INT64_FORMAT, (int64_t)_c%d);\n", const_index); break; 2551 case Form::idealF: fprintf(fp," st->print(\"#%%f\", _c%d);\n", const_index); break; 2552 case Form::idealD: fprintf(fp," st->print(\"#%%f\", _c%d);\n", const_index); break; 2553 default: 2554 assert( false, "ShouldNotReachHere()"); 2555 } 2556 } 2557 2558 // Return the operand form corresponding to the given index, else NULL. 2559 OperandForm *OperandForm::constant_operand(FormDict &globals, 2560 uint index) { 2561 // !!!!! 2562 // Check behavior on complex operands 2563 uint n_consts = num_consts(globals); 2564 if( n_consts > 0 ) { 2565 uint i = 0; 2566 const char *type; 2567 Component *comp; 2568 _components.reset(); 2569 if ((comp = _components.iter()) == NULL) { 2570 assert(n_consts == 1, "Bad component list detected.\n"); 2571 // Current operand is THE operand 2572 if ( index == 0 ) { 2573 return this; 2574 } 2575 } // end if NULL 2576 else { 2577 // Skip the first component, it can not be a DEF of a constant 2578 do { 2579 type = comp->base_type(globals); 2580 // Check that "type" is a 'ConI', 'ConP', ... 2581 if ( ideal_to_const_type(type) != Form::none ) { 2582 // When at correct component, get corresponding Operand 2583 if ( index == 0 ) { 2584 return globals[comp->_type]->is_operand(); 2585 } 2586 // Decrement number of constants to go 2587 --index; 2588 } 2589 } while((comp = _components.iter()) != NULL); 2590 } 2591 } 2592 2593 // Did not find a constant for this index. 2594 return NULL; 2595 } 2596 2597 // If this operand has a single ideal type, return its type 2598 Form::DataType OperandForm::simple_type(FormDict &globals) const { 2599 const char *type_name = ideal_type(globals); 2600 Form::DataType type = type_name ? ideal_to_const_type( type_name ) 2601 : Form::none; 2602 return type; 2603 } 2604 2605 Form::DataType OperandForm::is_base_constant(FormDict &globals) const { 2606 if ( _matrule == NULL ) return Form::none; 2607 2608 return _matrule->is_base_constant(globals); 2609 } 2610 2611 // "true" if this operand is a simple type that is swallowed 2612 bool OperandForm::swallowed(FormDict &globals) const { 2613 Form::DataType type = simple_type(globals); 2614 if( type != Form::none ) { 2615 return true; 2616 } 2617 2618 return false; 2619 } 2620 2621 // Output code to access the value of the index'th constant 2622 void OperandForm::access_constant(FILE *fp, FormDict &globals, 2623 uint const_index) { 2624 OperandForm *oper = constant_operand(globals, const_index); 2625 assert( oper, "Index exceeds number of constants in operand"); 2626 Form::DataType dtype = oper->is_base_constant(globals); 2627 2628 switch(dtype) { 2629 case idealI: fprintf(fp,"_c%d", const_index); break; 2630 case idealP: fprintf(fp,"_c%d->get_con()",const_index); break; 2631 case idealL: fprintf(fp,"_c%d", const_index); break; 2632 case idealF: fprintf(fp,"_c%d", const_index); break; 2633 case idealD: fprintf(fp,"_c%d", const_index); break; 2634 default: 2635 assert( false, "ShouldNotReachHere()"); 2636 } 2637 } 2638 2639 2640 void OperandForm::dump() { 2641 output(stderr); 2642 } 2643 2644 void OperandForm::output(FILE *fp) { 2645 fprintf(fp,"\nOperand: %s\n", (_ident?_ident:"")); 2646 if (_matrule) _matrule->dump(); 2647 if (_interface) _interface->dump(); 2648 if (_attribs) _attribs->dump(); 2649 if (_predicate) _predicate->dump(); 2650 if (_constraint) _constraint->dump(); 2651 if (_construct) _construct->dump(); 2652 if (_format) _format->dump(); 2653 } 2654 2655 //------------------------------Constraint------------------------------------- 2656 Constraint::Constraint(const char *func, const char *arg) 2657 : _func(func), _arg(arg) { 2658 } 2659 Constraint::~Constraint() { /* not owner of char* */ 2660 } 2661 2662 bool Constraint::stack_slots_only() const { 2663 return strcmp(_func, "ALLOC_IN_RC") == 0 2664 && strcmp(_arg, "stack_slots") == 0; 2665 } 2666 2667 void Constraint::dump() { 2668 output(stderr); 2669 } 2670 2671 void Constraint::output(FILE *fp) { // Write info to output files 2672 assert((_func != NULL && _arg != NULL),"missing constraint function or arg"); 2673 fprintf(fp,"Constraint: %s ( %s )\n", _func, _arg); 2674 } 2675 2676 //------------------------------Predicate-------------------------------------- 2677 Predicate::Predicate(char *pr) 2678 : _pred(pr) { 2679 } 2680 Predicate::~Predicate() { 2681 } 2682 2683 void Predicate::dump() { 2684 output(stderr); 2685 } 2686 2687 void Predicate::output(FILE *fp) { 2688 fprintf(fp,"Predicate"); // Write to output files 2689 } 2690 //------------------------------Interface-------------------------------------- 2691 Interface::Interface(const char *name) : _name(name) { 2692 } 2693 Interface::~Interface() { 2694 } 2695 2696 Form::InterfaceType Interface::interface_type(FormDict &globals) const { 2697 Interface *thsi = (Interface*)this; 2698 if ( thsi->is_RegInterface() ) return Form::register_interface; 2699 if ( thsi->is_MemInterface() ) return Form::memory_interface; 2700 if ( thsi->is_ConstInterface() ) return Form::constant_interface; 2701 if ( thsi->is_CondInterface() ) return Form::conditional_interface; 2702 2703 return Form::no_interface; 2704 } 2705 2706 RegInterface *Interface::is_RegInterface() { 2707 if ( strcmp(_name,"REG_INTER") != 0 ) 2708 return NULL; 2709 return (RegInterface*)this; 2710 } 2711 MemInterface *Interface::is_MemInterface() { 2712 if ( strcmp(_name,"MEMORY_INTER") != 0 ) return NULL; 2713 return (MemInterface*)this; 2714 } 2715 ConstInterface *Interface::is_ConstInterface() { 2716 if ( strcmp(_name,"CONST_INTER") != 0 ) return NULL; 2717 return (ConstInterface*)this; 2718 } 2719 CondInterface *Interface::is_CondInterface() { 2720 if ( strcmp(_name,"COND_INTER") != 0 ) return NULL; 2721 return (CondInterface*)this; 2722 } 2723 2724 2725 void Interface::dump() { 2726 output(stderr); 2727 } 2728 2729 // Write info to output files 2730 void Interface::output(FILE *fp) { 2731 fprintf(fp,"Interface: %s\n", (_name ? _name : "") ); 2732 } 2733 2734 //------------------------------RegInterface----------------------------------- 2735 RegInterface::RegInterface() : Interface("REG_INTER") { 2736 } 2737 RegInterface::~RegInterface() { 2738 } 2739 2740 void RegInterface::dump() { 2741 output(stderr); 2742 } 2743 2744 // Write info to output files 2745 void RegInterface::output(FILE *fp) { 2746 Interface::output(fp); 2747 } 2748 2749 //------------------------------ConstInterface--------------------------------- 2750 ConstInterface::ConstInterface() : Interface("CONST_INTER") { 2751 } 2752 ConstInterface::~ConstInterface() { 2753 } 2754 2755 void ConstInterface::dump() { 2756 output(stderr); 2757 } 2758 2759 // Write info to output files 2760 void ConstInterface::output(FILE *fp) { 2761 Interface::output(fp); 2762 } 2763 2764 //------------------------------MemInterface----------------------------------- 2765 MemInterface::MemInterface(char *base, char *index, char *scale, char *disp) 2766 : Interface("MEMORY_INTER"), _base(base), _index(index), _scale(scale), _disp(disp) { 2767 } 2768 MemInterface::~MemInterface() { 2769 // not owner of any character arrays 2770 } 2771 2772 void MemInterface::dump() { 2773 output(stderr); 2774 } 2775 2776 // Write info to output files 2777 void MemInterface::output(FILE *fp) { 2778 Interface::output(fp); 2779 if ( _base != NULL ) fprintf(fp," base == %s\n", _base); 2780 if ( _index != NULL ) fprintf(fp," index == %s\n", _index); 2781 if ( _scale != NULL ) fprintf(fp," scale == %s\n", _scale); 2782 if ( _disp != NULL ) fprintf(fp," disp == %s\n", _disp); 2783 // fprintf(fp,"\n"); 2784 } 2785 2786 //------------------------------CondInterface---------------------------------- 2787 CondInterface::CondInterface(const char* equal, const char* equal_format, 2788 const char* not_equal, const char* not_equal_format, 2789 const char* less, const char* less_format, 2790 const char* greater_equal, const char* greater_equal_format, 2791 const char* less_equal, const char* less_equal_format, 2792 const char* greater, const char* greater_format, 2793 const char* overflow, const char* overflow_format, 2794 const char* no_overflow, const char* no_overflow_format) 2795 : Interface("COND_INTER"), 2796 _equal(equal), _equal_format(equal_format), 2797 _not_equal(not_equal), _not_equal_format(not_equal_format), 2798 _less(less), _less_format(less_format), 2799 _greater_equal(greater_equal), _greater_equal_format(greater_equal_format), 2800 _less_equal(less_equal), _less_equal_format(less_equal_format), 2801 _greater(greater), _greater_format(greater_format), 2802 _overflow(overflow), _overflow_format(overflow_format), 2803 _no_overflow(no_overflow), _no_overflow_format(no_overflow_format) { 2804 } 2805 CondInterface::~CondInterface() { 2806 // not owner of any character arrays 2807 } 2808 2809 void CondInterface::dump() { 2810 output(stderr); 2811 } 2812 2813 // Write info to output files 2814 void CondInterface::output(FILE *fp) { 2815 Interface::output(fp); 2816 if ( _equal != NULL ) fprintf(fp," equal == %s\n", _equal); 2817 if ( _not_equal != NULL ) fprintf(fp," not_equal == %s\n", _not_equal); 2818 if ( _less != NULL ) fprintf(fp," less == %s\n", _less); 2819 if ( _greater_equal != NULL ) fprintf(fp," greater_equal == %s\n", _greater_equal); 2820 if ( _less_equal != NULL ) fprintf(fp," less_equal == %s\n", _less_equal); 2821 if ( _greater != NULL ) fprintf(fp," greater == %s\n", _greater); 2822 if ( _overflow != NULL ) fprintf(fp," overflow == %s\n", _overflow); 2823 if ( _no_overflow != NULL ) fprintf(fp," no_overflow == %s\n", _no_overflow); 2824 // fprintf(fp,"\n"); 2825 } 2826 2827 //------------------------------ConstructRule---------------------------------- 2828 ConstructRule::ConstructRule(char *cnstr) 2829 : _construct(cnstr) { 2830 } 2831 ConstructRule::~ConstructRule() { 2832 } 2833 2834 void ConstructRule::dump() { 2835 output(stderr); 2836 } 2837 2838 void ConstructRule::output(FILE *fp) { 2839 fprintf(fp,"\nConstruct Rule\n"); // Write to output files 2840 } 2841 2842 2843 //==============================Shared Forms=================================== 2844 //------------------------------AttributeForm---------------------------------- 2845 int AttributeForm::_insId = 0; // start counter at 0 2846 int AttributeForm::_opId = 0; // start counter at 0 2847 const char* AttributeForm::_ins_cost = "ins_cost"; // required name 2848 const char* AttributeForm::_op_cost = "op_cost"; // required name 2849 2850 AttributeForm::AttributeForm(char *attr, int type, char *attrdef) 2851 : Form(Form::ATTR), _attrname(attr), _atype(type), _attrdef(attrdef) { 2852 if (type==OP_ATTR) { 2853 id = ++_opId; 2854 } 2855 else if (type==INS_ATTR) { 2856 id = ++_insId; 2857 } 2858 else assert( false,""); 2859 } 2860 AttributeForm::~AttributeForm() { 2861 } 2862 2863 // Dynamic type check 2864 AttributeForm *AttributeForm::is_attribute() const { 2865 return (AttributeForm*)this; 2866 } 2867 2868 2869 // inlined // int AttributeForm::type() { return id;} 2870 2871 void AttributeForm::dump() { 2872 output(stderr); 2873 } 2874 2875 void AttributeForm::output(FILE *fp) { 2876 if( _attrname && _attrdef ) { 2877 fprintf(fp,"\n// AttributeForm \nstatic const int %s = %s;\n", 2878 _attrname, _attrdef); 2879 } 2880 else { 2881 fprintf(fp,"\n// AttributeForm missing name %s or definition %s\n", 2882 (_attrname?_attrname:""), (_attrdef?_attrdef:"") ); 2883 } 2884 } 2885 2886 //------------------------------Component-------------------------------------- 2887 Component::Component(const char *name, const char *type, int usedef) 2888 : _name(name), _type(type), _usedef(usedef) { 2889 _ftype = Form::COMP; 2890 } 2891 Component::~Component() { 2892 } 2893 2894 // True if this component is equal to the parameter. 2895 bool Component::is(int use_def_kill_enum) const { 2896 return (_usedef == use_def_kill_enum ? true : false); 2897 } 2898 // True if this component is used/def'd/kill'd as the parameter suggests. 2899 bool Component::isa(int use_def_kill_enum) const { 2900 return (_usedef & use_def_kill_enum) == use_def_kill_enum; 2901 } 2902 2903 // Extend this component with additional use/def/kill behavior 2904 int Component::promote_use_def_info(int new_use_def) { 2905 _usedef |= new_use_def; 2906 2907 return _usedef; 2908 } 2909 2910 // Check the base type of this component, if it has one 2911 const char *Component::base_type(FormDict &globals) { 2912 const Form *frm = globals[_type]; 2913 if (frm == NULL) return NULL; 2914 OperandForm *op = frm->is_operand(); 2915 if (op == NULL) return NULL; 2916 if (op->ideal_only()) return op->_ident; 2917 return (char *)op->ideal_type(globals); 2918 } 2919 2920 void Component::dump() { 2921 output(stderr); 2922 } 2923 2924 void Component::output(FILE *fp) { 2925 fprintf(fp,"Component:"); // Write to output files 2926 fprintf(fp, " name = %s", _name); 2927 fprintf(fp, ", type = %s", _type); 2928 assert(_usedef != 0, "unknown effect"); 2929 fprintf(fp, ", use/def = %s\n", getUsedefName()); 2930 } 2931 2932 2933 //------------------------------ComponentList--------------------------------- 2934 ComponentList::ComponentList() : NameList(), _matchcnt(0) { 2935 } 2936 ComponentList::~ComponentList() { 2937 // // This list may not own its elements if copied via assignment 2938 // Component *component; 2939 // for (reset(); (component = iter()) != NULL;) { 2940 // delete component; 2941 // } 2942 } 2943 2944 void ComponentList::insert(Component *component, bool mflag) { 2945 NameList::addName((char *)component); 2946 if(mflag) _matchcnt++; 2947 } 2948 void ComponentList::insert(const char *name, const char *opType, int usedef, 2949 bool mflag) { 2950 Component * component = new Component(name, opType, usedef); 2951 insert(component, mflag); 2952 } 2953 Component *ComponentList::current() { return (Component*)NameList::current(); } 2954 Component *ComponentList::iter() { return (Component*)NameList::iter(); } 2955 Component *ComponentList::match_iter() { 2956 if(_iter < _matchcnt) return (Component*)NameList::iter(); 2957 return NULL; 2958 } 2959 Component *ComponentList::post_match_iter() { 2960 Component *comp = iter(); 2961 // At end of list? 2962 if ( comp == NULL ) { 2963 return comp; 2964 } 2965 // In post-match components? 2966 if (_iter > match_count()-1) { 2967 return comp; 2968 } 2969 2970 return post_match_iter(); 2971 } 2972 2973 void ComponentList::reset() { NameList::reset(); } 2974 int ComponentList::count() { return NameList::count(); } 2975 2976 Component *ComponentList::operator[](int position) { 2977 // Shortcut complete iteration if there are not enough entries 2978 if (position >= count()) return NULL; 2979 2980 int index = 0; 2981 Component *component = NULL; 2982 for (reset(); (component = iter()) != NULL;) { 2983 if (index == position) { 2984 return component; 2985 } 2986 ++index; 2987 } 2988 2989 return NULL; 2990 } 2991 2992 const Component *ComponentList::search(const char *name) { 2993 PreserveIter pi(this); 2994 reset(); 2995 for( Component *comp = NULL; ((comp = iter()) != NULL); ) { 2996 if( strcmp(comp->_name,name) == 0 ) return comp; 2997 } 2998 2999 return NULL; 3000 } 3001 3002 // Return number of USEs + number of DEFs 3003 // When there are no components, or the first component is a USE, 3004 // then we add '1' to hold a space for the 'result' operand. 3005 int ComponentList::num_operands() { 3006 PreserveIter pi(this); 3007 uint count = 1; // result operand 3008 uint position = 0; 3009 3010 Component *component = NULL; 3011 for( reset(); (component = iter()) != NULL; ++position ) { 3012 if( component->isa(Component::USE) || 3013 ( position == 0 && (! component->isa(Component::DEF))) ) { 3014 ++count; 3015 } 3016 } 3017 3018 return count; 3019 } 3020 3021 // Return zero-based position of operand 'name' in list; -1 if not in list. 3022 // if parameter 'usedef' is ::USE, it will match USE, USE_DEF, ... 3023 int ComponentList::operand_position(const char *name, int usedef, Form *fm) { 3024 PreserveIter pi(this); 3025 int position = 0; 3026 int num_opnds = num_operands(); 3027 Component *component; 3028 Component* preceding_non_use = NULL; 3029 Component* first_def = NULL; 3030 for (reset(); (component = iter()) != NULL; ++position) { 3031 // When the first component is not a DEF, 3032 // leave space for the result operand! 3033 if ( position==0 && (! component->isa(Component::DEF)) ) { 3034 ++position; 3035 ++num_opnds; 3036 } 3037 if (strcmp(name, component->_name)==0 && (component->isa(usedef))) { 3038 // When the first entry in the component list is a DEF and a USE 3039 // Treat them as being separate, a DEF first, then a USE 3040 if( position==0 3041 && usedef==Component::USE && component->isa(Component::DEF) ) { 3042 assert(position+1 < num_opnds, "advertised index in bounds"); 3043 return position+1; 3044 } else { 3045 if( preceding_non_use && strcmp(component->_name, preceding_non_use->_name) ) { 3046 fprintf(stderr, "the name '%s(%s)' should not precede the name '%s(%s)'", 3047 preceding_non_use->_name, preceding_non_use->getUsedefName(), 3048 name, component->getUsedefName()); 3049 if (fm && fm->is_instruction()) fprintf(stderr, "in form '%s'", fm->is_instruction()->_ident); 3050 if (fm && fm->is_operand()) fprintf(stderr, "in form '%s'", fm->is_operand()->_ident); 3051 fprintf(stderr, "\n"); 3052 } 3053 if( position >= num_opnds ) { 3054 fprintf(stderr, "the name '%s' is too late in its name list", name); 3055 if (fm && fm->is_instruction()) fprintf(stderr, "in form '%s'", fm->is_instruction()->_ident); 3056 if (fm && fm->is_operand()) fprintf(stderr, "in form '%s'", fm->is_operand()->_ident); 3057 fprintf(stderr, "\n"); 3058 } 3059 assert(position < num_opnds, "advertised index in bounds"); 3060 return position; 3061 } 3062 } 3063 if( component->isa(Component::DEF) 3064 && component->isa(Component::USE) ) { 3065 ++position; 3066 if( position != 1 ) --position; // only use two slots for the 1st USE_DEF 3067 } 3068 if( component->isa(Component::DEF) && !first_def ) { 3069 first_def = component; 3070 } 3071 if( !component->isa(Component::USE) && component != first_def ) { 3072 preceding_non_use = component; 3073 } else if( preceding_non_use && !strcmp(component->_name, preceding_non_use->_name) ) { 3074 preceding_non_use = NULL; 3075 } 3076 } 3077 return Not_in_list; 3078 } 3079 3080 // Find position for this name, regardless of use/def information 3081 int ComponentList::operand_position(const char *name) { 3082 PreserveIter pi(this); 3083 int position = 0; 3084 Component *component; 3085 for (reset(); (component = iter()) != NULL; ++position) { 3086 // When the first component is not a DEF, 3087 // leave space for the result operand! 3088 if ( position==0 && (! component->isa(Component::DEF)) ) { 3089 ++position; 3090 } 3091 if (strcmp(name, component->_name)==0) { 3092 return position; 3093 } 3094 if( component->isa(Component::DEF) 3095 && component->isa(Component::USE) ) { 3096 ++position; 3097 if( position != 1 ) --position; // only use two slots for the 1st USE_DEF 3098 } 3099 } 3100 return Not_in_list; 3101 } 3102 3103 int ComponentList::operand_position_format(const char *name, Form *fm) { 3104 PreserveIter pi(this); 3105 int first_position = operand_position(name); 3106 int use_position = operand_position(name, Component::USE, fm); 3107 3108 return ((first_position < use_position) ? use_position : first_position); 3109 } 3110 3111 int ComponentList::label_position() { 3112 PreserveIter pi(this); 3113 int position = 0; 3114 reset(); 3115 for( Component *comp; (comp = iter()) != NULL; ++position) { 3116 // When the first component is not a DEF, 3117 // leave space for the result operand! 3118 if ( position==0 && (! comp->isa(Component::DEF)) ) { 3119 ++position; 3120 } 3121 if (strcmp(comp->_type, "label")==0) { 3122 return position; 3123 } 3124 if( comp->isa(Component::DEF) 3125 && comp->isa(Component::USE) ) { 3126 ++position; 3127 if( position != 1 ) --position; // only use two slots for the 1st USE_DEF 3128 } 3129 } 3130 3131 return -1; 3132 } 3133 3134 int ComponentList::method_position() { 3135 PreserveIter pi(this); 3136 int position = 0; 3137 reset(); 3138 for( Component *comp; (comp = iter()) != NULL; ++position) { 3139 // When the first component is not a DEF, 3140 // leave space for the result operand! 3141 if ( position==0 && (! comp->isa(Component::DEF)) ) { 3142 ++position; 3143 } 3144 if (strcmp(comp->_type, "method")==0) { 3145 return position; 3146 } 3147 if( comp->isa(Component::DEF) 3148 && comp->isa(Component::USE) ) { 3149 ++position; 3150 if( position != 1 ) --position; // only use two slots for the 1st USE_DEF 3151 } 3152 } 3153 3154 return -1; 3155 } 3156 3157 void ComponentList::dump() { output(stderr); } 3158 3159 void ComponentList::output(FILE *fp) { 3160 PreserveIter pi(this); 3161 fprintf(fp, "\n"); 3162 Component *component; 3163 for (reset(); (component = iter()) != NULL;) { 3164 component->output(fp); 3165 } 3166 fprintf(fp, "\n"); 3167 } 3168 3169 //------------------------------MatchNode-------------------------------------- 3170 MatchNode::MatchNode(ArchDesc &ad, const char *result, const char *mexpr, 3171 const char *opType, MatchNode *lChild, MatchNode *rChild) 3172 : _AD(ad), _result(result), _name(mexpr), _opType(opType), 3173 _lChild(lChild), _rChild(rChild), _internalop(0), _numleaves(0), 3174 _commutative_id(0) { 3175 _numleaves = (lChild ? lChild->_numleaves : 0) 3176 + (rChild ? rChild->_numleaves : 0); 3177 } 3178 3179 MatchNode::MatchNode(ArchDesc &ad, MatchNode& mnode) 3180 : _AD(ad), _result(mnode._result), _name(mnode._name), 3181 _opType(mnode._opType), _lChild(mnode._lChild), _rChild(mnode._rChild), 3182 _internalop(0), _numleaves(mnode._numleaves), 3183 _commutative_id(mnode._commutative_id) { 3184 } 3185 3186 MatchNode::MatchNode(ArchDesc &ad, MatchNode& mnode, int clone) 3187 : _AD(ad), _result(mnode._result), _name(mnode._name), 3188 _opType(mnode._opType), 3189 _internalop(0), _numleaves(mnode._numleaves), 3190 _commutative_id(mnode._commutative_id) { 3191 if (mnode._lChild) { 3192 _lChild = new MatchNode(ad, *mnode._lChild, clone); 3193 } else { 3194 _lChild = NULL; 3195 } 3196 if (mnode._rChild) { 3197 _rChild = new MatchNode(ad, *mnode._rChild, clone); 3198 } else { 3199 _rChild = NULL; 3200 } 3201 } 3202 3203 MatchNode::~MatchNode() { 3204 // // This node may not own its children if copied via assignment 3205 // if( _lChild ) delete _lChild; 3206 // if( _rChild ) delete _rChild; 3207 } 3208 3209 bool MatchNode::find_type(const char *type, int &position) const { 3210 if ( (_lChild != NULL) && (_lChild->find_type(type, position)) ) return true; 3211 if ( (_rChild != NULL) && (_rChild->find_type(type, position)) ) return true; 3212 3213 if (strcmp(type,_opType)==0) { 3214 return true; 3215 } else { 3216 ++position; 3217 } 3218 return false; 3219 } 3220 3221 // Recursive call collecting info on top-level operands, not transitive. 3222 // Implementation does not modify state of internal structures. 3223 void MatchNode::append_components(FormDict& locals, ComponentList& components, 3224 bool def_flag) const { 3225 int usedef = def_flag ? Component::DEF : Component::USE; 3226 FormDict &globals = _AD.globalNames(); 3227 3228 assert (_name != NULL, "MatchNode::build_components encountered empty node\n"); 3229 // Base case 3230 if (_lChild==NULL && _rChild==NULL) { 3231 // If _opType is not an operation, do not build a component for it ##### 3232 const Form *f = globals[_opType]; 3233 if( f != NULL ) { 3234 // Add non-ideals that are operands, operand-classes, 3235 if( ! f->ideal_only() 3236 && (f->is_opclass() || f->is_operand()) ) { 3237 components.insert(_name, _opType, usedef, true); 3238 } 3239 } 3240 return; 3241 } 3242 // Promote results of "Set" to DEF 3243 bool tmpdef_flag = (!strcmp(_opType, "Set")) ? true : false; 3244 if (_lChild) _lChild->append_components(locals, components, tmpdef_flag); 3245 tmpdef_flag = false; // only applies to component immediately following 'Set' 3246 if (_rChild) _rChild->append_components(locals, components, tmpdef_flag); 3247 } 3248 3249 // Find the n'th base-operand in the match node, 3250 // recursively investigates match rules of user-defined operands. 3251 // 3252 // Implementation does not modify state of internal structures since they 3253 // can be shared. 3254 bool MatchNode::base_operand(uint &position, FormDict &globals, 3255 const char * &result, const char * &name, 3256 const char * &opType) const { 3257 assert (_name != NULL, "MatchNode::base_operand encountered empty node\n"); 3258 // Base case 3259 if (_lChild==NULL && _rChild==NULL) { 3260 // Check for special case: "Universe", "label" 3261 if (strcmp(_opType,"Universe") == 0 || strcmp(_opType,"label")==0 ) { 3262 if (position == 0) { 3263 result = _result; 3264 name = _name; 3265 opType = _opType; 3266 return 1; 3267 } else { 3268 -- position; 3269 return 0; 3270 } 3271 } 3272 3273 const Form *form = globals[_opType]; 3274 MatchNode *matchNode = NULL; 3275 // Check for user-defined type 3276 if (form) { 3277 // User operand or instruction? 3278 OperandForm *opForm = form->is_operand(); 3279 InstructForm *inForm = form->is_instruction(); 3280 if ( opForm ) { 3281 matchNode = (MatchNode*)opForm->_matrule; 3282 } else if ( inForm ) { 3283 matchNode = (MatchNode*)inForm->_matrule; 3284 } 3285 } 3286 // if this is user-defined, recurse on match rule 3287 // User-defined operand and instruction forms have a match-rule. 3288 if (matchNode) { 3289 return (matchNode->base_operand(position,globals,result,name,opType)); 3290 } else { 3291 // Either not a form, or a system-defined form (no match rule). 3292 if (position==0) { 3293 result = _result; 3294 name = _name; 3295 opType = _opType; 3296 return 1; 3297 } else { 3298 --position; 3299 return 0; 3300 } 3301 } 3302 3303 } else { 3304 // Examine the left child and right child as well 3305 if (_lChild) { 3306 if (_lChild->base_operand(position, globals, result, name, opType)) 3307 return 1; 3308 } 3309 3310 if (_rChild) { 3311 if (_rChild->base_operand(position, globals, result, name, opType)) 3312 return 1; 3313 } 3314 } 3315 3316 return 0; 3317 } 3318 3319 // Recursive call on all operands' match rules in my match rule. 3320 uint MatchNode::num_consts(FormDict &globals) const { 3321 uint index = 0; 3322 uint num_consts = 0; 3323 const char *result; 3324 const char *name; 3325 const char *opType; 3326 3327 for (uint position = index; 3328 base_operand(position,globals,result,name,opType); position = index) { 3329 ++index; 3330 if( ideal_to_const_type(opType) ) num_consts++; 3331 } 3332 3333 return num_consts; 3334 } 3335 3336 // Recursive call on all operands' match rules in my match rule. 3337 // Constants in match rule subtree with specified type 3338 uint MatchNode::num_consts(FormDict &globals, Form::DataType type) const { 3339 uint index = 0; 3340 uint num_consts = 0; 3341 const char *result; 3342 const char *name; 3343 const char *opType; 3344 3345 for (uint position = index; 3346 base_operand(position,globals,result,name,opType); position = index) { 3347 ++index; 3348 if( ideal_to_const_type(opType) == type ) num_consts++; 3349 } 3350 3351 return num_consts; 3352 } 3353 3354 // Recursive call on all operands' match rules in my match rule. 3355 uint MatchNode::num_const_ptrs(FormDict &globals) const { 3356 return num_consts( globals, Form::idealP ); 3357 } 3358 3359 bool MatchNode::sets_result() const { 3360 return ( (strcmp(_name,"Set") == 0) ? true : false ); 3361 } 3362 3363 const char *MatchNode::reduce_right(FormDict &globals) const { 3364 // If there is no right reduction, return NULL. 3365 const char *rightStr = NULL; 3366 3367 // If we are a "Set", start from the right child. 3368 const MatchNode *const mnode = sets_result() ? 3369 (const MatchNode *)this->_rChild : 3370 (const MatchNode *)this; 3371 3372 // If our right child exists, it is the right reduction 3373 if ( mnode->_rChild ) { 3374 rightStr = mnode->_rChild->_internalop ? mnode->_rChild->_internalop 3375 : mnode->_rChild->_opType; 3376 } 3377 // Else, May be simple chain rule: (Set dst operand_form), rightStr=NULL; 3378 return rightStr; 3379 } 3380 3381 const char *MatchNode::reduce_left(FormDict &globals) const { 3382 // If there is no left reduction, return NULL. 3383 const char *leftStr = NULL; 3384 3385 // If we are a "Set", start from the right child. 3386 const MatchNode *const mnode = sets_result() ? 3387 (const MatchNode *)this->_rChild : 3388 (const MatchNode *)this; 3389 3390 // If our left child exists, it is the left reduction 3391 if ( mnode->_lChild ) { 3392 leftStr = mnode->_lChild->_internalop ? mnode->_lChild->_internalop 3393 : mnode->_lChild->_opType; 3394 } else { 3395 // May be simple chain rule: (Set dst operand_form_source) 3396 if ( sets_result() ) { 3397 OperandForm *oper = globals[mnode->_opType]->is_operand(); 3398 if( oper ) { 3399 leftStr = mnode->_opType; 3400 } 3401 } 3402 } 3403 return leftStr; 3404 } 3405 3406 //------------------------------count_instr_names------------------------------ 3407 // Count occurrences of operands names in the leaves of the instruction 3408 // match rule. 3409 void MatchNode::count_instr_names( Dict &names ) { 3410 if( _lChild ) _lChild->count_instr_names(names); 3411 if( _rChild ) _rChild->count_instr_names(names); 3412 if( !_lChild && !_rChild ) { 3413 uintptr_t cnt = (uintptr_t)names[_name]; 3414 cnt++; // One more name found 3415 names.Insert(_name,(void*)cnt); 3416 } 3417 } 3418 3419 //------------------------------build_instr_pred------------------------------- 3420 // Build a path to 'name' in buf. Actually only build if cnt is zero, so we 3421 // can skip some leading instances of 'name'. 3422 int MatchNode::build_instr_pred( char *buf, const char *name, int cnt ) { 3423 if( _lChild ) { 3424 if( !cnt ) strcpy( buf, "_kids[0]->" ); 3425 cnt = _lChild->build_instr_pred( buf+strlen(buf), name, cnt ); 3426 if( cnt < 0 ) return cnt; // Found it, all done 3427 } 3428 if( _rChild ) { 3429 if( !cnt ) strcpy( buf, "_kids[1]->" ); 3430 cnt = _rChild->build_instr_pred( buf+strlen(buf), name, cnt ); 3431 if( cnt < 0 ) return cnt; // Found it, all done 3432 } 3433 if( !_lChild && !_rChild ) { // Found a leaf 3434 // Wrong name? Give up... 3435 if( strcmp(name,_name) ) return cnt; 3436 if( !cnt ) strcpy(buf,"_leaf"); 3437 return cnt-1; 3438 } 3439 return cnt; 3440 } 3441 3442 3443 //------------------------------build_internalop------------------------------- 3444 // Build string representation of subtree 3445 void MatchNode::build_internalop( ) { 3446 char *iop, *subtree; 3447 const char *lstr, *rstr; 3448 // Build string representation of subtree 3449 // Operation lchildType rchildType 3450 int len = (int)strlen(_opType) + 4; 3451 lstr = (_lChild) ? ((_lChild->_internalop) ? 3452 _lChild->_internalop : _lChild->_opType) : ""; 3453 rstr = (_rChild) ? ((_rChild->_internalop) ? 3454 _rChild->_internalop : _rChild->_opType) : ""; 3455 len += (int)strlen(lstr) + (int)strlen(rstr); 3456 subtree = (char *)AllocateHeap(len); 3457 sprintf(subtree,"_%s_%s_%s", _opType, lstr, rstr); 3458 // Hash the subtree string in _internalOps; if a name exists, use it 3459 iop = (char *)_AD._internalOps[subtree]; 3460 // Else create a unique name, and add it to the hash table 3461 if (iop == NULL) { 3462 iop = subtree; 3463 _AD._internalOps.Insert(subtree, iop); 3464 _AD._internalOpNames.addName(iop); 3465 _AD._internalMatch.Insert(iop, this); 3466 } 3467 // Add the internal operand name to the MatchNode 3468 _internalop = iop; 3469 _result = iop; 3470 } 3471 3472 3473 void MatchNode::dump() { 3474 output(stderr); 3475 } 3476 3477 void MatchNode::output(FILE *fp) { 3478 if (_lChild==0 && _rChild==0) { 3479 fprintf(fp," %s",_name); // operand 3480 } 3481 else { 3482 fprintf(fp," (%s ",_name); // " (opcodeName " 3483 if(_lChild) _lChild->output(fp); // left operand 3484 if(_rChild) _rChild->output(fp); // right operand 3485 fprintf(fp,")"); // ")" 3486 } 3487 } 3488 3489 int MatchNode::needs_ideal_memory_edge(FormDict &globals) const { 3490 static const char *needs_ideal_memory_list[] = { 3491 "StoreI","StoreL","StoreP","StoreN","StoreNKlass","StoreD","StoreF" , 3492 "StoreB","StoreC","Store" ,"StoreFP", 3493 "LoadI", "LoadL", "LoadP" ,"LoadN", "LoadD" ,"LoadF" , 3494 "LoadB" , "LoadUB", "LoadUS" ,"LoadS" ,"Load" , 3495 "StoreVector", "LoadVector", 3496 "LoadRange", "LoadKlass", "LoadNKlass", "LoadL_unaligned", "LoadD_unaligned", 3497 "LoadPLocked", 3498 "StorePConditional", "StoreIConditional", "StoreLConditional", 3499 "CompareAndSwapB", "CompareAndSwapS", "CompareAndSwapI", "CompareAndSwapL", "CompareAndSwapP", "CompareAndSwapN", 3500 "WeakCompareAndSwapB", "WeakCompareAndSwapS", "WeakCompareAndSwapI", "WeakCompareAndSwapL", "WeakCompareAndSwapP", "WeakCompareAndSwapN", 3501 "CompareAndExchangeB", "CompareAndExchangeS", "CompareAndExchangeI", "CompareAndExchangeL", "CompareAndExchangeP", "CompareAndExchangeN", 3502 #if INCLUDE_SHENANDOAHGC 3503 "ShenandoahCompareAndSwapN", "ShenandoahCompareAndSwapP", "ShenandoahWeakCompareAndSwapP", "ShenandoahWeakCompareAndSwapN", "ShenandoahCompareAndExchangeP", "ShenandoahCompareAndExchangeN", 3504 #endif 3505 "StoreCM", 3506 "GetAndSetB", "GetAndSetS", "GetAndAddI", "GetAndSetI", "GetAndSetP", 3507 "GetAndAddB", "GetAndAddS", "GetAndAddL", "GetAndSetL", "GetAndSetN", 3508 "ClearArray" 3509 }; 3510 int cnt = sizeof(needs_ideal_memory_list)/sizeof(char*); 3511 if( strcmp(_opType,"PrefetchAllocation")==0 ) 3512 return 1; 3513 if( strcmp(_opType,"CacheWB")==0 ) 3514 return 1; 3515 if( strcmp(_opType,"CacheWBPreSync")==0 ) 3516 return 1; 3517 if( strcmp(_opType,"CacheWBPostSync")==0 ) 3518 return 1; 3519 if( _lChild ) { 3520 const char *opType = _lChild->_opType; 3521 for( int i=0; i<cnt; i++ ) 3522 if( strcmp(opType,needs_ideal_memory_list[i]) == 0 ) 3523 return 1; 3524 if( _lChild->needs_ideal_memory_edge(globals) ) 3525 return 1; 3526 } 3527 if( _rChild ) { 3528 const char *opType = _rChild->_opType; 3529 for( int i=0; i<cnt; i++ ) 3530 if( strcmp(opType,needs_ideal_memory_list[i]) == 0 ) 3531 return 1; 3532 if( _rChild->needs_ideal_memory_edge(globals) ) 3533 return 1; 3534 } 3535 3536 return 0; 3537 } 3538 3539 // TRUE if defines a derived oop, and so needs a base oop edge present 3540 // post-matching. 3541 int MatchNode::needs_base_oop_edge() const { 3542 if( !strcmp(_opType,"AddP") ) return 1; 3543 if( strcmp(_opType,"Set") ) return 0; 3544 return !strcmp(_rChild->_opType,"AddP"); 3545 } 3546 3547 int InstructForm::needs_base_oop_edge(FormDict &globals) const { 3548 if( is_simple_chain_rule(globals) ) { 3549 const char *src = _matrule->_rChild->_opType; 3550 OperandForm *src_op = globals[src]->is_operand(); 3551 assert( src_op, "Not operand class of chain rule" ); 3552 return src_op->_matrule ? src_op->_matrule->needs_base_oop_edge() : 0; 3553 } // Else check instruction 3554 3555 return _matrule ? _matrule->needs_base_oop_edge() : 0; 3556 } 3557 3558 3559 //-------------------------cisc spilling methods------------------------------- 3560 // helper routines and methods for detecting cisc-spilling instructions 3561 //-------------------------cisc_spill_merge------------------------------------ 3562 int MatchNode::cisc_spill_merge(int left_spillable, int right_spillable) { 3563 int cisc_spillable = Maybe_cisc_spillable; 3564 3565 // Combine results of left and right checks 3566 if( (left_spillable == Maybe_cisc_spillable) && (right_spillable == Maybe_cisc_spillable) ) { 3567 // neither side is spillable, nor prevents cisc spilling 3568 cisc_spillable = Maybe_cisc_spillable; 3569 } 3570 else if( (left_spillable == Maybe_cisc_spillable) && (right_spillable > Maybe_cisc_spillable) ) { 3571 // right side is spillable 3572 cisc_spillable = right_spillable; 3573 } 3574 else if( (right_spillable == Maybe_cisc_spillable) && (left_spillable > Maybe_cisc_spillable) ) { 3575 // left side is spillable 3576 cisc_spillable = left_spillable; 3577 } 3578 else if( (left_spillable == Not_cisc_spillable) || (right_spillable == Not_cisc_spillable) ) { 3579 // left or right prevents cisc spilling this instruction 3580 cisc_spillable = Not_cisc_spillable; 3581 } 3582 else { 3583 // Only allow one to spill 3584 cisc_spillable = Not_cisc_spillable; 3585 } 3586 3587 return cisc_spillable; 3588 } 3589 3590 //-------------------------root_ops_match-------------------------------------- 3591 bool static root_ops_match(FormDict &globals, const char *op1, const char *op2) { 3592 // Base Case: check that the current operands/operations match 3593 assert( op1, "Must have op's name"); 3594 assert( op2, "Must have op's name"); 3595 const Form *form1 = globals[op1]; 3596 const Form *form2 = globals[op2]; 3597 3598 return (form1 == form2); 3599 } 3600 3601 //-------------------------cisc_spill_match_node------------------------------- 3602 // Recursively check two MatchRules for legal conversion via cisc-spilling 3603 int MatchNode::cisc_spill_match(FormDict& globals, RegisterForm* registers, MatchNode* mRule2, const char* &operand, const char* ®_type) { 3604 int cisc_spillable = Maybe_cisc_spillable; 3605 int left_spillable = Maybe_cisc_spillable; 3606 int right_spillable = Maybe_cisc_spillable; 3607 3608 // Check that each has same number of operands at this level 3609 if( (_lChild && !(mRule2->_lChild)) || (_rChild && !(mRule2->_rChild)) ) 3610 return Not_cisc_spillable; 3611 3612 // Base Case: check that the current operands/operations match 3613 // or are CISC spillable 3614 assert( _opType, "Must have _opType"); 3615 assert( mRule2->_opType, "Must have _opType"); 3616 const Form *form = globals[_opType]; 3617 const Form *form2 = globals[mRule2->_opType]; 3618 if( form == form2 ) { 3619 cisc_spillable = Maybe_cisc_spillable; 3620 } else { 3621 const InstructForm *form2_inst = form2 ? form2->is_instruction() : NULL; 3622 const char *name_left = mRule2->_lChild ? mRule2->_lChild->_opType : NULL; 3623 const char *name_right = mRule2->_rChild ? mRule2->_rChild->_opType : NULL; 3624 DataType data_type = Form::none; 3625 if (form->is_operand()) { 3626 // Make sure the loadX matches the type of the reg 3627 data_type = form->ideal_to_Reg_type(form->is_operand()->ideal_type(globals)); 3628 } 3629 // Detect reg vs (loadX memory) 3630 if( form->is_cisc_reg(globals) 3631 && form2_inst 3632 && data_type != Form::none 3633 && (is_load_from_memory(mRule2->_opType) == data_type) // reg vs. (load memory) 3634 && (name_left != NULL) // NOT (load) 3635 && (name_right == NULL) ) { // NOT (load memory foo) 3636 const Form *form2_left = globals[name_left]; 3637 if( form2_left && form2_left->is_cisc_mem(globals) ) { 3638 cisc_spillable = Is_cisc_spillable; 3639 operand = _name; 3640 reg_type = _result; 3641 return Is_cisc_spillable; 3642 } else { 3643 cisc_spillable = Not_cisc_spillable; 3644 } 3645 } 3646 // Detect reg vs memory 3647 else if (form->is_cisc_reg(globals) && form2 != NULL && form2->is_cisc_mem(globals)) { 3648 cisc_spillable = Is_cisc_spillable; 3649 operand = _name; 3650 reg_type = _result; 3651 return Is_cisc_spillable; 3652 } else { 3653 cisc_spillable = Not_cisc_spillable; 3654 } 3655 } 3656 3657 // If cisc is still possible, check rest of tree 3658 if( cisc_spillable == Maybe_cisc_spillable ) { 3659 // Check that each has same number of operands at this level 3660 if( (_lChild && !(mRule2->_lChild)) || (_rChild && !(mRule2->_rChild)) ) return Not_cisc_spillable; 3661 3662 // Check left operands 3663 if( (_lChild == NULL) && (mRule2->_lChild == NULL) ) { 3664 left_spillable = Maybe_cisc_spillable; 3665 } else if (_lChild != NULL) { 3666 left_spillable = _lChild->cisc_spill_match(globals, registers, mRule2->_lChild, operand, reg_type); 3667 } 3668 3669 // Check right operands 3670 if( (_rChild == NULL) && (mRule2->_rChild == NULL) ) { 3671 right_spillable = Maybe_cisc_spillable; 3672 } else if (_rChild != NULL) { 3673 right_spillable = _rChild->cisc_spill_match(globals, registers, mRule2->_rChild, operand, reg_type); 3674 } 3675 3676 // Combine results of left and right checks 3677 cisc_spillable = cisc_spill_merge(left_spillable, right_spillable); 3678 } 3679 3680 return cisc_spillable; 3681 } 3682 3683 //---------------------------cisc_spill_match_rule------------------------------ 3684 // Recursively check two MatchRules for legal conversion via cisc-spilling 3685 // This method handles the root of Match tree, 3686 // general recursive checks done in MatchNode 3687 int MatchRule::matchrule_cisc_spill_match(FormDict& globals, RegisterForm* registers, 3688 MatchRule* mRule2, const char* &operand, 3689 const char* ®_type) { 3690 int cisc_spillable = Maybe_cisc_spillable; 3691 int left_spillable = Maybe_cisc_spillable; 3692 int right_spillable = Maybe_cisc_spillable; 3693 3694 // Check that each sets a result 3695 if( !(sets_result() && mRule2->sets_result()) ) return Not_cisc_spillable; 3696 // Check that each has same number of operands at this level 3697 if( (_lChild && !(mRule2->_lChild)) || (_rChild && !(mRule2->_rChild)) ) return Not_cisc_spillable; 3698 3699 // Check left operands: at root, must be target of 'Set' 3700 if( (_lChild == NULL) || (mRule2->_lChild == NULL) ) { 3701 left_spillable = Not_cisc_spillable; 3702 } else { 3703 // Do not support cisc-spilling instruction's target location 3704 if( root_ops_match(globals, _lChild->_opType, mRule2->_lChild->_opType) ) { 3705 left_spillable = Maybe_cisc_spillable; 3706 } else { 3707 left_spillable = Not_cisc_spillable; 3708 } 3709 } 3710 3711 // Check right operands: recursive walk to identify reg->mem operand 3712 if (_rChild == NULL) { 3713 if (mRule2->_rChild == NULL) { 3714 right_spillable = Maybe_cisc_spillable; 3715 } else { 3716 assert(0, "_rChild should not be NULL"); 3717 } 3718 } else { 3719 right_spillable = _rChild->cisc_spill_match(globals, registers, mRule2->_rChild, operand, reg_type); 3720 } 3721 3722 // Combine results of left and right checks 3723 cisc_spillable = cisc_spill_merge(left_spillable, right_spillable); 3724 3725 return cisc_spillable; 3726 } 3727 3728 //----------------------------- equivalent ------------------------------------ 3729 // Recursively check to see if two match rules are equivalent. 3730 // This rule handles the root. 3731 bool MatchRule::equivalent(FormDict &globals, MatchNode *mRule2) { 3732 // Check that each sets a result 3733 if (sets_result() != mRule2->sets_result()) { 3734 return false; 3735 } 3736 3737 // Check that the current operands/operations match 3738 assert( _opType, "Must have _opType"); 3739 assert( mRule2->_opType, "Must have _opType"); 3740 const Form *form = globals[_opType]; 3741 const Form *form2 = globals[mRule2->_opType]; 3742 if( form != form2 ) { 3743 return false; 3744 } 3745 3746 if (_lChild ) { 3747 if( !_lChild->equivalent(globals, mRule2->_lChild) ) 3748 return false; 3749 } else if (mRule2->_lChild) { 3750 return false; // I have NULL left child, mRule2 has non-NULL left child. 3751 } 3752 3753 if (_rChild ) { 3754 if( !_rChild->equivalent(globals, mRule2->_rChild) ) 3755 return false; 3756 } else if (mRule2->_rChild) { 3757 return false; // I have NULL right child, mRule2 has non-NULL right child. 3758 } 3759 3760 // We've made it through the gauntlet. 3761 return true; 3762 } 3763 3764 //----------------------------- equivalent ------------------------------------ 3765 // Recursively check to see if two match rules are equivalent. 3766 // This rule handles the operands. 3767 bool MatchNode::equivalent(FormDict &globals, MatchNode *mNode2) { 3768 if( !mNode2 ) 3769 return false; 3770 3771 // Check that the current operands/operations match 3772 assert( _opType, "Must have _opType"); 3773 assert( mNode2->_opType, "Must have _opType"); 3774 const Form *form = globals[_opType]; 3775 const Form *form2 = globals[mNode2->_opType]; 3776 if( form != form2 ) { 3777 return false; 3778 } 3779 3780 // Check that their children also match 3781 if (_lChild ) { 3782 if( !_lChild->equivalent(globals, mNode2->_lChild) ) 3783 return false; 3784 } else if (mNode2->_lChild) { 3785 return false; // I have NULL left child, mNode2 has non-NULL left child. 3786 } 3787 3788 if (_rChild ) { 3789 if( !_rChild->equivalent(globals, mNode2->_rChild) ) 3790 return false; 3791 } else if (mNode2->_rChild) { 3792 return false; // I have NULL right child, mNode2 has non-NULL right child. 3793 } 3794 3795 // We've made it through the gauntlet. 3796 return true; 3797 } 3798 3799 //-------------------------- has_commutative_op ------------------------------- 3800 // Recursively check for commutative operations with subtree operands 3801 // which could be swapped. 3802 void MatchNode::count_commutative_op(int& count) { 3803 static const char *commut_op_list[] = { 3804 "AddI","AddL","AddF","AddD", 3805 "AddVB","AddVS","AddVI","AddVL","AddVF","AddVD", 3806 "AndI","AndL", 3807 "AndV", 3808 "MaxI","MinI","MaxF","MinF","MaxD","MinD", 3809 "MaxV", "MinV", 3810 "MulI","MulL","MulF","MulD", 3811 "MulVB","MulVS","MulVI","MulVL","MulVF","MulVD", 3812 "OrI","OrL", 3813 "OrV", 3814 "XorI","XorL", 3815 "XorV" 3816 }; 3817 int cnt = sizeof(commut_op_list)/sizeof(char*); 3818 3819 if( _lChild && _rChild && (_lChild->_lChild || _rChild->_lChild) ) { 3820 // Don't swap if right operand is an immediate constant. 3821 bool is_const = false; 3822 if( _rChild->_lChild == NULL && _rChild->_rChild == NULL ) { 3823 FormDict &globals = _AD.globalNames(); 3824 const Form *form = globals[_rChild->_opType]; 3825 if ( form ) { 3826 OperandForm *oper = form->is_operand(); 3827 if( oper && oper->interface_type(globals) == Form::constant_interface ) 3828 is_const = true; 3829 } 3830 } 3831 if( !is_const ) { 3832 for( int i=0; i<cnt; i++ ) { 3833 if( strcmp(_opType, commut_op_list[i]) == 0 ) { 3834 count++; 3835 _commutative_id = count; // id should be > 0 3836 break; 3837 } 3838 } 3839 } 3840 } 3841 if( _lChild ) 3842 _lChild->count_commutative_op(count); 3843 if( _rChild ) 3844 _rChild->count_commutative_op(count); 3845 } 3846 3847 //-------------------------- swap_commutative_op ------------------------------ 3848 // Recursively swap specified commutative operation with subtree operands. 3849 void MatchNode::swap_commutative_op(bool atroot, int id) { 3850 if( _commutative_id == id ) { // id should be > 0 3851 assert(_lChild && _rChild && (_lChild->_lChild || _rChild->_lChild ), 3852 "not swappable operation"); 3853 MatchNode* tmp = _lChild; 3854 _lChild = _rChild; 3855 _rChild = tmp; 3856 // Don't exit here since we need to build internalop. 3857 } 3858 3859 bool is_set = ( strcmp(_opType, "Set") == 0 ); 3860 if( _lChild ) 3861 _lChild->swap_commutative_op(is_set, id); 3862 if( _rChild ) 3863 _rChild->swap_commutative_op(is_set, id); 3864 3865 // If not the root, reduce this subtree to an internal operand 3866 if( !atroot && (_lChild || _rChild) ) { 3867 build_internalop(); 3868 } 3869 } 3870 3871 //-------------------------- swap_commutative_op ------------------------------ 3872 // Recursively swap specified commutative operation with subtree operands. 3873 void MatchRule::matchrule_swap_commutative_op(const char* instr_ident, int count, int& match_rules_cnt) { 3874 assert(match_rules_cnt < 100," too many match rule clones"); 3875 // Clone 3876 MatchRule* clone = new MatchRule(_AD, this); 3877 // Swap operands of commutative operation 3878 ((MatchNode*)clone)->swap_commutative_op(true, count); 3879 char* buf = (char*) AllocateHeap(strlen(instr_ident) + 4); 3880 sprintf(buf, "%s_%d", instr_ident, match_rules_cnt++); 3881 clone->_result = buf; 3882 3883 clone->_next = this->_next; 3884 this-> _next = clone; 3885 if( (--count) > 0 ) { 3886 this-> matchrule_swap_commutative_op(instr_ident, count, match_rules_cnt); 3887 clone->matchrule_swap_commutative_op(instr_ident, count, match_rules_cnt); 3888 } 3889 } 3890 3891 //------------------------------MatchRule-------------------------------------- 3892 MatchRule::MatchRule(ArchDesc &ad) 3893 : MatchNode(ad), _depth(0), _construct(NULL), _numchilds(0) { 3894 _next = NULL; 3895 } 3896 3897 MatchRule::MatchRule(ArchDesc &ad, MatchRule* mRule) 3898 : MatchNode(ad, *mRule, 0), _depth(mRule->_depth), 3899 _construct(mRule->_construct), _numchilds(mRule->_numchilds) { 3900 _next = NULL; 3901 } 3902 3903 MatchRule::MatchRule(ArchDesc &ad, MatchNode* mroot, int depth, char *cnstr, 3904 int numleaves) 3905 : MatchNode(ad,*mroot), _depth(depth), _construct(cnstr), 3906 _numchilds(0) { 3907 _next = NULL; 3908 mroot->_lChild = NULL; 3909 mroot->_rChild = NULL; 3910 delete mroot; 3911 _numleaves = numleaves; 3912 _numchilds = (_lChild ? 1 : 0) + (_rChild ? 1 : 0); 3913 } 3914 MatchRule::~MatchRule() { 3915 } 3916 3917 // Recursive call collecting info on top-level operands, not transitive. 3918 // Implementation does not modify state of internal structures. 3919 void MatchRule::append_components(FormDict& locals, ComponentList& components, bool def_flag) const { 3920 assert (_name != NULL, "MatchNode::build_components encountered empty node\n"); 3921 3922 MatchNode::append_components(locals, components, 3923 false /* not necessarily a def */); 3924 } 3925 3926 // Recursive call on all operands' match rules in my match rule. 3927 // Implementation does not modify state of internal structures since they 3928 // can be shared. 3929 // The MatchNode that is called first treats its 3930 bool MatchRule::base_operand(uint &position0, FormDict &globals, 3931 const char *&result, const char * &name, 3932 const char * &opType)const{ 3933 uint position = position0; 3934 3935 return (MatchNode::base_operand( position, globals, result, name, opType)); 3936 } 3937 3938 3939 bool MatchRule::is_base_register(FormDict &globals) const { 3940 uint position = 1; 3941 const char *result = NULL; 3942 const char *name = NULL; 3943 const char *opType = NULL; 3944 if (!base_operand(position, globals, result, name, opType)) { 3945 position = 0; 3946 if( base_operand(position, globals, result, name, opType) && 3947 (strcmp(opType,"RegI")==0 || 3948 strcmp(opType,"RegP")==0 || 3949 strcmp(opType,"RegN")==0 || 3950 strcmp(opType,"RegL")==0 || 3951 strcmp(opType,"RegF")==0 || 3952 strcmp(opType,"RegD")==0 || 3953 strcmp(opType,"VecS")==0 || 3954 strcmp(opType,"VecD")==0 || 3955 strcmp(opType,"VecX")==0 || 3956 strcmp(opType,"VecY")==0 || 3957 strcmp(opType,"VecZ")==0 || 3958 strcmp(opType,"Reg" )==0) ) { 3959 return 1; 3960 } 3961 } 3962 return 0; 3963 } 3964 3965 Form::DataType MatchRule::is_base_constant(FormDict &globals) const { 3966 uint position = 1; 3967 const char *result = NULL; 3968 const char *name = NULL; 3969 const char *opType = NULL; 3970 if (!base_operand(position, globals, result, name, opType)) { 3971 position = 0; 3972 if (base_operand(position, globals, result, name, opType)) { 3973 return ideal_to_const_type(opType); 3974 } 3975 } 3976 return Form::none; 3977 } 3978 3979 bool MatchRule::is_chain_rule(FormDict &globals) const { 3980 3981 // Check for chain rule, and do not generate a match list for it 3982 if ((_lChild == NULL) && (_rChild == NULL) ) { 3983 const Form *form = globals[_opType]; 3984 // If this is ideal, then it is a base match, not a chain rule. 3985 if ( form && form->is_operand() && (!form->ideal_only())) { 3986 return true; 3987 } 3988 } 3989 // Check for "Set" form of chain rule, and do not generate a match list 3990 if (_rChild) { 3991 const char *rch = _rChild->_opType; 3992 const Form *form = globals[rch]; 3993 if ((!strcmp(_opType,"Set") && 3994 ((form) && form->is_operand()))) { 3995 return true; 3996 } 3997 } 3998 return false; 3999 } 4000 4001 int MatchRule::is_ideal_copy() const { 4002 if (is_chain_rule(_AD.globalNames()) && 4003 _lChild && strncmp(_lChild->_opType, "stackSlot", 9) == 0) { 4004 return 1; 4005 } 4006 return 0; 4007 } 4008 4009 int MatchRule::is_expensive() const { 4010 if( _rChild ) { 4011 const char *opType = _rChild->_opType; 4012 if( strcmp(opType,"AtanD")==0 || 4013 strcmp(opType,"DivD")==0 || 4014 strcmp(opType,"DivF")==0 || 4015 strcmp(opType,"DivI")==0 || 4016 strcmp(opType,"Log10D")==0 || 4017 strcmp(opType,"ModD")==0 || 4018 strcmp(opType,"ModF")==0 || 4019 strcmp(opType,"ModI")==0 || 4020 strcmp(opType,"SqrtD")==0 || 4021 strcmp(opType,"SqrtF")==0 || 4022 strcmp(opType,"TanD")==0 || 4023 strcmp(opType,"ConvD2F")==0 || 4024 strcmp(opType,"ConvD2I")==0 || 4025 strcmp(opType,"ConvD2L")==0 || 4026 strcmp(opType,"ConvF2D")==0 || 4027 strcmp(opType,"ConvF2I")==0 || 4028 strcmp(opType,"ConvF2L")==0 || 4029 strcmp(opType,"ConvI2D")==0 || 4030 strcmp(opType,"ConvI2F")==0 || 4031 strcmp(opType,"ConvI2L")==0 || 4032 strcmp(opType,"ConvL2D")==0 || 4033 strcmp(opType,"ConvL2F")==0 || 4034 strcmp(opType,"ConvL2I")==0 || 4035 strcmp(opType,"DecodeN")==0 || 4036 strcmp(opType,"EncodeP")==0 || 4037 strcmp(opType,"EncodePKlass")==0 || 4038 strcmp(opType,"DecodeNKlass")==0 || 4039 strcmp(opType,"FmaD") == 0 || 4040 strcmp(opType,"FmaF") == 0 || 4041 strcmp(opType,"RoundDouble")==0 || 4042 strcmp(opType,"RoundDoubleMode")==0 || 4043 strcmp(opType,"RoundFloat")==0 || 4044 strcmp(opType,"ReverseBytesI")==0 || 4045 strcmp(opType,"ReverseBytesL")==0 || 4046 strcmp(opType,"ReverseBytesUS")==0 || 4047 strcmp(opType,"ReverseBytesS")==0 || 4048 strcmp(opType,"ReplicateB")==0 || 4049 strcmp(opType,"ReplicateS")==0 || 4050 strcmp(opType,"ReplicateI")==0 || 4051 strcmp(opType,"ReplicateL")==0 || 4052 strcmp(opType,"ReplicateF")==0 || 4053 strcmp(opType,"ReplicateD")==0 || 4054 strcmp(opType,"AddReductionVI")==0 || 4055 strcmp(opType,"AddReductionVL")==0 || 4056 strcmp(opType,"AddReductionVF")==0 || 4057 strcmp(opType,"AddReductionVD")==0 || 4058 strcmp(opType,"MulReductionVI")==0 || 4059 strcmp(opType,"MulReductionVL")==0 || 4060 strcmp(opType,"MulReductionVF")==0 || 4061 strcmp(opType,"MulReductionVD")==0 || 4062 strcmp(opType,"MinReductionV")==0 || 4063 strcmp(opType,"MaxReductionV")==0 || 4064 strcmp(opType,"AndReductionV")==0 || 4065 strcmp(opType,"OrReductionV")==0 || 4066 strcmp(opType,"XorReductionV")==0 || 4067 0 /* 0 to line up columns nicely */ ) 4068 return 1; 4069 } 4070 return 0; 4071 } 4072 4073 bool MatchRule::is_ideal_if() const { 4074 if( !_opType ) return false; 4075 return 4076 !strcmp(_opType,"If" ) || 4077 !strcmp(_opType,"CountedLoopEnd"); 4078 } 4079 4080 bool MatchRule::is_ideal_fastlock() const { 4081 if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) { 4082 return (strcmp(_rChild->_opType,"FastLock") == 0); 4083 } 4084 return false; 4085 } 4086 4087 bool MatchRule::is_ideal_membar() const { 4088 if( !_opType ) return false; 4089 return 4090 !strcmp(_opType,"MemBarAcquire") || 4091 !strcmp(_opType,"MemBarRelease") || 4092 !strcmp(_opType,"MemBarAcquireLock") || 4093 !strcmp(_opType,"MemBarReleaseLock") || 4094 !strcmp(_opType,"LoadFence" ) || 4095 !strcmp(_opType,"StoreFence") || 4096 !strcmp(_opType,"MemBarVolatile") || 4097 !strcmp(_opType,"MemBarCPUOrder") || 4098 !strcmp(_opType,"MemBarStoreStore") || 4099 !strcmp(_opType,"OnSpinWait"); 4100 } 4101 4102 bool MatchRule::is_ideal_loadPC() const { 4103 if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) { 4104 return (strcmp(_rChild->_opType,"LoadPC") == 0); 4105 } 4106 return false; 4107 } 4108 4109 bool MatchRule::is_ideal_box() const { 4110 if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) { 4111 return (strcmp(_rChild->_opType,"Box") == 0); 4112 } 4113 return false; 4114 } 4115 4116 bool MatchRule::is_ideal_goto() const { 4117 bool ideal_goto = false; 4118 4119 if( _opType && (strcmp(_opType,"Goto") == 0) ) { 4120 ideal_goto = true; 4121 } 4122 return ideal_goto; 4123 } 4124 4125 bool MatchRule::is_ideal_jump() const { 4126 if( _opType ) { 4127 if( !strcmp(_opType,"Jump") ) 4128 return true; 4129 } 4130 return false; 4131 } 4132 4133 bool MatchRule::is_ideal_bool() const { 4134 if( _opType ) { 4135 if( !strcmp(_opType,"Bool") ) 4136 return true; 4137 } 4138 return false; 4139 } 4140 4141 4142 Form::DataType MatchRule::is_ideal_load() const { 4143 Form::DataType ideal_load = Form::none; 4144 4145 if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) { 4146 const char *opType = _rChild->_opType; 4147 ideal_load = is_load_from_memory(opType); 4148 } 4149 4150 return ideal_load; 4151 } 4152 4153 bool MatchRule::is_vector() const { 4154 static const char *vector_list[] = { 4155 "AddVB","AddVS","AddVI","AddVL","AddVF","AddVD", 4156 "SubVB","SubVS","SubVI","SubVL","SubVF","SubVD", 4157 "MulVB","MulVS","MulVI","MulVL","MulVF","MulVD", 4158 "CMoveVD", "CMoveVF", 4159 "DivVF","DivVD", 4160 "AbsVB","AbsVS","AbsVI","AbsVL","AbsVF","AbsVD", 4161 "NegVF","NegVD", 4162 "SqrtVD","SqrtVF", 4163 "AndV" ,"XorV" ,"OrV", 4164 "MaxV", "MinV", 4165 "AddReductionVI", "AddReductionVL", 4166 "AddReductionVF", "AddReductionVD", 4167 "MulReductionVI", "MulReductionVL", 4168 "MulReductionVF", "MulReductionVD", 4169 "MaxReductionV", "MinReductionV", 4170 "AndReductionV", "OrReductionV", "XorReductionV", 4171 "MulAddVS2VI", "MacroLogicV", 4172 "LShiftCntV","RShiftCntV", 4173 "LShiftVB","LShiftVS","LShiftVI","LShiftVL", 4174 "RShiftVB","RShiftVS","RShiftVI","RShiftVL", 4175 "URShiftVB","URShiftVS","URShiftVI","URShiftVL", 4176 "ReplicateB","ReplicateS","ReplicateI","ReplicateL","ReplicateF","ReplicateD", 4177 "RoundDoubleModeV","LoadVector","StoreVector", 4178 "FmaVD", "FmaVF","PopCountVI", 4179 // Next are not supported currently. 4180 "PackB","PackS","PackI","PackL","PackF","PackD","Pack2L","Pack2D", 4181 "ExtractB","ExtractUB","ExtractC","ExtractS","ExtractI","ExtractL","ExtractF","ExtractD" 4182 }; 4183 int cnt = sizeof(vector_list)/sizeof(char*); 4184 if (_rChild) { 4185 const char *opType = _rChild->_opType; 4186 for (int i=0; i<cnt; i++) 4187 if (strcmp(opType,vector_list[i]) == 0) 4188 return true; 4189 } 4190 return false; 4191 } 4192 4193 4194 bool MatchRule::skip_antidep_check() const { 4195 // Some loads operate on what is effectively immutable memory so we 4196 // should skip the anti dep computations. For some of these nodes 4197 // the rewritable field keeps the anti dep logic from triggering but 4198 // for certain kinds of LoadKlass it does not since they are 4199 // actually reading memory which could be rewritten by the runtime, 4200 // though never by generated code. This disables it uniformly for 4201 // the nodes that behave like this: LoadKlass, LoadNKlass and 4202 // LoadRange. 4203 if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) { 4204 const char *opType = _rChild->_opType; 4205 if (strcmp("LoadKlass", opType) == 0 || 4206 strcmp("LoadNKlass", opType) == 0 || 4207 strcmp("LoadRange", opType) == 0) { 4208 return true; 4209 } 4210 } 4211 4212 return false; 4213 } 4214 4215 4216 Form::DataType MatchRule::is_ideal_store() const { 4217 Form::DataType ideal_store = Form::none; 4218 4219 if ( _opType && (strcmp(_opType,"Set") == 0) && _rChild ) { 4220 const char *opType = _rChild->_opType; 4221 ideal_store = is_store_to_memory(opType); 4222 } 4223 4224 return ideal_store; 4225 } 4226 4227 4228 void MatchRule::dump() { 4229 output(stderr); 4230 } 4231 4232 // Write just one line. 4233 void MatchRule::output_short(FILE *fp) { 4234 fprintf(fp,"MatchRule: ( %s",_name); 4235 if (_lChild) _lChild->output(fp); 4236 if (_rChild) _rChild->output(fp); 4237 fprintf(fp," )"); 4238 } 4239 4240 void MatchRule::output(FILE *fp) { 4241 output_short(fp); 4242 fprintf(fp,"\n nesting depth = %d\n", _depth); 4243 if (_result) fprintf(fp," Result Type = %s", _result); 4244 fprintf(fp,"\n"); 4245 } 4246 4247 //------------------------------Attribute-------------------------------------- 4248 Attribute::Attribute(char *id, char* val, int type) 4249 : _ident(id), _val(val), _atype(type) { 4250 } 4251 Attribute::~Attribute() { 4252 } 4253 4254 int Attribute::int_val(ArchDesc &ad) { 4255 // Make sure it is an integer constant: 4256 int result = 0; 4257 if (!_val || !ADLParser::is_int_token(_val, result)) { 4258 ad.syntax_err(0, "Attribute %s must have an integer value: %s", 4259 _ident, _val ? _val : ""); 4260 } 4261 return result; 4262 } 4263 4264 void Attribute::dump() { 4265 output(stderr); 4266 } // Debug printer 4267 4268 // Write to output files 4269 void Attribute::output(FILE *fp) { 4270 fprintf(fp,"Attribute: %s %s\n", (_ident?_ident:""), (_val?_val:"")); 4271 } 4272 4273 //------------------------------FormatRule---------------------------------- 4274 FormatRule::FormatRule(char *temp) 4275 : _temp(temp) { 4276 } 4277 FormatRule::~FormatRule() { 4278 } 4279 4280 void FormatRule::dump() { 4281 output(stderr); 4282 } 4283 4284 // Write to output files 4285 void FormatRule::output(FILE *fp) { 4286 fprintf(fp,"\nFormat Rule: \n%s", (_temp?_temp:"")); 4287 fprintf(fp,"\n"); 4288 }