aboutsummaryrefslogtreecommitdiff
path: root/generate.go
diff options
context:
space:
mode:
Diffstat (limited to 'generate.go')
-rw-r--r--generate.go38
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 {