Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4358 | Serge | 1 | |
2 | #define _X86SSE_H_ |
||
3 | |||
4 | |||
5 | |||
6 | |||
7 | * suitable for the host cpu. There are no checks made in this module |
||
8 | * for mmx/sse/sse2 support on the cpu. |
||
9 | */ |
||
10 | struct x86_reg { |
||
11 | unsigned file:3; |
||
12 | unsigned idx:3; |
||
13 | unsigned mod:2; /* mod_REG if this is just a register */ |
||
14 | int disp:24; /* only +/- 23bits of offset - should be enough... */ |
||
15 | }; |
||
16 | |||
17 | |||
18 | unsigned size; |
||
19 | unsigned char *store; |
||
20 | unsigned char *csr; |
||
21 | unsigned stack_offset; |
||
22 | int need_emms; |
||
23 | const char *fn; |
||
24 | }; |
||
25 | |||
26 | |||
27 | file_REG32, |
||
28 | file_MMX, |
||
29 | file_XMM, |
||
30 | file_x87 |
||
31 | }; |
||
32 | |||
33 | |||
34 | */ |
||
35 | enum x86_reg_mod { |
||
36 | mod_INDIRECT, |
||
37 | mod_DISP8, |
||
38 | mod_DISP32, |
||
39 | mod_REG |
||
40 | }; |
||
41 | |||
42 | |||
43 | reg_AX, |
||
44 | reg_CX, |
||
45 | reg_DX, |
||
46 | reg_BX, |
||
47 | reg_SP, |
||
48 | reg_BP, |
||
49 | reg_SI, |
||
50 | reg_DI |
||
51 | }; |
||
52 | |||
53 | |||
54 | |||
55 | cc_O, /* overflow */ |
||
56 | cc_NO, /* not overflow */ |
||
57 | cc_NAE, /* not above or equal / carry */ |
||
58 | cc_AE, /* above or equal / not carry */ |
||
59 | cc_E, /* equal / zero */ |
||
60 | cc_NE /* not equal / not zero */ |
||
61 | }; |
||
62 | |||
63 | |||
64 | cc_Equal, |
||
65 | cc_LessThan, |
||
66 | cc_LessThanEqual, |
||
67 | cc_Unordered, |
||
68 | cc_NotEqual, |
||
69 | cc_NotLessThan, |
||
70 | cc_NotLessThanEqual, |
||
71 | cc_Ordered |
||
72 | }; |
||
73 | |||
74 | |||
75 | #define cc_NZ cc_NE |
||
76 | |||
77 | |||
78 | */ |
||
79 | |||
80 | |||
81 | |||
82 | int x86_init_func_size( struct x86_function *p, unsigned code_size ); |
||
83 | void x86_release_func( struct x86_function *p ); |
||
84 | void (*x86_get_func( struct x86_function *p ))( void ); |
||
85 | |||
86 | |||
87 | |||
88 | |||
89 | */ |
||
90 | struct x86_reg x86_make_reg( enum x86_reg_file file, |
||
91 | enum x86_reg_name idx ); |
||
92 | |||
93 | |||
94 | int disp ); |
||
95 | |||
96 | |||
97 | |||
98 | |||
99 | |||
100 | |||
101 | |||
102 | */ |
||
103 | unsigned char *x86_get_label( struct x86_function *p ); |
||
104 | |||
105 | |||
106 | enum x86_cc cc, |
||
107 | unsigned char *label ); |
||
108 | |||
109 | |||
110 | enum x86_cc cc ); |
||
111 | |||
112 | |||
113 | |||
114 | |||
115 | |||
116 | |||
117 | unsigned char *fixup ); |
||
118 | |||
119 | |||
120 | |||
121 | |||
122 | void x86_call( struct x86_function *p, struct x86_reg reg); |
||
123 | |||
124 | |||
125 | * Temporary. As I need immediate operands, and dont want to mess with the codegen, |
||
126 | * I load the immediate into general purpose register and use it. |
||
127 | */ |
||
128 | void x86_mov_reg_imm( struct x86_function *p, struct x86_reg dst, int imm ); |
||
129 | |||
130 | |||
131 | |||
132 | */ |
||
133 | #define SHUF(_x,_y,_z,_w) (((_x)<<0) | ((_y)<<2) | ((_z)<<4) | ((_w)<<6)) |
||
134 | #define SHUF_NOOP RSW(0,1,2,3) |
||
135 | #define GET_SHUF(swz, idx) (((swz) >> ((idx)*2)) & 0x3) |
||
136 | |||
137 | |||
138 | void mmx_movd( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
139 | void mmx_movq( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
140 | void mmx_packssdw( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
141 | void mmx_packuswb( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
142 | |||
143 | |||
144 | void sse2_cvttps2dq( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
145 | void sse2_movd( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
146 | void sse2_packssdw( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
147 | void sse2_packsswb( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
148 | void sse2_packuswb( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
149 | void sse2_pshufd( struct x86_function *p, struct x86_reg dest, struct x86_reg arg0, |
||
150 | unsigned char shuf ); |
||
151 | void sse2_rcpps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
152 | void sse2_rcpss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
153 | |||
154 | |||
155 | void sse_addss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
156 | void sse_cvtps2pi( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
157 | void sse_divss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
158 | void sse_andnps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
159 | void sse_andps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
160 | void sse_cmpps( struct x86_function *p, struct x86_reg dst, struct x86_reg src, |
||
161 | unsigned char cc ); |
||
162 | void sse_maxps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
163 | void sse_maxss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
164 | void sse_minps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
165 | void sse_movaps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
166 | void sse_movhlps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
167 | void sse_movhps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
168 | void sse_movlhps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
169 | void sse_movlps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
170 | void sse_movss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
171 | void sse_movups( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
172 | void sse_mulps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
173 | void sse_mulss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
174 | void sse_orps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
175 | void sse_xorps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
176 | void sse_subps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
177 | void sse_rsqrtps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
178 | void sse_rsqrtss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
179 | void sse_shufps( struct x86_function *p, struct x86_reg dest, struct x86_reg arg0, |
||
180 | unsigned char shuf ); |
||
181 | void sse_pmovmskb( struct x86_function *p, struct x86_reg dest, struct x86_reg src ); |
||
182 | |||
183 | |||
184 | void x86_and( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
185 | void x86_cmp( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
186 | void x86_dec( struct x86_function *p, struct x86_reg reg ); |
||
187 | void x86_inc( struct x86_function *p, struct x86_reg reg ); |
||
188 | void x86_lea( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
189 | void x86_mov( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
190 | void x86_mul( struct x86_function *p, struct x86_reg src ); |
||
191 | void x86_or( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
192 | void x86_pop( struct x86_function *p, struct x86_reg reg ); |
||
193 | void x86_push( struct x86_function *p, struct x86_reg reg ); |
||
194 | void x86_ret( struct x86_function *p ); |
||
195 | void x86_sub( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
196 | void x86_test( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
197 | void x86_xor( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); |
||
198 | void x86_sahf( struct x86_function *p ); |
||
199 | |||
200 | |||
201 | void x87_fabs( struct x86_function *p ); |
||
202 | void x87_fadd( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ); |
||
203 | void x87_faddp( struct x86_function *p, struct x86_reg dst ); |
||
204 | void x87_fchs( struct x86_function *p ); |
||
205 | void x87_fclex( struct x86_function *p ); |
||
206 | void x87_fcom( struct x86_function *p, struct x86_reg dst ); |
||
207 | void x87_fcomp( struct x86_function *p, struct x86_reg dst ); |
||
208 | void x87_fcos( struct x86_function *p ); |
||
209 | void x87_fdiv( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ); |
||
210 | void x87_fdivp( struct x86_function *p, struct x86_reg dst ); |
||
211 | void x87_fdivr( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ); |
||
212 | void x87_fdivrp( struct x86_function *p, struct x86_reg dst ); |
||
213 | void x87_fild( struct x86_function *p, struct x86_reg arg ); |
||
214 | void x87_fist( struct x86_function *p, struct x86_reg dst ); |
||
215 | void x87_fistp( struct x86_function *p, struct x86_reg dst ); |
||
216 | void x87_fld( struct x86_function *p, struct x86_reg arg ); |
||
217 | void x87_fld1( struct x86_function *p ); |
||
218 | void x87_fldcw( struct x86_function *p, struct x86_reg arg ); |
||
219 | void x87_fldl2e( struct x86_function *p ); |
||
220 | void x87_fldln2( struct x86_function *p ); |
||
221 | void x87_fldz( struct x86_function *p ); |
||
222 | void x87_fmul( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ); |
||
223 | void x87_fmulp( struct x86_function *p, struct x86_reg dst ); |
||
224 | void x87_fnclex( struct x86_function *p ); |
||
225 | void x87_fprndint( struct x86_function *p ); |
||
226 | void x87_fscale( struct x86_function *p ); |
||
227 | void x87_fsin( struct x86_function *p ); |
||
228 | void x87_fsincos( struct x86_function *p ); |
||
229 | void x87_fsqrt( struct x86_function *p ); |
||
230 | void x87_fst( struct x86_function *p, struct x86_reg dst ); |
||
231 | void x87_fstp( struct x86_function *p, struct x86_reg dst ); |
||
232 | void x87_fsub( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ); |
||
233 | void x87_fsubp( struct x86_function *p, struct x86_reg dst ); |
||
234 | void x87_fsubr( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ); |
||
235 | void x87_fsubrp( struct x86_function *p, struct x86_reg dst ); |
||
236 | void x87_fxch( struct x86_function *p, struct x86_reg dst ); |
||
237 | void x87_fxtract( struct x86_function *p ); |
||
238 | void x87_fyl2x( struct x86_function *p ); |
||
239 | void x87_fyl2xp1( struct x86_function *p ); |
||
240 | void x87_fwait( struct x86_function *p ); |
||
241 | void x87_fnstsw( struct x86_function *p, struct x86_reg dst ); |
||
242 | void x87_fucompp( struct x86_function *p ); |
||
243 | void x87_fucomp( struct x86_function *p, struct x86_reg arg ); |
||
244 | void x87_fucom( struct x86_function *p, struct x86_reg arg ); |
||
245 | |||
246 | |||
247 | |||
248 | |||
249 | * account any push/pop activity. Note - doesn't track explict |
||
250 | * manipulation of ESP by other instructions. |
||
251 | */ |
||
252 | struct x86_reg x86_fn_arg( struct x86_function *p, unsigned arg ); |
||
253 | |||
254 | |||
255 | #endif6)) |
||
256 | #define><6)) |