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