gcc anomalities (fwd)

Neptho T (Neptho@hagan.reno.nv.us)
Thu, 26 Dec 1996 09:47:13 -0800 (PST)


I forwarded this to the linux kernel mailing list per request, please
address all questions and responses to tm@netcom.com. Thanks.
- Nep

---------- Forwarded message ----------
Date: Thu, 26 Dec 1996 05:53:54 -0800 (PST)

I've been looking at the assembly code generated by gcc for some of the
Linux code, and there seem to be some weird anomolies...

In net/ipv4/tcp_output.c there are a few references to "sk->rcvbuf/2" and
"sk->rmem_alloc/2". For some reason which I'm trying to ascertain, gcc
generates the awkward instruction sequence:

77:tcp_output.c **** window = sk->rcvbuf/2;
1473 .LM10:
1474 003a 8B861C01 movl 284(%esi),%eax
1474 0000
1475 0040 C1E81F shrl $31,%eax
1476 0043 03861C01 addl 284(%esi),%eax
1476 0000
1477 0049 89C2 movl %eax,%edx
1478 004b C1FA01 sarl $1,%edx

and:

84:tcp_output.c **** window -= sk->rmem_alloc/2;
1495 .LM15:
1496 005e 8B4608 movl 8(%esi),%eax
1497 0061 C1E81F shrl $31,%eax
1498 0064 034608 addl 8(%esi),%eax
1499 0067 C1F801 sarl $1,%eax
1500 006a 29C2 subl %eax,%edx

for these code sequences.

I'm wondering if we can replace some of the / 2 with >> 1 instead? The
code generated is much faster:

movl 8(%ebp),%eax
sarl $1,%eax

which is two instructions shorter than "shrl/addl/sarl".

Toshi