nx_atom_kat.nx source
↩ module page · 30 lines · 1418 B
1// KAT: verify the atomic instructions (xchgq store, xaddq FAA, lock cmpxchgq CAS) encode + EXECUTE correctly.
2// Expect: ATOMICS_OK.
3import "nx_syscalls.nx"
4import "nx_atom.nx"
5
6func main() -> i64 {
7 let p: *i64 = sys_mmap(8) as *i64
8 p[0] = 100
9
10 nx_atom_store_i64(p, 42, NX_MO_SEQ_CST) // xchgq
11 if p[0] != 42 { sys_write(1, "STORE_BAD\n" as *u8, 10); sys_exit(1); return 1 }
12
13 let v: i64 = nx_atom_load_i64(p, NX_MO_SEQ_CST)
14 if v != 42 { sys_write(1, "LOAD_BAD\n" as *u8, 9); sys_exit(1); return 1 }
15
16 let prev: i64 = nx_atom_faa_i64(p, 8, NX_MO_SEQ_CST) // lock xaddq: 42->50, returns 42
17 if prev != 42 { sys_write(1, "FAA_RET_BAD\n" as *u8, 12); sys_exit(1); return 1 }
18 if p[0] != 50 { sys_write(1, "FAA_VAL_BAD\n" as *u8, 12); sys_exit(1); return 1 }
19
20 let ok: i64 = nx_atom_cas_i64(p, 50, 99, NX_MO_SEQ_CST) // lock cmpxchgq: 50==50 -> 99, returns 1
21 if ok != 1 { sys_write(1, "CAS_RET_BAD\n" as *u8, 12); sys_exit(1); return 1 }
22 if p[0] != 99 { sys_write(1, "CAS_VAL_BAD\n" as *u8, 12); sys_exit(1); return 1 }
23
24 let ok2: i64 = nx_atom_cas_i64(p, 50, 0, NX_MO_SEQ_CST) // 99 != 50 -> no swap, returns 0
25 if ok2 != 0 { sys_write(1, "CAS2_RET_BAD\n" as *u8, 13); sys_exit(1); return 1 }
26 if p[0] != 99 { sys_write(1, "CAS2_VAL_BAD\n" as *u8, 13); sys_exit(1); return 1 }
27
28 sys_write(1, "ATOMICS_OK\n" as *u8, 11)
29 sys_exit(0); return 0
30}