stationeers_mips/instructions/
variable.rs

1use crate::types::{Register, RegisterOrNumber};
2
3/// Instructions for variable selection
4pub enum VariableSelection {
5    /// Register = 1 if abs(a-b) <= max(c*max(abs(a), abs(b)), float.epsilon*8) else 0
6    ///
7    /// sap r? a(r?|num) b(r?|num) c(r?|num)
8    SelectApproximatelyEqual {
9        register: Register,
10        a: RegisterOrNumber,
11        b: RegisterOrNumber,
12        c: RegisterOrNumber,
13    },
14    /// Register = 1 if abs(a) <= float.epsilon*8 else 0
15    ///
16    /// sapz r? a(r?|num) b(r?|num)
17    SelectApproximatelyZero {
18        register: Register,
19        a: RegisterOrNumber,
20        b: RegisterOrNumber,
21    },
22    /// Register = 1 if device is not set else 0
23    ///
24    /// sdns r? d?
25    SelectDeviceNotSet {
26        register: Register,
27        d: RegisterOrNumber,
28    },
29    /// Register = 1 if device is set else 0
30    ///
31    /// sdse r? d?
32    SelectDeviceSet {
33        register: Register,
34        d: RegisterOrNumber,
35    },
36    /// Register = b if a != 0 else c
37    ///
38    /// select r? a(r?|num) b(r?|num) c(r?|num)
39    Select {
40        register: Register,
41        a: RegisterOrNumber,
42        b: RegisterOrNumber,
43        c: RegisterOrNumber,
44    },
45    /// Register = 1 if a == b else 0
46    ///
47    /// seq r? a(r?|num) b(r?|num)
48    SelectEqual {
49        register: Register,
50        a: RegisterOrNumber,
51        b: RegisterOrNumber,
52    },
53    /// Register = 1 if a == 0 else 0
54    ///
55    /// seqz r? a(r?|num)
56    SelectEqualZero {
57        register: Register,
58        a: RegisterOrNumber,
59    },
60    /// Register = 1 if a >= b else 0
61    ///
62    /// sge r? a(r?|num) b(r?|num)
63    SelectGreaterOrEqual {
64        register: Register,
65        a: RegisterOrNumber,
66        b: RegisterOrNumber,
67    },
68    /// Register = 1 if a >= 0 else 0
69    ///
70    /// sgez r? a(r?|num)
71    SelectGreaterOrEqualZero {
72        register: Register,
73        a: RegisterOrNumber,
74    },
75    /// Register = 1 if a > b else 0
76    ///
77    /// sgt r? a(r?|num) b(r?|num)
78    SelectGreaterThan {
79        register: Register,
80        a: RegisterOrNumber,
81        b: RegisterOrNumber,
82    },
83    /// Register = 1 if a > 0 else 0
84    ///
85    /// sgtz r? a(r?|num)
86    SelectGreaterThanZero {
87        register: Register,
88        a: RegisterOrNumber,
89    },
90    /// Register = 1 if a <= b else 0
91    ///
92    /// sle r? a(r?|num) b(r?|num)
93    SelectLessOrEqual {
94        register: Register,
95        a: RegisterOrNumber,
96        b: RegisterOrNumber,
97    },
98    /// Register = 1 if a <= 0 else 0
99    ///
100    /// slez r? a(r?|num)
101    SelectLessOrEqualZero {
102        register: Register,
103        a: RegisterOrNumber,
104    },
105    /// Register = 1 if a < b else 0
106    ///
107    /// slt r? a(r?|num) b(r?|num)
108    SelectLessThan {
109        register: Register,
110        a: RegisterOrNumber,
111        b: RegisterOrNumber,
112    },
113    /// Register = 1 if a < 0 else 0
114    ///
115    /// sltz r? a(r?|num)
116    SelectLessThanZero {
117        register: Register,
118        a: RegisterOrNumber,
119    },
120    /// Register = 1 if abs(a-b) > max(c*max(abs(a), abs(b)), float.epsilon*8) else 0
121    ///
122    /// sna r? a(r?|num) b(r?|num) c(r?|num)
123    SelectNotApproximatelyEqual {
124        register: Register,
125        a: RegisterOrNumber,
126        b: RegisterOrNumber,
127        c: RegisterOrNumber,
128    },
129    /// Register = 1 if abs(a) > float.epsilon*8 else 0
130    ///
131    /// snaz r? a(r?|num) b(r?|num)
132    SelectNotApproximatelyZero {
133        register: Register,
134        a: RegisterOrNumber,
135        b: RegisterOrNumber,
136    },
137    /// Register = 1 if a != b else 0
138    ///
139    /// sne r? a(r?|num) b(r?|num)
140    SelectNotEqual {
141        register: Register,
142        a: RegisterOrNumber,
143        b: RegisterOrNumber,
144    },
145    /// Register = 1 if a != 0 else 0
146    ///
147    /// snez r? a(r?|num)
148    SelectNotEqualZero {
149        register: Register,
150        a: RegisterOrNumber,
151    },
152}
153
154impl std::fmt::Display for VariableSelection {
155    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
156        match self {
157            VariableSelection::SelectApproximatelyEqual { register, a, b, c } => {
158                write!(f, "sap {register} {a} {b} {c}")
159            }
160            VariableSelection::SelectApproximatelyZero { register, a, b } => {
161                write!(f, "sapz {register} {a} {b}")
162            }
163            VariableSelection::SelectDeviceNotSet { register, d } => {
164                write!(f, "sdns {register} {d}")
165            }
166            VariableSelection::SelectDeviceSet { register, d } => {
167                write!(f, "sdse {register} {d}")
168            }
169            VariableSelection::Select { register, a, b, c } => {
170                write!(f, "select {register} {a} {b} {c}")
171            }
172            VariableSelection::SelectEqual { register, a, b } => {
173                write!(f, "seq {register} {a} {b}")
174            }
175            VariableSelection::SelectEqualZero { register, a } => {
176                write!(f, "seqz {register} {a}")
177            }
178            VariableSelection::SelectGreaterOrEqual { register, a, b } => {
179                write!(f, "sge {register} {a} {b}")
180            }
181            VariableSelection::SelectGreaterOrEqualZero { register, a } => {
182                write!(f, "sgez {register} {a}")
183            }
184            VariableSelection::SelectGreaterThan { register, a, b } => {
185                write!(f, "sgt {register} {a} {b}")
186            }
187            VariableSelection::SelectGreaterThanZero { register, a } => {
188                write!(f, "sgtz {register} {a}")
189            }
190            VariableSelection::SelectLessOrEqual { register, a, b } => {
191                write!(f, "sle {register} {a} {b}")
192            }
193            VariableSelection::SelectLessOrEqualZero { register, a } => {
194                write!(f, "slez {register} {a}")
195            }
196            VariableSelection::SelectLessThan { register, a, b } => {
197                write!(f, "slt {register} {a} {b}")
198            }
199            VariableSelection::SelectLessThanZero { register, a } => {
200                write!(f, "sltz {register} {a}")
201            }
202            VariableSelection::SelectNotApproximatelyEqual { register, a, b, c } => {
203                write!(f, "sna {register} {a} {b} {c}")
204            }
205            VariableSelection::SelectNotApproximatelyZero { register, a, b } => {
206                write!(f, "snaz {register} {a} {b}")
207            }
208            VariableSelection::SelectNotEqual { register, a, b } => {
209                write!(f, "sne {register} {a} {b}")
210            }
211            VariableSelection::SelectNotEqualZero { register, a } => {
212                write!(f, "snez {register} {a}")
213            }
214        }
215    }
216}