1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
use crate::patio::{
operands::{PatioLocalRef, PatioOperand},
types::PatioDataLayout,
};
pub(crate) enum PatioInstruction {
Block(PatioBlock),
BoolToInt(PatioBoolToInt),
Call(PatioCall),
If(PatioIf),
IntAdd(PatioIntAdd),
IntEquals(PatioIntEquals),
IntNotEqual(PatioIntNotEqual),
IntSub(PatioIntSub),
IntToBool(PatioIntToBool),
LocalStore(PatioLocalStore),
MemoryLoad(PatioMemoryLoad),
MemoryStore(PatioMemoryStore),
Resume(PatioResume),
Return(PatioReturn),
ReturnVoid(PatioReturnVoid),
VarLoad(PatioVarLoad),
VarStore(PatioVarStore),
}
pub(crate) struct PatioBlock {
pub(crate) body: Vec<PatioInstruction>,
pub(crate) results: Vec<PatioOperand>,
}
pub(crate) struct PatioBoolToInt {
pub(crate) destination: PatioLocalRef,
pub(crate) value: PatioOperand,
}
pub(crate) struct PatioCall {
pub(crate) destination: Option<PatioLocalRef>,
pub(crate) function_name: String,
pub(crate) args: Vec<PatioOperand>,
}
pub(crate) struct PatioIf {
pub(crate) destinations: Vec<PatioLocalRef>,
pub(crate) condition: PatioOperand,
pub(crate) true_body: PatioBlock,
pub(crate) false_body: PatioBlock,
}
pub(crate) struct PatioIntAdd {
pub(crate) destination: PatioLocalRef,
pub(crate) left: PatioOperand,
pub(crate) right: PatioOperand,
}
pub(crate) struct PatioIntEquals {
pub(crate) destination: PatioLocalRef,
pub(crate) left: PatioOperand,
pub(crate) right: PatioOperand,
}
pub(crate) struct PatioIntNotEqual {
pub(crate) destination: PatioLocalRef,
pub(crate) left: PatioOperand,
pub(crate) right: PatioOperand,
}
pub(crate) struct PatioIntSub {
pub(crate) destination: PatioLocalRef,
pub(crate) left: PatioOperand,
pub(crate) right: PatioOperand,
}
pub(crate) struct PatioIntToBool {
pub(crate) destination: PatioLocalRef,
pub(crate) value: PatioOperand,
}
pub(crate) struct PatioLocalStore {
pub(crate) destination: PatioLocalRef,
pub(crate) value: PatioOperand,
}
pub(crate) struct PatioMemoryLoad {
pub(crate) destination: PatioLocalRef,
pub(crate) pointer: PatioOperand,
pub(crate) layout: PatioDataLayout,
pub(crate) element_offsets: Vec<u32>,
}
pub(crate) struct PatioMemoryStore {
pub(crate) pointer: PatioOperand,
pub(crate) layout: PatioDataLayout,
pub(crate) element_offsets: Vec<u32>,
pub(crate) value: PatioOperand,
}
pub(crate) struct PatioResume {
pub(crate) value: PatioOperand,
}
pub(crate) struct PatioReturn {
pub(crate) value: PatioOperand,
}
pub(crate) struct PatioReturnVoid;
pub(crate) struct PatioVarLoad {
pub(crate) destination: PatioLocalRef,
pub(crate) var: PatioLocalRef,
}
pub(crate) struct PatioVarStore {
pub(crate) var: PatioLocalRef,
pub(crate) value: PatioOperand,
}
|