summaryrefslogtreecommitdiff
path: root/tnslc
diff options
context:
space:
mode:
Diffstat (limited to 'tnslc')
-rw-r--r--tnslc/compile/function.tnsl18
-rw-r--r--tnslc/compile/var.tnsl56
2 files changed, 72 insertions, 2 deletions
diff --git a/tnslc/compile/function.tnsl b/tnslc/compile/function.tnsl
index 0f885f8..18d6c36 100644
--- a/tnslc/compile/function.tnsl
+++ b/tnslc/compile/function.tnsl
@@ -38,9 +38,9 @@ struct Function {
p.loc = reg
reg++
;; else
+ stack_up = stack_up + p.actual_size()
p.loc = 0 - 1
p.offset = stack_up
- stack_up = stack_up + p.actual_size()
;/
self.inputs.push(~p)
;/
@@ -51,6 +51,9 @@ struct Function {
~parse.Node n
parse.Node dummy
dummy.data = "### OUTPUT ###\0"
+
+ int reg = 1
+ int stack = 0
/; loop (int i = 0; i < tl`.sub.count) [i++]
n = tl`.sub.get(i)
/; if (n`._type == parse.NTYPE_TYPE)
@@ -58,6 +61,19 @@ struct Function {
Var r
r.init(n, ~dummy)
r._resolve_type(parent)
+
+ /; if (r.regable() == true && reg < 7)
+ r.loc = reg
+ /; if (reg > 4)
+ r.loc = r.loc + 4
+ ;/
+ reg++
+ ;; else
+ r.loc = 0 - 1
+ r.offset = stack
+ stack = stack + r.actual_size()
+ ;/
+
self.outputs.push(~r)
;/
;/
diff --git a/tnslc/compile/var.tnsl b/tnslc/compile/var.tnsl
index ff417c2..cf12878 100644
--- a/tnslc/compile/var.tnsl
+++ b/tnslc/compile/var.tnsl
@@ -383,6 +383,21 @@ struct Var {
/; _set_mem(~CompBuf buf, ~Var other)
+ ~uint8 to_str = self.gen_loc()
+ ~uint8 from_str = other`.gen_loc()
+
+ ~uint8 str
+
+ str = utils.int_to_str(self.actual_size())
+ buf`.add_c(" mov rcx, \0")
+ buf`.add_c(str)
+ buf`.add_c("\n")
+ _delete(str)
+
+ buf`.add_c(" rep movsb\0")
+
+ _delete(to_str)
+ _delete(from_str)
;/
# Set this Variable to the value of other
@@ -394,9 +409,48 @@ struct Var {
/; set_ref(~CompBuf buf, ~Var other)
;/
+ # Generate a variable which can actually be used for operations
+ /; strip_refs (~CompBuf buf, bool from) [Var]
+ Var out = self.copy()
+ ~int32 p = out.top_ptrc()
+ /; if (p == NULL)
+ return out
+ ;; else if (p` !== 0)
+ return out
+ ;/
+
+ ~uint8 gen = out.gen_loc()
+
+ out.ptr_pop()
+ p = out.top_ptrc()
+ /; loop (p` == 0)
+ buf`.add_c(" mov rsi, \0")
+ buf`.add_c(gen)
+ buf`.add_c("\n\0")
+ out.loc = 5
+ _delete(gen)
+ gen = out.gen_loc()
+ out.ptr_pop()
+ p = out.top_ptrc()
+ ;/
+
+ /; if (from == false)
+ buf`.add_c(" mov rdi, \0")
+ out.loc = 6
+ ;; else
+ buf`.add_c(" mov rsi, \0")
+ out.loc = 5
+ ;/
+ buf`.add_c(gen)
+ buf`.add_c("\n\0")
+ _delete(gen)
+
+ return out
+ ;/
+
/; standard_op (~CompBuf buf, ~Var other, ~uint8 op_str)
- ~uint8 from_str = other`.gen_loc()
~uint8 to_str = self.gen_loc()
+ ~uint8 from_str = other`.gen_loc()
buf`.add_c(" \0")
buf`.add_c(op_str)