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