From 926b5c3e04a4951c8b4c3c5a3e8e928009702cfa Mon Sep 17 00:00:00 2001 From: Mike Lowis Date: Thu, 30 Nov 2023 16:23:39 -0500 Subject: [PATCH] added locals and branches. broken but getting closer --- aas.rb | 20 +++++++++++++++++++- cerise.m | 2 +- cerise.rb | 16 +++++++++++----- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/aas.rb b/aas.rb index c3307ba..20a5314 100755 --- a/aas.rb +++ b/aas.rb @@ -268,6 +268,24 @@ module Targets # set_global int # get_local int # set_local int + + ############ + # BRANCHES + ############ + def jmp_if0(label) + emit "popq %rax" + emit "test %rax, %rax" + emit "jz #{label}" + end + + def jmp(label) + emit "jmp #{label}" + end + + def label(name) + $asm_out.write "#{name}:\n" + end + end end end @@ -313,7 +331,7 @@ class Function end def locals(count) - $asm_out.write "subq $#{count * 8}, %rsp\n" + emit "subq $#{count * 8}, %rsp" end def ret diff --git a/cerise.m b/cerise.m index a0e98a5..2b22b03 100644 --- a/cerise.m +++ b/cerise.m @@ -14,5 +14,5 @@ sum(a,b) main() { - return sum(1+1,2) + return sum(1+1,1) } diff --git a/cerise.rb b/cerise.rb index a18c280..85d2ed2 100755 --- a/cerise.rb +++ b/cerise.rb @@ -635,14 +635,16 @@ class Parser def function_definition(name) args = function_arglist() func = IR::Func.new(name.loc, nil, args, [], []) + defs = [] expect("{") while matches(:def) local = variable_definition() func.locals << local.name.name + defs << local; end stmts = statement_list(["}", :return]) stmts << return_statement - func.body = stmts + func.body = defs + stmts expect("}"); func end @@ -932,7 +934,7 @@ module Codegen if sym.kind == :param puts " get_param #{sym.value}" elsif sym.kind == :local - puts " get_local :#{sym.name}" + puts " get_local #{state.locals.index(sym.name)}" end else puts "# invalid var #{v.name}" @@ -953,14 +955,17 @@ module Codegen end def self.emit_def(state, v) - state.add_sym( + state.syms.add_sym( v.name.name, v.loc, :local, v.type, v.value) emit(state, v.value) - puts " set_local :#{v.name.name}" + raise "invalid local definition: #{v.name.name}" if not state.locals.index(v.name.name) + puts " set_local #{state.locals.index(v.name.name)}" end def self.emit_set(state, v) - puts " set_local :#{v.name.name}" + emit(state, v.value) + raise "invalid local definition: #{v.name.name}" if not state.locals.index(v.name.name) + puts " set_local #{state.locals.index(v.name.name)}" end def self.emit_if(state, v) @@ -989,6 +994,7 @@ $parser.syms.each do |name, val| $parser.syms.open_scope puts "func #{name.to_sym.inspect}, #{val.value.args.length} do" puts " locals #{val.value.locals.length}" if val.value.locals.length > 0 + state.locals = val.value.locals val.value.args.each_with_index do |name, idx| $parser.syms.add_sym( name.name, name.loc, :param, name.type, idx) -- 2.52.0