Browse Source

Fix jitted cmpss/cmppd/shufps/shufpd with the same source and destination register

Fabian 1 year ago
parent
commit
1135122f8a
2 changed files with 26 additions and 20 deletions
  1. 14 20
      src/rust/jit_instructions.rs
  2. 12 0
      tests/nasm/shufps-edgecase.asm

+ 14 - 20
src/rust/jit_instructions.rs

@@ -167,6 +167,16 @@ fn sse_read128_xmm_xmm(ctx: &mut JitContext, name: &str, r1: u32, r2: u32) {
     ctx.builder.const_i32(r2 as i32);
     ctx.builder.call_fn2(name);
 }
+fn sse_read128_xmm_xmm_imm(ctx: &mut JitContext, name: &str, r1: u32, r2: u32, imm: u32) {
+    // Make a copy to avoid aliasing problems: Called function expects a reg128, which must not
+    // alias with memory
+    codegen::gen_read_reg_xmm128_into_scratch(ctx, r1);
+    let dest = global_pointers::sse_scratch_register;
+    ctx.builder.const_i32(dest as i32);
+    ctx.builder.const_i32(r2 as i32);
+    ctx.builder.const_i32(imm as i32);
+    ctx.builder.call_fn3(name);
+}
 fn sse_mov_xmm_xmm(ctx: &mut JitContext, r1: u32, r2: u32) {
     ctx.builder
         .const_i32(global_pointers::get_reg_xmm_offset(r2) as i32);
@@ -5171,11 +5181,7 @@ pub fn instr32_0FC7_1_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte) {
 pub fn instr32_0FC7_1_reg_jit(ctx: &mut JitContext, _r: u32) { codegen::gen_trigger_ud(ctx); }
 
 pub fn instr_0FC2_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32, imm8: u32) {
-    let dest = global_pointers::get_reg_xmm_offset(r1);
-    ctx.builder.const_i32(dest as i32);
-    ctx.builder.const_i32(r2 as i32);
-    ctx.builder.const_i32(imm8 as i32);
-    ctx.builder.call_fn3("instr_0FC2");
+    sse_read128_xmm_xmm_imm(ctx, "instr_0FC2", r1, r2, imm8)
 }
 pub fn instr_0FC2_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32, imm8: u32) {
     let dest = global_pointers::sse_scratch_register as u32;
@@ -5186,11 +5192,7 @@ pub fn instr_0FC2_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32, i
     ctx.builder.call_fn3("instr_0FC2");
 }
 pub fn instr_660FC2_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32, imm8: u32) {
-    let dest = global_pointers::get_reg_xmm_offset(r1);
-    ctx.builder.const_i32(dest as i32);
-    ctx.builder.const_i32(r2 as i32);
-    ctx.builder.const_i32(imm8 as i32);
-    ctx.builder.call_fn3("instr_660FC2");
+    sse_read128_xmm_xmm_imm(ctx, "instr_660FC2", r1, r2, imm8)
 }
 pub fn instr_660FC2_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32, imm8: u32) {
     let dest = global_pointers::sse_scratch_register as u32;
@@ -5230,11 +5232,7 @@ pub fn instr_F30FC2_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32,
 }
 
 pub fn instr_0FC6_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32, imm8: u32) {
-    let dest = global_pointers::get_reg_xmm_offset(r1);
-    ctx.builder.const_i32(dest as i32);
-    ctx.builder.const_i32(r2 as i32);
-    ctx.builder.const_i32(imm8 as i32);
-    ctx.builder.call_fn3("instr_0FC6");
+    sse_read128_xmm_xmm_imm(ctx, "instr_0FC6", r1, r2, imm8)
 }
 pub fn instr_0FC6_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32, imm8: u32) {
     let dest = global_pointers::sse_scratch_register as u32;
@@ -5245,11 +5243,7 @@ pub fn instr_0FC6_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32, i
     ctx.builder.call_fn3("instr_0FC6");
 }
 pub fn instr_660FC6_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32, imm8: u32) {
-    let dest = global_pointers::get_reg_xmm_offset(r1);
-    ctx.builder.const_i32(dest as i32);
-    ctx.builder.const_i32(r2 as i32);
-    ctx.builder.const_i32(imm8 as i32);
-    ctx.builder.call_fn3("instr_660FC6");
+    sse_read128_xmm_xmm_imm(ctx, "instr_660FC6", r1, r2, imm8)
 }
 pub fn instr_660FC6_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, r: u32, imm8: u32) {
     let dest = global_pointers::sse_scratch_register as u32;

+ 12 - 0
tests/nasm/shufps-edgecase.asm

@@ -0,0 +1,12 @@
+global _start
+
+%include "header.inc"
+
+    mov dword [esp+0], 1
+    mov dword [esp+4], 2
+    mov dword [esp+8], 3
+    mov dword [esp+12], 4
+    movdqu xmm3, [esp]
+    shufps xmm3, xmm3, 0x32
+
+%include "footer.inc"