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