Path: utzoo!utgpu!jarvis.csri.toronto.edu!mailrus!csd4.milw.wisc.edu!cs.utexas.edu!uunet!dino!uxc.cso.uiuc.edu!uxc.cso.uiuc.edu!ux1.cso.uiuc.edu!uxe.cso.uiuc.edu!mcdonald From: mcdonald@uxe.cso.uiuc.edu Newsgroups: comp.lang.c Subject: Re: Short code to determine compiler's Message-ID: <225800203@uxe.cso.uiuc.edu> Date: 22 Jul 89 23:03:01 GMT References: <396@uop.uop.EDU> Lines: 80 Nf-ID: #R:uop.uop.EDU:396:uxe.cso.uiuc.edu:225800203:000:2138 Nf-From: uxe.cso.uiuc.edu!mcdonald Jul 21 08:10:00 1989 >> >>... the way to find out how many registers the compiler will >>use on your code is to compile your code and count how many registers >>were used. This is completely reliable, although not necessarily >>repeatable. It is also likely to be a useless statistic. >>-- Yes, that's true. >All true. For amusement's sake though, here is a C program that finds >out what register variables one can have by looking at their effect on >execution time, which presumably is why one might want to know in the >first place. The following example works with gcc and cc on Sun >3's and 4's running SunOS 3.5, and should work on most UNIX machines >with little change. As is frequently noted, timing routines are not >very portable across OS's; sorry about that. Except that his program was truly hopelessly non-portable. Here is one that, I sincerely hope, is 100% portable, unless you have on obsolete compiler. It is not, unfortunately, 100% going to work right on multitasking machines. There you will have to either go single user and/or run it lots of times and take the maximum iterations. #include #include #define T(A) t = time(NULL); \ while (t == time(NULL));\ t = time(NULL);\ for(i = 0; t == time(NULL); i++)\ for(A = 0; A < 1000; A++) j |= 1; /* do something in loop */ \ printf("register %s did %d loops\n", #A , i); /* making these static and volatile will hopefully prevent putting them in registers */ volatile unsigned i,j; volatile time_t t; int main() { register unsigned r01, r02, r03, r04, r05, r06, r07, r08, r09, r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, r20; if( time(NULL) == (time_t)-1) { puts("Sorry, the time function returned a -1."); exit(1); } T(r01); T(r02); T(r03); T(r04); T(r05); T(r06); T(r07); T(r08); T(r09); T(r10); T(r11); T(r12); T(r13); T(r14); T(r15); T(r16); T(r17); T(r18); T(r19); T(r20); } It correctly reports two registers on my IBM PC. Doug McDonald (mcdonald@uxe.cso.uiuc.edu)