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}