coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
prim_asm.h
Go to the documentation of this file.
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 
52 u32 get_flags_asm(void);
53 #pragma aux get_flags_asm = \
54  "pushf" \
55  "pop eax" \
56  value [eax] \
57  modify exact [eax];
58 
59 u16 aaa_word_asm(u32 *flags,u16 d);
60 #pragma aux aaa_word_asm = \
61  "push [edi]" \
62  "popf" \
63  "aaa" \
64  "pushf" \
65  "pop [edi]" \
66  parm [edi] [ax] \
67  value [ax] \
68  modify exact [ax];
69 
70 u16 aas_word_asm(u32 *flags,u16 d);
71 #pragma aux aas_word_asm = \
72  "push [edi]" \
73  "popf" \
74  "aas" \
75  "pushf" \
76  "pop [edi]" \
77  parm [edi] [ax] \
78  value [ax] \
79  modify exact [ax];
80 
81 u16 aad_word_asm(u32 *flags,u16 d);
82 #pragma aux aad_word_asm = \
83  "push [edi]" \
84  "popf" \
85  "aad" \
86  "pushf" \
87  "pop [edi]" \
88  parm [edi] [ax] \
89  value [ax] \
90  modify exact [ax];
91 
92 u16 aam_word_asm(u32 *flags,u8 d);
93 #pragma aux aam_word_asm = \
94  "push [edi]" \
95  "popf" \
96  "aam" \
97  "pushf" \
98  "pop [edi]" \
99  parm [edi] [al] \
100  value [ax] \
101  modify exact [ax];
102 
103 u8 adc_byte_asm(u32 *flags,u8 d, u8 s);
104 #pragma aux adc_byte_asm = \
105  "push [edi]" \
106  "popf" \
107  "adc al,bl" \
108  "pushf" \
109  "pop [edi]" \
110  parm [edi] [al] [bl] \
111  value [al] \
112  modify exact [al bl];
113 
114 u16 adc_word_asm(u32 *flags,u16 d, u16 s);
115 #pragma aux adc_word_asm = \
116  "push [edi]" \
117  "popf" \
118  "adc ax,bx" \
119  "pushf" \
120  "pop [edi]" \
121  parm [edi] [ax] [bx] \
122  value [ax] \
123  modify exact [ax bx];
124 
125 u32 adc_long_asm(u32 *flags,u32 d, u32 s);
126 #pragma aux adc_long_asm = \
127  "push [edi]" \
128  "popf" \
129  "adc eax,ebx" \
130  "pushf" \
131  "pop [edi]" \
132  parm [edi] [eax] [ebx] \
133  value [eax] \
134  modify exact [eax ebx];
135 
136 u8 add_byte_asm(u32 *flags,u8 d, u8 s);
137 #pragma aux add_byte_asm = \
138  "push [edi]" \
139  "popf" \
140  "add al,bl" \
141  "pushf" \
142  "pop [edi]" \
143  parm [edi] [al] [bl] \
144  value [al] \
145  modify exact [al bl];
146 
147 u16 add_word_asm(u32 *flags,u16 d, u16 s);
148 #pragma aux add_word_asm = \
149  "push [edi]" \
150  "popf" \
151  "add ax,bx" \
152  "pushf" \
153  "pop [edi]" \
154  parm [edi] [ax] [bx] \
155  value [ax] \
156  modify exact [ax bx];
157 
158 u32 add_long_asm(u32 *flags,u32 d, u32 s);
159 #pragma aux add_long_asm = \
160  "push [edi]" \
161  "popf" \
162  "add eax,ebx" \
163  "pushf" \
164  "pop [edi]" \
165  parm [edi] [eax] [ebx] \
166  value [eax] \
167  modify exact [eax ebx];
168 
169 u8 and_byte_asm(u32 *flags,u8 d, u8 s);
170 #pragma aux and_byte_asm = \
171  "push [edi]" \
172  "popf" \
173  "and al,bl" \
174  "pushf" \
175  "pop [edi]" \
176  parm [edi] [al] [bl] \
177  value [al] \
178  modify exact [al bl];
179 
180 u16 and_word_asm(u32 *flags,u16 d, u16 s);
181 #pragma aux and_word_asm = \
182  "push [edi]" \
183  "popf" \
184  "and ax,bx" \
185  "pushf" \
186  "pop [edi]" \
187  parm [edi] [ax] [bx] \
188  value [ax] \
189  modify exact [ax bx];
190 
191 u32 and_long_asm(u32 *flags,u32 d, u32 s);
192 #pragma aux and_long_asm = \
193  "push [edi]" \
194  "popf" \
195  "and eax,ebx" \
196  "pushf" \
197  "pop [edi]" \
198  parm [edi] [eax] [ebx] \
199  value [eax] \
200  modify exact [eax ebx];
201 
202 u8 cmp_byte_asm(u32 *flags,u8 d, u8 s);
203 #pragma aux cmp_byte_asm = \
204  "push [edi]" \
205  "popf" \
206  "cmp al,bl" \
207  "pushf" \
208  "pop [edi]" \
209  parm [edi] [al] [bl] \
210  value [al] \
211  modify exact [al bl];
212 
213 u16 cmp_word_asm(u32 *flags,u16 d, u16 s);
214 #pragma aux cmp_word_asm = \
215  "push [edi]" \
216  "popf" \
217  "cmp ax,bx" \
218  "pushf" \
219  "pop [edi]" \
220  parm [edi] [ax] [bx] \
221  value [ax] \
222  modify exact [ax bx];
223 
224 u32 cmp_long_asm(u32 *flags,u32 d, u32 s);
225 #pragma aux cmp_long_asm = \
226  "push [edi]" \
227  "popf" \
228  "cmp eax,ebx" \
229  "pushf" \
230  "pop [edi]" \
231  parm [edi] [eax] [ebx] \
232  value [eax] \
233  modify exact [eax ebx];
234 
235 u8 daa_byte_asm(u32 *flags,u8 d);
236 #pragma aux daa_byte_asm = \
237  "push [edi]" \
238  "popf" \
239  "daa" \
240  "pushf" \
241  "pop [edi]" \
242  parm [edi] [al] \
243  value [al] \
244  modify exact [al];
245 
246 u8 das_byte_asm(u32 *flags,u8 d);
247 #pragma aux das_byte_asm = \
248  "push [edi]" \
249  "popf" \
250  "das" \
251  "pushf" \
252  "pop [edi]" \
253  parm [edi] [al] \
254  value [al] \
255  modify exact [al];
256 
257 u8 dec_byte_asm(u32 *flags,u8 d);
258 #pragma aux dec_byte_asm = \
259  "push [edi]" \
260  "popf" \
261  "dec al" \
262  "pushf" \
263  "pop [edi]" \
264  parm [edi] [al] \
265  value [al] \
266  modify exact [al];
267 
268 u16 dec_word_asm(u32 *flags,u16 d);
269 #pragma aux dec_word_asm = \
270  "push [edi]" \
271  "popf" \
272  "dec ax" \
273  "pushf" \
274  "pop [edi]" \
275  parm [edi] [ax] \
276  value [ax] \
277  modify exact [ax];
278 
279 u32 dec_long_asm(u32 *flags,u32 d);
280 #pragma aux dec_long_asm = \
281  "push [edi]" \
282  "popf" \
283  "dec eax" \
284  "pushf" \
285  "pop [edi]" \
286  parm [edi] [eax] \
287  value [eax] \
288  modify exact [eax];
289 
290 u8 inc_byte_asm(u32 *flags,u8 d);
291 #pragma aux inc_byte_asm = \
292  "push [edi]" \
293  "popf" \
294  "inc al" \
295  "pushf" \
296  "pop [edi]" \
297  parm [edi] [al] \
298  value [al] \
299  modify exact [al];
300 
301 u16 inc_word_asm(u32 *flags,u16 d);
302 #pragma aux inc_word_asm = \
303  "push [edi]" \
304  "popf" \
305  "inc ax" \
306  "pushf" \
307  "pop [edi]" \
308  parm [edi] [ax] \
309  value [ax] \
310  modify exact [ax];
311 
312 u32 inc_long_asm(u32 *flags,u32 d);
313 #pragma aux inc_long_asm = \
314  "push [edi]" \
315  "popf" \
316  "inc eax" \
317  "pushf" \
318  "pop [edi]" \
319  parm [edi] [eax] \
320  value [eax] \
321  modify exact [eax];
322 
323 u8 or_byte_asm(u32 *flags,u8 d, u8 s);
324 #pragma aux or_byte_asm = \
325  "push [edi]" \
326  "popf" \
327  "or al,bl" \
328  "pushf" \
329  "pop [edi]" \
330  parm [edi] [al] [bl] \
331  value [al] \
332  modify exact [al bl];
333 
334 u16 or_word_asm(u32 *flags,u16 d, u16 s);
335 #pragma aux or_word_asm = \
336  "push [edi]" \
337  "popf" \
338  "or ax,bx" \
339  "pushf" \
340  "pop [edi]" \
341  parm [edi] [ax] [bx] \
342  value [ax] \
343  modify exact [ax bx];
344 
345 u32 or_long_asm(u32 *flags,u32 d, u32 s);
346 #pragma aux or_long_asm = \
347  "push [edi]" \
348  "popf" \
349  "or eax,ebx" \
350  "pushf" \
351  "pop [edi]" \
352  parm [edi] [eax] [ebx] \
353  value [eax] \
354  modify exact [eax ebx];
355 
356 u8 neg_byte_asm(u32 *flags,u8 d);
357 #pragma aux neg_byte_asm = \
358  "push [edi]" \
359  "popf" \
360  "neg al" \
361  "pushf" \
362  "pop [edi]" \
363  parm [edi] [al] \
364  value [al] \
365  modify exact [al];
366 
367 u16 neg_word_asm(u32 *flags,u16 d);
368 #pragma aux neg_word_asm = \
369  "push [edi]" \
370  "popf" \
371  "neg ax" \
372  "pushf" \
373  "pop [edi]" \
374  parm [edi] [ax] \
375  value [ax] \
376  modify exact [ax];
377 
378 u32 neg_long_asm(u32 *flags,u32 d);
379 #pragma aux neg_long_asm = \
380  "push [edi]" \
381  "popf" \
382  "neg eax" \
383  "pushf" \
384  "pop [edi]" \
385  parm [edi] [eax] \
386  value [eax] \
387  modify exact [eax];
388 
389 u8 not_byte_asm(u32 *flags,u8 d);
390 #pragma aux not_byte_asm = \
391  "push [edi]" \
392  "popf" \
393  "not al" \
394  "pushf" \
395  "pop [edi]" \
396  parm [edi] [al] \
397  value [al] \
398  modify exact [al];
399 
400 u16 not_word_asm(u32 *flags,u16 d);
401 #pragma aux not_word_asm = \
402  "push [edi]" \
403  "popf" \
404  "not ax" \
405  "pushf" \
406  "pop [edi]" \
407  parm [edi] [ax] \
408  value [ax] \
409  modify exact [ax];
410 
411 u32 not_long_asm(u32 *flags,u32 d);
412 #pragma aux not_long_asm = \
413  "push [edi]" \
414  "popf" \
415  "not eax" \
416  "pushf" \
417  "pop [edi]" \
418  parm [edi] [eax] \
419  value [eax] \
420  modify exact [eax];
421 
422 u8 rcl_byte_asm(u32 *flags,u8 d, u8 s);
423 #pragma aux rcl_byte_asm = \
424  "push [edi]" \
425  "popf" \
426  "rcl al,cl" \
427  "pushf" \
428  "pop [edi]" \
429  parm [edi] [al] [cl] \
430  value [al] \
431  modify exact [al cl];
432 
433 u16 rcl_word_asm(u32 *flags,u16 d, u8 s);
434 #pragma aux rcl_word_asm = \
435  "push [edi]" \
436  "popf" \
437  "rcl ax,cl" \
438  "pushf" \
439  "pop [edi]" \
440  parm [edi] [ax] [cl] \
441  value [ax] \
442  modify exact [ax cl];
443 
444 u32 rcl_long_asm(u32 *flags,u32 d, u8 s);
445 #pragma aux rcl_long_asm = \
446  "push [edi]" \
447  "popf" \
448  "rcl eax,cl" \
449  "pushf" \
450  "pop [edi]" \
451  parm [edi] [eax] [cl] \
452  value [eax] \
453  modify exact [eax cl];
454 
455 u8 rcr_byte_asm(u32 *flags,u8 d, u8 s);
456 #pragma aux rcr_byte_asm = \
457  "push [edi]" \
458  "popf" \
459  "rcr al,cl" \
460  "pushf" \
461  "pop [edi]" \
462  parm [edi] [al] [cl] \
463  value [al] \
464  modify exact [al cl];
465 
466 u16 rcr_word_asm(u32 *flags,u16 d, u8 s);
467 #pragma aux rcr_word_asm = \
468  "push [edi]" \
469  "popf" \
470  "rcr ax,cl" \
471  "pushf" \
472  "pop [edi]" \
473  parm [edi] [ax] [cl] \
474  value [ax] \
475  modify exact [ax cl];
476 
477 u32 rcr_long_asm(u32 *flags,u32 d, u8 s);
478 #pragma aux rcr_long_asm = \
479  "push [edi]" \
480  "popf" \
481  "rcr eax,cl" \
482  "pushf" \
483  "pop [edi]" \
484  parm [edi] [eax] [cl] \
485  value [eax] \
486  modify exact [eax cl];
487 
488 u8 rol_byte_asm(u32 *flags,u8 d, u8 s);
489 #pragma aux rol_byte_asm = \
490  "push [edi]" \
491  "popf" \
492  "rol al,cl" \
493  "pushf" \
494  "pop [edi]" \
495  parm [edi] [al] [cl] \
496  value [al] \
497  modify exact [al cl];
498 
499 u16 rol_word_asm(u32 *flags,u16 d, u8 s);
500 #pragma aux rol_word_asm = \
501  "push [edi]" \
502  "popf" \
503  "rol ax,cl" \
504  "pushf" \
505  "pop [edi]" \
506  parm [edi] [ax] [cl] \
507  value [ax] \
508  modify exact [ax cl];
509 
510 u32 rol_long_asm(u32 *flags,u32 d, u8 s);
511 #pragma aux rol_long_asm = \
512  "push [edi]" \
513  "popf" \
514  "rol eax,cl" \
515  "pushf" \
516  "pop [edi]" \
517  parm [edi] [eax] [cl] \
518  value [eax] \
519  modify exact [eax cl];
520 
521 u8 ror_byte_asm(u32 *flags,u8 d, u8 s);
522 #pragma aux ror_byte_asm = \
523  "push [edi]" \
524  "popf" \
525  "ror al,cl" \
526  "pushf" \
527  "pop [edi]" \
528  parm [edi] [al] [cl] \
529  value [al] \
530  modify exact [al cl];
531 
532 u16 ror_word_asm(u32 *flags,u16 d, u8 s);
533 #pragma aux ror_word_asm = \
534  "push [edi]" \
535  "popf" \
536  "ror ax,cl" \
537  "pushf" \
538  "pop [edi]" \
539  parm [edi] [ax] [cl] \
540  value [ax] \
541  modify exact [ax cl];
542 
543 u32 ror_long_asm(u32 *flags,u32 d, u8 s);
544 #pragma aux ror_long_asm = \
545  "push [edi]" \
546  "popf" \
547  "ror eax,cl" \
548  "pushf" \
549  "pop [edi]" \
550  parm [edi] [eax] [cl] \
551  value [eax] \
552  modify exact [eax cl];
553 
554 u8 shl_byte_asm(u32 *flags,u8 d, u8 s);
555 #pragma aux shl_byte_asm = \
556  "push [edi]" \
557  "popf" \
558  "shl al,cl" \
559  "pushf" \
560  "pop [edi]" \
561  parm [edi] [al] [cl] \
562  value [al] \
563  modify exact [al cl];
564 
565 u16 shl_word_asm(u32 *flags,u16 d, u8 s);
566 #pragma aux shl_word_asm = \
567  "push [edi]" \
568  "popf" \
569  "shl ax,cl" \
570  "pushf" \
571  "pop [edi]" \
572  parm [edi] [ax] [cl] \
573  value [ax] \
574  modify exact [ax cl];
575 
576 u32 shl_long_asm(u32 *flags,u32 d, u8 s);
577 #pragma aux shl_long_asm = \
578  "push [edi]" \
579  "popf" \
580  "shl eax,cl" \
581  "pushf" \
582  "pop [edi]" \
583  parm [edi] [eax] [cl] \
584  value [eax] \
585  modify exact [eax cl];
586 
587 u8 shr_byte_asm(u32 *flags,u8 d, u8 s);
588 #pragma aux shr_byte_asm = \
589  "push [edi]" \
590  "popf" \
591  "shr al,cl" \
592  "pushf" \
593  "pop [edi]" \
594  parm [edi] [al] [cl] \
595  value [al] \
596  modify exact [al cl];
597 
598 u16 shr_word_asm(u32 *flags,u16 d, u8 s);
599 #pragma aux shr_word_asm = \
600  "push [edi]" \
601  "popf" \
602  "shr ax,cl" \
603  "pushf" \
604  "pop [edi]" \
605  parm [edi] [ax] [cl] \
606  value [ax] \
607  modify exact [ax cl];
608 
609 u32 shr_long_asm(u32 *flags,u32 d, u8 s);
610 #pragma aux shr_long_asm = \
611  "push [edi]" \
612  "popf" \
613  "shr eax,cl" \
614  "pushf" \
615  "pop [edi]" \
616  parm [edi] [eax] [cl] \
617  value [eax] \
618  modify exact [eax cl];
619 
620 u8 sar_byte_asm(u32 *flags,u8 d, u8 s);
621 #pragma aux sar_byte_asm = \
622  "push [edi]" \
623  "popf" \
624  "sar al,cl" \
625  "pushf" \
626  "pop [edi]" \
627  parm [edi] [al] [cl] \
628  value [al] \
629  modify exact [al cl];
630 
631 u16 sar_word_asm(u32 *flags,u16 d, u8 s);
632 #pragma aux sar_word_asm = \
633  "push [edi]" \
634  "popf" \
635  "sar ax,cl" \
636  "pushf" \
637  "pop [edi]" \
638  parm [edi] [ax] [cl] \
639  value [ax] \
640  modify exact [ax cl];
641 
642 u32 sar_long_asm(u32 *flags,u32 d, u8 s);
643 #pragma aux sar_long_asm = \
644  "push [edi]" \
645  "popf" \
646  "sar eax,cl" \
647  "pushf" \
648  "pop [edi]" \
649  parm [edi] [eax] [cl] \
650  value [eax] \
651  modify exact [eax cl];
652 
653 u16 shld_word_asm(u32 *flags,u16 d, u16 fill, u8 s);
654 #pragma aux shld_word_asm = \
655  "push [edi]" \
656  "popf" \
657  "shld ax,dx,cl" \
658  "pushf" \
659  "pop [edi]" \
660  parm [edi] [ax] [dx] [cl] \
661  value [ax] \
662  modify exact [ax dx cl];
663 
664 u32 shld_long_asm(u32 *flags,u32 d, u32 fill, u8 s);
665 #pragma aux shld_long_asm = \
666  "push [edi]" \
667  "popf" \
668  "shld eax,edx,cl" \
669  "pushf" \
670  "pop [edi]" \
671  parm [edi] [eax] [edx] [cl] \
672  value [eax] \
673  modify exact [eax edx cl];
674 
675 u16 shrd_word_asm(u32 *flags,u16 d, u16 fill, u8 s);
676 #pragma aux shrd_word_asm = \
677  "push [edi]" \
678  "popf" \
679  "shrd ax,dx,cl" \
680  "pushf" \
681  "pop [edi]" \
682  parm [edi] [ax] [dx] [cl] \
683  value [ax] \
684  modify exact [ax dx cl];
685 
686 u32 shrd_long_asm(u32 *flags,u32 d, u32 fill, u8 s);
687 #pragma aux shrd_long_asm = \
688  "push [edi]" \
689  "popf" \
690  "shrd eax,edx,cl" \
691  "pushf" \
692  "pop [edi]" \
693  parm [edi] [eax] [edx] [cl] \
694  value [eax] \
695  modify exact [eax edx cl];
696 
697 u8 sbb_byte_asm(u32 *flags,u8 d, u8 s);
698 #pragma aux sbb_byte_asm = \
699  "push [edi]" \
700  "popf" \
701  "sbb al,bl" \
702  "pushf" \
703  "pop [edi]" \
704  parm [edi] [al] [bl] \
705  value [al] \
706  modify exact [al bl];
707 
708 u16 sbb_word_asm(u32 *flags,u16 d, u16 s);
709 #pragma aux sbb_word_asm = \
710  "push [edi]" \
711  "popf" \
712  "sbb ax,bx" \
713  "pushf" \
714  "pop [edi]" \
715  parm [edi] [ax] [bx] \
716  value [ax] \
717  modify exact [ax bx];
718 
719 u32 sbb_long_asm(u32 *flags,u32 d, u32 s);
720 #pragma aux sbb_long_asm = \
721  "push [edi]" \
722  "popf" \
723  "sbb eax,ebx" \
724  "pushf" \
725  "pop [edi]" \
726  parm [edi] [eax] [ebx] \
727  value [eax] \
728  modify exact [eax ebx];
729 
730 u8 sub_byte_asm(u32 *flags,u8 d, u8 s);
731 #pragma aux sub_byte_asm = \
732  "push [edi]" \
733  "popf" \
734  "sub al,bl" \
735  "pushf" \
736  "pop [edi]" \
737  parm [edi] [al] [bl] \
738  value [al] \
739  modify exact [al bl];
740 
741 u16 sub_word_asm(u32 *flags,u16 d, u16 s);
742 #pragma aux sub_word_asm = \
743  "push [edi]" \
744  "popf" \
745  "sub ax,bx" \
746  "pushf" \
747  "pop [edi]" \
748  parm [edi] [ax] [bx] \
749  value [ax] \
750  modify exact [ax bx];
751 
752 u32 sub_long_asm(u32 *flags,u32 d, u32 s);
753 #pragma aux sub_long_asm = \
754  "push [edi]" \
755  "popf" \
756  "sub eax,ebx" \
757  "pushf" \
758  "pop [edi]" \
759  parm [edi] [eax] [ebx] \
760  value [eax] \
761  modify exact [eax ebx];
762 
763 void test_byte_asm(u32 *flags,u8 d, u8 s);
764 #pragma aux test_byte_asm = \
765  "push [edi]" \
766  "popf" \
767  "test al,bl" \
768  "pushf" \
769  "pop [edi]" \
770  parm [edi] [al] [bl] \
771  modify exact [al bl];
772 
773 void test_word_asm(u32 *flags,u16 d, u16 s);
774 #pragma aux test_word_asm = \
775  "push [edi]" \
776  "popf" \
777  "test ax,bx" \
778  "pushf" \
779  "pop [edi]" \
780  parm [edi] [ax] [bx] \
781  modify exact [ax bx];
782 
783 void test_long_asm(u32 *flags,u32 d, u32 s);
784 #pragma aux test_long_asm = \
785  "push [edi]" \
786  "popf" \
787  "test eax,ebx" \
788  "pushf" \
789  "pop [edi]" \
790  parm [edi] [eax] [ebx] \
791  modify exact [eax ebx];
792 
793 u8 xor_byte_asm(u32 *flags,u8 d, u8 s);
794 #pragma aux xor_byte_asm = \
795  "push [edi]" \
796  "popf" \
797  "xor al,bl" \
798  "pushf" \
799  "pop [edi]" \
800  parm [edi] [al] [bl] \
801  value [al] \
802  modify exact [al bl];
803 
804 u16 xor_word_asm(u32 *flags,u16 d, u16 s);
805 #pragma aux xor_word_asm = \
806  "push [edi]" \
807  "popf" \
808  "xor ax,bx" \
809  "pushf" \
810  "pop [edi]" \
811  parm [edi] [ax] [bx] \
812  value [ax] \
813  modify exact [ax bx];
814 
815 u32 xor_long_asm(u32 *flags,u32 d, u32 s);
816 #pragma aux xor_long_asm = \
817  "push [edi]" \
818  "popf" \
819  "xor eax,ebx" \
820  "pushf" \
821  "pop [edi]" \
822  parm [edi] [eax] [ebx] \
823  value [eax] \
824  modify exact [eax ebx];
825 
826 void imul_byte_asm(u32 *flags,u16 *ax,u8 d,u8 s);
827 #pragma aux imul_byte_asm = \
828  "push [edi]" \
829  "popf" \
830  "imul bl" \
831  "pushf" \
832  "pop [edi]" \
833  "mov [esi],ax" \
834  parm [edi] [esi] [al] [bl] \
835  modify exact [esi ax bl];
836 
837 void imul_word_asm(u32 *flags,u16 *ax,u16 *dx,u16 d,u16 s);
838 #pragma aux imul_word_asm = \
839  "push [edi]" \
840  "popf" \
841  "imul bx" \
842  "pushf" \
843  "pop [edi]" \
844  "mov [esi],ax" \
845  "mov [ecx],dx" \
846  parm [edi] [esi] [ecx] [ax] [bx]\
847  modify exact [esi edi ax bx dx];
848 
849 void imul_long_asm(u32 *flags,u32 *eax,u32 *edx,u32 d,u32 s);
850 #pragma aux imul_long_asm = \
851  "push [edi]" \
852  "popf" \
853  "imul ebx" \
854  "pushf" \
855  "pop [edi]" \
856  "mov [esi],eax" \
857  "mov [ecx],edx" \
858  parm [edi] [esi] [ecx] [eax] [ebx] \
859  modify exact [esi edi eax ebx edx];
860 
861 void mul_byte_asm(u32 *flags,u16 *ax,u8 d,u8 s);
862 #pragma aux mul_byte_asm = \
863  "push [edi]" \
864  "popf" \
865  "mul bl" \
866  "pushf" \
867  "pop [edi]" \
868  "mov [esi],ax" \
869  parm [edi] [esi] [al] [bl] \
870  modify exact [esi ax bl];
871 
872 void mul_word_asm(u32 *flags,u16 *ax,u16 *dx,u16 d,u16 s);
873 #pragma aux mul_word_asm = \
874  "push [edi]" \
875  "popf" \
876  "mul bx" \
877  "pushf" \
878  "pop [edi]" \
879  "mov [esi],ax" \
880  "mov [ecx],dx" \
881  parm [edi] [esi] [ecx] [ax] [bx]\
882  modify exact [esi edi ax bx dx];
883 
884 void mul_long_asm(u32 *flags,u32 *eax,u32 *edx,u32 d,u32 s);
885 #pragma aux mul_long_asm = \
886  "push [edi]" \
887  "popf" \
888  "mul ebx" \
889  "pushf" \
890  "pop [edi]" \
891  "mov [esi],eax" \
892  "mov [ecx],edx" \
893  parm [edi] [esi] [ecx] [eax] [ebx] \
894  modify exact [esi edi eax ebx edx];
895 
896 void idiv_byte_asm(u32 *flags,u8 *al,u8 *ah,u16 d,u8 s);
897 #pragma aux idiv_byte_asm = \
898  "push [edi]" \
899  "popf" \
900  "idiv bl" \
901  "pushf" \
902  "pop [edi]" \
903  "mov [esi],al" \
904  "mov [ecx],ah" \
905  parm [edi] [esi] [ecx] [ax] [bl]\
906  modify exact [esi edi ax bl];
907 
908 void idiv_word_asm(u32 *flags,u16 *ax,u16 *dx,u16 dlo,u16 dhi,u16 s);
909 #pragma aux idiv_word_asm = \
910  "push [edi]" \
911  "popf" \
912  "idiv bx" \
913  "pushf" \
914  "pop [edi]" \
915  "mov [esi],ax" \
916  "mov [ecx],dx" \
917  parm [edi] [esi] [ecx] [ax] [dx] [bx]\
918  modify exact [esi edi ax dx bx];
919 
920 void idiv_long_asm(u32 *flags,u32 *eax,u32 *edx,u32 dlo,u32 dhi,u32 s);
921 #pragma aux idiv_long_asm = \
922  "push [edi]" \
923  "popf" \
924  "idiv ebx" \
925  "pushf" \
926  "pop [edi]" \
927  "mov [esi],eax" \
928  "mov [ecx],edx" \
929  parm [edi] [esi] [ecx] [eax] [edx] [ebx]\
930  modify exact [esi edi eax edx ebx];
931 
932 void div_byte_asm(u32 *flags,u8 *al,u8 *ah,u16 d,u8 s);
933 #pragma aux div_byte_asm = \
934  "push [edi]" \
935  "popf" \
936  "div bl" \
937  "pushf" \
938  "pop [edi]" \
939  "mov [esi],al" \
940  "mov [ecx],ah" \
941  parm [edi] [esi] [ecx] [ax] [bl]\
942  modify exact [esi edi ax bl];
943 
944 void div_word_asm(u32 *flags,u16 *ax,u16 *dx,u16 dlo,u16 dhi,u16 s);
945 #pragma aux div_word_asm = \
946  "push [edi]" \
947  "popf" \
948  "div bx" \
949  "pushf" \
950  "pop [edi]" \
951  "mov [esi],ax" \
952  "mov [ecx],dx" \
953  parm [edi] [esi] [ecx] [ax] [dx] [bx]\
954  modify exact [esi edi ax dx bx];
955 
956 void div_long_asm(u32 *flags,u32 *eax,u32 *edx,u32 dlo,u32 dhi,u32 s);
957 #pragma aux div_long_asm = \
958  "push [edi]" \
959  "popf" \
960  "div ebx" \
961  "pushf" \
962  "pop [edi]" \
963  "mov [esi],eax" \
964  "mov [ecx],edx" \
965  parm [edi] [esi] [ecx] [eax] [edx] [ebx]\
966  modify exact [esi edi eax edx ebx];
967 
968 #endif
969 
970 #endif /* __X86EMU_PRIM_ASM_H */
uint32_t u32
Definition: stdint.h:51
uint16_t u16
Definition: stdint.h:48
uint8_t u8
Definition: stdint.h:45
#define s(param, src_bits, pmcreg, dst_bits)