diff --git a/gen/x86_table.js b/gen/x86_table.js index 923af5a9..16a8a6c2 100644 --- a/gen/x86_table.js +++ b/gen/x86_table.js @@ -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 }, diff --git a/src/rust/cpu/instructions_0f.rs b/src/rust/cpu/instructions_0f.rs index bdc8a8ba..ea43d59c 100644 --- a/src/rust/cpu/instructions_0f.rs +++ b/src/rust/cpu/instructions_0f.rs @@ -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 } diff --git a/src/rust/jit_instructions.rs b/src/rust/jit_instructions.rs index f9524259..c5defbf4 100644 --- a/src/rust/jit_instructions.rs +++ b/src/rust/jit_instructions.rs @@ -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);