Re: [PATCH bpf-next] bpf,x64: Factor out emission of REX byte in more cases

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Oct 6, 2021 at 12:43 PM Jie Meng <jmeng@xxxxxx> wrote:
>
> Introduce a single reg version of maybe_emit_mod() and factor out
> common code in more cases.
>
> Signed-off-by: Jie Meng <jmeng@xxxxxx>

Acked-by: Song Liu <songliubraving@xxxxxx>

> ---
>  arch/x86/net/bpf_jit_comp.c | 67 +++++++++++++++++--------------------
>  1 file changed, 31 insertions(+), 36 deletions(-)
>
> diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c
> index 5a0edea3cc2e..e474718d152b 100644
> --- a/arch/x86/net/bpf_jit_comp.c
> +++ b/arch/x86/net/bpf_jit_comp.c
> @@ -721,6 +721,20 @@ static void maybe_emit_mod(u8 **pprog, u32 dst_reg, u32 src_reg, bool is64)
>         *pprog = prog;
>  }
>
> +/*
> + * Similar version of maybe_emit_mod() for a single register
> + */
> +static void maybe_emit_1mod(u8 **pprog, u32 reg, bool is64)
> +{
> +       u8 *prog = *pprog;
> +
> +       if (is64)
> +               EMIT1(add_1mod(0x48, reg));
> +       else if (is_ereg(reg))
> +               EMIT1(add_1mod(0x40, reg));
> +       *pprog = prog;
> +}
> +
>  /* LDX: dst_reg = *(u8*)(src_reg + off) */
>  static void emit_ldx(u8 **pprog, u32 size, u32 dst_reg, u32 src_reg, int off)
>  {
> @@ -951,10 +965,8 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
>                         /* neg dst */
>                 case BPF_ALU | BPF_NEG:
>                 case BPF_ALU64 | BPF_NEG:
> -                       if (BPF_CLASS(insn->code) == BPF_ALU64)
> -                               EMIT1(add_1mod(0x48, dst_reg));
> -                       else if (is_ereg(dst_reg))
> -                               EMIT1(add_1mod(0x40, dst_reg));
> +                       maybe_emit_1mod(&prog, dst_reg,
> +                                       BPF_CLASS(insn->code) == BPF_ALU64);
>                         EMIT2(0xF7, add_1reg(0xD8, dst_reg));
>                         break;
>
> @@ -968,10 +980,8 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
>                 case BPF_ALU64 | BPF_AND | BPF_K:
>                 case BPF_ALU64 | BPF_OR | BPF_K:
>                 case BPF_ALU64 | BPF_XOR | BPF_K:
> -                       if (BPF_CLASS(insn->code) == BPF_ALU64)
> -                               EMIT1(add_1mod(0x48, dst_reg));
> -                       else if (is_ereg(dst_reg))
> -                               EMIT1(add_1mod(0x40, dst_reg));
> +                       maybe_emit_1mod(&prog, dst_reg,
> +                                       BPF_CLASS(insn->code) == BPF_ALU64);
>
>                         /*
>                          * b3 holds 'normal' opcode, b2 short form only valid
> @@ -1059,11 +1069,8 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
>                          */
>                         EMIT2(0x31, 0xd2);
>
> -                       if (is64)
> -                               EMIT1(add_1mod(0x48, src_reg));
> -                       else if (is_ereg(src_reg))
> -                               EMIT1(add_1mod(0x40, src_reg));
>                         /* div src_reg */
> +                       maybe_emit_1mod(&prog, src_reg, is64);
>                         EMIT2(0xF7, add_1reg(0xF0, src_reg));
>
>                         if (BPF_OP(insn->code) == BPF_MOD &&
> @@ -1084,10 +1091,8 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
>
>                 case BPF_ALU | BPF_MUL | BPF_K:
>                 case BPF_ALU64 | BPF_MUL | BPF_K:
> -                       if (BPF_CLASS(insn->code) == BPF_ALU64)
> -                               EMIT1(add_2mod(0x48, dst_reg, dst_reg));
> -                       else if (is_ereg(dst_reg))
> -                               EMIT1(add_2mod(0x40, dst_reg, dst_reg));
> +                       maybe_emit_mod(&prog, dst_reg, dst_reg,
> +                                      BPF_CLASS(insn->code) == BPF_ALU64);
>
>                         if (is_imm8(imm32))
>                                 /* imul dst_reg, dst_reg, imm8 */
> @@ -1102,10 +1107,8 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
>
>                 case BPF_ALU | BPF_MUL | BPF_X:
>                 case BPF_ALU64 | BPF_MUL | BPF_X:
> -                       if (BPF_CLASS(insn->code) == BPF_ALU64)
> -                               EMIT1(add_2mod(0x48, src_reg, dst_reg));
> -                       else if (is_ereg(dst_reg) || is_ereg(src_reg))
> -                               EMIT1(add_2mod(0x40, src_reg, dst_reg));
> +                       maybe_emit_mod(&prog, src_reg, dst_reg,
> +                                      BPF_CLASS(insn->code) == BPF_ALU64);
>
>                         /* imul dst_reg, src_reg */
>                         EMIT3(0x0F, 0xAF, add_2reg(0xC0, src_reg, dst_reg));
> @@ -1118,10 +1121,8 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
>                 case BPF_ALU64 | BPF_LSH | BPF_K:
>                 case BPF_ALU64 | BPF_RSH | BPF_K:
>                 case BPF_ALU64 | BPF_ARSH | BPF_K:
> -                       if (BPF_CLASS(insn->code) == BPF_ALU64)
> -                               EMIT1(add_1mod(0x48, dst_reg));
> -                       else if (is_ereg(dst_reg))
> -                               EMIT1(add_1mod(0x40, dst_reg));
> +                       maybe_emit_1mod(&prog, dst_reg,
> +                                       BPF_CLASS(insn->code) == BPF_ALU64);
>
>                         b3 = simple_alu_opcodes[BPF_OP(insn->code)];
>                         if (imm32 == 1)
> @@ -1152,10 +1153,8 @@ static int do_jit(struct bpf_prog *bpf_prog, int *addrs, u8 *image,
>                         }
>
>                         /* shl %rax, %cl | shr %rax, %cl | sar %rax, %cl */
> -                       if (BPF_CLASS(insn->code) == BPF_ALU64)
> -                               EMIT1(add_1mod(0x48, dst_reg));
> -                       else if (is_ereg(dst_reg))
> -                               EMIT1(add_1mod(0x40, dst_reg));
> +                       maybe_emit_1mod(&prog, dst_reg,
> +                                       BPF_CLASS(insn->code) == BPF_ALU64);
>
>                         b3 = simple_alu_opcodes[BPF_OP(insn->code)];
>                         EMIT2(0xD3, add_1reg(b3, dst_reg));
> @@ -1465,10 +1464,8 @@ st:                      if (is_imm8(insn->off))
>                 case BPF_JMP | BPF_JSET | BPF_K:
>                 case BPF_JMP32 | BPF_JSET | BPF_K:
>                         /* test dst_reg, imm32 */
> -                       if (BPF_CLASS(insn->code) == BPF_JMP)
> -                               EMIT1(add_1mod(0x48, dst_reg));
> -                       else if (is_ereg(dst_reg))
> -                               EMIT1(add_1mod(0x40, dst_reg));
> +                       maybe_emit_1mod(&prog, dst_reg,
> +                                       BPF_CLASS(insn->code) == BPF_JMP);
>                         EMIT2_off32(0xF7, add_1reg(0xC0, dst_reg), imm32);
>                         goto emit_cond_jmp;
>
> @@ -1501,10 +1498,8 @@ st:                      if (is_imm8(insn->off))
>                         }
>
>                         /* cmp dst_reg, imm8/32 */
> -                       if (BPF_CLASS(insn->code) == BPF_JMP)
> -                               EMIT1(add_1mod(0x48, dst_reg));
> -                       else if (is_ereg(dst_reg))
> -                               EMIT1(add_1mod(0x40, dst_reg));
> +                       maybe_emit_1mod(&prog, dst_reg,
> +                                       BPF_CLASS(insn->code) == BPF_JMP);
>
>                         if (is_imm8(imm32))
>                                 EMIT3(0x83, add_1reg(0xF8, dst_reg), imm32);
> --
> 2.30.2
>



[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux