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 <ubiz...@gmail.com>

Thanks,
Uros.


Co-developed-by: Yu-Chun Lin <eleanor...@gmail.com>
Signed-off-by: Yu-Chun Lin <eleanor...@gmail.com>
Signed-off-by: Kuan-Wei Chiu <visitor...@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;

Reply via email to