code wiki / (root) / nx_atom_kat.nx

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}