lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
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

Powered by Openwall GNU/*/Linux Powered by OpenVZ