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