]> git.mdlowis.com Git - proto/aas.git/commitdiff
added locals and branches. broken but getting closer
authorMike Lowis <mike.lowis@gentex.com>
Thu, 30 Nov 2023 21:23:39 +0000 (16:23 -0500)
committerMike Lowis <mike.lowis@gentex.com>
Thu, 30 Nov 2023 21:23:39 +0000 (16:23 -0500)
aas.rb
cerise.m
cerise.rb

diff --git a/aas.rb b/aas.rb
index c3307bae849d6d6a24c09280606428418625570b..20a5314261b292d46c307a2ab4b32a7dd48aa808 100755 (executable)
--- 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
index a0e98a520d9988041e1cad1a01306508417f5abb..2b22b03e9c8b5060174e495fc18fb91c60f3ad52 100644 (file)
--- a/cerise.m
+++ b/cerise.m
@@ -14,5 +14,5 @@ sum(a,b)
 
 main()
 {
-    return sum(1+1,2)
+    return sum(1+1,1)
 }
index a18c280763513b9e272b805f9910b5ad5df411b5..85d2ed233b842eaedaa7a1b69db6073c2ce8ee58 100755 (executable)
--- 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)