atomics A.1a: RMW ops + recognizer + methods, emit bails (lock)
fetch_add/sub/and/or/xor/min/max wired end-to-end except LLVM emission (bails
loudly; A.1b makes it real). New IR op atomic_rmw + RmwKind (no nand) +
AtomicRmw{ptr, operand, val_ty, ordering, kind}. print arm; comptime_vm arm
implements real single-thread RMW (load/compute/store/return-old, signed|unsigned
min/max from val_ty). Recognizer extended (rmwKindFromName) — RMW restricted to
integer T (float fadd / pointer RMW out of scope, rejected loudly); all orderings
valid for RMW. Methods fetch_* on Atomic($T) with comptime $o: Ordering.
examples/1701 locked to the bail. Suite green (716/0).
This commit is contained in:
22
examples/1701-atomics-rmw.sx
Normal file
22
examples/1701-atomics-rmw.sx
Normal file
@@ -0,0 +1,22 @@
|
||||
// Atomic($T) read-modify-write: fetch_add/sub/and/or/xor/min/max → LLVM atomicrmw.
|
||||
// Each returns the OLD value. Stream A (atomics) A.1. Single-thread.
|
||||
#import "modules/std.sx";
|
||||
#import "modules/std/atomic.sx";
|
||||
|
||||
main :: () {
|
||||
a := Atomic(i64).init(10);
|
||||
print("old add: {}\n", a.fetch_add(5, .seq_cst)); // returns 10, now 15
|
||||
print("old sub: {}\n", a.fetch_sub(3, .acq_rel)); // returns 15, now 12
|
||||
print("now: {}\n", a.load(.acquire)); // 12
|
||||
|
||||
b := Atomic(i64).init(0xF0);
|
||||
print("old and: {}\n", b.fetch_and(0x3C, .relaxed));// returns 0xF0(240), now 0x30(48)
|
||||
print("old or: {}\n", b.fetch_or(0x03, .relaxed)); // returns 0x30(48), now 0x33(51)
|
||||
print("old xor: {}\n", b.fetch_xor(0x0F, .relaxed));// returns 0x33(51), now 0x3C(60)
|
||||
print("now: {}\n", b.load(.relaxed)); // 60
|
||||
|
||||
m := Atomic(i64).init(20);
|
||||
print("old min: {}\n", m.fetch_min(8, .seq_cst)); // returns 20, now 8
|
||||
print("old max: {}\n", m.fetch_max(15, .seq_cst)); // returns 8, now 15
|
||||
print("now: {}\n", m.load(.seq_cst)); // 15
|
||||
}
|
||||
1
examples/expected/1701-atomics-rmw.exit
Normal file
1
examples/expected/1701-atomics-rmw.exit
Normal file
@@ -0,0 +1 @@
|
||||
1
|
||||
7
examples/expected/1701-atomics-rmw.stderr
Normal file
7
examples/expected/1701-atomics-rmw.stderr
Normal file
@@ -0,0 +1,7 @@
|
||||
error: atomic rmw LLVM emission not yet implemented (Stream A, A.1b)
|
||||
error: atomic rmw LLVM emission not yet implemented (Stream A, A.1b)
|
||||
error: atomic rmw LLVM emission not yet implemented (Stream A, A.1b)
|
||||
error: atomic rmw LLVM emission not yet implemented (Stream A, A.1b)
|
||||
error: atomic rmw LLVM emission not yet implemented (Stream A, A.1b)
|
||||
error: atomic rmw LLVM emission not yet implemented (Stream A, A.1b)
|
||||
error: atomic rmw LLVM emission not yet implemented (Stream A, A.1b)
|
||||
1
examples/expected/1701-atomics-rmw.stdout
Normal file
1
examples/expected/1701-atomics-rmw.stdout
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
Reference in New Issue
Block a user