From 1c8e1bbdfa09cb639787b27841dc4802aa45b06c Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 8 Nov 2022 01:13:42 -0600 Subject: [PATCH] jit: handle {66,}0f16 --- gen/x86_table.js | 4 ++-- src/rust/cpu/instructions_0f.rs | 13 +++++-------- src/rust/jit_instructions.rs | 13 +++++++++++++ 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/gen/x86_table.js b/gen/x86_table.js index f0fe02a0..923af5a9 100644 --- a/gen/x86_table.js +++ b/gen/x86_table.js @@ -636,8 +636,8 @@ const encodings = [ { sse: 1, opcode: 0x660F14, e: 1, custom: 1 }, { sse: 1, opcode: 0x0F15, e: 1, custom: 1 }, { sse: 1, opcode: 0x660F15, e: 1, custom: 1 }, - { sse: 1, opcode: 0x0F16, e: 1 }, - { sse: 1, opcode: 0x660F16, reg_ud: 1, e: 1 }, + { 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 }, diff --git a/src/rust/cpu/instructions_0f.rs b/src/rust/cpu/instructions_0f.rs index 83f4143c..bdc8a8ba 100644 --- a/src/rust/cpu/instructions_0f.rs +++ b/src/rust/cpu/instructions_0f.rs @@ -642,24 +642,21 @@ pub unsafe fn instr_660F15_reg(r1: i32, r2: i32) { instr_660F15(read_xmm128s(r1) pub unsafe fn instr_660F15_mem(addr: i32, r: i32) { instr_660F15(return_on_pagefault!(safe_read128s(addr)), r); } + #[no_mangle] +pub unsafe fn instr_0F16(source: u64, r: i32) { (*reg_xmm.offset(r as isize)).u64[1] = source; } pub unsafe fn instr_0F16_mem(addr: i32, r: i32) { // movhps xmm, m64 - movh_m64_r128(addr, r); + instr_0F16(return_on_pagefault!(safe_read64s(addr)), r); } -#[no_mangle] pub unsafe fn instr_0F16_reg(r1: i32, r2: i32) { // movlhps xmm, xmm - let data = read_xmm128s(r1); - let orig = read_xmm128s(r2); - write_xmm128_2(r2, orig.u64[0], data.u64[0]); + instr_0F16(read_xmm64s(r1), r2); } -#[no_mangle] pub unsafe fn instr_660F16_mem(addr: i32, r: i32) { // movhpd xmm, m64 - movh_m64_r128(addr, r); + instr_0F16(return_on_pagefault!(safe_read64s(addr)), r); } -#[no_mangle] pub unsafe fn instr_660F16_reg(_r1: i32, _r2: i32) { trigger_ud(); } #[no_mangle] pub unsafe fn instr_F30F16_reg(_r1: i32, _r2: i32) { unimplemented_sse(); } diff --git a/src/rust/jit_instructions.rs b/src/rust/jit_instructions.rs index fbd31616..f9524259 100644 --- a/src/rust/jit_instructions.rs +++ b/src/rust/jit_instructions.rs @@ -5634,6 +5634,19 @@ pub fn instr_660F15_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) { sse_read128_xmm_xmm(ctx, "instr_660F15", r1, r2); } +pub fn instr_0F16_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) { + sse_read64_xmm_mem(ctx, "instr_0F16", modrm_byte, r); +} +pub fn instr_0F16_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) { + sse_read64_xmm_xmm(ctx, "instr_0F16", r1, r2); +} +pub fn instr_660F16_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) { + sse_read64_xmm_mem(ctx, "instr_0F16", modrm_byte, r); +} +pub fn instr_660F16_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);