aboutsummaryrefslogtreecommitdiff
path: root/patio-to-cranelift/src/patio/instructions.rs
blob: 1cba295384282a42ff23401ea0a0c3b4e48fd3bc (plain)
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
116
117
118
119
120
121
122
use crate::patio::{
    operands::{PatioLocalRef, PatioOperand},
    types::PatioDataLayout,
};

pub(crate) enum PatioInstruction {
    Block(PatioBlock),
    BoolToInt(PatioBoolToInt),
    Call(PatioCall),
    CallPointer(PatioCallPointer),
    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 PatioCallPointer {
    pub(crate) destination: PatioLocalRef,
    pub(crate) function_pointer: PatioOperand,
    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,
}