jit {,66,F2,F3}0F{5A,5B} (cvtps2pd, cvtpd2ps, cvtss2sd, cvtsd2ss, cvtdq2ps, cvtps2dq, cvttps2dq)
This commit is contained in:
parent
c5ca3ca09e
commit
a0c4c32352
|
@ -701,14 +701,14 @@ const encodings = [
|
|||
{ sse: 1, opcode: 0xF20F59, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0xF30F59, e: 1, custom: 1 },
|
||||
|
||||
{ sse: 1, opcode: 0x0F5A, e: 1, },
|
||||
{ sse: 1, opcode: 0x660F5A, e: 1, },
|
||||
{ sse: 1, opcode: 0xF20F5A, e: 1, },
|
||||
{ sse: 1, opcode: 0xF30F5A, e: 1, },
|
||||
{ sse: 1, opcode: 0x0F5B, e: 1, },
|
||||
{ sse: 1, opcode: 0x660F5B, e: 1, },
|
||||
{ sse: 1, opcode: 0x0F5A, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0x660F5A, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0xF20F5A, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0xF30F5A, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0x0F5B, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0x660F5B, e: 1, custom: 1 },
|
||||
// no F2 variant
|
||||
{ sse: 1, opcode: 0xF30F5B, e: 1, },
|
||||
{ sse: 1, opcode: 0xF30F5B, e: 1, custom: 1 },
|
||||
|
||||
{ sse: 1, opcode: 0x0F5C, e: 1, custom: 1 },
|
||||
{ sse: 1, opcode: 0x660F5C, e: 1, custom: 1 },
|
||||
|
|
|
@ -1876,6 +1876,7 @@ pub unsafe fn instr_F30F59_mem(addr: i32, r: i32) {
|
|||
instr_F30F59(return_on_pagefault!(safe_read_f32(addr)), r);
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F5A(source: u64, r: i32) {
|
||||
// cvtps2pd xmm1, xmm2/m64
|
||||
let source: [f32; 2] = std::mem::transmute(source);
|
||||
|
@ -1884,12 +1885,11 @@ pub unsafe fn instr_0F5A(source: u64, r: i32) {
|
|||
};
|
||||
write_xmm_reg128(r, result);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F5A_reg(r1: i32, r2: i32) { instr_0F5A(read_xmm64s(r1), r2); }
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F5A_mem(addr: i32, r: i32) {
|
||||
instr_0F5A(return_on_pagefault!(safe_read64s(addr)), r);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_660F5A(source: reg128, r: i32) {
|
||||
// cvtpd2ps xmm1, xmm2/m128
|
||||
let result = reg128 {
|
||||
|
@ -1898,34 +1898,31 @@ pub unsafe fn instr_660F5A(source: reg128, r: i32) {
|
|||
};
|
||||
write_xmm_reg128(r, result);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_660F5A_reg(r1: i32, r2: i32) { instr_660F5A(read_xmm128s(r1), r2); }
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_660F5A_mem(addr: i32, r: i32) {
|
||||
instr_660F5A(return_on_pagefault!(safe_read128s(addr)), r);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_F20F5A(source: u64, r: i32) {
|
||||
// cvtsd2ss xmm1, xmm2/m64
|
||||
// XXX: This conversions is lossy and should round according to the round control
|
||||
write_xmm_f32(r, f64::from_bits(source) as f32);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_F20F5A_reg(r1: i32, r2: i32) { instr_F20F5A(read_xmm64s(r1), r2); }
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_F20F5A_mem(addr: i32, r: i32) {
|
||||
instr_F20F5A(return_on_pagefault!(safe_read64s(addr)), r);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_F30F5A(source: f32, r: i32) {
|
||||
// cvtss2sd xmm1, xmm2/m32
|
||||
write_xmm_f64(r, source as f64);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_F30F5A_reg(r1: i32, r2: i32) { instr_F30F5A(read_xmm_f32(r1), r2); }
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_F30F5A_mem(addr: i32, r: i32) {
|
||||
instr_F30F5A(return_on_pagefault!(safe_read_f32(addr)), r);
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F5B(source: reg128, r: i32) {
|
||||
// cvtdq2ps xmm1, xmm2/m128
|
||||
// XXX: Should round according to round control
|
||||
|
@ -1940,12 +1937,11 @@ pub unsafe fn instr_0F5B(source: reg128, r: i32) {
|
|||
};
|
||||
write_xmm_reg128(r, result);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F5B_reg(r1: i32, r2: i32) { instr_0F5B(read_xmm128s(r1), r2); }
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_0F5B_mem(addr: i32, r: i32) {
|
||||
instr_0F5B(return_on_pagefault!(safe_read128s(addr)), r);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_660F5B(source: reg128, r: i32) {
|
||||
// cvtps2dq xmm1, xmm2/m128
|
||||
let result = reg128 {
|
||||
|
@ -1959,12 +1955,11 @@ pub unsafe fn instr_660F5B(source: reg128, r: i32) {
|
|||
};
|
||||
write_xmm_reg128(r, result);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_660F5B_reg(r1: i32, r2: i32) { instr_660F5B(read_xmm128s(r1), r2); }
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_660F5B_mem(addr: i32, r: i32) {
|
||||
instr_660F5B(return_on_pagefault!(safe_read128s(addr)), r);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_F30F5B(source: reg128, r: i32) {
|
||||
// cvttps2dq xmm1, xmm2/m128
|
||||
let result = reg128 {
|
||||
|
@ -1977,9 +1972,7 @@ pub unsafe fn instr_F30F5B(source: reg128, r: i32) {
|
|||
};
|
||||
write_xmm_reg128(r, result);
|
||||
}
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_F30F5B_reg(r1: i32, r2: i32) { instr_F30F5B(read_xmm128s(r1), r2); }
|
||||
#[no_mangle]
|
||||
pub unsafe fn instr_F30F5B_mem(addr: i32, r: i32) {
|
||||
instr_F30F5B(return_on_pagefault!(safe_read128s(addr)), r);
|
||||
}
|
||||
|
|
|
@ -5324,6 +5324,50 @@ pub fn instr_F30F59_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
|
|||
sse_read_f32_xmm_xmm(ctx, "instr_F30F59", r1, r2);
|
||||
}
|
||||
|
||||
pub fn instr_0F5A_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
|
||||
sse_read64_xmm_mem(ctx, "instr_0F5A", modrm_byte, r);
|
||||
}
|
||||
pub fn instr_0F5A_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
|
||||
sse_read64_xmm_xmm(ctx, "instr_0F5A", r1, r2);
|
||||
}
|
||||
pub fn instr_660F5A_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
|
||||
sse_read128_xmm_mem(ctx, "instr_660F5A", modrm_byte, r);
|
||||
}
|
||||
pub fn instr_660F5A_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
|
||||
sse_read128_xmm_xmm(ctx, "instr_660F5A", r1, r2);
|
||||
}
|
||||
pub fn instr_F20F5A_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
|
||||
sse_read64_xmm_mem(ctx, "instr_F20F5A", modrm_byte, r);
|
||||
}
|
||||
pub fn instr_F20F5A_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
|
||||
sse_read64_xmm_xmm(ctx, "instr_F20F5A", r1, r2);
|
||||
}
|
||||
pub fn instr_F30F5A_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
|
||||
sse_read_f32_xmm_mem(ctx, "instr_F30F5A", modrm_byte, r);
|
||||
}
|
||||
pub fn instr_F30F5A_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
|
||||
sse_read_f32_xmm_xmm(ctx, "instr_F30F5A", r1, r2);
|
||||
}
|
||||
|
||||
pub fn instr_0F5B_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
|
||||
sse_read128_xmm_mem(ctx, "instr_0F5B", modrm_byte, r);
|
||||
}
|
||||
pub fn instr_0F5B_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
|
||||
sse_read128_xmm_xmm(ctx, "instr_0F5B", r1, r2);
|
||||
}
|
||||
pub fn instr_660F5B_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
|
||||
sse_read128_xmm_mem(ctx, "instr_660F5B", modrm_byte, r);
|
||||
}
|
||||
pub fn instr_660F5B_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
|
||||
sse_read128_xmm_xmm(ctx, "instr_660F5B", r1, r2);
|
||||
}
|
||||
pub fn instr_F30F5B_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
|
||||
sse_read128_xmm_mem(ctx, "instr_F30F5B", modrm_byte, r);
|
||||
}
|
||||
pub fn instr_F30F5B_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
|
||||
sse_read128_xmm_xmm(ctx, "instr_F30F5B", r1, r2);
|
||||
}
|
||||
|
||||
pub fn instr_0F5C_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
|
||||
sse_read128_xmm_mem(ctx, "instr_0F5C", modrm_byte, r);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue