diff options
Diffstat (limited to 'generate.go')
-rw-r--r-- | generate.go | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/generate.go b/generate.go index 51eb7c0..b8c6ba2 100644 --- a/generate.go +++ b/generate.go @@ -136,6 +136,8 @@ func generateStatement(stmt statementExpr, w io.Writer) error { return generateMulAssignStmt(s, w) case *divAssignStmt: return generateDivAssignStmt(s, w) + case *remAssignStmt: + return generateRemAssignStmt(s, w) } return nil @@ -291,6 +293,28 @@ func generateDivAssignStmt(stmt *divAssignStmt, w io.Writer) error { return nil } +func generateRemAssignStmt(stmt *remAssignStmt, w io.Writer) error { + ok, mutable := isDeclared(stmt.name, false) + if !ok { + return errUndeclared{name: stmt.name, line: stmt.line()} + } + if !mutable { + return errImmutable{name: stmt.name, line: stmt.line()} + } + + value, err := stmt.value.generate(w) + if err != nil { + return err + } + + in, out := allocReg(), allocReg() + + fmt.Fprintf(w, "%s =w loadl %%%s\n", in, stmt.name) + fmt.Fprintf(w, "%s =w rem %s, %s\n", out, in, value) + fmt.Fprintf(w, "storew %s, %%%s\n", out, stmt.name) + return nil +} + func (e *equalityExpr) generate(w io.Writer) (string, error) { lhs, err := e.lhs.generate(w) if err != nil { @@ -476,6 +500,8 @@ func (f *factorRhs) generate(in string, w io.Writer) (string, error) { instruction += "mul" case divide: instruction += "div" + case remainder: + instruction += "rem" } rhs, err := f.value.generate(w) |