esoteric_vm/
assembly.rs

1//! Assembly compiler for Esoteric VM.
2//!
3//! More info at [`esoteric_assembly`].
4
5#[doc(hidden)]
6#[allow(non_upper_case_globals)]
7pub mod __instructions {
8    #[allow(non_camel_case_types)]
9    pub struct instruction;
10
11    pub const data: instruction = instruction;
12    pub const DATA: instruction = instruction;
13
14    pub const byte: instruction = instruction;
15    pub const BYTE: instruction = instruction;
16
17    pub const nop: instruction = instruction;
18    pub const NOP: instruction = instruction;
19
20    pub const ldar: instruction = instruction;
21    pub const LDAR: instruction = instruction;
22
23    pub const sba: instruction = instruction;
24    pub const SBA: instruction = instruction;
25
26    pub const clř: instruction = instruction;
27    pub const CLŘ: instruction = instruction;
28
29    pub const dumpř: instruction = instruction;
30    pub const DUMPŘ: instruction = instruction;
31
32    pub const movař: instruction = instruction;
33    pub const MOVAŘ: instruction = instruction;
34
35    pub const setř: instruction = instruction;
36    pub const SETŘ: instruction = instruction;
37
38    pub const setiř: instruction = instruction;
39    pub const SETIŘ: instruction = instruction;
40
41    pub const ldř: instruction = instruction;
42    pub const LDŘ: instruction = instruction;
43
44    pub const ldiř: instruction = instruction;
45    pub const LDIŘ: instruction = instruction;
46
47    pub const clß: instruction = instruction;
48    pub const CLß: instruction = instruction;
49
50    pub const dumpß: instruction = instruction;
51    pub const DUMPß: instruction = instruction;
52
53    pub const writeß: instruction = instruction;
54    pub const WRITEß: instruction = instruction;
55
56    pub const movaß: instruction = instruction;
57    pub const MOVAß: instruction = instruction;
58
59    pub const setß: instruction = instruction;
60    pub const SETß: instruction = instruction;
61
62    pub const setiß: instruction = instruction;
63    pub const SETIß: instruction = instruction;
64
65    pub const ldß: instruction = instruction;
66    pub const LDß: instruction = instruction;
67
68    pub const pushß: instruction = instruction;
69    pub const PUSHß: instruction = instruction;
70
71    pub const popß: instruction = instruction;
72    pub const POPß: instruction = instruction;
73
74    pub const lenßa: instruction = instruction;
75    pub const LENßA: instruction = instruction;
76
77    pub const ldidp: instruction = instruction;
78    pub const LDIDP: instruction = instruction;
79
80    pub const Ωchoiceset: instruction = instruction;
81    pub const ΩCHOICESET: instruction = instruction;
82
83    pub const Ωchoicegeta: instruction = instruction;
84    pub const ΩCHOICEGETA: instruction = instruction;
85
86    pub const Ωgainapolymorphicdesires: instruction = instruction;
87    pub const ΩGAINAPOLYMORPHICDESIRES: instruction = instruction;
88
89    pub const Ωloseapolymorphicdesires: instruction = instruction;
90    pub const ΩLOSEAPOLYMORPHICDESIRES: instruction = instruction;
91
92    pub const Ωpushpolymorphicdesires: instruction = instruction;
93    pub const ΩPUSHPOLYMORPHICDESIRES: instruction = instruction;
94
95    pub const Ωtheendisnear: instruction = instruction;
96    pub const ΩTHEENDISNEAR: instruction = instruction;
97
98    pub const Ωskiptothechase: instruction = instruction;
99    pub const ΩSKIPTOTHECHASE: instruction = instruction;
100
101    pub const Ωsetsentience: instruction = instruction;
102    pub const ΩSETSENTIENCE: instruction = instruction;
103
104    pub const Ωsetpaperclipproduction: instruction = instruction;
105    pub const ΩSETPAPERCLIPPRODUCTION: instruction = instruction;
106
107    pub const addbl: instruction = instruction;
108    pub const ADDBL: instruction = instruction;
109
110    pub const subbl: instruction = instruction;
111    pub const SUBBL: instruction = instruction;
112
113    pub const mulbl: instruction = instruction;
114    pub const MULBL: instruction = instruction;
115
116    pub const divbl: instruction = instruction;
117    pub const DIVBL: instruction = instruction;
118
119    pub const modbl: instruction = instruction;
120    pub const MODBL: instruction = instruction;
121
122    pub const notl: instruction = instruction;
123    pub const NOTL: instruction = instruction;
124
125    pub const andbl: instruction = instruction;
126    pub const ANDBL: instruction = instruction;
127
128    pub const orbl: instruction = instruction;
129    pub const ORBL: instruction = instruction;
130
131    pub const xorbl: instruction = instruction;
132    pub const XORBL: instruction = instruction;
133
134    pub const cmplb: instruction = instruction;
135    pub const CMPLB: instruction = instruction;
136
137    pub const tgflag: instruction = instruction;
138    pub const TGFLAG: instruction = instruction;
139
140    pub const clflag: instruction = instruction;
141    pub const CLFLAG: instruction = instruction;
142
143    pub const addf: instruction = instruction;
144    pub const ADDF: instruction = instruction;
145
146    pub const subf: instruction = instruction;
147    pub const SUBF: instruction = instruction;
148
149    pub const mulf: instruction = instruction;
150    pub const MULF: instruction = instruction;
151
152    pub const divf: instruction = instruction;
153    pub const DIVF: instruction = instruction;
154
155    pub const modf: instruction = instruction;
156    pub const MODF: instruction = instruction;
157
158    pub const stackalloc: instruction = instruction;
159    pub const STACKALLOC: instruction = instruction;
160
161    pub const stackdealloc: instruction = instruction;
162    pub const STACKDEALLOC: instruction = instruction;
163
164    pub const push: instruction = instruction;
165    pub const PUSH: instruction = instruction;
166
167    pub const pushi: instruction = instruction;
168    pub const PUSHI: instruction = instruction;
169
170    pub const pop: instruction = instruction;
171    pub const POP: instruction = instruction;
172
173    pub const popa: instruction = instruction;
174    pub const POPA: instruction = instruction;
175
176    pub const pusha: instruction = instruction;
177    pub const PUSHA: instruction = instruction;
178
179    pub const popb: instruction = instruction;
180    pub const POPB: instruction = instruction;
181
182    pub const pushb: instruction = instruction;
183    pub const PUSHB: instruction = instruction;
184
185    pub const popl: instruction = instruction;
186    pub const POPL: instruction = instruction;
187
188    pub const pushl: instruction = instruction;
189    pub const PUSHL: instruction = instruction;
190
191    pub const popf: instruction = instruction;
192    pub const POPF: instruction = instruction;
193
194    pub const pushf: instruction = instruction;
195    pub const PUSHF: instruction = instruction;
196
197    pub const popch: instruction = instruction;
198    pub const POPCH: instruction = instruction;
199
200    pub const pushch: instruction = instruction;
201    pub const PUSHCH: instruction = instruction;
202
203    pub const popnum: instruction = instruction;
204    pub const POPNUM: instruction = instruction;
205
206    pub const pushnum: instruction = instruction;
207    pub const PUSHNUM: instruction = instruction;
208
209    pub const popep: instruction = instruction;
210    pub const POPEP: instruction = instruction;
211
212    pub const zpopep: instruction = instruction;
213    pub const ZPOPEP: instruction = instruction;
214
215    pub const ppopep: instruction = instruction;
216    pub const PPOPEP: instruction = instruction;
217
218    pub const npopep: instruction = instruction;
219    pub const NPOPEP: instruction = instruction;
220
221    pub const fpopep: instruction = instruction;
222    pub const FPOPEP: instruction = instruction;
223
224    pub const dpopep: instruction = instruction;
225    pub const DPOPEP: instruction = instruction;
226
227    pub const getchar: instruction = instruction;
228    pub const GETCHAR: instruction = instruction;
229
230    pub const getline: instruction = instruction;
231    pub const GETLINE: instruction = instruction;
232
233    pub const writechar: instruction = instruction;
234    pub const WRITECHAR: instruction = instruction;
235
236    pub const writelineß: instruction = instruction;
237    pub const WRITELINEß: instruction = instruction;
238
239    pub const writeline: instruction = instruction;
240    pub const WRITELINE: instruction = instruction;
241
242    pub const toggledebug: instruction = instruction;
243    pub const TOGGLEDEBUG: instruction = instruction;
244
245    pub const debugmachinestate: instruction = instruction;
246    pub const DEBUGMACHINESTATE: instruction = instruction;
247
248    pub const debugmachinestatecompact: instruction = instruction;
249    pub const DEBUGMACHINESTATECOMPACT: instruction = instruction;
250
251    pub const debugmemoryregion: instruction = instruction;
252    pub const DEBUGMEMORYREGION: instruction = instruction;
253
254    pub const debugstackregion: instruction = instruction;
255    pub const DEBUGSTACKREGION: instruction = instruction;
256}
257
258/// Assembly compiler for esoteric VM.
259///
260/// Input format: `<n>: <inst> <arg1?>, <arg2?>;`, with:
261/// - `<n>:` being an optional helper prefix (usually an integer
262///     to denote he instruction's location in memory),\
263/// - `<inst>` being the instruction, and \
264/// - `<argx>` being the argument (usually a number).
265///
266/// # Examples
267///
268/// ```rust
269/// # use esoteric_vm::{esoteric_assembly, Machine};
270///
271/// let mut machine = Machine::default();
272///
273/// let assembly = esoteric_assembly!{
274///     // you can prefix the instruction with an integer
275///     // and use it to know where instructions are in memory,
276///     // but it's not checked so be careful.
277///     0: pushi 10;
278///     2: pushi 25;
279///
280///     // you can omit the prefix
281///     popl;
282///
283///     // you can set the prefix to an arbitrary amount
284///     1_000_000: Ωtheendisnear;
285///     // you can use any literal as the prefix
286///     "hello": ΩSKIPTOTHECHASE;
287/// };
288///
289/// machine.load(&assembly, 0);
290/// ```
291#[macro_export]
292#[allow(clippy::module_name_repetitions)]
293macro_rules! esoteric_assembly {
294    () => { [] as [$crate::instruction::DataOrInstruction; 0] };
295
296    ({} data $data:expr) => { $crate::instruction::DataOrInstruction::Data($data as &[u8]) };
297    ({} DATA $data:expr) => { $crate::instruction::DataOrInstruction::Data($data as &[u8]) };
298
299    ({} byte $data:expr) => { $crate::instruction::DataOrInstruction::ByteData($data as u8) };
300    ({} BYTE $data:expr) => { $crate::instruction::DataOrInstruction::ByteData($data as u8) };
301
302    ({} nop) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Nop) };
303    ({} NOP) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Nop) };
304
305    ({} ldar $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Ldar($data)) };
306    ({} LDAR $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Ldar($data)) };
307
308    ({} ldar) => { compile_error!("missing argument for `ldar` instruction."); };
309    ({} LDAR) => { compile_error!("missing argument for `ldar` instruction."); };
310
311    ({} sba) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Sba) };
312    ({} SBA) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Sba) };
313
314    ({} clř) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Clř) };
315    ({} CLŘ) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Clř) };
316
317    ({} dumpř $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Dumpř($data)) };
318    ({} DUMPŘ $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Dumpř($data)) };
319
320    ({} dumpř) => { compile_error!("missing argument for `dumpř` instruction."); };
321    ({} DUMPŘ) => { compile_error!("missing argument for `dumpř` instruction."); };
322
323    ({} movař $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Movař($data)) };
324    ({} MOVAŘ $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Movař($data)) };
325
326    ({} movař) => { compile_error!("missing argument for `movař` instruction."); };
327    ({} MOVAŘ) => { compile_error!("missing argument for `movař` instruction."); };
328
329    ({} setř $data0:expr, $data1:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Setř($data0, $data1)) };
330    ({} SETŘ $data0:expr, $data1:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Setř($data0, $data1)) };
331
332    ({} setř) => { compile_error!("missing arguments for `setř` instruction."); };
333    ({} SETŘ) => { compile_error!("missing arguments for `setř` instruction."); };
334    ({} setř $data:expr) => { compile_error!("missing argument for `setř` instruction."); };
335    ({} SETŘ $data:expr) => { compile_error!("missing argument for `setř` instruction."); };
336
337    ({} setiř $data0:expr, $data1:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Setiř($data0, $data1)) };
338    ({} SETIŘ $data0:expr, $data1:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Setiř($data0, $data1)) };
339
340    ({} setiř) => { compile_error!("missing arguments for `setiř` instruction."); };
341    ({} SETIŘ) => { compile_error!("missing arguments for `setiř` instruction."); };
342    ({} setiř $data:expr) => { compile_error!("missing argument for `setiř` instruction."); };
343    ({} SETIŘ $data:expr) => { compile_error!("missing argument for `setiř` instruction."); };
344
345    ({} ldř $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Ldř($data)) };
346    ({} LDŘ $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Ldř($data)) };
347
348    ({} ldř) => { compile_error!("missing argument for `ldř` instruction."); };
349    ({} LDŘ) => { compile_error!("missing argument for `ldř` instruction."); };
350
351    ({} ldiř $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Ldiř($data)) };
352    ({} LDIŘ $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Ldiř($data)) };
353
354    ({} ldiř) => { compile_error!("missing argument for `ldiř` instruction."); };
355    ({} LDIŘ) => { compile_error!("missing argument for `ldiř` instruction."); };
356
357    ({} clß) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Clß) };
358    ({} CLß) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Clß) };
359
360    ({} dumpß $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Dumpß($data)) };
361    ({} DUMPß $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Dumpß($data)) };
362
363    ({} dumpß) => { compile_error!("missing argument for `dumpß` instruction."); };
364    ({} DUMPß) => { compile_error!("missing argument for `dumpß` instruction."); };
365
366    ({} writeß $data0:expr, $data1:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Writeß($data0, $data1)) };
367    ({} WRITEß $data0:expr, $data1:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Writeß($data0, $data1)) };
368
369    ({} writeß) => { compile_error!("missing arguments for `writeß` instruction."); };
370    ({} WRITEß) => { compile_error!("missing arguments for `writeß` instruction."); };
371    ({} writeß $data:expr) => { compile_error!("missing argument for `writeß` instruction."); };
372    ({} WRITEß $data:expr) => { compile_error!("missing argument for `writeß` instruction."); };
373
374    ({} movaß $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Movaß($data)) };
375    ({} MOVAß $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Movaß($data)) };
376
377    ({} movaß) => { compile_error!("missing argument for `movaß` instruction."); };
378    ({} MOVAß) => { compile_error!("missing argument for `movaß` instruction."); };
379
380    ({} setß $data0:expr, $data1:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Setß($data0, $data1)) };
381    ({} SETß $data0:expr, $data1:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Setß($data0, $data1)) };
382
383    ({} setß) => { compile_error!("missing arguments for `setß` instruction."); };
384    ({} SETß) => { compile_error!("missing arguments for `setß` instruction."); };
385    ({} setß $data:expr) => { compile_error!("missing argument for `setß` instruction."); };
386    ({} SETß $data:expr) => { compile_error!("missing argument for `setß` instruction."); };
387
388    ({} setiß $data0:expr, $data1:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Setiß($data0, $data1)) };
389    ({} SETIß $data0:expr, $data1:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Setiß($data0, $data1)) };
390
391    ({} setiß) => { compile_error!("missing arguments for `setiß` instruction."); };
392    ({} SETIß) => { compile_error!("missing arguments for `setiß` instruction."); };
393    ({} setiß $data:expr) => { compile_error!("missing argument for `setiß` instruction."); };
394    ({} SETIß $data:expr) => { compile_error!("missing argument for `setiß` instruction."); };
395
396    ({} ldß $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Ldß($data)) };
397    ({} LDß $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Ldß($data)) };
398
399    ({} ldß) => { compile_error!("missing argument for `ldß` instruction."); };
400    ({} LDß) => { compile_error!("missing argument for `ldß` instruction."); };
401
402    ({} pushß) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Pushß) };
403    ({} PUSHß) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Pushß) };
404
405    ({} popß) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Popß) };
406    ({} POPß) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Popß) };
407
408    ({} lenßa) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Lenßa) };
409    ({} LENßA) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Lenßa) };
410
411    ({} ldidp $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Ldidp($data)) };
412    ({} LDIDP $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Ldidp($data)) };
413
414    ({} ldidp) => { compile_error!("missing argument for `ldidp` instruction."); };
415    ({} LDIDP) => { compile_error!("missing argument for `ldidp` instruction."); };
416
417    ({} Ωchoiceset $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ΩChoiceSet($data)) };
418    ({} ΩCHOICESET $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ΩChoiceSet($data)) };
419
420    ({} Ωchoiceset) => { compile_error!("missing argument for `Ωchoiceset` instruction."); };
421    ({} ΩCHOICESET) => { compile_error!("missing argument for `Ωchoiceset` instruction."); };
422
423    ({} Ωchoicegeta) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ΩChoiceGetA) };
424    ({} ΩCHOICEGETA) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ΩChoiceGetA) };
425
426    ({} Ωgainapolymorphicdesires) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ΩGainAPolymorphicDesires) };
427    ({} ΩGAINAPOLYMORPHICDESIRES) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ΩGainAPolymorphicDesires) };
428
429    ({} Ωloseapolymorphicdesires) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ΩLoseAPolymorphicDesires) };
430    ({} ΩLOSEAPOLYMORPHICDESIRES) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ΩLoseAPolymorphicDesires) };
431
432    ({} Ωpushpolymorphicdesires) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ΩPushPolyMorphicDesires) };
433    ({} ΩPUSHPOLYMORPHICDESIRES) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ΩPushPolyMorphicDesires) };
434
435    ({} Ωtheendisnear) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ΩTheEndIsNear) };
436    ({} ΩTHEENDISNEAR) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ΩTheEndIsNear) };
437
438    ({} Ωskiptothechase) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ΩSkipToTheChase) };
439    ({} ΩSKIPTOTHECHASE) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ΩSkipToTheChase) };
440
441    ({} Ωsetsentience $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ΩSetSentience($data)) };
442    ({} ΩSETSENTIENCE $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ΩSetSentience($data)) };
443
444    ({} Ωsetsentience) => { compile_error!("missing argument for `Ωsetsentience` instruction."); };
445    ({} ΩSETSENTIENCE) => { compile_error!("missing argument for `Ωsetsentience` instruction."); };
446
447    ({} Ωsetpaperclipproduction $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ΩSetPaperclipProduction($data)) };
448    ({} ΩSETPAPERCLIPPRODUCTION $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ΩSetPaperclipProduction($data)) };
449
450    ({} Ωsetpaperclipproduction) => { compile_error!("missing argument for `Ωsetpaperclipproduction` instruction."); };
451    ({} ΩSETPAPERCLIPPRODUCTION) => { compile_error!("missing argument for `Ωsetpaperclipproduction` instruction."); };
452
453    ({} addbl) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::AddBL) };
454    ({} ADDBL) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::AddBL) };
455
456    ({} subbl) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::SubBL) };
457    ({} SUBBL) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::SubBL) };
458
459    ({} mulbl) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::MulBL) };
460    ({} MULBL) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::MulBL) };
461
462    ({} divbl) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::DivBL) };
463    ({} DIVBL) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::DivBL) };
464
465    ({} modbl) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ModBL) };
466    ({} MODBL) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ModBL) };
467
468    ({} notl) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::NotL) };
469    ({} NOTL) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::NotL) };
470
471    ({} andbl) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::AndBL) };
472    ({} ANDBL) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::AndBL) };
473
474    ({} orbl) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::OrBL) };
475    ({} ORBL) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::OrBL) };
476
477    ({} xorbl) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::XorBL) };
478    ({} XORBL) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::XorBL) };
479
480    ({} cmplb) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::CmpLB) };
481    ({} CMPLB) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::CmpLB) };
482
483    ({} tgflag) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::TgFlag) };
484    ({} TGFLAG) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::TgFlag) };
485
486    ({} clflag) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ClFlag) };
487    ({} CLFLAG) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ClFlag) };
488
489    ({} addf $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::AddF($data)) };
490    ({} ADDF $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::AddF($data)) };
491
492    ({} addf) => { compile_error!("missing argument for `addf` instruction."); };
493    ({} ADDF) => { compile_error!("missing argument for `addf` instruction."); };
494
495    ({} subf $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::SubF($data)) };
496    ({} SUBF $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::SubF($data)) };
497
498    ({} subf) => { compile_error!("missing argument for `subf` instruction."); };
499    ({} SUBF) => { compile_error!("missing argument for `subf` instruction."); };
500
501    ({} mulf $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::MulF($data)) };
502    ({} MULF $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::MulF($data)) };
503
504    ({} mulf) => { compile_error!("missing argument for `mulf` instruction."); };
505    ({} MULF) => { compile_error!("missing argument for `mulf` instruction."); };
506
507    ({} divf $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::DivF($data)) };
508    ({} DIVF $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::DivF($data)) };
509
510    ({} divf) => { compile_error!("missing argument for `divf` instruction."); };
511    ({} DIVF) => { compile_error!("missing argument for `divf` instruction."); };
512
513    ({} modf $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ModF($data)) };
514    ({} MODF $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ModF($data)) };
515
516    ({} modf) => { compile_error!("missing argument for `modf` instruction."); };
517    ({} MODF) => { compile_error!("missing argument for `modf` instruction."); };
518
519    ({} stackalloc $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::StackAlloc($data)) };
520    ({} STACKALLOC $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::StackAlloc($data)) };
521
522    ({} stackalloc) => { compile_error!("missing argument for `stackalloc` instruction."); };
523    ({} STACKALLOC) => { compile_error!("missing argument for `stackalloc` instruction."); };
524
525    ({} stackdealloc $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::StackDealloc($data)) };
526    ({} STACKDEALLOC $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::StackDealloc($data)) };
527
528    ({} stackdealloc) => { compile_error!("missing argument for `stackdealloc` instruction."); };
529    ({} STACKDEALLOC) => { compile_error!("missing argument for `stackdealloc` instruction."); };
530
531    ({} push $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Push($data)) };
532    ({} PUSH $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Push($data)) };
533
534    ({} push) => { compile_error!("missing argument for `push` instruction."); };
535    ({} PUSH) => { compile_error!("missing argument for `push` instruction."); };
536
537    ({} pushi $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Pushi($data)) };
538    ({} PUSHI $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Pushi($data)) };
539
540    ({} pushi) => { compile_error!("missing argument for `pushi` instruction."); };
541    ({} PUSHI) => { compile_error!("missing argument for `pushi` instruction."); };
542
543    ({} pop $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Pop($data)) };
544    ({} POP $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Pop($data)) };
545
546    ({} pop) => { compile_error!("missing argument for `pop` instruction."); };
547    ({} POP) => { compile_error!("missing argument for `pop` instruction."); };
548
549    ({} popa) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Popa) };
550    ({} POPA) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Popa) };
551
552    ({} pusha) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Pusha) };
553    ({} PUSHA) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Pusha) };
554
555    ({} popb) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Popb) };
556    ({} POPB) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Popb) };
557
558    ({} pushb) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Pushb) };
559    ({} PUSHB) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Pushb) };
560
561    ({} popl) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::PopL) };
562    ({} POPL) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::PopL) };
563
564    ({} pushl) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::PushL) };
565    ({} PUSHL) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::PushL) };
566
567    ({} popf) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Popf) };
568    ({} POPF) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Popf) };
569
570    ({} pushf) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Pushf) };
571    ({} PUSHF) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Pushf) };
572
573    ({} popch) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Popch) };
574    ({} POPCH) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Popch) };
575
576    ({} pushch) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Pushch) };
577    ({} PUSHCH) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Pushch) };
578
579    ({} popnum) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Popnum) };
580    ({} POPNUM) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Popnum) };
581
582    ({} pushnum) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Pushnum) };
583    ({} PUSHNUM) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Pushnum) };
584
585    ({} popep) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Popep) };
586    ({} POPEP) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Popep) };
587
588    ({} zpopep) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Zpopep) };
589    ({} ZPOPEP) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Zpopep) };
590
591    ({} ppopep) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Ppopep) };
592    ({} PPOPEP) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Ppopep) };
593
594    ({} npopep) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Npopep) };
595    ({} NPOPEP) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Npopep) };
596
597    ({} fpopep) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Fpopep) };
598    ({} FPOPEP) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Fpopep) };
599
600    ({} dpopep) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Dpopep) };
601    ({} DPOPEP) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::Dpopep) };
602
603    ({} getchar) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::GetChar) };
604    ({} GETCHAR) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::GetChar) };
605
606    ({} getline) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::GetLine) };
607    ({} GETLINE) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::GetLine) };
608
609    ({} writechar) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::WriteChar) };
610    ({} WRITECHAR) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::WriteChar) };
611
612    ({} writelineß) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::WriteLineß) };
613    ({} WRITELINEß) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::WriteLineß) };
614
615    ({} writeline $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::WriteLine($data)) };
616    ({} WRITELINE $data:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::WriteLine($data)) };
617
618    ({} writeline) => { compile_error!("missing argument for `writeline` instruction."); };
619    ({} WRITELINE) => { compile_error!("missing argument for `writeline` instruction."); };
620
621    ({} toggledebug) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ToggleDebug) };
622    ({} TOGGLEDEBUG) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::ToggleDebug) };
623
624    ({} debugmachinestate) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::DebugMachineState) };
625    ({} DEBUGMACHINESTATE) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::DebugMachineState) };
626
627    ({} debugmachinestatecompact) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::DebugMachineStateCompact) };
628    ({} DEBUGMACHINESTATECOMPACT) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::DebugMachineStateCompact) };
629
630    ({} debugmemoryregion $data0:expr, $data1:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::DebugMemoryRegion($data0, $data1)) };
631    ({} DEBUGMEMORYREGION $data0:expr, $data1:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::DebugMemoryRegion($data0, $data1)) };
632
633    ({} debugmemoryregion) => { compile_error!("missing arguments for `debugmemoryregion` instruction."); };
634    ({} DEBUGMEMORYREGION) => { compile_error!("missing arguments for `debugmemoryregion` instruction."); };
635    ({} debugmemoryregion $data:expr) => { compile_error!("missing argument for `debugmemoryregion` instruction."); };
636    ({} DEBUGMEMORYREGION $data:expr) => { compile_error!("missing argument for `debugmemoryregion` instruction."); };
637
638    ({} debugstackregion $data0:expr, $data1:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::DebugStackRegion($data0, $data1)) };
639    ({} DEBUGSTACKREGION $data0:expr, $data1:expr) => { $crate::instruction::DataOrInstruction::Instruction($crate::instruction::Instruction::DebugStackRegion($data0, $data1)) };
640
641    ({} debugstackregion) => { compile_error!("missing arguments for `debugstackregion` instruction."); };
642    ({} DEBUGSTACKREGION) => { compile_error!("missing arguments for `debugstackregion` instruction."); };
643    ({} debugstackregion $data:expr) => { compile_error!("missing argument for `debugstackregion` instruction."); };
644    ({} DEBUGSTACKREGION $data:expr) => { compile_error!("missing argument for `debugstackregion` instruction."); };
645
646
647    ({} $($trash:tt)*) => { compile_error!(concat!("`", stringify!($($trash)*), "` isn't a valid esoteric assembly instruction")) };
648
649    ($($($n:literal:)? $name:ident $($value:expr),*);* $(;)?) => {{
650        $(
651            #[cfg(not(any(debug_assertions, not(debug_assertions))))] // never compile
652            use $crate::assembly::__instructions::$name;
653        )*
654
655        [ $(
656                $crate::esoteric_assembly!({} $name $($value),*),
657        )* ]
658    }};
659
660}