From cc507db69bf3a096a2bb45d3d8a2ad33cfdc7410 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 28 Aug 2018 12:29:39 -0500 Subject: [PATCH] sse: Implement 0FC6/shufp[sd] (#57) --- gen/x86_table.js | 3 ++- src/rust/cpu2/instructions_0f.rs | 44 +++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/gen/x86_table.js b/gen/x86_table.js index b4aac8fc..1973e2a5 100644 --- a/gen/x86_table.js +++ b/gen/x86_table.js @@ -711,7 +711,8 @@ const encodings = [ { sse: 1, opcode: 0x0FC5, e: 1, mem_ud: 1, imm8: 1 }, { sse: 1, opcode: 0x660FC5, e: 1, mem_ud: 1, imm8: 1, }, - { sse: 1, opcode: 0x0FC6, skip: 1, }, + { sse: 1, opcode: 0x0FC6, e: 1, imm8: 1 }, + { sse: 1, opcode: 0x660FC6, e: 1, imm8: 1 }, { sse: 1, opcode: 0x0FD0, skip: 1, }, // sse3 diff --git a/src/rust/cpu2/instructions_0f.rs b/src/rust/cpu2/instructions_0f.rs index 840cad77..134b44bc 100644 --- a/src/rust/cpu2/instructions_0f.rs +++ b/src/rust/cpu2/instructions_0f.rs @@ -3816,8 +3816,50 @@ pub unsafe fn instr_660FC5_reg(mut r1: i32, mut r2: i32, mut imm8: i32) -> () { let mut result: u32 = data.u16_0[index as usize] as u32; write_reg32(r2, result as i32); } + #[no_mangle] -pub unsafe fn instr_0FC6() -> () { unimplemented_sse(); } +pub unsafe fn instr_0FC6(mut source: reg128, mut r: i32, mut imm8: i32) -> () { + c_comment!(("shufps xmm, xmm/mem128")); + c_comment!(("XXX: Aligned access or #gp")); + let mut destination: reg128 = read_xmm128s(r); + write_xmm128( + r, + destination.u32_0[(imm8 & 3i32) as usize] as i32, + destination.u32_0[(imm8 >> 2i32 & 3i32) as usize] as i32, + source.u32_0[(imm8 >> 4i32 & 3i32) as usize] as i32, + source.u32_0[(imm8 >> 6i32 & 3i32) as usize] as i32, + ); +} +#[no_mangle] +pub unsafe fn instr_0FC6_reg(mut r1: i32, mut r2: i32, mut imm: i32) -> () { + instr_0FC6(read_xmm128s(r1), r2, imm); +} +#[no_mangle] +pub unsafe fn instr_0FC6_mem(mut addr: i32, mut r: i32, mut imm: i32) -> () { + instr_0FC6(return_on_pagefault!(safe_read128s(addr)), r, imm); +} + +#[no_mangle] +pub unsafe fn instr_660FC6(mut source: reg128, mut r: i32, mut imm8: i32) -> () { + c_comment!(("shufpd xmm, xmm/mem128")); + let mut destination: reg128 = read_xmm128s(r); + let mut result: reg128 = reg128 { + i64_0: [ + destination.i64_0[imm8 as usize & 1], + source.i64_0[imm8 as usize >> 1 & 1], + ], + }; + write_xmm_reg128(r, result); +} +#[no_mangle] +pub unsafe fn instr_660FC6_reg(mut r1: i32, mut r2: i32, mut imm: i32) -> () { + instr_660FC6(read_xmm128s(r1), r2, imm); +} +#[no_mangle] +pub unsafe fn instr_660FC6_mem(mut addr: i32, mut r: i32, mut imm: i32) -> () { + instr_660FC6(return_on_pagefault!(safe_read128s(addr)), r, imm); +} + #[no_mangle] pub unsafe fn instr_0FC7_1_reg(mut r: i32) -> () { trigger_ud(); } #[no_mangle]