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