Messages in this thread | | | Date | Tue, 29 Mar 2011 08:15:46 +0200 | From | Ingo Molnar <> | Subject | Re: [PATCH 2/6] x86-64: Don't generate cmov in vread_tsc |
| |
* Andy Lutomirski <luto@MIT.EDU> wrote:
> - /* This doesn't multiply 'zero' by anything, which *should* > - * generate nicer code, except that gcc cleverly embeds the > - * dereference into the cmp and the cmovae. Oh, well. > + /* This doesn't multiply 'zero' by anything, which generates > + * very slightly nicer code than multiplying it by 8. > */ > last = *( (cycle_t *) > ((char *)&__vsyscall_gtod_data.clock.cycle_last + zero) ); > > - return ret >= last ? ret : last; > + if (likely(ret >= last)) > + return ret; > + > + /* GCC likes to generate cmov here, but this branch is extremely > + predictable (it's just a funciton of time and the likely is > + very likely) and there's a data dependence, so force GCC > + to generate a branch instead. */ > + asm volatile ("");
barrier() would do the same, right?
Also, a nit, please use the customary (multi-line) comment style:
/* * Comment ..... * ...... goes here. */
specified in Documentation/CodingStyle.
Thanks,
Ingo
| |