225 // where DFLT_REG_mask() and DFLT_LOW_REG_mask() are the internal names of the
226 // masks of register classes dflt_reg and dflt_low_reg.
227 //
228 // The attached code snippet can select also between more than two register classes.
229 // This register class can be, however, used only if the register class is not
230 // cisc-spillable (i.e., the registers of this class are not allowed on the stack,
231 // which is equivalent with _stack_or_reg being false).
232 class CodeSnippetRegClass : public RegClass {
233 protected:
234 char* _code_snippet;
235 public:
236 CodeSnippetRegClass(const char* classid);// Constructor
237 ~CodeSnippetRegClass();
238
239 void set_code_snippet(char* code) {
240 _code_snippet = code;
241 }
242 char* code_snippet() {
243 return _code_snippet;
244 }
245 void set_stack_version(bool flag) {
246 assert(false, "User defined register classes are not allowed to spill to the stack.");
247 }
248 void declare_register_masks(FILE* fp);
249 void build_register_masks(FILE* fp) {
250 // We do not need to generate register masks because we select at runtime
251 // between register masks generated for other register classes.
252 return;
253 }
254 };
255
256 //------------------------------ConditionalRegClass----------------------------
257 // Register class that has two register classes and a runtime condition attached
258 // to it. The condition is evaluated at runtime and either one of the register
259 // attached register classes is selected. This register class is the internal
260 // representation for the following .ad format:
261 //
262 // reg_class_dynamic actual_dflt_reg(dflt_reg, low_reg,
263 // %{ VM_Version::has_vfp3_32() }%
264 // );
265 //
266 // This example is equivalent to the example used with the CodeSnippetRegClass
267 // register class. A ConditionalRegClass works also if a register class is cisc-spillable
|
225 // where DFLT_REG_mask() and DFLT_LOW_REG_mask() are the internal names of the
226 // masks of register classes dflt_reg and dflt_low_reg.
227 //
228 // The attached code snippet can select also between more than two register classes.
229 // This register class can be, however, used only if the register class is not
230 // cisc-spillable (i.e., the registers of this class are not allowed on the stack,
231 // which is equivalent with _stack_or_reg being false).
232 class CodeSnippetRegClass : public RegClass {
233 protected:
234 char* _code_snippet;
235 public:
236 CodeSnippetRegClass(const char* classid);// Constructor
237 ~CodeSnippetRegClass();
238
239 void set_code_snippet(char* code) {
240 _code_snippet = code;
241 }
242 char* code_snippet() {
243 return _code_snippet;
244 }
245 void declare_register_masks(FILE* fp);
246 void build_register_masks(FILE* fp) {
247 // We do not need to generate register masks because we select at runtime
248 // between register masks generated for other register classes.
249 return;
250 }
251 };
252
253 //------------------------------ConditionalRegClass----------------------------
254 // Register class that has two register classes and a runtime condition attached
255 // to it. The condition is evaluated at runtime and either one of the register
256 // attached register classes is selected. This register class is the internal
257 // representation for the following .ad format:
258 //
259 // reg_class_dynamic actual_dflt_reg(dflt_reg, low_reg,
260 // %{ VM_Version::has_vfp3_32() }%
261 // );
262 //
263 // This example is equivalent to the example used with the CodeSnippetRegClass
264 // register class. A ConditionalRegClass works also if a register class is cisc-spillable
|