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}