jit: handle {66,}0f17
This commit is contained in:
parent
1c8e1bbdfa
commit
16662ec979
|
@ -639,8 +639,8 @@ const encodings = [
|
|||
{ sse: 1, opcode: 0x0F16, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0x660F16, reg_ud: 1, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0xF30F16, skip: 1, e: 1, block_boundary: 1, }, // sse3
|
||||
{ sse: 1, opcode: 0x0F17, reg_ud: 1, e: 1 },
|
||||
{ sse: 1, opcode: 0x660F17, reg_ud: 1, e: 1 },
|
||||
{ sse: 1, opcode: 0x0F17, reg_ud: 1, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0x660F17, reg_ud: 1, e: 1, custom: 1 },
|
||||
|
||||
{ sse: 1, opcode: 0x0F28, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0x660F28, e: 1, custom: 1 },
|
||||
|
|
|
@ -663,20 +663,17 @@ pub unsafe fn instr_F30F16_reg(_r1: i32, _r2: i32) { unimplemented_sse(); }
|
|||
#[no_mangle]
|
||||
pub unsafe fn instr_F30F16_mem(_addr: i32, _r: i32) { unimplemented_sse(); }
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F17_mem(addr: i32, r: i32) {
|
||||
// movhps m64, xmm
|
||||
movh_r128_m64(addr, r);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F17_reg(_r1: i32, _r2: i32) { trigger_ud(); }
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_660F17_mem(addr: i32, r: i32) {
|
||||
// movhpd m64, xmm
|
||||
movh_r128_m64(addr, r);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_660F17_reg(_r1: i32, _r2: i32) { trigger_ud(); }
|
||||
|
||||
pub unsafe fn instr_0F18_reg(_r1: i32, _r2: i32) {
|
||||
// reserved nop
|
||||
}
|
||||
|
|
|
@ -5647,6 +5647,27 @@ pub fn instr_660F16_reg_jit(ctx: &mut JitContext, _r1: u32, _r2: u32) {
|
|||
codegen::gen_trigger_ud(ctx);
|
||||
}
|
||||
|
||||
pub fn instr_0F17_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
|
||||
codegen::gen_modrm_resolve(ctx, modrm_byte);
|
||||
let address_local = ctx.builder.set_new_local();
|
||||
ctx.builder
|
||||
.const_i32(global_pointers::get_reg_xmm_offset(r) as i32);
|
||||
ctx.builder.load_aligned_i64(8);
|
||||
let value_local = ctx.builder.set_new_local_i64();
|
||||
codegen::gen_safe_write64(ctx, &address_local, &value_local);
|
||||
ctx.builder.free_local(address_local);
|
||||
ctx.builder.free_local_i64(value_local);
|
||||
}
|
||||
pub fn instr_0F17_reg_jit(ctx: &mut JitContext, _r1: u32, _r2: u32) {
|
||||
codegen::gen_trigger_ud(ctx);
|
||||
}
|
||||
pub fn instr_660F17_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
|
||||
instr_0F17_mem_jit(ctx, modrm_byte, r);
|
||||
}
|
||||
pub fn instr_660F17_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