/*********************** ** DoEmFloatIteration ** ************************ ** Perform an iteration of the emulated floating-point ** benchmark. Note that "an iteration" can involve multiple ** loops through the benchmark. */ ulong DoEmFloatIteration(InternalFPF *abase, InternalFPF *bbase, InternalFPF *cbase, ulong arraysize, ulong loops, double *wat_time) { ulong elapsed; /* For the stopwatch */ static uchar jtable[16] = {0,0,0,0,1,1,1,1,2,2,2,2,2,3,3,3}; ulong i; /* ** Begin timing */ elapsed=StartStopwatch(); TimerOn(); /* ** Each pass through the array performs operations in ** the followingratios: ** 4 adds, 4 subtracts, 5 multiplies, 3 divides ** (adds and subtracts being nearly the same operation) */ while(loops--) { for(i=0;i<arraysize;i++) switch(jtable[i % 16]) { case 0: /* Add */ AddSubInternalFPF(0,abase+i, bbase+i, cbase+i); break; case 1: /* Subtract */ AddSubInternalFPF(1,abase+i, bbase+i, cbase+i); break; case 2: /* Multiply */ MultiplyInternalFPF(abase+i, bbase+i, cbase+i); break; case 3: /* Divide */ DivideInternalFPF(abase+i, bbase+i, cbase+i); break; } } TimerOff(); elapsed = StopStopwatch(elapsed); if( wat_time ) { *wat_time = TimerElapsed(); } return(elapsed); }
/*********************** ** DoEmFloatIteration ** ************************ ** Perform an iteration of the emulated floating-point ** benchmark. Note that "an iteration" can involve multiple ** loops through the benchmark. */ ulong DoEmFloatIteration(InternalFPF *abase, InternalFPF *bbase, InternalFPF *cbase, ulong arraysize, ulong loops) { ulong elapsed; /* For the stopwatch */ static uchar jtable[16] = {0,0,0,0,1,1,1,1,2,2,2,2,2,3,3,3}; ulong i; #ifdef DEBUG int number_of_loops; #endif /* ** Begin timing */ elapsed=StartStopwatch(); #ifdef DEBUG number_of_loops=loops-1; /* the index of the first loop we run */ #endif /* ** Each pass through the array performs operations in ** the followingratios: ** 4 adds, 4 subtracts, 5 multiplies, 3 divides ** (adds and subtracts being nearly the same operation) */ while(loops--) { for(i=0;i<arraysize;i++) switch(jtable[i % 16]) { case 0: /* Add */ AddSubInternalFPF(0,abase+i, bbase+i, cbase+i); break; case 1: /* Subtract */ AddSubInternalFPF(1,abase+i, bbase+i, cbase+i); break; case 2: /* Multiply */ MultiplyInternalFPF(abase+i, bbase+i, cbase+i); break; case 3: /* Divide */ DivideInternalFPF(abase+i, bbase+i, cbase+i); break; } #ifdef DEBUG { ulong j[8]; /* we test 8 entries */ int k; ulong i; char buffer[1024]; if (number_of_loops==loops) /* the first loop */ { j[0]=(ulong)2; j[1]=(ulong)6; j[2]=(ulong)10; j[3]=(ulong)14; j[4]=(ulong)(arraysize-14); j[5]=(ulong)(arraysize-10); j[6]=(ulong)(arraysize-6); j[7]=(ulong)(arraysize-2); for(k=0;k<8;k++){ i=j[k]; InternalFPFToString(buffer,abase+i); printf("%6ld: (%s) ",i,buffer); switch(jtable[i % 16]) { case 0: strcpy(buffer,"+"); break; case 1: strcpy(buffer,"-"); break; case 2: strcpy(buffer,"*"); break; case 3: strcpy(buffer,"/"); break; } printf("%s ",buffer); InternalFPFToString(buffer,bbase+i); printf("(%s) = ",buffer); InternalFPFToString(buffer,cbase+i); printf("%s\n",buffer); } } } #endif } return(StopStopwatch(elapsed)); }