1use super::super::opcodes::*;
2use crate::core::emitter::*;
3use crate::core::operand::*;
4use crate::x86::assembler::*;
5use crate::x86::operands::*;
6
7const NOREG: Operand = Operand::new();
9
10pub trait FisttpEmitter<A> {
22 fn fisttp(&mut self, op0: A);
23}
24
25impl<'a> FisttpEmitter<Mem> for Assembler<'a> {
26 fn fisttp(&mut self, op0: Mem) {
27 self.emit(FISTTPM32, op0.as_operand(), &NOREG, &NOREG, &NOREG);
28 }
29}
30
31pub trait SseAddsubpdEmitter<A, B> {
44 fn sse_addsubpd(&mut self, op0: A, op1: B);
45}
46
47impl<'a> SseAddsubpdEmitter<Xmm, Xmm> for Assembler<'a> {
48 fn sse_addsubpd(&mut self, op0: Xmm, op1: Xmm) {
49 self.emit(
50 SSE_ADDSUBPDRR,
51 op0.as_operand(),
52 op1.as_operand(),
53 &NOREG,
54 &NOREG,
55 );
56 }
57}
58
59impl<'a> SseAddsubpdEmitter<Xmm, Mem> for Assembler<'a> {
60 fn sse_addsubpd(&mut self, op0: Xmm, op1: Mem) {
61 self.emit(
62 SSE_ADDSUBPDRM,
63 op0.as_operand(),
64 op1.as_operand(),
65 &NOREG,
66 &NOREG,
67 );
68 }
69}
70
71pub trait SseAddsubpsEmitter<A, B> {
84 fn sse_addsubps(&mut self, op0: A, op1: B);
85}
86
87impl<'a> SseAddsubpsEmitter<Xmm, Xmm> for Assembler<'a> {
88 fn sse_addsubps(&mut self, op0: Xmm, op1: Xmm) {
89 self.emit(
90 SSE_ADDSUBPSRR,
91 op0.as_operand(),
92 op1.as_operand(),
93 &NOREG,
94 &NOREG,
95 );
96 }
97}
98
99impl<'a> SseAddsubpsEmitter<Xmm, Mem> for Assembler<'a> {
100 fn sse_addsubps(&mut self, op0: Xmm, op1: Mem) {
101 self.emit(
102 SSE_ADDSUBPSRM,
103 op0.as_operand(),
104 op1.as_operand(),
105 &NOREG,
106 &NOREG,
107 );
108 }
109}
110
111pub trait SseHaddpdEmitter<A, B> {
124 fn sse_haddpd(&mut self, op0: A, op1: B);
125}
126
127impl<'a> SseHaddpdEmitter<Xmm, Xmm> for Assembler<'a> {
128 fn sse_haddpd(&mut self, op0: Xmm, op1: Xmm) {
129 self.emit(
130 SSE_HADDPDRR,
131 op0.as_operand(),
132 op1.as_operand(),
133 &NOREG,
134 &NOREG,
135 );
136 }
137}
138
139impl<'a> SseHaddpdEmitter<Xmm, Mem> for Assembler<'a> {
140 fn sse_haddpd(&mut self, op0: Xmm, op1: Mem) {
141 self.emit(
142 SSE_HADDPDRM,
143 op0.as_operand(),
144 op1.as_operand(),
145 &NOREG,
146 &NOREG,
147 );
148 }
149}
150
151pub trait SseHaddpsEmitter<A, B> {
164 fn sse_haddps(&mut self, op0: A, op1: B);
165}
166
167impl<'a> SseHaddpsEmitter<Xmm, Xmm> for Assembler<'a> {
168 fn sse_haddps(&mut self, op0: Xmm, op1: Xmm) {
169 self.emit(
170 SSE_HADDPSRR,
171 op0.as_operand(),
172 op1.as_operand(),
173 &NOREG,
174 &NOREG,
175 );
176 }
177}
178
179impl<'a> SseHaddpsEmitter<Xmm, Mem> for Assembler<'a> {
180 fn sse_haddps(&mut self, op0: Xmm, op1: Mem) {
181 self.emit(
182 SSE_HADDPSRM,
183 op0.as_operand(),
184 op1.as_operand(),
185 &NOREG,
186 &NOREG,
187 );
188 }
189}
190
191pub trait SseHsubpdEmitter<A, B> {
204 fn sse_hsubpd(&mut self, op0: A, op1: B);
205}
206
207impl<'a> SseHsubpdEmitter<Xmm, Xmm> for Assembler<'a> {
208 fn sse_hsubpd(&mut self, op0: Xmm, op1: Xmm) {
209 self.emit(
210 SSE_HSUBPDRR,
211 op0.as_operand(),
212 op1.as_operand(),
213 &NOREG,
214 &NOREG,
215 );
216 }
217}
218
219impl<'a> SseHsubpdEmitter<Xmm, Mem> for Assembler<'a> {
220 fn sse_hsubpd(&mut self, op0: Xmm, op1: Mem) {
221 self.emit(
222 SSE_HSUBPDRM,
223 op0.as_operand(),
224 op1.as_operand(),
225 &NOREG,
226 &NOREG,
227 );
228 }
229}
230
231pub trait SseHsubpsEmitter<A, B> {
244 fn sse_hsubps(&mut self, op0: A, op1: B);
245}
246
247impl<'a> SseHsubpsEmitter<Xmm, Xmm> for Assembler<'a> {
248 fn sse_hsubps(&mut self, op0: Xmm, op1: Xmm) {
249 self.emit(
250 SSE_HSUBPSRR,
251 op0.as_operand(),
252 op1.as_operand(),
253 &NOREG,
254 &NOREG,
255 );
256 }
257}
258
259impl<'a> SseHsubpsEmitter<Xmm, Mem> for Assembler<'a> {
260 fn sse_hsubps(&mut self, op0: Xmm, op1: Mem) {
261 self.emit(
262 SSE_HSUBPSRM,
263 op0.as_operand(),
264 op1.as_operand(),
265 &NOREG,
266 &NOREG,
267 );
268 }
269}
270
271pub trait SseLddquEmitter<A, B> {
283 fn sse_lddqu(&mut self, op0: A, op1: B);
284}
285
286impl<'a> SseLddquEmitter<Xmm, Mem> for Assembler<'a> {
287 fn sse_lddqu(&mut self, op0: Xmm, op1: Mem) {
288 self.emit(
289 SSE_LDDQURM,
290 op0.as_operand(),
291 op1.as_operand(),
292 &NOREG,
293 &NOREG,
294 );
295 }
296}
297
298pub trait SseMovddupEmitter<A, B> {
311 fn sse_movddup(&mut self, op0: A, op1: B);
312}
313
314impl<'a> SseMovddupEmitter<Xmm, Xmm> for Assembler<'a> {
315 fn sse_movddup(&mut self, op0: Xmm, op1: Xmm) {
316 self.emit(
317 SSE_MOVDDUPRR,
318 op0.as_operand(),
319 op1.as_operand(),
320 &NOREG,
321 &NOREG,
322 );
323 }
324}
325
326impl<'a> SseMovddupEmitter<Xmm, Mem> for Assembler<'a> {
327 fn sse_movddup(&mut self, op0: Xmm, op1: Mem) {
328 self.emit(
329 SSE_MOVDDUPRM,
330 op0.as_operand(),
331 op1.as_operand(),
332 &NOREG,
333 &NOREG,
334 );
335 }
336}
337
338pub trait SseMovshdupEmitter<A, B> {
351 fn sse_movshdup(&mut self, op0: A, op1: B);
352}
353
354impl<'a> SseMovshdupEmitter<Xmm, Xmm> for Assembler<'a> {
355 fn sse_movshdup(&mut self, op0: Xmm, op1: Xmm) {
356 self.emit(
357 SSE_MOVSHDUPRR,
358 op0.as_operand(),
359 op1.as_operand(),
360 &NOREG,
361 &NOREG,
362 );
363 }
364}
365
366impl<'a> SseMovshdupEmitter<Xmm, Mem> for Assembler<'a> {
367 fn sse_movshdup(&mut self, op0: Xmm, op1: Mem) {
368 self.emit(
369 SSE_MOVSHDUPRM,
370 op0.as_operand(),
371 op1.as_operand(),
372 &NOREG,
373 &NOREG,
374 );
375 }
376}
377
378pub trait SseMovsldupEmitter<A, B> {
391 fn sse_movsldup(&mut self, op0: A, op1: B);
392}
393
394impl<'a> SseMovsldupEmitter<Xmm, Xmm> for Assembler<'a> {
395 fn sse_movsldup(&mut self, op0: Xmm, op1: Xmm) {
396 self.emit(
397 SSE_MOVSLDUPRR,
398 op0.as_operand(),
399 op1.as_operand(),
400 &NOREG,
401 &NOREG,
402 );
403 }
404}
405
406impl<'a> SseMovsldupEmitter<Xmm, Mem> for Assembler<'a> {
407 fn sse_movsldup(&mut self, op0: Xmm, op1: Mem) {
408 self.emit(
409 SSE_MOVSLDUPRM,
410 op0.as_operand(),
411 op1.as_operand(),
412 &NOREG,
413 &NOREG,
414 );
415 }
416}
417
418impl<'a> Assembler<'a> {
419 #[inline]
431 pub fn fisttp<A>(&mut self, op0: A)
432 where
433 Assembler<'a>: FisttpEmitter<A>,
434 {
435 <Self as FisttpEmitter<A>>::fisttp(self, op0);
436 }
437 #[inline]
450 pub fn sse_addsubpd<A, B>(&mut self, op0: A, op1: B)
451 where
452 Assembler<'a>: SseAddsubpdEmitter<A, B>,
453 {
454 <Self as SseAddsubpdEmitter<A, B>>::sse_addsubpd(self, op0, op1);
455 }
456 #[inline]
469 pub fn sse_addsubps<A, B>(&mut self, op0: A, op1: B)
470 where
471 Assembler<'a>: SseAddsubpsEmitter<A, B>,
472 {
473 <Self as SseAddsubpsEmitter<A, B>>::sse_addsubps(self, op0, op1);
474 }
475 #[inline]
488 pub fn sse_haddpd<A, B>(&mut self, op0: A, op1: B)
489 where
490 Assembler<'a>: SseHaddpdEmitter<A, B>,
491 {
492 <Self as SseHaddpdEmitter<A, B>>::sse_haddpd(self, op0, op1);
493 }
494 #[inline]
507 pub fn sse_haddps<A, B>(&mut self, op0: A, op1: B)
508 where
509 Assembler<'a>: SseHaddpsEmitter<A, B>,
510 {
511 <Self as SseHaddpsEmitter<A, B>>::sse_haddps(self, op0, op1);
512 }
513 #[inline]
526 pub fn sse_hsubpd<A, B>(&mut self, op0: A, op1: B)
527 where
528 Assembler<'a>: SseHsubpdEmitter<A, B>,
529 {
530 <Self as SseHsubpdEmitter<A, B>>::sse_hsubpd(self, op0, op1);
531 }
532 #[inline]
545 pub fn sse_hsubps<A, B>(&mut self, op0: A, op1: B)
546 where
547 Assembler<'a>: SseHsubpsEmitter<A, B>,
548 {
549 <Self as SseHsubpsEmitter<A, B>>::sse_hsubps(self, op0, op1);
550 }
551 #[inline]
563 pub fn sse_lddqu<A, B>(&mut self, op0: A, op1: B)
564 where
565 Assembler<'a>: SseLddquEmitter<A, B>,
566 {
567 <Self as SseLddquEmitter<A, B>>::sse_lddqu(self, op0, op1);
568 }
569 #[inline]
582 pub fn sse_movddup<A, B>(&mut self, op0: A, op1: B)
583 where
584 Assembler<'a>: SseMovddupEmitter<A, B>,
585 {
586 <Self as SseMovddupEmitter<A, B>>::sse_movddup(self, op0, op1);
587 }
588 #[inline]
601 pub fn sse_movshdup<A, B>(&mut self, op0: A, op1: B)
602 where
603 Assembler<'a>: SseMovshdupEmitter<A, B>,
604 {
605 <Self as SseMovshdupEmitter<A, B>>::sse_movshdup(self, op0, op1);
606 }
607 #[inline]
620 pub fn sse_movsldup<A, B>(&mut self, op0: A, op1: B)
621 where
622 Assembler<'a>: SseMovsldupEmitter<A, B>,
623 {
624 <Self as SseMovsldupEmitter<A, B>>::sse_movsldup(self, op0, op1);
625 }
626}