mirror of
https://github.com/KarolS/millfork.git
synced 2024-10-25 05:24:11 +00:00
Fixed flag checks during optimisation
This commit is contained in:
parent
c71af26989
commit
10860f6c5f
@ -664,27 +664,27 @@ object AlwaysGoodOptimizations {
|
|||||||
modificationOfJustWrittenValue(STA, AbsoluteX, MatchA(5), DEC, Not(ChangesX), atLeastTwo = false, Seq(), (c, i) => List(
|
modificationOfJustWrittenValue(STA, AbsoluteX, MatchA(5), DEC, Not(ChangesX), atLeastTwo = false, Seq(), (c, i) => List(
|
||||||
AssemblyLine.immediate(LDA, (c.get[Int](5) - i) & 0xff)
|
AssemblyLine.immediate(LDA, (c.get[Int](5) - i) & 0xff)
|
||||||
)),
|
)),
|
||||||
modificationOfJustWrittenValue(STA, Absolute, Anything, INC, Anything, atLeastTwo = true, Seq(State.C, State.V), (_, i) => List(
|
modificationOfJustWrittenValue(STA, Absolute, HasClear(State.D), INC, Anything, atLeastTwo = true, Seq(State.C, State.V), (_, i) => List(
|
||||||
AssemblyLine.implied(CLC),
|
AssemblyLine.implied(CLC),
|
||||||
AssemblyLine.immediate(ADC, i)
|
AssemblyLine.immediate(ADC, i)
|
||||||
)),
|
)),
|
||||||
modificationOfJustWrittenValue(STA, Absolute, Anything, DEC, Anything, atLeastTwo = true, Seq(State.C, State.V), (_, i) => List(
|
modificationOfJustWrittenValue(STA, Absolute, HasClear(State.D), DEC, Anything, atLeastTwo = true, Seq(State.C, State.V), (_, i) => List(
|
||||||
AssemblyLine.implied(SEC),
|
AssemblyLine.implied(SEC),
|
||||||
AssemblyLine.immediate(SBC, i)
|
AssemblyLine.immediate(SBC, i)
|
||||||
)),
|
)),
|
||||||
modificationOfJustWrittenValue(STA, ZeroPage, Anything, INC, Anything, atLeastTwo = true, Seq(State.C, State.V), (_, i) => List(
|
modificationOfJustWrittenValue(STA, ZeroPage, HasClear(State.D), INC, Anything, atLeastTwo = true, Seq(State.C, State.V), (_, i) => List(
|
||||||
AssemblyLine.implied(CLC),
|
AssemblyLine.implied(CLC),
|
||||||
AssemblyLine.immediate(ADC, i)
|
AssemblyLine.immediate(ADC, i)
|
||||||
)),
|
)),
|
||||||
modificationOfJustWrittenValue(STA, ZeroPage, Anything, DEC, Anything, atLeastTwo = true, Seq(State.C, State.V), (_, i) => List(
|
modificationOfJustWrittenValue(STA, ZeroPage, HasClear(State.D), DEC, Anything, atLeastTwo = true, Seq(State.C, State.V), (_, i) => List(
|
||||||
AssemblyLine.implied(SEC),
|
AssemblyLine.implied(SEC),
|
||||||
AssemblyLine.immediate(SBC, i)
|
AssemblyLine.immediate(SBC, i)
|
||||||
)),
|
)),
|
||||||
modificationOfJustWrittenValue(STA, AbsoluteX, Anything, INC, Not(ChangesX), atLeastTwo = true, Seq(State.C, State.V), (_, i) => List(
|
modificationOfJustWrittenValue(STA, AbsoluteX, HasClear(State.D), INC, Not(ChangesX), atLeastTwo = true, Seq(State.C, State.V), (_, i) => List(
|
||||||
AssemblyLine.implied(CLC),
|
AssemblyLine.implied(CLC),
|
||||||
AssemblyLine.immediate(ADC, i)
|
AssemblyLine.immediate(ADC, i)
|
||||||
)),
|
)),
|
||||||
modificationOfJustWrittenValue(STA, AbsoluteX, Anything, DEC, Not(ChangesX), atLeastTwo = true, Seq(State.C, State.V), (_, i) => List(
|
modificationOfJustWrittenValue(STA, AbsoluteX, HasClear(State.D), DEC, Not(ChangesX), atLeastTwo = true, Seq(State.C, State.V), (_, i) => List(
|
||||||
AssemblyLine.implied(SEC),
|
AssemblyLine.implied(SEC),
|
||||||
AssemblyLine.immediate(SBC, i)
|
AssemblyLine.immediate(SBC, i)
|
||||||
)),
|
)),
|
||||||
@ -1599,7 +1599,7 @@ object AlwaysGoodOptimizations {
|
|||||||
(Elidable & HasOpcode(INC) & MatchAddrMode(0) & MatchParameter(1)) ~~> { code =>
|
(Elidable & HasOpcode(INC) & MatchAddrMode(0) & MatchParameter(1)) ~~> { code =>
|
||||||
List(AssemblyLine.implied(SEC), code.head.copy(opcode = ROL))
|
List(AssemblyLine.implied(SEC), code.head.copy(opcode = ROL))
|
||||||
},
|
},
|
||||||
(Elidable & HasOpcode(ASL) & HasAddrMode(AddrMode.Implied)) ~
|
(Elidable & HasOpcode(ASL) & HasAddrMode(AddrMode.Implied) & HasClear(State.D)) ~
|
||||||
(Elidable & HasOpcode(CLC)) ~
|
(Elidable & HasOpcode(CLC)) ~
|
||||||
(Elidable & HasOpcode(ADC) & HasImmediate(1) & DoesntMatterWhatItDoesWith(State.C, State.V)) ~~> { code =>
|
(Elidable & HasOpcode(ADC) & HasImmediate(1) & DoesntMatterWhatItDoesWith(State.C, State.V)) ~~> { code =>
|
||||||
List(AssemblyLine.implied(SEC), code.head.copy(opcode = ROL))
|
List(AssemblyLine.implied(SEC), code.head.copy(opcode = ROL))
|
||||||
|
@ -301,9 +301,9 @@ object LaterOptimizations {
|
|||||||
val cState = if (carrySet) HasSet(State.C) else HasClear(State.C)
|
val cState = if (carrySet) HasSet(State.C) else HasClear(State.C)
|
||||||
val carryOp = if (carrySet) SEC else CLC
|
val carryOp = if (carrySet) SEC else CLC
|
||||||
|
|
||||||
(Elidable & HasOpcode(LDA) & HasAddrModeIn(ldAddrModes)).capture(11) ~
|
(Elidable & HasOpcode(LDA) & HasAddrModeIn(ldAddrModes) & HasClear(State.D)).capture(11) ~
|
||||||
(Elidable & HasOpcode(carryOp)).? ~
|
(Elidable & HasOpcode(carryOp)).? ~
|
||||||
(Elidable & HasOpcode(addOp) & HasImmediate(addParam) & cState & HasClear(State.D)) ~
|
(Elidable & HasOpcode(addOp) & HasImmediate(addParam) & cState) ~
|
||||||
(Elidable & HasOpcode(STA) & HasAddrModeIn(stAddrModes) & DoesntMatterWhatItDoesWith(State.A, State.C, State.V, indexState)).capture(12) ~~> { (_, ctx) =>
|
(Elidable & HasOpcode(STA) & HasAddrModeIn(stAddrModes) & DoesntMatterWhatItDoesWith(State.A, State.C, State.V, indexState)).capture(12) ~~> { (_, ctx) =>
|
||||||
ctx.get[List[AssemblyLine]](11).head.copy(opcode = ldOp) ::
|
ctx.get[List[AssemblyLine]](11).head.copy(opcode = ldOp) ::
|
||||||
(List.fill(amount)(AssemblyLine.implied(changeOp)) :+
|
(List.fill(amount)(AssemblyLine.implied(changeOp)) :+
|
||||||
|
@ -433,21 +433,21 @@ object UndocumentedOptimizations {
|
|||||||
|
|
||||||
val UseMultiple = new RuleBasedAssemblyOptimization("Using multiple undocumented instructions",
|
val UseMultiple = new RuleBasedAssemblyOptimization("Using multiple undocumented instructions",
|
||||||
needsFlowInfo = FlowInfoRequirement.BothFlows,
|
needsFlowInfo = FlowInfoRequirement.BothFlows,
|
||||||
(Elidable & HasOpcode(LDA) & LaxAddrModeRestriction) ~
|
(Elidable & HasOpcode(LDA) & LaxAddrModeRestriction & HasClear(State.D)) ~
|
||||||
(Elidable & HasOpcode(CLC)).? ~
|
(Elidable & HasOpcode(CLC)).? ~
|
||||||
(Elidable & HasOpcode(ADC) & HasImmediate(2) & HasClear(State.C)) ~
|
(Elidable & HasOpcode(ADC) & HasImmediate(2) & HasClear(State.C)) ~
|
||||||
(Elidable & HasOpcode(TAX)) ~~> { (code, ctx) =>
|
(Elidable & HasOpcode(TAX) & DoesntMatterWhatItDoesWith(State.C, State.V)) ~~> { (code, ctx) =>
|
||||||
List(code.head.copy(opcode = LAX), AssemblyLine(SBX, Immediate, Constant.Zero - ctx.get[Constant](2)))
|
List(code.head.copy(opcode = LAX), AssemblyLine(SBX, Immediate, Constant.Zero - ctx.get[Constant](2)))
|
||||||
},
|
},
|
||||||
(Elidable & HasOpcode(LDA) & LaxAddrModeRestriction) ~
|
(Elidable & HasOpcode(LDA) & LaxAddrModeRestriction & HasClear(State.D)) ~
|
||||||
(Elidable & HasOpcode(SEC)).? ~
|
(Elidable & HasOpcode(SEC)).? ~
|
||||||
(Elidable & HasOpcode(SBC) & HasImmediate(2) & HasSet(State.C)) ~
|
(Elidable & HasOpcode(SBC) & HasImmediate(2) & HasSet(State.C)) ~
|
||||||
(Elidable & HasOpcode(TAX)) ~~> { (code, ctx) =>
|
(Elidable & HasOpcode(TAX) & DoesntMatterWhatItDoesWith(State.C, State.V)) ~~> { (code, ctx) =>
|
||||||
List(code.head.copy(opcode = LAX), AssemblyLine(SBX, Immediate, ctx.get[Constant](2)))
|
List(code.head.copy(opcode = LAX), AssemblyLine(SBX, Immediate, ctx.get[Constant](2)))
|
||||||
},
|
},
|
||||||
(Elidable & HasOpcode(LDA) & LaxAddrModeRestriction & MatchAddrMode(0) & MatchParameter(1)) ~
|
(Elidable & HasOpcode(LDA) & LaxAddrModeRestriction & MatchAddrMode(0) & MatchParameter(1)) ~
|
||||||
(Not(ReadsX) & HasOpcodeIn(Set(ANC, ALR, ARR, ADC, AND, EOR, ORA, ADC, SBC, SEC, CLC, STA, LDY, STY)) |
|
(Not(ReadsX) & HasOpcodeIn(Set(ANC, ALR, ARR, ADC, AND, EOR, ORA, ADC, SBC, STA, LDY, STY)) |
|
||||||
HasAddrMode(Implied) & HasOpcodeIn(Set(ASL, LSR, ROL, ROR, TAY, TYA))).* ~
|
HasAddrMode(Implied) & HasOpcodeIn(Set(ASL, LSR, ROL, ROR, TAY, TYA, SEC, CLC, SED, CLD))).* ~
|
||||||
(Elidable & HasOpcode(LDA) & MatchAddrMode(0) & MatchParameter(1)) ~
|
(Elidable & HasOpcode(LDA) & MatchAddrMode(0) & MatchParameter(1)) ~
|
||||||
HasOpcode(LDY).? ~
|
HasOpcode(LDY).? ~
|
||||||
(Elidable & HasOpcode(AND)) ~
|
(Elidable & HasOpcode(AND)) ~
|
||||||
|
Loading…
Reference in New Issue
Block a user