171 172 // Check if a simple chain rule 173 virtual bool is_simple_chain_rule(FormDict &globals) const; 174 175 // check for structural rematerialization 176 virtual bool rematerialize(FormDict &globals, RegisterForm *registers); 177 178 // loads from memory, so must check for anti-dependence 179 virtual bool needs_anti_dependence_check(FormDict &globals) const; 180 virtual int memory_operand(FormDict &globals) const; 181 bool is_wide_memory_kill(FormDict &globals) const; 182 183 enum memory_operand_type { 184 NO_MEMORY_OPERAND = -1, 185 MANY_MEMORY_OPERANDS = 999999 186 }; 187 188 189 // This instruction captures the machine-independent bottom_type 190 // Expected use is for pointer vs oop determination for LoadP 191 virtual bool captures_bottom_type() const; 192 193 virtual const char *cost(); // Access ins_cost attribute 194 virtual uint num_opnds(); // Count of num_opnds for MachNode class 195 virtual uint num_post_match_opnds(); 196 virtual uint num_consts(FormDict &globals) const;// Constants in match rule 197 // Constants in match rule with specified type 198 virtual uint num_consts(FormDict &globals, Form::DataType type) const; 199 200 // Return the register class associated with 'leaf'. 201 virtual const char *out_reg_class(FormDict &globals); 202 203 // number of ideal node inputs to skip 204 virtual uint oper_input_base(FormDict &globals); 205 206 // Does this instruction need a base-oop edge? 207 int needs_base_oop_edge(FormDict &globals) const; 208 209 // Build instruction predicates. If the user uses the same operand name 210 // twice, we need to check that the operands are pointer-eequivalent in 211 // the DFA during the labeling process. 212 Predicate *build_predicate(); 213 214 virtual void build_components(); // top-level operands 215 // Return zero-based position in component list; -1 if not in list. 216 virtual int operand_position(const char *name, int usedef); 217 virtual int operand_position_format(const char *name); 218 219 // Return zero-based position in component list; -1 if not in list. 220 virtual int label_position(); 221 virtual int method_position(); 222 // Return number of relocation entries needed for this instruction. 223 virtual uint reloc(FormDict &globals); 224 225 const char *reduce_result(); 226 // Return the name of the operand on the right hand side of the binary match 227 // Return NULL if there is no right hand side 228 const char *reduce_right(FormDict &globals) const; 229 const char *reduce_left(FormDict &globals) const; 230 231 // Base class for this instruction, MachNode except for calls 232 virtual const char *mach_base_class() const; 233 234 // Check if this instruction can cisc-spill to 'alternate' 235 bool cisc_spills_to(ArchDesc &AD, InstructForm *alternate); 236 InstructForm *cisc_spill_alternate() { return _cisc_spill_alternate; } 237 uint cisc_spill_operand() const { return _cisc_spill_operand; } 238 bool is_cisc_alternate() const { return _is_cisc_alternate; } 239 void set_cisc_alternate(bool val) { _is_cisc_alternate = val; } 240 const char *cisc_reg_mask_name() const { return _cisc_reg_mask_name; } 241 void set_cisc_reg_mask_name(const char *rm_name) { _cisc_reg_mask_name = rm_name; } 242 // Output cisc-method prototypes and method bodies 243 void declare_cisc_version(ArchDesc &AD, FILE *fp_cpp); 244 bool define_cisc_version (ArchDesc &AD, FILE *fp_cpp); 245 246 bool check_branch_variant(ArchDesc &AD, InstructForm *short_branch); 247 248 bool is_short_branch() { return _is_short_branch; } 249 void set_short_branch(bool val) { _is_short_branch = val; } 250 251 InstructForm *short_branch_form() { return _short_branch_form; } 252 bool has_short_branch_form() { return _short_branch_form != NULL; } 253 // Output short branch prototypes and method bodies 254 void declare_short_branch_methods(FILE *fp_cpp); 255 bool define_short_branch_methods(FILE *fp_cpp); 256 257 uint alignment() { return _alignment; } 258 void set_alignment(uint val) { _alignment = val; } 259 260 // Seach through operands to determine operands unique positions. 261 void set_unique_opnds(); 262 uint num_unique_opnds() { return _num_uniq; } 263 uint unique_opnds_idx(int idx) { 264 if( _uniq_idx != NULL && idx > 0 ) { 265 assert(idx < _uniq_idx_length, "out of bounds"); 266 return _uniq_idx[idx]; 267 } else { 268 return idx; 269 } 270 } 271 272 // Operands which are only KILLs aren't part of the input array and 273 // require special handling in some cases. Their position in this 274 // operand list is higher than the number of unique operands. 275 bool is_noninput_operand(uint idx) { | 171 172 // Check if a simple chain rule 173 virtual bool is_simple_chain_rule(FormDict &globals) const; 174 175 // check for structural rematerialization 176 virtual bool rematerialize(FormDict &globals, RegisterForm *registers); 177 178 // loads from memory, so must check for anti-dependence 179 virtual bool needs_anti_dependence_check(FormDict &globals) const; 180 virtual int memory_operand(FormDict &globals) const; 181 bool is_wide_memory_kill(FormDict &globals) const; 182 183 enum memory_operand_type { 184 NO_MEMORY_OPERAND = -1, 185 MANY_MEMORY_OPERANDS = 999999 186 }; 187 188 189 // This instruction captures the machine-independent bottom_type 190 // Expected use is for pointer vs oop determination for LoadP 191 virtual bool captures_bottom_type(FormDict& globals) const; 192 193 virtual const char *cost(); // Access ins_cost attribute 194 virtual uint num_opnds(); // Count of num_opnds for MachNode class 195 virtual uint num_post_match_opnds(); 196 virtual uint num_consts(FormDict &globals) const;// Constants in match rule 197 // Constants in match rule with specified type 198 virtual uint num_consts(FormDict &globals, Form::DataType type) const; 199 200 // Return the register class associated with 'leaf'. 201 virtual const char *out_reg_class(FormDict &globals); 202 203 // number of ideal node inputs to skip 204 virtual uint oper_input_base(FormDict &globals); 205 206 // Does this instruction need a base-oop edge? 207 int needs_base_oop_edge(FormDict &globals) const; 208 209 // Build instruction predicates. If the user uses the same operand name 210 // twice, we need to check that the operands are pointer-eequivalent in 211 // the DFA during the labeling process. 212 Predicate *build_predicate(); 213 214 virtual void build_components(); // top-level operands 215 // Return zero-based position in component list; -1 if not in list. 216 virtual int operand_position(const char *name, int usedef); 217 virtual int operand_position_format(const char *name); 218 219 // Return zero-based position in component list; -1 if not in list. 220 virtual int label_position(); 221 virtual int method_position(); 222 // Return number of relocation entries needed for this instruction. 223 virtual uint reloc(FormDict &globals); 224 225 const char *reduce_result(); 226 // Return the name of the operand on the right hand side of the binary match 227 // Return NULL if there is no right hand side 228 const char *reduce_right(FormDict &globals) const; 229 const char *reduce_left(FormDict &globals) const; 230 231 // Base class for this instruction, MachNode except for calls 232 virtual const char *mach_base_class(FormDict &globals) const; 233 234 // Check if this instruction can cisc-spill to 'alternate' 235 bool cisc_spills_to(ArchDesc &AD, InstructForm *alternate); 236 InstructForm *cisc_spill_alternate() { return _cisc_spill_alternate; } 237 uint cisc_spill_operand() const { return _cisc_spill_operand; } 238 bool is_cisc_alternate() const { return _is_cisc_alternate; } 239 void set_cisc_alternate(bool val) { _is_cisc_alternate = val; } 240 const char *cisc_reg_mask_name() const { return _cisc_reg_mask_name; } 241 void set_cisc_reg_mask_name(const char *rm_name) { _cisc_reg_mask_name = rm_name; } 242 // Output cisc-method prototypes and method bodies 243 void declare_cisc_version(ArchDesc &AD, FILE *fp_cpp); 244 bool define_cisc_version (ArchDesc &AD, FILE *fp_cpp); 245 246 bool check_branch_variant(ArchDesc &AD, InstructForm *short_branch); 247 248 bool is_short_branch() { return _is_short_branch; } 249 void set_short_branch(bool val) { _is_short_branch = val; } 250 251 InstructForm *short_branch_form() { return _short_branch_form; } 252 bool has_short_branch_form() { return _short_branch_form != NULL; } 253 // Output short branch prototypes and method bodies 254 void declare_short_branch_methods(FILE *fp_cpp); 255 bool define_short_branch_methods(ArchDesc &AD, FILE *fp_cpp); 256 257 uint alignment() { return _alignment; } 258 void set_alignment(uint val) { _alignment = val; } 259 260 // Seach through operands to determine operands unique positions. 261 void set_unique_opnds(); 262 uint num_unique_opnds() { return _num_uniq; } 263 uint unique_opnds_idx(int idx) { 264 if( _uniq_idx != NULL && idx > 0 ) { 265 assert(idx < _uniq_idx_length, "out of bounds"); 266 return _uniq_idx[idx]; 267 } else { 268 return idx; 269 } 270 } 271 272 // Operands which are only KILLs aren't part of the input array and 273 // require special handling in some cases. Their position in this 274 // operand list is higher than the number of unique operands. 275 bool is_noninput_operand(uint idx) { |