Commit cadaecd2 authored by Denis Kirjanov's avatar Denis Kirjanov Committed by David S. Miller

PPC: bpf_jit_comp: Unify BPF_MOD | BPF_X and BPF_DIV | BPF_X

Reduce duplicated code by unifying
BPF_ALU | BPF_MOD | BPF_X and BPF_ALU | BPF_DIV | BPF_X

CC: Alexei Starovoitov<alexei.starovoitov@gmail.com>
CC: Daniel Borkmann<dborkman@redhat.com>
CC: Philippe Bergheaud<felix@linux.vnet.ibm.com>
Signed-off-by: default avatarDenis Kirjanov <kda@linux-powerpc.org>
Acked-by: default avatarAlexei Starovoitov <ast@plumgrid.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 65622ed4
...@@ -181,6 +181,7 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, ...@@ -181,6 +181,7 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
} }
break; break;
case BPF_ALU | BPF_MOD | BPF_X: /* A %= X; */ case BPF_ALU | BPF_MOD | BPF_X: /* A %= X; */
case BPF_ALU | BPF_DIV | BPF_X: /* A /= X; */
ctx->seen |= SEEN_XREG; ctx->seen |= SEEN_XREG;
PPC_CMPWI(r_X, 0); PPC_CMPWI(r_X, 0);
if (ctx->pc_ret0 != -1) { if (ctx->pc_ret0 != -1) {
...@@ -190,9 +191,13 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, ...@@ -190,9 +191,13 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
PPC_LI(r_ret, 0); PPC_LI(r_ret, 0);
PPC_JMP(exit_addr); PPC_JMP(exit_addr);
} }
PPC_DIVWU(r_scratch1, r_A, r_X); if (code == (BPF_ALU | BPF_MOD | BPF_X)) {
PPC_MUL(r_scratch1, r_X, r_scratch1); PPC_DIVWU(r_scratch1, r_A, r_X);
PPC_SUB(r_A, r_A, r_scratch1); PPC_MUL(r_scratch1, r_X, r_scratch1);
PPC_SUB(r_A, r_A, r_scratch1);
} else {
PPC_DIVWU(r_A, r_A, r_X);
}
break; break;
case BPF_ALU | BPF_MOD | BPF_K: /* A %= K; */ case BPF_ALU | BPF_MOD | BPF_K: /* A %= K; */
PPC_LI32(r_scratch2, K); PPC_LI32(r_scratch2, K);
...@@ -200,22 +205,6 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, ...@@ -200,22 +205,6 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
PPC_MUL(r_scratch1, r_scratch2, r_scratch1); PPC_MUL(r_scratch1, r_scratch2, r_scratch1);
PPC_SUB(r_A, r_A, r_scratch1); PPC_SUB(r_A, r_A, r_scratch1);
break; break;
case BPF_ALU | BPF_DIV | BPF_X: /* A /= X; */
ctx->seen |= SEEN_XREG;
PPC_CMPWI(r_X, 0);
if (ctx->pc_ret0 != -1) {
PPC_BCC(COND_EQ, addrs[ctx->pc_ret0]);
} else {
/*
* Exit, returning 0; first pass hits here
* (longer worst-case code size).
*/
PPC_BCC_SHORT(COND_NE, (ctx->idx*4)+12);
PPC_LI(r_ret, 0);
PPC_JMP(exit_addr);
}
PPC_DIVWU(r_A, r_A, r_X);
break;
case BPF_ALU | BPF_DIV | BPF_K: /* A /= K */ case BPF_ALU | BPF_DIV | BPF_K: /* A /= K */
if (K == 1) if (K == 1)
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment