[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <08232c92-c3ab-9f3e-7c04-a815b04993db@163.com>
Date: Mon, 16 May 2016 23:49:05 +0800
From: Zhaoxiu Zeng <zengzhaoxiu@....com>
To: Peter Zijlstra <peterz@...radead.org>
Cc: linux-kernel@...r.kernel.org, bp@...e.de,
gnomes@...rguk.ukuu.org.uk, andi@...stfloor.org,
dvyukov@...gle.com, Zhaoxiu Zeng <zhaoxiu.zeng@...il.com>,
Thomas Gleixner <tglx@...utronix.de>,
Ingo Molnar <mingo@...hat.com>,
"H. Peter Anvin" <hpa@...or.com>, x86@...nel.org,
Denys Vlasenko <dvlasenk@...hat.com>
Subject: Re: [patch V4 09/31] bitops: Add x86-specific parity functions
On 2016/5/11 17:31, Peter Zijlstra wrote:
> Please use the GEN_*_RMWcc() stuff to avoid the setpo where possible.
Setpo is better.
In most cases, we need to store the parity, or compare it with other variables.
For example, in drivers/net/ethernet/broadcom/tg3.c,
static int tg3_test_nvram(struct tg3 *tp)
{
......
if (parity8(data[i]) == !!parity[i])
goto out;
......
}
If use GEN_BINARY_RMWcc stuff,
static inline unsigned int __arch_parity8(unsigned int w)
{
GEN_BINARY_RMWcc("testb", w, "er", 0xff, "%0", "po");
}
gcc's output:
1c2fe: 0f b6 54 05 a0 movzbl -0x60(%rbp,%rax,1),%edx
1c303: 89 55 9c mov %edx,-0x64(%rbp)
1c306: f6 45 9c ff testb $0xff,-0x64(%rbp)
1c30a: 7b 2c jnp 1c338 <tg3_self_test+0xf98>
1c30c: 31 c9 xor %ecx,%ecx
1c30e: 31 d2 xor %edx,%edx
1c310: 80 7c 05 bc 00 cmpb $0x0,-0x44(%rbp,%rax,1)
1c315: 0f 95 c2 setne %dl
1c318: 39 ca cmp %ecx,%edx
1c31a: 75 d8 jne 1c2f4 <tg3_self_test+0xf54>
......
1c338: b9 01 00 00 00 mov $0x1,%ecx
1c33d: eb cf jmp 1c30e <tg3_self_test+0xf6e>
Else if use setpo,
static inline unsigned int __arch_parity8(unsigned int w)
{
u8 res;
asm("test $0xff, %1; setpo %0" : "=qm" (res) : "rm" (w) : "memory");
return res;
}
gcc's output:
1c2fe: 31 c9 xor %ecx,%ecx
1c300: 0f b6 44 15 a0 movzbl -0x60(%rbp,%rdx,1),%eax
1c305: a9 ff 00 00 00 test $0xff,%eax
1c30a: 0f 9b c0 setnp %al
1c30d: 80 7c 15 bc 00 cmpb $0x0,-0x44(%rbp,%rdx,1)
1c312: 0f b6 c0 movzbl %al,%eax
1c315: 0f 95 c1 setne %cl
1c318: 39 c8 cmp %ecx,%eax
1c31a: 75 d8 jne 1c2f4 <tg3_self_test+0xf54>
Powered by blists - more mailing lists