1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct SynthIR {
11 pub functions: Vec<IRFunction>,
13
14 pub globals: Vec<IRGlobal>,
16
17 pub memories: Vec<IRMemory>,
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct IRFunction {
24 pub name: String,
26
27 pub params: Vec<IRValue>,
29
30 pub results: Vec<IRValue>,
32
33 pub blocks: Vec<IRBlock>,
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
39pub struct IRBlock {
40 pub label: String,
42
43 pub instructions: Vec<IRInstruction>,
45
46 pub terminator: IRTerminator,
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize)]
52pub enum IRInstruction {
53 BinOp {
55 op: BinOp,
56 dest: IRValue,
57 left: IRValue,
58 right: IRValue,
59 },
60
61 UnOp {
63 op: UnOp,
64 dest: IRValue,
65 operand: IRValue,
66 },
67
68 Load {
70 dest: IRValue,
71 address: IRValue,
72 offset: i32,
73 },
74
75 Store {
77 address: IRValue,
78 value: IRValue,
79 offset: i32,
80 },
81
82 Call {
84 function: String,
85 args: Vec<IRValue>,
86 dest: Option<IRValue>,
87 },
88}
89
90#[derive(Debug, Clone, Serialize, Deserialize)]
92pub enum IRTerminator {
93 Return(Option<IRValue>),
95
96 Branch(String),
98
99 BranchIf {
101 condition: IRValue,
102 true_block: String,
103 false_block: String,
104 },
105
106 Unreachable,
108}
109
110#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
112pub enum BinOp {
113 IAdd,
115 ISub,
116 IMul,
117 IDivS,
118 IDivU,
119 IRemS,
120 IRemU,
121
122 IAnd,
124 IOr,
125 IXor,
126 IShl,
127 IShrS,
128 IShrU,
129 IRotl,
130 IRotr,
131
132 IEq,
134 INe,
135 ILtS,
136 ILtU,
137 ILeS,
138 ILeU,
139 IGtS,
140 IGtU,
141 IGeS,
142 IGeU,
143
144 FAdd,
146 FSub,
147 FMul,
148 FDiv,
149 FMin,
150 FMax,
151
152 FEq,
154 FNe,
155 FLt,
156 FLe,
157 FGt,
158 FGe,
159}
160
161#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
163pub enum UnOp {
164 IClz,
166 ICtz,
167 IPopcnt,
168 IEqz,
169
170 FAbs,
172 FNeg,
173 FSqrt,
174 FCeil,
175 FFloor,
176 FTrunc,
177 FNearest,
178
179 I32WrapI64,
181 I64ExtendI32S,
182 I64ExtendI32U,
183 F32DemoteF64,
184 F64PromoteF32,
185}
186
187#[derive(Debug, Clone, Serialize, Deserialize)]
189pub enum IRValue {
190 Local(u32),
192
193 ConstI32(i32),
195 ConstI64(i64),
196
197 ConstF32(f32),
199 ConstF64(f64),
200
201 Global(u32),
203}
204
205#[derive(Debug, Clone, Serialize, Deserialize)]
207pub struct IRGlobal {
208 pub index: u32,
210
211 pub init: IRValue,
213
214 pub mutable: bool,
216}
217
218#[derive(Debug, Clone, Serialize, Deserialize)]
220pub struct IRMemory {
221 pub index: u32,
223
224 pub initial: u32,
226
227 pub maximum: Option<u32>,
229}
230
231impl SynthIR {
232 pub fn new() -> Self {
234 Self {
235 functions: Vec::new(),
236 globals: Vec::new(),
237 memories: Vec::new(),
238 }
239 }
240}
241
242impl Default for SynthIR {
243 fn default() -> Self {
244 Self::new()
245 }
246}