This is the mail archive of the gdb@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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....


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]