code wiki / (root) / regalloc_test.nx

regalloc_test.nx source

↩ module page · 57 lines · 1761 B

1// regalloc_test.nx -- self-test for regalloc.nx. 2 3import "nx_syscalls.nx" 4import "nx_types.nx" 5import "nx_ir.nx" 6import "nx_regalloc.nx" 7 8func main() -> i64 { 9 let m_raw: *u8 = sys_mmap(256) 10 let m: *Module = m_raw as *Module 11 m.name = "ra_test" as *u8 12 m.functions = 0 as *Function 13 m.n_functions = 0 14 15 let f: *Function = ir_function_new(m, "main" as *u8, 4, ir_type_i64()) 16 let b: *BasicBlock = ir_block_new(f) 17 18 let c10: i64 = ir_const_i64(f, 10) 19 let c20: i64 = ir_const_i64(f, 20) 20 let sum: i64 = ir_emit_binop(b, OP_ADD, c10, c20, ir_type_i64()) 21 ir_emit_return(b, sum) 22 23 let locs_raw: *u8 = sys_mmap(f.n_values * 16 + 16) 24 let locs: *ValueLoc = locs_raw as *ValueLoc 25 26 let mask_raw: *u8 = sys_mmap(16) 27 let mask: *i64 = mask_raw as *i64 28 *mask = 0 29 30 let sb_raw: *u8 = sys_mmap(16) 31 let sb: *i64 = sb_raw as *i64 32 *sb = 0 33 let mask_fpr_raw: *u8 = sys_mmap(16) 34 let mask_fpr: *i64 = mask_fpr_raw as *i64 35 *mask_fpr = 0 36 37 regalloc_function(f, locs, mask, mask_fpr, sb) 38 39 if *sb != 0 { return 1 } 40 41 let lbase: i64 = locs as i64 42 let l0: *ValueLoc = (lbase + 0 * 16) as *ValueLoc 43 let l1: *ValueLoc = (lbase + 1 * 16) as *ValueLoc 44 let l2: *ValueLoc = (lbase + 2 * 16) as *ValueLoc 45 // c10 + c20 are CONST_INT -> rematerialised inline at use sites 46 // (no register slot consumed). sum is the binop result and 47 // gets a real register. 48 if l0.kind != VL_REMAT { return 2 } 49 if l1.kind != VL_REMAT { return 3 } 50 if l2.kind != VL_REGISTER { return 4 } 51 52 // sum's home should be a t-reg (no calls in this function -> no 53 // s-reg promotion). 54 if l2.idx >= 4 { return 7 } 55 56 return 0 57}