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