Hey,
   Sun Studio can set the optimize level at a function level.

 From the Sun Studio 12 docs -

#pragma opt level (funcname[, funcname])

Doug

陶捷 TaoJie wrote:
> Dear all:
>
> My platform is:
> Intel Pentium 4 CPU
> OpenSolaris B74, built by myself
> Sun Studio 11
>
> In my program, I use asm("rdtsc") to measure the time cost between two rdtsc.
> for example:
> int some_func(...)
> {
>     long long time1, time2;
>     int i = 3198, j = 324;
>
>     asm volatile("rdtsc" : "=A" (time1));
>
>     ....
>     i = i + j * i / j;
>
>     asm volatile("rdtsc" : "=A" (time2))
>
>     return i;
> }
>
> int main(...)
> {
>     ....
>     some_func();
>     ....
> }
>
> When I compile this program using "cc example.c" and disasmble a.out
> by dis, the program logic is ok. The output is
> some_func()
>     main+0x36:              0f 31              rdtsc
>     main+0x38:              89 45 f4           movl   %eax,-0xc(%ebp)
>     main+0x3b:              89 55 f8           movl   %edx,-0x8(%ebp)
>     main+0x3e:              8b 45 e8           movl   -0x18(%ebp),%eax
>     main+0x41:              03 45 e4           addl   -0x1c(%ebp),%eax
>     main+0x44:              89 45 e8           movl   %eax,-0x18(%ebp)
>     main+0x47:              8b 45 e8           movl   -0x18(%ebp),%eax
>     main+0x4a:              0f af 45 e4        imull  -0x1c(%ebp),%eax
>     main+0x4e:              89 45 e8           movl   %eax,-0x18(%ebp)
>     main+0x51:              8b 45 e8           movl   -0x18(%ebp),%eax
>     main+0x54:              99                 cltd
>     main+0x55:              f7 7d e4           idivl  -0x1c(%ebp)
>     main+0x58:              8b d0              movl   %eax,%edx
>     main+0x5a:              89 55 e8           movl   %edx,-0x18(%ebp)
>     main+0x5d:              0f 31              rdtsc
>     main+0x5f:              89 45 ec           movl   %eax,-0x14(%ebp)
>     main+0x62:              89 55 f0           movl   %edx,-0x10(%ebp)
>
> When I compile this program using "cc -xO5", the dis output is
> some_func()
>     main+0x7:               0f 31              rdtsc
>     main+0x9:               89 45 e8           movl   %eax,-0x18(%ebp)
>     main+0xc:               89 55 ec           movl   %edx,-0x14(%ebp)
>     main+0xf:               0f 31              rdtsc
>     main+0x11:              89 45 f0           movl   %eax,-0x10(%ebp)
>     main+0x14:              89 55 f4           movl   %edx,-0xc(%ebp)
>     main+0x17:              8b 5d f0           movl   -0x10(%ebp),%ebx
>     main+0x1a:              8b 45 f4           movl   -0xc(%ebp),%eax
>     main+0x1d:              8b 4d e8           movl   -0x18(%ebp),%ecx
>     main+0x20:              8b 55 ec           movl   -0x14(%ebp),%edx
>     main+0x23:              2b d9              subl   %ecx,%ebx
>     main+0x25:              1b c2              sbbl   %edx,%eax
>     main+0x27:              89 5d e0           movl   %ebx,-0x20(%ebp)
>     main+0x2a:              89 45 e4           movl   %eax,-0x1c(%ebp)
>
> Now the program logic is wrong! sun cc thinks rdtscs are irrelative
> with the other parts in some_func, and then it advances the second
> asm("rdtsc")!
> In this case, I can't measure the time cost.
>
> Then how can I stop sun cc optimization partly between these two asm
> statements when using -xO5 optimization to the whole program?
> I mean the second rdtsc should be put after the statement  i = i + j *
> i / j strictly. (though I know the instructions will be executed in
> x86 cpu out-of-order, and the result may not be very precise, but it
> still works)
> Any good ideas?
>
> TIA
>
> Regards,
> TJ
> _______________________________________________
> opensolaris-discuss mailing list
> opensolaris-discuss@opensolaris.org
>
>   
_______________________________________________
opensolaris-discuss mailing list
opensolaris-discuss@opensolaris.org

Reply via email to