Subversion Repositories Kolibri OS

Rev

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
#endif
256
#define>