mirror of
https://github.com/openjdk/jdk.git
synced 2026-07-19 07:29:08 +00:00
8234394: C2: Dynamic register class support in ADLC
Reviewed-by: vlivanov, sviswanathan, thartmann, kvn
This commit is contained in:
parent
fb0b8f1d0c
commit
a96089059a
@ -123,6 +123,7 @@ void ADLParser::parse() {
|
||||
parse_err(SEMERR, "Did not declare 'register' definitions");
|
||||
}
|
||||
regBlock->addSpillRegClass();
|
||||
regBlock->addDynamicRegClass();
|
||||
|
||||
// Done with parsing, check consistency.
|
||||
|
||||
|
||||
@ -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";
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user