|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] x86: use tzcnt instead of bsf
On 23/01/15 16:39, Jan Beulich wrote:
> Following a compiler change done in 2012, make use of the fact that for
> non-zero input BSF and TZCNT produce the same numeric result (EFLAGS
> setting differs), and that CPUs not knowing of TZCNT will treat the
> instruction as BSF (i.e. ignore what looks like a REP prefix to them).
> The assumption here is that TZCNT would never have worse performance
> than BSF.
>
> Also extend the asm() input in find_first_set_bit() to allow memory
> operands.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> ---
> Thanks to Andrew for noticing that I forgot to post this for Xen after
> a similar change got accepted into the Linux kernel.
>
> --- a/xen/arch/x86/bitops.c
> +++ b/xen/arch/x86/bitops.c
> @@ -62,7 +62,7 @@ unsigned int __find_first_zero_bit(
> " je 2f\n\t"
> " xor -"STR(BITS_PER_LONG/8)"(%2),%3\n\t"
> " jz 1b\n\t"
> - " bsf %3,%0\n\t"
> + " rep; bsf %3,%0\n\t"
> " lea -"STR(BITS_PER_LONG/8)"(%2),%2\n\t"
> "2: sub %%ebx,%%edi\n\t"
> " shl $3,%%edi\n\t"
> --- a/xen/arch/x86/hvm/vpic.c
> +++ b/xen/arch/x86/hvm/vpic.c
> @@ -56,7 +56,7 @@ static int vpic_get_priority(struct hvm_
> return VPIC_PRIO_NONE;
>
> /* prio = ffs(mask ROR vpic->priority_add); */
> - asm ( "ror %%cl,%b1 ; bsf %1,%0"
> + asm ( "ror %%cl,%b1 ; rep; bsf %1,%0"
> : "=r" (prio) : "q" ((uint32_t)mask), "c" (vpic->priority_add) );
> return prio;
> }
> --- a/xen/include/asm-x86/bitops.h
> +++ b/xen/include/asm-x86/bitops.h
> @@ -382,7 +382,7 @@ static inline unsigned int __scanbit(uns
> */
> static inline unsigned int find_first_set_bit(unsigned long word)
> {
> - asm ( "bsf %1,%0" : "=r" (word) : "r" (word) );
> + asm ( "rep; bsf %1,%0" : "=r" (word) : "rm" (word) );
> return (unsigned int)word;
> }
>
>
>
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |