Skip to main content

asmkit/x86/features/
686.rs

1use crate::x86::assembler::*;
2use crate::x86::operands::*;
3use super::super::opcodes::*;
4use crate::core::emitter::*;
5use crate::core::operand::*;
6
7/// A dummy operand that represents no register. Here just for simplicity.
8const NOREG: Operand = Operand::new();
9
10/// `FCMOVB` (FCMOVB). 
11/// Tests the status flags in the EFLAGS register and moves the source operand (second operand) to the destination operand (first operand) if the given test condition is true. The condition for each mnemonic os given in the Description column above and in Chapter 8 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1. The source operand is always in the ST(i) register and the destination operand is always ST(0).
12///
13///
14/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCMOVcc.html).
15///
16/// Supported operand variants:
17///
18/// ```text
19/// +---+----------+
20/// | # | Operands |
21/// +---+----------+
22/// | 1 | St       |
23/// +---+----------+
24/// ```
25pub trait FcmovbEmitter<A> {
26    fn fcmovb(&mut self, op0: A);
27}
28
29impl<'a> FcmovbEmitter<St> for Assembler<'a> {
30    fn fcmovb(&mut self, op0: St) {
31        self.emit(FCMOVBR, op0.as_operand(), &NOREG, &NOREG, &NOREG);
32    }
33}
34
35/// `FCMOVBE` (FCMOVBE). 
36/// Tests the status flags in the EFLAGS register and moves the source operand (second operand) to the destination operand (first operand) if the given test condition is true. The condition for each mnemonic os given in the Description column above and in Chapter 8 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1. The source operand is always in the ST(i) register and the destination operand is always ST(0).
37///
38///
39/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCMOVcc.html).
40///
41/// Supported operand variants:
42///
43/// ```text
44/// +---+----------+
45/// | # | Operands |
46/// +---+----------+
47/// | 1 | St       |
48/// +---+----------+
49/// ```
50pub trait FcmovbeEmitter<A> {
51    fn fcmovbe(&mut self, op0: A);
52}
53
54impl<'a> FcmovbeEmitter<St> for Assembler<'a> {
55    fn fcmovbe(&mut self, op0: St) {
56        self.emit(FCMOVBER, op0.as_operand(), &NOREG, &NOREG, &NOREG);
57    }
58}
59
60/// `FCMOVE` (FCMOVE). 
61/// Tests the status flags in the EFLAGS register and moves the source operand (second operand) to the destination operand (first operand) if the given test condition is true. The condition for each mnemonic os given in the Description column above and in Chapter 8 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1. The source operand is always in the ST(i) register and the destination operand is always ST(0).
62///
63///
64/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCMOVcc.html).
65///
66/// Supported operand variants:
67///
68/// ```text
69/// +---+----------+
70/// | # | Operands |
71/// +---+----------+
72/// | 1 | St       |
73/// +---+----------+
74/// ```
75pub trait FcmoveEmitter<A> {
76    fn fcmove(&mut self, op0: A);
77}
78
79impl<'a> FcmoveEmitter<St> for Assembler<'a> {
80    fn fcmove(&mut self, op0: St) {
81        self.emit(FCMOVER, op0.as_operand(), &NOREG, &NOREG, &NOREG);
82    }
83}
84
85/// `FCMOVNB` (FCMOVNB). 
86/// Tests the status flags in the EFLAGS register and moves the source operand (second operand) to the destination operand (first operand) if the given test condition is true. The condition for each mnemonic os given in the Description column above and in Chapter 8 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1. The source operand is always in the ST(i) register and the destination operand is always ST(0).
87///
88///
89/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCMOVcc.html).
90///
91/// Supported operand variants:
92///
93/// ```text
94/// +---+----------+
95/// | # | Operands |
96/// +---+----------+
97/// | 1 | St       |
98/// +---+----------+
99/// ```
100pub trait FcmovnbEmitter<A> {
101    fn fcmovnb(&mut self, op0: A);
102}
103
104impl<'a> FcmovnbEmitter<St> for Assembler<'a> {
105    fn fcmovnb(&mut self, op0: St) {
106        self.emit(FCMOVNBR, op0.as_operand(), &NOREG, &NOREG, &NOREG);
107    }
108}
109
110/// `FCMOVNBE` (FCMOVNBE). 
111/// Tests the status flags in the EFLAGS register and moves the source operand (second operand) to the destination operand (first operand) if the given test condition is true. The condition for each mnemonic os given in the Description column above and in Chapter 8 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1. The source operand is always in the ST(i) register and the destination operand is always ST(0).
112///
113///
114/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCMOVcc.html).
115///
116/// Supported operand variants:
117///
118/// ```text
119/// +---+----------+
120/// | # | Operands |
121/// +---+----------+
122/// | 1 | St       |
123/// +---+----------+
124/// ```
125pub trait FcmovnbeEmitter<A> {
126    fn fcmovnbe(&mut self, op0: A);
127}
128
129impl<'a> FcmovnbeEmitter<St> for Assembler<'a> {
130    fn fcmovnbe(&mut self, op0: St) {
131        self.emit(FCMOVNBER, op0.as_operand(), &NOREG, &NOREG, &NOREG);
132    }
133}
134
135/// `FCMOVNE` (FCMOVNE). 
136/// Tests the status flags in the EFLAGS register and moves the source operand (second operand) to the destination operand (first operand) if the given test condition is true. The condition for each mnemonic os given in the Description column above and in Chapter 8 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1. The source operand is always in the ST(i) register and the destination operand is always ST(0).
137///
138///
139/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCMOVcc.html).
140///
141/// Supported operand variants:
142///
143/// ```text
144/// +---+----------+
145/// | # | Operands |
146/// +---+----------+
147/// | 1 | St       |
148/// +---+----------+
149/// ```
150pub trait FcmovneEmitter<A> {
151    fn fcmovne(&mut self, op0: A);
152}
153
154impl<'a> FcmovneEmitter<St> for Assembler<'a> {
155    fn fcmovne(&mut self, op0: St) {
156        self.emit(FCMOVNER, op0.as_operand(), &NOREG, &NOREG, &NOREG);
157    }
158}
159
160/// `FCMOVNU` (FCMOVNU). 
161/// Tests the status flags in the EFLAGS register and moves the source operand (second operand) to the destination operand (first operand) if the given test condition is true. The condition for each mnemonic os given in the Description column above and in Chapter 8 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1. The source operand is always in the ST(i) register and the destination operand is always ST(0).
162///
163///
164/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCMOVcc.html).
165///
166/// Supported operand variants:
167///
168/// ```text
169/// +---+----------+
170/// | # | Operands |
171/// +---+----------+
172/// | 1 | St       |
173/// +---+----------+
174/// ```
175pub trait FcmovnuEmitter<A> {
176    fn fcmovnu(&mut self, op0: A);
177}
178
179impl<'a> FcmovnuEmitter<St> for Assembler<'a> {
180    fn fcmovnu(&mut self, op0: St) {
181        self.emit(FCMOVNUR, op0.as_operand(), &NOREG, &NOREG, &NOREG);
182    }
183}
184
185/// `FCMOVU` (FCMOVU). 
186/// Tests the status flags in the EFLAGS register and moves the source operand (second operand) to the destination operand (first operand) if the given test condition is true. The condition for each mnemonic os given in the Description column above and in Chapter 8 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1. The source operand is always in the ST(i) register and the destination operand is always ST(0).
187///
188///
189/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCMOVcc.html).
190///
191/// Supported operand variants:
192///
193/// ```text
194/// +---+----------+
195/// | # | Operands |
196/// +---+----------+
197/// | 1 | St       |
198/// +---+----------+
199/// ```
200pub trait FcmovuEmitter<A> {
201    fn fcmovu(&mut self, op0: A);
202}
203
204impl<'a> FcmovuEmitter<St> for Assembler<'a> {
205    fn fcmovu(&mut self, op0: St) {
206        self.emit(FCMOVUR, op0.as_operand(), &NOREG, &NOREG, &NOREG);
207    }
208}
209
210/// `FCOMI` (FCOMI). 
211/// Performs an unordered comparison of the contents of registers ST(0) and ST(i) and sets the status flags ZF, PF, and CF in the EFLAGS register according to the results (see the table below). The sign of zero is ignored for comparisons, so that –0.0 is equal to +0.0.
212///
213///
214/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCOMI%3AFCOMIP%3AFUCOMI%3AFUCOMIP.html).
215///
216/// Supported operand variants:
217///
218/// ```text
219/// +---+----------+
220/// | # | Operands |
221/// +---+----------+
222/// | 1 | St       |
223/// +---+----------+
224/// ```
225pub trait FcomiEmitter<A> {
226    fn fcomi(&mut self, op0: A);
227}
228
229impl<'a> FcomiEmitter<St> for Assembler<'a> {
230    fn fcomi(&mut self, op0: St) {
231        self.emit(FCOMIR, op0.as_operand(), &NOREG, &NOREG, &NOREG);
232    }
233}
234
235/// `FCOMIP` (FCOMIP). 
236/// Performs an unordered comparison of the contents of registers ST(0) and ST(i) and sets the status flags ZF, PF, and CF in the EFLAGS register according to the results (see the table below). The sign of zero is ignored for comparisons, so that –0.0 is equal to +0.0.
237///
238///
239/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCOMI%3AFCOMIP%3AFUCOMI%3AFUCOMIP.html).
240///
241/// Supported operand variants:
242///
243/// ```text
244/// +---+----------+
245/// | # | Operands |
246/// +---+----------+
247/// | 1 | St, St   |
248/// +---+----------+
249/// ```
250pub trait FcomipEmitter<A, B> {
251    fn fcomip(&mut self, op0: A, op1: B);
252}
253
254impl<'a> FcomipEmitter<St, St> for Assembler<'a> {
255    fn fcomip(&mut self, op0: St, op1: St) {
256        self.emit(FCOMIPRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
257    }
258}
259
260/// `FUCOMI` (FUCOMI). 
261/// Performs an unordered comparison of the contents of registers ST(0) and ST(i) and sets the status flags ZF, PF, and CF in the EFLAGS register according to the results (see the table below). The sign of zero is ignored for comparisons, so that –0.0 is equal to +0.0.
262///
263///
264/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCOMI%3AFCOMIP%3AFUCOMI%3AFUCOMIP.html).
265///
266/// Supported operand variants:
267///
268/// ```text
269/// +---+----------+
270/// | # | Operands |
271/// +---+----------+
272/// | 1 | St       |
273/// +---+----------+
274/// ```
275pub trait FucomiEmitter<A> {
276    fn fucomi(&mut self, op0: A);
277}
278
279impl<'a> FucomiEmitter<St> for Assembler<'a> {
280    fn fucomi(&mut self, op0: St) {
281        self.emit(FUCOMIR, op0.as_operand(), &NOREG, &NOREG, &NOREG);
282    }
283}
284
285/// `FUCOMIP` (FUCOMIP). 
286/// Performs an unordered comparison of the contents of registers ST(0) and ST(i) and sets the status flags ZF, PF, and CF in the EFLAGS register according to the results (see the table below). The sign of zero is ignored for comparisons, so that –0.0 is equal to +0.0.
287///
288///
289/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCOMI%3AFCOMIP%3AFUCOMI%3AFUCOMIP.html).
290///
291/// Supported operand variants:
292///
293/// ```text
294/// +---+----------+
295/// | # | Operands |
296/// +---+----------+
297/// | 1 | St, St   |
298/// +---+----------+
299/// ```
300pub trait FucomipEmitter<A, B> {
301    fn fucomip(&mut self, op0: A, op1: B);
302}
303
304impl<'a> FucomipEmitter<St, St> for Assembler<'a> {
305    fn fucomip(&mut self, op0: St, op1: St) {
306        self.emit(FUCOMIPRR, op0.as_operand(), op1.as_operand(), &NOREG, &NOREG);
307    }
308}
309
310/// `RDPMC` (RDPMC). 
311/// Reads the contents of the performance monitoring counter (PMC) specified in ECX register into registers EDX:EAX. (On processors that support the Intel 64 architecture, the high-order 32 bits of RCX are ignored.) The EDX register is loaded with the high-order 32 bits of the PMC and the EAX register is loaded with the low-order 32 bits. (On processors that support the Intel 64 architecture, the high-order 32 bits of each of RAX and RDX are cleared.) If fewer than 64 bits are implemented in the PMC being read, unimplemented bits returned to EDX:EAX will have value zero.
312///
313///
314/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/RDPMC.html).
315///
316/// Supported operand variants:
317///
318/// ```text
319/// +---+----------+
320/// | # | Operands |
321/// +---+----------+
322/// | 1 | (none)   |
323/// +---+----------+
324/// ```
325pub trait RdpmcEmitter {
326    fn rdpmc(&mut self);
327}
328
329impl<'a> RdpmcEmitter for Assembler<'a> {
330    fn rdpmc(&mut self) {
331        self.emit(RDPMC, &NOREG, &NOREG, &NOREG, &NOREG);
332    }
333}
334
335/// `SYSENTER` (SYSENTER). 
336/// Executes a fast call to a level 0 system procedure or routine. SYSENTER is a companion instruction to SYSEXIT. The instruction is optimized to provide the maximum performance for system calls from user code running at privilege level 3 to operating system or executive procedures running at privilege level 0.
337///
338///
339/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/SYSENTER.html).
340///
341/// Supported operand variants:
342///
343/// ```text
344/// +---+----------+
345/// | # | Operands |
346/// +---+----------+
347/// | 1 | (none)   |
348/// +---+----------+
349/// ```
350pub trait SysenterEmitter {
351    fn sysenter(&mut self);
352}
353
354impl<'a> SysenterEmitter for Assembler<'a> {
355    fn sysenter(&mut self) {
356        self.emit(SYSENTER, &NOREG, &NOREG, &NOREG, &NOREG);
357    }
358}
359
360/// `SYSEXIT` (SYSEXIT). 
361/// Executes a fast return to privilege level 3 user code. SYSEXIT is a companion instruction to the SYSENTER instruction. The instruction is optimized to provide the maximum performance for returns from system procedures executing at protections levels 0 to user procedures executing at protection level 3. It must be executed from code executing at privilege level 0.
362///
363///
364/// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/SYSEXIT.html).
365///
366/// Supported operand variants:
367///
368/// ```text
369/// +---+----------+
370/// | # | Operands |
371/// +---+----------+
372/// | 1 | (none)   |
373/// +---+----------+
374/// ```
375pub trait SysexitEmitter {
376    fn sysexit(&mut self);
377}
378
379impl<'a> SysexitEmitter for Assembler<'a> {
380    fn sysexit(&mut self) {
381        self.emit(SYSEXIT, &NOREG, &NOREG, &NOREG, &NOREG);
382    }
383}
384
385
386impl<'a> Assembler<'a> {
387    /// `FCMOVB` (FCMOVB). 
388    /// Tests the status flags in the EFLAGS register and moves the source operand (second operand) to the destination operand (first operand) if the given test condition is true. The condition for each mnemonic os given in the Description column above and in Chapter 8 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1. The source operand is always in the ST(i) register and the destination operand is always ST(0).
389    ///
390    ///
391    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCMOVcc.html).
392    ///
393    /// Supported operand variants:
394    ///
395    /// ```text
396    /// +---+----------+
397    /// | # | Operands |
398    /// +---+----------+
399    /// | 1 | St       |
400    /// +---+----------+
401    /// ```
402    #[inline]
403    pub fn fcmovb<A>(&mut self, op0: A)
404    where Assembler<'a>: FcmovbEmitter<A> {
405        <Self as FcmovbEmitter<A>>::fcmovb(self, op0);
406    }
407    /// `FCMOVBE` (FCMOVBE). 
408    /// Tests the status flags in the EFLAGS register and moves the source operand (second operand) to the destination operand (first operand) if the given test condition is true. The condition for each mnemonic os given in the Description column above and in Chapter 8 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1. The source operand is always in the ST(i) register and the destination operand is always ST(0).
409    ///
410    ///
411    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCMOVcc.html).
412    ///
413    /// Supported operand variants:
414    ///
415    /// ```text
416    /// +---+----------+
417    /// | # | Operands |
418    /// +---+----------+
419    /// | 1 | St       |
420    /// +---+----------+
421    /// ```
422    #[inline]
423    pub fn fcmovbe<A>(&mut self, op0: A)
424    where Assembler<'a>: FcmovbeEmitter<A> {
425        <Self as FcmovbeEmitter<A>>::fcmovbe(self, op0);
426    }
427    /// `FCMOVE` (FCMOVE). 
428    /// Tests the status flags in the EFLAGS register and moves the source operand (second operand) to the destination operand (first operand) if the given test condition is true. The condition for each mnemonic os given in the Description column above and in Chapter 8 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1. The source operand is always in the ST(i) register and the destination operand is always ST(0).
429    ///
430    ///
431    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCMOVcc.html).
432    ///
433    /// Supported operand variants:
434    ///
435    /// ```text
436    /// +---+----------+
437    /// | # | Operands |
438    /// +---+----------+
439    /// | 1 | St       |
440    /// +---+----------+
441    /// ```
442    #[inline]
443    pub fn fcmove<A>(&mut self, op0: A)
444    where Assembler<'a>: FcmoveEmitter<A> {
445        <Self as FcmoveEmitter<A>>::fcmove(self, op0);
446    }
447    /// `FCMOVNB` (FCMOVNB). 
448    /// Tests the status flags in the EFLAGS register and moves the source operand (second operand) to the destination operand (first operand) if the given test condition is true. The condition for each mnemonic os given in the Description column above and in Chapter 8 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1. The source operand is always in the ST(i) register and the destination operand is always ST(0).
449    ///
450    ///
451    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCMOVcc.html).
452    ///
453    /// Supported operand variants:
454    ///
455    /// ```text
456    /// +---+----------+
457    /// | # | Operands |
458    /// +---+----------+
459    /// | 1 | St       |
460    /// +---+----------+
461    /// ```
462    #[inline]
463    pub fn fcmovnb<A>(&mut self, op0: A)
464    where Assembler<'a>: FcmovnbEmitter<A> {
465        <Self as FcmovnbEmitter<A>>::fcmovnb(self, op0);
466    }
467    /// `FCMOVNBE` (FCMOVNBE). 
468    /// Tests the status flags in the EFLAGS register and moves the source operand (second operand) to the destination operand (first operand) if the given test condition is true. The condition for each mnemonic os given in the Description column above and in Chapter 8 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1. The source operand is always in the ST(i) register and the destination operand is always ST(0).
469    ///
470    ///
471    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCMOVcc.html).
472    ///
473    /// Supported operand variants:
474    ///
475    /// ```text
476    /// +---+----------+
477    /// | # | Operands |
478    /// +---+----------+
479    /// | 1 | St       |
480    /// +---+----------+
481    /// ```
482    #[inline]
483    pub fn fcmovnbe<A>(&mut self, op0: A)
484    where Assembler<'a>: FcmovnbeEmitter<A> {
485        <Self as FcmovnbeEmitter<A>>::fcmovnbe(self, op0);
486    }
487    /// `FCMOVNE` (FCMOVNE). 
488    /// Tests the status flags in the EFLAGS register and moves the source operand (second operand) to the destination operand (first operand) if the given test condition is true. The condition for each mnemonic os given in the Description column above and in Chapter 8 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1. The source operand is always in the ST(i) register and the destination operand is always ST(0).
489    ///
490    ///
491    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCMOVcc.html).
492    ///
493    /// Supported operand variants:
494    ///
495    /// ```text
496    /// +---+----------+
497    /// | # | Operands |
498    /// +---+----------+
499    /// | 1 | St       |
500    /// +---+----------+
501    /// ```
502    #[inline]
503    pub fn fcmovne<A>(&mut self, op0: A)
504    where Assembler<'a>: FcmovneEmitter<A> {
505        <Self as FcmovneEmitter<A>>::fcmovne(self, op0);
506    }
507    /// `FCMOVNU` (FCMOVNU). 
508    /// Tests the status flags in the EFLAGS register and moves the source operand (second operand) to the destination operand (first operand) if the given test condition is true. The condition for each mnemonic os given in the Description column above and in Chapter 8 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1. The source operand is always in the ST(i) register and the destination operand is always ST(0).
509    ///
510    ///
511    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCMOVcc.html).
512    ///
513    /// Supported operand variants:
514    ///
515    /// ```text
516    /// +---+----------+
517    /// | # | Operands |
518    /// +---+----------+
519    /// | 1 | St       |
520    /// +---+----------+
521    /// ```
522    #[inline]
523    pub fn fcmovnu<A>(&mut self, op0: A)
524    where Assembler<'a>: FcmovnuEmitter<A> {
525        <Self as FcmovnuEmitter<A>>::fcmovnu(self, op0);
526    }
527    /// `FCMOVU` (FCMOVU). 
528    /// Tests the status flags in the EFLAGS register and moves the source operand (second operand) to the destination operand (first operand) if the given test condition is true. The condition for each mnemonic os given in the Description column above and in Chapter 8 in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1. The source operand is always in the ST(i) register and the destination operand is always ST(0).
529    ///
530    ///
531    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCMOVcc.html).
532    ///
533    /// Supported operand variants:
534    ///
535    /// ```text
536    /// +---+----------+
537    /// | # | Operands |
538    /// +---+----------+
539    /// | 1 | St       |
540    /// +---+----------+
541    /// ```
542    #[inline]
543    pub fn fcmovu<A>(&mut self, op0: A)
544    where Assembler<'a>: FcmovuEmitter<A> {
545        <Self as FcmovuEmitter<A>>::fcmovu(self, op0);
546    }
547    /// `FCOMI` (FCOMI). 
548    /// Performs an unordered comparison of the contents of registers ST(0) and ST(i) and sets the status flags ZF, PF, and CF in the EFLAGS register according to the results (see the table below). The sign of zero is ignored for comparisons, so that –0.0 is equal to +0.0.
549    ///
550    ///
551    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCOMI%3AFCOMIP%3AFUCOMI%3AFUCOMIP.html).
552    ///
553    /// Supported operand variants:
554    ///
555    /// ```text
556    /// +---+----------+
557    /// | # | Operands |
558    /// +---+----------+
559    /// | 1 | St       |
560    /// +---+----------+
561    /// ```
562    #[inline]
563    pub fn fcomi<A>(&mut self, op0: A)
564    where Assembler<'a>: FcomiEmitter<A> {
565        <Self as FcomiEmitter<A>>::fcomi(self, op0);
566    }
567    /// `FCOMIP` (FCOMIP). 
568    /// Performs an unordered comparison of the contents of registers ST(0) and ST(i) and sets the status flags ZF, PF, and CF in the EFLAGS register according to the results (see the table below). The sign of zero is ignored for comparisons, so that –0.0 is equal to +0.0.
569    ///
570    ///
571    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCOMI%3AFCOMIP%3AFUCOMI%3AFUCOMIP.html).
572    ///
573    /// Supported operand variants:
574    ///
575    /// ```text
576    /// +---+----------+
577    /// | # | Operands |
578    /// +---+----------+
579    /// | 1 | St, St   |
580    /// +---+----------+
581    /// ```
582    #[inline]
583    pub fn fcomip<A, B>(&mut self, op0: A, op1: B)
584    where Assembler<'a>: FcomipEmitter<A, B> {
585        <Self as FcomipEmitter<A, B>>::fcomip(self, op0, op1);
586    }
587    /// `FUCOMI` (FUCOMI). 
588    /// Performs an unordered comparison of the contents of registers ST(0) and ST(i) and sets the status flags ZF, PF, and CF in the EFLAGS register according to the results (see the table below). The sign of zero is ignored for comparisons, so that –0.0 is equal to +0.0.
589    ///
590    ///
591    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCOMI%3AFCOMIP%3AFUCOMI%3AFUCOMIP.html).
592    ///
593    /// Supported operand variants:
594    ///
595    /// ```text
596    /// +---+----------+
597    /// | # | Operands |
598    /// +---+----------+
599    /// | 1 | St       |
600    /// +---+----------+
601    /// ```
602    #[inline]
603    pub fn fucomi<A>(&mut self, op0: A)
604    where Assembler<'a>: FucomiEmitter<A> {
605        <Self as FucomiEmitter<A>>::fucomi(self, op0);
606    }
607    /// `FUCOMIP` (FUCOMIP). 
608    /// Performs an unordered comparison of the contents of registers ST(0) and ST(i) and sets the status flags ZF, PF, and CF in the EFLAGS register according to the results (see the table below). The sign of zero is ignored for comparisons, so that –0.0 is equal to +0.0.
609    ///
610    ///
611    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/FCOMI%3AFCOMIP%3AFUCOMI%3AFUCOMIP.html).
612    ///
613    /// Supported operand variants:
614    ///
615    /// ```text
616    /// +---+----------+
617    /// | # | Operands |
618    /// +---+----------+
619    /// | 1 | St, St   |
620    /// +---+----------+
621    /// ```
622    #[inline]
623    pub fn fucomip<A, B>(&mut self, op0: A, op1: B)
624    where Assembler<'a>: FucomipEmitter<A, B> {
625        <Self as FucomipEmitter<A, B>>::fucomip(self, op0, op1);
626    }
627    /// `RDPMC` (RDPMC). 
628    /// Reads the contents of the performance monitoring counter (PMC) specified in ECX register into registers EDX:EAX. (On processors that support the Intel 64 architecture, the high-order 32 bits of RCX are ignored.) The EDX register is loaded with the high-order 32 bits of the PMC and the EAX register is loaded with the low-order 32 bits. (On processors that support the Intel 64 architecture, the high-order 32 bits of each of RAX and RDX are cleared.) If fewer than 64 bits are implemented in the PMC being read, unimplemented bits returned to EDX:EAX will have value zero.
629    ///
630    ///
631    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/RDPMC.html).
632    ///
633    /// Supported operand variants:
634    ///
635    /// ```text
636    /// +---+----------+
637    /// | # | Operands |
638    /// +---+----------+
639    /// | 1 | (none)   |
640    /// +---+----------+
641    /// ```
642    #[inline]
643    pub fn rdpmc(&mut self)
644    where Assembler<'a>: RdpmcEmitter {
645        <Self as RdpmcEmitter>::rdpmc(self);
646    }
647    /// `SYSENTER` (SYSENTER). 
648    /// Executes a fast call to a level 0 system procedure or routine. SYSENTER is a companion instruction to SYSEXIT. The instruction is optimized to provide the maximum performance for system calls from user code running at privilege level 3 to operating system or executive procedures running at privilege level 0.
649    ///
650    ///
651    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/SYSENTER.html).
652    ///
653    /// Supported operand variants:
654    ///
655    /// ```text
656    /// +---+----------+
657    /// | # | Operands |
658    /// +---+----------+
659    /// | 1 | (none)   |
660    /// +---+----------+
661    /// ```
662    #[inline]
663    pub fn sysenter(&mut self)
664    where Assembler<'a>: SysenterEmitter {
665        <Self as SysenterEmitter>::sysenter(self);
666    }
667    /// `SYSEXIT` (SYSEXIT). 
668    /// Executes a fast return to privilege level 3 user code. SYSEXIT is a companion instruction to the SYSENTER instruction. The instruction is optimized to provide the maximum performance for returns from system procedures executing at protections levels 0 to user procedures executing at protection level 3. It must be executed from code executing at privilege level 0.
669    ///
670    ///
671    /// For more details, see the [Intel manual](https://www.felixcloutier.com/x86/SYSEXIT.html).
672    ///
673    /// Supported operand variants:
674    ///
675    /// ```text
676    /// +---+----------+
677    /// | # | Operands |
678    /// +---+----------+
679    /// | 1 | (none)   |
680    /// +---+----------+
681    /// ```
682    #[inline]
683    pub fn sysexit(&mut self)
684    where Assembler<'a>: SysexitEmitter {
685        <Self as SysexitEmitter>::sysexit(self);
686    }
687}