comparison src/share/vm/adlc/output_c.cpp @ 14434:318d0622a6d7

8028580: PPC64 (part 114/120): Support for Call nodes with constants. Summary: extends MachCall nodes so that they can issue constants to the constant table Reviewed-by: kvn
author goetz
date Wed, 20 Nov 2013 11:08:09 -0800
parents 1410ad6b05f1
children 492e67693373
comparison
equal deleted inserted replaced
14433:018b357638aa 14434:318d0622a6d7
1837 } 1837 }
1838 } 1838 }
1839 1839
1840 // If the node is a MachConstantNode, insert the MachConstantBaseNode edge. 1840 // If the node is a MachConstantNode, insert the MachConstantBaseNode edge.
1841 // NOTE: this edge must be the last input (see MachConstantNode::mach_constant_base_node_input). 1841 // NOTE: this edge must be the last input (see MachConstantNode::mach_constant_base_node_input).
1842 if (node->is_mach_constant()) { 1842 // There are nodes that don't use $constantablebase, but still require that it
1843 // is an input to the node. Example: divF_reg_immN, Repl32B_imm on x86_64.
1844 if (node->is_mach_constant() || node->needs_constant_base()) {
1843 fprintf(fp," add_req(C->mach_constant_base_node());\n"); 1845 fprintf(fp," add_req(C->mach_constant_base_node());\n");
1844 } 1846 }
1845 1847
1846 fprintf(fp,"\n"); 1848 fprintf(fp,"\n");
1847 if( node->expands() ) { 1849 if( node->expands() ) {
1950 "'primary', 'secondary' and 'tertiary' don't follow operand."); 1952 "'primary', 'secondary' and 'tertiary' don't follow operand.");
1951 } 1953 }
1952 else if ((strcmp(rep_var, "constanttablebase") == 0) || 1954 else if ((strcmp(rep_var, "constanttablebase") == 0) ||
1953 (strcmp(rep_var, "constantoffset") == 0) || 1955 (strcmp(rep_var, "constantoffset") == 0) ||
1954 (strcmp(rep_var, "constantaddress") == 0)) { 1956 (strcmp(rep_var, "constantaddress") == 0)) {
1955 if (!_inst.is_mach_constant()) { 1957 if (!(_inst.is_mach_constant() || _inst.needs_constant_base())) {
1956 _AD.syntax_err(_encoding._linenum, 1958 _AD.syntax_err(_encoding._linenum,
1957 "Replacement variable %s not allowed in instruct %s (only in MachConstantNode).\n", 1959 "Replacement variable %s not allowed in instruct %s (only in MachConstantNode or MachCall).\n",
1958 rep_var, _encoding._name); 1960 rep_var, _encoding._name);
1959 } 1961 }
1960 } 1962 }
1961 else { 1963 else {
1962 // Lookup its position in (formal) parameter list of encoding 1964 // Lookup its position in (formal) parameter list of encoding
3180 if ( instr->ideal_only() ) continue; 3182 if ( instr->ideal_only() ) continue;
3181 // If there are multiple defs/kills, or an explicit expand rule, build rule 3183 // If there are multiple defs/kills, or an explicit expand rule, build rule
3182 if( instr->expands() || instr->needs_projections() || 3184 if( instr->expands() || instr->needs_projections() ||
3183 instr->has_temps() || 3185 instr->has_temps() ||
3184 instr->is_mach_constant() || 3186 instr->is_mach_constant() ||
3187 instr->needs_constant_base() ||
3185 instr->_matrule != NULL && 3188 instr->_matrule != NULL &&
3186 instr->num_opnds() != instr->num_unique_opnds() ) 3189 instr->num_opnds() != instr->num_unique_opnds() )
3187 defineExpand(_CPP_EXPAND_file._fp, instr); 3190 defineExpand(_CPP_EXPAND_file._fp, instr);
3188 // If there is an explicit peephole rule, build it 3191 // If there is an explicit peephole rule, build it
3189 if ( instr->peepholes() ) 3192 if ( instr->peepholes() )
3952 fprintf(fp_cpp, " );\n"); 3955 fprintf(fp_cpp, " );\n");
3953 // ##### 3956 // #####
3954 } 3957 }
3955 3958
3956 // Fill in the bottom_type where requested 3959 // Fill in the bottom_type where requested
3957 if ( inst->captures_bottom_type(_globalNames) ) { 3960 if (inst->captures_bottom_type(_globalNames)) {
3958 fprintf(fp_cpp, "%s node->_bottom_type = _leaf->bottom_type();\n", indent); 3961 if (strncmp("MachCall", inst->mach_base_class(_globalNames), strlen("MachCall"))) {
3962 fprintf(fp_cpp, "%s node->_bottom_type = _leaf->bottom_type();\n", indent);
3963 }
3959 } 3964 }
3960 if( inst->is_ideal_if() ) { 3965 if( inst->is_ideal_if() ) {
3961 fprintf(fp_cpp, "%s node->_prob = _leaf->as_If()->_prob;\n", indent); 3966 fprintf(fp_cpp, "%s node->_prob = _leaf->as_If()->_prob;\n", indent);
3962 fprintf(fp_cpp, "%s node->_fcnt = _leaf->as_If()->_fcnt;\n", indent); 3967 fprintf(fp_cpp, "%s node->_fcnt = _leaf->as_If()->_fcnt;\n", indent);
3963 } 3968 }