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