xref: /haiku/headers/libs/x86emu/x86emu/prim_asm.h (revision 73ad2473e7874b3702cf5b0fdf4c81b747812ed9)
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 
54 #pragma aux get_flags_asm =			\
55 	"pushf"                         \
56 	"pop	eax"                  	\
57 	value [eax]                     \
58 	modify exact [eax];
59 
60 u16 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 
72 u16 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 
84 u16 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 
96 u16 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 
108 u8 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 
120 u16 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 
132 u32 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 
144 u8 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 
156 u16 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 
168 u32 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 
180 u8 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 
192 u16 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 
204 u32 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 
216 u8 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 
228 u16 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 
240 u32 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 
252 u8 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 
264 u8 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 
276 u8 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 
288 u16 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 
300 u32 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 
312 u8 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 
324 u16 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 
336 u32 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 
348 u8 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 
360 u16 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 
372 u32 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 
384 u8 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 
396 u16 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 
408 u32 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 
420 u8 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 
432 u16 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 
444 u32 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 
456 u8 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 
468 u16 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 
480 u32 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 
492 u8 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 
504 u16 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 
516 u32 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 
528 u8 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 
540 u16 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 
552 u32 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 
564 u8 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 
576 u16 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 
588 u32 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 
600 u8 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 
612 u16 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 
624 u32 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 
636 u8 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 
648 u16 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 
660 u32 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 
672 u8 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 
684 u16 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 
696 u32 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 
708 u16 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 
720 u32 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 
732 u16 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 
744 u32 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 
756 u8 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 
768 u16 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 
780 u32 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 
792 u8 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 
804 u16 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 
816 u32 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 
828 void 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 
839 void 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 
850 void 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 
861 u8 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 
873 u16 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 
885 u32 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 
897 void 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 
909 void 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 
922 void 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 
935 void 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 
947 void 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 
960 void 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 
973 void 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 
986 void 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 
999 void 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 
1012 void 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 
1025 void 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 
1038 void 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 */
1054