diff --git a/src/core/ExecuteRegisterNumber.go b/src/core/ExecuteRegisterNumber.go index 77a6ffb..0176f82 100644 --- a/src/core/ExecuteRegisterNumber.go +++ b/src/core/ExecuteRegisterNumber.go @@ -25,10 +25,6 @@ func (f *Function) ExecuteRegisterNumber(operation token.Token, register cpu.Reg f.RegisterNumber(asm.MUL, register, number) case token.Div, token.DivAssign: - if register != x86.RAX { - f.SaveRegister(x86.RAX) - } - f.SaveRegister(x86.RDX) tmp := f.NewRegister() f.RegisterNumber(asm.MOVE, tmp, number) @@ -36,7 +32,6 @@ func (f *Function) ExecuteRegisterNumber(operation token.Token, register cpu.Reg f.FreeRegister(tmp) case token.Mod, token.ModAssign: - f.SaveRegister(x86.RAX) f.SaveRegister(x86.RDX) tmp := f.NewRegister() f.RegisterNumber(asm.MOVE, tmp, number) diff --git a/src/core/ExecuteRegisterRegister.go b/src/core/ExecuteRegisterRegister.go index fc785b7..3e699fb 100644 --- a/src/core/ExecuteRegisterRegister.go +++ b/src/core/ExecuteRegisterRegister.go @@ -25,15 +25,10 @@ func (f *Function) ExecuteRegisterRegister(operation token.Token, register cpu.R f.RegisterRegister(asm.MUL, register, operand) case token.Div, token.DivAssign: - if register != x86.RAX { - f.SaveRegister(x86.RAX) - } - f.SaveRegister(x86.RDX) f.RegisterRegister(asm.DIV, register, operand) case token.Mod, token.ModAssign: - f.SaveRegister(x86.RAX) f.SaveRegister(x86.RDX) f.RegisterRegister(asm.MODULO, register, operand) diff --git a/tests/programs/operator-assign-number.q b/tests/programs/operator-assign-number.q new file mode 100644 index 0000000..532e409 --- /dev/null +++ b/tests/programs/operator-assign-number.q @@ -0,0 +1,17 @@ +main() { + f(10) +} + +f(x int) { + y := x + x -= 2 + assert x < y + x += 2 + assert x == y + x *= 2 + assert x > y + x /= 2 + assert x == y + x %= 2 + assert x < 2 +} \ No newline at end of file diff --git a/tests/programs/operator-assign-variable.q b/tests/programs/operator-assign-variable.q new file mode 100644 index 0000000..fe73954 --- /dev/null +++ b/tests/programs/operator-assign-variable.q @@ -0,0 +1,18 @@ +main() { + f(10) +} + +f(x int) { + y := x + num := 2 + x -= num + assert x < y + x += num + assert x == y + x *= num + assert x > y + x /= num + assert x == y + x %= num + assert x < num +} \ No newline at end of file diff --git a/tests/programs/operator-assign.q b/tests/programs/operator-assign.q deleted file mode 100644 index 36809f2..0000000 --- a/tests/programs/operator-assign.q +++ /dev/null @@ -1,30 +0,0 @@ -main() { - number(10) - register(10) -} - -number(x int) { - y := x - x -= 1 - assert x < y - x += 1 - assert x == y - x *= 2 - assert x > y - x /= 2 - assert x == y -} - -register(x int) { - y := x - num := 1 - x -= num - assert x < y - x += num - assert x == y - num = 2 - x *= num - assert x > y - x /= num - assert x == y -} \ No newline at end of file diff --git a/tests/programs/operator-number.q b/tests/programs/operator-number.q new file mode 100644 index 0000000..4bafba8 --- /dev/null +++ b/tests/programs/operator-number.q @@ -0,0 +1,17 @@ +main() { + f(10) +} + +f(x int) { + y := x + x = x - 2 + assert x < y + x = x + 2 + assert x == y + x = x * 2 + assert x > y + x = x / 2 + assert x == y + x = x % 2 + assert x < 2 +} \ No newline at end of file diff --git a/tests/programs/operator-variable.q b/tests/programs/operator-variable.q new file mode 100644 index 0000000..abc4d7c --- /dev/null +++ b/tests/programs/operator-variable.q @@ -0,0 +1,18 @@ +main() { + f(10) +} + +f(x int) { + y := x + num := 2 + x = x - num + assert x < y + x = x + num + assert x == y + x = x * num + assert x > y + x = x / num + assert x == y + x = x % num + assert x < num +} \ No newline at end of file diff --git a/tests/programs_test.go b/tests/programs_test.go index da5dfc8..6e97a11 100644 --- a/tests/programs_test.go +++ b/tests/programs_test.go @@ -28,7 +28,10 @@ var programs = []struct { {"return-multi", 0}, {"math", 0}, {"precedence", 0}, - {"operator-assign", 0}, + {"operator-number", 0}, + {"operator-variable", 0}, + {"operator-assign-number", 0}, + {"operator-assign-variable", 0}, {"const", 0}, {"escape-rune", 0}, {"escape-string", 0},