code wiki / (root) / _offc_bitset_helper_probe.nx

_offc_bitset_helper_probe.nx source

↩ module page · 39 lines · 1245 B

1// Verify bit-set helpers when called through indirection — same shape as 2// bit_word/bit_test/bit_set in regalloc.nx. 3 4import "syscalls.nx" 5 6func bit_word(buf: *i64, b: i64, words: i64, v: i64) -> *i64 { 7 let off: i64 = b * words + (v / 64) 8 let base: i64 = buf as i64 9 return (base + off * 8) as *i64 10} 11 12func bit_test(buf: *i64, b: i64, words: i64, v: i64) -> i64 { 13 let w: *i64 = bit_word(buf, b, words, v) 14 let mask: i64 = 1 << (v % 64) 15 if (w[0] & mask) != 0 { return 1 } 16 return 0 17} 18 19func bit_set(buf: *i64, b: i64, words: i64, v: i64) -> i64 { 20 let w: *i64 = bit_word(buf, b, words, v) 21 let mask: i64 = 1 << (v % 64) 22 w[0] = w[0] | mask 23 return 0 24} 25 26func main() -> i64 { 27 let raw: *u8 = sys_mmap(128) 28 let buf: *i64 = raw as *i64 29 bit_set(buf, 0, 2, 5) 30 bit_set(buf, 0, 2, 70) 31 bit_set(buf, 1, 2, 12) 32 var n: i64 = 0 33 if bit_test(buf, 0, 2, 5) != 0 { n = n + 1 } 34 if bit_test(buf, 0, 2, 70) != 0 { n = n + 2 } 35 if bit_test(buf, 1, 2, 12) != 0 { n = n + 4 } 36 if bit_test(buf, 0, 2, 4) != 0 { n = n + 8 } // should be 0 37 if bit_test(buf, 1, 2, 70) != 0 { n = n + 16 } // should be 0 38 return n // expect 7 (1+2+4) 39}