src/share/vm/adlc/formsopt.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 8068945-8u-patched Cdiff src/share/vm/adlc/formsopt.cpp

src/share/vm/adlc/formsopt.cpp

Print this page
rev 7385 : 8075798: Allow ADLC register class to depend on runtime conditions also for cisc-spillable classes
Summary: Introduce a new register class, reg_class_dynamic, that supports also cist-spillable masks.
Reviewed-by: kvn, dlong, roland

*** 45,61 **** _rdefs.addName(name); _regDef.Insert(name,regDef); } // record a new register class ! RegClass *RegisterForm::addRegClass(const char *className) { ! RegClass *regClass = new RegClass(className); _rclasses.addName(className); ! _regClass.Insert(className,regClass); return regClass; } // record a new register class AllocClass *RegisterForm::addAllocClass(char *className) { AllocClass *allocClass = new AllocClass(className); _aclasses.addName(className); _allocClass.Insert(className,allocClass); --- 45,67 ---- _rdefs.addName(name); _regDef.Insert(name,regDef); } // record a new register class ! template <typename T> ! T* RegisterForm::addRegClass(const char* className) { ! T* regClass = new T(className); _rclasses.addName(className); ! _regClass.Insert(className, regClass); return regClass; } + // Explicit instantiation for all supported register classes. + template RegClass* RegisterForm::addRegClass<RegClass>(const char* className); + template CodeSnippetRegClass* RegisterForm::addRegClass<CodeSnippetRegClass>(const char* className); + template ConditionalRegClass* RegisterForm::addRegClass<ConditionalRegClass>(const char* className); + // record a new register class AllocClass *RegisterForm::addAllocClass(char *className) { AllocClass *allocClass = new AllocClass(className); _aclasses.addName(className); _allocClass.Insert(className,allocClass);
*** 66,77 **** // for spill-slots/regs. void RegisterForm::addSpillRegClass() { // Stack slots start at the next available even register number. _reg_ctr = (_reg_ctr+7) & ~7; const char *rc_name = "stack_slots"; ! RegClass *reg_class = new RegClass(rc_name); ! reg_class->_stack_or_reg = true; _rclasses.addName(rc_name); _regClass.Insert(rc_name,reg_class); } --- 72,83 ---- // for spill-slots/regs. void RegisterForm::addSpillRegClass() { // Stack slots start at the next available even register number. _reg_ctr = (_reg_ctr+7) & ~7; const char *rc_name = "stack_slots"; ! RegClass* reg_class = new RegClass(rc_name); ! reg_class->set_stack_version(true); _rclasses.addName(rc_name); _regClass.Insert(rc_name,reg_class); }
*** 222,234 **** } //------------------------------RegClass--------------------------------------- // Construct a register class into which registers will be inserted ! RegClass::RegClass(const char *classid) : _stack_or_reg(false), _classid(classid), _regDef(cmpstr,hashstr, Form::arena), ! _user_defined(NULL) ! { } // record a register in this class void RegClass::addReg(RegDef *regDef) { _regDefs.addName(regDef->_regname); --- 228,242 ---- } //------------------------------RegClass--------------------------------------- // Construct a register class into which registers will be inserted ! RegClass::RegClass(const char* classid) : _stack_or_reg(false), _classid(classid), _regDef(cmpstr, hashstr, Form::arena) { ! } ! ! RegClass::~RegClass() { ! delete _classid; } // record a register in this class void RegClass::addReg(RegDef *regDef) { _regDefs.addName(regDef->_regname);
*** 303,312 **** --- 311,405 ---- ((RegDef*)_regDef[name])->output(fp); } fprintf(fp,"--- done with entries for reg_class %s\n\n",_classid); } + void RegClass::declare_register_masks(FILE* fp) { + const char* prefix = ""; + const char* rc_name_to_upper = toUpper(_classid); + fprintf(fp, "extern const RegMask _%s%s_mask;\n", prefix, rc_name_to_upper); + fprintf(fp, "inline const RegMask &%s%s_mask() { return _%s%s_mask; }\n", prefix, rc_name_to_upper, prefix, rc_name_to_upper); + if (_stack_or_reg) { + fprintf(fp, "extern const RegMask _%sSTACK_OR_%s_mask;\n", prefix, rc_name_to_upper); + fprintf(fp, "inline const RegMask &%sSTACK_OR_%s_mask() { return _%sSTACK_OR_%s_mask; }\n", prefix, rc_name_to_upper, prefix, rc_name_to_upper); + } + delete[] rc_name_to_upper; + } + + void RegClass::build_register_masks(FILE* fp) { + int len = RegisterForm::RegMask_Size(); + const char *prefix = ""; + const char* rc_name_to_upper = toUpper(_classid); + fprintf(fp, "const RegMask _%s%s_mask(", prefix, rc_name_to_upper); + + int i; + for(i = 0; i < len - 1; i++) { + fprintf(fp," 0x%x,", regs_in_word(i, false)); + } + fprintf(fp," 0x%x );\n", regs_in_word(i, false)); + + if (_stack_or_reg) { + fprintf(fp, "const RegMask _%sSTACK_OR_%s_mask(", prefix, rc_name_to_upper); + for(i = 0; i < len - 1; i++) { + fprintf(fp," 0x%x,", regs_in_word(i, true)); + } + fprintf(fp," 0x%x );\n", regs_in_word(i, true)); + } + delete[] rc_name_to_upper; + } + + //------------------------------CodeSnippetRegClass--------------------------- + CodeSnippetRegClass::CodeSnippetRegClass(const char* classid) : RegClass(classid), _code_snippet(NULL) { + } + + CodeSnippetRegClass::~CodeSnippetRegClass() { + delete _code_snippet; + } + + void CodeSnippetRegClass::declare_register_masks(FILE* fp) { + const char* prefix = ""; + const char* rc_name_to_upper = toUpper(_classid); + fprintf(fp, "inline const RegMask &%s%s_mask() { %s }\n", prefix, rc_name_to_upper, _code_snippet); + delete[] rc_name_to_upper; + } + + //------------------------------ConditionalRegClass--------------------------- + ConditionalRegClass::ConditionalRegClass(const char *classid) : RegClass(classid), _condition_code(NULL) { + } + + ConditionalRegClass::~ConditionalRegClass() { + delete _condition_code; + } + + void ConditionalRegClass::declare_register_masks(FILE* fp) { + const char* prefix = ""; + const char* rc_name_to_upper = toUpper(_classid); + const char* rclass_0_to_upper = toUpper(_rclasses[0]->_classid); + const char* rclass_1_to_upper = toUpper(_rclasses[1]->_classid); + fprintf(fp, "inline const RegMask &%s%s_mask() {" + " return (%s) ?" + " %s%s_mask() :" + " %s%s_mask(); }\n", + prefix, rc_name_to_upper, + _condition_code, + prefix, rclass_0_to_upper, + prefix, rclass_1_to_upper); + if (_stack_or_reg) { + fprintf(fp, "inline const RegMask &%sSTACK_OR_%s_mask() {" + " return (%s) ?" + " %sSTACK_OR_%s_mask() :" + " %sSTACK_OR_%s_mask(); }\n", + prefix, rc_name_to_upper, + _condition_code, + prefix, rclass_0_to_upper, + prefix, rclass_1_to_upper); + } + delete[] rc_name_to_upper; + delete[] rclass_0_to_upper; + delete[] rclass_1_to_upper; + return; + } //------------------------------AllocClass------------------------------------- AllocClass::AllocClass(char *classid) : _classid(classid), _regDef(cmpstr,hashstr, Form::arena) { }
src/share/vm/adlc/formsopt.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File