Re: Patch: fragment reconstruction MMX for GCC
"Timothy B. Terriberry" <[email protected]>
| Newsgroups | gmane.comp.multimedia.ogg.theora.devel |
|---|---|
| Message-ID | <[email protected]> |
Nils Pipenbrinck wrote: > All routines perform much better now. Inter2 alone got a speedup of > factor 5 on Pentium-M. Athlon CPU's execute roughly 3 times faster. > Hadn't had the chance to benchmark core2 though. It would be nice to > hear if the code compiles on 64bit intel. Awesome. I've committed your code, with some modifications in r14336. It tests identical to the old code on both x86-64 and x86-32. There were two primary problems with the code as it stood. The first was specific to x86-64: you have to cast the strides to long's so that they are placed in 64-bit registers instead of 32-bit registers, or you can't use them in indexing instructions with 64-bit pointers. The second was specific to x86-32: when -fPIC is used and -fomit-frame-pointer is not, x86-32 gets just _five_ general purpose registers (%eax, %ecx, %edx, %esi, and %edi). All of your routines used six. This is the cause of the oft-reported problem that the encoder asm will not compile in debug mode. Fortunately, it's relatively easy to eliminate a register from each routine. oc_frag_recon_intra_mmx can get away with one fewer offset, and letting gcc handle the looping in oc_frag_recon_inter[2]_mmx allows it to unroll the loop when -funroll-loops is enabled, eliminating the need for a counter register. Without -funroll-loops, it will handle the register spill itself. On x86-64, there's obviously an extra register available, so it's not a problem. I also eliminated the "safe" version of oc_frag_recon_inter2_mmx that handled the case when the strides differ, because it never occurs, and I don't foresee a situation when we'd want it to. Also note that with -fomit-frame-pointer, gcc requires an extra register if you use any "m" arguments, because it can't track how %esp changes inside your asm block, so it can't generate a reference that is guaranteed to work if you start mucking around with the stack. That's what lead to the errors Ralph reported. Eliminating that version solved the problem, but getting down to 5 registers would've solved it also.