Skip to content

Commit 2276754

Browse files
ubizjakhansendc
authored andcommitted
x86/ACPI/boot: Improve __acpi_acquire_global_lock
Improve __acpi_acquire_global_lock by using a temporary variable. This enables compiler to perform if-conversion and improves generated code from: ... 72a: d1 ea shr %edx 72c: 83 e1 fc and $0xfffffffc,%ecx 72f: 83 e2 01 and $0x1,%edx 732: 09 ca or %ecx,%edx 734: 83 c2 02 add $0x2,%edx 737: f0 0f b1 17 lock cmpxchg %edx,(%rdi) 73b: 75 e9 jne 726 <__acpi_acquire_global_lock+0x6> 73d: 83 e2 03 and $0x3,%edx 740: 31 c0 xor %eax,%eax 742: 83 fa 03 cmp $0x3,%edx 745: 0f 95 c0 setne %al 748: f7 d8 neg %eax to: ... 72a: d1 e9 shr %ecx 72c: 83 e2 fc and $0xfffffffc,%edx 72f: 83 e1 01 and $0x1,%ecx 732: 09 ca or %ecx,%edx 734: 83 c2 02 add $0x2,%edx 737: f0 0f b1 17 lock cmpxchg %edx,(%rdi) 73b: 75 e9 jne 726 <__acpi_acquire_global_lock+0x6> 73d: 8d 41 ff lea -0x1(%rcx),%eax BTW: the compiler could generate: lea 0x2(%rcx,%rdx,1),%edx instead of: or %ecx,%edx add $0x2,%edx but unwated conversion from add to or when bits are known to be zero prevents this improvement. This is GCC PR108477. No functional change intended. Signed-off-by: Uros Bizjak <ubizjak@gmail.com> Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Link: https://lore.kernel.org/all/20230320212012.12704-1-ubizjak%40gmail.com
1 parent e8d018d commit 2276754

1 file changed

Lines changed: 8 additions & 3 deletions

File tree

arch/x86/kernel/acpi/boot.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1853,13 +1853,18 @@ early_param("acpi_sci", setup_acpi_sci);
18531853

18541854
int __acpi_acquire_global_lock(unsigned int *lock)
18551855
{
1856-
unsigned int old, new;
1856+
unsigned int old, new, val;
18571857

18581858
old = READ_ONCE(*lock);
18591859
do {
1860-
new = (((old & ~0x3) + 2) + ((old >> 1) & 0x1));
1860+
val = (old >> 1) & 0x1;
1861+
new = (old & ~0x3) + 2 + val;
18611862
} while (!try_cmpxchg(lock, &old, new));
1862-
return ((new & 0x3) < 3) ? -1 : 0;
1863+
1864+
if (val)
1865+
return 0;
1866+
1867+
return -1;
18631868
}
18641869

18651870
int __acpi_release_global_lock(unsigned int *lock)

0 commit comments

Comments
 (0)