Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenx86sse.h
Go to the documentation of this file.
00001 00002 #ifndef _X86SSE_H_ 00003 #define _X86SSE_H_ 00004 00005 #if defined(__i386__) || defined(__386__) 00006 00007 /* It is up to the caller to ensure that instructions issued are 00008 * suitable for the host cpu. There are no checks made in this module 00009 * for mmx/sse/sse2 support on the cpu. 00010 */ 00011 struct x86_reg { 00012 unsigned file:3; 00013 unsigned idx:3; 00014 unsigned mod:2; /* mod_REG if this is just a register */ 00015 int disp:24; /* only +/- 23bits of offset - should be enough... */ 00016 }; 00017 00018 struct x86_function { 00019 unsigned size; 00020 unsigned char *store; 00021 unsigned char *csr; 00022 unsigned stack_offset; 00023 int need_emms; 00024 const char *fn; 00025 }; 00026 00027 enum x86_reg_file { 00028 file_REG32, 00029 file_MMX, 00030 file_XMM, 00031 file_x87 00032 }; 00033 00034 /* Values for mod field of modr/m byte 00035 */ 00036 enum x86_reg_mod { 00037 mod_INDIRECT, 00038 mod_DISP8, 00039 mod_DISP32, 00040 mod_REG 00041 }; 00042 00043 enum x86_reg_name { 00044 reg_AX, 00045 reg_CX, 00046 reg_DX, 00047 reg_BX, 00048 reg_SP, 00049 reg_BP, 00050 reg_SI, 00051 reg_DI 00052 }; 00053 00054 00055 enum x86_cc { 00056 cc_O, /* overflow */ 00057 cc_NO, /* not overflow */ 00058 cc_NAE, /* not above or equal / carry */ 00059 cc_AE, /* above or equal / not carry */ 00060 cc_E, /* equal / zero */ 00061 cc_NE /* not equal / not zero */ 00062 }; 00063 00064 enum sse_cc { 00065 cc_Equal, 00066 cc_LessThan, 00067 cc_LessThanEqual, 00068 cc_Unordered, 00069 cc_NotEqual, 00070 cc_NotLessThan, 00071 cc_NotLessThanEqual, 00072 cc_Ordered 00073 }; 00074 00075 #define cc_Z cc_E 00076 #define cc_NZ cc_NE 00077 00078 /* Begin/end/retreive function creation: 00079 */ 00080 00081 00082 void x86_init_func( struct x86_function *p ); 00083 int x86_init_func_size( struct x86_function *p, unsigned code_size ); 00084 void x86_release_func( struct x86_function *p ); 00085 void (*x86_get_func( struct x86_function *p ))( void ); 00086 00087 00088 00089 /* Create and manipulate registers and regmem values: 00090 */ 00091 struct x86_reg x86_make_reg( enum x86_reg_file file, 00092 enum x86_reg_name idx ); 00093 00094 struct x86_reg x86_make_disp( struct x86_reg reg, 00095 int disp ); 00096 00097 struct x86_reg x86_deref( struct x86_reg reg ); 00098 00099 struct x86_reg x86_get_base_reg( struct x86_reg reg ); 00100 00101 00102 /* Labels, jumps and fixup: 00103 */ 00104 unsigned char *x86_get_label( struct x86_function *p ); 00105 00106 void x86_jcc( struct x86_function *p, 00107 enum x86_cc cc, 00108 unsigned char *label ); 00109 00110 unsigned char *x86_jcc_forward( struct x86_function *p, 00111 enum x86_cc cc ); 00112 00113 unsigned char *x86_jmp_forward( struct x86_function *p); 00114 00115 unsigned char *x86_call_forward( struct x86_function *p); 00116 00117 void x86_fixup_fwd_jump( struct x86_function *p, 00118 unsigned char *fixup ); 00119 00120 void x86_jmp( struct x86_function *p, unsigned char *label ); 00121 00122 /* void x86_call( struct x86_function *p, void (*label)() ); */ 00123 void x86_call( struct x86_function *p, struct x86_reg reg); 00124 00125 /* michal: 00126 * Temporary. As I need immediate operands, and dont want to mess with the codegen, 00127 * I load the immediate into general purpose register and use it. 00128 */ 00129 void x86_mov_reg_imm( struct x86_function *p, struct x86_reg dst, int imm ); 00130 00131 00132 /* Macro for sse_shufps() and sse2_pshufd(): 00133 */ 00134 #define SHUF(_x,_y,_z,_w) (((_x)<<0) | ((_y)<<2) | ((_z)<<4) | ((_w)<<6)) 00135 #define SHUF_NOOP RSW(0,1,2,3) 00136 #define GET_SHUF(swz, idx) (((swz) >> ((idx)*2)) & 0x3) 00137 00138 void mmx_emms( struct x86_function *p ); 00139 void mmx_movd( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00140 void mmx_movq( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00141 void mmx_packssdw( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00142 void mmx_packuswb( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00143 00144 void sse2_cvtps2dq( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00145 void sse2_cvttps2dq( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00146 void sse2_movd( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00147 void sse2_packssdw( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00148 void sse2_packsswb( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00149 void sse2_packuswb( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00150 void sse2_pshufd( struct x86_function *p, struct x86_reg dest, struct x86_reg arg0, 00151 unsigned char shuf ); 00152 void sse2_rcpps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00153 void sse2_rcpss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00154 00155 void sse_addps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00156 void sse_addss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00157 void sse_cvtps2pi( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00158 void sse_divss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00159 void sse_andnps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00160 void sse_andps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00161 void sse_cmpps( struct x86_function *p, struct x86_reg dst, struct x86_reg src, 00162 unsigned char cc ); 00163 void sse_maxps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00164 void sse_maxss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00165 void sse_minps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00166 void sse_movaps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00167 void sse_movhlps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00168 void sse_movhps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00169 void sse_movlhps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00170 void sse_movlps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00171 void sse_movss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00172 void sse_movups( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00173 void sse_mulps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00174 void sse_mulss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00175 void sse_orps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00176 void sse_xorps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00177 void sse_subps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00178 void sse_rsqrtps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00179 void sse_rsqrtss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00180 void sse_shufps( struct x86_function *p, struct x86_reg dest, struct x86_reg arg0, 00181 unsigned char shuf ); 00182 void sse_pmovmskb( struct x86_function *p, struct x86_reg dest, struct x86_reg src ); 00183 00184 void x86_add( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00185 void x86_and( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00186 void x86_cmp( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00187 void x86_dec( struct x86_function *p, struct x86_reg reg ); 00188 void x86_inc( struct x86_function *p, struct x86_reg reg ); 00189 void x86_lea( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00190 void x86_mov( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00191 void x86_mul( struct x86_function *p, struct x86_reg src ); 00192 void x86_or( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00193 void x86_pop( struct x86_function *p, struct x86_reg reg ); 00194 void x86_push( struct x86_function *p, struct x86_reg reg ); 00195 void x86_ret( struct x86_function *p ); 00196 void x86_sub( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00197 void x86_test( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00198 void x86_xor( struct x86_function *p, struct x86_reg dst, struct x86_reg src ); 00199 void x86_sahf( struct x86_function *p ); 00200 00201 void x87_f2xm1( struct x86_function *p ); 00202 void x87_fabs( struct x86_function *p ); 00203 void x87_fadd( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ); 00204 void x87_faddp( struct x86_function *p, struct x86_reg dst ); 00205 void x87_fchs( struct x86_function *p ); 00206 void x87_fclex( struct x86_function *p ); 00207 void x87_fcom( struct x86_function *p, struct x86_reg dst ); 00208 void x87_fcomp( struct x86_function *p, struct x86_reg dst ); 00209 void x87_fcos( struct x86_function *p ); 00210 void x87_fdiv( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ); 00211 void x87_fdivp( struct x86_function *p, struct x86_reg dst ); 00212 void x87_fdivr( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ); 00213 void x87_fdivrp( struct x86_function *p, struct x86_reg dst ); 00214 void x87_fild( struct x86_function *p, struct x86_reg arg ); 00215 void x87_fist( struct x86_function *p, struct x86_reg dst ); 00216 void x87_fistp( struct x86_function *p, struct x86_reg dst ); 00217 void x87_fld( struct x86_function *p, struct x86_reg arg ); 00218 void x87_fld1( struct x86_function *p ); 00219 void x87_fldcw( struct x86_function *p, struct x86_reg arg ); 00220 void x87_fldl2e( struct x86_function *p ); 00221 void x87_fldln2( struct x86_function *p ); 00222 void x87_fldz( struct x86_function *p ); 00223 void x87_fmul( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ); 00224 void x87_fmulp( struct x86_function *p, struct x86_reg dst ); 00225 void x87_fnclex( struct x86_function *p ); 00226 void x87_fprndint( struct x86_function *p ); 00227 void x87_fscale( struct x86_function *p ); 00228 void x87_fsin( struct x86_function *p ); 00229 void x87_fsincos( struct x86_function *p ); 00230 void x87_fsqrt( struct x86_function *p ); 00231 void x87_fst( struct x86_function *p, struct x86_reg dst ); 00232 void x87_fstp( struct x86_function *p, struct x86_reg dst ); 00233 void x87_fsub( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ); 00234 void x87_fsubp( struct x86_function *p, struct x86_reg dst ); 00235 void x87_fsubr( struct x86_function *p, struct x86_reg dst, struct x86_reg arg ); 00236 void x87_fsubrp( struct x86_function *p, struct x86_reg dst ); 00237 void x87_fxch( struct x86_function *p, struct x86_reg dst ); 00238 void x87_fxtract( struct x86_function *p ); 00239 void x87_fyl2x( struct x86_function *p ); 00240 void x87_fyl2xp1( struct x86_function *p ); 00241 void x87_fwait( struct x86_function *p ); 00242 void x87_fnstsw( struct x86_function *p, struct x86_reg dst ); 00243 void x87_fucompp( struct x86_function *p ); 00244 void x87_fucomp( struct x86_function *p, struct x86_reg arg ); 00245 void x87_fucom( struct x86_function *p, struct x86_reg arg ); 00246 00247 00248 00249 /* Retreive a reference to one of the function arguments, taking into 00250 * account any push/pop activity. Note - doesn't track explict 00251 * manipulation of ESP by other instructions. 00252 */ 00253 struct x86_reg x86_fn_arg( struct x86_function *p, unsigned arg ); 00254 00255 #endif 00256 #endif Generated on Sat May 26 2012 04:19:39 for ReactOS by
1.7.6.1
|