diff options
Diffstat (limited to 'generate.go')
-rw-r--r-- | generate.go | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/generate.go b/generate.go index 94f577d..432bd25 100644 --- a/generate.go +++ b/generate.go @@ -11,6 +11,8 @@ import ( "strings" ) +var currentFunc string + var funcRegIndex int func allocReg() string { @@ -78,6 +80,8 @@ func generateToplevel(toplevel expression, w io.Writer) error { func generateFunction(function *functionExpr, w io.Writer) error { resetRegs() + currentFunc = function.name + locals[function.name] = map[string]mutInfo{} if function.link != defaultLinkage { fmt.Fprintf(w, "%s ", function.link) @@ -108,6 +112,10 @@ func generateStatement(stmt statementExpr, w io.Writer) error { switch s := stmt.(type) { case *returnStmt: return generateReturnStmt(s, w) + case *constStmt: + return generateConstStmt(s, false, w) + case *mutStmt: + return generateMutStmt(s, false, w) } return nil @@ -124,6 +132,36 @@ func generateReturnStmt(stmt *returnStmt, w io.Writer) error { return nil } +func generateConstStmt(stmt *constStmt, toplevel bool, w io.Writer) error { + value, err := stmt.initial.generate(w) + if err != nil { + return err + } + + fmt.Fprintf(w, "%%%s =w add %s, 0\n", stmt.name, value) + return nil +} + +func generateMutStmt(stmt *mutStmt, toplevel bool, w io.Writer) error { + value, err := stmt.initial.generate(w) + if err != nil { + return err + } + + if _, ok := locals[currentFunc][stmt.name]; ok { + return errAlreadyDeclared{name: stmt.name, line: stmt.line()} + } + + mutable := mutInfo{ + id: stmt.name, + } + locals[currentFunc][stmt.name] = mutable + + fmt.Fprintf(w, "%s =l alloc4 8\n", mutable.nextName()) + fmt.Fprintf(w, "storew %s, %s\n", value, mutable.name()) + return nil +} + func (e *equalityExpr) generate(w io.Writer) (string, error) { lhs, err := e.lhs.generate(w) if err != nil { |