Etliche Evolutionsstufen sp�ter habe ich dann das folgende Programm ins Rennen geschickt:
unsigned long mem0s(unsigned char *s, unsigned long l) {
��������unsigned long r=0, i=0, mem_read;
��������while(i+8
����������������mem_read=(unsigned long)(((unsigned long*)(s*));
����������������asm volatile (
������������������������"not %1, %1 \n\t"
������������������������"ctpop %1, %1 \n\t"
������������������������"addq %0, %1 \n\t":
������������������������"=r"(r): "r"(mem_read)
����������������);
����������������i += 8;
��������}
��������while(i
����������������mem_read=s;
����������������asm volatile (
������������������������"not %1, %1 \n\t"
������������������������"and %1, 255, %1 \n\t"
������������������������"ctpop %1, %1 \n\t"
������������������������"addq %0, %1 \n\t":
������������������������"=r"(r): "r"(mem_read)
����������������);
����������������i += 1;
��������}
��������return r;
}
Nicht mehr besonders sch�n. Jedoch effizienter als sein Urahne zuvor! F�r Details zu Programmoptimierung sei auf die ausgezeichnete �bung Effiziente Programme von Anton Ertl verwiesen, die mir hier sicher den einen oder anderen Anhaltspunkt gab.
|