mirror of
https://github.com/irmen/prog8.git
synced 2024-10-01 22:56:10 +00:00
don't always use pha/pla in pointer expression code
This commit is contained in:
parent
2b435fe6a5
commit
e6079dfd71
@ -1407,39 +1407,44 @@ $label nop""")
|
|||||||
|
|
||||||
internal fun tryOptimizedPointerAccessWithA(expr: BinaryExpression, write: Boolean): Boolean {
|
internal fun tryOptimizedPointerAccessWithA(expr: BinaryExpression, write: Boolean): Boolean {
|
||||||
// optimize pointer,indexregister if possible
|
// optimize pointer,indexregister if possible
|
||||||
|
|
||||||
|
fun evalBytevalueWillClobberA(expr: Expression): Boolean {
|
||||||
|
val dt = expr.inferType(program)
|
||||||
|
if(!dt.istype(DataType.UBYTE) && !dt.istype(DataType.BYTE))
|
||||||
|
return true
|
||||||
|
return when(expr) {
|
||||||
|
is IdentifierReference -> false
|
||||||
|
is NumericLiteralValue -> false
|
||||||
|
is DirectMemoryRead -> expr.addressExpression !is IdentifierReference && expr.addressExpression !is NumericLiteralValue
|
||||||
|
is TypecastExpression -> evalBytevalueWillClobberA(expr.expression)
|
||||||
|
else -> true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if(expr.operator=="+") {
|
if(expr.operator=="+") {
|
||||||
val ptrAndIndex = pointerViaIndexRegisterPossible(expr)
|
val ptrAndIndex = pointerViaIndexRegisterPossible(expr)
|
||||||
if(ptrAndIndex!=null) {
|
if(ptrAndIndex!=null) {
|
||||||
val pointervar = ptrAndIndex.first as? IdentifierReference
|
val pointervar = ptrAndIndex.first as? IdentifierReference
|
||||||
if(write) {
|
if(write) {
|
||||||
when(ptrAndIndex.second) {
|
|
||||||
is NumericLiteralValue, is IdentifierReference -> {
|
|
||||||
if(pointervar!=null && isZpVar(pointervar)) {
|
if(pointervar!=null && isZpVar(pointervar)) {
|
||||||
|
val saveA = evalBytevalueWillClobberA(ptrAndIndex.second)
|
||||||
|
if(saveA)
|
||||||
out(" pha")
|
out(" pha")
|
||||||
assignExpressionToRegister(ptrAndIndex.second, RegisterOrPair.Y)
|
assignExpressionToRegister(ptrAndIndex.second, RegisterOrPair.Y)
|
||||||
out(" pla | sta (${asmSymbolName(pointervar)}),y")
|
if(saveA)
|
||||||
|
out(" pla")
|
||||||
|
out(" sta (${asmSymbolName(pointervar)}),y")
|
||||||
} else {
|
} else {
|
||||||
// copy the pointer var to zp first
|
// copy the pointer var to zp first
|
||||||
|
val saveA = evalBytevalueWillClobberA(ptrAndIndex.first) || evalBytevalueWillClobberA(ptrAndIndex.second)
|
||||||
|
if(saveA)
|
||||||
out(" pha")
|
out(" pha")
|
||||||
assignExpressionToVariable(ptrAndIndex.first, asmVariableName("P8ZP_SCRATCH_W2"), DataType.UWORD, null)
|
assignExpressionToVariable(ptrAndIndex.first, asmVariableName("P8ZP_SCRATCH_W2"), DataType.UWORD, null)
|
||||||
assignExpressionToRegister(ptrAndIndex.second, RegisterOrPair.Y)
|
assignExpressionToRegister(ptrAndIndex.second, RegisterOrPair.Y)
|
||||||
out(" pla | sta (P8ZP_SCRATCH_W2),y")
|
if(saveA)
|
||||||
}
|
out(" pla")
|
||||||
}
|
out(" sta (P8ZP_SCRATCH_W2),y")
|
||||||
else -> {
|
|
||||||
// same as above but we need to save the A register
|
|
||||||
if(pointervar!=null && isZpVar(pointervar)) {
|
|
||||||
out(" pha")
|
|
||||||
assignExpressionToRegister(ptrAndIndex.second, RegisterOrPair.Y)
|
|
||||||
out(" pla | sta (${asmSymbolName(pointervar)}),y")
|
|
||||||
} else {
|
|
||||||
// copy the pointer var to zp first
|
|
||||||
assignExpressionToVariable(ptrAndIndex.first, asmVariableName("P8ZP_SCRATCH_W2"), DataType.UWORD, null)
|
|
||||||
out(" pha")
|
|
||||||
assignExpressionToRegister(ptrAndIndex.second, RegisterOrPair.Y)
|
|
||||||
out(" pla | sta (P8ZP_SCRATCH_W2),y")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(pointervar!=null && isZpVar(pointervar)) {
|
if(pointervar!=null && isZpVar(pointervar)) {
|
||||||
|
@ -4,6 +4,15 @@
|
|||||||
main {
|
main {
|
||||||
|
|
||||||
sub start() {
|
sub start() {
|
||||||
|
uword screen = 2000
|
||||||
|
ubyte i = 1
|
||||||
|
uword w = 33
|
||||||
|
str derp ="derp"
|
||||||
|
ubyte[] array = [1,2,3]
|
||||||
|
|
||||||
|
@(screen+i) = 128
|
||||||
|
@(i+screen) = 129
|
||||||
|
|
||||||
txt.print("done\n")
|
txt.print("done\n")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user