Re: [PATCH 03/17] x86: Replace open-coded parity calculation with parity8()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 23. 02. 25 17:42, Kuan-Wei Chiu wrote:
Refactor parity calculations to use the standard parity8() helper. This
change eliminates redundant implementations and improves code
efficiency.

The patch improves parity assembly code in bootflag.o from:

  58:	89 de                	mov    %ebx,%esi
  5a:	b9 08 00 00 00       	mov    $0x8,%ecx
  5f:	31 d2                	xor    %edx,%edx
  61:	89 f0                	mov    %esi,%eax
  63:	89 d7                	mov    %edx,%edi
  65:	40 d0 ee             	shr    %sil
  68:	83 e0 01             	and    $0x1,%eax
  6b:	31 c2                	xor    %eax,%edx
  6d:	83 e9 01             	sub    $0x1,%ecx
  70:	75 ef                	jne    61 <sbf_init+0x51>
  72:	39 c7                	cmp    %eax,%edi
  74:	74 7f                	je     f5 <sbf_init+0xe5>
  76:

to:

  54:	89 d8                	mov    %ebx,%eax
  56:	ba 96 69 00 00       	mov    $0x6996,%edx
  5b:	c0 e8 04             	shr    $0x4,%al
  5e:	31 d8                	xor    %ebx,%eax
  60:	83 e0 0f             	and    $0xf,%eax
  63:	0f a3 c2             	bt     %eax,%edx
  66:	73 64                	jae    cc <sbf_init+0xbc>
  68:

which is faster and smaller (-10 bytes) code.

Reviewed-by: Uros Bizjak <ubizjak@xxxxxxxxx>

Thanks,
Uros.


Co-developed-by: Yu-Chun Lin <eleanor15x@xxxxxxxxx>
Signed-off-by: Yu-Chun Lin <eleanor15x@xxxxxxxxx>
Signed-off-by: Kuan-Wei Chiu <visitorckw@xxxxxxxxx>
---
  arch/x86/kernel/bootflag.c | 18 +++---------------
  1 file changed, 3 insertions(+), 15 deletions(-)

diff --git a/arch/x86/kernel/bootflag.c b/arch/x86/kernel/bootflag.c
index 3fed7ae58b60..314ff0e84900 100644
--- a/arch/x86/kernel/bootflag.c
+++ b/arch/x86/kernel/bootflag.c
@@ -8,6 +8,7 @@
  #include <linux/string.h>
  #include <linux/spinlock.h>
  #include <linux/acpi.h>
+#include <linux/bitops.h>
  #include <asm/io.h>
#include <linux/mc146818rtc.h>
@@ -20,26 +21,13 @@
int sbf_port __initdata = -1; /* set via acpi_boot_init() */ -static int __init parity(u8 v)
-{
-	int x = 0;
-	int i;
-
-	for (i = 0; i < 8; i++) {
-		x ^= (v & 1);
-		v >>= 1;
-	}
-
-	return x;
-}
-
  static void __init sbf_write(u8 v)
  {
  	unsigned long flags;
if (sbf_port != -1) {
  		v &= ~SBF_PARITY;
-		if (!parity(v))
+		if (!parity8(v))
  			v |= SBF_PARITY;
printk(KERN_INFO "Simple Boot Flag at 0x%x set to 0x%x\n",
@@ -70,7 +58,7 @@ static int __init sbf_value_valid(u8 v)
  {
  	if (v & SBF_RESERVED)		/* Reserved bits */
  		return 0;
-	if (!parity(v))
+	if (!parity8(v))
  		return 0;
return 1;




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux