Fixed incorrect register lifetime in for loops
This commit is contained in:
@ -90,7 +90,8 @@ func (c *compiler) compileX86(x asm.Instruction) {
|
|||||||
c.jump(x)
|
c.jump(x)
|
||||||
|
|
||||||
case asm.LABEL:
|
case asm.LABEL:
|
||||||
c.codeLabels[x.Data.(*asm.Label).Name] = Address(len(c.code))
|
label := x.Data.(*asm.Label)
|
||||||
|
c.codeLabels[label.Name] = Address(len(c.code))
|
||||||
|
|
||||||
case asm.LOAD:
|
case asm.LOAD:
|
||||||
c.load(x)
|
c.load(x)
|
||||||
|
@ -81,11 +81,13 @@ func (f *Function) CompileFor(loop *ast.For) error {
|
|||||||
case *eval.Register:
|
case *eval.Register:
|
||||||
if value.IsAlive() {
|
if value.IsAlive() {
|
||||||
tmp := f.NewRegister()
|
tmp := f.NewRegister()
|
||||||
f.RegisterRegister(asm.MOVE, tmp, value.Register)
|
|
||||||
defer f.FreeRegister(tmp)
|
defer f.FreeRegister(tmp)
|
||||||
|
f.RegisterRegister(asm.MOVE, tmp, value.Register)
|
||||||
f.AddLabel(label)
|
f.AddLabel(label)
|
||||||
f.RegisterRegister(asm.COMPARE, counter, tmp)
|
f.RegisterRegister(asm.COMPARE, counter, tmp)
|
||||||
} else {
|
} else {
|
||||||
|
f.UseRegister(value.Register)
|
||||||
|
defer f.FreeRegister(value.Register)
|
||||||
f.AddLabel(label)
|
f.AddLabel(label)
|
||||||
f.RegisterRegister(asm.COMPARE, counter, value.Register)
|
f.RegisterRegister(asm.COMPARE, counter, value.Register)
|
||||||
}
|
}
|
||||||
|
26
tests/programs/fibonacci.q
Normal file
26
tests/programs/fibonacci.q
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
main() {
|
||||||
|
for i := 0..10 {
|
||||||
|
assert fib1(i) == fib2(i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fib1(n int) -> int {
|
||||||
|
b := 0
|
||||||
|
c := 1
|
||||||
|
|
||||||
|
for 0..n {
|
||||||
|
a := b
|
||||||
|
b = c
|
||||||
|
c = a + b
|
||||||
|
}
|
||||||
|
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
fib2(n int) -> int {
|
||||||
|
if n <= 1 {
|
||||||
|
return n
|
||||||
|
}
|
||||||
|
|
||||||
|
return fib2(n - 1) + fib2(n - 2)
|
||||||
|
}
|
@ -62,6 +62,7 @@ var programs = []struct {
|
|||||||
{"loop-lifetime", 0},
|
{"loop-lifetime", 0},
|
||||||
{"loop-in-loop", 0},
|
{"loop-in-loop", 0},
|
||||||
{"for", 0},
|
{"for", 0},
|
||||||
|
{"fibonacci", 0},
|
||||||
{"memory-free", 0},
|
{"memory-free", 0},
|
||||||
{"out-of-memory", 0},
|
{"out-of-memory", 0},
|
||||||
{"index-static", 0},
|
{"index-static", 0},
|
||||||
|
Reference in New Issue
Block a user