asmkit/x86/features/AESKLE.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/// `AESDEC128KL`.
11///
12/// Supported operand variants:
13///
14/// ```text
15/// +---+----------+
16/// | # | Operands |
17/// +---+----------+
18/// | 1 | Xmm, Mem |
19/// +---+----------+
20/// ```
21pub trait Aesdec128klEmitter<A, B> {
22 fn aesdec128kl(&mut self, op0: A, op1: B);
23}
24
25impl<'a> Aesdec128klEmitter<Xmm, Mem> for Assembler<'a> {
26 fn aesdec128kl(&mut self, op0: Xmm, op1: Mem) {
27 self.emit(
28 AESDEC128KLRM,
29 op0.as_operand(),
30 op1.as_operand(),
31 &NOREG,
32 &NOREG,
33 );
34 }
35}
36
37/// `AESDEC256KL`.
38///
39/// Supported operand variants:
40///
41/// ```text
42/// +---+----------+
43/// | # | Operands |
44/// +---+----------+
45/// | 1 | Xmm, Mem |
46/// +---+----------+
47/// ```
48pub trait Aesdec256klEmitter<A, B> {
49 fn aesdec256kl(&mut self, op0: A, op1: B);
50}
51
52impl<'a> Aesdec256klEmitter<Xmm, Mem> for Assembler<'a> {
53 fn aesdec256kl(&mut self, op0: Xmm, op1: Mem) {
54 self.emit(
55 AESDEC256KLRM,
56 op0.as_operand(),
57 op1.as_operand(),
58 &NOREG,
59 &NOREG,
60 );
61 }
62}
63
64/// `AESDECWIDE128KL`.
65///
66/// Supported operand variants:
67///
68/// ```text
69/// +---+----------+
70/// | # | Operands |
71/// +---+----------+
72/// | 1 | Mem |
73/// +---+----------+
74/// ```
75pub trait Aesdecwide128klEmitter<A> {
76 fn aesdecwide128kl(&mut self, op0: A);
77}
78
79impl<'a> Aesdecwide128klEmitter<Mem> for Assembler<'a> {
80 fn aesdecwide128kl(&mut self, op0: Mem) {
81 self.emit(AESDECWIDE128KLM, op0.as_operand(), &NOREG, &NOREG, &NOREG);
82 }
83}
84
85/// `AESDECWIDE256KL`.
86///
87/// Supported operand variants:
88///
89/// ```text
90/// +---+----------+
91/// | # | Operands |
92/// +---+----------+
93/// | 1 | Mem |
94/// +---+----------+
95/// ```
96pub trait Aesdecwide256klEmitter<A> {
97 fn aesdecwide256kl(&mut self, op0: A);
98}
99
100impl<'a> Aesdecwide256klEmitter<Mem> for Assembler<'a> {
101 fn aesdecwide256kl(&mut self, op0: Mem) {
102 self.emit(AESDECWIDE256KLM, op0.as_operand(), &NOREG, &NOREG, &NOREG);
103 }
104}
105
106/// `AESENC128KL`.
107///
108/// Supported operand variants:
109///
110/// ```text
111/// +---+----------+
112/// | # | Operands |
113/// +---+----------+
114/// | 1 | Xmm, Mem |
115/// +---+----------+
116/// ```
117pub trait Aesenc128klEmitter<A, B> {
118 fn aesenc128kl(&mut self, op0: A, op1: B);
119}
120
121impl<'a> Aesenc128klEmitter<Xmm, Mem> for Assembler<'a> {
122 fn aesenc128kl(&mut self, op0: Xmm, op1: Mem) {
123 self.emit(
124 AESENC128KLRM,
125 op0.as_operand(),
126 op1.as_operand(),
127 &NOREG,
128 &NOREG,
129 );
130 }
131}
132
133/// `AESENC256KL`.
134///
135/// Supported operand variants:
136///
137/// ```text
138/// +---+----------+
139/// | # | Operands |
140/// +---+----------+
141/// | 1 | Xmm, Mem |
142/// +---+----------+
143/// ```
144pub trait Aesenc256klEmitter<A, B> {
145 fn aesenc256kl(&mut self, op0: A, op1: B);
146}
147
148impl<'a> Aesenc256klEmitter<Xmm, Mem> for Assembler<'a> {
149 fn aesenc256kl(&mut self, op0: Xmm, op1: Mem) {
150 self.emit(
151 AESENC256KLRM,
152 op0.as_operand(),
153 op1.as_operand(),
154 &NOREG,
155 &NOREG,
156 );
157 }
158}
159
160/// `AESENCWIDE128KL`.
161///
162/// Supported operand variants:
163///
164/// ```text
165/// +---+----------+
166/// | # | Operands |
167/// +---+----------+
168/// | 1 | Mem |
169/// +---+----------+
170/// ```
171pub trait Aesencwide128klEmitter<A> {
172 fn aesencwide128kl(&mut self, op0: A);
173}
174
175impl<'a> Aesencwide128klEmitter<Mem> for Assembler<'a> {
176 fn aesencwide128kl(&mut self, op0: Mem) {
177 self.emit(AESENCWIDE128KLM, op0.as_operand(), &NOREG, &NOREG, &NOREG);
178 }
179}
180
181/// `AESENCWIDE256KL`.
182///
183/// Supported operand variants:
184///
185/// ```text
186/// +---+----------+
187/// | # | Operands |
188/// +---+----------+
189/// | 1 | Mem |
190/// +---+----------+
191/// ```
192pub trait Aesencwide256klEmitter<A> {
193 fn aesencwide256kl(&mut self, op0: A);
194}
195
196impl<'a> Aesencwide256klEmitter<Mem> for Assembler<'a> {
197 fn aesencwide256kl(&mut self, op0: Mem) {
198 self.emit(AESENCWIDE256KLM, op0.as_operand(), &NOREG, &NOREG, &NOREG);
199 }
200}
201
202/// `ENCODEKEY128`.
203///
204/// Supported operand variants:
205///
206/// ```text
207/// +---+----------+
208/// | # | Operands |
209/// +---+----------+
210/// | 1 | Gpd, Gpd |
211/// +---+----------+
212/// ```
213pub trait Encodekey128Emitter<A, B> {
214 fn encodekey128(&mut self, op0: A, op1: B);
215}
216
217impl<'a> Encodekey128Emitter<Gpd, Gpd> for Assembler<'a> {
218 fn encodekey128(&mut self, op0: Gpd, op1: Gpd) {
219 self.emit(
220 ENCODEKEY128RR,
221 op0.as_operand(),
222 op1.as_operand(),
223 &NOREG,
224 &NOREG,
225 );
226 }
227}
228
229/// `ENCODEKEY256`.
230///
231/// Supported operand variants:
232///
233/// ```text
234/// +---+----------+
235/// | # | Operands |
236/// +---+----------+
237/// | 1 | Gpd, Gpd |
238/// +---+----------+
239/// ```
240pub trait Encodekey256Emitter<A, B> {
241 fn encodekey256(&mut self, op0: A, op1: B);
242}
243
244impl<'a> Encodekey256Emitter<Gpd, Gpd> for Assembler<'a> {
245 fn encodekey256(&mut self, op0: Gpd, op1: Gpd) {
246 self.emit(
247 ENCODEKEY256RR,
248 op0.as_operand(),
249 op1.as_operand(),
250 &NOREG,
251 &NOREG,
252 );
253 }
254}
255
256/// `LOADIWKEY`.
257///
258/// Supported operand variants:
259///
260/// ```text
261/// +---+----------+
262/// | # | Operands |
263/// +---+----------+
264/// | 1 | Xmm, Xmm |
265/// +---+----------+
266/// ```
267pub trait LoadiwkeyEmitter<A, B> {
268 fn loadiwkey(&mut self, op0: A, op1: B);
269}
270
271impl<'a> LoadiwkeyEmitter<Xmm, Xmm> for Assembler<'a> {
272 fn loadiwkey(&mut self, op0: Xmm, op1: Xmm) {
273 self.emit(
274 LOADIWKEYRR,
275 op0.as_operand(),
276 op1.as_operand(),
277 &NOREG,
278 &NOREG,
279 );
280 }
281}
282
283impl<'a> Assembler<'a> {
284 /// `AESDEC128KL`.
285 ///
286 /// Supported operand variants:
287 ///
288 /// ```text
289 /// +---+----------+
290 /// | # | Operands |
291 /// +---+----------+
292 /// | 1 | Xmm, Mem |
293 /// +---+----------+
294 /// ```
295 #[inline]
296 pub fn aesdec128kl<A, B>(&mut self, op0: A, op1: B)
297 where
298 Assembler<'a>: Aesdec128klEmitter<A, B>,
299 {
300 <Self as Aesdec128klEmitter<A, B>>::aesdec128kl(self, op0, op1);
301 }
302 /// `AESDEC256KL`.
303 ///
304 /// Supported operand variants:
305 ///
306 /// ```text
307 /// +---+----------+
308 /// | # | Operands |
309 /// +---+----------+
310 /// | 1 | Xmm, Mem |
311 /// +---+----------+
312 /// ```
313 #[inline]
314 pub fn aesdec256kl<A, B>(&mut self, op0: A, op1: B)
315 where
316 Assembler<'a>: Aesdec256klEmitter<A, B>,
317 {
318 <Self as Aesdec256klEmitter<A, B>>::aesdec256kl(self, op0, op1);
319 }
320 /// `AESDECWIDE128KL`.
321 ///
322 /// Supported operand variants:
323 ///
324 /// ```text
325 /// +---+----------+
326 /// | # | Operands |
327 /// +---+----------+
328 /// | 1 | Mem |
329 /// +---+----------+
330 /// ```
331 #[inline]
332 pub fn aesdecwide128kl<A>(&mut self, op0: A)
333 where
334 Assembler<'a>: Aesdecwide128klEmitter<A>,
335 {
336 <Self as Aesdecwide128klEmitter<A>>::aesdecwide128kl(self, op0);
337 }
338 /// `AESDECWIDE256KL`.
339 ///
340 /// Supported operand variants:
341 ///
342 /// ```text
343 /// +---+----------+
344 /// | # | Operands |
345 /// +---+----------+
346 /// | 1 | Mem |
347 /// +---+----------+
348 /// ```
349 #[inline]
350 pub fn aesdecwide256kl<A>(&mut self, op0: A)
351 where
352 Assembler<'a>: Aesdecwide256klEmitter<A>,
353 {
354 <Self as Aesdecwide256klEmitter<A>>::aesdecwide256kl(self, op0);
355 }
356 /// `AESENC128KL`.
357 ///
358 /// Supported operand variants:
359 ///
360 /// ```text
361 /// +---+----------+
362 /// | # | Operands |
363 /// +---+----------+
364 /// | 1 | Xmm, Mem |
365 /// +---+----------+
366 /// ```
367 #[inline]
368 pub fn aesenc128kl<A, B>(&mut self, op0: A, op1: B)
369 where
370 Assembler<'a>: Aesenc128klEmitter<A, B>,
371 {
372 <Self as Aesenc128klEmitter<A, B>>::aesenc128kl(self, op0, op1);
373 }
374 /// `AESENC256KL`.
375 ///
376 /// Supported operand variants:
377 ///
378 /// ```text
379 /// +---+----------+
380 /// | # | Operands |
381 /// +---+----------+
382 /// | 1 | Xmm, Mem |
383 /// +---+----------+
384 /// ```
385 #[inline]
386 pub fn aesenc256kl<A, B>(&mut self, op0: A, op1: B)
387 where
388 Assembler<'a>: Aesenc256klEmitter<A, B>,
389 {
390 <Self as Aesenc256klEmitter<A, B>>::aesenc256kl(self, op0, op1);
391 }
392 /// `AESENCWIDE128KL`.
393 ///
394 /// Supported operand variants:
395 ///
396 /// ```text
397 /// +---+----------+
398 /// | # | Operands |
399 /// +---+----------+
400 /// | 1 | Mem |
401 /// +---+----------+
402 /// ```
403 #[inline]
404 pub fn aesencwide128kl<A>(&mut self, op0: A)
405 where
406 Assembler<'a>: Aesencwide128klEmitter<A>,
407 {
408 <Self as Aesencwide128klEmitter<A>>::aesencwide128kl(self, op0);
409 }
410 /// `AESENCWIDE256KL`.
411 ///
412 /// Supported operand variants:
413 ///
414 /// ```text
415 /// +---+----------+
416 /// | # | Operands |
417 /// +---+----------+
418 /// | 1 | Mem |
419 /// +---+----------+
420 /// ```
421 #[inline]
422 pub fn aesencwide256kl<A>(&mut self, op0: A)
423 where
424 Assembler<'a>: Aesencwide256klEmitter<A>,
425 {
426 <Self as Aesencwide256klEmitter<A>>::aesencwide256kl(self, op0);
427 }
428 /// `ENCODEKEY128`.
429 ///
430 /// Supported operand variants:
431 ///
432 /// ```text
433 /// +---+----------+
434 /// | # | Operands |
435 /// +---+----------+
436 /// | 1 | Gpd, Gpd |
437 /// +---+----------+
438 /// ```
439 #[inline]
440 pub fn encodekey128<A, B>(&mut self, op0: A, op1: B)
441 where
442 Assembler<'a>: Encodekey128Emitter<A, B>,
443 {
444 <Self as Encodekey128Emitter<A, B>>::encodekey128(self, op0, op1);
445 }
446 /// `ENCODEKEY256`.
447 ///
448 /// Supported operand variants:
449 ///
450 /// ```text
451 /// +---+----------+
452 /// | # | Operands |
453 /// +---+----------+
454 /// | 1 | Gpd, Gpd |
455 /// +---+----------+
456 /// ```
457 #[inline]
458 pub fn encodekey256<A, B>(&mut self, op0: A, op1: B)
459 where
460 Assembler<'a>: Encodekey256Emitter<A, B>,
461 {
462 <Self as Encodekey256Emitter<A, B>>::encodekey256(self, op0, op1);
463 }
464 /// `LOADIWKEY`.
465 ///
466 /// Supported operand variants:
467 ///
468 /// ```text
469 /// +---+----------+
470 /// | # | Operands |
471 /// +---+----------+
472 /// | 1 | Xmm, Xmm |
473 /// +---+----------+
474 /// ```
475 #[inline]
476 pub fn loadiwkey<A, B>(&mut self, op0: A, op1: B)
477 where
478 Assembler<'a>: LoadiwkeyEmitter<A, B>,
479 {
480 <Self as LoadiwkeyEmitter<A, B>>::loadiwkey(self, op0, op1);
481 }
482}