On Fri, Jul 21, 2023 at 08:34:55AM +0200, Andreas Schwab wrote:
On Jul 20 2023, Matthew Wilcox wrote:
+static inline bool clear_bit_unlock_is_negative_byte(unsigned int nr,
+ volatile unsigned long *p)
+{
+ char result;
+ char mask = 1 << nr; /* nr guaranteed to be < 7 */
+
+ __asm__ __volatile__ ("eori %1, %2; smi %0"
Why are you using XOR if you want to clear a bit? If it operates on a
byte, why does it receive a pointer to long?
It's a clever hack. This function has exactly one user, and it's an
important one -- folio_unlock(). Bit 7 is set if there are other
threads waiting for this folio to be unlocked. There are two reasonable
implementations, depending what kind of CPU you have; you can either
load-locked; clear the bottom bit, store-conditional, test bit 7. Or
x86 and m68k have the perfect instruction to clear a bit and set the
Negative flag if bit 7 is set.
As I said in the earlier email, BCLR doesn't affect the N flag, but
EORI and ANDI do. We are guaranteed that the bit we're clearing is set,
so EORI will work. ANDI would also work.
Do you happen to know if __GCC_ASM_FLAG_OUTPUTS__ is implemented for
m68k so we can save the SMI instruction?