mirror of
https://github.com/KarolS/millfork.git
synced 2024-12-23 23:30:22 +00:00
Fix the sieve benchmark
This commit is contained in:
parent
9beac45e99
commit
010647682a
@ -22,6 +22,10 @@
|
|||||||
|
|
||||||
* Fixed a bug with variable overlapping (#11).
|
* Fixed a bug with variable overlapping (#11).
|
||||||
|
|
||||||
|
* 6502: Fixed a bug with flow analysis during optimizations.
|
||||||
|
|
||||||
|
* 6502: Fixed a bug with certain 16-bit additions.
|
||||||
|
|
||||||
* 8080: Fixed and optimized 16-bit comparisons.
|
* 8080: Fixed and optimized 16-bit comparisons.
|
||||||
|
|
||||||
* 8080: Optimized some library functions.
|
* 8080: Optimized some library functions.
|
||||||
|
@ -214,6 +214,8 @@ object CpuStatus {
|
|||||||
v = AnyStatus,
|
v = AnyStatus,
|
||||||
z = AnyStatus,
|
z = AnyStatus,
|
||||||
n = AnyStatus,
|
n = AnyStatus,
|
||||||
|
a0 = AnyStatus,
|
||||||
|
a7 = AnyStatus,
|
||||||
d = SingleStatus(false),
|
d = SingleStatus(false),
|
||||||
m = SingleStatus(true),
|
m = SingleStatus(true),
|
||||||
w = SingleStatus(true),
|
w = SingleStatus(true),
|
||||||
@ -231,6 +233,8 @@ object CpuStatus {
|
|||||||
v = AnyStatus,
|
v = AnyStatus,
|
||||||
z = AnyStatus,
|
z = AnyStatus,
|
||||||
n = AnyStatus,
|
n = AnyStatus,
|
||||||
|
a0 = AnyStatus,
|
||||||
|
a7 = AnyStatus,
|
||||||
d = SingleStatus(false),
|
d = SingleStatus(false),
|
||||||
m = SingleStatus(true),
|
m = SingleStatus(true),
|
||||||
w = SingleStatus(true),
|
w = SingleStatus(true),
|
||||||
@ -249,6 +253,8 @@ object CpuStatus {
|
|||||||
v = AnyStatus,
|
v = AnyStatus,
|
||||||
z = AnyStatus,
|
z = AnyStatus,
|
||||||
n = AnyStatus,
|
n = AnyStatus,
|
||||||
|
a0 = AnyStatus,
|
||||||
|
a7 = AnyStatus,
|
||||||
d = AnyStatus,
|
d = AnyStatus,
|
||||||
m = AnyStatus,
|
m = AnyStatus,
|
||||||
w = AnyStatus,
|
w = AnyStatus,
|
||||||
@ -266,6 +272,8 @@ object CpuStatus {
|
|||||||
v = AnyStatus,
|
v = AnyStatus,
|
||||||
z = AnyStatus,
|
z = AnyStatus,
|
||||||
n = AnyStatus,
|
n = AnyStatus,
|
||||||
|
a0 = AnyStatus,
|
||||||
|
a7 = AnyStatus,
|
||||||
d = SingleStatus(false),
|
d = SingleStatus(false),
|
||||||
m = AnyStatus,
|
m = AnyStatus,
|
||||||
w = AnyStatus,
|
w = AnyStatus,
|
||||||
@ -283,6 +291,8 @@ object CpuStatus {
|
|||||||
v = AnyStatus,
|
v = AnyStatus,
|
||||||
z = AnyStatus,
|
z = AnyStatus,
|
||||||
n = AnyStatus,
|
n = AnyStatus,
|
||||||
|
a0 = AnyStatus,
|
||||||
|
a7 = AnyStatus,
|
||||||
d = SingleStatus(false),
|
d = SingleStatus(false),
|
||||||
m = AnyStatus,
|
m = AnyStatus,
|
||||||
w = AnyStatus,
|
w = AnyStatus,
|
||||||
|
@ -45,7 +45,7 @@ object PseudoregisterBuiltIns {
|
|||||||
case List(AssemblyLine0(LDA, Immediate, l), AssemblyLine0(LDX, Immediate, h)) =>
|
case List(AssemblyLine0(LDA, Immediate, l), AssemblyLine0(LDX, Immediate, h)) =>
|
||||||
if (subtract) constant -= h.asl(8).+(l).quickSimplify
|
if (subtract) constant -= h.asl(8).+(l).quickSimplify
|
||||||
else constant += h.asl(8).+(l).quickSimplify
|
else constant += h.asl(8).+(l).quickSimplify
|
||||||
case List(l@AssemblyLine0(LDA, Absolute | ZeroPage | Immediate, _), h@AssemblyLine0(LDX, Absolute | ZeroPage | Immediate, _)) =>
|
case List(l@AssemblyLine0(LDA, Absolute | ZeroPage | Immediate | LongAbsolute, _), h@AssemblyLine0(LDX, Absolute | ZeroPage | Immediate | LongAbsolute, _)) =>
|
||||||
if (subtract) niceReads.+=(List(AssemblyLine.implied(SEC), l.copy(opcode = SBC)) -> List(h.copy(opcode = SBC)))
|
if (subtract) niceReads.+=(List(AssemblyLine.implied(SEC), l.copy(opcode = SBC)) -> List(h.copy(opcode = SBC)))
|
||||||
else niceReads += (List(AssemblyLine.implied(CLC), l.copy(opcode = ADC)) -> List(h.copy(opcode = ADC)))
|
else niceReads += (List(AssemblyLine.implied(CLC), l.copy(opcode = ADC)) -> List(h.copy(opcode = ADC)))
|
||||||
counter += 1
|
counter += 1
|
||||||
@ -68,7 +68,7 @@ object PseudoregisterBuiltIns {
|
|||||||
if (constant.isQuiteNegative) {
|
if (constant.isQuiteNegative) {
|
||||||
niceReads += List(AssemblyLine.implied(CLC), AssemblyLine.immediate(ADC, constant.loByte)) -> List(AssemblyLine.immediate(ADC, constant.hiByte))
|
niceReads += List(AssemblyLine.implied(CLC), AssemblyLine.immediate(ADC, constant.loByte)) -> List(AssemblyLine.immediate(ADC, constant.hiByte))
|
||||||
} else {
|
} else {
|
||||||
val negC = Constant.Zero.-(constant).quickSimplify.quickSimplify
|
val negC = Constant.WordZero.-(constant).quickSimplify.quickSimplify
|
||||||
niceReads += List(AssemblyLine.implied(SEC), AssemblyLine.immediate(SBC, negC.loByte)) -> List(AssemblyLine.immediate(SBC, negC.hiByte))
|
niceReads += List(AssemblyLine.implied(SEC), AssemblyLine.immediate(SBC, negC.loByte)) -> List(AssemblyLine.immediate(SBC, negC.hiByte))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
2
src/main/scala/millfork/env/Constant.scala
vendored
2
src/main/scala/millfork/env/Constant.scala
vendored
@ -40,7 +40,7 @@ sealed trait Constant {
|
|||||||
case _ => CompoundConstant(MathOperator.Shl, this, i)
|
case _ => CompoundConstant(MathOperator.Shl, this, i)
|
||||||
}
|
}
|
||||||
|
|
||||||
def asl(i: Int): Constant = CompoundConstant(MathOperator.Shl, this, NumericConstant(i, 1))
|
def asl(i: Int): Constant = CompoundConstant(MathOperator.Shl, this, NumericConstant(i, requiredSize + i/8))
|
||||||
|
|
||||||
def requiredSize: Int
|
def requiredSize: Int
|
||||||
|
|
||||||
|
@ -20,6 +20,21 @@ class WordMathSuite extends FunSuite with Matchers with AppendedClues {
|
|||||||
""".stripMargin)(_.readWord(0xc000) should equal(1280))
|
""".stripMargin)(_.readWord(0xc000) should equal(1280))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test("Addition that was buggy") {
|
||||||
|
EmuCrossPlatformBenchmarkRun(Cpu.Mos, Cpu.Z80, Cpu.Motorola6809)("""
|
||||||
|
| word output @$c000
|
||||||
|
| array X [$1000] align($100)
|
||||||
|
| void main () {
|
||||||
|
| output = f(1)
|
||||||
|
| }
|
||||||
|
| noinline word f(byte I) {
|
||||||
|
| word S
|
||||||
|
| S = X + nonet(I << 1)
|
||||||
|
| return S
|
||||||
|
| }
|
||||||
|
""".stripMargin)(_.readWord(0xc000) should equal(0x302))
|
||||||
|
}
|
||||||
|
|
||||||
test("Cast word addition") {
|
test("Cast word addition") {
|
||||||
EmuCrossPlatformBenchmarkRun(Cpu.Sixteen, Cpu.Mos, Cpu.Z80, Cpu.Intel8080, Cpu.Intel8085, Cpu.Sharp, Cpu.Intel8086, Cpu.Motorola6809)("""
|
EmuCrossPlatformBenchmarkRun(Cpu.Sixteen, Cpu.Mos, Cpu.Z80, Cpu.Intel8080, Cpu.Intel8085, Cpu.Sharp, Cpu.Intel8086, Cpu.Motorola6809)("""
|
||||||
| byte output @$c000
|
| byte output @$c000
|
||||||
|
Loading…
Reference in New Issue
Block a user