1 /****************************************************************************
3 * Realmode X86 Emulator Library
5 * Copyright (C) 1996-1999 SciTech Software, Inc.
6 * Copyright (C) David Mosberger-Tang
7 * Copyright (C) 1999 Egbert Eich
9 * ========================================================================
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.
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.
29 * ========================================================================
33 * Developer: Kendall Bennett
35 * Description: This file contains the code to implement the decoding and
36 * emulation of the FPU instructions.
38 ****************************************************************************/
40 #include "x86emu/x86emui.h"
42 /*----------------------------- Implementation ----------------------------*/
45 void x86emuOp_esc_coprocess_d8(u8
X86EMU_UNUSED(op1
))
48 DECODE_PRINTF("ESC D8\n");
49 DECODE_CLEAR_SEGOVR();
50 END_OF_INSTR_NO_TRACE();
55 static char *x86emu_fpu_op_d9_tab
[] = {
56 "FLD\tDWORD PTR ", "ESC_D9\t", "FST\tDWORD PTR ", "FSTP\tDWORD PTR ",
57 "FLDENV\t", "FLDCW\t", "FSTENV\t", "FSTCW\t",
59 "FLD\tDWORD PTR ", "ESC_D9\t", "FST\tDWORD PTR ", "FSTP\tDWORD PTR ",
60 "FLDENV\t", "FLDCW\t", "FSTENV\t", "FSTCW\t",
62 "FLD\tDWORD PTR ", "ESC_D9\t", "FST\tDWORD PTR ", "FSTP\tDWORD PTR ",
63 "FLDENV\t", "FLDCW\t", "FSTENV\t", "FSTCW\t",
66 static char *x86emu_fpu_op_d9_tab1
[] = {
67 "FLD\t", "FLD\t", "FLD\t", "FLD\t",
68 "FLD\t", "FLD\t", "FLD\t", "FLD\t",
70 "FXCH\t", "FXCH\t", "FXCH\t", "FXCH\t",
71 "FXCH\t", "FXCH\t", "FXCH\t", "FXCH\t",
73 "FNOP", "ESC_D9", "ESC_D9", "ESC_D9",
74 "ESC_D9", "ESC_D9", "ESC_D9", "ESC_D9",
76 "FSTP\t", "FSTP\t", "FSTP\t", "FSTP\t",
77 "FSTP\t", "FSTP\t", "FSTP\t", "FSTP\t",
79 "FCHS", "FABS", "ESC_D9", "ESC_D9",
80 "FTST", "FXAM", "ESC_D9", "ESC_D9",
82 "FLD1", "FLDL2T", "FLDL2E", "FLDPI",
83 "FLDLG2", "FLDLN2", "FLDZ", "ESC_D9",
85 "F2XM1", "FYL2X", "FPTAN", "FPATAN",
86 "FXTRACT", "ESC_D9", "FDECSTP", "FINCSTP",
88 "FPREM", "FYL2XP1", "FSQRT", "ESC_D9",
89 "FRNDINT", "FSCALE", "ESC_D9", "ESC_D9",
95 void x86emuOp_esc_coprocess_d9(u8
X86EMU_UNUSED(op1
))
102 FETCH_DECODE_MODRM(mod
, rh
, rl
);
105 DECODE_PRINTINSTR32(x86emu_fpu_op_d9_tab
, mod
, rh
, rl
);
107 DECODE_PRINTF(x86emu_fpu_op_d9_tab1
[(rh
<< 3) + rl
]);
112 destoffset
= decode_rm00_address(rl
);
116 destoffset
= decode_rm01_address(rl
);
120 destoffset
= decode_rm10_address(rl
);
123 case 3: /* register to register */
126 DECODE_PRINTF2("ST(%d)\n", stkelem
);
132 #ifdef X86EMU_FPU_PRESENT
138 x86emu_fpu_R_fld(X86EMU_FPU_STKTOP
, stkelem
);
141 x86emu_fpu_R_fxch(X86EMU_FPU_STKTOP
, stkelem
);
149 x86emu_fpu_illegal();
153 x86emu_fpu_R_fstp(X86EMU_FPU_STKTOP
, stkelem
);
158 x86emu_fpu_R_fchs(X86EMU_FPU_STKTOP
);
161 x86emu_fpu_R_fabs(X86EMU_FPU_STKTOP
);
164 x86emu_fpu_R_ftst(X86EMU_FPU_STKTOP
);
167 x86emu_fpu_R_fxam(X86EMU_FPU_STKTOP
);
171 x86emu_fpu_illegal();
179 x86emu_fpu_R_fld1(X86EMU_FPU_STKTOP
);
182 x86emu_fpu_R_fldl2t(X86EMU_FPU_STKTOP
);
185 x86emu_fpu_R_fldl2e(X86EMU_FPU_STKTOP
);
188 x86emu_fpu_R_fldpi(X86EMU_FPU_STKTOP
);
191 x86emu_fpu_R_fldlg2(X86EMU_FPU_STKTOP
);
194 x86emu_fpu_R_fldln2(X86EMU_FPU_STKTOP
);
197 x86emu_fpu_R_fldz(X86EMU_FPU_STKTOP
);
201 x86emu_fpu_illegal();
209 x86emu_fpu_R_f2xm1(X86EMU_FPU_STKTOP
);
212 x86emu_fpu_R_fyl2x(X86EMU_FPU_STKTOP
);
215 x86emu_fpu_R_fptan(X86EMU_FPU_STKTOP
);
218 x86emu_fpu_R_fpatan(X86EMU_FPU_STKTOP
);
221 x86emu_fpu_R_fxtract(X86EMU_FPU_STKTOP
);
224 x86emu_fpu_illegal();
227 x86emu_fpu_R_decstp();
230 x86emu_fpu_R_incstp();
238 x86emu_fpu_R_fprem(X86EMU_FPU_STKTOP
);
241 x86emu_fpu_R_fyl2xp1(X86EMU_FPU_STKTOP
);
244 x86emu_fpu_R_fsqrt(X86EMU_FPU_STKTOP
);
247 x86emu_fpu_illegal();
250 x86emu_fpu_R_frndint(X86EMU_FPU_STKTOP
);
253 x86emu_fpu_R_fscale(X86EMU_FPU_STKTOP
);
258 x86emu_fpu_illegal();
266 x86emu_fpu_M_fld(X86EMU_FPU_FLOAT
, destoffset
);
269 x86emu_fpu_illegal();
272 x86emu_fpu_M_fst(X86EMU_FPU_FLOAT
, destoffset
);
275 x86emu_fpu_M_fstp(X86EMU_FPU_FLOAT
, destoffset
);
278 x86emu_fpu_M_fldenv(X86EMU_FPU_WORD
, destoffset
);
281 x86emu_fpu_M_fldcw(X86EMU_FPU_WORD
, destoffset
);
284 x86emu_fpu_M_fstenv(X86EMU_FPU_WORD
, destoffset
);
287 x86emu_fpu_M_fstcw(X86EMU_FPU_WORD
, destoffset
);
295 #endif /* X86EMU_FPU_PRESENT */
296 DECODE_CLEAR_SEGOVR();
297 END_OF_INSTR_NO_TRACE();
302 char *x86emu_fpu_op_da_tab
[] = {
303 "FIADD\tDWORD PTR ", "FIMUL\tDWORD PTR ", "FICOM\tDWORD PTR ",
304 "FICOMP\tDWORD PTR ",
305 "FISUB\tDWORD PTR ", "FISUBR\tDWORD PTR ", "FIDIV\tDWORD PTR ",
306 "FIDIVR\tDWORD PTR ",
308 "FIADD\tDWORD PTR ", "FIMUL\tDWORD PTR ", "FICOM\tDWORD PTR ",
309 "FICOMP\tDWORD PTR ",
310 "FISUB\tDWORD PTR ", "FISUBR\tDWORD PTR ", "FIDIV\tDWORD PTR ",
311 "FIDIVR\tDWORD PTR ",
313 "FIADD\tDWORD PTR ", "FIMUL\tDWORD PTR ", "FICOM\tDWORD PTR ",
314 "FICOMP\tDWORD PTR ",
315 "FISUB\tDWORD PTR ", "FISUBR\tDWORD PTR ", "FIDIV\tDWORD PTR ",
316 "FIDIVR\tDWORD PTR ",
318 "ESC_DA ", "ESC_DA ", "ESC_DA ", "ESC_DA ",
319 "ESC_DA ", "ESC_DA ", "ESC_DA ", "ESC_DA ",
325 void x86emuOp_esc_coprocess_da(u8
X86EMU_UNUSED(op1
))
332 FETCH_DECODE_MODRM(mod
, rh
, rl
);
333 DECODE_PRINTINSTR32(x86emu_fpu_op_da_tab
, mod
, rh
, rl
);
336 destoffset
= decode_rm00_address(rl
);
340 destoffset
= decode_rm01_address(rl
);
344 destoffset
= decode_rm10_address(rl
);
347 case 3: /* register to register */
349 DECODE_PRINTF2("\tST(%d),ST\n", stkelem
);
352 #ifdef X86EMU_FPU_PRESENT
355 x86emu_fpu_illegal();
360 x86emu_fpu_M_iadd(X86EMU_FPU_SHORT
, destoffset
);
363 x86emu_fpu_M_imul(X86EMU_FPU_SHORT
, destoffset
);
366 x86emu_fpu_M_icom(X86EMU_FPU_SHORT
, destoffset
);
369 x86emu_fpu_M_icomp(X86EMU_FPU_SHORT
, destoffset
);
372 x86emu_fpu_M_isub(X86EMU_FPU_SHORT
, destoffset
);
375 x86emu_fpu_M_isubr(X86EMU_FPU_SHORT
, destoffset
);
378 x86emu_fpu_M_idiv(X86EMU_FPU_SHORT
, destoffset
);
381 x86emu_fpu_M_idivr(X86EMU_FPU_SHORT
, destoffset
);
389 DECODE_CLEAR_SEGOVR();
390 END_OF_INSTR_NO_TRACE();
395 char *x86emu_fpu_op_db_tab
[] = {
396 "FILD\tDWORD PTR ", "ESC_DB\t19", "FIST\tDWORD PTR ", "FISTP\tDWORD PTR ",
397 "ESC_DB\t1C", "FLD\tTBYTE PTR ", "ESC_DB\t1E", "FSTP\tTBYTE PTR ",
399 "FILD\tDWORD PTR ", "ESC_DB\t19", "FIST\tDWORD PTR ", "FISTP\tDWORD PTR ",
400 "ESC_DB\t1C", "FLD\tTBYTE PTR ", "ESC_DB\t1E", "FSTP\tTBYTE PTR ",
402 "FILD\tDWORD PTR ", "ESC_DB\t19", "FIST\tDWORD PTR ", "FISTP\tDWORD PTR ",
403 "ESC_DB\t1C", "FLD\tTBYTE PTR ", "ESC_DB\t1E", "FSTP\tTBYTE PTR ",
409 void x86emuOp_esc_coprocess_db(u8
X86EMU_UNUSED(op1
))
415 FETCH_DECODE_MODRM(mod
, rh
, rl
);
418 DECODE_PRINTINSTR32(x86emu_fpu_op_db_tab
, mod
, rh
, rl
);
419 } else if (rh
== 4) { /* === 11 10 0 nnn */
422 DECODE_PRINTF("FENI\n");
425 DECODE_PRINTF("FDISI\n");
428 DECODE_PRINTF("FCLEX\n");
431 DECODE_PRINTF("FINIT\n");
435 DECODE_PRINTF2("ESC_DB %0x\n", (mod
<< 6) + (rh
<< 3) + (rl
));
440 destoffset
= decode_rm00_address(rl
);
443 destoffset
= decode_rm01_address(rl
);
446 destoffset
= decode_rm10_address(rl
);
448 case 3: /* register to register */
451 #ifdef X86EMU_FPU_PRESENT
462 x86emu_fpu_R_fdisi();
465 x86emu_fpu_R_fclex();
468 x86emu_fpu_R_finit();
471 x86emu_fpu_illegal();
476 x86emu_fpu_illegal();
483 x86emu_fpu_M_fild(X86EMU_FPU_SHORT
, destoffset
);
486 x86emu_fpu_illegal();
489 x86emu_fpu_M_fist(X86EMU_FPU_SHORT
, destoffset
);
492 x86emu_fpu_M_fistp(X86EMU_FPU_SHORT
, destoffset
);
495 x86emu_fpu_illegal();
498 x86emu_fpu_M_fld(X86EMU_FPU_LDBL
, destoffset
);
501 x86emu_fpu_illegal();
504 x86emu_fpu_M_fstp(X86EMU_FPU_LDBL
, destoffset
);
511 DECODE_CLEAR_SEGOVR();
512 END_OF_INSTR_NO_TRACE();
516 char *x86emu_fpu_op_dc_tab
[] = {
517 "FADD\tQWORD PTR ", "FMUL\tQWORD PTR ", "FCOM\tQWORD PTR ",
519 "FSUB\tQWORD PTR ", "FSUBR\tQWORD PTR ", "FDIV\tQWORD PTR ",
522 "FADD\tQWORD PTR ", "FMUL\tQWORD PTR ", "FCOM\tQWORD PTR ",
524 "FSUB\tQWORD PTR ", "FSUBR\tQWORD PTR ", "FDIV\tQWORD PTR ",
527 "FADD\tQWORD PTR ", "FMUL\tQWORD PTR ", "FCOM\tQWORD PTR ",
529 "FSUB\tQWORD PTR ", "FSUBR\tQWORD PTR ", "FDIV\tQWORD PTR ",
532 "FADD\t", "FMUL\t", "FCOM\t", "FCOMP\t",
533 "FSUBR\t", "FSUB\t", "FDIVR\t", "FDIV\t",
538 void x86emuOp_esc_coprocess_dc(u8
X86EMU_UNUSED(op1
))
545 FETCH_DECODE_MODRM(mod
, rh
, rl
);
546 DECODE_PRINTINSTR32(x86emu_fpu_op_dc_tab
, mod
, rh
, rl
);
549 destoffset
= decode_rm00_address(rl
);
553 destoffset
= decode_rm01_address(rl
);
557 destoffset
= decode_rm10_address(rl
);
560 case 3: /* register to register */
562 DECODE_PRINTF2("\tST(%d),ST\n", stkelem
);
565 #ifdef X86EMU_FPU_PRESENT
571 x86emu_fpu_R_fadd(stkelem
, X86EMU_FPU_STKTOP
);
574 x86emu_fpu_R_fmul(stkelem
, X86EMU_FPU_STKTOP
);
577 x86emu_fpu_R_fcom(stkelem
, X86EMU_FPU_STKTOP
);
580 x86emu_fpu_R_fcomp(stkelem
, X86EMU_FPU_STKTOP
);
583 x86emu_fpu_R_fsubr(stkelem
, X86EMU_FPU_STKTOP
);
586 x86emu_fpu_R_fsub(stkelem
, X86EMU_FPU_STKTOP
);
589 x86emu_fpu_R_fdivr(stkelem
, X86EMU_FPU_STKTOP
);
592 x86emu_fpu_R_fdiv(stkelem
, X86EMU_FPU_STKTOP
);
599 x86emu_fpu_M_fadd(X86EMU_FPU_DOUBLE
, destoffset
);
602 x86emu_fpu_M_fmul(X86EMU_FPU_DOUBLE
, destoffset
);
605 x86emu_fpu_M_fcom(X86EMU_FPU_DOUBLE
, destoffset
);
608 x86emu_fpu_M_fcomp(X86EMU_FPU_DOUBLE
, destoffset
);
611 x86emu_fpu_M_fsub(X86EMU_FPU_DOUBLE
, destoffset
);
614 x86emu_fpu_M_fsubr(X86EMU_FPU_DOUBLE
, destoffset
);
617 x86emu_fpu_M_fdiv(X86EMU_FPU_DOUBLE
, destoffset
);
620 x86emu_fpu_M_fdivr(X86EMU_FPU_DOUBLE
, destoffset
);
628 DECODE_CLEAR_SEGOVR();
629 END_OF_INSTR_NO_TRACE();
634 static char *x86emu_fpu_op_dd_tab
[] = {
635 "FLD\tQWORD PTR ", "ESC_DD\t29,", "FST\tQWORD PTR ", "FSTP\tQWORD PTR ",
636 "FRSTOR\t", "ESC_DD\t2D,", "FSAVE\t", "FSTSW\t",
638 "FLD\tQWORD PTR ", "ESC_DD\t29,", "FST\tQWORD PTR ", "FSTP\tQWORD PTR ",
639 "FRSTOR\t", "ESC_DD\t2D,", "FSAVE\t", "FSTSW\t",
641 "FLD\tQWORD PTR ", "ESC_DD\t29,", "FST\tQWORD PTR ", "FSTP\tQWORD PTR ",
642 "FRSTOR\t", "ESC_DD\t2D,", "FSAVE\t", "FSTSW\t",
644 "FFREE\t", "FXCH\t", "FST\t", "FSTP\t",
645 "ESC_DD\t2C,", "ESC_DD\t2D,", "ESC_DD\t2E,", "ESC_DD\t2F,",
651 void x86emuOp_esc_coprocess_dd(u8
X86EMU_UNUSED(op1
))
658 FETCH_DECODE_MODRM(mod
, rh
, rl
);
659 DECODE_PRINTINSTR32(x86emu_fpu_op_dd_tab
, mod
, rh
, rl
);
662 destoffset
= decode_rm00_address(rl
);
666 destoffset
= decode_rm01_address(rl
);
670 destoffset
= decode_rm10_address(rl
);
673 case 3: /* register to register */
675 DECODE_PRINTF2("\tST(%d),ST\n", stkelem
);
678 #ifdef X86EMU_FPU_PRESENT
683 x86emu_fpu_R_ffree(stkelem
);
686 x86emu_fpu_R_fxch(stkelem
);
689 x86emu_fpu_R_fst(stkelem
); /* register version */
692 x86emu_fpu_R_fstp(stkelem
); /* register version */
695 x86emu_fpu_illegal();
702 x86emu_fpu_M_fld(X86EMU_FPU_DOUBLE
, destoffset
);
705 x86emu_fpu_illegal();
708 x86emu_fpu_M_fst(X86EMU_FPU_DOUBLE
, destoffset
);
711 x86emu_fpu_M_fstp(X86EMU_FPU_DOUBLE
, destoffset
);
714 x86emu_fpu_M_frstor(X86EMU_FPU_WORD
, destoffset
);
717 x86emu_fpu_illegal();
720 x86emu_fpu_M_fsave(X86EMU_FPU_WORD
, destoffset
);
723 x86emu_fpu_M_fstsw(X86EMU_FPU_WORD
, destoffset
);
731 DECODE_CLEAR_SEGOVR();
732 END_OF_INSTR_NO_TRACE();
737 static char *x86emu_fpu_op_de_tab
[] =
739 "FIADD\tWORD PTR ", "FIMUL\tWORD PTR ", "FICOM\tWORD PTR ",
741 "FISUB\tWORD PTR ", "FISUBR\tWORD PTR ", "FIDIV\tWORD PTR ",
744 "FIADD\tWORD PTR ", "FIMUL\tWORD PTR ", "FICOM\tWORD PTR ",
746 "FISUB\tWORD PTR ", "FISUBR\tWORD PTR ", "FIDIV\tWORD PTR ",
749 "FIADD\tWORD PTR ", "FIMUL\tWORD PTR ", "FICOM\tWORD PTR ",
751 "FISUB\tWORD PTR ", "FISUBR\tWORD PTR ", "FIDIV\tWORD PTR ",
754 "FADDP\t", "FMULP\t", "FCOMP\t", "FCOMPP\t",
755 "FSUBRP\t", "FSUBP\t", "FDIVRP\t", "FDIVP\t",
761 void x86emuOp_esc_coprocess_de(u8
X86EMU_UNUSED(op1
))
768 FETCH_DECODE_MODRM(mod
, rh
, rl
);
769 DECODE_PRINTINSTR32(x86emu_fpu_op_de_tab
, mod
, rh
, rl
);
772 destoffset
= decode_rm00_address(rl
);
776 destoffset
= decode_rm01_address(rl
);
780 destoffset
= decode_rm10_address(rl
);
783 case 3: /* register to register */
785 DECODE_PRINTF2("\tST(%d),ST\n", stkelem
);
788 #ifdef X86EMU_FPU_PRESENT
793 x86emu_fpu_R_faddp(stkelem
, X86EMU_FPU_STKTOP
);
796 x86emu_fpu_R_fmulp(stkelem
, X86EMU_FPU_STKTOP
);
799 x86emu_fpu_R_fcomp(stkelem
, X86EMU_FPU_STKTOP
);
803 x86emu_fpu_R_fcompp(stkelem
, X86EMU_FPU_STKTOP
);
805 x86emu_fpu_illegal();
808 x86emu_fpu_R_fsubrp(stkelem
, X86EMU_FPU_STKTOP
);
811 x86emu_fpu_R_fsubp(stkelem
, X86EMU_FPU_STKTOP
);
814 x86emu_fpu_R_fdivrp(stkelem
, X86EMU_FPU_STKTOP
);
817 x86emu_fpu_R_fdivp(stkelem
, X86EMU_FPU_STKTOP
);
824 x86emu_fpu_M_fiadd(X86EMU_FPU_WORD
, destoffset
);
827 x86emu_fpu_M_fimul(X86EMU_FPU_WORD
, destoffset
);
830 x86emu_fpu_M_ficom(X86EMU_FPU_WORD
, destoffset
);
833 x86emu_fpu_M_ficomp(X86EMU_FPU_WORD
, destoffset
);
836 x86emu_fpu_M_fisub(X86EMU_FPU_WORD
, destoffset
);
839 x86emu_fpu_M_fisubr(X86EMU_FPU_WORD
, destoffset
);
842 x86emu_fpu_M_fidiv(X86EMU_FPU_WORD
, destoffset
);
845 x86emu_fpu_M_fidivr(X86EMU_FPU_WORD
, destoffset
);
853 DECODE_CLEAR_SEGOVR();
854 END_OF_INSTR_NO_TRACE();
859 static char *x86emu_fpu_op_df_tab
[] = {
861 "FILD\tWORD PTR ", "ESC_DF\t39\n", "FIST\tWORD PTR ", "FISTP\tWORD PTR ",
862 "FBLD\tTBYTE PTR ", "FILD\tQWORD PTR ", "FBSTP\tTBYTE PTR ",
866 "FILD\tWORD PTR ", "ESC_DF\t39 ", "FIST\tWORD PTR ", "FISTP\tWORD PTR ",
867 "FBLD\tTBYTE PTR ", "FILD\tQWORD PTR ", "FBSTP\tTBYTE PTR ",
871 "FILD\tWORD PTR ", "ESC_DF\t39 ", "FIST\tWORD PTR ", "FISTP\tWORD PTR ",
872 "FBLD\tTBYTE PTR ", "FILD\tQWORD PTR ", "FBSTP\tTBYTE PTR ",
876 "FFREE\t", "FXCH\t", "FST\t", "FSTP\t",
877 "ESC_DF\t3C,", "ESC_DF\t3D,", "ESC_DF\t3E,", "ESC_DF\t3F,"
883 void x86emuOp_esc_coprocess_df(u8
X86EMU_UNUSED(op1
))
890 FETCH_DECODE_MODRM(mod
, rh
, rl
);
891 DECODE_PRINTINSTR32(x86emu_fpu_op_df_tab
, mod
, rh
, rl
);
894 destoffset
= decode_rm00_address(rl
);
898 destoffset
= decode_rm01_address(rl
);
902 destoffset
= decode_rm10_address(rl
);
905 case 3: /* register to register */
907 DECODE_PRINTF2("\tST(%d)\n", stkelem
);
910 #ifdef X86EMU_FPU_PRESENT
915 x86emu_fpu_R_ffree(stkelem
);
918 x86emu_fpu_R_fxch(stkelem
);
921 x86emu_fpu_R_fst(stkelem
); /* register version */
924 x86emu_fpu_R_fstp(stkelem
); /* register version */
927 x86emu_fpu_illegal();
934 x86emu_fpu_M_fild(X86EMU_FPU_WORD
, destoffset
);
937 x86emu_fpu_illegal();
940 x86emu_fpu_M_fist(X86EMU_FPU_WORD
, destoffset
);
943 x86emu_fpu_M_fistp(X86EMU_FPU_WORD
, destoffset
);
946 x86emu_fpu_M_fbld(X86EMU_FPU_BSD
, destoffset
);
949 x86emu_fpu_M_fild(X86EMU_FPU_LONG
, destoffset
);
952 x86emu_fpu_M_fbstp(X86EMU_FPU_BSD
, destoffset
);
955 x86emu_fpu_M_fistp(X86EMU_FPU_LONG
, destoffset
);
963 DECODE_CLEAR_SEGOVR();
964 END_OF_INSTR_NO_TRACE();