mirror of
https://github.com/copy/v86.git
synced 2025-12-31 04:23:15 +00:00
jit 0F{74,75,76} (pcmpeqb, pcmpeqw, pcmpeqd)
This commit is contained in:
parent
44c606f5a6
commit
c5ca3ca09e
3 changed files with 26 additions and 9 deletions
|
|
@ -789,11 +789,11 @@ const encodings = [
|
|||
{ sse: 1, opcode: 0x660F73, e: 1, fixed_g: 6, imm8: 1, mem_ud: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0x660F73, e: 1, fixed_g: 7, imm8: 1, mem_ud: 1, custom: 1 },
|
||||
|
||||
{ sse: 1, opcode: 0x0F74, e: 1, },
|
||||
{ sse: 1, opcode: 0x0F74, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0x660F74, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0x0F75, e: 1, },
|
||||
{ sse: 1, opcode: 0x0F75, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0x660F75, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0x0F76, e: 1, },
|
||||
{ sse: 1, opcode: 0x0F76, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0x660F76, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0x0F77, skip: 1 }, // emms (skip as it breaks gdb printing of float registers)
|
||||
|
||||
|
|
|
|||
|
|
@ -2891,6 +2891,8 @@ pub unsafe fn instr_660F73_7_reg(r: i32, imm8: i32) {
|
|||
}
|
||||
write_xmm_reg128(r, result);
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F74(source: u64, r: i32) {
|
||||
// pcmpeqb mm, mm/m64
|
||||
let destination: [u8; 8] = std::mem::transmute(read_mmx64s(r));
|
||||
|
|
@ -2902,9 +2904,7 @@ pub unsafe fn instr_0F74(source: u64, r: i32) {
|
|||
write_mmx_reg64(r, std::mem::transmute(result));
|
||||
transition_fpu_to_mmx();
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F74_reg(r1: i32, r2: i32) { instr_0F74(read_mmx64s(r1), r2); }
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F74_mem(addr: i32, r: i32) {
|
||||
instr_0F74(return_on_pagefault!(safe_read64s(addr)), r);
|
||||
}
|
||||
|
|
@ -2923,6 +2923,7 @@ pub unsafe fn instr_660F74_reg(r1: i32, r2: i32) { instr_660F74(read_xmm128s(r1)
|
|||
pub unsafe fn instr_660F74_mem(addr: i32, r: i32) {
|
||||
instr_660F74(return_on_pagefault!(safe_read128s(addr)), r);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F75(source: u64, r: i32) {
|
||||
// pcmpeqw mm, mm/m64
|
||||
let destination: [i16; 4] = std::mem::transmute(read_mmx64s(r));
|
||||
|
|
@ -2934,9 +2935,7 @@ pub unsafe fn instr_0F75(source: u64, r: i32) {
|
|||
write_mmx_reg64(r, std::mem::transmute(result));
|
||||
transition_fpu_to_mmx();
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F75_reg(r1: i32, r2: i32) { instr_0F75(read_mmx64s(r1), r2); }
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F75_mem(addr: i32, r: i32) {
|
||||
instr_0F75(return_on_pagefault!(safe_read64s(addr)), r);
|
||||
}
|
||||
|
|
@ -2956,6 +2955,7 @@ pub unsafe fn instr_660F75_reg(r1: i32, r2: i32) { instr_660F75(read_xmm128s(r1)
|
|||
pub unsafe fn instr_660F75_mem(addr: i32, r: i32) {
|
||||
instr_660F75(return_on_pagefault!(safe_read128s(addr)), r);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F76(source: u64, r: i32) {
|
||||
// pcmpeqd mm, mm/m64
|
||||
let destination: [i32; 2] = std::mem::transmute(read_mmx64s(r));
|
||||
|
|
@ -2967,9 +2967,7 @@ pub unsafe fn instr_0F76(source: u64, r: i32) {
|
|||
write_mmx_reg64(r, std::mem::transmute(result));
|
||||
transition_fpu_to_mmx();
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F76_reg(r1: i32, r2: i32) { instr_0F76(read_mmx64s(r1), r2); }
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F76_mem(addr: i32, r: i32) {
|
||||
instr_0F76(return_on_pagefault!(safe_read64s(addr)), r);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5844,6 +5844,25 @@ pub fn instr_660F73_7_reg_jit(ctx: &mut JitContext, r: u32, imm8: u32) {
|
|||
ctx.builder.call_fn2("instr_660F73_7_reg");
|
||||
}
|
||||
|
||||
pub fn instr_0F74_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
|
||||
mmx_read64_mm_mem(ctx, "instr_0F74", modrm_byte, r);
|
||||
}
|
||||
pub fn instr_0F74_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
|
||||
mmx_read64_mm_mm(ctx, "instr_0F74", r1, r2);
|
||||
}
|
||||
pub fn instr_0F75_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
|
||||
mmx_read64_mm_mem(ctx, "instr_0F75", modrm_byte, r);
|
||||
}
|
||||
pub fn instr_0F75_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
|
||||
mmx_read64_mm_mm(ctx, "instr_0F75", r1, r2);
|
||||
}
|
||||
pub fn instr_0F76_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
|
||||
mmx_read64_mm_mem(ctx, "instr_0F76", modrm_byte, r);
|
||||
}
|
||||
pub fn instr_0F76_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
|
||||
mmx_read64_mm_mm(ctx, "instr_0F76", r1, r2);
|
||||
}
|
||||
|
||||
pub fn instr_660F74_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
|
||||
sse_read128_xmm_mem(ctx, "instr_660F74", modrm_byte, r);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue