This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC 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: cmov in asm()


What about using abs() or (x<0?-x:x) :
att_syntax:
        movl    4(%esp), %eax
        cltd
        xorl    %edx, %eax
        subl    %edx, %eax
intel syntax:
        mov     eax, DWORD PTR [esp+4]
        cdq
        xor     eax, edx
        sub     eax, edx

It is same number of instructions and does not depend on the conditional register.

Thanks,
Andrew Pinski


On Thursday, May 22, 2003, at 08:46 US/Eastern, Peter Kovar wrote:


Hi *,

this is little performance improvement hint for IA-32, x86-64

In the userland I've been using following inlined functions in order
to avoid unpredictable conditional branching (indeed, it looks ugly).

static inline int
absolute (int x)
{
#if defined (__i386__)
  asm volatile
  (
    ".intel_syntax noprefix\n\t"
    "mov        ecx, eax\n\t"
    "neg        ecx\n\t"
    "cmovns     eax, ecx\n\t"
    ".att_syntax\n\t"
    : "=a" (x) : "a" (x) : "ecx", "flags"
  ) ;
#else
  if (x < 0)
  {
    x = -x ;
  }
#endif
  return x ;
}

GCC 3.x now emits cmov, however there is one specific case, where it
could be done bit more efficiently.

GCC generated code from Linux 2.5.69 kernel and then human made
equivalent of abs()


c036703c: 89 d0 mov %edx,%eax c036703e: f7 d8 neg %eax c0367040: 83 fa ff cmp $0xffffffff,%edx c0367043: 0f 4e d0 cmovle %eax,%edx

c036703e:	89 c1                	mov    %eax,%ecx
c0367040:	f7 d9                	neg    %ecx
c0367042:	0f 49 c1             	cmovns %ecx,%eax


neg changes flags, cmp with constant -1 is not necessary.


Would it be possible to integrate in architecture specific code
generation?

br
Peter Kovar

====================== REKLAMA =================================
Získajte supervýhodné ADSL ešte výhodnejšie. Ceny už od 399 Sk mesačne bez
DPH. Byť rýchly sa naozaj oplatí. http://www.slovanet.sk/menu/adsl.html







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