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