#include <stddef.h>
void *__allocate_array_of_RossRidge(size_t num, size_t size, size_t max_num) {
if (num > max_num)
size = ~size_t(0);
else
size *= num;
return operator new[](size);
}
void *__allocate_array_of_JCPizarro(size_t num, size_t size, size_t
max_num) {
if (num > max_num) return operator new[](~size_t(0));
return operator new[](size*num);
}
void *__allocate_array_of_JCPizarro2(size_t num, size_t size, size_t max_num) {
size_t result;
if (num > max_num) return operator new[](~size_t(0));
__asm __volatile("mull
%%edx":"=a"(result):"a"(num),"d"(size):/*???*/); // quick & dirty
// See http://www.cs.sjsu.edu/~kirchher/CS047/multDiv.html
// One-operand imul: & Unsigned mul:
return operator new[](result);
}
-----------------------------------------------------------------------------
_Z29__allocate_array_of_RossRidgejjj:
[ gcc v3.4.6 : 11 instructions ]
movl 4(%esp), %edx
cmpl 12(%esp), %edx
movl 8(%esp), %eax
jbe .L2
orl $-1, %eax
jmp .L3
.L2:
imull %edx, %eax # signed multiply!!! 1 bit signed + unsigned
31x31!!!
.L3:
pushl %eax
call _Znaj
popl %edx
ret
_Z29__allocate_array_of_RossRidgejjj:
[ gcc 4.1.3 20070326 (prerelease) : 9 instructions ]
movl 4(%esp), %eax
orl $-1, %ecx
cmpl 12(%esp), %eax
movl 8(%esp), %edx
ja .L16
movl %edx, %ecx
imull %eax, %ecx # signed multiply!!! 1 bit signed + unsigned
31x31!!!
.L16:
movl %ecx, 4(%esp)
jmp _Znaj
_Z29__allocate_array_of_JCPizarrojjj:
[ gcc 4.1.3 20070326 (prerelease) and gcc 3.4.6 : 9 instructions ]
movl 4(%esp), %edx
cmpl 12(%esp), %edx
movl 8(%esp), %eax
jbe .L8
movl $-1, 4(%esp)
jmp .L12 # <- why not jmp _Znaj directly?
.L8:
imull %edx, %eax # signed multiply!!! 1 bit signed + unsigned
31x31!!!
movl %eax, 4(%esp)
.L12:
jmp _Znaj
_Z30__allocate_array_of_JCPizarro2jjj:
[ gcc 4.1.3 20070326 (prerelease) and gcc 3.4.6 : 9 instructions ]
movl 4(%esp), %eax
cmpl 12(%esp), %eax
movl 8(%esp), %edx
jbe .L2
movl $-1, 4(%esp)
jmp .L6 # <- why not jmp _Znaj directly?
.L2:
#APP
mull %edx # unsigned 32x32!!! mul is little bit slower than imul
in clock cycles.
#NO_APP
movl %eax, 4(%esp)
.L6:
jmp _Znaj
-----------------------------------------------------------------------------
J.C. Pizarro
allocate_array_april2007_2.tar.gz
Description: GNU Zip compressed data
