jit {,66}0F{12,13} (movhlps, movlps, movlpd, movlps, movlpd)
This commit is contained in:
parent
904593ca68
commit
f4f3ec0ca1
|
@ -627,12 +627,12 @@ const encodings = [
|
|||
{ sse: 1, opcode: 0xF30F11, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0x660F11, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0xF20F11, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0x0F12, e: 1 },
|
||||
{ sse: 1, opcode: 0x660F12, reg_ud: 1, e: 1 },
|
||||
{ sse: 1, opcode: 0x0F12, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0x660F12, reg_ud: 1, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0xF20F12, e: 1, skip: 1, block_boundary: 1, }, // sse3
|
||||
{ sse: 1, opcode: 0xF30F12, e: 1, skip: 1, block_boundary: 1, }, // sse3
|
||||
{ sse: 1, opcode: 0x0F13, reg_ud: 1, e: 1 },
|
||||
{ sse: 1, opcode: 0x660F13, reg_ud: 1, e: 1 },
|
||||
{ sse: 1, opcode: 0x0F13, reg_ud: 1, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0x660F13, reg_ud: 1, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0x0F14, e: 1 },
|
||||
{ sse: 1, opcode: 0x660F14, e: 1 },
|
||||
{ sse: 1, opcode: 0x0F15, e: 1 },
|
||||
|
|
|
@ -540,21 +540,17 @@ pub unsafe fn instr_F20F11_mem(addr: i32, r: i32) {
|
|||
let data = read_xmm64s(r);
|
||||
return_on_pagefault!(safe_write64(addr, data));
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F12_mem(addr: i32, r: i32) {
|
||||
// movlps xmm, m64
|
||||
let data = return_on_pagefault!(safe_read64s(addr));
|
||||
write_xmm64(r, data);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F12_reg(r1: i32, r2: i32) {
|
||||
// movhlps xmm, xmm
|
||||
let data = read_xmm128s(r1);
|
||||
write_xmm64(r2, data.u64_0[1]);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_660F12_reg(_r1: i32, _r: i32) { trigger_ud(); }
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_660F12_mem(addr: i32, r: i32) {
|
||||
// movlpd xmm, m64
|
||||
let data = return_on_pagefault!(safe_read64s(addr));
|
||||
|
@ -568,16 +564,12 @@ pub unsafe fn instr_F20F12_reg(_r1: i32, _r2: i32) { unimplemented_sse(); }
|
|||
pub unsafe fn instr_F30F12_mem(_addr: i32, _r: i32) { unimplemented_sse(); }
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_F30F12_reg(_r1: i32, _r2: i32) { unimplemented_sse(); }
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F13_mem(addr: i32, r: i32) {
|
||||
// movlps m64, xmm
|
||||
movl_r128_m64(addr, r);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F13_reg(_r1: i32, _r2: i32) { trigger_ud(); }
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_660F13_reg(_r1: i32, _r: i32) { trigger_ud(); }
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_660F13_mem(addr: i32, r: i32) {
|
||||
// movlpd xmm/m64, xmm
|
||||
movl_r128_m64(addr, r);
|
||||
|
|
|
@ -5093,6 +5093,43 @@ pub fn instr_F30F11_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
|
|||
.store_aligned_i32(global_pointers::get_reg_xmm_offset(r1));
|
||||
}
|
||||
|
||||
pub fn instr_0F12_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
|
||||
ctx.builder
|
||||
.const_i32(global_pointers::get_reg_xmm_offset(r) as i32);
|
||||
codegen::gen_modrm_resolve_safe_read64(ctx, modrm_byte);
|
||||
ctx.builder.store_aligned_i64(0);
|
||||
}
|
||||
pub fn instr_0F12_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
|
||||
ctx.builder
|
||||
.const_i32(global_pointers::get_reg_xmm_offset(r2) as i32);
|
||||
ctx.builder
|
||||
.const_i32(global_pointers::get_reg_xmm_offset(r1) as i32 + 8);
|
||||
ctx.builder.load_aligned_i64(0);
|
||||
ctx.builder.store_aligned_i64(0);
|
||||
}
|
||||
pub fn instr_660F12_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
|
||||
ctx.builder
|
||||
.const_i32(global_pointers::get_reg_xmm_offset(r) as i32);
|
||||
codegen::gen_modrm_resolve_safe_read64(ctx, modrm_byte);
|
||||
ctx.builder.store_aligned_i64(0);
|
||||
}
|
||||
pub fn instr_660F12_reg_jit(ctx: &mut JitContext, _r1: u32, _r2: u32) {
|
||||
codegen::gen_trigger_ud(ctx);
|
||||
}
|
||||
|
||||
pub fn instr_0F13_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
|
||||
instr_660FD6_mem_jit(ctx, modrm_byte, r)
|
||||
}
|
||||
pub fn instr_0F13_reg_jit(ctx: &mut JitContext, _r1: u32, _r2: u32) {
|
||||
codegen::gen_trigger_ud(ctx);
|
||||
}
|
||||
pub fn instr_660F13_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
|
||||
instr_660FD6_mem_jit(ctx, modrm_byte, r)
|
||||
}
|
||||
pub fn instr_660F13_reg_jit(ctx: &mut JitContext, _r1: u32, _r2: u32) {
|
||||
codegen::gen_trigger_ud(ctx);
|
||||
}
|
||||
|
||||
pub fn instr_0F28_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
|
||||
let dest = global_pointers::get_reg_xmm_offset(r);
|
||||
codegen::gen_modrm_resolve_safe_read128(ctx, modrm_byte, dest);
|
||||
|
|
Loading…
Reference in a new issue