1
0
mirror of https://github.com/KarolS/millfork.git synced 2024-07-07 21:28:59 +00:00

Optimize operations on known register values

This commit is contained in:
Karol Stasiak 2018-07-05 00:58:07 +02:00
parent 670741392c
commit dffc6e71d9
2 changed files with 12 additions and 3 deletions

View File

@ -20,7 +20,7 @@ object AlwaysGoodZ80Optimizations {
def for6Registers(f: ZRegister.Value => AssemblyRuleSet) = MultipleAssemblyRules( def for6Registers(f: ZRegister.Value => AssemblyRuleSet) = MultipleAssemblyRules(
List(ZRegister.B, ZRegister.C, ZRegister.D, ZRegister.E, ZRegister.H, ZRegister.L).map(f)) List(ZRegister.B, ZRegister.C, ZRegister.D, ZRegister.E, ZRegister.H, ZRegister.L).map(f))
val LoadingKnownValueFromAnotherRegister = new RuleBasedAssemblyOptimization("Loading known value from another register", val UsingKnownValueFromAnotherRegister = new RuleBasedAssemblyOptimization("Using known value from another register",
needsFlowInfo = FlowInfoRequirement.ForwardFlow, needsFlowInfo = FlowInfoRequirement.ForwardFlow,
for7Registers(register => for7Registers(register =>
(Elidable & IsRegular8BitLoadFrom(register) & MatchRegister(register, 0)) ~~> ((code, ctx) => (Elidable & IsRegular8BitLoadFrom(register) & MatchRegister(register, 0)) ~~> ((code, ctx) =>
@ -28,7 +28,14 @@ object AlwaysGoodZ80Optimizations {
parameter = NumericConstant(ctx.get[Int](0), 1), parameter = NumericConstant(ctx.get[Int](0), 1),
registers = x.registers.asInstanceOf[TwoRegisters].copy(source = ZRegister.IMM_8) registers = x.registers.asInstanceOf[TwoRegisters].copy(source = ZRegister.IMM_8)
))) )))
) ),
for6Registers(register =>
(Elidable & HasRegisterParam(register) & HasOpcodeIn(Set(AND, ADD, ADC, SUB, SBC, XOR, OR, CP)) & MatchRegister(register, 0)) ~~> ((code, ctx) =>
code.map(x => x.copy(
parameter = NumericConstant(ctx.get[Int](0), 1),
registers = OneRegister(ZRegister.IMM_8)
)))
),
) )
val ReloadingKnownValueFromMemory = new RuleBasedAssemblyOptimization("Reloading known value from memory", val ReloadingKnownValueFromMemory = new RuleBasedAssemblyOptimization("Reloading known value from memory",
@ -180,11 +187,11 @@ object AlwaysGoodZ80Optimizations {
val All: List[AssemblyOptimization[ZLine]] = List[AssemblyOptimization[ZLine]]( val All: List[AssemblyOptimization[ZLine]] = List[AssemblyOptimization[ZLine]](
FreeHL, FreeHL,
LoadingKnownValueFromAnotherRegister,
PointlessLoad, PointlessLoad,
ReloadingKnownValueFromMemory, ReloadingKnownValueFromMemory,
SimplifiableMaths, SimplifiableMaths,
UnusedLabelRemoval, UnusedLabelRemoval,
UsingKnownValueFromAnotherRegister,
) )
} }

View File

@ -29,6 +29,8 @@ case class CpuStatus(a: Status[Int] = UnknownStatus,
hf: Status[Boolean] = UnknownStatus hf: Status[Boolean] = UnknownStatus
) { ) {
def setRegister(target: ZRegister.Value, value: Status[Int]): CpuStatus = target match { def setRegister(target: ZRegister.Value, value: Status[Int]): CpuStatus = target match {
case ZRegister.IMM_8 => this
case ZRegister.IMM_16 => this
case ZRegister.A => this.copy(a = value) case ZRegister.A => this.copy(a = value)
case ZRegister.B => this.copy(b = value) case ZRegister.B => this.copy(b = value)
case ZRegister.C => this.copy(c = value) case ZRegister.C => this.copy(c = value)