1234567891011121314151617181920212223242526272829303132333435363738394041 |
- /** @file
- Implementation of TestAndClearBit using compare-exchange primitive
- Copyright (C) 2015, Linaro Ltd.
- Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #include <Base.h>
- #include <Library/SynchronizationLib.h>
- 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;
- }
|