This is the mail archive of the
gdb@sourceware.org
mailing list for the GDB project.
RE: (len % 1) != 0
On 19 February 2008 18:35, David Daney wrote:
> Dave Korn wrote:
>> On 19 February 2008 18:23, Paul Koning wrote:
>>
>>>>>>>> "Dave" == Dave Korn <dave.korn@artimi.com> writes:
>>> Dave> On 19 February 2008 16:30, Sheng-Liang Song wrote: >> or
>>> >>
>>> >> (len & 1) != 0 <=> (len % 2) != 0
>>> >>
>>>
>>> Dave> That would have the advantage of not requiring a divide Dave>
>>> operation :)
>>>
>>> It shouldn't matter -- the optimizer will do the right thing, as I
>>> recall.
>>
>> NB len == signed int.
>>
>> Yes, it can simplify it to a bunch of shifts and sign extends and masks
>> without using an explicit divide, but it's not as good as a simple AND
>> operation. (Maybe VRP in 4.x could handle that by knowing that the result
>> of strlen has to be >= 0, but 3.x series won't do it).
>>
>
> ?? Not to be pedantic, but on 3.4.3 for mipsel-linux I get:
>
> $ cat j.c
> int f1 (int a)
> {
> return (a % 2) != 0;
> }
> $ mipsel-linux-gcc -c -O3 j.c
> $ mipsel-linux-objdump -d j.o
>
> j.o: file format elf32-tradlittlemips
>
> Disassembly of section .text:
>
> 00000000 <f1>:
> 0: 03e00008 jr ra
> 4: 30820001 andi v0,a0,0x1
<lightbulb> Ah, it's the !=0 that allows the compiler to go that last
step of the way, I was just testing
int bar (int len)
{
return len % 2;
}
int baz (int len)
{
return len & 1;
}
Hmm, 3.4.4 on x86 still doesn't optimise it quite as well:
/artimi/boards $ gcc -xc -S -oo.s -O2 -
int bar (int len)
{
return len % 2;
}
int baz (int len)
{
return len & 1;
}
int bat (int len)
{
return (len % 2) != 0;
}
int quux (int len)
{
return (len & 1) != 0;
}
/artimi/boards $ cat o.s
.file ""
.text
.globl _bar
.def _bar; .scl 2; .type 32; .endef
_bar:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
popl %ebp
movl %eax, %edx
shrl $31, %edx
leal (%eax,%edx), %edx
andl $-2, %edx
subl %edx, %eax
ret
.p2align 4,,15
.globl _baz
.def _baz; .scl 2; .type 32; .endef
_baz:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
popl %ebp
andl $1, %eax
ret
.p2align 4,,15
.globl _bat
.def _bat; .scl 2; .type 32; .endef
_bat:
pushl %ebp
xorl %eax, %eax
movl %esp, %ebp
testb $1, 8(%ebp)
popl %ebp
setne %al
ret
.p2align 4,,15
.globl _quux
.def _quux; .scl 2; .type 32; .endef
_quux:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
popl %ebp
andl $1, %eax
ret
/artimi/boards/Kitsman/Test Boards/A200_TPCB002 $
cheers,
DaveK
--
Can't think of a witty .sigline today....