Browse Source

Fix flags in cmpxchg in jit

Fabian 1 year ago
parent
commit
e50d4fa5a8
2 changed files with 22 additions and 1 deletions
  1. 12 1
      src/rust/jit_instructions.rs
  2. 10 0
      tests/nasm/cmpxchg-setbe.asm

+ 12 - 1
src/rust/jit_instructions.rs

@@ -1649,7 +1649,18 @@ fn gen_xadd32(ctx: &mut JitContext, dest_operand: &WasmLocal, r: u32) {
 
 fn gen_cmpxchg32(ctx: &mut JitContext, r: u32) {
     let source = ctx.builder.set_new_local();
-    gen_cmp32(ctx, &ctx.reg(0), &LocalOrImmediate::WasmLocal(&source));
+
+    ctx.builder.const_i32(global_pointers::last_result as i32);
+    codegen::gen_get_reg32(ctx, 0);
+    ctx.builder.get_local(&source);
+    ctx.builder.sub_i32();
+    ctx.builder.store_aligned_i32(0);
+
+    ctx.builder.const_i32(global_pointers::last_op1 as i32);
+    codegen::gen_get_reg32(ctx, 0);
+    ctx.builder.store_aligned_i32(0);
+    codegen::gen_set_last_op_size(ctx.builder, OPSIZE_32);
+    codegen::gen_set_flags_changed(ctx.builder, FLAGS_ALL | FLAG_SUB);
 
     ctx.builder.get_local(&ctx.register_locals[0]);
     ctx.builder.get_local(&source);

+ 10 - 0
tests/nasm/cmpxchg-setbe.asm

@@ -0,0 +1,10 @@
+global _start
+
+%include "header.inc"
+
+    mov eax, 1
+    mov edx, 2
+    cmpxchg eax, edx
+    setbe  cl
+
+%include "footer.inc"