#include <stddef.h> // by J.C. Pîzarro ...
// This function doesn't touch the ECX register that is touched by OptionC.
__volatile__ static const int minus_one = -1;
void *__allocate_array_OptionD(size_t num, size_t size) {
register unsigned int result;
__asm__ __volatile__
(
"imull %2" // See the flags OF, SF, CF, .. are affected or not.
"\n\t" "cmovol %3,%%eax" // i dude if it works or not. Not tested ...
// "\n\t" "cmovcl %3,%%eax"
:"=a"(result)
:"a"(num),"m"(size),"m"(minus_one)
:"%edx"/*???*/); // There are 0 conditional jumps!!! hehehehe!
return operator new[](result);
}
-----------------------------------------------------------------------------
* gcc version 4.1.3 20070326 (prerelease)
* 6 instructions of i686 !!! (cmovo came from i686)
* no conditional jump !!!
_Z24__allocate_array_OptionDjj:
subl $12, %esp # <- unneeded
movl 16(%esp), %eax
#APP
imull 20(%esp)
cmovol minus_one,%eax
#NO_APP
movl %eax, (%esp) # <- better movl %eax, 4(%esp)
call _Znaj # <- better jmp _Znaj
addl $12, %esp # <- unneeded
ret # <- unneeded
minus_one:
.long -1
-----------------------------------------------------------------------------
* hand-written
* 5 instructions of i686 !!! (cmovo came from i686)
* no conditional jump !!!
_Z24__allocate_array_OptionDjj:
movl 4(%esp), %eax
#APP
imull 8(%esp)
cmovol minus_one,%eax
#NO_APP
movl %eax, 4(%esp)
jmp _Znaj
minus_one:
.long -1
-----------------------------------------------------------------------------
Here has reached 5 instructions.
Anyone with 4 instructions?
J.C. Pizarro
allocate_array_20070409-2.tar.gz
Description: GNU Zip compressed data
