8234394: C2: Dynamic register class support in ADLC

Reviewed-by: vlivanov, sviswanathan, thartmann, kvn
This commit is contained in:
Jatin Bhateja 2019-11-26 16:09:25 +03:00
parent fb0b8f1d0c
commit a96089059a
5 changed files with 16 additions and 1 deletions

View File

@ -123,6 +123,7 @@ void ADLParser::parse() {
parse_err(SEMERR, "Did not declare 'register' definitions");
}
regBlock->addSpillRegClass();
regBlock->addDynamicRegClass();
// Done with parsing, check consistency.

View File

@ -808,6 +808,8 @@ static const char *getRegMask(const char *reg_class_name) {
return "RegMask::Empty";
} else if (strcmp(reg_class_name,"stack_slots")==0) {
return "(Compile::current()->FIRST_STACK_mask())";
} else if (strcmp(reg_class_name, "dynamic")==0) {
return "*_opnds[0]->in_RegMask(0)";
} else {
char *rc_name = toUpper(reg_class_name);
const char *mask = "_mask";
@ -870,7 +872,7 @@ const char *ArchDesc::reg_mask(InstructForm &inForm) {
}
// Instructions producing 'Universe' use RegMask::Empty
if( strcmp(result,"Universe")==0 ) {
if (strcmp(result,"Universe") == 0) {
return "RegMask::Empty";
}

View File

@ -80,6 +80,15 @@ void RegisterForm::addSpillRegClass() {
_regClass.Insert(rc_name,reg_class);
}
// Called after parsing the Register block. Record the register class
// for operands which are overwritten after matching.
void RegisterForm::addDynamicRegClass() {
const char *rc_name = "dynamic";
RegClass* reg_class = new RegClass(rc_name);
reg_class->set_stack_version(false);
_rclasses.addName(rc_name);
_regClass.Insert(rc_name,reg_class);
}
// Provide iteration over all register definitions
// in the order used by the register allocator

View File

@ -104,6 +104,7 @@ public:
AllocClass *addAllocClass(char *allocName);
void addSpillRegClass();
void addDynamicRegClass();
// Provide iteration over all register definitions
// in the order used by the register allocator

View File

@ -2781,6 +2781,8 @@ static void defineIn_RegMask(FILE *fp, FormDict &globals, OperandForm &oper) {
// Return the sole RegMask.
if (strcmp(first_reg_class, "stack_slots") == 0) {
fprintf(fp," return &(Compile::current()->FIRST_STACK_mask());\n");
} else if (strcmp(first_reg_class, "dynamic") == 0) {
fprintf(fp," return &RegMask::Empty;\n");
} else {
const char* first_reg_class_to_upper = toUpper(first_reg_class);
fprintf(fp," return &%s_mask();\n", first_reg_class_to_upper);