various inplace modification for word vars now without translateExpression()

This commit is contained in:
Irmen de Jong 2020-11-19 00:08:10 +01:00
parent 72509eef44
commit 063bcf17d8
2 changed files with 24 additions and 37 deletions

View File

@ -447,15 +447,15 @@ internal class AugmentableAssignmentAsmGen(private val program: Program,
asmgen.out(" lda $name | sec | sbc P8ESTACK_LO+1,x | sta $name | inx") asmgen.out(" lda $name | sec | sbc P8ESTACK_LO+1,x | sta $name | inx")
} }
"*" -> { "*" -> {
asmgen.translateExpression(value) // TODO directly into A asmgen.assignExpressionToRegister(value, RegisterOrPair.A)
asmgen.out(" lda P8ESTACK_LO+1,x | ldy $name | jsr math.multiply_bytes | sta $name | inx") asmgen.out(" ldy $name | jsr math.multiply_bytes | sta $name")
} }
"/" -> { "/" -> {
asmgen.translateExpression(value) // TODO directly into Y asmgen.assignExpressionToRegister(value, RegisterOrPair.Y)
if(dt==DataType.UBYTE) if(dt==DataType.UBYTE)
asmgen.out(" lda P8ESTACK_LO+1,x | tay | lda $name | jsr math.divmod_ub_asm | sty $name | inx") asmgen.out(" lda $name | jsr math.divmod_ub_asm | sty $name")
else else
asmgen.out(" lda P8ESTACK_LO+1,x | tay | lda $name | jsr math.divmod_b_asm | sty $name | inx") asmgen.out(" lda $name | jsr math.divmod_b_asm | sty $name")
} }
"%" -> { "%" -> {
if(dt==DataType.BYTE) if(dt==DataType.BYTE)
@ -1294,26 +1294,19 @@ internal class AugmentableAssignmentAsmGen(private val program: Program,
asmgen.out(" inx") asmgen.out(" inx")
} }
"<<" -> { "<<" -> {
if(asmgen.options.slowCodegenWarnings) asmgen.assignExpressionToRegister(value, RegisterOrPair.Y)
println("warning: slow stack evaluation used (4): $name $operator= ${value::class.simpleName} at ${value.position}") // TODO
asmgen.translateExpression(value) // TODO directly into Y
asmgen.out(""" asmgen.out("""
ldy P8ESTACK_LO+1,x
beq + beq +
- asl $name - asl $name
rol $name+1 rol $name+1
dey dey
bne - bne -
+""") +""")
asmgen.out(" inx")
} }
">>" -> { ">>" -> {
if(asmgen.options.slowCodegenWarnings) asmgen.assignExpressionToRegister(value, RegisterOrPair.Y)
println("warning: slow stack evaluation used (4): $name $operator= ${value::class.simpleName} at ${value.position}") // TODO
asmgen.translateExpression(value) // TODO directly into Y
if(dt==DataType.UWORD) if(dt==DataType.UWORD)
asmgen.out(""" asmgen.out("""
ldy P8ESTACK_LO+1,x
beq + beq +
- lsr $name+1 - lsr $name+1
ror $name ror $name
@ -1322,7 +1315,6 @@ internal class AugmentableAssignmentAsmGen(private val program: Program,
+""") +""")
else else
asmgen.out(""" asmgen.out("""
ldy P8ESTACK_LO+1,x
beq + beq +
- lda $name+1 - lda $name+1
asl a asl a
@ -1331,30 +1323,20 @@ internal class AugmentableAssignmentAsmGen(private val program: Program,
dey dey
bne - bne -
+""") +""")
asmgen.out(" inx")
} }
"&" -> { "&" -> {
if(asmgen.options.slowCodegenWarnings) asmgen.assignExpressionToRegister(value, RegisterOrPair.A)
println("warning: slow stack evaluation used (4): $name $operator= ${value::class.simpleName} at ${value.position}") // TODO asmgen.out(" and $name | sta $name")
asmgen.translateExpression(value) // TODO directly into A
asmgen.out(" lda P8ESTACK_LO+1,x | and $name | sta $name")
if(dt in WordDatatypes) if(dt in WordDatatypes)
asmgen.out(" lda #0 | sta $name+1") asmgen.out(" lda #0 | sta $name+1")
asmgen.out(" inx")
} }
"^" -> { "^" -> {
if(asmgen.options.slowCodegenWarnings) asmgen.assignExpressionToRegister(value, RegisterOrPair.A)
println("warning: slow stack evaluation used (4): $name $operator= ${value::class.simpleName} at ${value.position}") // TODO asmgen.out(" eor $name | sta $name")
asmgen.translateExpression(value) // TODO directly into A
asmgen.out(" lda P8ESTACK_LO+1,x | eor $name | sta $name")
asmgen.out(" inx")
} }
"|" -> { "|" -> {
if(asmgen.options.slowCodegenWarnings) asmgen.assignExpressionToRegister(value, RegisterOrPair.A)
println("warning: slow stack evaluation used (4): $name $operator= ${value::class.simpleName} at ${value.position}") // TODO asmgen.out(" ora $name | sta $name")
asmgen.translateExpression(value) // TODO directly into A
asmgen.out(" lda P8ESTACK_LO+1,x | ora $name | sta $name")
asmgen.out(" inx")
} }
else -> throw AssemblyError("invalid operator for in-place modification $operator") else -> throw AssemblyError("invalid operator for in-place modification $operator")
} }

View File

@ -6,14 +6,19 @@ main {
sub start() { sub start() {
ubyte ub = 1 uword uw = %1111111110000001
ubyte ub2 = %11000011 uword uw2 = %000111100001110
ubyte ub = %00001110
@($c001) = %1 uw &= ub + 1
txt.print_uwbin(uw, 0)
txt.chrout('\n')
uw |= ub+1
txt.print_uwbin(uw, 0)
txt.chrout('\n')
@($c000+ub) += @($c000+ub) uw ^= ub+1
ub2 = @($c000+ub) txt.print_uwbin(uw, 0)
txt.print_ubbin(ub2, 1)
txt.chrout('\n') txt.chrout('\n')
testX() testX()