[RFC] arm: use built-in byte swap function
Nicolas Pitre
nico at fluxnic.net
Thu Feb 21 11:40:54 EST 2013
On Thu, 21 Feb 2013, Kim Phillips wrote:
> On Wed, 20 Feb 2013 23:29:58 -0500
> Nicolas Pitre <nico at fluxnic.net> wrote:
>
> > On Wed, 20 Feb 2013, Kim Phillips wrote:
> >
> > > On Wed, 20 Feb 2013 10:43:18 -0500
> > > Nicolas Pitre <nico at fluxnic.net> wrote:
> > >
> > > > On Wed, 20 Feb 2013, Woodhouse, David wrote:
> > > > > On Wed, 2013-02-20 at 09:06 -0500, Nicolas Pitre wrote:
> > > > > > ... in which case there is no harm shipping a .c file and trivially
> > > > > > enforcing -O2, the rest being equal.
> > > > >
> > > > > For today's compilers, unless the wind changes.
> > > >
> > > > We'll adapt if necessary. Going with -O2 should remain pretty safe anyway.
> > >
> > > Alas, not so for gcc 4.4 - I had forgotten I had tested
> > > Ubuntu/Linaro 4.4.7-1ubuntu2 here:
> > >
> > > https://patchwork.kernel.org/patch/2101491/
> > >
> > > add -O2 to that test script and gcc 4.4 *always* emits calls to
> > > __bswap[sd]i2, even with -march=armv6k+.
>
> argh, sorry - that script was testing support for
> __builtin_bswap{16,32,64} directly, which isn't the same as testing
> code generation of a byte swap pattern in C.
Still, I'm not as confident as I was about this.
> I'll still try the assembly approach - gcc 4.4's armv6 output looks
> worse than both the pre-armv6 and post-armv6 __arch_swab32
> implementations currently in use:
>
> mov ip, sp
> push {fp, ip, lr, pc}
> sub fp, ip, #4
You should use -fomit-frame-pointer to compile this. We don't need a
frame pointer here, especially for a leaf function that the compiler
decides to call on its own.
> and r2, r0, #65280 ; 0xff00
> lsl ip, r0, #24
> orr r1, ip, r0, lsr #24
> and r0, r0, #16711680 ; 0xff0000
> orr r3, r1, r2, lsl #8
> orr r0, r3, r0, lsr #8
Other than that, it is true that the above is slightly suboptimal.
Nicolas
More information about the linux-arm-kernel
mailing list