Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/cranelift/codegen/meta/src/shared/formats.rs
1693 views
1
use crate::cdsl::formats::{InstructionFormat, InstructionFormatBuilder as Builder};
2
use crate::shared::{entities::EntityRefs, immediates::Immediates};
3
use std::rc::Rc;
4
5
pub(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
48
impl 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
}
231
232