[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1389771576.31367.327.camel@edumazet-glaptop2.roam.corp.google.com>
Date: Tue, 14 Jan 2014 23:39:36 -0800
From: Eric Dumazet <eric.dumazet@...il.com>
To: David Miller <davem@...emloft.net>
Cc: hannes@...essinduktion.org, netdev@...r.kernel.org,
dborkman@...hat.com, darkjames-ws@...kjames.pl, mgherzan@...il.com,
rmk+kernel@....linux.org.uk, matt@...abs.org,
schwidefsky@...ibm.com, heiko.carstens@...ibm.com
Subject: Re: [PATCH net] bpf: do not use reciprocal divide
On Tue, 2014-01-14 at 23:28 -0800, David Miller wrote:
> From: Eric Dumazet <eric.dumazet@...il.com>
> Date: Tue, 14 Jan 2014 23:02:41 -0800
>
> > diff --git a/arch/sparc/net/bpf_jit_comp.c b/arch/sparc/net/bpf_jit_comp.c
> > index 218b6b23c378..125045063b91 100644
> > --- a/arch/sparc/net/bpf_jit_comp.c
> > +++ b/arch/sparc/net/bpf_jit_comp.c
> > @@ -498,8 +498,7 @@ void bpf_jit_compile(struct sk_filter *fp)
> > emit_alu_K(MUL, K);
> > break;
> > case BPF_S_ALU_DIV_K: /* A /= K */
> > - emit_alu_K(MUL, K);
> > - emit_read_y(r_A);
> > + emit_alu_K(DIV, K);
> > break;
> > case BPF_S_ALU_DIV_X: /* A /= X; */
> > emit_cmpi(r_X, 0);
>
> You have to clear the Y register before a divide, as it provides
> the top 32-bits of the 64-bit numerator.
>
> You can just cut and paste the sequence used for BPF_S_ALU_DIV_X:
>
> emit_write_y(G0);
> #ifdef CONFIG_SPARC32
> /* The Sparc v8 architecture requires
> * three instructions between a %y
> * register write and the first use.
> */
> emit_nop();
> emit_nop();
> emit_nop();
> #endif
> emit_alu_X(DIV);
Thanks David, I will submit a v2 tomorrow morning, when/if I get more
feedback for other arches, and after some rest ;)
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists