src/share/vm/adlc/output_c.cpp

Print this page
rev 2699 : 7090968: Allow adlc register class to depend on runtime conditions
Summary: allow reg_class definition as a function.
Reviewed-by:

*** 160,174 **** (rc_name = _register->_rclasses.iter()) != NULL; ) { const char *prefix = ""; RegClass *reg_class = _register->getRegClass(rc_name); assert( reg_class, "Using an undefined register class"); ! int len = RegisterForm::RegMask_Size(); ! fprintf(fp_hpp, "extern const RegMask %s%s_mask;\n", prefix, toUpper( rc_name ) ); if( reg_class->_stack_or_reg ) { ! fprintf(fp_hpp, "extern const RegMask %sSTACK_OR_%s_mask;\n", prefix, toUpper( rc_name ) ); } } } } --- 160,180 ---- (rc_name = _register->_rclasses.iter()) != NULL; ) { const char *prefix = ""; RegClass *reg_class = _register->getRegClass(rc_name); assert( reg_class, "Using an undefined register class"); ! if (reg_class->_user_defined == NULL) { ! fprintf(fp_hpp, "extern const RegMask _%s%s_mask;\n", prefix, toUpper( rc_name ) ); ! fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { return _%s%s_mask; }\n", prefix, toUpper( rc_name ), prefix, toUpper( rc_name )); ! } else { ! fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { %s }\n", prefix, toUpper( rc_name ), reg_class->_user_defined); ! } if( reg_class->_stack_or_reg ) { ! assert(reg_class->_user_defined == NULL, "no user defined reg class here"); ! fprintf(fp_hpp, "extern const RegMask _%sSTACK_OR_%s_mask;\n", prefix, toUpper( rc_name ) ); ! fprintf(fp_hpp, "inline const RegMask &%sSTACK_OR_%s_mask() { return _%sSTACK_OR_%s_mask; }\n", prefix, toUpper( rc_name ), prefix, toUpper( rc_name ) ); } } } }
*** 186,206 **** (rc_name = _register->_rclasses.iter()) != NULL; ) { const char *prefix = ""; RegClass *reg_class = _register->getRegClass(rc_name); assert( reg_class, "Using an undefined register class"); int len = RegisterForm::RegMask_Size(); ! fprintf(fp_cpp, "const RegMask %s%s_mask(", prefix, toUpper( rc_name ) ); { int i; for( i = 0; i < len-1; i++ ) fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i,false)); fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i,false)); } if( reg_class->_stack_or_reg ) { int i; ! fprintf(fp_cpp, "const RegMask %sSTACK_OR_%s_mask(", prefix, toUpper( rc_name ) ); for( i = 0; i < len-1; i++ ) fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i,true)); fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i,true)); } } --- 192,214 ---- (rc_name = _register->_rclasses.iter()) != NULL; ) { const char *prefix = ""; RegClass *reg_class = _register->getRegClass(rc_name); assert( reg_class, "Using an undefined register class"); + if (reg_class->_user_defined != NULL) continue; + int len = RegisterForm::RegMask_Size(); ! fprintf(fp_cpp, "const RegMask _%s%s_mask(", prefix, toUpper( rc_name ) ); { int i; for( i = 0; i < len-1; i++ ) fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i,false)); fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i,false)); } if( reg_class->_stack_or_reg ) { int i; ! fprintf(fp_cpp, "const RegMask _%sSTACK_OR_%s_mask(", prefix, toUpper( rc_name ) ); for( i = 0; i < len-1; i++ ) fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i,true)); fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i,true)); } }
*** 2688,2698 **** if (all_same) { // Return the sole RegMask. if (strcmp(first_reg_class, "stack_slots") == 0) { fprintf(fp," return &(Compile::current()->FIRST_STACK_mask());\n"); } else { ! fprintf(fp," return &%s_mask;\n", toUpper(first_reg_class)); } } else { // Build a switch statement to return the desired mask. fprintf(fp," switch (index) {\n"); --- 2696,2706 ---- if (all_same) { // Return the sole RegMask. if (strcmp(first_reg_class, "stack_slots") == 0) { fprintf(fp," return &(Compile::current()->FIRST_STACK_mask());\n"); } else { ! fprintf(fp," return &%s_mask();\n", toUpper(first_reg_class)); } } else { // Build a switch statement to return the desired mask. fprintf(fp," switch (index) {\n");
*** 2700,2710 **** const char *reg_class = oper.in_reg_class(index, globals); assert(reg_class != NULL, "did not find register mask"); if( !strcmp(reg_class, "stack_slots") ) { fprintf(fp, " case %d: return &(Compile::current()->FIRST_STACK_mask());\n", index); } else { ! fprintf(fp, " case %d: return &%s_mask;\n", index, toUpper(reg_class)); } } fprintf(fp," }\n"); fprintf(fp," ShouldNotReachHere();\n"); fprintf(fp," return NULL;\n"); --- 2708,2718 ---- const char *reg_class = oper.in_reg_class(index, globals); assert(reg_class != NULL, "did not find register mask"); if( !strcmp(reg_class, "stack_slots") ) { fprintf(fp, " case %d: return &(Compile::current()->FIRST_STACK_mask());\n", index); } else { ! fprintf(fp, " case %d: return &%s_mask();\n", index, toUpper(reg_class)); } } fprintf(fp," }\n"); fprintf(fp," ShouldNotReachHere();\n"); fprintf(fp," return NULL;\n");
*** 4078,4113 **** // Inline Cache Register, mask definition, and encoding fprintf(fp_cpp,"OptoReg::Name Matcher::inline_cache_reg() {"); fprintf(fp_cpp," return OptoReg::Name(%s_num); }\n\n", _frame->_inline_cache_reg); - fprintf(fp_cpp,"const RegMask &Matcher::inline_cache_reg_mask() {"); - fprintf(fp_cpp," return INLINE_CACHE_REG_mask; }\n\n"); fprintf(fp_cpp,"int Matcher::inline_cache_reg_encode() {"); fprintf(fp_cpp," return _regEncode[inline_cache_reg()]; }\n\n"); // Interpreter's Method Oop Register, mask definition, and encoding fprintf(fp_cpp,"OptoReg::Name Matcher::interpreter_method_oop_reg() {"); fprintf(fp_cpp," return OptoReg::Name(%s_num); }\n\n", _frame->_interpreter_method_oop_reg); - fprintf(fp_cpp,"const RegMask &Matcher::interpreter_method_oop_reg_mask() {"); - fprintf(fp_cpp," return INTERPRETER_METHOD_OOP_REG_mask; }\n\n"); fprintf(fp_cpp,"int Matcher::interpreter_method_oop_reg_encode() {"); fprintf(fp_cpp," return _regEncode[interpreter_method_oop_reg()]; }\n\n"); // Interpreter's Frame Pointer Register, mask definition, and encoding fprintf(fp_cpp,"OptoReg::Name Matcher::interpreter_frame_pointer_reg() {"); if (_frame->_interpreter_frame_pointer_reg == NULL) fprintf(fp_cpp," return OptoReg::Bad; }\n\n"); else fprintf(fp_cpp," return OptoReg::Name(%s_num); }\n\n", _frame->_interpreter_frame_pointer_reg); - fprintf(fp_cpp,"const RegMask &Matcher::interpreter_frame_pointer_reg_mask() {"); - if (_frame->_interpreter_frame_pointer_reg == NULL) - fprintf(fp_cpp," static RegMask dummy; return dummy; }\n\n"); - else - fprintf(fp_cpp," return INTERPRETER_FRAME_POINTER_REG_mask; }\n\n"); // Frame Pointer definition /* CNC - I can not contemplate having a different frame pointer between Java and native code; makes my head hurt to think about it. fprintf(fp_cpp,"OptoReg::Name Matcher::frame_pointer() const {"); --- 4086,4112 ----