cranelift_codegen/isa/x64/inst/
regs.rs1use crate::machinst::Reg;
9use alloc::string::ToString;
10use cranelift_assembler_x64::{gpr, xmm};
11use regalloc2::{PReg, RegClass, VReg};
12use std::string::String;
13
14const fn gpr(enc: u8) -> Reg {
17 let preg = gpr_preg(enc);
18 Reg::from_virtual_reg(VReg::new(preg.index(), RegClass::Int))
19}
20pub(crate) const fn gpr_preg(enc: u8) -> PReg {
21 PReg::new(enc as usize, RegClass::Int)
22}
23
24pub(crate) const fn rax() -> Reg {
25 gpr(gpr::enc::RAX)
26}
27pub(crate) const fn rcx() -> Reg {
28 gpr(gpr::enc::RCX)
29}
30pub(crate) const fn rdx() -> Reg {
31 gpr(gpr::enc::RDX)
32}
33pub(crate) const fn rbx() -> Reg {
34 gpr(gpr::enc::RBX)
35}
36pub(crate) const fn rsp() -> Reg {
37 gpr(gpr::enc::RSP)
38}
39pub(crate) const fn rbp() -> Reg {
40 gpr(gpr::enc::RBP)
41}
42pub(crate) const fn rsi() -> Reg {
43 gpr(gpr::enc::RSI)
44}
45pub(crate) const fn rdi() -> Reg {
46 gpr(gpr::enc::RDI)
47}
48pub(crate) const fn r8() -> Reg {
49 gpr(gpr::enc::R8)
50}
51pub(crate) const fn r9() -> Reg {
52 gpr(gpr::enc::R9)
53}
54pub(crate) const fn r10() -> Reg {
55 gpr(gpr::enc::R10)
56}
57pub(crate) const fn r11() -> Reg {
58 gpr(gpr::enc::R11)
59}
60pub(crate) const fn r12() -> Reg {
61 gpr(gpr::enc::R12)
62}
63pub(crate) const fn r13() -> Reg {
64 gpr(gpr::enc::R13)
65}
66pub(crate) const fn r14() -> Reg {
67 gpr(gpr::enc::R14)
68}
69pub(crate) const fn r15() -> Reg {
70 gpr(gpr::enc::R15)
71}
72
73pub(crate) const fn pinned_reg() -> Reg {
77 r15()
78}
79
80const fn fpr(enc: u8) -> Reg {
81 let preg = fpr_preg(enc);
82 Reg::from_virtual_reg(VReg::new(preg.index(), RegClass::Float))
83}
84
85pub(crate) const fn fpr_preg(enc: u8) -> PReg {
86 PReg::new(enc as usize, RegClass::Float)
87}
88
89pub(crate) const fn xmm0() -> Reg {
90 fpr(xmm::enc::XMM0)
91}
92pub(crate) const fn xmm1() -> Reg {
93 fpr(xmm::enc::XMM1)
94}
95pub(crate) const fn xmm2() -> Reg {
96 fpr(xmm::enc::XMM2)
97}
98pub(crate) const fn xmm3() -> Reg {
99 fpr(xmm::enc::XMM3)
100}
101pub(crate) const fn xmm4() -> Reg {
102 fpr(xmm::enc::XMM4)
103}
104pub(crate) const fn xmm5() -> Reg {
105 fpr(xmm::enc::XMM5)
106}
107pub(crate) const fn xmm6() -> Reg {
108 fpr(xmm::enc::XMM6)
109}
110pub(crate) const fn xmm7() -> Reg {
111 fpr(xmm::enc::XMM7)
112}
113pub(crate) const fn xmm8() -> Reg {
114 fpr(xmm::enc::XMM8)
115}
116pub(crate) const fn xmm9() -> Reg {
117 fpr(xmm::enc::XMM9)
118}
119pub(crate) const fn xmm10() -> Reg {
120 fpr(xmm::enc::XMM10)
121}
122pub(crate) const fn xmm11() -> Reg {
123 fpr(xmm::enc::XMM11)
124}
125pub(crate) const fn xmm12() -> Reg {
126 fpr(xmm::enc::XMM12)
127}
128pub(crate) const fn xmm13() -> Reg {
129 fpr(xmm::enc::XMM13)
130}
131pub(crate) const fn xmm14() -> Reg {
132 fpr(xmm::enc::XMM14)
133}
134pub(crate) const fn xmm15() -> Reg {
135 fpr(xmm::enc::XMM15)
136}
137
138pub fn pretty_print_reg(reg: Reg, size: u8) -> String {
146 if let Some(rreg) = reg.to_real_reg() {
147 let enc = rreg.hw_enc();
148 let name = match rreg.class() {
149 RegClass::Int => {
150 let size = match size {
151 8 => gpr::Size::Quadword,
152 4 => gpr::Size::Doubleword,
153 2 => gpr::Size::Word,
154 1 => gpr::Size::Byte,
155 _ => unreachable!("invalid size"),
156 };
157 gpr::enc::to_string(enc, size)
158 }
159 RegClass::Float => xmm::enc::to_string(enc),
160 RegClass::Vector => unreachable!(),
161 };
162 name.to_string()
163 } else {
164 let mut name = format!("%{reg:?}");
165 if reg.class() == RegClass::Int && size != 8 {
167 name.push_str(match size {
168 4 => "l",
169 2 => "w",
170 1 => "b",
171 _ => unreachable!("invalid size"),
172 });
173 }
174 name
175 }
176}