#include #include #include #include double tv_to_s(struct timeval tv) { return tv.tv_sec + ((double)tv.tv_usec)/1.0e6; } #define STEP (0x7fffffffffff0000/100000000) #define END (0x7fffffffffff0001-STEP) #define START1 (37ll) #define START2 (3ll) uint64_t __aeabi_uldivmod(uint64_t,uint64_t); int64_t __aeabi_ldivmod(int64_t,int64_t); int main(int argc, char **argv) { double time1, time2, time3, time4; struct timeval start, end; volatile uint64_t dummy; uint64_t i; volatile int64_t sdummy; int64_t si; gettimeofday (&start, NULL); for (i = START2; i < END; i += STEP) { dummy = __aeabi_uldivmod(END, i); } gettimeofday (&end, NULL); time1 = tv_to_s (end) - tv_to_s (start); gettimeofday (&start, NULL); for (i = START1; i < END; i += STEP * 5) { dummy = __aeabi_uldivmod(i, 373459); } gettimeofday (&end, NULL); time2 = tv_to_s (end) - tv_to_s (start); gettimeofday (&start, NULL); for (si = START2; si < END; si += STEP) { sdummy = __aeabi_ldivmod(END, si); } gettimeofday (&end, NULL); time3 = tv_to_s (end) - tv_to_s (start); gettimeofday (&start, NULL); for (si = START1; si < END; si += STEP * 5) { sdummy = __aeabi_ldivmod(si, 373459); } gettimeofday (&end, NULL); time4 = tv_to_s (end) - tv_to_s (start); printf ("loop1 unsigned: %12f\n" "loop2 unsigned: %12f\n" "loop1 signed: %12f\n" "loop2 signed: %12f\n", time1, time2, time3, time4); return 0; }