diff options
| author | Kyle Gunger <kgunger12@gmail.com> | 2022-12-30 00:59:44 -0500 | 
|---|---|---|
| committer | Kyle Gunger <kgunger12@gmail.com> | 2022-12-30 00:59:44 -0500 | 
| commit | d49d3c9a13aecada7e33df86dde6a232ae285329 (patch) | |
| tree | 2eaceef6f57a4b20446575e03cebd038ea2bdb94 /tnslc | |
| parent | 3b0ad0c84111be433de39b8a74c03db7e99cb686 (diff) | |
Gen asm to fix registers after a call
Diffstat (limited to 'tnslc')
| -rw-r--r-- | tnslc/compile/compile.tnsl | 121 | ||||
| -rw-r--r-- | tnslc/compile/isa_x86.tnsl | 2 | ||||
| -rw-r--r-- | tnslc/compile/value.tnsl | 29 | ||||
| -rw-r--r-- | tnslc/dummy.tnsl | 2 | 
4 files changed, 110 insertions, 44 deletions
| diff --git a/tnslc/compile/compile.tnsl b/tnslc/compile/compile.tnsl index b7bdb3e..9b593b2 100644 --- a/tnslc/compile/compile.tnsl +++ b/tnslc/compile/compile.tnsl @@ -75,23 +75,37 @@  }  /; method VTrack -	# returns true if the value is allocated to the stack -	/; add_track({}uint8 name, VType _type) [int] -		;bool to_stack = is_struct(_type) -		;int count = 0 -		/; loop (int i = 0; i < len (self.on_stack) && !to_stack) [i++] -			/; if (!self.on_stack{i}) +	/; next_loc(VType vt) [int] +		/; if (is_struct(vt)) +			;return -1 +		;/ + +		;int count = 0 +		/; loop (int i = 0; i < len (self.sym_vals)) [i++] +			/; if (!(self.sym_vals{i}.on_stack))  				;count++  			;/ -			/; if (count > 8) -				;to_stack = true +			/; if (count > 7) +				;return -1  			;/  		;/ +		;return count + 6 +	;/ + +	# returns with init commands +	/; add_track({}uint8 name, VType _type) [{}uint8] +		;Value v = track_val(_type, to_stack, self.next_loc(_type)) +		 +		/; if (v.loc < 0) +			;v.loc = 0 +		;/ +  		;self.sym_names.append(name) -		;self.sym_vals.append(_type) +		;self.sym_vals.append(v) +		;return v.init_val()  	;/  	# Returns true if the variable is being tracked @@ -109,20 +123,41 @@  		;int out = 0  		/; loop (int i = 0; i < len (self.on_stack)) [i++]  			/; if (self.on_stack{i}) -				;out = out + (self.sym_types{i}._size) +				;out = out + (self.sym_vals{i}._type._size)  			;/  		;/  		;return out  	;/  	# returns the type of the named variable -	/; get_vtype ({}uint8 name) [VType] +	/; get_val ({}uint8 name) [Value]  		/; loop (int i = 0; i < len (self.on_stack)) [i++]  			/; if (string_equate(name, self.sym_names{i})) -				;return (self.sym_types{i}) +				;return (self.sym_vals{i})  			;/  		;/  	;/ + +	# push stack updates loc for every value on the stack +	/; push_stack (VType vt) [{}uint8] +		;int tsz = vt._size +		/; if (vt.ptr !== 0) +			;tsz = 8 +		;/ + +		/; loop (int i = 0; i < len (self.sym_vals)) [i++] +			;self.sym_vals{i}.loc = self.sym_vals{i}.loc + tsz +		;/ + +		;{}uint8 out = "\tsub $" +		;{}uint8 tmp = string_from_int(tsz) +		;add_strings(~out, ~tmp) +		;out.append(',') +		;out.append(' ') +		;tmp = "%rsp" +		;add_strings(~out, ~tmp) +		;return out +	;/  ;/  # Sizes of items @@ -205,22 +240,22 @@  	;return "nz"  ;/ -/; compute_jmp ({}uint8 jxt, lab) [{}uint8] - -;/ -  # Is struct returns true if the type name given is a struct  /; is_struct (VType t) [bool] -	/; if (t.ptr > 0) +	/; if (t.ptr !== 0)  		;return false  	;/ +	;VType tmp = NT  	/; loop (int i = 0; i < 15) [i++] -		/; if (string_equate(type_table{i}.name, t.name)) +		;tmp = tnslc.type_table{i} +		/; if (string_equate(tmp.name, t.name))  			;return false  		;/  	;/ +	 +  	;return true  ;/ @@ -353,25 +388,41 @@  # Assumes cur points to the beginning of the arguments list  # Sets up the VTrack struct that is pointed to. -/; setup_vtrack (~int cur, ~{}Token data, ~VTrack tab) +/; setup_vtrack (~int cur, ~{}Token data, ~VTrack tab, ~{}uint8 csec)  	;cur`++  	;VType last = NT +	;Value tmp = {false, false, 0, 0, last}  	/; loop (cur` < len data`) [cur`++]  		;int pre_skip = cur`  		/; if (token_is(cur, data, ")")) +			  			;break  		;; else if (!token_is(cur, data, ",")) +			  			;skip_to_name(cur, data) -			/; if (pre_skip == cur`) -				;tab`.sym_types.append(last) -				;tab`.sym_names.append(data`{cur`}.data`) -			;; else +			 +			/; if (pre_skip !== cur`)  				;last = get_vtype(~pre_skip, data) -				;tab`.sym_types.append(last) -				;tab`.sym_names.append(data`{cur`}.data`) +				;tmp._type = last  			;/ +			 +			;tab`.sym_names.append(data`{cur`}.data`) +			;int nloc = tab`.next_loc(last) +			 +			;Value store = {false, false, nloc, 0, last} +			/; if (store.loc !< 0) +				;{}uint8 tstr = store.set_value(tmp) +				;add_strings(csec, ~tstr) +				;tmp.loc = tmp.loc + 1 +			;; else +				;store.loc = 0 +				;store.on_stack = true +				;tab`.push_stack(last) +			;/ + +			;tab`.sym_vals.append(store)  		;/  	;/  ;/ @@ -549,16 +600,19 @@  			;cur`++  			/; loop (data`{cur`}.token_type == TOKEN_TYPE.DEFWORD) -				;int stack = tab`.add_track() -				 +				;{}uint8 init = tab`.add_track(data`{cur`}.data`, def_t) +				;add_strings(~out, ~init) +				;cur`++  				/; if (token_is(cur, data, ","))  					;cur`++  				;; else if (token_is(cur, data, "=")) -					;{}uint8 loc = index_to_loc(len tab`.sym_names - 1, tab) +					;{}uint8 set = index_to_loc(len tab`.sym_names - 1, tab)  					;eval_value(cur, data, tab, gsc, hsec, csec, dsec, loc)  					/; if (token_is(cur, data, ","))  						;cur`++  					;/ +				;; else +					;break  				;/  			;/  			/; if (string_equate(data`{cur`+1}.data`, "=")) @@ -576,7 +630,7 @@  /; compile_block (~int cur, ~{}Token data, ~VTrack gsc, ~{}uint8 hsec, csec, dsec, {}{}uint8 mod_path, Path rel) -	;VTrack tab = { {}, {}, {} } +	;VTrack tab = { {}, {} }  	;VType out_type = tnslc.type_table{14}  	;{}uint8 name = ""  	;bool r = false @@ -599,8 +653,11 @@  			;add_strings(csec, ~name)  			;csec`.append(':')  			;csec`.append('\n') +			/; if (!r) +				;header_guard(csec) +			;/  		;; else if (token_is(cur, data, "(")) -			;setup_vtrack(cur, data, ~tab) +			;setup_vtrack(cur, data, ~tab, csec)  		;; else if (token_is(cur, data, "["))  			;cur`++  			;out_type = get_vtype(cur, data) @@ -614,10 +671,6 @@  	;tnsl.io.println(out_type.name) -	/; if (!r) -		;header_guard(csec) -	;/ -  	;bool ret = false  	/; loop (cur` < len data` && !ret)  		/; if (token_is(cur, data, ";/")) diff --git a/tnslc/compile/isa_x86.tnsl b/tnslc/compile/isa_x86.tnsl index 3fda486..1cb09ab 100644 --- a/tnslc/compile/isa_x86.tnsl +++ b/tnslc/compile/isa_x86.tnsl @@ -158,7 +158,7 @@  	;; else -		;{}uint8 out = "r" +		;out.append('r')  		;add_strings(~out, ~common)  		/; if (size == 1)  			;out.append('b') diff --git a/tnslc/compile/value.tnsl b/tnslc/compile/value.tnsl index 28586f4..747c172 100644 --- a/tnslc/compile/value.tnsl +++ b/tnslc/compile/value.tnsl @@ -36,15 +36,20 @@  		;return "si"  	;; if (r == 5)  		;return "di" -	;; if (r == 6) -		;return "bp"  	;/ -	;return string_from_int(r) +	;return string_from_int(r + 2)  ;/  /; method Value +    /; get_norm_sz [int] +        /; if (self._type.ptr !== 0) +            ;return 8 +        ;/ +        ;returnself._type._size +    ;/ +      /; get_norm_loc [{}uint8]          /; if (self.on_stack)              ;return val_from_address(self.loc, "%rsp") @@ -85,10 +90,10 @@      ;/      /; standard_op(Value other, {}uint8 op) [{}uint8] -        ;int tsz = v._type._size -        ;v._type._size = self._type._size -        ;{}uint8 tmp = v.get_norm_loc() -        ;v._type._size = tsz +        ;int tsz = other._type._size +        ;other._type._size = self._type._size +        ;{}uint8 tmp = other.get_norm_loc() +        ;other._type._size = tsz          ;{}uint8 out = "\t"          ;add_strings(~out, ~op)          ;out.append(' ') @@ -193,6 +198,14 @@          ;/      ;/ +    /; ref_value (Value to_ref) [{}uint8] +        /; if (!to_ref.on_stack) +            ;return "" +        ;/ + +        ;return self.standard_op(to_ref, "lea") +    ;/ +      /; deref_value [{}uint8]          /; if (self._type.ptr == 0)              ;return "" @@ -223,7 +236,7 @@          /; if (self.literal)              ;self.val = v.val              ;return "" -        ;; else if (!self.on_stack) +        ;; else if (!(self.on_stack))              ;return self.standard_op(v, "mov")          ;/      ;/ diff --git a/tnslc/dummy.tnsl b/tnslc/dummy.tnsl index 5421218..e5d1c74 100644 --- a/tnslc/dummy.tnsl +++ b/tnslc/dummy.tnsl @@ -6,7 +6,7 @@      test a, b  } -/; main (uint argc, ~~uint8 argv) [int] +/; main (uint argc, ~~uint8 argv, v, f, c, d) [int]      # ;~void ptr = _alloc(10)      # ;_delete(ptr)      ;return 1 |