/** @file Implementation of TestAndClearBit using compare-exchange primitive Copyright (C) 2015, Linaro Ltd. Copyright (c) 2015, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include INT32 EFIAPI TestAndClearBit ( IN INT32 Bit, IN VOID *Address ) { UINT16 Word, Read; UINT16 Mask; // // Calculate the effective address relative to 'Address' based on the // higher order bits of 'Bit'. Use signed shift instead of division to // ensure we round towards -Inf, and end up with a positive shift in // 'Bit', even if 'Bit' itself is negative. // Address = (VOID *)((UINT8 *)Address + ((Bit >> 4) * sizeof (UINT16))); Mask = 1U << (Bit & 15); for (Word = *(UINT16 *)Address; Word &Mask; Word = Read) { Read = InterlockedCompareExchange16 (Address, Word, Word & ~Mask); if (Read == Word) { return 1; } } return 0; }