From e53a018ffe378af678fa0e7b3c0bc7d098d83ac9 Mon Sep 17 00:00:00 2001 From: Kyle Gunger Date: Wed, 22 Feb 2023 16:22:21 -0500 Subject: Apprehensive multiplication and division --- tnslc/simple.tnsl | 6 +-- tnslc/tnslc.tnsl | 138 ++++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 122 insertions(+), 22 deletions(-) diff --git a/tnslc/simple.tnsl b/tnslc/simple.tnsl index 795b626..bbe8ba3 100644 --- a/tnslc/simple.tnsl +++ b/tnslc/simple.tnsl @@ -1,6 +1,6 @@ uint a = 2, b = 4 +{}uint8 str = "Hello" -/; raw main [int] - int c = a + b - raw return c + a - b +/; main [int] + return 273 ;/ \ No newline at end of file diff --git a/tnslc/tnslc.tnsl b/tnslc/tnslc.tnsl index 408ebb9..760f4cd 100644 --- a/tnslc/tnslc.tnsl +++ b/tnslc/tnslc.tnsl @@ -562,51 +562,148 @@ ;/ ;/ + /; ax_compute + ;{}uint8 s_ext = "", op = "idiv" + /; if (v.loc_type == LOCATION.LITERAL || v.loc_type == LOCATION.REGISTER) + ;s_ext = mov_by_size(sz) + ;; if (self.data_type.name{0} == 'u') + ;op{0} = ' ' + ;/ + + ;dat`.csec = string_join( { + dat`.csec, + "\tmov ", get_reg(0, sz), ", ", self.norm_loc(sz), "\n" + }, "") + + /; if (v.loc_type == LOCATION.LITERAL) + ;dat`.csec = string_join( { + dat`.csec, + "\tmov ", get_reg(3, sz), ", ", v.norm_loc(sz), "\n", + "\t", op, " ", s_ext, get_reg(3, sz), "\n", + "\tmov ", self.norm_loc(sz), ", ", get_reg(3, sz), "\n" + }, "") + ;; else + ;dat`.csec = string_join( { + dat`.csec, + "\t", op, " ", s_ext, v.norm_loc(sz), "\n", + "\tmov ", self.norm_loc(sz), ", ", get_reg(3, sz), "\n" + }, "") + ;/ + + ;/ + /; div (Variable v, ~CompData dat) + ;int sz = self.norm_size() /; if (self.loc_type == LOCATION.LITERAL) /; if (v.loc_type !== LOCATION.LITERAL) - ;v.div(self) + ;v.mul(self) ;; else - ;self.location = self.location / v.location + ;self.location = self.location * v.location ;/ - ;; else if (self.loc_type == LOCATION.STACK && v.loc_type == LOCATION.STACK) - ;{}uint8 out = "" - # TODO - ;return out ;; else - ;return self.norm_op("div", { self.norm_loc(self.norm_size()), v.norm_loc(self.norm_size()) }) + ;{}uint8 s_ext = "", op = "idiv" + /; if (v.loc_type == LOCATION.LITERAL || v.loc_type == LOCATION.REGISTER) + ;s_ext = mov_by_size(sz) + ;; if (self.data_type.name{0} == 'u') + ;op{0} = ' ' + ;/ + + ;dat`.csec = string_join( { + dat`.csec, + "\tmov ", get_reg(0, sz), ", ", self.norm_loc(sz), "\n" + }, "") + + /; if (v.loc_type == LOCATION.LITERAL) + ;dat`.csec = string_join( { + dat`.csec, + "\tmov ", get_reg(3, sz), ", ", v.norm_loc(sz), "\n", + "\t", op, " ", s_ext, get_reg(3, sz), "\n", + "\tmov ", self.norm_loc(sz), ", ", get_reg(0, sz), "\n" + }, "") + ;; else + ;dat`.csec = string_join( { + dat`.csec, + "\t", op, " ", s_ext, v.norm_loc(sz), "\n", + "\tmov ", self.norm_loc(sz), ", ", get_reg(0, sz), "\n" + }, "") + ;/ ;/ ;/ /; mod (Variable v, ~CompData dat) + ;int sz = self.norm_size() /; if (self.loc_type == LOCATION.LITERAL) /; if (v.loc_type !== LOCATION.LITERAL) - ;v.div(self) + ;v.mul(self) ;; else - ;self.location = self.location % v.location + ;self.location = self.location * v.location ;/ - ;; else if (self.loc_type == LOCATION.STACK && v.loc_type == LOCATION.STACK) - ;{}uint8 out = "" - # TODO - ;return out ;; else - ;return self.norm_op("div", { self.norm_loc(self.norm_size()), v.norm_loc(self.norm_size()) }) + ;{}uint8 s_ext = "", op = "idiv" + /; if (v.loc_type == LOCATION.LITERAL || v.loc_type == LOCATION.REGISTER) + ;s_ext = mov_by_size(sz) + ;; if (self.data_type.name{0} == 'u') + ;op{0} = ' ' + ;/ + + ;dat`.csec = string_join( { + dat`.csec, + "\tmov ", get_reg(0, sz), ", ", self.norm_loc(sz), "\n" + }, "") + + /; if (v.loc_type == LOCATION.LITERAL) + ;dat`.csec = string_join( { + dat`.csec, + "\tmov ", get_reg(3, sz), ", ", v.norm_loc(sz), "\n", + "\t", op, " ", s_ext, get_reg(3, sz), "\n", + "\tmov ", self.norm_loc(sz), ", ", get_reg(3, sz), "\n" + }, "") + ;; else + ;dat`.csec = string_join( { + dat`.csec, + "\t", op, " ", s_ext, v.norm_loc(sz), "\n", + "\tmov ", self.norm_loc(sz), ", ", get_reg(3, sz), "\n" + }, "") + ;/ ;/ ;/ /; mul (Variable v, ~CompData dat) + ;int sz = self.norm_size() /; if (self.loc_type == LOCATION.LITERAL) /; if (v.loc_type !== LOCATION.LITERAL) ;v.mul(self) ;; else ;self.location = self.location * v.location ;/ - ;; else if (self.loc_type == LOCATION.STACK && v.loc_type == LOCATION.STACK) - ;{}uint8 out = "" - # TODO - ;return out + ;; else + ;{}uint8 s_ext = "", op = "imul" + /; if (v.loc_type == LOCATION.LITERAL || v.loc_type == LOCATION.REGISTER) + ;s_ext = mov_by_size(sz) + ;; if (self.data_type.name{0} == 'u') + ;op{0} = ' ' + ;/ + + ;dat`.csec = string_join( { + dat`.csec, + "\tmov ", get_reg(0, sz), ", ", self.norm_loc(sz), "\n" + }, "") + + /; if (v.loc_type == LOCATION.LITERAL) + ;dat`.csec = string_join( { + dat`.csec, + "\tmov ", get_reg(3, sz), ", ", v.norm_loc(sz), "\n", + "\t", op, " ", s_ext, get_reg(3, sz), "\n", + "\tmov ", self.norm_loc(sz), ", ", get_reg(0, sz), "\n" + }, "") + ;; else + ;dat`.csec = string_join( { + dat`.csec, + "\t", op, " ", s_ext, v.norm_loc(sz), "\n", + "\tmov ", self.norm_loc(sz), ", ", get_reg(0, sz), "\n" + }, "") + ;/ ;/ - ;return self.norm_op("mul", { self.norm_loc(self.norm_size()), v.norm_loc(self.norm_size()) }) ;/ /; set (Variable v, ~CompData dat) @@ -1608,6 +1705,9 @@ ;s1 = _eval_value(tok, start, first, out, current, scope, t, alt) ;; else ;s1 = _eval_value(tok, start, first, out, current, scope, t, alt) + /; if (tok`{first}.cmp("=")) + ;t = s1.data_type + ;/ ;s2 = _eval_value(tok, first + 1, max, out, current, scope, t, !alt) ;tnsl.io.print("Calculated s2 as ") ;tnsl.io.println(s2.name) -- cgit v1.2.3