From: "Matthew Wilcox (Oracle)" <willy@xxxxxxxxxxxxx> Copy and paste the clear_bit_unlock() implementation, and test the temp variable to see if it has bit 7 set. Saves two instructions: a load and a compare: 860: 01 31 20 44 andnot t0,0x1,t0 864: 00 00 30 b8 stl_c t0,0(a0) 868: 67 1b 20 e4 beq t0,7608 <generic_file_write_iter+0x218> - 86c: 00 00 30 a0 ldl t0,0(a0) - 870: 01 10 30 44 and t0,0x80,t0 - 874: a1 03 e1 43 cmpult zero,t0,t0 - 878: 01 00 20 f4 bne t0,880 <unlock_page+0x40> - 87c: 01 80 fa 6b ret + 86c: 01 10 30 44 and t0,0x80,t0 + 870: 03 00 20 f4 bne t0,880 <unlock_page+0x40> + 874: 01 80 fa 6b ret Signed-off-by: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> Cc: Richard Henderson <rth@xxxxxxxxxxx> Cc: Ivan Kokshaysky <ink@xxxxxxxxxxxxxxxxxxxx> Cc: Matt Turner <mattst88@xxxxxxxxx> Cc: linux-alpha@xxxxxxxxxxxxxxx --- arch/alpha/include/asm/bitops.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/arch/alpha/include/asm/bitops.h b/arch/alpha/include/asm/bitops.h index 5adca78830b5..f9af2401bd23 100644 --- a/arch/alpha/include/asm/bitops.h +++ b/arch/alpha/include/asm/bitops.h @@ -79,6 +79,29 @@ clear_bit_unlock(unsigned long nr, volatile void * addr) clear_bit(nr, addr); } +static inline bool clear_bit_unlock_is_negative_byte(unsigned int nr, + volatile unsigned long *p) +{ + unsigned long temp; + int *m = ((int *)p) + (nr >> 5); + + smp_mb(); + __asm__ __volatile__( + "1: ldl_l %0,%3\n" + " bic %0,%2,%0\n" + " stl_c %0,%1\n" + " beq %0,2f\n" + ".subsection 2\n" + "2: br 1b\n" + ".previous" + :"=&r" (temp), "=m" (*m) + :"Ir" (1UL << (nr & 31)), "m" (*m)); + + return temp & 128; +} +#define clear_bit_unlock_is_negative_byte \ + clear_bit_unlock_is_negative_byte + /* * WARNING: non atomic version. */ -- 2.25.1