]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
PPC: bpf_jit_comp: Unify BPF_MOD | BPF_X and BPF_DIV | BPF_X
authorDenis Kirjanov <kda@linux-powerpc.org>
Mon, 17 Nov 2014 20:07:41 +0000 (23:07 +0300)
committerDavid S. Miller <davem@davemloft.net>
Tue, 18 Nov 2014 18:20:09 +0000 (13:20 -0500)
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: Denis Kirjanov <kda@linux-powerpc.org>
Acked-by: Alexei Starovoitov <ast@plumgrid.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/powerpc/net/bpf_jit_comp.c

index d3fa80d04e6b54a675d90dd217dc831226b583f7..1ca125b9c226070eefca744857b203648055b131 100644 (file)
@@ -181,6 +181,7 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
                        }
                        break;
                case BPF_ALU | BPF_MOD | BPF_X: /* A %= X; */
+               case BPF_ALU | BPF_DIV | BPF_X: /* A /= X; */
                        ctx->seen |= SEEN_XREG;
                        PPC_CMPWI(r_X, 0);
                        if (ctx->pc_ret0 != -1) {
@@ -190,9 +191,13 @@ static int bpf_jit_build_body(struct bpf_prog *fp, u32 *image,
                                PPC_LI(r_ret, 0);
                                PPC_JMP(exit_addr);
                        }
-                       PPC_DIVWU(r_scratch1, r_A, r_X);
-                       PPC_MUL(r_scratch1, r_X, r_scratch1);
-                       PPC_SUB(r_A, r_A, r_scratch1);
+                       if (code == (BPF_ALU | BPF_MOD | BPF_X)) {
+                               PPC_DIVWU(r_scratch1, r_A, r_X);
+                               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;
                case BPF_ALU | BPF_MOD | BPF_K: /* A %= K; */
                        PPC_LI32(r_scratch2, K);
@@ -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_SUB(r_A, r_A, r_scratch1);
                        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 */
                        if (K == 1)
                                break;