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