mirror of
https://github.com/KarolS/millfork.git
synced 2024-07-18 17:29:03 +00:00
Z80: Faster +=2 and similar
This commit is contained in:
parent
5f14484503
commit
190b398711
@ -272,10 +272,22 @@ object ZBuiltIns {
|
|||||||
ZLine.ld8(lv, ZRegister.A))
|
ZLine.ld8(lv, ZRegister.A))
|
||||||
case ADD if !decimal =>
|
case ADD if !decimal =>
|
||||||
constantRight match {
|
constantRight match {
|
||||||
|
// n × INC (HL) = 11n cycles, n bytes
|
||||||
|
// n × INC (IX,d) = 23n cycles, 2n bytes
|
||||||
|
// LD A,n ; ADD (HL) ; LD (HL),A = 21 cycles, 4 bytes
|
||||||
|
// LD A,n ; ADD (IX,d) ; LD (IX,d),A = 45 cycles, 6 bytes
|
||||||
case Some(NumericConstant(1, _)) =>
|
case Some(NumericConstant(1, _)) =>
|
||||||
calculateAddress :+ ZLine.register(INC, lv)
|
calculateAddress :+ ZLine.register(INC, lv)
|
||||||
|
case Some(NumericConstant(2, _)) =>
|
||||||
|
calculateAddress :+ ZLine.register(INC, lv) :+ ZLine.register(INC, lv)
|
||||||
|
case Some(NumericConstant(3, _)) if ctx.options.flag(CompilationFlag.OptimizeForSpeed) =>
|
||||||
|
calculateAddress ++ List(ZLine.register(INC, lv), ZLine.register(INC, lv), ZLine.register(INC, lv))
|
||||||
case Some(NumericConstant(0xff | -1, _)) =>
|
case Some(NumericConstant(0xff | -1, _)) =>
|
||||||
calculateAddress :+ ZLine.register(DEC, lv)
|
calculateAddress :+ ZLine.register(DEC, lv)
|
||||||
|
case Some(NumericConstant(0xfe | -2, _)) =>
|
||||||
|
calculateAddress :+ ZLine.register(DEC, lv) :+ ZLine.register(DEC, lv)
|
||||||
|
case Some(NumericConstant(0xfd | -3, _)) if ctx.options.flag(CompilationFlag.OptimizeForSpeed) =>
|
||||||
|
calculateAddress ++ List(ZLine.register(DEC, lv), ZLine.register(DEC, lv), ZLine.register(DEC, lv))
|
||||||
case _ =>
|
case _ =>
|
||||||
setup ++ List(
|
setup ++ List(
|
||||||
ZLine.register(ADD, lv),
|
ZLine.register(ADD, lv),
|
||||||
@ -292,8 +304,16 @@ object ZBuiltIns {
|
|||||||
constantRight match {
|
constantRight match {
|
||||||
case Some(NumericConstant(1, _)) =>
|
case Some(NumericConstant(1, _)) =>
|
||||||
calculateAddress :+ ZLine.register(DEC, lv)
|
calculateAddress :+ ZLine.register(DEC, lv)
|
||||||
|
case Some(NumericConstant(2, _)) =>
|
||||||
|
calculateAddress :+ ZLine.register(DEC, lv) :+ ZLine.register(INC, lv)
|
||||||
|
case Some(NumericConstant(3, _)) if ctx.options.flag(CompilationFlag.OptimizeForSpeed) =>
|
||||||
|
calculateAddress ++ List(ZLine.register(DEC, lv), ZLine.register(INC, lv), ZLine.register(INC, lv))
|
||||||
case Some(NumericConstant(0xff | -1, _)) =>
|
case Some(NumericConstant(0xff | -1, _)) =>
|
||||||
calculateAddress :+ ZLine.register(INC, lv)
|
calculateAddress :+ ZLine.register(INC, lv)
|
||||||
|
case Some(NumericConstant(0xfe | -2, _)) =>
|
||||||
|
calculateAddress :+ ZLine.register(INC, lv) :+ ZLine.register(INC, lv)
|
||||||
|
case Some(NumericConstant(0xfd | -3, _)) if ctx.options.flag(CompilationFlag.OptimizeForSpeed) =>
|
||||||
|
calculateAddress ++ List(ZLine.register(INC, lv), ZLine.register(INC, lv), ZLine.register(INC, lv))
|
||||||
case _ =>
|
case _ =>
|
||||||
if (ctx.options.flag(CompilationFlag.EmitExtended80Opcodes)) {
|
if (ctx.options.flag(CompilationFlag.EmitExtended80Opcodes)) {
|
||||||
setup ++ List(
|
setup ++ List(
|
||||||
|
Loading…
Reference in New Issue
Block a user