juicebox_asm/insn/
mov.rs

1// SPDX-License-Identifier: MIT
2//
3// Copyright (c) 2023, Johannes Stoelp <dev@memzero.de>
4
5use super::Mov;
6use crate::{Asm, Imm16, Imm32, Imm64, Imm8, Mem16, Mem32, Mem64, Mem8, Reg16, Reg32, Reg64, Reg8};
7
8// -- MOV : reg reg
9
10impl Mov<Reg64, Reg64> for Asm {
11    fn mov(&mut self, op1: Reg64, op2: Reg64) {
12        self.encode_rr(&[0x89], op1, op2);
13    }
14}
15
16impl Mov<Reg32, Reg32> for Asm {
17    fn mov(&mut self, op1: Reg32, op2: Reg32) {
18        self.encode_rr(&[0x89], op1, op2);
19    }
20}
21
22impl Mov<Reg16, Reg16> for Asm {
23    fn mov(&mut self, op1: Reg16, op2: Reg16) {
24        self.encode_rr(&[0x89], op1, op2);
25    }
26}
27
28impl Mov<Reg8, Reg8> for Asm {
29    fn mov(&mut self, op1: Reg8, op2: Reg8) {
30        self.encode_rr(&[0x88], op1, op2);
31    }
32}
33
34// -- MOV : mem reg
35
36impl Mov<Mem64, Reg64> for Asm {
37    fn mov(&mut self, op1: Mem64, op2: Reg64) {
38        self.encode_mr(0x89, op1, op2);
39    }
40}
41
42impl Mov<Mem32, Reg32> for Asm {
43    fn mov(&mut self, op1: Mem32, op2: Reg32) {
44        self.encode_mr(0x89, op1, op2);
45    }
46}
47
48impl Mov<Mem16, Reg16> for Asm {
49    fn mov(&mut self, op1: Mem16, op2: Reg16) {
50        self.encode_mr(0x89, op1, op2);
51    }
52}
53
54impl Mov<Mem8, Reg8> for Asm {
55    fn mov(&mut self, op1: Mem8, op2: Reg8) {
56        self.encode_mr(0x88, op1, op2);
57    }
58}
59
60// -- MOV : reg mem
61
62impl Mov<Reg64, Mem64> for Asm {
63    fn mov(&mut self, op1: Reg64, op2: Mem64) {
64        self.encode_rm(0x8b, op1, op2);
65    }
66}
67
68impl Mov<Reg32, Mem32> for Asm {
69    fn mov(&mut self, op1: Reg32, op2: Mem32) {
70        self.encode_rm(0x8b, op1, op2);
71    }
72}
73
74impl Mov<Reg16, Mem16> for Asm {
75    fn mov(&mut self, op1: Reg16, op2: Mem16) {
76        self.encode_rm(0x8b, op1, op2);
77    }
78}
79
80impl Mov<Reg8, Mem8> for Asm {
81    fn mov(&mut self, op1: Reg8, op2: Mem8) {
82        self.encode_rm(0x8a, op1, op2);
83    }
84}
85
86// -- MOV : reg imm
87
88impl Mov<Reg64, Imm64> for Asm {
89    fn mov(&mut self, op1: Reg64, op2: Imm64) {
90        self.encode_oi(0xb8, op1, op2);
91    }
92}
93
94impl Mov<Reg32, Imm32> for Asm {
95    fn mov(&mut self, op1: Reg32, op2: Imm32) {
96        self.encode_oi(0xb8, op1, op2);
97    }
98}
99
100impl Mov<Reg16, Imm16> for Asm {
101    fn mov(&mut self, op1: Reg16, op2: Imm16) {
102        self.encode_oi(0xb8, op1, op2);
103    }
104}
105
106impl Mov<Reg8, Imm8> for Asm {
107    fn mov(&mut self, op1: Reg8, op2: Imm8) {
108        self.encode_oi(0xb0, op1, op2);
109    }
110}
111
112// -- MOV : mem imm
113
114impl Mov<Mem16, Imm16> for Asm {
115    fn mov(&mut self, op1: Mem16, op2: Imm16) {
116        self.encode_mi(0xc7, 0, op1, op2);
117    }
118}