mirror of
https://github.com/KarolS/millfork.git
synced 2024-07-07 21:28:59 +00:00
6502: Fix booleans
This commit is contained in:
parent
bb63a73f15
commit
9962a8344a
@ -493,8 +493,7 @@ object MosExpressionCompiler extends AbstractExpressionCompiler[AssemblyLine] {
|
|||||||
AssemblyLine.immediate(LDA, 0),
|
AssemblyLine.immediate(LDA, 0),
|
||||||
AssemblyLine.label(skip))
|
AssemblyLine.label(skip))
|
||||||
case _ =>
|
case _ =>
|
||||||
println(sourceType)
|
ctx.log.fatal(s"Cannot assign `${sourceType.name}` to `bool`", expr.position)
|
||||||
???
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -599,14 +598,6 @@ object MosExpressionCompiler extends AbstractExpressionCompiler[AssemblyLine] {
|
|||||||
|
|
||||||
def compile(ctx: CompilationContext, expr: Expression, exprTypeAndVariable: Option[(Type, Variable)], branches: BranchSpec): List[AssemblyLine] = {
|
def compile(ctx: CompilationContext, expr: Expression, exprTypeAndVariable: Option[(Type, Variable)], branches: BranchSpec): List[AssemblyLine] = {
|
||||||
val env = ctx.env
|
val env = ctx.env
|
||||||
env.eval(expr) match {
|
|
||||||
case Some(value) =>
|
|
||||||
return exprTypeAndVariable.fold(noop) { case (exprType, target) =>
|
|
||||||
assertCompatible(exprType, target.typ)
|
|
||||||
compileConstant(ctx, value, target)
|
|
||||||
}
|
|
||||||
case _ =>
|
|
||||||
}
|
|
||||||
val b = env.get[Type]("byte")
|
val b = env.get[Type]("byte")
|
||||||
val exprType = AbstractExpressionCompiler.getExpressionType(ctx, expr)
|
val exprType = AbstractExpressionCompiler.getExpressionType(ctx, expr)
|
||||||
if (branches != NoBranching) {
|
if (branches != NoBranching) {
|
||||||
@ -622,6 +613,14 @@ object MosExpressionCompiler extends AbstractExpressionCompiler[AssemblyLine] {
|
|||||||
case _ => ()
|
case _ => ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
env.eval(expr) match {
|
||||||
|
case Some(value) =>
|
||||||
|
return exprTypeAndVariable.fold(noop) { case (exprType, target) =>
|
||||||
|
assertCompatible(exprType, target.typ)
|
||||||
|
compileConstant(ctx, value, target)
|
||||||
|
}
|
||||||
|
case _ =>
|
||||||
|
}
|
||||||
val w = env.get[Type]("word")
|
val w = env.get[Type]("word")
|
||||||
expr match {
|
expr match {
|
||||||
case HalfWordExpression(expression, _) => ??? // TODO
|
case HalfWordExpression(expression, _) => ??? // TODO
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package millfork.test
|
package millfork.test
|
||||||
|
|
||||||
import millfork.Cpu
|
import millfork.Cpu
|
||||||
import millfork.test.emu.{EmuCrossPlatformBenchmarkRun, EmuUnoptimizedCrossPlatformRun}
|
import millfork.test.emu.{EmuCrossPlatformBenchmarkRun, EmuUnoptimizedCrossPlatformRun, EmuUnoptimizedRun}
|
||||||
import org.scalatest.{FunSuite, Matchers}
|
import org.scalatest.{FunSuite, Matchers}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -155,4 +155,47 @@ class BooleanSuite extends FunSuite with Matchers {
|
|||||||
""".stripMargin
|
""".stripMargin
|
||||||
EmuCrossPlatformBenchmarkRun(Cpu.Mos, Cpu.Z80)(code)(_.readByte(0xc000) should equal(7))
|
EmuCrossPlatformBenchmarkRun(Cpu.Mos, Cpu.Z80)(code)(_.readByte(0xc000) should equal(7))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test("Constant booleans") {
|
||||||
|
val code ="""
|
||||||
|
| word output @$c000
|
||||||
|
| noinline bool f(byte x) = x & 1 != 0
|
||||||
|
| noinline bool g(byte x) = x & 1 == 0
|
||||||
|
| void main () {
|
||||||
|
| output = 5
|
||||||
|
| if f(3) && true { output += 1 }
|
||||||
|
| if f(3) && false { output += 100 }
|
||||||
|
| if g(2) && true { output += 1 }
|
||||||
|
| if g(2) && false { output += 100 }
|
||||||
|
| if f(2) && true { output += 100 }
|
||||||
|
| if f(2) && false { output += 100 }
|
||||||
|
| if g(3) && true { output += 100 }
|
||||||
|
| if g(3) && false { output += 100 }
|
||||||
|
|
|
||||||
|
| if f(3) || true { output += 1 }
|
||||||
|
| if f(3) || false { output += 1 }
|
||||||
|
| if g(2) || true { output += 1 }
|
||||||
|
| if g(2) || false { output += 1 }
|
||||||
|
| if f(2) || true { output += 1 }
|
||||||
|
| if f(2) || false { output += 100 }
|
||||||
|
| if g(3) || true { output += 1 }
|
||||||
|
| if g(3) || false { output += 100 }
|
||||||
|
| }
|
||||||
|
|
|
||||||
|
""".stripMargin
|
||||||
|
EmuCrossPlatformBenchmarkRun(Cpu.Mos, Cpu.Z80)(code)(_.readWord(0xc000) should equal(13))
|
||||||
|
}
|
||||||
|
|
||||||
|
test("Constant booleans mini") {
|
||||||
|
val code ="""
|
||||||
|
| byte output @$c000
|
||||||
|
| noinline byte f(byte x) = x
|
||||||
|
| void main () {
|
||||||
|
| output = 5
|
||||||
|
| if f(3) != 0 && false { output += 100 }
|
||||||
|
| }
|
||||||
|
|
|
||||||
|
""".stripMargin
|
||||||
|
EmuUnoptimizedRun(code).readWord(0xc000) should equal(5)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user