mirror of
https://github.com/irmen/prog8.git
synced 2024-09-10 09:54:32 +00:00
consolidate word comparison codegen
This commit is contained in:
parent
047decd552
commit
58d9463f16
@ -23,7 +23,7 @@ internal class AnyExprAsmGen(
|
|||||||
return assignByteBinExpr(expr, assign)
|
return assignByteBinExpr(expr, assign)
|
||||||
if (expr.left.type in WordDatatypes && expr.right.type in WordDatatypes) {
|
if (expr.left.type in WordDatatypes && expr.right.type in WordDatatypes) {
|
||||||
require(expr.operator in ComparisonOperators)
|
require(expr.operator in ComparisonOperators)
|
||||||
throw AssemblyError("words operands comparison -> byte, should have been handled by assignOptimizedComparisonWords()")
|
throw AssemblyError("words operands comparison -> byte, should have been handled elsewhere")
|
||||||
}
|
}
|
||||||
if (expr.left.type==DataType.FLOAT && expr.right.type==DataType.FLOAT) {
|
if (expr.left.type==DataType.FLOAT && expr.right.type==DataType.FLOAT) {
|
||||||
require(expr.operator in ComparisonOperators)
|
require(expr.operator in ComparisonOperators)
|
||||||
|
@ -429,11 +429,6 @@ internal class AssignmentAsmGen(private val program: PtProgram,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(expr.left.type in WordDatatypes && expr.right.type in WordDatatypes) {
|
|
||||||
if(assignOptimizedComparisonWords(expr, assign)) // TODO remove this!
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// b = v > 99 --> b=false , if v>99 b=true
|
// b = v > 99 --> b=false , if v>99 b=true
|
||||||
val targetReg=assign.target.register
|
val targetReg=assign.target.register
|
||||||
if(targetReg!=null) {
|
if(targetReg!=null) {
|
||||||
@ -1206,297 +1201,6 @@ internal class AssignmentAsmGen(private val program: PtProgram,
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun assignOptimizedComparisonWords(expr: PtBinaryExpression, assign: AsmAssignment): Boolean {
|
|
||||||
val signed = expr.left.type == DataType.WORD || expr.right.type == DataType.WORD
|
|
||||||
|
|
||||||
when(expr.operator) {
|
|
||||||
"==" -> {
|
|
||||||
if(expr.left is PtIdentifier) {
|
|
||||||
val varName = asmgen.asmVariableName(expr.left as PtIdentifier)
|
|
||||||
asmgen.assignExpressionToRegister(expr.right, RegisterOrPair.AY)
|
|
||||||
asmgen.out("""
|
|
||||||
cmp $varName
|
|
||||||
bne +
|
|
||||||
cpy $varName+1
|
|
||||||
bne +
|
|
||||||
lda #1
|
|
||||||
bne ++
|
|
||||||
+ lda #0
|
|
||||||
+""")
|
|
||||||
} else {
|
|
||||||
asmgen.assignWordOperandsToAYAndVar(expr.right, expr.left, "P8ZP_SCRATCH_W1")
|
|
||||||
asmgen.out("""
|
|
||||||
cmp P8ZP_SCRATCH_W1
|
|
||||||
bne +
|
|
||||||
cpy P8ZP_SCRATCH_W1+1
|
|
||||||
bne +
|
|
||||||
lda #1
|
|
||||||
bne ++
|
|
||||||
+ lda #0
|
|
||||||
+""")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"!=" -> {
|
|
||||||
if(expr.left is PtIdentifier) {
|
|
||||||
val varName = asmgen.asmVariableName(expr.left as PtIdentifier)
|
|
||||||
asmgen.assignExpressionToRegister(expr.right, RegisterOrPair.AY)
|
|
||||||
asmgen.out("""
|
|
||||||
cmp $varName
|
|
||||||
bne +
|
|
||||||
cpy $varName+1
|
|
||||||
bne +
|
|
||||||
lda #0
|
|
||||||
beq ++
|
|
||||||
+ lda #1
|
|
||||||
+""")
|
|
||||||
} else {
|
|
||||||
asmgen.assignWordOperandsToAYAndVar(expr.right, expr.left, "P8ZP_SCRATCH_W1")
|
|
||||||
asmgen.out("""
|
|
||||||
cmp P8ZP_SCRATCH_W1
|
|
||||||
bne +
|
|
||||||
cpy P8ZP_SCRATCH_W1+1
|
|
||||||
bne +
|
|
||||||
lda #0
|
|
||||||
beq ++
|
|
||||||
+ lda #1
|
|
||||||
+""")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"<" -> {
|
|
||||||
if(expr.right is PtIdentifier) {
|
|
||||||
val varName = asmgen.asmVariableName(expr.right as PtIdentifier)
|
|
||||||
asmgen.assignExpressionToRegister(expr.left, RegisterOrPair.AY)
|
|
||||||
if(signed)
|
|
||||||
asmgen.out("""
|
|
||||||
cmp $varName
|
|
||||||
tya
|
|
||||||
sbc $varName+1
|
|
||||||
bvc +
|
|
||||||
eor #${'$'}80
|
|
||||||
+ bpl ++
|
|
||||||
+ lda #1
|
|
||||||
bne ++
|
|
||||||
+ lda #0
|
|
||||||
+""")
|
|
||||||
else
|
|
||||||
asmgen.out("""
|
|
||||||
cpy $varName+1
|
|
||||||
bcc +
|
|
||||||
bne ++
|
|
||||||
cmp $varName
|
|
||||||
bcs ++
|
|
||||||
+ lda #1
|
|
||||||
bne ++
|
|
||||||
+ lda #0
|
|
||||||
+""")
|
|
||||||
} else {
|
|
||||||
if(signed) {
|
|
||||||
asmgen.assignWordOperandsToAYAndVar(expr.left, expr.right, "P8ZP_SCRATCH_W1")
|
|
||||||
asmgen.out("""
|
|
||||||
cmp P8ZP_SCRATCH_W1
|
|
||||||
tya
|
|
||||||
sbc P8ZP_SCRATCH_W1+1
|
|
||||||
bvc +
|
|
||||||
eor #${'$'}80
|
|
||||||
+ bpl ++
|
|
||||||
+ lda #1
|
|
||||||
bne ++
|
|
||||||
+ lda #0
|
|
||||||
+""")
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
asmgen.assignWordOperandsToAYAndVar(expr.left, expr.right, "P8ZP_SCRATCH_W1")
|
|
||||||
asmgen.out("""
|
|
||||||
cpy P8ZP_SCRATCH_W1+1
|
|
||||||
bcc +
|
|
||||||
bne ++
|
|
||||||
cmp P8ZP_SCRATCH_W1
|
|
||||||
bcs ++
|
|
||||||
+ lda #1
|
|
||||||
bne ++
|
|
||||||
+ lda #0
|
|
||||||
+""")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"<=" -> {
|
|
||||||
if(expr.left is PtIdentifier) {
|
|
||||||
val varName = asmgen.asmVariableName(expr.left as PtIdentifier)
|
|
||||||
asmgen.assignExpressionToRegister(expr.right, RegisterOrPair.AY)
|
|
||||||
if(signed)
|
|
||||||
asmgen.out("""
|
|
||||||
cmp $varName
|
|
||||||
tya
|
|
||||||
sbc $varName+1
|
|
||||||
bvc +
|
|
||||||
eor #${'$'}80
|
|
||||||
+ bmi +
|
|
||||||
lda #1
|
|
||||||
bne ++
|
|
||||||
+ lda #0
|
|
||||||
+""")
|
|
||||||
else
|
|
||||||
asmgen.out("""
|
|
||||||
cpy $varName+1
|
|
||||||
bcc ++
|
|
||||||
bne +
|
|
||||||
cmp $varName
|
|
||||||
bcc ++
|
|
||||||
+ lda #1
|
|
||||||
bne ++
|
|
||||||
+ lda #0
|
|
||||||
+""")
|
|
||||||
} else {
|
|
||||||
if(signed) {
|
|
||||||
asmgen.assignWordOperandsToAYAndVar(expr.right, expr.left, "P8ZP_SCRATCH_W1")
|
|
||||||
asmgen.out("""
|
|
||||||
cmp P8ZP_SCRATCH_W1
|
|
||||||
tya
|
|
||||||
sbc P8ZP_SCRATCH_W1+1
|
|
||||||
bvc +
|
|
||||||
eor #${'$'}80
|
|
||||||
+ bmi +
|
|
||||||
lda #1
|
|
||||||
bne ++
|
|
||||||
+ lda #0
|
|
||||||
+""")
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
asmgen.assignWordOperandsToAYAndVar(expr.right, expr.left, "P8ZP_SCRATCH_W1")
|
|
||||||
asmgen.out("""
|
|
||||||
cpy P8ZP_SCRATCH_W1+1
|
|
||||||
bcc ++
|
|
||||||
bne +
|
|
||||||
cmp P8ZP_SCRATCH_W1
|
|
||||||
bcc ++
|
|
||||||
+ lda #1
|
|
||||||
bne ++
|
|
||||||
+ lda #0
|
|
||||||
+""")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
">" -> {
|
|
||||||
if(expr.left is PtIdentifier) {
|
|
||||||
val varName = asmgen.asmVariableName(expr.left as PtIdentifier)
|
|
||||||
asmgen.assignExpressionToRegister(expr.right, RegisterOrPair.AY)
|
|
||||||
if(signed)
|
|
||||||
asmgen.out("""
|
|
||||||
cmp $varName
|
|
||||||
tya
|
|
||||||
sbc $varName+1
|
|
||||||
bvc +
|
|
||||||
eor #${'$'}80
|
|
||||||
+ bpl ++
|
|
||||||
+ lda #1
|
|
||||||
bne ++
|
|
||||||
+ lda #0
|
|
||||||
+""")
|
|
||||||
else
|
|
||||||
asmgen.out("""
|
|
||||||
cpy $varName+1
|
|
||||||
bcc +
|
|
||||||
bne ++
|
|
||||||
cmp $varName
|
|
||||||
bcs ++
|
|
||||||
+ lda #1
|
|
||||||
bne ++
|
|
||||||
+ lda #0
|
|
||||||
+""")
|
|
||||||
} else {
|
|
||||||
if(signed) {
|
|
||||||
asmgen.assignWordOperandsToAYAndVar(expr.right, expr.left, "P8ZP_SCRATCH_W1")
|
|
||||||
asmgen.out("""
|
|
||||||
cmp P8ZP_SCRATCH_W1
|
|
||||||
tya
|
|
||||||
sbc P8ZP_SCRATCH_W1+1
|
|
||||||
bvc +
|
|
||||||
eor #${'$'}80
|
|
||||||
+ bpl ++
|
|
||||||
+ lda #1
|
|
||||||
bne ++
|
|
||||||
+ lda #0
|
|
||||||
+""")
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
asmgen.assignWordOperandsToAYAndVar(expr.right, expr.left, "P8ZP_SCRATCH_W1")
|
|
||||||
asmgen.out("""
|
|
||||||
cpy P8ZP_SCRATCH_W1+1
|
|
||||||
bcc +
|
|
||||||
bne ++
|
|
||||||
cmp P8ZP_SCRATCH_W1
|
|
||||||
bcs ++
|
|
||||||
+ lda #1
|
|
||||||
bne ++
|
|
||||||
+ lda #0
|
|
||||||
+""")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
">=" -> {
|
|
||||||
if(expr.right is PtIdentifier) {
|
|
||||||
val varName = asmgen.asmVariableName(expr.right as PtIdentifier)
|
|
||||||
asmgen.assignExpressionToRegister(expr.left, RegisterOrPair.AY)
|
|
||||||
if(signed)
|
|
||||||
asmgen.out("""
|
|
||||||
cmp $varName
|
|
||||||
tya
|
|
||||||
sbc $varName+1
|
|
||||||
bvc +
|
|
||||||
eor #${'$'}80
|
|
||||||
+ bmi +
|
|
||||||
lda #1
|
|
||||||
bne ++
|
|
||||||
+ lda #0
|
|
||||||
+""")
|
|
||||||
else
|
|
||||||
asmgen.out("""
|
|
||||||
cpy $varName+1
|
|
||||||
bcc ++
|
|
||||||
bne +
|
|
||||||
cmp $varName
|
|
||||||
bcc ++
|
|
||||||
+ lda #1
|
|
||||||
bne ++
|
|
||||||
+ lda #0
|
|
||||||
+""")
|
|
||||||
} else {
|
|
||||||
if(signed) {
|
|
||||||
asmgen.assignWordOperandsToAYAndVar(expr.left, expr.right, "P8ZP_SCRATCH_W1")
|
|
||||||
asmgen.out("""
|
|
||||||
cmp P8ZP_SCRATCH_W1
|
|
||||||
tya
|
|
||||||
sbc P8ZP_SCRATCH_W1+1
|
|
||||||
bvc +
|
|
||||||
eor #${'$'}80
|
|
||||||
+ bmi +
|
|
||||||
lda #1
|
|
||||||
bne ++
|
|
||||||
+ lda #0
|
|
||||||
+""")
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
asmgen.assignWordOperandsToAYAndVar(expr.left, expr.right, "P8ZP_SCRATCH_W1")
|
|
||||||
asmgen.out("""
|
|
||||||
cpy P8ZP_SCRATCH_W1+1
|
|
||||||
bcc ++
|
|
||||||
bne +
|
|
||||||
cmp P8ZP_SCRATCH_W1
|
|
||||||
bcc ++
|
|
||||||
+ lda #1
|
|
||||||
bne ++
|
|
||||||
+ lda #0
|
|
||||||
+""")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else -> return false
|
|
||||||
}
|
|
||||||
|
|
||||||
assignRegisterByte(assign.target, CpuRegister.A, signed, true)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun assignBitwiseWithSimpleRightOperandByte(target: AsmAssignTarget, left: PtExpression, operator: String, right: PtExpression) {
|
private fun assignBitwiseWithSimpleRightOperandByte(target: AsmAssignTarget, left: PtExpression, operator: String, right: PtExpression) {
|
||||||
assignExpressionToRegister(left, RegisterOrPair.A, false)
|
assignExpressionToRegister(left, RegisterOrPair.A, false)
|
||||||
val operand = when(right) {
|
val operand = when(right) {
|
||||||
|
@ -1,10 +1,30 @@
|
|||||||
TODO
|
TODO
|
||||||
====
|
====
|
||||||
|
|
||||||
textelite is larger
|
add asm optimizer:
|
||||||
|
LDA NUM1
|
||||||
|
CMP NUM2
|
||||||
|
BCC LABEL
|
||||||
|
BEQ LABEL
|
||||||
|
|
||||||
|
(or something similar) which branches to LABEL when NUM1 <= NUM2. (In this case NUM1 and NUM2 are unsigned numbers.) However, consider the following sequence:
|
||||||
|
|
||||||
|
LDA NUM2
|
||||||
|
CMP NUM1
|
||||||
|
BCS LABEL
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
larger programs:
|
||||||
|
automatons
|
||||||
|
mandelbrot (quite a bit larger)
|
||||||
|
mandelbrot-gfx
|
||||||
|
maze
|
||||||
|
textelite
|
||||||
|
rockrunner is quite a bit larger
|
||||||
|
|
||||||
|
|
||||||
optimize assignOptimizedComparisonWords for when comparing to simple things like number and identifier. (get rid of it completely by just rewriting everything into an if-else statement?)
|
|
||||||
optimize optimizedPlusMinExpr for when comparing to simple things like number and identifier.
|
optimize optimizedPlusMinExpr for when comparing to simple things like number and identifier.
|
||||||
|
|
||||||
replace Takes by Http4k in httpCompilerService project. https://github.com/http4k/examples/blob/master/hello-world/README.md
|
replace Takes by Http4k in httpCompilerService project. https://github.com/http4k/examples/blob/master/hello-world/README.md
|
||||||
|
@ -4,6 +4,16 @@
|
|||||||
|
|
||||||
main {
|
main {
|
||||||
sub start() {
|
sub start() {
|
||||||
|
ubyte[] flakes = [1,2,3]
|
||||||
|
|
||||||
|
ubyte @shared idx = 2
|
||||||
|
|
||||||
|
if flakes[idx]==239 {
|
||||||
|
txt.print("yes")
|
||||||
|
} else {
|
||||||
|
txt.print("nope")
|
||||||
|
}
|
||||||
|
|
||||||
ubyte @shared xx = 16
|
ubyte @shared xx = 16
|
||||||
ubyte @shared yy = 20
|
ubyte @shared yy = 20
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user