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}