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