nx_nx86_test.nx source
↩ module page · 112 lines · 3203 B
1// End-to-end self-host pipeline test:
2// NishiLang source -> nx_nlex -> nx_nparse -> nx_nir -> nx_nx86 -> asm text
3// All four stages in NishiLang.
4
5import "syscalls.nx"
6import "nx_nlex.nx"
7import "nx_nparse.nx"
8import "nx_nir.nx"
9import "nx_nx86.nx"
10
11func main() -> i64 {
12 let src: *u8 = sys_mmap(64)
13 src[0] = 102 as u8 // f
14 src[1] = 117 as u8 // u
15 src[2] = 110 as u8 // n
16 src[3] = 99 as u8 // c
17 src[4] = 32 as u8
18 src[5] = 109 as u8
19 src[6] = 97 as u8
20 src[7] = 105 as u8
21 src[8] = 110 as u8
22 src[9] = 40 as u8
23 src[10] = 41 as u8
24 src[11] = 32 as u8
25 src[12] = 45 as u8
26 src[13] = 62 as u8
27 src[14] = 32 as u8
28 src[15] = 105 as u8
29 src[16] = 54 as u8
30 src[17] = 52 as u8
31 src[18] = 32 as u8
32 src[19] = 123 as u8
33 src[20] = 32 as u8
34 src[21] = 114 as u8
35 src[22] = 101 as u8
36 src[23] = 116 as u8
37 src[24] = 117 as u8
38 src[25] = 114 as u8
39 src[26] = 110 as u8
40 src[27] = 32 as u8
41 src[28] = 52 as u8
42 src[29] = 50 as u8
43 src[30] = 32 as u8
44 src[31] = 125 as u8
45
46 // Stage 1: lex
47 let lex: *NxNLexer = nx_nlex_new(src, 32, 32)
48 if nx_nlex_run(lex) != 11 { return 1 }
49
50 // Stage 2: parse
51 let parser: *NxNParser = nx_nparse_new(lex, 32)
52 let func_idx: i64 = nx_nparse_run(parser)
53 if func_idx < 0 { return 2 }
54
55 // Stage 3: IR build
56 let ir: *NxIrFunc = nx_nir_lower_func(parser, func_idx, 32)
57 if ir == (0 as *NxIrFunc) { return 3 }
58 if ir.n_instrs != 2 { return 4 }
59
60 // Stage 4: emit x86_64 asm
61 let asm: *NxAsmBuf = nx_asm_new(2048)
62 nx_nx86_emit_func(asm, src, ir)
63
64 // Verify asm contains key strings. Search for "movabsq $42" pattern.
65 var found_mov: i64 = 0
66 var found_ret: i64 = 0
67 var found_42: i64 = 0
68 var i: i64 = 0
69 while i < asm.len - 4 {
70 // Look for 'r','e','t','\n'
71 if asm.buf[i] as i64 == 114 {
72 if asm.buf[i+1] as i64 == 101 {
73 if asm.buf[i+2] as i64 == 116 {
74 if asm.buf[i+3] as i64 == 10 {
75 found_ret = 1
76 }
77 }
78 }
79 }
80 // Look for 'm','o','v','a','b','s','q'
81 if asm.buf[i] as i64 == 109 {
82 if asm.buf[i+1] as i64 == 111 {
83 if asm.buf[i+2] as i64 == 118 {
84 if asm.buf[i+3] as i64 == 97 {
85 if asm.buf[i+4] as i64 == 98 {
86 if asm.buf[i+5] as i64 == 115 {
87 if asm.buf[i+6] as i64 == 113 {
88 found_mov = 1
89 }
90 }
91 }
92 }
93 }
94 }
95 }
96 // Look for '4','2' as immediate
97 if asm.buf[i] as i64 == 36 { // '$'
98 if asm.buf[i+1] as i64 == 52 { // '4'
99 if asm.buf[i+2] as i64 == 50 { // '2'
100 found_42 = 1
101 }
102 }
103 }
104 i = i + 1
105 }
106
107 if found_mov != 1 { return 10 }
108 if found_ret != 1 { return 11 }
109 if found_42 != 1 { return 12 }
110
111 return 0
112}