mirror of
https://github.com/KarolS/millfork.git
synced 2025-02-06 01:30:13 +00:00
8080: Use a register pair instead of absolute addressing when the registers are loaded anyway
This commit is contained in:
parent
fac5a54376
commit
29335d376a
@ -142,9 +142,68 @@ object LaterI80Optimizations {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
val UseRegistersInsteadOfAbsoluteAddressing = new RuleBasedAssemblyOptimization("Use registers instead of absolute adressing",
|
||||||
|
needsFlowInfo = FlowInfoRequirement.ForwardFlow,
|
||||||
|
|
||||||
|
(Elidable & HasOpcode(LD) & HasRegisters(TwoRegisters(A, MEM_ABS_8)) & MatchParameter(1) & MatchRegister(HL, 1)) ~~> { code =>
|
||||||
|
code.map(_.copy(registers = TwoRegisters(A, MEM_HL), parameter = Constant.Zero))
|
||||||
|
},
|
||||||
|
(Elidable & HasOpcode(LD) & HasRegisters(TwoRegisters(MEM_ABS_8, A)) & MatchParameter(1) & MatchRegister(HL, 1)) ~~> { code =>
|
||||||
|
code.map(_.copy(registers = TwoRegisters(MEM_HL, A), parameter = Constant.Zero))
|
||||||
|
},
|
||||||
|
|
||||||
|
(Elidable & HasOpcode(LD) & HasRegisters(TwoRegisters(A, MEM_ABS_8)) & MatchParameter(1) & MatchRegister(BC, 1)) ~~> { code =>
|
||||||
|
code.map(_.copy(registers = TwoRegisters(A, MEM_BC), parameter = Constant.Zero))
|
||||||
|
},
|
||||||
|
(Elidable & HasOpcode(LD) & HasRegisters(TwoRegisters(MEM_ABS_8, A)) & MatchParameter(1) & MatchRegister(BC, 1)) ~~> { code =>
|
||||||
|
code.map(_.copy(registers = TwoRegisters(MEM_BC, A), parameter = Constant.Zero))
|
||||||
|
},
|
||||||
|
|
||||||
|
(Elidable & HasOpcode(LD) & HasRegisters(TwoRegisters(A, MEM_ABS_8)) & MatchParameter(1) & MatchRegister(DE, 1)) ~~> { code =>
|
||||||
|
code.map(_.copy(registers = TwoRegisters(A, MEM_DE), parameter = Constant.Zero))
|
||||||
|
},
|
||||||
|
(Elidable & HasOpcode(LD) & HasRegisters(TwoRegisters(MEM_ABS_8, A)) & MatchParameter(1) & MatchRegister(DE, 1)) ~~> { code =>
|
||||||
|
code.map(_.copy(registers = TwoRegisters(MEM_DE, A), parameter = Constant.Zero))
|
||||||
|
},
|
||||||
|
|
||||||
|
(Elidable & HasOpcode(LD) & HasRegisters(TwoRegisters(A, MEM_ABS_8)) & MatchParameter(1)) ~
|
||||||
|
(Linear & Not(Concerns(HL))).* ~
|
||||||
|
(Elidable & HasOpcode(LD_16) & HasRegisters(TwoRegisters(HL, IMM_16)) & MatchParameter(1)) ~~> { code =>
|
||||||
|
code.last :: code.head.copy(registers = TwoRegisters(A, MEM_HL), parameter = Constant.Zero) :: code.tail.init
|
||||||
|
},
|
||||||
|
(Elidable & HasOpcode(LD) & HasRegisters(TwoRegisters(MEM_ABS_8, A)) & MatchParameter(1)) ~
|
||||||
|
(Linear & Not(Concerns(HL))).* ~
|
||||||
|
(Elidable & HasOpcode(LD_16) & HasRegisters(TwoRegisters(HL, IMM_16)) & MatchParameter(1)) ~~> { code =>
|
||||||
|
code.last :: code.head.copy(registers = TwoRegisters(MEM_HL, A), parameter = Constant.Zero) :: code.tail.init
|
||||||
|
},
|
||||||
|
|
||||||
|
(Elidable & HasOpcode(LD) & HasRegisters(TwoRegisters(A, MEM_ABS_8)) & MatchParameter(1)) ~
|
||||||
|
(Linear & Not(Concerns(BC))).* ~
|
||||||
|
(Elidable & HasOpcode(LD_16) & HasRegisters(TwoRegisters(BC, IMM_16)) & MatchParameter(1)) ~~> { code =>
|
||||||
|
code.last :: code.head.copy(registers = TwoRegisters(A, MEM_BC), parameter = Constant.Zero) :: code.tail.init
|
||||||
|
},
|
||||||
|
(Elidable & HasOpcode(LD) & HasRegisters(TwoRegisters(MEM_ABS_8, A)) & MatchParameter(1)) ~
|
||||||
|
(Linear & Not(Concerns(BC))).* ~
|
||||||
|
(Elidable & HasOpcode(LD_16) & HasRegisters(TwoRegisters(BC, IMM_16)) & MatchParameter(1)) ~~> { code =>
|
||||||
|
code.last :: code.head.copy(registers = TwoRegisters(MEM_BC, A), parameter = Constant.Zero) :: code.tail.init
|
||||||
|
},
|
||||||
|
|
||||||
|
(Elidable & HasOpcode(LD) & HasRegisters(TwoRegisters(A, MEM_ABS_8)) & MatchParameter(1)) ~
|
||||||
|
(Linear & Not(Concerns(DE))).* ~
|
||||||
|
(Elidable & HasOpcode(LD_16) & HasRegisters(TwoRegisters(DE, IMM_16)) & MatchParameter(1)) ~~> { code =>
|
||||||
|
code.last :: code.head.copy(registers = TwoRegisters(A, MEM_DE), parameter = Constant.Zero) :: code.tail.init
|
||||||
|
},
|
||||||
|
(Elidable & HasOpcode(LD) & HasRegisters(TwoRegisters(MEM_ABS_8, A)) & MatchParameter(1)) ~
|
||||||
|
(Linear & Not(Concerns(DE))).* ~
|
||||||
|
(Elidable & HasOpcode(LD_16) & HasRegisters(TwoRegisters(DE, IMM_16)) & MatchParameter(1)) ~~> { code =>
|
||||||
|
code.last :: code.head.copy(registers = TwoRegisters(MEM_DE, A), parameter = Constant.Zero) :: code.tail.init
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
val All: List[AssemblyOptimization[ZLine]] = List(
|
val All: List[AssemblyOptimization[ZLine]] = List(
|
||||||
VariousSmallOptimizations,
|
VariousSmallOptimizations,
|
||||||
FreeHL,
|
FreeHL,
|
||||||
TailCall,
|
TailCall,
|
||||||
|
UseRegistersInsteadOfAbsoluteAddressing,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user