Skip to main content

asmkit/x86/features/
RDSEED.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/// `RDSEED`.
11///
12/// Supported operand variants:
13///
14/// ```text
15/// +---+----------+
16/// | # | Operands |
17/// +---+----------+
18/// | 1 | Gpd      |
19/// | 2 | Gpq      |
20/// | 3 | Gpw      |
21/// +---+----------+
22/// ```
23pub trait RdseedEmitter<A> {
24    fn rdseed(&mut self, op0: A);
25}
26
27impl<'a> RdseedEmitter<Gpw> for Assembler<'a> {
28    fn rdseed(&mut self, op0: Gpw) {
29        self.emit(RDSEED16R, op0.as_operand(), &NOREG, &NOREG, &NOREG);
30    }
31}
32
33impl<'a> RdseedEmitter<Gpd> for Assembler<'a> {
34    fn rdseed(&mut self, op0: Gpd) {
35        self.emit(RDSEED32R, op0.as_operand(), &NOREG, &NOREG, &NOREG);
36    }
37}
38
39impl<'a> RdseedEmitter<Gpq> for Assembler<'a> {
40    fn rdseed(&mut self, op0: Gpq) {
41        self.emit(RDSEED64R, op0.as_operand(), &NOREG, &NOREG, &NOREG);
42    }
43}
44
45
46impl<'a> Assembler<'a> {
47    /// `RDSEED`.
48    ///
49    /// Supported operand variants:
50    ///
51    /// ```text
52    /// +---+----------+
53    /// | # | Operands |
54    /// +---+----------+
55    /// | 1 | Gpd      |
56    /// | 2 | Gpq      |
57    /// | 3 | Gpw      |
58    /// +---+----------+
59    /// ```
60    #[inline]
61    pub fn rdseed<A>(&mut self, op0: A)
62    where Assembler<'a>: RdseedEmitter<A> {
63        <Self as RdseedEmitter<A>>::rdseed(self, op0);
64    }
65}