ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

x86sse.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.