[cairo] Speeding up _cairo_fixed_from_double
Jamey Sharp
jamey at minilop.net
Mon Oct 30 16:31:13 PST 2006
On Mon, Oct 30, 2006 at 03:58:12PM -0500, Behdad Esfahbod wrote:
> Cannot reproduce.
That's what you get for compiling without -Wall. :-)
> This code:
>
> void
^^^^
> main (void)
GCC optimized away the return statements and then the if, because you
declared main void. Change the return type to int and your first example
produces:
$ gcc -O -Wall -S a.c
...
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $16, %esp
movl $1, -8(%ebp)
cmpb $1, -8(%ebp)
sbbl %eax, %eax
andl $-42, %eax
addl $108, %eax
addl $16, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
Which is obviously undesired and contains the same code I observed
earlier.
Your example also differed from mine for two other reasons. GCC
apparently treats main differently from other functions, so just
renaming the function to 'a' produces:
a:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $1, -4(%ebp)
cmpb $1, -4(%ebp)
sbbl %eax, %eax
andl $-42, %eax
addl $108, %eax
leave
ret
And, in order to observe only the interesting parts, I compiled my tests
with -fomit-frame-pointer. However this doesn't actually make much
difference on this example.
Anyway, Christoph Bauer mailed a much better version to me and the list
today, but it hasn't appeared on the list yet. I'd slightly edit his
version, so here's my take on it:
char endian(void)
{
union { int i; char c; } e = { 1 };
if ( e.c )
return '\154'; /* 'l' */
else
return '\102'; /* 'B' */
}
With frame pointer, this compiles to:
endian:
pushl %ebp
movl %esp, %ebp
movl $108, %eax
popl %ebp
ret
And obviously -fomit-frame-pointer yields:
endian:
movl $108, %eax
ret
And that compiles warning-free even with -Wall -ansi -pedantic. So
hooray for Christoph!
--Jamey
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://lists.freedesktop.org/archives/cairo/attachments/20061030/1b724432/attachment.pgp
More information about the cairo
mailing list