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