comparison src/share/vm/adlc/adlparse.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 f03a3c8bd5e5
children 8c92982cbbc4
comparison
equal deleted inserted replaced
4120:f03a3c8bd5e5 4121:db2e64ca2d5a
980 if (strcmp(token,"frame_pointer")==0) { 980 if (strcmp(token,"frame_pointer")==0) {
981 frame_pointer_parse(frame, false); 981 frame_pointer_parse(frame, false);
982 } 982 }
983 if (strcmp(token,"interpreter_frame_pointer")==0) { 983 if (strcmp(token,"interpreter_frame_pointer")==0) {
984 interpreter_frame_pointer_parse(frame, false); 984 interpreter_frame_pointer_parse(frame, false);
985 // Add reg_class interpreter_frame_pointer_reg
986 if( _AD._register != NULL ) {
987 RegClass *reg_class = _AD._register->addRegClass("interpreter_frame_pointer_reg");
988 char *interpreter_frame_pointer_reg = frame->_interpreter_frame_pointer_reg;
989 if( interpreter_frame_pointer_reg != NULL ) {
990 RegDef *regDef = _AD._register->getRegDef(interpreter_frame_pointer_reg);
991 reg_class->addReg(regDef); // add regDef to regClass
992 }
993 }
994 } 985 }
995 if (strcmp(token,"inline_cache_reg")==0) { 986 if (strcmp(token,"inline_cache_reg")==0) {
996 inline_cache_parse(frame, false); 987 inline_cache_parse(frame, false);
997 // Add reg_class inline_cache_reg
998 if( _AD._register != NULL ) {
999 RegClass *reg_class = _AD._register->addRegClass("inline_cache_reg");
1000 char *inline_cache_reg = frame->_inline_cache_reg;
1001 if( inline_cache_reg != NULL ) {
1002 RegDef *regDef = _AD._register->getRegDef(inline_cache_reg);
1003 reg_class->addReg(regDef); // add regDef to regClass
1004 }
1005 }
1006 } 988 }
1007 if (strcmp(token,"compiler_method_oop_reg")==0) { 989 if (strcmp(token,"compiler_method_oop_reg")==0) {
1008 parse_err(WARN, "Using obsolete Token, compiler_method_oop_reg"); 990 parse_err(WARN, "Using obsolete Token, compiler_method_oop_reg");
1009 skipws(); 991 skipws();
1010 } 992 }
1011 if (strcmp(token,"interpreter_method_oop_reg")==0) { 993 if (strcmp(token,"interpreter_method_oop_reg")==0) {
1012 interpreter_method_oop_parse(frame, false); 994 interpreter_method_oop_parse(frame, false);
1013 // Add reg_class interpreter_method_oop_reg
1014 if( _AD._register != NULL ) {
1015 RegClass *reg_class = _AD._register->addRegClass("interpreter_method_oop_reg");
1016 char *method_oop_reg = frame->_interpreter_method_oop_reg;
1017 if( method_oop_reg != NULL ) {
1018 RegDef *regDef = _AD._register->getRegDef(method_oop_reg);
1019 reg_class->addReg(regDef); // add regDef to regClass
1020 }
1021 }
1022 } 995 }
1023 if (strcmp(token,"cisc_spilling_operand_name")==0) { 996 if (strcmp(token,"cisc_spilling_operand_name")==0) {
1024 cisc_spilling_operand_name_parse(frame, false); 997 cisc_spilling_operand_name_parse(frame, false);
1025 } 998 }
1026 if (strcmp(token,"stack_alignment")==0) { 999 if (strcmp(token,"stack_alignment")==0) {
2361 next_char(); // Skip trailing ',' 2334 next_char(); // Skip trailing ','
2362 skipws(); 2335 skipws();
2363 } 2336 }
2364 } 2337 }
2365 next_char(); // Skip closing ')' 2338 next_char(); // Skip closing ')'
2339 } else if (_curchar == '%') {
2340 char *code = find_cpp_block("reg class");
2341 if (code == NULL) {
2342 parse_err(SYNERR, "missing code declaration for reg class.\n");
2343 return;
2344 }
2345 reg_class->_user_defined = code;
2346 return;
2366 } 2347 }
2367 2348
2368 // Check for terminating ';' 2349 // Check for terminating ';'
2369 skipws(); 2350 skipws();
2370 if (_curchar != ';') { 2351 if (_curchar != ';') {