Method2 is broken because it gives erroneous results.
In my original post I presented a small program that
called three different versions of a RDTSC functions
(1,2,2A) and only method 1 gave results that were in any
posssible way correct. Since these are three different
functions, there can't be any optimization issues
between the source code in the three functions and it's
not at all obvious -- at least to me -- where
a "volatile" declaration could be put. If someone could
post a modified version of my program in method 2 or
method 2a worked, I'd be very grateful.
Norm
> > > On Thu, Nov 01, 2001 at 02:54:37PM -0700, John Regehr wrote:
> > > > > Don't forget to make sure it's __volatile__, elsewise this is the very
> > > > > epitome of what would produce dodgy results...
> > > >
> > > > Right. So method2 and method2A seem to be broken in multiple ways -
> > > > forget you ever saw them. Rather, look at this page:
> >
> > in what way is method2 brocken ??
> >
> > if you compile method1 and method2A and look at the assembler coee they are
> > absolutly the same - the only difference on the source level is that its
> easier
> > to read "mov" than "0x31" thats all.
> >
> > ---method1---
> > __inline__ unsigned long long int rdtsc(void)
> > {
> > unsigned long long int x;
> > __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
> > return x;
> > }
> >
> >
> > ---method2A---
> > __inline__ unsigned long long int hwtime(void)
> > {
> > unsigned long long int x;
> > __asm__("rdtsc\n\t"
> > "mov %%edx, %%ecx\n\t"
> > :"=A" (x));
> > return x;
> > }
> >
>
> forgot to put in objdump output in the last post
>
>
> 08048430 <rdtsc>:
> 8048430: 55 push %ebp
> 8048431: 89 e5 mov %esp,%ebp
> 8048433: 83 ec 14 sub $0x14,%esp
> 8048436: 53 push %ebx
> 8048437: 0f 31 rdtsc
> 8048439: 89 c1 mov %eax,%ecx
> 804843b: 89 d3 mov %edx,%ebx
> 804843d: 89 4d f8 mov %ecx,0xfffffff8(%ebp)
> 8048440: 89 5d fc mov %ebx,0xfffffffc(%ebp)
> 8048443: 8b 4d f8 mov 0xfffffff8(%ebp),%ecx
> 8048446: 8b 5d fc mov 0xfffffffc(%ebp),%ebx
> 8048449: 89 c8 mov %ecx,%eax
> 804844b: 89 da mov %ebx,%edx
> 804844d: eb 01 jmp 8048450 <rdtsc+0x20>
> 804844f: 90 nop
> 8048450: 8b 5d e8 mov 0xffffffe8(%ebp),%ebx
> 8048453: 89 ec mov %ebp,%esp
> 8048455: 5d pop %ebp
> 8048456: c3 ret
> 8048457: 89 f6 mov %esi,%esi
> 8048459: 8d bc 27 00 00 00 00 lea 0x0(%edi,1),%edi
>
> 08048460 <hwtime>:
> 8048460: 55 push %ebp
> 8048461: 89 e5 mov %esp,%ebp
> 8048463: 83 ec 14 sub $0x14,%esp
> 8048466: 53 push %ebx
> 8048467: 0f 31 rdtsc
> 8048469: 89 d1 mov %edx,%ecx
> 804846b: 89 c1 mov %eax,%ecx
> 804846d: 89 d3 mov %edx,%ebx
> 804846f: 89 4d f8 mov %ecx,0xfffffff8(%ebp)
> 8048472: 89 5d fc mov %ebx,0xfffffffc(%ebp)
> 8048475: 8b 4d f8 mov 0xfffffff8(%ebp),%ecx
> 8048478: 8b 5d fc mov 0xfffffffc(%ebp),%ebx
> 804847b: 89 c8 mov %ecx,%eax
> 804847d: 89 da mov %ebx,%edx
> 804847f: eb 00 jmp 8048481 <hwtime+0x21>
> 8048481: 8b 5d e8 mov 0xffffffe8(%ebp),%ebx
> 8048484: 89 ec mov %ebp,%esp
> 8048486: 5d pop %ebp
> 8048487: c3 ret
> 8048488: 90 nop
> 8048489: 8d b4 26 00 00 00 00 lea 0x0(%esi,1),%esi
>
> -- [rtl] ---
> To unsubscribe:
> echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
> echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
> --
> For more information on Real-Time Linux see:
> http://www.rtlinux.org/
>
-- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
--
For more information on Real-Time Linux see:
http://www.rtlinux.org/