juicebox_asm/insn.rs
1// SPDX-License-Identifier: MIT
2//
3// Copyright (c) 2023, Johannes Stoelp <dev@memzero.de>
4
5//! Trait definitions of various instructions.
6
7mod add;
8mod call;
9mod cmovnz;
10mod cmovz;
11mod cmp;
12mod dec;
13mod inc;
14mod jmp;
15mod jnz;
16mod jz;
17mod mov;
18mod nop;
19mod pop;
20mod push;
21mod ret;
22mod sub;
23mod test;
24mod xor;
25
26/// Trait for [`add`](https://www.felixcloutier.com/x86/add) instruction kinds.
27pub trait Add<T, U> {
28 /// Emit an add instruction.
29 fn add(&mut self, op1: T, op2: U);
30}
31
32/// Trait for [`call`](https://www.felixcloutier.com/x86/call) instruction kinds.
33pub trait Call<T> {
34 /// Emit a call instruction.
35 fn call(&mut self, op1: T);
36}
37
38/// Trait for [`cmovnz`](https://www.felixcloutier.com/x86/cmovcc) instruction kinds.
39pub trait Cmovnz<T, U> {
40 /// Emit a (conditional) move if not zero instruction.
41 ///
42 /// Move is only commited if (ZF=0).
43 fn cmovnz(&mut self, op1: T, op2: U);
44}
45
46/// Trait for [`cmovz`](https://www.felixcloutier.com/x86/cmovcc) instruction kinds.
47pub trait Cmovz<T, U> {
48 /// Emit a (conditional) move if zero instruction.
49 ///
50 /// Move is only commited if (ZF=1).
51 fn cmovz(&mut self, op1: T, op2: U);
52}
53
54/// Trait for [`cmp`](https://www.felixcloutier.com/x86/cmp) instruction kinds.
55pub trait Cmp<T, U> {
56 /// Emit a compare instruction.
57 ///
58 /// Computes `op2 - op1` and sets the status flags in the same way as the `sub` instruction,
59 /// the result is discarded.
60 fn cmp(&mut self, op1: T, op2: U);
61}
62
63/// Trait for [`dec`](https://www.felixcloutier.com/x86/dec) instruction kinds.
64pub trait Dec<T> {
65 /// Emit a decrement instruction.
66 fn dec(&mut self, op1: T);
67}
68
69/// Trait for [`inc`](https://www.felixcloutier.com/x86/inc) instruction kinds.
70pub trait Inc<T> {
71 /// Emit a increment instruction.
72 fn inc(&mut self, op1: T);
73}
74
75/// Trait for [`jmp`](https://www.felixcloutier.com/x86/jmp) instruction kinds.
76pub trait Jmp<T> {
77 /// Emit an unconditional jump instruction.
78 fn jmp(&mut self, op1: T);
79}
80
81/// Trait for [`jnz`](https://www.felixcloutier.com/x86/jcc) instruction kinds.
82pub trait Jnz<T> {
83 /// Emit a conditional jump if not zero instruction (`ZF = 0`).
84 fn jnz(&mut self, op1: T);
85}
86
87/// Trait for [`jz`](https://www.felixcloutier.com/x86/jcc) instruction kinds.
88pub trait Jz<T> {
89 /// Emit a conditional jump if zero instruction (`ZF = 1`).
90 fn jz(&mut self, op1: T);
91}
92
93/// Trait for [`mov`](https://www.felixcloutier.com/x86/mov) instruction kinds.
94pub trait Mov<T, U> {
95 /// Emit an move instruction.
96 fn mov(&mut self, op1: T, op2: U);
97}
98
99/// Trait for [`pop`](https://www.felixcloutier.com/x86/pop) instruction kinds.
100pub trait Pop<T> {
101 /// Emit a pop instruction.
102 fn pop(&mut self, op1: T);
103}
104
105/// Trait for [`push`](https://www.felixcloutier.com/x86/push) instruction kinds.
106pub trait Push<T> {
107 /// Emit a push instruction.
108 fn push(&mut self, op1: T);
109}
110
111/// Trait for [`sub`](https://www.felixcloutier.com/x86/sub) instruction kinds.
112pub trait Sub<T, U> {
113 /// Emit an sub instruction.
114 fn sub(&mut self, op1: T, op2: U);
115}
116
117/// Trait for [`test`](https://www.felixcloutier.com/x86/test) instruction kinds.
118pub trait Test<T, U> {
119 /// Emit a logical compare instruction.
120 ///
121 /// Computes the bit-wise logical AND of first operand and the second operand and sets the
122 /// `SF`, `ZF`, and `PF` status flags, the result is discarded.
123 fn test(&mut self, op1: T, op2: U);
124}
125
126/// Trait for [`xor`](https://www.felixcloutier.com/x86/xor) instruction kinds.
127pub trait Xor<T, U> {
128 /// Emit a xor instruction.
129 fn xor(&mut self, op1: T, op2: U);
130}