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