1 // stop compiling if NORECBUILD build (only for Visual Studio)
2 
3 #ifdef __x86_64__
4 
5 #if !(defined(_MSC_VER) && defined(PCSX2_NORECBUILD))
6 
7 #include <stdio.h>
8 #include <string.h>
9 #include "ix86-64.h"
10 
11 /********************/
12 /* FPU instructions */
13 /********************/
14 
15 /* fild m32 to fpu reg stack */
FILD32(uptr from)16 void FILD32( uptr from )
17 {
18 	MEMADDR_OP(0, VAROP1(0xDB), false, 0, from, 0);
19 }
20 
21 /* fistp m32 from fpu reg stack */
FISTP32(uptr from)22 void FISTP32( uptr from )
23 {
24 	MEMADDR_OP(0, VAROP1(0xDB), false, 3, from, 0);
25 }
26 
27 /* fld m32 to fpu reg stack */
FLD32(uptr from)28 void FLD32( uptr from )
29 {
30 	MEMADDR_OP(0, VAROP1(0xD9), false, 0, from, 0);
31 }
32 
33 // fld st(i)
FLD(int st)34 void FLD(int st) { write16(0xc0d9+(st<<8)); }
35 
FLD1()36 void FLD1() { write16(0xe8d9); }
FLDL2E()37 void FLDL2E() { write16(0xead9); }
38 
39 /* fst m32 from fpu reg stack */
FST32(uptr to)40 void FST32( uptr to )
41 {
42 	MEMADDR_OP(0, VAROP1(0xD9), false, 2, to, 0);
43 }
44 
45 /* fstp m32 from fpu reg stack */
FSTP32(uptr to)46 void FSTP32( uptr to )
47 {
48 	MEMADDR_OP(0, VAROP1(0xD9), false, 3, to, 0);
49 }
50 
51 // fstp st(i)
FSTP(int st)52 void FSTP(int st) { write16(0xd8dd+(st<<8)); }
53 
54 /* fldcw fpu control word from m16 */
FLDCW(uptr from)55 void FLDCW( uptr from )
56 {
57 	MEMADDR_OP(0, VAROP1(0xD9), false, 5, from, 0);
58 }
59 
60 /* fnstcw fpu control word to m16 */
FNSTCW(uptr to)61 void FNSTCW( uptr to )
62 {
63 	MEMADDR_OP(0, VAROP1(0xD9), false, 7, to, 0);
64 }
65 
FNSTSWtoAX(void)66 void FNSTSWtoAX( void )
67 {
68 	write16( 0xE0DF );
69 }
70 
FXAM()71 void FXAM()
72 {
73 	write16(0xe5d9);
74 }
75 
FDECSTP()76 void FDECSTP() { write16(0xf6d9); }
FRNDINT()77 void FRNDINT() { write16(0xfcd9); }
FXCH(int st)78 void FXCH(int st) { write16(0xc8d9+(st<<8)); }
F2XM1()79 void F2XM1() { write16(0xf0d9); }
FSCALE()80 void FSCALE() { write16(0xfdd9); }
81 
82 /* fadd ST(src) to fpu reg stack ST(0) */
FADD32Rto0(x86IntRegType src)83 void FADD32Rto0( x86IntRegType src )
84 {
85    write8( 0xD8 );
86    write8( 0xC0 + src );
87 }
88 
89 /* fadd ST(0) to fpu reg stack ST(src) */
FADD320toR(x86IntRegType src)90 void FADD320toR( x86IntRegType src )
91 {
92    write8( 0xDC );
93    write8( 0xC0 + src );
94 }
95 
96 /* fsub ST(src) to fpu reg stack ST(0) */
FSUB32Rto0(x86IntRegType src)97 void FSUB32Rto0( x86IntRegType src )
98 {
99    write8( 0xD8 );
100    write8( 0xE0 + src );
101 }
102 
103 /* fsub ST(0) to fpu reg stack ST(src) */
FSUB320toR(x86IntRegType src)104 void FSUB320toR( x86IntRegType src )
105 {
106    write8( 0xDC );
107    write8( 0xE8 + src );
108 }
109 
110 /* fsubp -> substract ST(0) from ST(1), store in ST(1) and POP stack */
FSUBP(void)111 void FSUBP( void )
112 {
113    write8( 0xDE );
114    write8( 0xE9 );
115 }
116 
117 /* fmul ST(src) to fpu reg stack ST(0) */
FMUL32Rto0(x86IntRegType src)118 void FMUL32Rto0( x86IntRegType src )
119 {
120    write8( 0xD8 );
121    write8( 0xC8 + src );
122 }
123 
124 /* fmul ST(0) to fpu reg stack ST(src) */
FMUL320toR(x86IntRegType src)125 void FMUL320toR( x86IntRegType src )
126 {
127    write8( 0xDC );
128    write8( 0xC8 + src );
129 }
130 
131 /* fdiv ST(src) to fpu reg stack ST(0) */
FDIV32Rto0(x86IntRegType src)132 void FDIV32Rto0( x86IntRegType src )
133 {
134    write8( 0xD8 );
135    write8( 0xF0 + src );
136 }
137 
138 /* fdiv ST(0) to fpu reg stack ST(src) */
FDIV320toR(x86IntRegType src)139 void FDIV320toR( x86IntRegType src )
140 {
141    write8( 0xDC );
142    write8( 0xF8 + src );
143 }
144 
FDIV320toRP(x86IntRegType src)145 void FDIV320toRP( x86IntRegType src )
146 {
147 	write8( 0xDE );
148 	write8( 0xF8 + src );
149 }
150 
151 /* fadd m32 to fpu reg stack */
FADD32(uptr from)152 void FADD32( uptr from )
153 {
154 	MEMADDR_OP(0, VAROP1(0xD8), false, 0, from, 0);
155 }
156 
157 /* fsub m32 to fpu reg stack */
FSUB32(uptr from)158 void FSUB32( uptr from )
159 {
160 	MEMADDR_OP(0, VAROP1(0xD8), false, 4, from, 0);
161 }
162 
163 /* fmul m32 to fpu reg stack */
FMUL32(uptr from)164 void FMUL32( uptr from )
165 {
166 	MEMADDR_OP(0, VAROP1(0xD8), false, 1, from, 0);
167 }
168 
169 /* fdiv m32 to fpu reg stack */
FDIV32(uptr from)170 void FDIV32( uptr from )
171 {
172 	MEMADDR_OP(0, VAROP1(0xD8), false, 6, from, 0);
173 }
174 
175 /* fabs fpu reg stack */
FABS(void)176 void FABS( void )
177 {
178 	write16( 0xE1D9 );
179 }
180 
181 /* fsqrt fpu reg stack */
FSQRT(void)182 void FSQRT( void )
183 {
184 	write16( 0xFAD9 );
185 }
186 
FPATAN(void)187 void FPATAN(void) { write16(0xf3d9); }
FSIN(void)188 void FSIN(void) { write16(0xfed9); }
189 
190 /* fchs fpu reg stack */
FCHS(void)191 void FCHS( void )
192 {
193 	write16( 0xE0D9 );
194 }
195 
196 /* fcomi st, st(i) */
FCOMI(x86IntRegType src)197 void FCOMI( x86IntRegType src )
198 {
199 	write8( 0xDB );
200 	write8( 0xF0 + src );
201 }
202 
203 /* fcomip st, st(i) */
FCOMIP(x86IntRegType src)204 void FCOMIP( x86IntRegType src )
205 {
206 	write8( 0xDF );
207 	write8( 0xF0 + src );
208 }
209 
210 /* fucomi st, st(i) */
FUCOMI(x86IntRegType src)211 void FUCOMI( x86IntRegType src )
212 {
213 	write8( 0xDB );
214 	write8( 0xE8 + src );
215 }
216 
217 /* fucomip st, st(i) */
FUCOMIP(x86IntRegType src)218 void FUCOMIP( x86IntRegType src )
219 {
220 	write8( 0xDF );
221 	write8( 0xE8 + src );
222 }
223 
224 /* fcom m32 to fpu reg stack */
FCOM32(uptr from)225 void FCOM32( uptr from )
226 {
227 	MEMADDR_OP(0, VAROP1(0xD8), false, 2, from, 0);
228 }
229 
230 /* fcomp m32 to fpu reg stack */
FCOMP32(uptr from)231 void FCOMP32( uptr from )
232 {
233 	MEMADDR_OP(0, VAROP1(0xD8), false, 3, from, 0);
234 }
235 
236 #define FCMOV32( low, high ) \
237    { \
238 	   write8( low ); \
239 	   write8( high + from );  \
240    }
241 
FCMOVB32(x86IntRegType from)242 void FCMOVB32( x86IntRegType from )     { FCMOV32( 0xDA, 0xC0 ); }
FCMOVE32(x86IntRegType from)243 void FCMOVE32( x86IntRegType from )     { FCMOV32( 0xDA, 0xC8 ); }
FCMOVBE32(x86IntRegType from)244 void FCMOVBE32( x86IntRegType from )    { FCMOV32( 0xDA, 0xD0 ); }
FCMOVU32(x86IntRegType from)245 void FCMOVU32( x86IntRegType from )     { FCMOV32( 0xDA, 0xD8 ); }
FCMOVNB32(x86IntRegType from)246 void FCMOVNB32( x86IntRegType from )    { FCMOV32( 0xDB, 0xC0 ); }
FCMOVNE32(x86IntRegType from)247 void FCMOVNE32( x86IntRegType from )    { FCMOV32( 0xDB, 0xC8 ); }
FCMOVNBE32(x86IntRegType from)248 void FCMOVNBE32( x86IntRegType from )   { FCMOV32( 0xDB, 0xD0 ); }
FCMOVNU32(x86IntRegType from)249 void FCMOVNU32( x86IntRegType from )    { FCMOV32( 0xDB, 0xD8 ); }
250 
251 #endif
252 
253 #endif
254