code wiki / (root) / nx_nx86_test.nx

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}