Ignore:
Timestamp:
May 21, 2020, 5:11:46 PM (21 months ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
arm-eh, jacob/cs343-translation, master, new-ast, new-ast-unique-expr
Children:
2802824
Parents:
9da5a50
Message:

Added simple SNZI implementation for the relaxed list

File:
1 edited

Legend:

Unmodified
Added
Removed
  • doc/theses/thierry_delisle_PhD/code/utils.hpp

    r9da5a50 r33e62f1b  
    143143#endif
    144144}
     145
     146struct spinlock_t {
     147        std::atomic_bool ll = { false };
     148
     149        inline void lock() {
     150                while( __builtin_expect(ll.exchange(true),false) ) {
     151                        while(ll.load(std::memory_order_relaxed))
     152                                asm volatile("pause");
     153                }
     154        }
     155
     156        inline bool try_lock() {
     157                return false == ll.exchange(true);
     158        }
     159
     160        inline void unlock() {
     161                ll.store(false, std::memory_order_release);
     162        }
     163
     164        inline explicit operator bool() {
     165                return ll.load(std::memory_order_relaxed);
     166        }
     167};
     168
     169static inline bool bts(std::atomic_size_t & target, size_t bit ) {
     170        //*
     171        int result = 0;
     172        asm volatile(
     173                "LOCK btsq %[bit], %[target]\n\t"
     174                :"=@ccc" (result)
     175                : [target] "m" (target), [bit] "r" (bit)
     176        );
     177        return result != 0;
     178        /*/
     179        size_t mask = 1ul << bit;
     180        size_t ret = target.fetch_or(mask, std::memory_order_relaxed);
     181        return (ret & mask) != 0;
     182        //*/
     183}
     184
     185static inline bool btr(std::atomic_size_t & target, size_t bit ) {
     186        //*
     187        int result = 0;
     188        asm volatile(
     189                "LOCK btrq %[bit], %[target]\n\t"
     190                :"=@ccc" (result)
     191                : [target] "m" (target), [bit] "r" (bit)
     192        );
     193        return result != 0;
     194        /*/
     195        size_t mask = 1ul << bit;
     196        size_t ret = target.fetch_and(~mask, std::memory_order_relaxed);
     197        return (ret & mask) != 0;
     198        //*/
     199}
Note: See TracChangeset for help on using the changeset viewer.