jit {,66}0F{12,13} (movhlps, movlps, movlpd, movlps, movlpd)

This commit is contained in:
Fabian 2021-04-05 01:33:26 -05:00
parent 904593ca68
commit f4f3ec0ca1
3 changed files with 41 additions and 12 deletions

View file

@ -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 },

View file

@ -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);

View file

@ -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);