From 51494729997b457251a62506b87af1635cd19802 Mon Sep 17 00:00:00 2001 From: Kyle Gunger Date: Sun, 9 Oct 2022 15:15:39 -0400 Subject: Basic asm helpers --- tnslc/compile/compile.tnsl | 28 +++++-------------- tnslc/compile/isa_x86.tnsl | 67 +++++++++++++++++++++++++++++----------------- 2 files changed, 49 insertions(+), 46 deletions(-) (limited to 'tnslc/compile') diff --git a/tnslc/compile/compile.tnsl b/tnslc/compile/compile.tnsl index 520ea1f..7d8f012 100644 --- a/tnslc/compile/compile.tnsl +++ b/tnslc/compile/compile.tnsl @@ -14,13 +14,6 @@ EXPRESS OR IMPLIED #/ -/; module compile - - # :include "compile/arch/arch.tnsl" - # :include "compile/comp.tnsl" -;/ - -:include "isa_x86.tnsl" ;{}{}charp COMMON_ASM = { "\tret", @@ -88,18 +81,6 @@ ;/ ;/ -/; header_guard (~VTrack tab, ~{}charp csec) - -;/ - -/; ret_guard (~VTrack tab, {}charp to_ret, ~{}charp csec) - ;tail_guard(csec) - -;/ - -/; tail_guard (~{}charp csec) -;/ - /; compile_statement (~int cur, ~{}Token data, ~{}charp hsec, csec, dsec) ;cur`++ /; if (cur` < len data`) @@ -115,8 +96,8 @@ /; compile_block (~int cur, ~{}Token data, ~{}charp hsec, csec, dsec) ;VTrack tab = { - {"", "", "", "", "", "", "", ""}, - {NT, NT, NT, NT, NT, NT, NT, NT} + {}, + {} } ;{}charp name = {} @@ -182,7 +163,7 @@ ;{}charp dsec = ".data\n" ;int j = len data` - + /# /; loop (int i = 0; i < j) [i++] /; if (string_equate(data`{i}.data`, "/;")) ;compile_block(~i, data, ~hsec, ~csec, ~dsec) @@ -192,6 +173,9 @@ ;break ;/ ;/ + #/ + ;{}charp tmp = add_asm("%eax", "%edx") + ;add_strings(~csec, ~tmp) ;tnsl.io.File out = tnsl.io.writeFile(file) diff --git a/tnslc/compile/isa_x86.tnsl b/tnslc/compile/isa_x86.tnsl index 1dff3f7..0ab8910 100644 --- a/tnslc/compile/isa_x86.tnsl +++ b/tnslc/compile/isa_x86.tnsl @@ -14,18 +14,52 @@ EXPRESS OR IMPLIED #/ -/; push_asm ({}charp reg) [{}charp] - ;{}charp out = "\tpush " - ;add_strings(~out, ~reg) - ;out.append('\n') +/; construct_statement({}charp base, {}{}charp args) [{}charp] + /; loop (int i = 0; i < len args) [i++] + ;add_strings(~base, ~(args{i})) + /; if (i < len args - 1) + ;base.append(',') + ;base.append(' ') + ;/ + ;/ + ;base.append('\n') + ;return base +;/ + +/; literal_num ({}charp num) [{}charp] + ;{}charp out = "$" + ;add_strings(~out, ~num) ;return out ;/ +/; add_asm ({}charp from, to) [{}charp] + ;return construct_statement("\tadd ", {from, to}) +;/ + +/; sub_asm({}charp from, to) [{}charp] + ;return construct_statement("\tsub ", {from, to}) +;/ + +/; push_asm ({}charp reg) [{}charp] + ;return construct_statement("\tpush ", {reg}) +;/ + /; pop_asm ({}charp reg) [{}charp] - ;{}charp out = "\tpop " - ;add_strings(~out, ~reg) - ;out.append('\n') - ;return out + ;return construct_statement("\tpop ", {reg}) +;/ + +/; cmp_asm ({}charp a, b) [{}charp] + ;return construct_statement("\tcmp ", {a, b}) +;/ + +/; jmp_asm ({}charp pos) [{}charp] + ;return construct_statement("\tjmp ", {pos}) +;/ + +/; mem_offset ({}charp pos, offset, scale) [{}charp] + ;{}charp tmp = construct_statement("(", {pos, offset, scale}) + ;tmp{len tmp - 1} = ')' + ;return tmp ;/ /; header_guard [{}charp] @@ -87,7 +121,7 @@ /; if (string_equate(common, "ax") || string_equate(common, "bx") || string_equate(common, "cx") || string_equate(common, "dx")) /; if (size == 1) - common{1} = 'l' + ;common{1} = 'l' ;; else if (size == 4) ;out.append('e') ;; else if (size == 8) @@ -124,18 +158,3 @@ ;return out ;/ - -/; literal_num ({}charp num) [{}charp] - ;{}charp out = "$" - ;add_strings(~out, ~num) - ;return out -;/ - -/; add_asm ({}charp from, to) [{}charp] - ;{}charp out = "\tadd " - ;add_strings(~out, ~from) - ;out.append(',') - ;out.append(' ') - ;add_strings(~out, ~to) - ; -;/ \ No newline at end of file -- cgit v1.2.3