Code: Select all
#include <stdlib.h>
#include <stdio.h>
register __a unsigned long fast_divide32unsigned(register __b unsigned long dividend, register __a unsigned long divisor);
register __a unsigned long fast1_divide32unsigned(register __b unsigned long dividend, register __a unsigned long divisor);
main(void) {
srand(39238);
printf("starting benchmark...\n");
while(1)
{
unsigned long j,k;
unsigned long r1,r2,r3;
j = (((unsigned long)rand() & 0xffl) << 24) | (((unsigned long)rand() & 0x0fffl) << 12) | ((unsigned long)rand() & 0x0fffl);
j >>= (rand() & 0x03); // generate random dividend
k = (((unsigned long)rand() & 0xffl) << 24) | (((unsigned long)rand() & 0x0fffl) << 12) | ((unsigned long)rand() & 0x0fffl);
k >>= (rand() & 0x1f); // generate random divisor
r1 = j / k; // old library routine
r2 = fast_divide32unsigned(j,k); // optimized version
r3 = fast1_divide32unsigned(j,k); // further optimized version
if(r1 != r2 || r1 != r3)
{
printf("error : %lu / %lu = %lu, = %lu, = %lu\n",j,k,r1,r2,r3);
}
}
return 0;
}
Code: Select all
......
stx A0,(I4) ; sty A1,(I4)+1 // A0 spills to #0
// r1 = j / k;
call divide32unsigned
ldx (I4)+3,NULL ; ldy (I4)-3,B1 //The same index register used as a target register (load or post-modification) more than once
// jumped away
add A,NULL,D ; ldx (I4),B0 // A -> 'r1'
......