11 #include "gen_ia32_regalloc_if.h"
13 #include "ia32_bearch_t.h"
15 const arch_register_req_t ia32_class_reg_req_flags = {
16 .cls = &ia32_reg_classes[CLASS_ia32_flags],
19 static const unsigned ia32_limited_flags_eflags[] = { (1U << REG_FLAGS_EFLAGS) };
20 const arch_register_req_t ia32_single_reg_req_flags_eflags = {
21 .cls = &ia32_reg_classes[CLASS_ia32_flags],
22 .limited = ia32_limited_flags_eflags,
25 const arch_register_req_t ia32_class_reg_req_fp = {
26 .cls = &ia32_reg_classes[CLASS_ia32_fp],
29 static const unsigned ia32_limited_fp_st0[] = { (1U << REG_FP_ST0) };
30 const arch_register_req_t ia32_single_reg_req_fp_st0 = {
31 .cls = &ia32_reg_classes[CLASS_ia32_fp],
32 .limited = ia32_limited_fp_st0,
35 static const unsigned ia32_limited_fp_st1[] = { (1U << REG_FP_ST1) };
36 const arch_register_req_t ia32_single_reg_req_fp_st1 = {
37 .cls = &ia32_reg_classes[CLASS_ia32_fp],
38 .limited = ia32_limited_fp_st1,
41 static const unsigned ia32_limited_fp_st2[] = { (1U << REG_FP_ST2) };
42 const arch_register_req_t ia32_single_reg_req_fp_st2 = {
43 .cls = &ia32_reg_classes[CLASS_ia32_fp],
44 .limited = ia32_limited_fp_st2,
47 static const unsigned ia32_limited_fp_st3[] = { (1U << REG_FP_ST3) };
48 const arch_register_req_t ia32_single_reg_req_fp_st3 = {
49 .cls = &ia32_reg_classes[CLASS_ia32_fp],
50 .limited = ia32_limited_fp_st3,
53 static const unsigned ia32_limited_fp_st4[] = { (1U << REG_FP_ST4) };
54 const arch_register_req_t ia32_single_reg_req_fp_st4 = {
55 .cls = &ia32_reg_classes[CLASS_ia32_fp],
56 .limited = ia32_limited_fp_st4,
59 static const unsigned ia32_limited_fp_st5[] = { (1U << REG_FP_ST5) };
60 const arch_register_req_t ia32_single_reg_req_fp_st5 = {
61 .cls = &ia32_reg_classes[CLASS_ia32_fp],
62 .limited = ia32_limited_fp_st5,
65 static const unsigned ia32_limited_fp_st6[] = { (1U << REG_FP_ST6) };
66 const arch_register_req_t ia32_single_reg_req_fp_st6 = {
67 .cls = &ia32_reg_classes[CLASS_ia32_fp],
68 .limited = ia32_limited_fp_st6,
71 static const unsigned ia32_limited_fp_st7[] = { (1U << REG_FP_ST7) };
72 const arch_register_req_t ia32_single_reg_req_fp_st7 = {
73 .cls = &ia32_reg_classes[CLASS_ia32_fp],
74 .limited = ia32_limited_fp_st7,
77 static const unsigned ia32_limited_fp_fp_NOREG[] = { (1U << REG_FP_FP_NOREG) };
78 const arch_register_req_t ia32_single_reg_req_fp_fp_NOREG = {
79 .cls = &ia32_reg_classes[CLASS_ia32_fp],
80 .limited = ia32_limited_fp_fp_NOREG,
83 const arch_register_req_t ia32_class_reg_req_fpcw = {
84 .cls = &ia32_reg_classes[CLASS_ia32_fpcw],
87 static const unsigned ia32_limited_fpcw_fpcw[] = { (1U << REG_FPCW_FPCW) };
88 const arch_register_req_t ia32_single_reg_req_fpcw_fpcw = {
89 .cls = &ia32_reg_classes[CLASS_ia32_fpcw],
90 .limited = ia32_limited_fpcw_fpcw,
93 const arch_register_req_t ia32_class_reg_req_gp = {
94 .cls = &ia32_reg_classes[CLASS_ia32_gp],
97 static const unsigned ia32_limited_gp_edx[] = { (1U << REG_GP_EDX) };
98 const arch_register_req_t ia32_single_reg_req_gp_edx = {
99 .cls = &ia32_reg_classes[CLASS_ia32_gp],
100 .limited = ia32_limited_gp_edx,
103 static const unsigned ia32_limited_gp_ecx[] = { (1U << REG_GP_ECX) };
104 const arch_register_req_t ia32_single_reg_req_gp_ecx = {
105 .cls = &ia32_reg_classes[CLASS_ia32_gp],
106 .limited = ia32_limited_gp_ecx,
109 static const unsigned ia32_limited_gp_eax[] = { (1U << REG_GP_EAX) };
110 const arch_register_req_t ia32_single_reg_req_gp_eax = {
111 .cls = &ia32_reg_classes[CLASS_ia32_gp],
112 .limited = ia32_limited_gp_eax,
115 static const unsigned ia32_limited_gp_ebx[] = { (1U << REG_GP_EBX) };
116 const arch_register_req_t ia32_single_reg_req_gp_ebx = {
117 .cls = &ia32_reg_classes[CLASS_ia32_gp],
118 .limited = ia32_limited_gp_ebx,
121 static const unsigned ia32_limited_gp_esi[] = { (1U << REG_GP_ESI) };
122 const arch_register_req_t ia32_single_reg_req_gp_esi = {
123 .cls = &ia32_reg_classes[CLASS_ia32_gp],
124 .limited = ia32_limited_gp_esi,
127 static const unsigned ia32_limited_gp_edi[] = { (1U << REG_GP_EDI) };
128 const arch_register_req_t ia32_single_reg_req_gp_edi = {
129 .cls = &ia32_reg_classes[CLASS_ia32_gp],
130 .limited = ia32_limited_gp_edi,
133 static const unsigned ia32_limited_gp_ebp[] = { (1U << REG_GP_EBP) };
134 const arch_register_req_t ia32_single_reg_req_gp_ebp = {
135 .cls = &ia32_reg_classes[CLASS_ia32_gp],
136 .limited = ia32_limited_gp_ebp,
139 static const unsigned ia32_limited_gp_esp[] = { (1U << REG_GP_ESP) };
140 const arch_register_req_t ia32_single_reg_req_gp_esp = {
141 .cls = &ia32_reg_classes[CLASS_ia32_gp],
142 .limited = ia32_limited_gp_esp,
145 static const unsigned ia32_limited_gp_gp_NOREG[] = { (1U << REG_GP_GP_NOREG) };
146 const arch_register_req_t ia32_single_reg_req_gp_gp_NOREG = {
147 .cls = &ia32_reg_classes[CLASS_ia32_gp],
148 .limited = ia32_limited_gp_gp_NOREG,
151 const arch_register_req_t ia32_class_reg_req_xmm = {
152 .cls = &ia32_reg_classes[CLASS_ia32_xmm],
155 static const unsigned ia32_limited_xmm_xmm0[] = { (1U << REG_XMM_XMM0) };
156 const arch_register_req_t ia32_single_reg_req_xmm_xmm0 = {
157 .cls = &ia32_reg_classes[CLASS_ia32_xmm],
158 .limited = ia32_limited_xmm_xmm0,
161 static const unsigned ia32_limited_xmm_xmm1[] = { (1U << REG_XMM_XMM1) };
162 const arch_register_req_t ia32_single_reg_req_xmm_xmm1 = {
163 .cls = &ia32_reg_classes[CLASS_ia32_xmm],
164 .limited = ia32_limited_xmm_xmm1,
167 static const unsigned ia32_limited_xmm_xmm2[] = { (1U << REG_XMM_XMM2) };
168 const arch_register_req_t ia32_single_reg_req_xmm_xmm2 = {
169 .cls = &ia32_reg_classes[CLASS_ia32_xmm],
170 .limited = ia32_limited_xmm_xmm2,
173 static const unsigned ia32_limited_xmm_xmm3[] = { (1U << REG_XMM_XMM3) };
174 const arch_register_req_t ia32_single_reg_req_xmm_xmm3 = {
175 .cls = &ia32_reg_classes[CLASS_ia32_xmm],
176 .limited = ia32_limited_xmm_xmm3,
179 static const unsigned ia32_limited_xmm_xmm4[] = { (1U << REG_XMM_XMM4) };
180 const arch_register_req_t ia32_single_reg_req_xmm_xmm4 = {
181 .cls = &ia32_reg_classes[CLASS_ia32_xmm],
182 .limited = ia32_limited_xmm_xmm4,
185 static const unsigned ia32_limited_xmm_xmm5[] = { (1U << REG_XMM_XMM5) };
186 const arch_register_req_t ia32_single_reg_req_xmm_xmm5 = {
187 .cls = &ia32_reg_classes[CLASS_ia32_xmm],
188 .limited = ia32_limited_xmm_xmm5,
191 static const unsigned ia32_limited_xmm_xmm6[] = { (1U << REG_XMM_XMM6) };
192 const arch_register_req_t ia32_single_reg_req_xmm_xmm6 = {
193 .cls = &ia32_reg_classes[CLASS_ia32_xmm],
194 .limited = ia32_limited_xmm_xmm6,
197 static const unsigned ia32_limited_xmm_xmm7[] = { (1U << REG_XMM_XMM7) };
198 const arch_register_req_t ia32_single_reg_req_xmm_xmm7 = {
199 .cls = &ia32_reg_classes[CLASS_ia32_xmm],
200 .limited = ia32_limited_xmm_xmm7,
203 static const unsigned ia32_limited_xmm_xmm_NOREG[] = { (1U << REG_XMM_XMM_NOREG) };
204 const arch_register_req_t ia32_single_reg_req_xmm_xmm_NOREG = {
205 .cls = &ia32_reg_classes[CLASS_ia32_xmm],
206 .limited = ia32_limited_xmm_xmm_NOREG,
211 arch_register_class_t ia32_reg_classes[] = {
213 .name =
"ia32_flags",
215 .regs = &ia32_registers[REG_EFLAGS],
216 .class_req = &ia32_class_reg_req_flags,
217 .index = CLASS_ia32_flags,
224 .regs = &ia32_registers[REG_ST0],
225 .class_req = &ia32_class_reg_req_fp,
226 .index = CLASS_ia32_fp,
228 .allow_clobber_input =
true,
233 .regs = &ia32_registers[REG_FPCW],
234 .class_req = &ia32_class_reg_req_fpcw,
235 .index = CLASS_ia32_fpcw,
242 .regs = &ia32_registers[REG_EDX],
243 .class_req = &ia32_class_reg_req_gp,
244 .index = CLASS_ia32_gp,
250 .regs = &ia32_registers[REG_XMM0],
251 .class_req = &ia32_class_reg_req_xmm,
252 .index = CLASS_ia32_xmm,
259 const arch_register_t ia32_registers[] = {
262 .cls = &ia32_reg_classes[CLASS_ia32_flags],
263 .single_req = &ia32_single_reg_req_flags_eflags,
264 .index = REG_FLAGS_EFLAGS,
265 .global_index = REG_EFLAGS,
267 .encoding = REG_FLAGS_EFLAGS,
272 .cls = &ia32_reg_classes[CLASS_ia32_fp],
273 .single_req = &ia32_single_reg_req_fp_st0,
275 .global_index = REG_ST0,
282 .cls = &ia32_reg_classes[CLASS_ia32_fp],
283 .single_req = &ia32_single_reg_req_fp_st1,
285 .global_index = REG_ST1,
292 .cls = &ia32_reg_classes[CLASS_ia32_fp],
293 .single_req = &ia32_single_reg_req_fp_st2,
295 .global_index = REG_ST2,
302 .cls = &ia32_reg_classes[CLASS_ia32_fp],
303 .single_req = &ia32_single_reg_req_fp_st3,
305 .global_index = REG_ST3,
312 .cls = &ia32_reg_classes[CLASS_ia32_fp],
313 .single_req = &ia32_single_reg_req_fp_st4,
315 .global_index = REG_ST4,
322 .cls = &ia32_reg_classes[CLASS_ia32_fp],
323 .single_req = &ia32_single_reg_req_fp_st5,
325 .global_index = REG_ST5,
332 .cls = &ia32_reg_classes[CLASS_ia32_fp],
333 .single_req = &ia32_single_reg_req_fp_st6,
335 .global_index = REG_ST6,
342 .cls = &ia32_reg_classes[CLASS_ia32_fp],
343 .single_req = &ia32_single_reg_req_fp_st7,
345 .global_index = REG_ST7,
352 .cls = &ia32_reg_classes[CLASS_ia32_fp],
353 .single_req = &ia32_single_reg_req_fp_fp_NOREG,
354 .index = REG_FP_FP_NOREG,
355 .global_index = REG_FP_NOREG,
357 .encoding = REG_FP_FP_NOREG,
362 .cls = &ia32_reg_classes[CLASS_ia32_fpcw],
363 .single_req = &ia32_single_reg_req_fpcw_fpcw,
364 .index = REG_FPCW_FPCW,
365 .global_index = REG_FPCW,
367 .encoding = REG_FPCW_FPCW,
372 .cls = &ia32_reg_classes[CLASS_ia32_gp],
373 .single_req = &ia32_single_reg_req_gp_edx,
375 .global_index = REG_EDX,
382 .cls = &ia32_reg_classes[CLASS_ia32_gp],
383 .single_req = &ia32_single_reg_req_gp_ecx,
385 .global_index = REG_ECX,
392 .cls = &ia32_reg_classes[CLASS_ia32_gp],
393 .single_req = &ia32_single_reg_req_gp_eax,
395 .global_index = REG_EAX,
402 .cls = &ia32_reg_classes[CLASS_ia32_gp],
403 .single_req = &ia32_single_reg_req_gp_ebx,
405 .global_index = REG_EBX,
412 .cls = &ia32_reg_classes[CLASS_ia32_gp],
413 .single_req = &ia32_single_reg_req_gp_esi,
415 .global_index = REG_ESI,
422 .cls = &ia32_reg_classes[CLASS_ia32_gp],
423 .single_req = &ia32_single_reg_req_gp_edi,
425 .global_index = REG_EDI,
432 .cls = &ia32_reg_classes[CLASS_ia32_gp],
433 .single_req = &ia32_single_reg_req_gp_ebp,
435 .global_index = REG_EBP,
442 .cls = &ia32_reg_classes[CLASS_ia32_gp],
443 .single_req = &ia32_single_reg_req_gp_esp,
445 .global_index = REG_ESP,
452 .cls = &ia32_reg_classes[CLASS_ia32_gp],
453 .single_req = &ia32_single_reg_req_gp_gp_NOREG,
454 .index = REG_GP_GP_NOREG,
455 .global_index = REG_GP_NOREG,
457 .encoding = REG_GP_GP_NOREG,
462 .cls = &ia32_reg_classes[CLASS_ia32_xmm],
463 .single_req = &ia32_single_reg_req_xmm_xmm0,
464 .index = REG_XMM_XMM0,
465 .global_index = REG_XMM0,
467 .encoding = REG_XMM_XMM0,
472 .cls = &ia32_reg_classes[CLASS_ia32_xmm],
473 .single_req = &ia32_single_reg_req_xmm_xmm1,
474 .index = REG_XMM_XMM1,
475 .global_index = REG_XMM1,
477 .encoding = REG_XMM_XMM1,
482 .cls = &ia32_reg_classes[CLASS_ia32_xmm],
483 .single_req = &ia32_single_reg_req_xmm_xmm2,
484 .index = REG_XMM_XMM2,
485 .global_index = REG_XMM2,
487 .encoding = REG_XMM_XMM2,
492 .cls = &ia32_reg_classes[CLASS_ia32_xmm],
493 .single_req = &ia32_single_reg_req_xmm_xmm3,
494 .index = REG_XMM_XMM3,
495 .global_index = REG_XMM3,
497 .encoding = REG_XMM_XMM3,
502 .cls = &ia32_reg_classes[CLASS_ia32_xmm],
503 .single_req = &ia32_single_reg_req_xmm_xmm4,
504 .index = REG_XMM_XMM4,
505 .global_index = REG_XMM4,
507 .encoding = REG_XMM_XMM4,
512 .cls = &ia32_reg_classes[CLASS_ia32_xmm],
513 .single_req = &ia32_single_reg_req_xmm_xmm5,
514 .index = REG_XMM_XMM5,
515 .global_index = REG_XMM5,
517 .encoding = REG_XMM_XMM5,
522 .cls = &ia32_reg_classes[CLASS_ia32_xmm],
523 .single_req = &ia32_single_reg_req_xmm_xmm6,
524 .index = REG_XMM_XMM6,
525 .global_index = REG_XMM6,
527 .encoding = REG_XMM_XMM6,
532 .cls = &ia32_reg_classes[CLASS_ia32_xmm],
533 .single_req = &ia32_single_reg_req_xmm_xmm7,
534 .index = REG_XMM_XMM7,
535 .global_index = REG_XMM7,
537 .encoding = REG_XMM_XMM7,
542 .cls = &ia32_reg_classes[CLASS_ia32_xmm],
543 .single_req = &ia32_single_reg_req_xmm_xmm_NOREG,
544 .index = REG_XMM_XMM_NOREG,
545 .global_index = REG_XMM_NOREG,
547 .encoding = REG_XMM_XMM_NOREG,
556 void ia32_register_init(
void)
558 ia32_reg_classes[CLASS_ia32_flags].mode = ia32_mode_flags;
559 ia32_reg_classes[CLASS_ia32_fp].mode = x86_mode_E;
560 ia32_reg_classes[CLASS_ia32_fpcw].mode = ia32_mode_fpcw;
561 ia32_reg_classes[CLASS_ia32_gp].mode = ia32_mode_gp;
562 ia32_reg_classes[CLASS_ia32_xmm].mode = ia32_mode_float64;