11 #include "gen_amd64_regalloc_if.h"
13 #include "amd64_bearch_t.h"
15 const arch_register_req_t amd64_class_reg_req_flags = {
16 .cls = &amd64_reg_classes[CLASS_amd64_flags],
19 static const unsigned amd64_limited_flags_eflags[] = { (1U << REG_FLAGS_EFLAGS) };
20 const arch_register_req_t amd64_single_reg_req_flags_eflags = {
21 .cls = &amd64_reg_classes[CLASS_amd64_flags],
22 .limited = amd64_limited_flags_eflags,
25 const arch_register_req_t amd64_class_reg_req_gp = {
26 .cls = &amd64_reg_classes[CLASS_amd64_gp],
29 static const unsigned amd64_limited_gp_rax[] = { (1U << REG_GP_RAX) };
30 const arch_register_req_t amd64_single_reg_req_gp_rax = {
31 .cls = &amd64_reg_classes[CLASS_amd64_gp],
32 .limited = amd64_limited_gp_rax,
35 static const unsigned amd64_limited_gp_rcx[] = { (1U << REG_GP_RCX) };
36 const arch_register_req_t amd64_single_reg_req_gp_rcx = {
37 .cls = &amd64_reg_classes[CLASS_amd64_gp],
38 .limited = amd64_limited_gp_rcx,
41 static const unsigned amd64_limited_gp_rdx[] = { (1U << REG_GP_RDX) };
42 const arch_register_req_t amd64_single_reg_req_gp_rdx = {
43 .cls = &amd64_reg_classes[CLASS_amd64_gp],
44 .limited = amd64_limited_gp_rdx,
47 static const unsigned amd64_limited_gp_rsi[] = { (1U << REG_GP_RSI) };
48 const arch_register_req_t amd64_single_reg_req_gp_rsi = {
49 .cls = &amd64_reg_classes[CLASS_amd64_gp],
50 .limited = amd64_limited_gp_rsi,
53 static const unsigned amd64_limited_gp_rdi[] = { (1U << REG_GP_RDI) };
54 const arch_register_req_t amd64_single_reg_req_gp_rdi = {
55 .cls = &amd64_reg_classes[CLASS_amd64_gp],
56 .limited = amd64_limited_gp_rdi,
59 static const unsigned amd64_limited_gp_rbx[] = { (1U << REG_GP_RBX) };
60 const arch_register_req_t amd64_single_reg_req_gp_rbx = {
61 .cls = &amd64_reg_classes[CLASS_amd64_gp],
62 .limited = amd64_limited_gp_rbx,
65 static const unsigned amd64_limited_gp_rbp[] = { (1U << REG_GP_RBP) };
66 const arch_register_req_t amd64_single_reg_req_gp_rbp = {
67 .cls = &amd64_reg_classes[CLASS_amd64_gp],
68 .limited = amd64_limited_gp_rbp,
71 static const unsigned amd64_limited_gp_rsp[] = { (1U << REG_GP_RSP) };
72 const arch_register_req_t amd64_single_reg_req_gp_rsp = {
73 .cls = &amd64_reg_classes[CLASS_amd64_gp],
74 .limited = amd64_limited_gp_rsp,
77 static const unsigned amd64_limited_gp_r8[] = { (1U << REG_GP_R8) };
78 const arch_register_req_t amd64_single_reg_req_gp_r8 = {
79 .cls = &amd64_reg_classes[CLASS_amd64_gp],
80 .limited = amd64_limited_gp_r8,
83 static const unsigned amd64_limited_gp_r9[] = { (1U << REG_GP_R9) };
84 const arch_register_req_t amd64_single_reg_req_gp_r9 = {
85 .cls = &amd64_reg_classes[CLASS_amd64_gp],
86 .limited = amd64_limited_gp_r9,
89 static const unsigned amd64_limited_gp_r10[] = { (1U << REG_GP_R10) };
90 const arch_register_req_t amd64_single_reg_req_gp_r10 = {
91 .cls = &amd64_reg_classes[CLASS_amd64_gp],
92 .limited = amd64_limited_gp_r10,
95 static const unsigned amd64_limited_gp_r11[] = { (1U << REG_GP_R11) };
96 const arch_register_req_t amd64_single_reg_req_gp_r11 = {
97 .cls = &amd64_reg_classes[CLASS_amd64_gp],
98 .limited = amd64_limited_gp_r11,
101 static const unsigned amd64_limited_gp_r12[] = { (1U << REG_GP_R12) };
102 const arch_register_req_t amd64_single_reg_req_gp_r12 = {
103 .cls = &amd64_reg_classes[CLASS_amd64_gp],
104 .limited = amd64_limited_gp_r12,
107 static const unsigned amd64_limited_gp_r13[] = { (1U << REG_GP_R13) };
108 const arch_register_req_t amd64_single_reg_req_gp_r13 = {
109 .cls = &amd64_reg_classes[CLASS_amd64_gp],
110 .limited = amd64_limited_gp_r13,
113 static const unsigned amd64_limited_gp_r14[] = { (1U << REG_GP_R14) };
114 const arch_register_req_t amd64_single_reg_req_gp_r14 = {
115 .cls = &amd64_reg_classes[CLASS_amd64_gp],
116 .limited = amd64_limited_gp_r14,
119 static const unsigned amd64_limited_gp_r15[] = { (1U << REG_GP_R15) };
120 const arch_register_req_t amd64_single_reg_req_gp_r15 = {
121 .cls = &amd64_reg_classes[CLASS_amd64_gp],
122 .limited = amd64_limited_gp_r15,
125 const arch_register_req_t amd64_class_reg_req_x87 = {
126 .cls = &amd64_reg_classes[CLASS_amd64_x87],
129 static const unsigned amd64_limited_x87_st0[] = { (1U << REG_X87_ST0) };
130 const arch_register_req_t amd64_single_reg_req_x87_st0 = {
131 .cls = &amd64_reg_classes[CLASS_amd64_x87],
132 .limited = amd64_limited_x87_st0,
135 static const unsigned amd64_limited_x87_st1[] = { (1U << REG_X87_ST1) };
136 const arch_register_req_t amd64_single_reg_req_x87_st1 = {
137 .cls = &amd64_reg_classes[CLASS_amd64_x87],
138 .limited = amd64_limited_x87_st1,
141 static const unsigned amd64_limited_x87_st2[] = { (1U << REG_X87_ST2) };
142 const arch_register_req_t amd64_single_reg_req_x87_st2 = {
143 .cls = &amd64_reg_classes[CLASS_amd64_x87],
144 .limited = amd64_limited_x87_st2,
147 static const unsigned amd64_limited_x87_st3[] = { (1U << REG_X87_ST3) };
148 const arch_register_req_t amd64_single_reg_req_x87_st3 = {
149 .cls = &amd64_reg_classes[CLASS_amd64_x87],
150 .limited = amd64_limited_x87_st3,
153 static const unsigned amd64_limited_x87_st4[] = { (1U << REG_X87_ST4) };
154 const arch_register_req_t amd64_single_reg_req_x87_st4 = {
155 .cls = &amd64_reg_classes[CLASS_amd64_x87],
156 .limited = amd64_limited_x87_st4,
159 static const unsigned amd64_limited_x87_st5[] = { (1U << REG_X87_ST5) };
160 const arch_register_req_t amd64_single_reg_req_x87_st5 = {
161 .cls = &amd64_reg_classes[CLASS_amd64_x87],
162 .limited = amd64_limited_x87_st5,
165 static const unsigned amd64_limited_x87_st6[] = { (1U << REG_X87_ST6) };
166 const arch_register_req_t amd64_single_reg_req_x87_st6 = {
167 .cls = &amd64_reg_classes[CLASS_amd64_x87],
168 .limited = amd64_limited_x87_st6,
171 static const unsigned amd64_limited_x87_st7[] = { (1U << REG_X87_ST7) };
172 const arch_register_req_t amd64_single_reg_req_x87_st7 = {
173 .cls = &amd64_reg_classes[CLASS_amd64_x87],
174 .limited = amd64_limited_x87_st7,
177 const arch_register_req_t amd64_class_reg_req_xmm = {
178 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
181 static const unsigned amd64_limited_xmm_xmm0[] = { (1U << REG_XMM_XMM0) };
182 const arch_register_req_t amd64_single_reg_req_xmm_xmm0 = {
183 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
184 .limited = amd64_limited_xmm_xmm0,
187 static const unsigned amd64_limited_xmm_xmm1[] = { (1U << REG_XMM_XMM1) };
188 const arch_register_req_t amd64_single_reg_req_xmm_xmm1 = {
189 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
190 .limited = amd64_limited_xmm_xmm1,
193 static const unsigned amd64_limited_xmm_xmm2[] = { (1U << REG_XMM_XMM2) };
194 const arch_register_req_t amd64_single_reg_req_xmm_xmm2 = {
195 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
196 .limited = amd64_limited_xmm_xmm2,
199 static const unsigned amd64_limited_xmm_xmm3[] = { (1U << REG_XMM_XMM3) };
200 const arch_register_req_t amd64_single_reg_req_xmm_xmm3 = {
201 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
202 .limited = amd64_limited_xmm_xmm3,
205 static const unsigned amd64_limited_xmm_xmm4[] = { (1U << REG_XMM_XMM4) };
206 const arch_register_req_t amd64_single_reg_req_xmm_xmm4 = {
207 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
208 .limited = amd64_limited_xmm_xmm4,
211 static const unsigned amd64_limited_xmm_xmm5[] = { (1U << REG_XMM_XMM5) };
212 const arch_register_req_t amd64_single_reg_req_xmm_xmm5 = {
213 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
214 .limited = amd64_limited_xmm_xmm5,
217 static const unsigned amd64_limited_xmm_xmm6[] = { (1U << REG_XMM_XMM6) };
218 const arch_register_req_t amd64_single_reg_req_xmm_xmm6 = {
219 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
220 .limited = amd64_limited_xmm_xmm6,
223 static const unsigned amd64_limited_xmm_xmm7[] = { (1U << REG_XMM_XMM7) };
224 const arch_register_req_t amd64_single_reg_req_xmm_xmm7 = {
225 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
226 .limited = amd64_limited_xmm_xmm7,
229 static const unsigned amd64_limited_xmm_xmm8[] = { (1U << REG_XMM_XMM8) };
230 const arch_register_req_t amd64_single_reg_req_xmm_xmm8 = {
231 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
232 .limited = amd64_limited_xmm_xmm8,
235 static const unsigned amd64_limited_xmm_xmm9[] = { (1U << REG_XMM_XMM9) };
236 const arch_register_req_t amd64_single_reg_req_xmm_xmm9 = {
237 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
238 .limited = amd64_limited_xmm_xmm9,
241 static const unsigned amd64_limited_xmm_xmm10[] = { (1U << REG_XMM_XMM10) };
242 const arch_register_req_t amd64_single_reg_req_xmm_xmm10 = {
243 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
244 .limited = amd64_limited_xmm_xmm10,
247 static const unsigned amd64_limited_xmm_xmm11[] = { (1U << REG_XMM_XMM11) };
248 const arch_register_req_t amd64_single_reg_req_xmm_xmm11 = {
249 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
250 .limited = amd64_limited_xmm_xmm11,
253 static const unsigned amd64_limited_xmm_xmm12[] = { (1U << REG_XMM_XMM12) };
254 const arch_register_req_t amd64_single_reg_req_xmm_xmm12 = {
255 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
256 .limited = amd64_limited_xmm_xmm12,
259 static const unsigned amd64_limited_xmm_xmm13[] = { (1U << REG_XMM_XMM13) };
260 const arch_register_req_t amd64_single_reg_req_xmm_xmm13 = {
261 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
262 .limited = amd64_limited_xmm_xmm13,
265 static const unsigned amd64_limited_xmm_xmm14[] = { (1U << REG_XMM_XMM14) };
266 const arch_register_req_t amd64_single_reg_req_xmm_xmm14 = {
267 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
268 .limited = amd64_limited_xmm_xmm14,
271 static const unsigned amd64_limited_xmm_xmm15[] = { (1U << REG_XMM_XMM15) };
272 const arch_register_req_t amd64_single_reg_req_xmm_xmm15 = {
273 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
274 .limited = amd64_limited_xmm_xmm15,
279 arch_register_class_t amd64_reg_classes[] = {
281 .name =
"amd64_flags",
283 .regs = &amd64_registers[REG_EFLAGS],
284 .class_req = &amd64_class_reg_req_flags,
285 .index = CLASS_amd64_flags,
292 .regs = &amd64_registers[REG_RAX],
293 .class_req = &amd64_class_reg_req_gp,
294 .index = CLASS_amd64_gp,
300 .regs = &amd64_registers[REG_ST0],
301 .class_req = &amd64_class_reg_req_x87,
302 .index = CLASS_amd64_x87,
304 .allow_clobber_input =
true,
309 .regs = &amd64_registers[REG_XMM0],
310 .class_req = &amd64_class_reg_req_xmm,
311 .index = CLASS_amd64_xmm,
318 const arch_register_t amd64_registers[] = {
321 .cls = &amd64_reg_classes[CLASS_amd64_flags],
322 .single_req = &amd64_single_reg_req_flags_eflags,
323 .index = REG_FLAGS_EFLAGS,
324 .global_index = REG_EFLAGS,
326 .encoding = REG_FLAGS_EFLAGS,
331 .cls = &amd64_reg_classes[CLASS_amd64_gp],
332 .single_req = &amd64_single_reg_req_gp_rax,
334 .global_index = REG_RAX,
336 .encoding = REG_GP_RAX,
341 .cls = &amd64_reg_classes[CLASS_amd64_gp],
342 .single_req = &amd64_single_reg_req_gp_rcx,
344 .global_index = REG_RCX,
346 .encoding = REG_GP_RCX,
351 .cls = &amd64_reg_classes[CLASS_amd64_gp],
352 .single_req = &amd64_single_reg_req_gp_rdx,
354 .global_index = REG_RDX,
356 .encoding = REG_GP_RDX,
361 .cls = &amd64_reg_classes[CLASS_amd64_gp],
362 .single_req = &amd64_single_reg_req_gp_rsi,
364 .global_index = REG_RSI,
366 .encoding = REG_GP_RSI,
371 .cls = &amd64_reg_classes[CLASS_amd64_gp],
372 .single_req = &amd64_single_reg_req_gp_rdi,
374 .global_index = REG_RDI,
376 .encoding = REG_GP_RDI,
381 .cls = &amd64_reg_classes[CLASS_amd64_gp],
382 .single_req = &amd64_single_reg_req_gp_rbx,
384 .global_index = REG_RBX,
386 .encoding = REG_GP_RBX,
391 .cls = &amd64_reg_classes[CLASS_amd64_gp],
392 .single_req = &amd64_single_reg_req_gp_rbp,
394 .global_index = REG_RBP,
396 .encoding = REG_GP_RBP,
401 .cls = &amd64_reg_classes[CLASS_amd64_gp],
402 .single_req = &amd64_single_reg_req_gp_rsp,
404 .global_index = REG_RSP,
406 .encoding = REG_GP_RSP,
411 .cls = &amd64_reg_classes[CLASS_amd64_gp],
412 .single_req = &amd64_single_reg_req_gp_r8,
414 .global_index = REG_R8,
416 .encoding = REG_GP_R8,
421 .cls = &amd64_reg_classes[CLASS_amd64_gp],
422 .single_req = &amd64_single_reg_req_gp_r9,
424 .global_index = REG_R9,
426 .encoding = REG_GP_R9,
431 .cls = &amd64_reg_classes[CLASS_amd64_gp],
432 .single_req = &amd64_single_reg_req_gp_r10,
434 .global_index = REG_R10,
436 .encoding = REG_GP_R10,
441 .cls = &amd64_reg_classes[CLASS_amd64_gp],
442 .single_req = &amd64_single_reg_req_gp_r11,
444 .global_index = REG_R11,
446 .encoding = REG_GP_R11,
451 .cls = &amd64_reg_classes[CLASS_amd64_gp],
452 .single_req = &amd64_single_reg_req_gp_r12,
454 .global_index = REG_R12,
456 .encoding = REG_GP_R12,
461 .cls = &amd64_reg_classes[CLASS_amd64_gp],
462 .single_req = &amd64_single_reg_req_gp_r13,
464 .global_index = REG_R13,
466 .encoding = REG_GP_R13,
471 .cls = &amd64_reg_classes[CLASS_amd64_gp],
472 .single_req = &amd64_single_reg_req_gp_r14,
474 .global_index = REG_R14,
476 .encoding = REG_GP_R14,
481 .cls = &amd64_reg_classes[CLASS_amd64_gp],
482 .single_req = &amd64_single_reg_req_gp_r15,
484 .global_index = REG_R15,
486 .encoding = REG_GP_R15,
491 .cls = &amd64_reg_classes[CLASS_amd64_x87],
492 .single_req = &amd64_single_reg_req_x87_st0,
493 .index = REG_X87_ST0,
494 .global_index = REG_ST0,
501 .cls = &amd64_reg_classes[CLASS_amd64_x87],
502 .single_req = &amd64_single_reg_req_x87_st1,
503 .index = REG_X87_ST1,
504 .global_index = REG_ST1,
511 .cls = &amd64_reg_classes[CLASS_amd64_x87],
512 .single_req = &amd64_single_reg_req_x87_st2,
513 .index = REG_X87_ST2,
514 .global_index = REG_ST2,
521 .cls = &amd64_reg_classes[CLASS_amd64_x87],
522 .single_req = &amd64_single_reg_req_x87_st3,
523 .index = REG_X87_ST3,
524 .global_index = REG_ST3,
531 .cls = &amd64_reg_classes[CLASS_amd64_x87],
532 .single_req = &amd64_single_reg_req_x87_st4,
533 .index = REG_X87_ST4,
534 .global_index = REG_ST4,
541 .cls = &amd64_reg_classes[CLASS_amd64_x87],
542 .single_req = &amd64_single_reg_req_x87_st5,
543 .index = REG_X87_ST5,
544 .global_index = REG_ST5,
551 .cls = &amd64_reg_classes[CLASS_amd64_x87],
552 .single_req = &amd64_single_reg_req_x87_st6,
553 .index = REG_X87_ST6,
554 .global_index = REG_ST6,
561 .cls = &amd64_reg_classes[CLASS_amd64_x87],
562 .single_req = &amd64_single_reg_req_x87_st7,
563 .index = REG_X87_ST7,
564 .global_index = REG_ST7,
571 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
572 .single_req = &amd64_single_reg_req_xmm_xmm0,
573 .index = REG_XMM_XMM0,
574 .global_index = REG_XMM0,
576 .encoding = REG_XMM_XMM0,
581 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
582 .single_req = &amd64_single_reg_req_xmm_xmm1,
583 .index = REG_XMM_XMM1,
584 .global_index = REG_XMM1,
586 .encoding = REG_XMM_XMM1,
591 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
592 .single_req = &amd64_single_reg_req_xmm_xmm2,
593 .index = REG_XMM_XMM2,
594 .global_index = REG_XMM2,
596 .encoding = REG_XMM_XMM2,
601 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
602 .single_req = &amd64_single_reg_req_xmm_xmm3,
603 .index = REG_XMM_XMM3,
604 .global_index = REG_XMM3,
606 .encoding = REG_XMM_XMM3,
611 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
612 .single_req = &amd64_single_reg_req_xmm_xmm4,
613 .index = REG_XMM_XMM4,
614 .global_index = REG_XMM4,
616 .encoding = REG_XMM_XMM4,
621 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
622 .single_req = &amd64_single_reg_req_xmm_xmm5,
623 .index = REG_XMM_XMM5,
624 .global_index = REG_XMM5,
626 .encoding = REG_XMM_XMM5,
631 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
632 .single_req = &amd64_single_reg_req_xmm_xmm6,
633 .index = REG_XMM_XMM6,
634 .global_index = REG_XMM6,
636 .encoding = REG_XMM_XMM6,
641 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
642 .single_req = &amd64_single_reg_req_xmm_xmm7,
643 .index = REG_XMM_XMM7,
644 .global_index = REG_XMM7,
646 .encoding = REG_XMM_XMM7,
651 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
652 .single_req = &amd64_single_reg_req_xmm_xmm8,
653 .index = REG_XMM_XMM8,
654 .global_index = REG_XMM8,
656 .encoding = REG_XMM_XMM8,
661 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
662 .single_req = &amd64_single_reg_req_xmm_xmm9,
663 .index = REG_XMM_XMM9,
664 .global_index = REG_XMM9,
666 .encoding = REG_XMM_XMM9,
671 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
672 .single_req = &amd64_single_reg_req_xmm_xmm10,
673 .index = REG_XMM_XMM10,
674 .global_index = REG_XMM10,
676 .encoding = REG_XMM_XMM10,
681 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
682 .single_req = &amd64_single_reg_req_xmm_xmm11,
683 .index = REG_XMM_XMM11,
684 .global_index = REG_XMM11,
686 .encoding = REG_XMM_XMM11,
691 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
692 .single_req = &amd64_single_reg_req_xmm_xmm12,
693 .index = REG_XMM_XMM12,
694 .global_index = REG_XMM12,
696 .encoding = REG_XMM_XMM12,
701 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
702 .single_req = &amd64_single_reg_req_xmm_xmm13,
703 .index = REG_XMM_XMM13,
704 .global_index = REG_XMM13,
706 .encoding = REG_XMM_XMM13,
711 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
712 .single_req = &amd64_single_reg_req_xmm_xmm14,
713 .index = REG_XMM_XMM14,
714 .global_index = REG_XMM14,
716 .encoding = REG_XMM_XMM14,
721 .cls = &amd64_reg_classes[CLASS_amd64_xmm],
722 .single_req = &amd64_single_reg_req_xmm_xmm15,
723 .index = REG_XMM_XMM15,
724 .global_index = REG_XMM15,
726 .encoding = REG_XMM_XMM15,
735 void amd64_register_init(
void)
737 amd64_reg_classes[CLASS_amd64_flags].mode =
mode_Iu;
738 amd64_reg_classes[CLASS_amd64_gp].mode =
mode_Lu;
739 amd64_reg_classes[CLASS_amd64_x87].mode = x86_mode_E;
740 amd64_reg_classes[CLASS_amd64_xmm].mode = amd64_mode_xmm;