Imported Upstream version 1.15.1
[deb_xorg-server.git] / hw / xfree86 / x86emu / x86emu / prim_asm.h
CommitLineData
a09e091a
JB
1/****************************************************************************
2*
3* Realmode X86 Emulator Library
4*
5* Copyright (C) 1996-1999 SciTech Software, Inc.
6* Copyright (C) David Mosberger-Tang
7* Copyright (C) 1999 Egbert Eich
8*
9* ========================================================================
10*
11* Permission to use, copy, modify, distribute, and sell this software and
12* its documentation for any purpose is hereby granted without fee,
13* provided that the above copyright notice appear in all copies and that
14* both that copyright notice and this permission notice appear in
15* supporting documentation, and that the name of the authors not be used
16* in advertising or publicity pertaining to distribution of the software
17* without specific, written prior permission. The authors makes no
18* representations about the suitability of this software for any purpose.
19* It is provided "as is" without express or implied warranty.
20*
21* THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
22* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
23* EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
24* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
25* USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
26* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
27* PERFORMANCE OF THIS SOFTWARE.
28*
29* ========================================================================
30*
31* Language: Watcom C++ 10.6 or later
32* Environment: Any
33* Developer: Kendall Bennett
34*
35* Description: Inline assembler versions of the primitive operand
36* functions for faster performance. At the moment this is
37* x86 inline assembler, but these functions could be replaced
38* with native inline assembler for each supported processor
39* platform.
40*
41****************************************************************************/
42
43#ifndef __X86EMU_PRIM_ASM_H
44#define __X86EMU_PRIM_ASM_H
45
46#ifdef __WATCOMC__
47
48#ifndef VALIDATE
49#define __HAVE_INLINE_ASSEMBLER__
50#endif
51
52u32 get_flags_asm(void);
53
54#pragma aux get_flags_asm = \
55 "pushf" \
56 "pop eax" \
57 value [eax] \
58 modify exact [eax];
59
60u16 aaa_word_asm(u32 * flags, u16 d);
61
62#pragma aux aaa_word_asm = \
63 "push [edi]" \
64 "popf" \
65 "aaa" \
66 "pushf" \
67 "pop [edi]" \
68 parm [edi] [ax] \
69 value [ax] \
70 modify exact [ax];
71
72u16 aas_word_asm(u32 * flags, u16 d);
73
74#pragma aux aas_word_asm = \
75 "push [edi]" \
76 "popf" \
77 "aas" \
78 "pushf" \
79 "pop [edi]" \
80 parm [edi] [ax] \
81 value [ax] \
82 modify exact [ax];
83
84u16 aad_word_asm(u32 * flags, u16 d);
85
86#pragma aux aad_word_asm = \
87 "push [edi]" \
88 "popf" \
89 "aad" \
90 "pushf" \
91 "pop [edi]" \
92 parm [edi] [ax] \
93 value [ax] \
94 modify exact [ax];
95
96u16 aam_word_asm(u32 * flags, u8 d);
97
98#pragma aux aam_word_asm = \
99 "push [edi]" \
100 "popf" \
101 "aam" \
102 "pushf" \
103 "pop [edi]" \
104 parm [edi] [al] \
105 value [ax] \
106 modify exact [ax];
107
108u8 adc_byte_asm(u32 * flags, u8 d, u8 s);
109
110#pragma aux adc_byte_asm = \
111 "push [edi]" \
112 "popf" \
113 "adc al,bl" \
114 "pushf" \
115 "pop [edi]" \
116 parm [edi] [al] [bl] \
117 value [al] \
118 modify exact [al bl];
119
120u16 adc_word_asm(u32 * flags, u16 d, u16 s);
121
122#pragma aux adc_word_asm = \
123 "push [edi]" \
124 "popf" \
125 "adc ax,bx" \
126 "pushf" \
127 "pop [edi]" \
128 parm [edi] [ax] [bx] \
129 value [ax] \
130 modify exact [ax bx];
131
132u32 adc_long_asm(u32 * flags, u32 d, u32 s);
133
134#pragma aux adc_long_asm = \
135 "push [edi]" \
136 "popf" \
137 "adc eax,ebx" \
138 "pushf" \
139 "pop [edi]" \
140 parm [edi] [eax] [ebx] \
141 value [eax] \
142 modify exact [eax ebx];
143
144u8 add_byte_asm(u32 * flags, u8 d, u8 s);
145
146#pragma aux add_byte_asm = \
147 "push [edi]" \
148 "popf" \
149 "add al,bl" \
150 "pushf" \
151 "pop [edi]" \
152 parm [edi] [al] [bl] \
153 value [al] \
154 modify exact [al bl];
155
156u16 add_word_asm(u32 * flags, u16 d, u16 s);
157
158#pragma aux add_word_asm = \
159 "push [edi]" \
160 "popf" \
161 "add ax,bx" \
162 "pushf" \
163 "pop [edi]" \
164 parm [edi] [ax] [bx] \
165 value [ax] \
166 modify exact [ax bx];
167
168u32 add_long_asm(u32 * flags, u32 d, u32 s);
169
170#pragma aux add_long_asm = \
171 "push [edi]" \
172 "popf" \
173 "add eax,ebx" \
174 "pushf" \
175 "pop [edi]" \
176 parm [edi] [eax] [ebx] \
177 value [eax] \
178 modify exact [eax ebx];
179
180u8 and_byte_asm(u32 * flags, u8 d, u8 s);
181
182#pragma aux and_byte_asm = \
183 "push [edi]" \
184 "popf" \
185 "and al,bl" \
186 "pushf" \
187 "pop [edi]" \
188 parm [edi] [al] [bl] \
189 value [al] \
190 modify exact [al bl];
191
192u16 and_word_asm(u32 * flags, u16 d, u16 s);
193
194#pragma aux and_word_asm = \
195 "push [edi]" \
196 "popf" \
197 "and ax,bx" \
198 "pushf" \
199 "pop [edi]" \
200 parm [edi] [ax] [bx] \
201 value [ax] \
202 modify exact [ax bx];
203
204u32 and_long_asm(u32 * flags, u32 d, u32 s);
205
206#pragma aux and_long_asm = \
207 "push [edi]" \
208 "popf" \
209 "and eax,ebx" \
210 "pushf" \
211 "pop [edi]" \
212 parm [edi] [eax] [ebx] \
213 value [eax] \
214 modify exact [eax ebx];
215
216u8 cmp_byte_asm(u32 * flags, u8 d, u8 s);
217
218#pragma aux cmp_byte_asm = \
219 "push [edi]" \
220 "popf" \
221 "cmp al,bl" \
222 "pushf" \
223 "pop [edi]" \
224 parm [edi] [al] [bl] \
225 value [al] \
226 modify exact [al bl];
227
228u16 cmp_word_asm(u32 * flags, u16 d, u16 s);
229
230#pragma aux cmp_word_asm = \
231 "push [edi]" \
232 "popf" \
233 "cmp ax,bx" \
234 "pushf" \
235 "pop [edi]" \
236 parm [edi] [ax] [bx] \
237 value [ax] \
238 modify exact [ax bx];
239
240u32 cmp_long_asm(u32 * flags, u32 d, u32 s);
241
242#pragma aux cmp_long_asm = \
243 "push [edi]" \
244 "popf" \
245 "cmp eax,ebx" \
246 "pushf" \
247 "pop [edi]" \
248 parm [edi] [eax] [ebx] \
249 value [eax] \
250 modify exact [eax ebx];
251
252u8 daa_byte_asm(u32 * flags, u8 d);
253
254#pragma aux daa_byte_asm = \
255 "push [edi]" \
256 "popf" \
257 "daa" \
258 "pushf" \
259 "pop [edi]" \
260 parm [edi] [al] \
261 value [al] \
262 modify exact [al];
263
264u8 das_byte_asm(u32 * flags, u8 d);
265
266#pragma aux das_byte_asm = \
267 "push [edi]" \
268 "popf" \
269 "das" \
270 "pushf" \
271 "pop [edi]" \
272 parm [edi] [al] \
273 value [al] \
274 modify exact [al];
275
276u8 dec_byte_asm(u32 * flags, u8 d);
277
278#pragma aux dec_byte_asm = \
279 "push [edi]" \
280 "popf" \
281 "dec al" \
282 "pushf" \
283 "pop [edi]" \
284 parm [edi] [al] \
285 value [al] \
286 modify exact [al];
287
288u16 dec_word_asm(u32 * flags, u16 d);
289
290#pragma aux dec_word_asm = \
291 "push [edi]" \
292 "popf" \
293 "dec ax" \
294 "pushf" \
295 "pop [edi]" \
296 parm [edi] [ax] \
297 value [ax] \
298 modify exact [ax];
299
300u32 dec_long_asm(u32 * flags, u32 d);
301
302#pragma aux dec_long_asm = \
303 "push [edi]" \
304 "popf" \
305 "dec eax" \
306 "pushf" \
307 "pop [edi]" \
308 parm [edi] [eax] \
309 value [eax] \
310 modify exact [eax];
311
312u8 inc_byte_asm(u32 * flags, u8 d);
313
314#pragma aux inc_byte_asm = \
315 "push [edi]" \
316 "popf" \
317 "inc al" \
318 "pushf" \
319 "pop [edi]" \
320 parm [edi] [al] \
321 value [al] \
322 modify exact [al];
323
324u16 inc_word_asm(u32 * flags, u16 d);
325
326#pragma aux inc_word_asm = \
327 "push [edi]" \
328 "popf" \
329 "inc ax" \
330 "pushf" \
331 "pop [edi]" \
332 parm [edi] [ax] \
333 value [ax] \
334 modify exact [ax];
335
336u32 inc_long_asm(u32 * flags, u32 d);
337
338#pragma aux inc_long_asm = \
339 "push [edi]" \
340 "popf" \
341 "inc eax" \
342 "pushf" \
343 "pop [edi]" \
344 parm [edi] [eax] \
345 value [eax] \
346 modify exact [eax];
347
348u8 or_byte_asm(u32 * flags, u8 d, u8 s);
349
350#pragma aux or_byte_asm = \
351 "push [edi]" \
352 "popf" \
353 "or al,bl" \
354 "pushf" \
355 "pop [edi]" \
356 parm [edi] [al] [bl] \
357 value [al] \
358 modify exact [al bl];
359
360u16 or_word_asm(u32 * flags, u16 d, u16 s);
361
362#pragma aux or_word_asm = \
363 "push [edi]" \
364 "popf" \
365 "or ax,bx" \
366 "pushf" \
367 "pop [edi]" \
368 parm [edi] [ax] [bx] \
369 value [ax] \
370 modify exact [ax bx];
371
372u32 or_long_asm(u32 * flags, u32 d, u32 s);
373
374#pragma aux or_long_asm = \
375 "push [edi]" \
376 "popf" \
377 "or eax,ebx" \
378 "pushf" \
379 "pop [edi]" \
380 parm [edi] [eax] [ebx] \
381 value [eax] \
382 modify exact [eax ebx];
383
384u8 neg_byte_asm(u32 * flags, u8 d);
385
386#pragma aux neg_byte_asm = \
387 "push [edi]" \
388 "popf" \
389 "neg al" \
390 "pushf" \
391 "pop [edi]" \
392 parm [edi] [al] \
393 value [al] \
394 modify exact [al];
395
396u16 neg_word_asm(u32 * flags, u16 d);
397
398#pragma aux neg_word_asm = \
399 "push [edi]" \
400 "popf" \
401 "neg ax" \
402 "pushf" \
403 "pop [edi]" \
404 parm [edi] [ax] \
405 value [ax] \
406 modify exact [ax];
407
408u32 neg_long_asm(u32 * flags, u32 d);
409
410#pragma aux neg_long_asm = \
411 "push [edi]" \
412 "popf" \
413 "neg eax" \
414 "pushf" \
415 "pop [edi]" \
416 parm [edi] [eax] \
417 value [eax] \
418 modify exact [eax];
419
420u8 not_byte_asm(u32 * flags, u8 d);
421
422#pragma aux not_byte_asm = \
423 "push [edi]" \
424 "popf" \
425 "not al" \
426 "pushf" \
427 "pop [edi]" \
428 parm [edi] [al] \
429 value [al] \
430 modify exact [al];
431
432u16 not_word_asm(u32 * flags, u16 d);
433
434#pragma aux not_word_asm = \
435 "push [edi]" \
436 "popf" \
437 "not ax" \
438 "pushf" \
439 "pop [edi]" \
440 parm [edi] [ax] \
441 value [ax] \
442 modify exact [ax];
443
444u32 not_long_asm(u32 * flags, u32 d);
445
446#pragma aux not_long_asm = \
447 "push [edi]" \
448 "popf" \
449 "not eax" \
450 "pushf" \
451 "pop [edi]" \
452 parm [edi] [eax] \
453 value [eax] \
454 modify exact [eax];
455
456u8 rcl_byte_asm(u32 * flags, u8 d, u8 s);
457
458#pragma aux rcl_byte_asm = \
459 "push [edi]" \
460 "popf" \
461 "rcl al,cl" \
462 "pushf" \
463 "pop [edi]" \
464 parm [edi] [al] [cl] \
465 value [al] \
466 modify exact [al cl];
467
468u16 rcl_word_asm(u32 * flags, u16 d, u8 s);
469
470#pragma aux rcl_word_asm = \
471 "push [edi]" \
472 "popf" \
473 "rcl ax,cl" \
474 "pushf" \
475 "pop [edi]" \
476 parm [edi] [ax] [cl] \
477 value [ax] \
478 modify exact [ax cl];
479
480u32 rcl_long_asm(u32 * flags, u32 d, u8 s);
481
482#pragma aux rcl_long_asm = \
483 "push [edi]" \
484 "popf" \
485 "rcl eax,cl" \
486 "pushf" \
487 "pop [edi]" \
488 parm [edi] [eax] [cl] \
489 value [eax] \
490 modify exact [eax cl];
491
492u8 rcr_byte_asm(u32 * flags, u8 d, u8 s);
493
494#pragma aux rcr_byte_asm = \
495 "push [edi]" \
496 "popf" \
497 "rcr al,cl" \
498 "pushf" \
499 "pop [edi]" \
500 parm [edi] [al] [cl] \
501 value [al] \
502 modify exact [al cl];
503
504u16 rcr_word_asm(u32 * flags, u16 d, u8 s);
505
506#pragma aux rcr_word_asm = \
507 "push [edi]" \
508 "popf" \
509 "rcr ax,cl" \
510 "pushf" \
511 "pop [edi]" \
512 parm [edi] [ax] [cl] \
513 value [ax] \
514 modify exact [ax cl];
515
516u32 rcr_long_asm(u32 * flags, u32 d, u8 s);
517
518#pragma aux rcr_long_asm = \
519 "push [edi]" \
520 "popf" \
521 "rcr eax,cl" \
522 "pushf" \
523 "pop [edi]" \
524 parm [edi] [eax] [cl] \
525 value [eax] \
526 modify exact [eax cl];
527
528u8 rol_byte_asm(u32 * flags, u8 d, u8 s);
529
530#pragma aux rol_byte_asm = \
531 "push [edi]" \
532 "popf" \
533 "rol al,cl" \
534 "pushf" \
535 "pop [edi]" \
536 parm [edi] [al] [cl] \
537 value [al] \
538 modify exact [al cl];
539
540u16 rol_word_asm(u32 * flags, u16 d, u8 s);
541
542#pragma aux rol_word_asm = \
543 "push [edi]" \
544 "popf" \
545 "rol ax,cl" \
546 "pushf" \
547 "pop [edi]" \
548 parm [edi] [ax] [cl] \
549 value [ax] \
550 modify exact [ax cl];
551
552u32 rol_long_asm(u32 * flags, u32 d, u8 s);
553
554#pragma aux rol_long_asm = \
555 "push [edi]" \
556 "popf" \
557 "rol eax,cl" \
558 "pushf" \
559 "pop [edi]" \
560 parm [edi] [eax] [cl] \
561 value [eax] \
562 modify exact [eax cl];
563
564u8 ror_byte_asm(u32 * flags, u8 d, u8 s);
565
566#pragma aux ror_byte_asm = \
567 "push [edi]" \
568 "popf" \
569 "ror al,cl" \
570 "pushf" \
571 "pop [edi]" \
572 parm [edi] [al] [cl] \
573 value [al] \
574 modify exact [al cl];
575
576u16 ror_word_asm(u32 * flags, u16 d, u8 s);
577
578#pragma aux ror_word_asm = \
579 "push [edi]" \
580 "popf" \
581 "ror ax,cl" \
582 "pushf" \
583 "pop [edi]" \
584 parm [edi] [ax] [cl] \
585 value [ax] \
586 modify exact [ax cl];
587
588u32 ror_long_asm(u32 * flags, u32 d, u8 s);
589
590#pragma aux ror_long_asm = \
591 "push [edi]" \
592 "popf" \
593 "ror eax,cl" \
594 "pushf" \
595 "pop [edi]" \
596 parm [edi] [eax] [cl] \
597 value [eax] \
598 modify exact [eax cl];
599
600u8 shl_byte_asm(u32 * flags, u8 d, u8 s);
601
602#pragma aux shl_byte_asm = \
603 "push [edi]" \
604 "popf" \
605 "shl al,cl" \
606 "pushf" \
607 "pop [edi]" \
608 parm [edi] [al] [cl] \
609 value [al] \
610 modify exact [al cl];
611
612u16 shl_word_asm(u32 * flags, u16 d, u8 s);
613
614#pragma aux shl_word_asm = \
615 "push [edi]" \
616 "popf" \
617 "shl ax,cl" \
618 "pushf" \
619 "pop [edi]" \
620 parm [edi] [ax] [cl] \
621 value [ax] \
622 modify exact [ax cl];
623
624u32 shl_long_asm(u32 * flags, u32 d, u8 s);
625
626#pragma aux shl_long_asm = \
627 "push [edi]" \
628 "popf" \
629 "shl eax,cl" \
630 "pushf" \
631 "pop [edi]" \
632 parm [edi] [eax] [cl] \
633 value [eax] \
634 modify exact [eax cl];
635
636u8 shr_byte_asm(u32 * flags, u8 d, u8 s);
637
638#pragma aux shr_byte_asm = \
639 "push [edi]" \
640 "popf" \
641 "shr al,cl" \
642 "pushf" \
643 "pop [edi]" \
644 parm [edi] [al] [cl] \
645 value [al] \
646 modify exact [al cl];
647
648u16 shr_word_asm(u32 * flags, u16 d, u8 s);
649
650#pragma aux shr_word_asm = \
651 "push [edi]" \
652 "popf" \
653 "shr ax,cl" \
654 "pushf" \
655 "pop [edi]" \
656 parm [edi] [ax] [cl] \
657 value [ax] \
658 modify exact [ax cl];
659
660u32 shr_long_asm(u32 * flags, u32 d, u8 s);
661
662#pragma aux shr_long_asm = \
663 "push [edi]" \
664 "popf" \
665 "shr eax,cl" \
666 "pushf" \
667 "pop [edi]" \
668 parm [edi] [eax] [cl] \
669 value [eax] \
670 modify exact [eax cl];
671
672u8 sar_byte_asm(u32 * flags, u8 d, u8 s);
673
674#pragma aux sar_byte_asm = \
675 "push [edi]" \
676 "popf" \
677 "sar al,cl" \
678 "pushf" \
679 "pop [edi]" \
680 parm [edi] [al] [cl] \
681 value [al] \
682 modify exact [al cl];
683
684u16 sar_word_asm(u32 * flags, u16 d, u8 s);
685
686#pragma aux sar_word_asm = \
687 "push [edi]" \
688 "popf" \
689 "sar ax,cl" \
690 "pushf" \
691 "pop [edi]" \
692 parm [edi] [ax] [cl] \
693 value [ax] \
694 modify exact [ax cl];
695
696u32 sar_long_asm(u32 * flags, u32 d, u8 s);
697
698#pragma aux sar_long_asm = \
699 "push [edi]" \
700 "popf" \
701 "sar eax,cl" \
702 "pushf" \
703 "pop [edi]" \
704 parm [edi] [eax] [cl] \
705 value [eax] \
706 modify exact [eax cl];
707
708u16 shld_word_asm(u32 * flags, u16 d, u16 fill, u8 s);
709
710#pragma aux shld_word_asm = \
711 "push [edi]" \
712 "popf" \
713 "shld ax,dx,cl" \
714 "pushf" \
715 "pop [edi]" \
716 parm [edi] [ax] [dx] [cl] \
717 value [ax] \
718 modify exact [ax dx cl];
719
720u32 shld_long_asm(u32 * flags, u32 d, u32 fill, u8 s);
721
722#pragma aux shld_long_asm = \
723 "push [edi]" \
724 "popf" \
725 "shld eax,edx,cl" \
726 "pushf" \
727 "pop [edi]" \
728 parm [edi] [eax] [edx] [cl] \
729 value [eax] \
730 modify exact [eax edx cl];
731
732u16 shrd_word_asm(u32 * flags, u16 d, u16 fill, u8 s);
733
734#pragma aux shrd_word_asm = \
735 "push [edi]" \
736 "popf" \
737 "shrd ax,dx,cl" \
738 "pushf" \
739 "pop [edi]" \
740 parm [edi] [ax] [dx] [cl] \
741 value [ax] \
742 modify exact [ax dx cl];
743
744u32 shrd_long_asm(u32 * flags, u32 d, u32 fill, u8 s);
745
746#pragma aux shrd_long_asm = \
747 "push [edi]" \
748 "popf" \
749 "shrd eax,edx,cl" \
750 "pushf" \
751 "pop [edi]" \
752 parm [edi] [eax] [edx] [cl] \
753 value [eax] \
754 modify exact [eax edx cl];
755
756u8 sbb_byte_asm(u32 * flags, u8 d, u8 s);
757
758#pragma aux sbb_byte_asm = \
759 "push [edi]" \
760 "popf" \
761 "sbb al,bl" \
762 "pushf" \
763 "pop [edi]" \
764 parm [edi] [al] [bl] \
765 value [al] \
766 modify exact [al bl];
767
768u16 sbb_word_asm(u32 * flags, u16 d, u16 s);
769
770#pragma aux sbb_word_asm = \
771 "push [edi]" \
772 "popf" \
773 "sbb ax,bx" \
774 "pushf" \
775 "pop [edi]" \
776 parm [edi] [ax] [bx] \
777 value [ax] \
778 modify exact [ax bx];
779
780u32 sbb_long_asm(u32 * flags, u32 d, u32 s);
781
782#pragma aux sbb_long_asm = \
783 "push [edi]" \
784 "popf" \
785 "sbb eax,ebx" \
786 "pushf" \
787 "pop [edi]" \
788 parm [edi] [eax] [ebx] \
789 value [eax] \
790 modify exact [eax ebx];
791
792u8 sub_byte_asm(u32 * flags, u8 d, u8 s);
793
794#pragma aux sub_byte_asm = \
795 "push [edi]" \
796 "popf" \
797 "sub al,bl" \
798 "pushf" \
799 "pop [edi]" \
800 parm [edi] [al] [bl] \
801 value [al] \
802 modify exact [al bl];
803
804u16 sub_word_asm(u32 * flags, u16 d, u16 s);
805
806#pragma aux sub_word_asm = \
807 "push [edi]" \
808 "popf" \
809 "sub ax,bx" \
810 "pushf" \
811 "pop [edi]" \
812 parm [edi] [ax] [bx] \
813 value [ax] \
814 modify exact [ax bx];
815
816u32 sub_long_asm(u32 * flags, u32 d, u32 s);
817
818#pragma aux sub_long_asm = \
819 "push [edi]" \
820 "popf" \
821 "sub eax,ebx" \
822 "pushf" \
823 "pop [edi]" \
824 parm [edi] [eax] [ebx] \
825 value [eax] \
826 modify exact [eax ebx];
827
828void test_byte_asm(u32 * flags, u8 d, u8 s);
829
830#pragma aux test_byte_asm = \
831 "push [edi]" \
832 "popf" \
833 "test al,bl" \
834 "pushf" \
835 "pop [edi]" \
836 parm [edi] [al] [bl] \
837 modify exact [al bl];
838
839void test_word_asm(u32 * flags, u16 d, u16 s);
840
841#pragma aux test_word_asm = \
842 "push [edi]" \
843 "popf" \
844 "test ax,bx" \
845 "pushf" \
846 "pop [edi]" \
847 parm [edi] [ax] [bx] \
848 modify exact [ax bx];
849
850void test_long_asm(u32 * flags, u32 d, u32 s);
851
852#pragma aux test_long_asm = \
853 "push [edi]" \
854 "popf" \
855 "test eax,ebx" \
856 "pushf" \
857 "pop [edi]" \
858 parm [edi] [eax] [ebx] \
859 modify exact [eax ebx];
860
861u8 xor_byte_asm(u32 * flags, u8 d, u8 s);
862
863#pragma aux xor_byte_asm = \
864 "push [edi]" \
865 "popf" \
866 "xor al,bl" \
867 "pushf" \
868 "pop [edi]" \
869 parm [edi] [al] [bl] \
870 value [al] \
871 modify exact [al bl];
872
873u16 xor_word_asm(u32 * flags, u16 d, u16 s);
874
875#pragma aux xor_word_asm = \
876 "push [edi]" \
877 "popf" \
878 "xor ax,bx" \
879 "pushf" \
880 "pop [edi]" \
881 parm [edi] [ax] [bx] \
882 value [ax] \
883 modify exact [ax bx];
884
885u32 xor_long_asm(u32 * flags, u32 d, u32 s);
886
887#pragma aux xor_long_asm = \
888 "push [edi]" \
889 "popf" \
890 "xor eax,ebx" \
891 "pushf" \
892 "pop [edi]" \
893 parm [edi] [eax] [ebx] \
894 value [eax] \
895 modify exact [eax ebx];
896
897void imul_byte_asm(u32 * flags, u16 * ax, u8 d, u8 s);
898
899#pragma aux imul_byte_asm = \
900 "push [edi]" \
901 "popf" \
902 "imul bl" \
903 "pushf" \
904 "pop [edi]" \
905 "mov [esi],ax" \
906 parm [edi] [esi] [al] [bl] \
907 modify exact [esi ax bl];
908
909void imul_word_asm(u32 * flags, u16 * ax, u16 * dx, u16 d, u16 s);
910
911#pragma aux imul_word_asm = \
912 "push [edi]" \
913 "popf" \
914 "imul bx" \
915 "pushf" \
916 "pop [edi]" \
917 "mov [esi],ax" \
918 "mov [ecx],dx" \
919 parm [edi] [esi] [ecx] [ax] [bx]\
920 modify exact [esi edi ax bx dx];
921
922void imul_long_asm(u32 * flags, u32 * eax, u32 * edx, u32 d, u32 s);
923
924#pragma aux imul_long_asm = \
925 "push [edi]" \
926 "popf" \
927 "imul ebx" \
928 "pushf" \
929 "pop [edi]" \
930 "mov [esi],eax" \
931 "mov [ecx],edx" \
932 parm [edi] [esi] [ecx] [eax] [ebx] \
933 modify exact [esi edi eax ebx edx];
934
935void mul_byte_asm(u32 * flags, u16 * ax, u8 d, u8 s);
936
937#pragma aux mul_byte_asm = \
938 "push [edi]" \
939 "popf" \
940 "mul bl" \
941 "pushf" \
942 "pop [edi]" \
943 "mov [esi],ax" \
944 parm [edi] [esi] [al] [bl] \
945 modify exact [esi ax bl];
946
947void mul_word_asm(u32 * flags, u16 * ax, u16 * dx, u16 d, u16 s);
948
949#pragma aux mul_word_asm = \
950 "push [edi]" \
951 "popf" \
952 "mul bx" \
953 "pushf" \
954 "pop [edi]" \
955 "mov [esi],ax" \
956 "mov [ecx],dx" \
957 parm [edi] [esi] [ecx] [ax] [bx]\
958 modify exact [esi edi ax bx dx];
959
960void mul_long_asm(u32 * flags, u32 * eax, u32 * edx, u32 d, u32 s);
961
962#pragma aux mul_long_asm = \
963 "push [edi]" \
964 "popf" \
965 "mul ebx" \
966 "pushf" \
967 "pop [edi]" \
968 "mov [esi],eax" \
969 "mov [ecx],edx" \
970 parm [edi] [esi] [ecx] [eax] [ebx] \
971 modify exact [esi edi eax ebx edx];
972
973void idiv_byte_asm(u32 * flags, u8 * al, u8 * ah, u16 d, u8 s);
974
975#pragma aux idiv_byte_asm = \
976 "push [edi]" \
977 "popf" \
978 "idiv bl" \
979 "pushf" \
980 "pop [edi]" \
981 "mov [esi],al" \
982 "mov [ecx],ah" \
983 parm [edi] [esi] [ecx] [ax] [bl]\
984 modify exact [esi edi ax bl];
985
986void idiv_word_asm(u32 * flags, u16 * ax, u16 * dx, u16 dlo, u16 dhi, u16 s);
987
988#pragma aux idiv_word_asm = \
989 "push [edi]" \
990 "popf" \
991 "idiv bx" \
992 "pushf" \
993 "pop [edi]" \
994 "mov [esi],ax" \
995 "mov [ecx],dx" \
996 parm [edi] [esi] [ecx] [ax] [dx] [bx]\
997 modify exact [esi edi ax dx bx];
998
999void idiv_long_asm(u32 * flags, u32 * eax, u32 * edx, u32 dlo, u32 dhi, u32 s);
1000
1001#pragma aux idiv_long_asm = \
1002 "push [edi]" \
1003 "popf" \
1004 "idiv ebx" \
1005 "pushf" \
1006 "pop [edi]" \
1007 "mov [esi],eax" \
1008 "mov [ecx],edx" \
1009 parm [edi] [esi] [ecx] [eax] [edx] [ebx]\
1010 modify exact [esi edi eax edx ebx];
1011
1012void div_byte_asm(u32 * flags, u8 * al, u8 * ah, u16 d, u8 s);
1013
1014#pragma aux div_byte_asm = \
1015 "push [edi]" \
1016 "popf" \
1017 "div bl" \
1018 "pushf" \
1019 "pop [edi]" \
1020 "mov [esi],al" \
1021 "mov [ecx],ah" \
1022 parm [edi] [esi] [ecx] [ax] [bl]\
1023 modify exact [esi edi ax bl];
1024
1025void div_word_asm(u32 * flags, u16 * ax, u16 * dx, u16 dlo, u16 dhi, u16 s);
1026
1027#pragma aux div_word_asm = \
1028 "push [edi]" \
1029 "popf" \
1030 "div bx" \
1031 "pushf" \
1032 "pop [edi]" \
1033 "mov [esi],ax" \
1034 "mov [ecx],dx" \
1035 parm [edi] [esi] [ecx] [ax] [dx] [bx]\
1036 modify exact [esi edi ax dx bx];
1037
1038void div_long_asm(u32 * flags, u32 * eax, u32 * edx, u32 dlo, u32 dhi, u32 s);
1039
1040#pragma aux div_long_asm = \
1041 "push [edi]" \
1042 "popf" \
1043 "div ebx" \
1044 "pushf" \
1045 "pop [edi]" \
1046 "mov [esi],eax" \
1047 "mov [ecx],edx" \
1048 parm [edi] [esi] [ecx] [eax] [edx] [ebx]\
1049 modify exact [esi edi eax edx ebx];
1050
1051#endif
1052
1053#endif /* __X86EMU_PRIM_ASM_H */