Bläddra i källkod

Minor optimisation for bt{,s,r,c} with zero offset

Fabian 3 år sedan
förälder
incheckning
c430c1141c
1 ändrade filer med 16 tillägg och 7 borttagningar
  1. 16 7
      src/rust/jit_instructions.rs

+ 16 - 7
src/rust/jit_instructions.rs

@@ -1953,9 +1953,12 @@ fn gen_bit_rmw(
             ctx.builder.shr_s_i32();
             ctx.builder.add_i32();
         },
-        LocalOrImmediate::Immediate(imm8) => {
-            ctx.builder.const_i32((*imm8 as i32 & (opsize - 1)) >> 3);
-            ctx.builder.add_i32();
+        &LocalOrImmediate::Immediate(imm8) => {
+            let offset = (imm8 as i32 & (opsize - 1)) >> 3;
+            if offset != 0 {
+                ctx.builder.const_i32(offset);
+                ctx.builder.add_i32();
+            }
         },
     }
     let address_local = ctx.builder.set_new_local();
@@ -6704,8 +6707,11 @@ pub fn instr16_0FBA_4_reg_jit(ctx: &mut JitContext, r: u32, imm8: u32) {
 }
 pub fn instr16_0FBA_4_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, imm8: u32) {
     codegen::gen_modrm_resolve(ctx, modrm_byte);
-    ctx.builder.const_i32((imm8 as i32 & 15) >> 3);
-    ctx.builder.add_i32();
+    let offset = (imm8 as i32 & 15) >> 3;
+    if offset != 0 {
+        ctx.builder.const_i32(offset);
+        ctx.builder.add_i32();
+    }
     let address_local = ctx.builder.set_new_local();
     codegen::gen_safe_read8(ctx, &address_local);
     ctx.builder.free_local(address_local);
@@ -6728,8 +6734,11 @@ pub fn instr32_0FBA_4_reg_jit(ctx: &mut JitContext, r: u32, imm8: u32) {
 }
 pub fn instr32_0FBA_4_mem_jit(ctx: &mut JitContext, modrm_byte: ModrmByte, imm8: u32) {
     codegen::gen_modrm_resolve(ctx, modrm_byte);
-    ctx.builder.const_i32((imm8 as i32 & 31) >> 3);
-    ctx.builder.add_i32();
+    let offset = (imm8 as i32 & 31) >> 3;
+    if offset != 0 {
+        ctx.builder.const_i32(offset);
+        ctx.builder.add_i32();
+    }
     let address_local = ctx.builder.set_new_local();
     codegen::gen_safe_read8(ctx, &address_local);
     ctx.builder.free_local(address_local);