Skip to main content

asmkit/x86/features/
FSGSBASE.rs

1use super::super::opcodes::*;
2use crate::core::emitter::*;
3use crate::core::operand::*;
4use crate::x86::assembler::*;
5use crate::x86::operands::*;
6
7/// A dummy operand that represents no register. Here just for simplicity.
8const NOREG: Operand = Operand::new();
9
10/// `RDFSBASE`.
11///
12/// Supported operand variants:
13///
14/// ```text
15/// +---+----------+
16/// | # | Operands |
17/// +---+----------+
18/// | 1 | Gpd      |
19/// | 2 | Gpq      |
20/// +---+----------+
21/// ```
22pub trait RdfsbaseEmitter<A> {
23    fn rdfsbase(&mut self, op0: A);
24}
25
26impl<'a> RdfsbaseEmitter<Gpd> for Assembler<'a> {
27    fn rdfsbase(&mut self, op0: Gpd) {
28        self.emit(RDFSBASE32R, op0.as_operand(), &NOREG, &NOREG, &NOREG);
29    }
30}
31
32impl<'a> RdfsbaseEmitter<Gpq> for Assembler<'a> {
33    fn rdfsbase(&mut self, op0: Gpq) {
34        self.emit(RDFSBASE64R, op0.as_operand(), &NOREG, &NOREG, &NOREG);
35    }
36}
37
38/// `RDGSBASE`.
39///
40/// Supported operand variants:
41///
42/// ```text
43/// +---+----------+
44/// | # | Operands |
45/// +---+----------+
46/// | 1 | Gpd      |
47/// | 2 | Gpq      |
48/// +---+----------+
49/// ```
50pub trait RdgsbaseEmitter<A> {
51    fn rdgsbase(&mut self, op0: A);
52}
53
54impl<'a> RdgsbaseEmitter<Gpd> for Assembler<'a> {
55    fn rdgsbase(&mut self, op0: Gpd) {
56        self.emit(RDGSBASE32R, op0.as_operand(), &NOREG, &NOREG, &NOREG);
57    }
58}
59
60impl<'a> RdgsbaseEmitter<Gpq> for Assembler<'a> {
61    fn rdgsbase(&mut self, op0: Gpq) {
62        self.emit(RDGSBASE64R, op0.as_operand(), &NOREG, &NOREG, &NOREG);
63    }
64}
65
66/// `WRFSBASE`.
67///
68/// Supported operand variants:
69///
70/// ```text
71/// +---+----------+
72/// | # | Operands |
73/// +---+----------+
74/// | 1 | Gpd      |
75/// | 2 | Gpq      |
76/// +---+----------+
77/// ```
78pub trait WrfsbaseEmitter<A> {
79    fn wrfsbase(&mut self, op0: A);
80}
81
82impl<'a> WrfsbaseEmitter<Gpd> for Assembler<'a> {
83    fn wrfsbase(&mut self, op0: Gpd) {
84        self.emit(WRFSBASE32R, op0.as_operand(), &NOREG, &NOREG, &NOREG);
85    }
86}
87
88impl<'a> WrfsbaseEmitter<Gpq> for Assembler<'a> {
89    fn wrfsbase(&mut self, op0: Gpq) {
90        self.emit(WRFSBASE64R, op0.as_operand(), &NOREG, &NOREG, &NOREG);
91    }
92}
93
94/// `WRGSBASE`.
95///
96/// Supported operand variants:
97///
98/// ```text
99/// +---+----------+
100/// | # | Operands |
101/// +---+----------+
102/// | 1 | Gpd      |
103/// | 2 | Gpq      |
104/// +---+----------+
105/// ```
106pub trait WrgsbaseEmitter<A> {
107    fn wrgsbase(&mut self, op0: A);
108}
109
110impl<'a> WrgsbaseEmitter<Gpd> for Assembler<'a> {
111    fn wrgsbase(&mut self, op0: Gpd) {
112        self.emit(WRGSBASE32R, op0.as_operand(), &NOREG, &NOREG, &NOREG);
113    }
114}
115
116impl<'a> WrgsbaseEmitter<Gpq> for Assembler<'a> {
117    fn wrgsbase(&mut self, op0: Gpq) {
118        self.emit(WRGSBASE64R, op0.as_operand(), &NOREG, &NOREG, &NOREG);
119    }
120}
121
122impl<'a> Assembler<'a> {
123    /// `RDFSBASE`.
124    ///
125    /// Supported operand variants:
126    ///
127    /// ```text
128    /// +---+----------+
129    /// | # | Operands |
130    /// +---+----------+
131    /// | 1 | Gpd      |
132    /// | 2 | Gpq      |
133    /// +---+----------+
134    /// ```
135    #[inline]
136    pub fn rdfsbase<A>(&mut self, op0: A)
137    where
138        Assembler<'a>: RdfsbaseEmitter<A>,
139    {
140        <Self as RdfsbaseEmitter<A>>::rdfsbase(self, op0);
141    }
142    /// `RDGSBASE`.
143    ///
144    /// Supported operand variants:
145    ///
146    /// ```text
147    /// +---+----------+
148    /// | # | Operands |
149    /// +---+----------+
150    /// | 1 | Gpd      |
151    /// | 2 | Gpq      |
152    /// +---+----------+
153    /// ```
154    #[inline]
155    pub fn rdgsbase<A>(&mut self, op0: A)
156    where
157        Assembler<'a>: RdgsbaseEmitter<A>,
158    {
159        <Self as RdgsbaseEmitter<A>>::rdgsbase(self, op0);
160    }
161    /// `WRFSBASE`.
162    ///
163    /// Supported operand variants:
164    ///
165    /// ```text
166    /// +---+----------+
167    /// | # | Operands |
168    /// +---+----------+
169    /// | 1 | Gpd      |
170    /// | 2 | Gpq      |
171    /// +---+----------+
172    /// ```
173    #[inline]
174    pub fn wrfsbase<A>(&mut self, op0: A)
175    where
176        Assembler<'a>: WrfsbaseEmitter<A>,
177    {
178        <Self as WrfsbaseEmitter<A>>::wrfsbase(self, op0);
179    }
180    /// `WRGSBASE`.
181    ///
182    /// Supported operand variants:
183    ///
184    /// ```text
185    /// +---+----------+
186    /// | # | Operands |
187    /// +---+----------+
188    /// | 1 | Gpd      |
189    /// | 2 | Gpq      |
190    /// +---+----------+
191    /// ```
192    #[inline]
193    pub fn wrgsbase<A>(&mut self, op0: A)
194    where
195        Assembler<'a>: WrgsbaseEmitter<A>,
196    {
197        <Self as WrgsbaseEmitter<A>>::wrgsbase(self, op0);
198    }
199}