cranelift_codegen_meta/shared/
formats.rs1use crate::cdsl::formats::{InstructionFormat, InstructionFormatBuilder as Builder};
2use crate::shared::{entities::EntityRefs, immediates::Immediates};
3use std::rc::Rc;
4
5pub(crate) struct Formats {
6 pub(crate) atomic_cas: Rc<InstructionFormat>,
7 pub(crate) atomic_rmw: Rc<InstructionFormat>,
8 pub(crate) binary: Rc<InstructionFormat>,
9 pub(crate) binary_imm8: Rc<InstructionFormat>,
10 pub(crate) binary_imm64: Rc<InstructionFormat>,
11 pub(crate) branch_table: Rc<InstructionFormat>,
12 pub(crate) brif: Rc<InstructionFormat>,
13 pub(crate) call: Rc<InstructionFormat>,
14 pub(crate) call_indirect: Rc<InstructionFormat>,
15 pub(crate) try_call: Rc<InstructionFormat>,
16 pub(crate) try_call_indirect: Rc<InstructionFormat>,
17 pub(crate) cond_trap: Rc<InstructionFormat>,
18 pub(crate) float_compare: Rc<InstructionFormat>,
19 pub(crate) func_addr: Rc<InstructionFormat>,
20 pub(crate) int_compare: Rc<InstructionFormat>,
21 pub(crate) int_compare_imm: Rc<InstructionFormat>,
22 pub(crate) int_add_trap: Rc<InstructionFormat>,
23 pub(crate) jump: Rc<InstructionFormat>,
24 pub(crate) load: Rc<InstructionFormat>,
25 pub(crate) load_no_offset: Rc<InstructionFormat>,
26 pub(crate) multiary: Rc<InstructionFormat>,
27 pub(crate) nullary: Rc<InstructionFormat>,
28 pub(crate) shuffle: Rc<InstructionFormat>,
29 pub(crate) stack_load: Rc<InstructionFormat>,
30 pub(crate) stack_store: Rc<InstructionFormat>,
31 pub(crate) dynamic_stack_load: Rc<InstructionFormat>,
32 pub(crate) dynamic_stack_store: Rc<InstructionFormat>,
33 pub(crate) store: Rc<InstructionFormat>,
34 pub(crate) store_no_offset: Rc<InstructionFormat>,
35 pub(crate) ternary: Rc<InstructionFormat>,
36 pub(crate) ternary_imm8: Rc<InstructionFormat>,
37 pub(crate) trap: Rc<InstructionFormat>,
38 pub(crate) unary: Rc<InstructionFormat>,
39 pub(crate) unary_const: Rc<InstructionFormat>,
40 pub(crate) unary_global_value: Rc<InstructionFormat>,
41 pub(crate) unary_ieee16: Rc<InstructionFormat>,
42 pub(crate) unary_ieee32: Rc<InstructionFormat>,
43 pub(crate) unary_ieee64: Rc<InstructionFormat>,
44 pub(crate) unary_imm: Rc<InstructionFormat>,
45}
46
47impl Formats {
48 pub fn new(imm: &Immediates, entities: &EntityRefs) -> Self {
49 Self {
50 unary: Builder::new("Unary").value().build(),
51
52 unary_imm: Builder::new("UnaryImm").imm(&imm.imm64).build(),
53
54 unary_ieee16: Builder::new("UnaryIeee16").imm(&imm.ieee16).build(),
55
56 unary_ieee32: Builder::new("UnaryIeee32").imm(&imm.ieee32).build(),
57
58 unary_ieee64: Builder::new("UnaryIeee64").imm(&imm.ieee64).build(),
59
60 unary_const: Builder::new("UnaryConst")
61 .imm(&entities.pool_constant)
62 .build(),
63
64 unary_global_value: Builder::new("UnaryGlobalValue")
65 .imm(&entities.global_value)
66 .build(),
67
68 binary: Builder::new("Binary").value().value().build(),
69
70 binary_imm8: Builder::new("BinaryImm8").value().imm(&imm.uimm8).build(),
71
72 binary_imm64: Builder::new("BinaryImm64").value().imm(&imm.imm64).build(),
73
74 ternary: Builder::new("Ternary")
78 .value()
79 .value()
80 .value()
81 .typevar_operand(1)
82 .build(),
83
84 ternary_imm8: Builder::new("TernaryImm8")
85 .value()
86 .imm(&imm.uimm8)
87 .value()
88 .build(),
89
90 multiary: Builder::new("MultiAry").varargs().build(),
93
94 nullary: Builder::new("NullAry").build(),
95
96 shuffle: Builder::new("Shuffle")
97 .value()
98 .value()
99 .imm(&entities.uimm128)
100 .build(),
101
102 int_compare: Builder::new("IntCompare")
103 .imm(&imm.intcc)
104 .value()
105 .value()
106 .build(),
107
108 int_compare_imm: Builder::new("IntCompareImm")
109 .imm(&imm.intcc)
110 .value()
111 .imm(&imm.imm64)
112 .build(),
113
114 float_compare: Builder::new("FloatCompare")
115 .imm(&imm.floatcc)
116 .value()
117 .value()
118 .build(),
119
120 jump: Builder::new("Jump").block().build(),
121
122 brif: Builder::new("Brif").value().block().block().build(),
123
124 branch_table: Builder::new("BranchTable")
125 .value()
126 .imm(&entities.jump_table)
127 .build(),
128
129 call: Builder::new("Call")
130 .imm(&entities.func_ref)
131 .varargs()
132 .build(),
133
134 call_indirect: Builder::new("CallIndirect")
135 .imm(&entities.sig_ref)
136 .value()
137 .varargs()
138 .build(),
139
140 try_call: Builder::new("TryCall")
141 .imm(&entities.func_ref)
142 .varargs()
143 .imm(&&entities.exception_table)
144 .build(),
145
146 try_call_indirect: Builder::new("TryCallIndirect")
147 .value()
148 .varargs()
149 .imm(&&entities.exception_table)
150 .build(),
151
152 func_addr: Builder::new("FuncAddr").imm(&entities.func_ref).build(),
153
154 atomic_rmw: Builder::new("AtomicRmw")
155 .imm(&imm.memflags)
156 .imm(&imm.atomic_rmw_op)
157 .value()
158 .value()
159 .build(),
160
161 atomic_cas: Builder::new("AtomicCas")
162 .imm(&imm.memflags)
163 .value()
164 .value()
165 .value()
166 .typevar_operand(2)
167 .build(),
168
169 load: Builder::new("Load")
170 .imm(&imm.memflags)
171 .value()
172 .imm(&imm.offset32)
173 .build(),
174
175 load_no_offset: Builder::new("LoadNoOffset")
176 .imm(&imm.memflags)
177 .value()
178 .build(),
179
180 store: Builder::new("Store")
181 .imm(&imm.memflags)
182 .value()
183 .value()
184 .imm(&imm.offset32)
185 .build(),
186
187 store_no_offset: Builder::new("StoreNoOffset")
188 .imm(&imm.memflags)
189 .value()
190 .value()
191 .build(),
192
193 stack_load: Builder::new("StackLoad")
194 .imm(&entities.stack_slot)
195 .imm(&imm.offset32)
196 .build(),
197
198 stack_store: Builder::new("StackStore")
199 .value()
200 .imm(&entities.stack_slot)
201 .imm(&imm.offset32)
202 .build(),
203
204 dynamic_stack_load: Builder::new("DynamicStackLoad")
205 .imm(&entities.dynamic_stack_slot)
206 .build(),
207
208 dynamic_stack_store: Builder::new("DynamicStackStore")
209 .value()
210 .imm(&entities.dynamic_stack_slot)
211 .build(),
212
213 trap: Builder::new("Trap").imm(&imm.trapcode).build(),
214
215 cond_trap: Builder::new("CondTrap").value().imm(&imm.trapcode).build(),
216
217 int_add_trap: Builder::new("IntAddTrap")
218 .value()
219 .value()
220 .imm(&imm.trapcode)
221 .build(),
222 }
223 }
224}