This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
cmov in asm()
- From: Peter Kovar <peter dot kovar at pobox dot sk>
- To: gcc at gnu dot org
- Date: Thu, 22 May 2003 14:46:31 +0200
- Subject: cmov in asm()
- Reply-to: Peter Kovar <peter dot kovar at pobox dot sk>
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