mirror of
https://github.com/irmen/prog8.git
synced 2024-12-24 01:29:28 +00:00
optimized word comparison expressions
This commit is contained in:
parent
393e914a86
commit
68336a76c5
@ -820,7 +820,7 @@ internal class AssignmentAsmGen(private val program: PtProgram,
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun assignOptimizedComparisonWords(expr: PtBinaryExpression, assign: AsmAssignment): Boolean {
|
private fun assignOptimizedComparisonWords(expr: PtBinaryExpression, assign: AsmAssignment): Boolean {
|
||||||
val signed = expr.left.type == DataType.BYTE || expr.right.type == DataType.BYTE
|
val signed = expr.left.type == DataType.WORD || expr.right.type == DataType.WORD
|
||||||
fun assignExpressionOperandsLeftScratchRightAY() {
|
fun assignExpressionOperandsLeftScratchRightAY() {
|
||||||
if(expr.right.isSimple()) {
|
if(expr.right.isSimple()) {
|
||||||
assignExpressionToVariable(expr.left, "P8ZP_SCRATCH_W1", expr.left.type)
|
assignExpressionToVariable(expr.left, "P8ZP_SCRATCH_W1", expr.left.type)
|
||||||
@ -834,6 +834,19 @@ internal class AssignmentAsmGen(private val program: PtProgram,
|
|||||||
asmgen.restoreRegisterStack(CpuRegister.A, false)
|
asmgen.restoreRegisterStack(CpuRegister.A, false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fun assignExpressionOperandsLeftAYRightScratch() {
|
||||||
|
if(expr.left.isSimple()) {
|
||||||
|
assignExpressionToVariable(expr.right, "P8ZP_SCRATCH_W1", expr.left.type)
|
||||||
|
assignExpressionToRegister(expr.left, RegisterOrPair.AY, signed)
|
||||||
|
} else {
|
||||||
|
assignExpressionToRegister(expr.left, RegisterOrPair.AY, signed)
|
||||||
|
asmgen.saveRegisterStack(CpuRegister.A, false)
|
||||||
|
asmgen.saveRegisterStack(CpuRegister.Y, false)
|
||||||
|
assignExpressionToVariable(expr.right, "P8ZP_SCRATCH_W1", expr.left.type)
|
||||||
|
asmgen.restoreRegisterStack(CpuRegister.Y, false)
|
||||||
|
asmgen.restoreRegisterStack(CpuRegister.A, false)
|
||||||
|
}
|
||||||
|
}
|
||||||
when(expr.operator) {
|
when(expr.operator) {
|
||||||
"==" -> {
|
"==" -> {
|
||||||
assignExpressionOperandsLeftScratchRightAY()
|
assignExpressionOperandsLeftScratchRightAY()
|
||||||
@ -861,42 +874,118 @@ internal class AssignmentAsmGen(private val program: PtProgram,
|
|||||||
}
|
}
|
||||||
"<" -> {
|
"<" -> {
|
||||||
if(signed) {
|
if(signed) {
|
||||||
// TODO("word <")
|
assignExpressionOperandsLeftAYRightScratch()
|
||||||
return false
|
asmgen.out("""
|
||||||
|
cmp P8ZP_SCRATCH_W1
|
||||||
|
tya
|
||||||
|
sbc P8ZP_SCRATCH_W1+1
|
||||||
|
bvc +
|
||||||
|
eor #${'$'}80
|
||||||
|
+ bpl ++
|
||||||
|
+ lda #1
|
||||||
|
bne ++
|
||||||
|
+ lda #0
|
||||||
|
+""")
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// TODO("uword <")
|
assignExpressionOperandsLeftAYRightScratch()
|
||||||
return false
|
asmgen.out("""
|
||||||
|
cpy P8ZP_SCRATCH_W1+1
|
||||||
|
bcc +
|
||||||
|
bne ++
|
||||||
|
cmp P8ZP_SCRATCH_W1
|
||||||
|
bcs ++
|
||||||
|
+ lda #1
|
||||||
|
bne ++
|
||||||
|
+ lda #0
|
||||||
|
+""")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"<=" -> {
|
"<=" -> {
|
||||||
if(signed) {
|
if(signed) {
|
||||||
// TODO("word <=")
|
assignExpressionOperandsLeftScratchRightAY()
|
||||||
return false
|
asmgen.out("""
|
||||||
|
cmp P8ZP_SCRATCH_W1
|
||||||
|
tya
|
||||||
|
sbc P8ZP_SCRATCH_W1+1
|
||||||
|
bvc +
|
||||||
|
eor #${'$'}80
|
||||||
|
+ bmi +
|
||||||
|
lda #1
|
||||||
|
bne ++
|
||||||
|
+ lda #0
|
||||||
|
+""")
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// TODO("uword =<")
|
assignExpressionOperandsLeftScratchRightAY()
|
||||||
return false
|
asmgen.out("""
|
||||||
|
cpy P8ZP_SCRATCH_W1+1
|
||||||
|
bcc ++
|
||||||
|
bne +
|
||||||
|
cmp P8ZP_SCRATCH_W1
|
||||||
|
bcc ++
|
||||||
|
+ lda #1
|
||||||
|
bne ++
|
||||||
|
+ lda #0
|
||||||
|
+""")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
">" -> {
|
">" -> {
|
||||||
if(signed) {
|
if(signed) {
|
||||||
// TODO("word >")
|
assignExpressionOperandsLeftScratchRightAY()
|
||||||
return false
|
asmgen.out("""
|
||||||
|
cmp P8ZP_SCRATCH_W1
|
||||||
|
tya
|
||||||
|
sbc P8ZP_SCRATCH_W1+1
|
||||||
|
bvc +
|
||||||
|
eor #${'$'}80
|
||||||
|
+ bpl ++
|
||||||
|
+ lda #1
|
||||||
|
bne ++
|
||||||
|
+ lda #0
|
||||||
|
+""")
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// TODO("uword >")
|
assignExpressionOperandsLeftScratchRightAY()
|
||||||
return false
|
asmgen.out("""
|
||||||
|
cpy P8ZP_SCRATCH_W1+1
|
||||||
|
bcc +
|
||||||
|
bne ++
|
||||||
|
cmp P8ZP_SCRATCH_W1
|
||||||
|
bcs ++
|
||||||
|
+ lda #1
|
||||||
|
bne ++
|
||||||
|
+ lda #0
|
||||||
|
+""")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
">=" -> {
|
">=" -> {
|
||||||
if(signed) {
|
if(signed) {
|
||||||
// TODO("word >=")
|
assignExpressionOperandsLeftAYRightScratch()
|
||||||
return false
|
asmgen.out("""
|
||||||
|
cmp P8ZP_SCRATCH_W1
|
||||||
|
tya
|
||||||
|
sbc P8ZP_SCRATCH_W1+1
|
||||||
|
bvc +
|
||||||
|
eor #${'$'}80
|
||||||
|
+ bmi +
|
||||||
|
lda #1
|
||||||
|
bne ++
|
||||||
|
+ lda #0
|
||||||
|
+""")
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// TODO("uword >=")
|
assignExpressionOperandsLeftAYRightScratch()
|
||||||
return false
|
asmgen.out("""
|
||||||
|
cpy P8ZP_SCRATCH_W1+1
|
||||||
|
bcc ++
|
||||||
|
bne +
|
||||||
|
cmp P8ZP_SCRATCH_W1
|
||||||
|
bcc ++
|
||||||
|
+ lda #1
|
||||||
|
bne ++
|
||||||
|
+ lda #0
|
||||||
|
+""")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else -> return false
|
else -> return false
|
||||||
|
@ -3,8 +3,7 @@ TODO
|
|||||||
|
|
||||||
For next minor release
|
For next minor release
|
||||||
^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
- finish assignOptimizedComparisonWords()
|
- find bcc/bcs + lda branches that could be a rol?
|
||||||
- find bcc/bcs branches that could be a rol?
|
|
||||||
- find adc #0 that could be a rol?
|
- find adc #0 that could be a rol?
|
||||||
- try to optimize newexpr a bit more
|
- try to optimize newexpr a bit more
|
||||||
|
|
||||||
|
@ -6,50 +6,54 @@ main {
|
|||||||
sub start() {
|
sub start() {
|
||||||
ubyte[10] envelope_attacks = 99
|
ubyte[10] envelope_attacks = 99
|
||||||
|
|
||||||
|
; signed word:
|
||||||
; signed and unsigned word:
|
|
||||||
; >
|
; >
|
||||||
; >=
|
|
||||||
; <
|
|
||||||
; <=
|
|
||||||
|
|
||||||
|
|
||||||
; expect nope nope yep yep yep
|
; expect yep nope nope nope yep nope
|
||||||
cx16.r0 = $ea30
|
cx16.r0s = -1000
|
||||||
cx16.r2 = $ea31
|
cx16.r2s = -999
|
||||||
if (cx16.r0 > cx16.r2) or (envelope_attacks[cx16.r1L]==0) {
|
if (cx16.r0s < cx16.r2s) or (envelope_attacks[cx16.r1L]==0) {
|
||||||
txt.print("\nyep\n")
|
txt.print("\nyep\n")
|
||||||
} else {
|
} else {
|
||||||
txt.print("\nnope\n")
|
txt.print("\nnope\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
cx16.r0 = $ea31
|
cx16.r0s = -999
|
||||||
cx16.r2 = $ea31
|
cx16.r2s = -999
|
||||||
if (cx16.r0 > cx16.r2) or (envelope_attacks[cx16.r1L]==0) {
|
if (cx16.r0s < cx16.r2s) or (envelope_attacks[cx16.r1L]==0) {
|
||||||
txt.print("\nyep\n")
|
txt.print("\nyep\n")
|
||||||
} else {
|
} else {
|
||||||
txt.print("\nnope\n")
|
txt.print("\nnope\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
cx16.r0 = $ea32
|
cx16.r0s = -998
|
||||||
cx16.r2 = $ea31
|
cx16.r2s = -999
|
||||||
if (cx16.r0 > cx16.r2) or (envelope_attacks[cx16.r1L]==0) {
|
if (cx16.r0s < cx16.r2s) or (envelope_attacks[cx16.r1L]==0) {
|
||||||
txt.print("\nyep\n")
|
txt.print("\nyep\n")
|
||||||
} else {
|
} else {
|
||||||
txt.print("\nnope\n")
|
txt.print("\nnope\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
cx16.r0 = $ee30
|
cx16.r0s = 0
|
||||||
cx16.r2 = $ea31
|
cx16.r2s = -999
|
||||||
if (cx16.r0 > cx16.r2) or (envelope_attacks[cx16.r1L]==0) {
|
if (cx16.r0s < cx16.r2s) or (envelope_attacks[cx16.r1L]==0) {
|
||||||
txt.print("\nyep\n")
|
txt.print("\nyep\n")
|
||||||
} else {
|
} else {
|
||||||
txt.print("\nnope\n")
|
txt.print("\nnope\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
cx16.r0 = $ffff
|
cx16.r0s = -999
|
||||||
cx16.r2 = $ee31
|
cx16.r2s = 0
|
||||||
if (cx16.r0 > cx16.r2) or (envelope_attacks[cx16.r1L]==0) {
|
if (cx16.r0s < cx16.r2s) or (envelope_attacks[cx16.r1L]==0) {
|
||||||
|
txt.print("\nyep\n")
|
||||||
|
} else {
|
||||||
|
txt.print("\nnope\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
cx16.r0s = $7fff
|
||||||
|
cx16.r2s = $7eff
|
||||||
|
if (cx16.r0s < cx16.r2s) or (envelope_attacks[cx16.r1L]==0) {
|
||||||
txt.print("\nyep\n")
|
txt.print("\nyep\n")
|
||||||
} else {
|
} else {
|
||||||
txt.print("\nnope\n")
|
txt.print("\nnope\n")
|
||||||
|
Loading…
Reference in New Issue
Block a user