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 */
1054