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();
|