jit: generate code for punpckldq (660f62)

This commit is contained in:
Fabian 2022-11-22 16:40:07 -06:00
parent de2a1439aa
commit 3ed118e790
2 changed files with 34 additions and 3 deletions

View file

@ -2229,7 +2229,6 @@ pub unsafe fn instr_0F62_reg(r1: i32, r2: i32) { instr_0F62(read_mmx32s(r1), r2)
pub unsafe fn instr_0F62_mem(addr: i32, r: i32) {
instr_0F62(return_on_pagefault!(safe_read32s(addr)), r);
}
#[no_mangle]
pub unsafe fn instr_660F62(source: reg128, r: i32) {
// punpckldq xmm, xmm/m128
// XXX: Aligned access or #gp

View file

@ -6378,10 +6378,42 @@ pub fn instr_660F61_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
sse_read128_xmm_xmm(ctx, "instr_660F61", r1, r2);
}
pub fn instr_660F62_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
sse_read128_xmm_mem(ctx, "instr_660F62", modrm_byte, r);
let src = global_pointers::sse_scratch_register as u32;
codegen::gen_modrm_resolve_safe_read128(ctx, modrm_byte, src);
ctx.builder.const_i32(0);
ctx.builder.load_fixed_i32(src + 4);
ctx.builder
.store_aligned_i32(global_pointers::get_reg_xmm_offset(r) + 12);
ctx.builder.const_i32(0);
ctx.builder
.load_fixed_i32(global_pointers::get_reg_xmm_offset(r) + 4);
ctx.builder
.store_aligned_i32(global_pointers::get_reg_xmm_offset(r) + 8);
ctx.builder.const_i32(0);
ctx.builder.load_fixed_i32(src + 0);
ctx.builder
.store_aligned_i32(global_pointers::get_reg_xmm_offset(r) + 4);
}
pub fn instr_660F62_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
sse_read128_xmm_xmm(ctx, "instr_660F62", r1, r2);
ctx.builder.const_i32(0);
ctx.builder
.load_fixed_i32(global_pointers::get_reg_xmm_offset(r1) + 4);
ctx.builder
.store_aligned_i32(global_pointers::get_reg_xmm_offset(r2) + 12);
ctx.builder.const_i32(0);
ctx.builder
.load_fixed_i32(global_pointers::get_reg_xmm_offset(r2) + 4);
ctx.builder
.store_aligned_i32(global_pointers::get_reg_xmm_offset(r2) + 8);
ctx.builder.const_i32(0);
ctx.builder
.load_fixed_i32(global_pointers::get_reg_xmm_offset(r1) + 0);
ctx.builder
.store_aligned_i32(global_pointers::get_reg_xmm_offset(r2) + 4);
}
pub fn instr_660F63_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32) {
sse_read128_xmm_mem(ctx, "instr_660F63", modrm_byte, r);