Thread (54 messages) flat view 54 messages, 10 authors, 2025-03-02

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

From: Uros Bizjak <hidden>
Date: 2025-02-24 15:24:19
Also in: bpf, dri-devel, linux-media, linux-serial, linux-wireless, lkml, netdev


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 <redacted>

Thanks,
Uros.
quoted hunk ↗ jump to hunk
Co-developed-by: Yu-Chun Lin <redacted>
Signed-off-by: Yu-Chun Lin <redacted>
Signed-off-by: Kuan-Wei Chiu <visitorckw@gmail.com>
---
  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;
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help