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