src/share/vm/adlc/output_c.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File 8068945-8u-patched Sdiff src/share/vm/adlc

src/share/vm/adlc/output_c.cpp

Print this page
rev 7385 : 8075798: Allow ADLC register class to depend on runtime conditions also for cisc-spillable classes
Summary: Introduce a new register class, reg_class_dynamic, that supports also cist-spillable masks.
Reviewed-by: kvn, dlong, roland


 138     // Finish defining enumeration
 139     fprintf(fp, "  _last_Mach_Reg_Class\n");
 140     fprintf(fp, "};\n");
 141   }
 142 }
 143 
 144 // Declare an enumeration of user-defined register classes
 145 // and a list of register masks, one for each class.
 146 void ArchDesc::declare_register_masks(FILE *fp_hpp) {
 147   const char  *rc_name;
 148 
 149   if (_register) {
 150     // Build enumeration of user-defined register classes.
 151     defineRegClassEnum(fp_hpp, _register);
 152 
 153     // Generate a list of register masks, one for each class.
 154     fprintf(fp_hpp,"\n");
 155     fprintf(fp_hpp,"// Register masks, one for each register class.\n");
 156     _register->_rclasses.reset();
 157     for (rc_name = NULL; (rc_name = _register->_rclasses.iter()) != NULL;) {
 158       const char *prefix = "";
 159       RegClass *reg_class = _register->getRegClass(rc_name);
 160       assert(reg_class, "Using an undefined register class");
 161 
 162       const char* rc_name_to_upper = toUpper(rc_name);
 163 
 164       if (reg_class->_user_defined == NULL) {
 165         fprintf(fp_hpp, "extern const RegMask _%s%s_mask;\n", prefix,  rc_name_to_upper);
 166         fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { return _%s%s_mask; }\n", prefix, rc_name_to_upper, prefix, rc_name_to_upper);
 167       } else {
 168         fprintf(fp_hpp, "inline const RegMask &%s%s_mask() { %s }\n", prefix, rc_name_to_upper, reg_class->_user_defined);
 169       }
 170 
 171       if (reg_class->_stack_or_reg) {
 172         assert(reg_class->_user_defined == NULL, "no user defined reg class here");
 173         fprintf(fp_hpp, "extern const RegMask _%sSTACK_OR_%s_mask;\n", prefix, rc_name_to_upper);
 174         fprintf(fp_hpp, "inline const RegMask &%sSTACK_OR_%s_mask() { return _%sSTACK_OR_%s_mask; }\n", prefix, rc_name_to_upper, prefix, rc_name_to_upper);
 175       }
 176       delete[] rc_name_to_upper;
 177 
 178     }
 179   }
 180 }
 181 
 182 // Generate an enumeration of user-defined register classes
 183 // and a list of register masks, one for each class.
 184 void ArchDesc::build_register_masks(FILE *fp_cpp) {
 185   const char  *rc_name;
 186 
 187   if (_register) {
 188     // Generate a list of register masks, one for each class.
 189     fprintf(fp_cpp,"\n");
 190     fprintf(fp_cpp,"// Register masks, one for each register class.\n");
 191     _register->_rclasses.reset();
 192     for (rc_name = NULL; (rc_name = _register->_rclasses.iter()) != NULL;) {
 193       const char *prefix = "";
 194       RegClass *reg_class = _register->getRegClass(rc_name);
 195       assert(reg_class, "Using an undefined register class");
 196 
 197       if (reg_class->_user_defined != NULL) {
 198         continue;
 199       }
 200 
 201       int len = RegisterForm::RegMask_Size();
 202       const char* rc_name_to_upper = toUpper(rc_name);
 203       fprintf(fp_cpp, "const RegMask _%s%s_mask(", prefix, rc_name_to_upper);
 204 
 205       {
 206         int i;
 207         for(i = 0; i < len - 1; i++) {
 208           fprintf(fp_cpp," 0x%x,", reg_class->regs_in_word(i, false));
 209         }
 210         fprintf(fp_cpp," 0x%x );\n", reg_class->regs_in_word(i, false));
 211       }
 212 
 213       if (reg_class->_stack_or_reg) {
 214         int i;
 215         fprintf(fp_cpp, "const RegMask _%sSTACK_OR_%s_mask(", prefix, rc_name_to_upper);
 216         for(i = 0; i < len - 1; i++) {
 217           fprintf(fp_cpp," 0x%x,",reg_class->regs_in_word(i, true));
 218         }
 219         fprintf(fp_cpp," 0x%x );\n",reg_class->regs_in_word(i, true));
 220       }
 221       delete[] rc_name_to_upper;
 222     }
 223   }
 224 }
 225 
 226 // Compute an index for an array in the pipeline_reads_NNN arrays
 227 static int pipeline_reads_initializer(FILE *fp_cpp, NameList &pipeline_reads, PipeClassForm *pipeclass)
 228 {
 229   int templen = 1;
 230   int paramcount = 0;
 231   const char *paramname;
 232 
 233   if (pipeclass->_parameters.count() == 0)
 234     return -1;
 235 
 236   pipeclass->_parameters.reset();
 237   paramname = pipeclass->_parameters.iter();
 238   const PipeClassOperandForm *pipeopnd =
 239     (const PipeClassOperandForm *)pipeclass->_localUsage[paramname];
 240   if (pipeopnd && !pipeopnd->isWrite() && strcmp(pipeopnd->_stage, "Universal"))
 241     pipeclass->_parameters.reset();




 138     // Finish defining enumeration
 139     fprintf(fp, "  _last_Mach_Reg_Class\n");
 140     fprintf(fp, "};\n");
 141   }
 142 }
 143 
 144 // Declare an enumeration of user-defined register classes
 145 // and a list of register masks, one for each class.
 146 void ArchDesc::declare_register_masks(FILE *fp_hpp) {
 147   const char  *rc_name;
 148 
 149   if (_register) {
 150     // Build enumeration of user-defined register classes.
 151     defineRegClassEnum(fp_hpp, _register);
 152 
 153     // Generate a list of register masks, one for each class.
 154     fprintf(fp_hpp,"\n");
 155     fprintf(fp_hpp,"// Register masks, one for each register class.\n");
 156     _register->_rclasses.reset();
 157     for (rc_name = NULL; (rc_name = _register->_rclasses.iter()) != NULL;) {

 158       RegClass *reg_class = _register->getRegClass(rc_name);
 159       assert(reg_class, "Using an undefined register class");
 160       reg_class->declare_register_masks(fp_hpp);
















 161     }
 162   }
 163 }
 164 
 165 // Generate an enumeration of user-defined register classes
 166 // and a list of register masks, one for each class.
 167 void ArchDesc::build_register_masks(FILE *fp_cpp) {
 168   const char  *rc_name;
 169 
 170   if (_register) {
 171     // Generate a list of register masks, one for each class.
 172     fprintf(fp_cpp,"\n");
 173     fprintf(fp_cpp,"// Register masks, one for each register class.\n");
 174     _register->_rclasses.reset();
 175     for (rc_name = NULL; (rc_name = _register->_rclasses.iter()) != NULL;) {

 176       RegClass *reg_class = _register->getRegClass(rc_name);
 177       assert(reg_class, "Using an undefined register class");
 178       reg_class->build_register_masks(fp_cpp);

























 179     }
 180   }
 181 }
 182 
 183 // Compute an index for an array in the pipeline_reads_NNN arrays
 184 static int pipeline_reads_initializer(FILE *fp_cpp, NameList &pipeline_reads, PipeClassForm *pipeclass)
 185 {
 186   int templen = 1;
 187   int paramcount = 0;
 188   const char *paramname;
 189 
 190   if (pipeclass->_parameters.count() == 0)
 191     return -1;
 192 
 193   pipeclass->_parameters.reset();
 194   paramname = pipeclass->_parameters.iter();
 195   const PipeClassOperandForm *pipeopnd =
 196     (const PipeClassOperandForm *)pipeclass->_localUsage[paramname];
 197   if (pipeopnd && !pipeopnd->isWrite() && strcmp(pipeopnd->_stage, "Universal"))
 198     pipeclass->_parameters.reset();


src/share/vm/adlc/output_c.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File