summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tnslc/c_wrap.tnsl35
-rw-r--r--tnslc/tnslc.tnsl95
-rw-r--r--tnslc/tnslc_wrapped.tnsl20
3 files changed, 116 insertions, 34 deletions
diff --git a/tnslc/c_wrap.tnsl b/tnslc/c_wrap.tnsl
index 7348417..9c0faf6 100644
--- a/tnslc/c_wrap.tnsl
+++ b/tnslc/c_wrap.tnsl
@@ -1,14 +1,15 @@
asm "extern malloc"
asm "extern realloc"
asm "extern free"
+asm "extern printf"
/; _alloc (uint size) [~void]
~void out
# Mov size into proper register, and set all extras to zero
- asm "mov rdi, rax"
- asm "mov rsi, 0"
+ asm "mov rcx, rax"
asm "mov rdx, 0"
- asm "mov rcx, 0"
+ asm "mov rdi, 0"
+ asm "mov rsi, 0"
asm "mov r8, 0"
asm "mov r9, 0"
asm "mov r10, 0"
@@ -22,10 +23,10 @@ asm "extern free"
/; _realloc (~void ptr, uint new_size) [~void]
~void out
# Mov ptr and new size into proper registers, and set all extras to zero
- asm "mov rdi, rax"
- asm "mov rsi, rbx"
- asm "mov rdx, 0"
- asm "mov rcx, 0"
+ asm "mov rcx, rax"
+ asm "mov rdx, rbx"
+ asm "mov rdi, 0"
+ asm "mov rsi, 0"
asm "mov r8, 0"
asm "mov r9, 0"
asm "mov r10, 0"
@@ -39,10 +40,10 @@ asm "extern free"
/; _delete (~void ptr)
# setup call by clearing most values
- asm "mov rdi, rax"
- asm "mov rsi, 0"
+ asm "mov rcx, rax"
asm "mov rdx, 0"
- asm "mov rcx, 0"
+ asm "mov rdi, 0"
+ asm "mov rsi, 0"
asm "mov r8, 0"
asm "mov r9, 0"
asm "mov r10, 0"
@@ -51,6 +52,20 @@ asm "extern free"
# there's no more to do 'cause free returns nothing
;/
+/; _printf (~void str)
+ # setup call by clearing most values
+ asm "mov rcx, rax"
+ asm "mov rdx, 0"
+ asm "mov rdi, 0"
+ asm "mov rsi, 0"
+ asm "mov r8, 0"
+ asm "mov r9, 0"
+ asm "mov r10, 0"
+ # do call
+ asm "call printf"
+ # there's no more to do 'cause free returns nothing
+;/
+
struct Vector {
uint
el_size,
diff --git a/tnslc/tnslc.tnsl b/tnslc/tnslc.tnsl
index fdc75e0..844788c 100644
--- a/tnslc/tnslc.tnsl
+++ b/tnslc/tnslc.tnsl
@@ -1225,19 +1225,13 @@
;op = string_add("i", op)
;/
- /; if (self.loc_type !== LOCATION.REGISTER && v.loc_type !== LOCATION.REGISTER)
- ;data`.csec = string_join( {
- data`.csec,
- "\t", op, " ", self.norm_loc(sz), v.norm_loc(sz), "\n"
- }, "")
- ;; else
- ;data`.csec = string_join( {
- data`.csec,
- "\tmov ", get_reg(0, sz), ", ", v.norm_loc(sz), "\n",
- "\t", op, " ", self.norm_loc(sz), "\n",
- "\tmov ", self.norm_loc(sz), ", ", get_reg(keep, sz), "\n"
- }, "")
- ;/
+ ;data`.csec = string_join( {
+ data`.csec,
+ "\tmov ", get_reg(0, sz), ", ", self.norm_loc(sz), "\n",
+ "\tmov ", get_reg(3, sz), ", ", v.norm_loc(sz), "\n",
+ "\t", op, " ", get_reg(3, sz), "\n",
+ "\tmov ", self.norm_loc(sz), ", ", get_reg(keep, sz), "\n"
+ }, "")
;/
;/
@@ -1565,6 +1559,25 @@
;return out
;/
+ /; get_full_tmp_stack [int]
+ ;int out = self.tmp
+ /; if (self.is_cf())
+ ;out = out + self.parent`.get_full_tmp_stack()
+ ;/
+
+ /; loop (int i = 0; i < len (self.vars)) [i++]
+ /; if (self.vars{i}.loc_type == LOCATION.STACK)
+ ;out = out + self.vars{i}.norm_size()
+ ;/
+ ;/
+
+ /; if (!(self.is_cf()) && !(self.r))
+ ;return out + 72
+ ;/
+
+ ;return out
+ ;/
+
/; next_loc (Type t) [int]
/; if (is_primitive(t.name) !< 0 || len (t.ptr_chain) > 0)
;log_debug("Next reg")
@@ -1725,7 +1738,7 @@
/; new_tmp_var (Type t, ~CompData out) [Variable]
;Variable new = {"##tmp", t, 0, 0}
;new.loc_type = LOCATION.STACK
- ;new.location = self.get_stack() + self.tmp + new.norm_size()
+ ;new.location = self.get_full_tmp_stack() + self.tmp + new.norm_size()
;self.tmp = self.tmp + new.norm_size()
;out`.csec = string_join( {
out`.csec,
@@ -2666,7 +2679,7 @@
;/
# FIXME: should set up the call by eval of all params
-/; _setup_call (~{}Token tok, int start, Variable base, ~CompData out, mov, ~Module current, ~Scope scope) [Function]
+/; _setup_call (~{}Token tok, int start, Variable base, ~CompData out, mov, ~Module current, ~Scope scope, ~int layer) [Function]
;{}uint8 name = tok`{start}.data
;start++
;int max = find_closing(tok, ~start)
@@ -2693,7 +2706,7 @@
;ctmp.data_type.ptr_chain.append(PTYPE.REFERENCE)
/; if (!(ctmp.is_prim()) || regs > 5)
- ;Variable val = _eval_value(tok, start, _param_end(tok, start), out, mov, current, scope, t, true)
+ ;Variable val = _eval_value(tok, start, _param_end(tok, start), out, mov, current, scope, t, layer)
;out`.csec = string_join( {
out`.csec,
"\tsub rsp, ", int_to_string(ctmp.norm_size()), "\n"
@@ -2721,7 +2734,7 @@
;ctmp.data_type.ptr_chain.append(PTYPE.REFERENCE)
/; if (ctmp.is_prim() && regs < 6)
- ;Variable val = _eval_value(tok, start, _param_end(tok, start), out, mov, current, scope, t, true)
+ ;Variable val = _eval_value(tok, start, _param_end(tok, start), out, mov, current, scope, t, layer)
;out`.csec = string_join( {
out`.csec,
@@ -2853,13 +2866,47 @@
;; else if (tok`{start` + 1}.cmp("(") && tok`{start`}.type_is(TOKEN.DEFWORD))
;log_debug("Call")
- ## Pre-flight check
- #;CompData trash = {"", "", ""}
- #;_setup_call(tok, start`, wk, ~trash, mov, current, scope)
+ ## Pre-flight check
+ # ;CompData trash = {"", "", ""}
+ # ;_setup_call(tok, start`, wk, ~trash, mov, current, scope)
- # Actually do call
- ;Function to_call = _setup_call(tok, start`, wk, out, mov, current, scope)
+ # Actually do call
+
+
+ /; if (layer` > 1)
+ ;out`.csec = string_join({
+ out`.csec,
+ "\tpush rbx\n"
+ } , "")
+ ;scope`.tmp = scope`.tmp + 8
+ ;; if (layer` > 2)
+ ;out`.csec = string_join({
+ out`.csec,
+ "\tpush rcx\n"
+ } , "")
+ ;scope`.tmp = scope`.tmp + 8
+ ;/
+
+ ;int lfc = 0
+ ;Scope call_sc = scope`.new_sub_cf("call")
+ ;Function to_call = _setup_call(tok, start`, wk, out, mov, current, ~call_sc, ~lfc)
;wk = _perform_call(to_call, out)
+ ;call_sc.clear_tmp(out)
+
+ /; if (layer` > 2)
+ ;out`.csec = string_join({
+ out`.csec,
+ "\tpop rcx\n"
+ } , "")
+ ;scope`.tmp = scope`.tmp - 8
+ ;; if (layer` > 1)
+ ;out`.csec = string_join({
+ out`.csec,
+ "\tpop rbx\n"
+ } , "")
+ ;scope`.tmp = scope`.tmp - 8
+ ;/
+
;start`++
;start` = find_closing(tok, start)
;/
@@ -3400,7 +3447,7 @@
/; if (cf.is_cf())
;out`.csec = string_join( {
out`.csec,
- "\t", cf.parent`.scope_end_label(), ":\n"
+ cf.parent`.scope_end_label(), ":\n"
}, "")
;/
;/
@@ -3642,7 +3689,7 @@
/; if (tok{i}.cmp(":"))
;log_debug("INCLUDE")
/; if (tok{i + 2}.type_is(TOKEN.LITERAL))
- ;CompData tmp = compile_file_pass_one(f.relative(unquote_str(tok{i + 2}.data)), current)
+ ;compile_file_pass_one(f.relative(unquote_str(tok{i + 2}.data)), current)
;i = i + 2
;/
;continue
diff --git a/tnslc/tnslc_wrapped.tnsl b/tnslc/tnslc_wrapped.tnsl
new file mode 100644
index 0000000..398db47
--- /dev/null
+++ b/tnslc/tnslc_wrapped.tnsl
@@ -0,0 +1,20 @@
+:include "c_wrap.tnsl"
+
+/; main (int argc, ~~uint argv) [int]
+ # On windows, the first two arguments are passed in RCX and RDX, so we need to
+ # update their positions here or else tnsl will have garbage values in r8 and r9
+ asm "mov r8, rcx"
+ asm "mov r9, rdx"
+
+ # If on linux, you would use rdi and rsi instead of rcx and rdx, respectively
+ # simply comment out the bove asm, and uncomment the below lines
+ # asm "mov r8, rdi"
+ # asm "mov r9, rsi"
+
+ Vector vec
+ vec.start(1)
+ uint8 a = 1
+ vec.push(~a)
+ ~uint8 v = vec.get(0)
+ return v`
+;/ \ No newline at end of file