mirror of
https://github.com/irmen/prog8.git
synced 2025-01-11 13:29:45 +00:00
fix invalid code gen for if v1==0 or v2==0
This commit is contained in:
parent
ddf990296b
commit
e7298f8162
@ -59,16 +59,15 @@ internal class NotExpressionAndIfComparisonExprChanger(val program: Program, val
|
||||
// integer case (only if both are the same type)
|
||||
val leftC = expr.left as? BinaryExpression
|
||||
val rightC = expr.right as? BinaryExpression
|
||||
if(leftC!=null && rightC!=null && leftC.operator=="==" && rightC.operator=="==") {
|
||||
if(expr.operator=="and" && leftC!=null && rightC!=null && leftC.operator=="==" && rightC.operator=="==") {
|
||||
if (leftC.right.constValue(program)?.number == 0.0 && rightC.right.constValue(program)?.number == 0.0) {
|
||||
val leftDt = leftC.left.inferType(program).getOr(DataType.UNDEFINED)
|
||||
val rightDt = rightC.left.inferType(program).getOr(DataType.UNDEFINED)
|
||||
if(leftDt==rightDt && leftDt in IntegerDatatypes) {
|
||||
if (rightC.left.isSimple) {
|
||||
// x==0 or y==0 -> (x & y)==0
|
||||
// x==0 and y==0 -> (x | y)==0
|
||||
val newOperator = if(expr.operator=="or") "&" else "|"
|
||||
val inner = BinaryExpression(leftC.left, newOperator, rightC.left, expr.position)
|
||||
// the 'or' case cannot be easily optimized with a binary and like this!
|
||||
val inner = BinaryExpression(leftC.left, "|", rightC.left, expr.position)
|
||||
val compare = BinaryExpression(inner, "==", NumericLiteral(leftDt, 0.0, expr.position), expr.position)
|
||||
return listOf(IAstModification.ReplaceNode(expr, compare, parent))
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ other issues on github.
|
||||
optimize signed byte/word division by powers of 2 (and shift right?), it's now using divmod routine. (also % ?)
|
||||
see inplacemodificationByteVariableWithLiteralval() and inplacemodificationSomeWordWithLiteralval()
|
||||
and for IR: see divideByConst() in IRCodeGen
|
||||
|
||||
1 shift right of AX signed word:
|
||||
stx P8ZP_SCRATCH_B1
|
||||
cpx #$80
|
||||
@ -85,6 +86,7 @@ Libraries:
|
||||
|
||||
Optimizations:
|
||||
|
||||
- For 65c02 targets: use trb and tsb instructions if possible (f.ex. generating 'lda cmask' ' trb nvub' for 'nvub &= ~cmask' and 'lda cmask' 'and fillm' 'tsb nvub' for 'nvub |= cmask & fillm')
|
||||
- VariableAllocator: can we think of a smarter strategy for allocating variables into zeropage, rather than first-come-first-served?
|
||||
for instance, vars used inside loops first, then loopvars, then uwords used as pointers, then the rest
|
||||
- various optimizers skip stuff if compTarget.name==VMTarget.NAME. Once 6502-codegen is done from IR code,
|
||||
|
Loading…
x
Reference in New Issue
Block a user