void sse2_rcpss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) { emit_3ub(p, 0xF3, X86_TWOB, 0x53); emit_modrm( p, dst, src ); }
void x86_lea( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) { emit_1ub(p, 0x8d); emit_modrm( p, dst, src ); }
void sse2_packuswb( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) { emit_3ub(p, 0x66, X86_TWOB, 0x67); emit_modrm( p, dst, src ); }
void x86_test( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) { emit_1ub(p, 0x85); emit_modrm( p, dst, src ); }
void sse2_cvtps2dq( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) { emit_3ub(p, 0x66, X86_TWOB, 0x5B); emit_modrm( p, dst, src ); }
void sse_pmovmskb( struct x86_function *p, struct x86_reg dest, struct x86_reg src) { emit_3ub(p, 0x66, X86_TWOB, 0xD7); emit_modrm(p, dest, src); }
/* Emits the "/0".."/7" specialized versions of the modrm ("/r") bytes. */ static void emit_modrm_noreg( struct x86_function *p, unsigned op, struct x86_reg regmem ) { struct x86_reg dummy = x86_make_reg(file_REG32, op); emit_modrm(p, dummy, regmem); }
void sse_xorps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) { emit_2ub(p, X86_TWOB, 0x57); emit_modrm( p, dst, src ); }
void sse_rsqrtss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) { emit_3ub(p, 0xF3, X86_TWOB, 0x52); emit_modrm( p, dst, src ); }
void sse2_cvttps2dq( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) { DUMP_RR( dst, src ); emit_3ub( p, 0xF3, X86_TWOB, 0x5B ); emit_modrm( p, dst, src ); }
void sse2_punpcklbw( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) { DUMP_RR( dst, src ); emit_3ub(p, 0x66, X86_TWOB, 0x60); emit_modrm( p, dst, src ); }
void sse2_cvtdq2ps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) { DUMP_RR( dst, src ); emit_2ub(p, X86_TWOB, 0x5b); emit_modrm( p, dst, src ); }
void sse_rsqrtps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) { DUMP_RR( dst, src ); emit_2ub(p, X86_TWOB, 0x52); emit_modrm( p, dst, src ); }
void sse_addss( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) { DUMP_RR( dst, src ); emit_3ub(p, 0xF3, X86_TWOB, 0x58); emit_modrm( p, dst, src ); }
void x86_imul( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) { DUMP_RR( dst, src ); emit_2ub(p, X86_TWOB, 0xAF); emit_modrm(p, dst, src); }
void sse_movlhps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) { assert(dst.mod == mod_REG && src.mod == mod_REG); emit_2ub(p, X86_TWOB, 0x16); emit_modrm( p, dst, src ); }
void sse2_packsswb( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) { DUMP_RR( dst, src ); emit_3ub(p, 0x66, X86_TWOB, 0x63); emit_modrm( p, dst, src ); }
void sse_movhlps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) { DUMP_RR( dst, src ); assert(dst.mod == mod_REG && src.mod == mod_REG); emit_2ub(p, X86_TWOB, 0x12); emit_modrm( p, dst, src ); }
void sse_cmpps( struct x86_function *p, struct x86_reg dest, struct x86_reg arg0, unsigned char cc) { emit_2ub(p, X86_TWOB, 0xC2); emit_modrm(p, dest, arg0); emit_1ub(p, cc); }
/** * Perform a reduced swizzle: */ void sse2_pshufd( struct x86_function *p, struct x86_reg dest, struct x86_reg arg0, unsigned char shuf) { emit_3ub(p, 0x66, X86_TWOB, 0x70); emit_modrm(p, dest, arg0); emit_1ub(p, shuf); }
/* Shufps can also be used to implement a reduced swizzle when dest == * arg0. */ void sse_shufps( struct x86_function *p, struct x86_reg dest, struct x86_reg arg0, unsigned char shuf) { emit_2ub(p, X86_TWOB, 0xC6); emit_modrm(p, dest, arg0); emit_1ub(p, shuf); }
void sse_cmpps( struct x86_function *p, struct x86_reg dst, struct x86_reg src, enum sse_cc cc) { DUMP_RRI( dst, src, cc ); emit_2ub(p, X86_TWOB, 0xC2); emit_modrm(p, dst, src); emit_1ub(p, cc); }
/* Shufps can also be used to implement a reduced swizzle when dest == * arg0. */ void sse_shufps( struct x86_function *p, struct x86_reg dst, struct x86_reg src, unsigned char shuf) { DUMP_RRI( dst, src, shuf ); emit_2ub(p, X86_TWOB, 0xC6); emit_modrm(p, dst, src); emit_1ub(p, shuf); }
/** * Perform a reduced swizzle: */ void sse2_pshufd( struct x86_function *p, struct x86_reg dst, struct x86_reg src, unsigned char shuf) { DUMP_RRI( dst, src, shuf ); emit_3ub(p, 0x66, X86_TWOB, 0x70); emit_modrm(p, dst, src); emit_1ub(p, shuf); }
void sse_movntps( struct x86_function *p, struct x86_reg dst, struct x86_reg src) { DUMP_RR( dst, src ); assert(dst.mod != mod_REG); assert(src.mod == mod_REG); emit_2ub(p, 0x0f, 0x2b); emit_modrm(p, src, dst); }
void mmx_packuswb( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) { assert(dst.file == file_MMX && (src.file == file_MMX || src.mod != mod_REG)); p->need_emms = 1; emit_2ub(p, X86_TWOB, 0x67); emit_modrm( p, dst, src ); }
void sse_cvtps2pi( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) { assert(dst.file == file_MMX && (src.file == file_XMM || src.mod != mod_REG)); p->need_emms = 1; emit_2ub(p, X86_TWOB, 0x2d); emit_modrm( p, dst, src ); }
/* Many x86 instructions have two opcodes to cope with the situations * where the destination is a register or memory reference * respectively. This function selects the correct opcode based on * the arguments presented. */ static void emit_op_modrm( struct x86_function *p, unsigned char op_dst_is_reg, unsigned char op_dst_is_mem, struct x86_reg dst, struct x86_reg src ) { switch (dst.mod) { case mod_REG: emit_1ub(p, op_dst_is_reg); emit_modrm(p, dst, src); break; case mod_INDIRECT: case mod_DISP32: case mod_DISP8: assert(src.mod == mod_REG); emit_1ub(p, op_dst_is_mem); emit_modrm(p, src, dst); break; default: assert(0); break; } }
void sse_unpcklps( struct x86_function *p, struct x86_reg dst, struct x86_reg src ) { DUMP_RR( dst, src ); emit_2ub( p, X86_TWOB, 0x14 ); emit_modrm( p, dst, src ); }
void x86_call( struct x86_function *p, struct x86_reg reg) { emit_1ub(p, 0xff); emit_modrm(p, reg, reg); }