jit {F2,F3}0F2A (cvtsi2ss, cvtsi2sd)

This commit is contained in:
Fabian 2021-04-04 23:32:06 -05:00
parent 2b2d22f6d3
commit 2a22980cf7
3 changed files with 24 additions and 6 deletions

View file

@ -649,8 +649,8 @@ const encodings = [
{ sse: 1, opcode: 0x660F29, e: 1, custom: 1 },
{ sse: 1, opcode: 0x0F2A, e: 1, custom: 1 },
{ sse: 1, opcode: 0x660F2A, e: 1, custom: 1 },
{ sse: 1, opcode: 0xF20F2A, e: 1, },
{ sse: 1, opcode: 0xF30F2A, e: 1, },
{ sse: 1, opcode: 0xF20F2A, e: 1, custom: 1 },
{ sse: 1, opcode: 0xF30F2A, e: 1, custom: 1 },
{ sse: 1, opcode: 0x0F2B, reg_ud: 1, e: 1, custom: 1 },
{ sse: 1, opcode: 0x660F2B, reg_ud: 1, e: 1, custom: 1 },

View file

@ -929,17 +929,17 @@ pub unsafe fn instr_660F2A_reg(r1: i32, r2: i32) { instr_660F2A(read_mmx64s(r1),
pub unsafe fn instr_660F2A_mem(addr: i32, r: i32) {
instr_660F2A(return_on_pagefault!(safe_read64s(addr)), r);
}
#[no_mangle]
pub unsafe fn instr_F20F2A(source: i32, r: i32) {
// cvtsi2sd xmm, r32/m32
// This cast can't fail
write_xmm_f64(r, source as f64);
}
#[no_mangle]
pub unsafe fn instr_F20F2A_reg(r1: i32, r2: i32) { instr_F20F2A(read_reg32(r1), r2); }
#[no_mangle]
pub unsafe fn instr_F20F2A_mem(addr: i32, r: i32) {
instr_F20F2A(return_on_pagefault!(safe_read32s(addr)), r);
}
#[no_mangle]
pub unsafe fn instr_F30F2A(source: i32, r: i32) {
// cvtsi2ss xmm, r/m32
// Note: This cast can fail
@ -947,9 +947,7 @@ pub unsafe fn instr_F30F2A(source: i32, r: i32) {
let result = source as f32;
write_xmm_f32(r, result);
}
#[no_mangle]
pub unsafe fn instr_F30F2A_reg(r1: i32, r2: i32) { instr_F30F2A(read_reg32(r1), r2); }
#[no_mangle]
pub unsafe fn instr_F30F2A_mem(addr: i32, r: i32) {
instr_F30F2A(return_on_pagefault!(safe_read32s(addr)), r);
}

View file

@ -5112,6 +5112,26 @@ pub fn instr_660F2A_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32)
pub fn instr_660F2A_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
mmx_read64_mm_mm(ctx, "instr_660F2A", r1, r2);
}
pub fn instr_F20F2A_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
codegen::gen_modrm_resolve_safe_read32(ctx, modrm_byte);
ctx.builder.const_i32(r as i32);
ctx.builder.call_fn2("instr_F20F2A")
}
pub fn instr_F20F2A_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
codegen::gen_get_reg32(ctx, r1);
ctx.builder.const_i32(r2 as i32);
ctx.builder.call_fn2("instr_F20F2A")
}
pub fn instr_F30F2A_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
codegen::gen_modrm_resolve_safe_read32(ctx, modrm_byte);
ctx.builder.const_i32(r as i32);
ctx.builder.call_fn2("instr_F30F2A")
}
pub fn instr_F30F2A_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
codegen::gen_get_reg32(ctx, r1);
ctx.builder.const_i32(r2 as i32);
ctx.builder.call_fn2("instr_F30F2A")
}
pub fn instr_0F2B_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
instr_0F29_mem_jit(ctx, modrm_byte, r)