Mercurial > hg > truffle
comparison src/share/vm/adlc/output_c.cpp @ 4121:db2e64ca2d5a
7090968: Allow adlc register class to depend on runtime conditions
Summary: allow reg_class definition as a function.
Reviewed-by: kvn, never
author | roland |
---|---|
date | Tue, 22 Nov 2011 09:45:57 +0100 |
parents | 6729bbc1fcd6 |
children | da91efe96a93 |
comparison
equal
deleted
inserted
replaced
4120:f03a3c8bd5e5 | 4121:db2e64ca2d5a |
---|---|
160 (rc_name = _register->_rclasses.iter()) != NULL; ) { | 160 (rc_name = _register->_rclasses.iter()) != NULL; ) { |
161 const char *prefix = ""; | 161 const char *prefix = ""; |
162 RegClass *reg_class = _register->getRegClass(rc_name); | 162 RegClass *reg_class = _register->getRegClass(rc_name); |
163 assert( reg_class, "Using an undefined register class"); | 163 assert( reg_class, "Using an undefined register class"); |
164 | 164 |
165 int len = RegisterForm::RegMask_Size(); | 165 if (reg_class->_user_defined == NULL) { |
166 fprintf(fp_hpp, "extern const RegMask %s%s_mask;\n", prefix, toUpper( rc_name ) ); | 166 fprintf(fp_hpp, "extern const RegMask _%s%s_mask;\n", prefix, toUpper( rc_name ) ); |
167 fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { return _%s%s_mask; }\n", prefix, toUpper( rc_name ), prefix, toUpper( rc_name )); | |
168 } else { | |
169 fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { %s }\n", prefix, toUpper( rc_name ), reg_class->_user_defined); | |
170 } | |
167 | 171 |
168 if( reg_class->_stack_or_reg ) { | 172 if( reg_class->_stack_or_reg ) { |
169 fprintf(fp_hpp, "extern const RegMask %sSTACK_OR_%s_mask;\n", prefix, toUpper( rc_name ) ); | 173 assert(reg_class->_user_defined == NULL, "no user defined reg class here"); |
174 fprintf(fp_hpp, "extern const RegMask _%sSTACK_OR_%s_mask;\n", prefix, toUpper( rc_name ) ); | |
175 fprintf(fp_hpp, "inline const RegMask &%sSTACK_OR_%s_mask() { return _%sSTACK_OR_%s_mask; }\n", prefix, toUpper( rc_name ), prefix, toUpper( rc_name ) ); | |
170 } | 176 } |
171 } | 177 } |
172 } | 178 } |
173 } | 179 } |
174 | 180 |
186 (rc_name = _register->_rclasses.iter()) != NULL; ) { | 192 (rc_name = _register->_rclasses.iter()) != NULL; ) { |
187 const char *prefix = ""; | 193 const char *prefix = ""; |
188 RegClass *reg_class = _register->getRegClass(rc_name); | 194 RegClass *reg_class = _register->getRegClass(rc_name); |
189 assert( reg_class, "Using an undefined register class"); | 195 assert( reg_class, "Using an undefined register class"); |
190 | 196 |
197 if (reg_class->_user_defined != NULL) continue; | |
198 | |
191 int len = RegisterForm::RegMask_Size(); | 199 int len = RegisterForm::RegMask_Size(); |
192 fprintf(fp_cpp, "const RegMask %s%s_mask(", prefix, toUpper( rc_name ) ); | 200 fprintf(fp_cpp, "const RegMask _%s%s_mask(", prefix, toUpper( rc_name ) ); |
193 { int i; | 201 { int i; |
194 for( i = 0; i < len-1; i++ ) | 202 for( i = 0; i < len-1; i++ ) |
195 fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i,false)); | 203 fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i,false)); |
196 fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i,false)); | 204 fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i,false)); |
197 } | 205 } |
198 | 206 |
199 if( reg_class->_stack_or_reg ) { | 207 if( reg_class->_stack_or_reg ) { |
200 int i; | 208 int i; |
201 fprintf(fp_cpp, "const RegMask %sSTACK_OR_%s_mask(", prefix, toUpper( rc_name ) ); | 209 fprintf(fp_cpp, "const RegMask _%sSTACK_OR_%s_mask(", prefix, toUpper( rc_name ) ); |
202 for( i = 0; i < len-1; i++ ) | 210 for( i = 0; i < len-1; i++ ) |
203 fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i,true)); | 211 fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i,true)); |
204 fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i,true)); | 212 fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i,true)); |
205 } | 213 } |
206 } | 214 } |
2688 if (all_same) { | 2696 if (all_same) { |
2689 // Return the sole RegMask. | 2697 // Return the sole RegMask. |
2690 if (strcmp(first_reg_class, "stack_slots") == 0) { | 2698 if (strcmp(first_reg_class, "stack_slots") == 0) { |
2691 fprintf(fp," return &(Compile::current()->FIRST_STACK_mask());\n"); | 2699 fprintf(fp," return &(Compile::current()->FIRST_STACK_mask());\n"); |
2692 } else { | 2700 } else { |
2693 fprintf(fp," return &%s_mask;\n", toUpper(first_reg_class)); | 2701 fprintf(fp," return &%s_mask();\n", toUpper(first_reg_class)); |
2694 } | 2702 } |
2695 } else { | 2703 } else { |
2696 // Build a switch statement to return the desired mask. | 2704 // Build a switch statement to return the desired mask. |
2697 fprintf(fp," switch (index) {\n"); | 2705 fprintf(fp," switch (index) {\n"); |
2698 | 2706 |
2700 const char *reg_class = oper.in_reg_class(index, globals); | 2708 const char *reg_class = oper.in_reg_class(index, globals); |
2701 assert(reg_class != NULL, "did not find register mask"); | 2709 assert(reg_class != NULL, "did not find register mask"); |
2702 if( !strcmp(reg_class, "stack_slots") ) { | 2710 if( !strcmp(reg_class, "stack_slots") ) { |
2703 fprintf(fp, " case %d: return &(Compile::current()->FIRST_STACK_mask());\n", index); | 2711 fprintf(fp, " case %d: return &(Compile::current()->FIRST_STACK_mask());\n", index); |
2704 } else { | 2712 } else { |
2705 fprintf(fp, " case %d: return &%s_mask;\n", index, toUpper(reg_class)); | 2713 fprintf(fp, " case %d: return &%s_mask();\n", index, toUpper(reg_class)); |
2706 } | 2714 } |
2707 } | 2715 } |
2708 fprintf(fp," }\n"); | 2716 fprintf(fp," }\n"); |
2709 fprintf(fp," ShouldNotReachHere();\n"); | 2717 fprintf(fp," ShouldNotReachHere();\n"); |
2710 fprintf(fp," return NULL;\n"); | 2718 fprintf(fp," return NULL;\n"); |
4078 | 4086 |
4079 // Inline Cache Register, mask definition, and encoding | 4087 // Inline Cache Register, mask definition, and encoding |
4080 fprintf(fp_cpp,"OptoReg::Name Matcher::inline_cache_reg() {"); | 4088 fprintf(fp_cpp,"OptoReg::Name Matcher::inline_cache_reg() {"); |
4081 fprintf(fp_cpp," return OptoReg::Name(%s_num); }\n\n", | 4089 fprintf(fp_cpp," return OptoReg::Name(%s_num); }\n\n", |
4082 _frame->_inline_cache_reg); | 4090 _frame->_inline_cache_reg); |
4083 fprintf(fp_cpp,"const RegMask &Matcher::inline_cache_reg_mask() {"); | |
4084 fprintf(fp_cpp," return INLINE_CACHE_REG_mask; }\n\n"); | |
4085 fprintf(fp_cpp,"int Matcher::inline_cache_reg_encode() {"); | 4091 fprintf(fp_cpp,"int Matcher::inline_cache_reg_encode() {"); |
4086 fprintf(fp_cpp," return _regEncode[inline_cache_reg()]; }\n\n"); | 4092 fprintf(fp_cpp," return _regEncode[inline_cache_reg()]; }\n\n"); |
4087 | 4093 |
4088 // Interpreter's Method Oop Register, mask definition, and encoding | 4094 // Interpreter's Method Oop Register, mask definition, and encoding |
4089 fprintf(fp_cpp,"OptoReg::Name Matcher::interpreter_method_oop_reg() {"); | 4095 fprintf(fp_cpp,"OptoReg::Name Matcher::interpreter_method_oop_reg() {"); |
4090 fprintf(fp_cpp," return OptoReg::Name(%s_num); }\n\n", | 4096 fprintf(fp_cpp," return OptoReg::Name(%s_num); }\n\n", |
4091 _frame->_interpreter_method_oop_reg); | 4097 _frame->_interpreter_method_oop_reg); |
4092 fprintf(fp_cpp,"const RegMask &Matcher::interpreter_method_oop_reg_mask() {"); | |
4093 fprintf(fp_cpp," return INTERPRETER_METHOD_OOP_REG_mask; }\n\n"); | |
4094 fprintf(fp_cpp,"int Matcher::interpreter_method_oop_reg_encode() {"); | 4098 fprintf(fp_cpp,"int Matcher::interpreter_method_oop_reg_encode() {"); |
4095 fprintf(fp_cpp," return _regEncode[interpreter_method_oop_reg()]; }\n\n"); | 4099 fprintf(fp_cpp," return _regEncode[interpreter_method_oop_reg()]; }\n\n"); |
4096 | 4100 |
4097 // Interpreter's Frame Pointer Register, mask definition, and encoding | 4101 // Interpreter's Frame Pointer Register, mask definition, and encoding |
4098 fprintf(fp_cpp,"OptoReg::Name Matcher::interpreter_frame_pointer_reg() {"); | 4102 fprintf(fp_cpp,"OptoReg::Name Matcher::interpreter_frame_pointer_reg() {"); |
4099 if (_frame->_interpreter_frame_pointer_reg == NULL) | 4103 if (_frame->_interpreter_frame_pointer_reg == NULL) |
4100 fprintf(fp_cpp," return OptoReg::Bad; }\n\n"); | 4104 fprintf(fp_cpp," return OptoReg::Bad; }\n\n"); |
4101 else | 4105 else |
4102 fprintf(fp_cpp," return OptoReg::Name(%s_num); }\n\n", | 4106 fprintf(fp_cpp," return OptoReg::Name(%s_num); }\n\n", |
4103 _frame->_interpreter_frame_pointer_reg); | 4107 _frame->_interpreter_frame_pointer_reg); |
4104 fprintf(fp_cpp,"const RegMask &Matcher::interpreter_frame_pointer_reg_mask() {"); | |
4105 if (_frame->_interpreter_frame_pointer_reg == NULL) | |
4106 fprintf(fp_cpp," static RegMask dummy; return dummy; }\n\n"); | |
4107 else | |
4108 fprintf(fp_cpp," return INTERPRETER_FRAME_POINTER_REG_mask; }\n\n"); | |
4109 | 4108 |
4110 // Frame Pointer definition | 4109 // Frame Pointer definition |
4111 /* CNC - I can not contemplate having a different frame pointer between | 4110 /* CNC - I can not contemplate having a different frame pointer between |
4112 Java and native code; makes my head hurt to think about it. | 4111 Java and native code; makes my head hurt to think about it. |
4113 fprintf(fp_cpp,"OptoReg::Name Matcher::frame_pointer() const {"); | 4112 fprintf(fp_cpp,"OptoReg::Name Matcher::frame_pointer() const {"); |