cranelift_codegen_meta/shared/
formats.rs

1use 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    pub(crate) exception_handler_address: Rc<InstructionFormat>,
46}
47
48impl Formats {
49    pub fn new(imm: &Immediates, entities: &EntityRefs) -> Self {
50        Self {
51            unary: Builder::new("Unary").value().build(),
52
53            unary_imm: Builder::new("UnaryImm").imm(&imm.imm64).build(),
54
55            unary_ieee16: Builder::new("UnaryIeee16").imm(&imm.ieee16).build(),
56
57            unary_ieee32: Builder::new("UnaryIeee32").imm(&imm.ieee32).build(),
58
59            unary_ieee64: Builder::new("UnaryIeee64").imm(&imm.ieee64).build(),
60
61            unary_const: Builder::new("UnaryConst")
62                .imm(&entities.pool_constant)
63                .build(),
64
65            unary_global_value: Builder::new("UnaryGlobalValue")
66                .imm(&entities.global_value)
67                .build(),
68
69            binary: Builder::new("Binary").value().value().build(),
70
71            binary_imm8: Builder::new("BinaryImm8").value().imm(&imm.uimm8).build(),
72
73            binary_imm64: Builder::new("BinaryImm64").value().imm(&imm.imm64).build(),
74
75            // The select instructions are controlled by the second VALUE operand.
76            // The first VALUE operand is the controlling flag which has a derived type.
77            // The fma instruction has the same constraint on all inputs.
78            ternary: Builder::new("Ternary")
79                .value()
80                .value()
81                .value()
82                .typevar_operand(1)
83                .build(),
84
85            ternary_imm8: Builder::new("TernaryImm8")
86                .value()
87                .imm(&imm.uimm8)
88                .value()
89                .build(),
90
91            // Catch-all for instructions with many outputs and inputs and no immediate
92            // operands.
93            multiary: Builder::new("MultiAry").varargs().build(),
94
95            nullary: Builder::new("NullAry").build(),
96
97            shuffle: Builder::new("Shuffle")
98                .value()
99                .value()
100                .imm(&entities.uimm128)
101                .build(),
102
103            int_compare: Builder::new("IntCompare")
104                .imm(&imm.intcc)
105                .value()
106                .value()
107                .build(),
108
109            int_compare_imm: Builder::new("IntCompareImm")
110                .imm(&imm.intcc)
111                .value()
112                .imm(&imm.imm64)
113                .build(),
114
115            float_compare: Builder::new("FloatCompare")
116                .imm(&imm.floatcc)
117                .value()
118                .value()
119                .build(),
120
121            jump: Builder::new("Jump").block().build(),
122
123            brif: Builder::new("Brif").value().block().block().build(),
124
125            branch_table: Builder::new("BranchTable")
126                .value()
127                .imm(&entities.jump_table)
128                .build(),
129
130            call: Builder::new("Call")
131                .imm(&entities.func_ref)
132                .varargs()
133                .build(),
134
135            call_indirect: Builder::new("CallIndirect")
136                .imm(&entities.sig_ref)
137                .value()
138                .varargs()
139                .build(),
140
141            try_call: Builder::new("TryCall")
142                .imm(&entities.func_ref)
143                .varargs()
144                .imm(&&entities.exception_table)
145                .build(),
146
147            try_call_indirect: Builder::new("TryCallIndirect")
148                .value()
149                .varargs()
150                .imm(&&entities.exception_table)
151                .build(),
152
153            func_addr: Builder::new("FuncAddr").imm(&entities.func_ref).build(),
154
155            atomic_rmw: Builder::new("AtomicRmw")
156                .imm(&imm.memflags)
157                .imm(&imm.atomic_rmw_op)
158                .value()
159                .value()
160                .build(),
161
162            atomic_cas: Builder::new("AtomicCas")
163                .imm(&imm.memflags)
164                .value()
165                .value()
166                .value()
167                .typevar_operand(2)
168                .build(),
169
170            load: Builder::new("Load")
171                .imm(&imm.memflags)
172                .value()
173                .imm(&imm.offset32)
174                .build(),
175
176            load_no_offset: Builder::new("LoadNoOffset")
177                .imm(&imm.memflags)
178                .value()
179                .build(),
180
181            store: Builder::new("Store")
182                .imm(&imm.memflags)
183                .value()
184                .value()
185                .imm(&imm.offset32)
186                .build(),
187
188            store_no_offset: Builder::new("StoreNoOffset")
189                .imm(&imm.memflags)
190                .value()
191                .value()
192                .build(),
193
194            stack_load: Builder::new("StackLoad")
195                .imm(&entities.stack_slot)
196                .imm(&imm.offset32)
197                .build(),
198
199            stack_store: Builder::new("StackStore")
200                .value()
201                .imm(&entities.stack_slot)
202                .imm(&imm.offset32)
203                .build(),
204
205            dynamic_stack_load: Builder::new("DynamicStackLoad")
206                .imm(&entities.dynamic_stack_slot)
207                .build(),
208
209            dynamic_stack_store: Builder::new("DynamicStackStore")
210                .value()
211                .imm(&entities.dynamic_stack_slot)
212                .build(),
213
214            trap: Builder::new("Trap").imm(&imm.trapcode).build(),
215
216            cond_trap: Builder::new("CondTrap").value().imm(&imm.trapcode).build(),
217
218            int_add_trap: Builder::new("IntAddTrap")
219                .value()
220                .value()
221                .imm(&imm.trapcode)
222                .build(),
223
224            exception_handler_address: Builder::new("ExceptionHandlerAddress")
225                .raw_block()
226                .imm(&imm.imm64)
227                .build(),
228        }
229    }
230}