llvm-mos-sdk
llvm-mos-sdk copied to clipboard
Implement <atomic>
Since we define there to be exactly one main thread, we can have a fairly trivial implementation. Special care should be given to whether char is defined to be lock-free; lock free atomics gain additional semantics WRT signal handlers. The others should not be lock-free, since they're not actually atomic.
What is the intended abstract machine like? A single-processor system with only a main thread and some interrupt handler routines? In such case, it would seem that some special cases, such as std::atomic<char>::fetch_add(1)
or std::atomic<char>::fetch_sub(1)
where the return value is not needed, could be translated into inc
or dec
. In other cases, we would seem to need sei
and cli
wrapping around normal instructions (if we ignore race conditions with NMI handlers). Technically, some special cases, such as
inline bool f(std::atomic<char> &a) { return a.fetch_sub(1)==1; }
could be translated into dec
and checking the Z flag. The N and V flags could be utilized in some cases as well.
I only now realized that std::atomic
lacks any bit-shifting operations, which along with inc
and dec
are the only read-modify-write operations that the NMOS 6502 implemented. Special cases of the fetch_or()
and fetch_and()
could be translated into the 65C02 8-bit trb
or tsb
instructions, somewhat similar to the 80386 1-bit BTR
and BTS
.
I assume that supporting the C++20 std::atomic::wait()
along with notify_one()
and notify_all()
is out of the question, because it would require implementing a wait queue as well as a thread scheduler.
It's not common, but also not unheard of, to build a little multithreaded rtos on the 6502 using timer interrupts and the like.
I'd expect that there'd only be a couple true wait-free atomics on the 6502; just the ones you mentioned. TSB and TRB should allow building a wait free book, but honestly I haven't thought too much about the details yet.
Most of the library would then basically reduce down to lock libcalls that could be satisfied by anyone writing a threading library. Aside from atomic