ARM: net: bpf: improve 64-bit sign-extended immediate load
authorRussell King <rmk+kernel@armlinux.org.uk>
Thu, 12 Jul 2018 20:50:46 +0000 (21:50 +0100)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 13 Jul 2018 13:26:41 +0000 (15:26 +0200)
Improve the 64-bit sign-extended immediate from:

  mov     r6, #1
  str     r6, [fp, #-52]  ; 0xffffffcc
  mov     r6, #0
  str     r6, [fp, #-48]  ; 0xffffffd0

to:

  mov     r6, #1
  mov     r7, #0
  strd    r6, [fp, #-52]  ; 0xffffffcc

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
arch/arm/net/bpf_jit_32.c

index 6558bd73bbb98847a070467d7ad105f7d7673016..3a182e618441a45a77c95cc1b890fb9e79e57896 100644 (file)
@@ -613,12 +613,11 @@ static void emit_a32_mov_i64(const s8 dst[], u64 val, struct jit_ctx *ctx)
 /* Sign extended move */
 static inline void emit_a32_mov_se_i64(const bool is64, const s8 dst[],
                                       const u32 val, struct jit_ctx *ctx) {
-       u32 hi = 0;
+       u64 val64 = val;
 
        if (is64 && (val & (1<<31)))
-               hi = (u32)~0;
-       emit_a32_mov_i(dst_lo, val, ctx);
-       emit_a32_mov_i(dst_hi, hi, ctx);
+               val64 |= 0xffffffff00000000ULL;
+       emit_a32_mov_i64(dst, val64, ctx);
 }
 
 static inline void emit_a32_add_r(const u8 dst, const u8 src,