]>
git.ipfire.org Git - people/stevee/ipfire-2.x.git/blob - src/hwinfo/src/x86emu/fpu.c
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 ****************************************************************************/
41 #include "x86emu/x86emui.h"
43 /*----------------------------- Implementation ----------------------------*/
46 void x86emuOp_esc_coprocess_d8(u8
X86EMU_UNUSED(op1
))
49 DECODE_PRINTF("ESC D8\n");
50 DECODE_CLEAR_SEGOVR();
51 END_OF_INSTR_NO_TRACE();
56 static char *x86emu_fpu_op_d9_tab
[] = {
57 "FLD\tDWORD PTR ", "ESC_D9\t", "FST\tDWORD PTR ", "FSTP\tDWORD PTR ",
58 "FLDENV\t", "FLDCW\t", "FSTENV\t", "FSTCW\t",
60 "FLD\tDWORD PTR ", "ESC_D9\t", "FST\tDWORD PTR ", "FSTP\tDWORD PTR ",
61 "FLDENV\t", "FLDCW\t", "FSTENV\t", "FSTCW\t",
63 "FLD\tDWORD PTR ", "ESC_D9\t", "FST\tDWORD PTR ", "FSTP\tDWORD PTR ",
64 "FLDENV\t", "FLDCW\t", "FSTENV\t", "FSTCW\t",
67 static char *x86emu_fpu_op_d9_tab1
[] = {
68 "FLD\t", "FLD\t", "FLD\t", "FLD\t",
69 "FLD\t", "FLD\t", "FLD\t", "FLD\t",
71 "FXCH\t", "FXCH\t", "FXCH\t", "FXCH\t",
72 "FXCH\t", "FXCH\t", "FXCH\t", "FXCH\t",
74 "FNOP", "ESC_D9", "ESC_D9", "ESC_D9",
75 "ESC_D9", "ESC_D9", "ESC_D9", "ESC_D9",
77 "FSTP\t", "FSTP\t", "FSTP\t", "FSTP\t",
78 "FSTP\t", "FSTP\t", "FSTP\t", "FSTP\t",
80 "FCHS", "FABS", "ESC_D9", "ESC_D9",
81 "FTST", "FXAM", "ESC_D9", "ESC_D9",
83 "FLD1", "FLDL2T", "FLDL2E", "FLDPI",
84 "FLDLG2", "FLDLN2", "FLDZ", "ESC_D9",
86 "F2XM1", "FYL2X", "FPTAN", "FPATAN",
87 "FXTRACT", "ESC_D9", "FDECSTP", "FINCSTP",
89 "FPREM", "FYL2XP1", "FSQRT", "ESC_D9",
90 "FRNDINT", "FSCALE", "ESC_D9", "ESC_D9",
96 void x86emuOp_esc_coprocess_d9(u8
X86EMU_UNUSED(op1
))
103 FETCH_DECODE_MODRM(mod
, rh
, rl
);
106 DECODE_PRINTINSTR32(x86emu_fpu_op_d9_tab
, mod
, rh
, rl
);
108 DECODE_PRINTF(x86emu_fpu_op_d9_tab1
[(rh
<< 3) + rl
]);
113 destoffset
= decode_rm00_address(rl
);
117 destoffset
= decode_rm01_address(rl
);
121 destoffset
= decode_rm10_address(rl
);
124 case 3: /* register to register */
127 DECODE_PRINTF2("ST(%d)\n", stkelem
);
133 #ifdef X86EMU_FPU_PRESENT
139 x86emu_fpu_R_fld(X86EMU_FPU_STKTOP
, stkelem
);
142 x86emu_fpu_R_fxch(X86EMU_FPU_STKTOP
, stkelem
);
150 x86emu_fpu_illegal();
154 x86emu_fpu_R_fstp(X86EMU_FPU_STKTOP
, stkelem
);
159 x86emu_fpu_R_fchs(X86EMU_FPU_STKTOP
);
162 x86emu_fpu_R_fabs(X86EMU_FPU_STKTOP
);
165 x86emu_fpu_R_ftst(X86EMU_FPU_STKTOP
);
168 x86emu_fpu_R_fxam(X86EMU_FPU_STKTOP
);
172 x86emu_fpu_illegal();
180 x86emu_fpu_R_fld1(X86EMU_FPU_STKTOP
);
183 x86emu_fpu_R_fldl2t(X86EMU_FPU_STKTOP
);
186 x86emu_fpu_R_fldl2e(X86EMU_FPU_STKTOP
);
189 x86emu_fpu_R_fldpi(X86EMU_FPU_STKTOP
);
192 x86emu_fpu_R_fldlg2(X86EMU_FPU_STKTOP
);
195 x86emu_fpu_R_fldln2(X86EMU_FPU_STKTOP
);
198 x86emu_fpu_R_fldz(X86EMU_FPU_STKTOP
);
202 x86emu_fpu_illegal();
210 x86emu_fpu_R_f2xm1(X86EMU_FPU_STKTOP
);
213 x86emu_fpu_R_fyl2x(X86EMU_FPU_STKTOP
);
216 x86emu_fpu_R_fptan(X86EMU_FPU_STKTOP
);
219 x86emu_fpu_R_fpatan(X86EMU_FPU_STKTOP
);
222 x86emu_fpu_R_fxtract(X86EMU_FPU_STKTOP
);
225 x86emu_fpu_illegal();
228 x86emu_fpu_R_decstp();
231 x86emu_fpu_R_incstp();
239 x86emu_fpu_R_fprem(X86EMU_FPU_STKTOP
);
242 x86emu_fpu_R_fyl2xp1(X86EMU_FPU_STKTOP
);
245 x86emu_fpu_R_fsqrt(X86EMU_FPU_STKTOP
);
248 x86emu_fpu_illegal();
251 x86emu_fpu_R_frndint(X86EMU_FPU_STKTOP
);
254 x86emu_fpu_R_fscale(X86EMU_FPU_STKTOP
);
259 x86emu_fpu_illegal();
267 x86emu_fpu_M_fld(X86EMU_FPU_FLOAT
, destoffset
);
270 x86emu_fpu_illegal();
273 x86emu_fpu_M_fst(X86EMU_FPU_FLOAT
, destoffset
);
276 x86emu_fpu_M_fstp(X86EMU_FPU_FLOAT
, destoffset
);
279 x86emu_fpu_M_fldenv(X86EMU_FPU_WORD
, destoffset
);
282 x86emu_fpu_M_fldcw(X86EMU_FPU_WORD
, destoffset
);
285 x86emu_fpu_M_fstenv(X86EMU_FPU_WORD
, destoffset
);
288 x86emu_fpu_M_fstcw(X86EMU_FPU_WORD
, destoffset
);
296 #endif /* X86EMU_FPU_PRESENT */
297 DECODE_CLEAR_SEGOVR();
298 END_OF_INSTR_NO_TRACE();
303 char *x86emu_fpu_op_da_tab
[] = {
304 "FIADD\tDWORD PTR ", "FIMUL\tDWORD PTR ", "FICOM\tDWORD PTR ",
305 "FICOMP\tDWORD PTR ",
306 "FISUB\tDWORD PTR ", "FISUBR\tDWORD PTR ", "FIDIV\tDWORD PTR ",
307 "FIDIVR\tDWORD PTR ",
309 "FIADD\tDWORD PTR ", "FIMUL\tDWORD PTR ", "FICOM\tDWORD PTR ",
310 "FICOMP\tDWORD PTR ",
311 "FISUB\tDWORD PTR ", "FISUBR\tDWORD PTR ", "FIDIV\tDWORD PTR ",
312 "FIDIVR\tDWORD PTR ",
314 "FIADD\tDWORD PTR ", "FIMUL\tDWORD PTR ", "FICOM\tDWORD PTR ",
315 "FICOMP\tDWORD PTR ",
316 "FISUB\tDWORD PTR ", "FISUBR\tDWORD PTR ", "FIDIV\tDWORD PTR ",
317 "FIDIVR\tDWORD PTR ",
319 "ESC_DA ", "ESC_DA ", "ESC_DA ", "ESC_DA ",
320 "ESC_DA ", "ESC_DA ", "ESC_DA ", "ESC_DA ",
326 void x86emuOp_esc_coprocess_da(u8
X86EMU_UNUSED(op1
))
333 FETCH_DECODE_MODRM(mod
, rh
, rl
);
334 DECODE_PRINTINSTR32(x86emu_fpu_op_da_tab
, mod
, rh
, rl
);
337 destoffset
= decode_rm00_address(rl
);
341 destoffset
= decode_rm01_address(rl
);
345 destoffset
= decode_rm10_address(rl
);
348 case 3: /* register to register */
350 DECODE_PRINTF2("\tST(%d),ST\n", stkelem
);
353 #ifdef X86EMU_FPU_PRESENT
356 x86emu_fpu_illegal();
361 x86emu_fpu_M_iadd(X86EMU_FPU_SHORT
, destoffset
);
364 x86emu_fpu_M_imul(X86EMU_FPU_SHORT
, destoffset
);
367 x86emu_fpu_M_icom(X86EMU_FPU_SHORT
, destoffset
);
370 x86emu_fpu_M_icomp(X86EMU_FPU_SHORT
, destoffset
);
373 x86emu_fpu_M_isub(X86EMU_FPU_SHORT
, destoffset
);
376 x86emu_fpu_M_isubr(X86EMU_FPU_SHORT
, destoffset
);
379 x86emu_fpu_M_idiv(X86EMU_FPU_SHORT
, destoffset
);
382 x86emu_fpu_M_idivr(X86EMU_FPU_SHORT
, destoffset
);
390 DECODE_CLEAR_SEGOVR();
391 END_OF_INSTR_NO_TRACE();
396 char *x86emu_fpu_op_db_tab
[] = {
397 "FILD\tDWORD PTR ", "ESC_DB\t19", "FIST\tDWORD PTR ", "FISTP\tDWORD PTR ",
398 "ESC_DB\t1C", "FLD\tTBYTE PTR ", "ESC_DB\t1E", "FSTP\tTBYTE PTR ",
400 "FILD\tDWORD PTR ", "ESC_DB\t19", "FIST\tDWORD PTR ", "FISTP\tDWORD PTR ",
401 "ESC_DB\t1C", "FLD\tTBYTE PTR ", "ESC_DB\t1E", "FSTP\tTBYTE PTR ",
403 "FILD\tDWORD PTR ", "ESC_DB\t19", "FIST\tDWORD PTR ", "FISTP\tDWORD PTR ",
404 "ESC_DB\t1C", "FLD\tTBYTE PTR ", "ESC_DB\t1E", "FSTP\tTBYTE PTR ",
410 void x86emuOp_esc_coprocess_db(u8
X86EMU_UNUSED(op1
))
416 FETCH_DECODE_MODRM(mod
, rh
, rl
);
419 DECODE_PRINTINSTR32(x86emu_fpu_op_db_tab
, mod
, rh
, rl
);
420 } else if (rh
== 4) { /* === 11 10 0 nnn */
423 DECODE_PRINTF("FENI\n");
426 DECODE_PRINTF("FDISI\n");
429 DECODE_PRINTF("FCLEX\n");
432 DECODE_PRINTF("FINIT\n");
436 DECODE_PRINTF2("ESC_DB %0x\n", (mod
<< 6) + (rh
<< 3) + (rl
));
441 destoffset
= decode_rm00_address(rl
);
444 destoffset
= decode_rm01_address(rl
);
447 destoffset
= decode_rm10_address(rl
);
449 case 3: /* register to register */
452 #ifdef X86EMU_FPU_PRESENT
463 x86emu_fpu_R_fdisi();
466 x86emu_fpu_R_fclex();
469 x86emu_fpu_R_finit();
472 x86emu_fpu_illegal();
477 x86emu_fpu_illegal();
484 x86emu_fpu_M_fild(X86EMU_FPU_SHORT
, destoffset
);
487 x86emu_fpu_illegal();
490 x86emu_fpu_M_fist(X86EMU_FPU_SHORT
, destoffset
);
493 x86emu_fpu_M_fistp(X86EMU_FPU_SHORT
, destoffset
);
496 x86emu_fpu_illegal();
499 x86emu_fpu_M_fld(X86EMU_FPU_LDBL
, destoffset
);
502 x86emu_fpu_illegal();
505 x86emu_fpu_M_fstp(X86EMU_FPU_LDBL
, destoffset
);
512 DECODE_CLEAR_SEGOVR();
513 END_OF_INSTR_NO_TRACE();
517 char *x86emu_fpu_op_dc_tab
[] = {
518 "FADD\tQWORD PTR ", "FMUL\tQWORD PTR ", "FCOM\tQWORD PTR ",
520 "FSUB\tQWORD PTR ", "FSUBR\tQWORD PTR ", "FDIV\tQWORD PTR ",
523 "FADD\tQWORD PTR ", "FMUL\tQWORD PTR ", "FCOM\tQWORD PTR ",
525 "FSUB\tQWORD PTR ", "FSUBR\tQWORD PTR ", "FDIV\tQWORD PTR ",
528 "FADD\tQWORD PTR ", "FMUL\tQWORD PTR ", "FCOM\tQWORD PTR ",
530 "FSUB\tQWORD PTR ", "FSUBR\tQWORD PTR ", "FDIV\tQWORD PTR ",
533 "FADD\t", "FMUL\t", "FCOM\t", "FCOMP\t",
534 "FSUBR\t", "FSUB\t", "FDIVR\t", "FDIV\t",
539 void x86emuOp_esc_coprocess_dc(u8
X86EMU_UNUSED(op1
))
546 FETCH_DECODE_MODRM(mod
, rh
, rl
);
547 DECODE_PRINTINSTR32(x86emu_fpu_op_dc_tab
, mod
, rh
, rl
);
550 destoffset
= decode_rm00_address(rl
);
554 destoffset
= decode_rm01_address(rl
);
558 destoffset
= decode_rm10_address(rl
);
561 case 3: /* register to register */
563 DECODE_PRINTF2("\tST(%d),ST\n", stkelem
);
566 #ifdef X86EMU_FPU_PRESENT
572 x86emu_fpu_R_fadd(stkelem
, X86EMU_FPU_STKTOP
);
575 x86emu_fpu_R_fmul(stkelem
, X86EMU_FPU_STKTOP
);
578 x86emu_fpu_R_fcom(stkelem
, X86EMU_FPU_STKTOP
);
581 x86emu_fpu_R_fcomp(stkelem
, X86EMU_FPU_STKTOP
);
584 x86emu_fpu_R_fsubr(stkelem
, X86EMU_FPU_STKTOP
);
587 x86emu_fpu_R_fsub(stkelem
, X86EMU_FPU_STKTOP
);
590 x86emu_fpu_R_fdivr(stkelem
, X86EMU_FPU_STKTOP
);
593 x86emu_fpu_R_fdiv(stkelem
, X86EMU_FPU_STKTOP
);
600 x86emu_fpu_M_fadd(X86EMU_FPU_DOUBLE
, destoffset
);
603 x86emu_fpu_M_fmul(X86EMU_FPU_DOUBLE
, destoffset
);
606 x86emu_fpu_M_fcom(X86EMU_FPU_DOUBLE
, destoffset
);
609 x86emu_fpu_M_fcomp(X86EMU_FPU_DOUBLE
, destoffset
);
612 x86emu_fpu_M_fsub(X86EMU_FPU_DOUBLE
, destoffset
);
615 x86emu_fpu_M_fsubr(X86EMU_FPU_DOUBLE
, destoffset
);
618 x86emu_fpu_M_fdiv(X86EMU_FPU_DOUBLE
, destoffset
);
621 x86emu_fpu_M_fdivr(X86EMU_FPU_DOUBLE
, destoffset
);
629 DECODE_CLEAR_SEGOVR();
630 END_OF_INSTR_NO_TRACE();
635 static char *x86emu_fpu_op_dd_tab
[] = {
636 "FLD\tQWORD PTR ", "ESC_DD\t29,", "FST\tQWORD PTR ", "FSTP\tQWORD PTR ",
637 "FRSTOR\t", "ESC_DD\t2D,", "FSAVE\t", "FSTSW\t",
639 "FLD\tQWORD PTR ", "ESC_DD\t29,", "FST\tQWORD PTR ", "FSTP\tQWORD PTR ",
640 "FRSTOR\t", "ESC_DD\t2D,", "FSAVE\t", "FSTSW\t",
642 "FLD\tQWORD PTR ", "ESC_DD\t29,", "FST\tQWORD PTR ", "FSTP\tQWORD PTR ",
643 "FRSTOR\t", "ESC_DD\t2D,", "FSAVE\t", "FSTSW\t",
645 "FFREE\t", "FXCH\t", "FST\t", "FSTP\t",
646 "ESC_DD\t2C,", "ESC_DD\t2D,", "ESC_DD\t2E,", "ESC_DD\t2F,",
652 void x86emuOp_esc_coprocess_dd(u8
X86EMU_UNUSED(op1
))
659 FETCH_DECODE_MODRM(mod
, rh
, rl
);
660 DECODE_PRINTINSTR32(x86emu_fpu_op_dd_tab
, mod
, rh
, rl
);
663 destoffset
= decode_rm00_address(rl
);
667 destoffset
= decode_rm01_address(rl
);
671 destoffset
= decode_rm10_address(rl
);
674 case 3: /* register to register */
676 DECODE_PRINTF2("\tST(%d),ST\n", stkelem
);
679 #ifdef X86EMU_FPU_PRESENT
684 x86emu_fpu_R_ffree(stkelem
);
687 x86emu_fpu_R_fxch(stkelem
);
690 x86emu_fpu_R_fst(stkelem
); /* register version */
693 x86emu_fpu_R_fstp(stkelem
); /* register version */
696 x86emu_fpu_illegal();
703 x86emu_fpu_M_fld(X86EMU_FPU_DOUBLE
, destoffset
);
706 x86emu_fpu_illegal();
709 x86emu_fpu_M_fst(X86EMU_FPU_DOUBLE
, destoffset
);
712 x86emu_fpu_M_fstp(X86EMU_FPU_DOUBLE
, destoffset
);
715 x86emu_fpu_M_frstor(X86EMU_FPU_WORD
, destoffset
);
718 x86emu_fpu_illegal();
721 x86emu_fpu_M_fsave(X86EMU_FPU_WORD
, destoffset
);
724 x86emu_fpu_M_fstsw(X86EMU_FPU_WORD
, destoffset
);
732 DECODE_CLEAR_SEGOVR();
733 END_OF_INSTR_NO_TRACE();
738 static char *x86emu_fpu_op_de_tab
[] =
740 "FIADD\tWORD PTR ", "FIMUL\tWORD PTR ", "FICOM\tWORD PTR ",
742 "FISUB\tWORD PTR ", "FISUBR\tWORD PTR ", "FIDIV\tWORD PTR ",
745 "FIADD\tWORD PTR ", "FIMUL\tWORD PTR ", "FICOM\tWORD PTR ",
747 "FISUB\tWORD PTR ", "FISUBR\tWORD PTR ", "FIDIV\tWORD PTR ",
750 "FIADD\tWORD PTR ", "FIMUL\tWORD PTR ", "FICOM\tWORD PTR ",
752 "FISUB\tWORD PTR ", "FISUBR\tWORD PTR ", "FIDIV\tWORD PTR ",
755 "FADDP\t", "FMULP\t", "FCOMP\t", "FCOMPP\t",
756 "FSUBRP\t", "FSUBP\t", "FDIVRP\t", "FDIVP\t",
762 void x86emuOp_esc_coprocess_de(u8
X86EMU_UNUSED(op1
))
769 FETCH_DECODE_MODRM(mod
, rh
, rl
);
770 DECODE_PRINTINSTR32(x86emu_fpu_op_de_tab
, mod
, rh
, rl
);
773 destoffset
= decode_rm00_address(rl
);
777 destoffset
= decode_rm01_address(rl
);
781 destoffset
= decode_rm10_address(rl
);
784 case 3: /* register to register */
786 DECODE_PRINTF2("\tST(%d),ST\n", stkelem
);
789 #ifdef X86EMU_FPU_PRESENT
794 x86emu_fpu_R_faddp(stkelem
, X86EMU_FPU_STKTOP
);
797 x86emu_fpu_R_fmulp(stkelem
, X86EMU_FPU_STKTOP
);
800 x86emu_fpu_R_fcomp(stkelem
, X86EMU_FPU_STKTOP
);
804 x86emu_fpu_R_fcompp(stkelem
, X86EMU_FPU_STKTOP
);
806 x86emu_fpu_illegal();
809 x86emu_fpu_R_fsubrp(stkelem
, X86EMU_FPU_STKTOP
);
812 x86emu_fpu_R_fsubp(stkelem
, X86EMU_FPU_STKTOP
);
815 x86emu_fpu_R_fdivrp(stkelem
, X86EMU_FPU_STKTOP
);
818 x86emu_fpu_R_fdivp(stkelem
, X86EMU_FPU_STKTOP
);
825 x86emu_fpu_M_fiadd(X86EMU_FPU_WORD
, destoffset
);
828 x86emu_fpu_M_fimul(X86EMU_FPU_WORD
, destoffset
);
831 x86emu_fpu_M_ficom(X86EMU_FPU_WORD
, destoffset
);
834 x86emu_fpu_M_ficomp(X86EMU_FPU_WORD
, destoffset
);
837 x86emu_fpu_M_fisub(X86EMU_FPU_WORD
, destoffset
);
840 x86emu_fpu_M_fisubr(X86EMU_FPU_WORD
, destoffset
);
843 x86emu_fpu_M_fidiv(X86EMU_FPU_WORD
, destoffset
);
846 x86emu_fpu_M_fidivr(X86EMU_FPU_WORD
, destoffset
);
854 DECODE_CLEAR_SEGOVR();
855 END_OF_INSTR_NO_TRACE();
860 static char *x86emu_fpu_op_df_tab
[] = {
862 "FILD\tWORD PTR ", "ESC_DF\t39\n", "FIST\tWORD PTR ", "FISTP\tWORD PTR ",
863 "FBLD\tTBYTE PTR ", "FILD\tQWORD PTR ", "FBSTP\tTBYTE PTR ",
867 "FILD\tWORD PTR ", "ESC_DF\t39 ", "FIST\tWORD PTR ", "FISTP\tWORD PTR ",
868 "FBLD\tTBYTE PTR ", "FILD\tQWORD PTR ", "FBSTP\tTBYTE PTR ",
872 "FILD\tWORD PTR ", "ESC_DF\t39 ", "FIST\tWORD PTR ", "FISTP\tWORD PTR ",
873 "FBLD\tTBYTE PTR ", "FILD\tQWORD PTR ", "FBSTP\tTBYTE PTR ",
877 "FFREE\t", "FXCH\t", "FST\t", "FSTP\t",
878 "ESC_DF\t3C,", "ESC_DF\t3D,", "ESC_DF\t3E,", "ESC_DF\t3F,"
884 void x86emuOp_esc_coprocess_df(u8
X86EMU_UNUSED(op1
))
891 FETCH_DECODE_MODRM(mod
, rh
, rl
);
892 DECODE_PRINTINSTR32(x86emu_fpu_op_df_tab
, mod
, rh
, rl
);
895 destoffset
= decode_rm00_address(rl
);
899 destoffset
= decode_rm01_address(rl
);
903 destoffset
= decode_rm10_address(rl
);
906 case 3: /* register to register */
908 DECODE_PRINTF2("\tST(%d)\n", stkelem
);
911 #ifdef X86EMU_FPU_PRESENT
916 x86emu_fpu_R_ffree(stkelem
);
919 x86emu_fpu_R_fxch(stkelem
);
922 x86emu_fpu_R_fst(stkelem
); /* register version */
925 x86emu_fpu_R_fstp(stkelem
); /* register version */
928 x86emu_fpu_illegal();
935 x86emu_fpu_M_fild(X86EMU_FPU_WORD
, destoffset
);
938 x86emu_fpu_illegal();
941 x86emu_fpu_M_fist(X86EMU_FPU_WORD
, destoffset
);
944 x86emu_fpu_M_fistp(X86EMU_FPU_WORD
, destoffset
);
947 x86emu_fpu_M_fbld(X86EMU_FPU_BSD
, destoffset
);
950 x86emu_fpu_M_fild(X86EMU_FPU_LONG
, destoffset
);
953 x86emu_fpu_M_fbstp(X86EMU_FPU_BSD
, destoffset
);
956 x86emu_fpu_M_fistp(X86EMU_FPU_LONG
, destoffset
);
964 DECODE_CLEAR_SEGOVR();
965 END_OF_INSTR_NO_TRACE();