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