fixed bit shifting by 0. optimized bitshifting code.

This commit is contained in:
Irmen de Jong 2020-10-18 17:12:52 +02:00
parent 8eb69d6eda
commit e83796b5b9
3 changed files with 155 additions and 22 deletions

View File

@ -2145,3 +2145,34 @@ func_strcmp .proc
sta P8ESTACK_LO+1,x sta P8ESTACK_LO+1,x
rts rts
.pend .pend
; support for bit shifting that is too large to be unrolled:
lsr_byte_A .proc
; -- lsr signed byte in A times the value in Y (assume >0)
cmp #0
bmi _negative
- lsr a
dey
bne -
rts
_negative lsr a
ora #$80
dey
bne _negative
rts
.pend
lsr_word_AY .proc
.error "make"
.pend
lsr_uword_AY .proc
.error "make"
.pend
asl_word_AY .proc
.error "make"
.pend

View File

@ -1,6 +1,5 @@
package prog8.compiler.target.c64.codegen.assignment package prog8.compiler.target.c64.codegen.assignment
import prog8.ast.INameScope
import prog8.ast.Program import prog8.ast.Program
import prog8.ast.base.* import prog8.ast.base.*
import prog8.ast.expressions.* import prog8.ast.expressions.*
@ -497,25 +496,31 @@ internal class AugmentableAssignmentAsmGen(private val program: Program,
"<<" -> { "<<" -> {
asmgen.out(""" asmgen.out("""
ldy $otherName ldy $otherName
beq +
- asl $name - asl $name
dey dey
bne -""") bne -
+""")
} }
">>" -> { ">>" -> {
if(dt==DataType.UBYTE) { if(dt==DataType.UBYTE) {
asmgen.out(""" asmgen.out("""
ldy $otherName ldy $otherName
beq +
- lsr $name - lsr $name
dey dey
bne -""") bne -
+""")
} else { } else {
asmgen.out(""" asmgen.out("""
ldy $otherName ldy $otherName
beq +
- lda $name - lda $name
asl a asl a
ror $name ror $name
dey dey
bne -""") bne -
+""")
} }
} }
"&" -> asmgen.out(" lda $name | and $otherName | sta $name") "&" -> asmgen.out(" lda $name | and $otherName | sta $name")
@ -577,7 +582,14 @@ internal class AugmentableAssignmentAsmGen(private val program: Program,
if (dt == DataType.UBYTE) { if (dt == DataType.UBYTE) {
repeat(value) { asmgen.out(" lsr $name") } repeat(value) { asmgen.out(" lsr $name") }
} else { } else {
repeat(value) { asmgen.out(" lda $name | asl a | ror $name") } if(value>3)
asmgen.out("""
lda $name
ldy #$value
jsr prog8_lib.lsr_byte_A
sta $name""") // TODO make prog8_lib.lsr_byte_A
else
repeat(value) { asmgen.out(" lda $name | asl a | ror $name") }
} }
} }
} }
@ -786,14 +798,38 @@ internal class AugmentableAssignmentAsmGen(private val program: Program,
""") """)
} }
"<<" -> { "<<" -> {
repeat(value) { asmgen.out(" asl $name | rol $name+1") } if(value>4)
asmgen.out("""
lda #$value
sta P8ZP_SCRATCH_B1
lda #<$name
ldy #>$name
jsr prog8_lib.asl_word_AY""") // TODO make prog8_lib.asl_word_AY
else
repeat(value) { asmgen.out(" asl $name | rol $name+1") }
} }
">>" -> { ">>" -> {
if (value > 0) { if (value > 0) {
if(dt==DataType.UWORD) { if(dt==DataType.UWORD) {
repeat(value) { asmgen.out(" lsr $name+1 | ror $name")} if(value>4)
asmgen.out("""
lda #$value
sta P8ZP_SCRATCH_B1
lda #<$name
ldy #>$name
jsr prog8_lib.lsr_uword_AY""") // TODO make prog8_lib.lsr_uword_AY
else
repeat(value) { asmgen.out(" lsr $name+1 | ror $name")}
} else { } else {
repeat(value) { asmgen.out(" lda $name+1 | asl a | ror $name+1 | ror $name") } if(value>2)
asmgen.out("""
lda #$value
sta P8ZP_SCRATCH_B1
lda #<$name
ldy #>$name
jsr prog8_lib.lsr_word_AY""") // TODO make prog8_lib.lsr_word_AY
else
repeat(value) { asmgen.out(" lda $name+1 | asl a | ror $name+1 | ror $name") }
} }
} }
} }
@ -917,28 +953,34 @@ internal class AugmentableAssignmentAsmGen(private val program: Program,
"<<" -> { "<<" -> {
asmgen.out(""" asmgen.out("""
ldy $otherName ldy $otherName
beq +
- asl $name - asl $name
rol $name+1 rol $name+1
dey dey
bne -""") bne -
+""")
} }
">>" -> { ">>" -> {
if(dt==DataType.UWORD) { if(dt==DataType.UWORD) {
asmgen.out(""" asmgen.out("""
ldy $otherName ldy $otherName
beq +
- lsr $name+1 - lsr $name+1
ror $name ror $name
dey dey
bne -""") bne -
+""")
} else { } else {
asmgen.out(""" asmgen.out("""
ldy $otherName ldy $otherName
beq +
- lda $name+1 - lda $name+1
asl a asl a
ror $name+1 ror $name+1
ror $name ror $name
dey dey
bne -""") bne -
+""")
} }
} }
"&" -> { "&" -> {

View File

@ -7,21 +7,81 @@ main {
sub start() { sub start() {
uword zc word zz
uword uu
ubyte ub
byte bb
zc = 99 bb = -111
scolor2=scolor bb >>= 0
txt.print_ubbin(bb as ubyte, true)
txt.chrout('\n')
bb = -111
bb >>= 1
txt.print_ubbin(bb as ubyte, true)
txt.chrout('\n')
bb = -111
bb >>= 2
txt.print_ubbin(bb as ubyte, true)
txt.chrout('\n')
bb = -111
bb >>= 3
txt.print_ubbin(bb as ubyte, true)
txt.chrout('\n')
bb = -111
bb >>= 4
txt.print_ubbin(bb as ubyte, true)
txt.chrout('\n')
bb = -111
bb >>= 5
txt.print_ubbin(bb as ubyte, true)
txt.chrout('\n')
bb = -111
bb >>= 6
txt.print_ubbin(bb as ubyte, true)
txt.chrout('\n')
bb = -111
bb >>= 7
txt.print_ubbin(bb as ubyte, true)
txt.chrout('\n')
bb = -111
bb >>= 8
txt.print_ubbin(bb as ubyte, true)
txt.chrout('\n')
bb = -111
bb >>= 9
txt.print_ubbin(bb as ubyte, true)
txt.chrout('\n')
; TODO WHy does this compile with stack eval: ; for ub in 0 to 8 {
ubyte scolor = (zc>>13) as ubyte + 4 ; bb = 111
; bb >>= ub
; txt.print_ubbin(bb as ubyte, true)
; txt.chrout('\n')
; }
; txt.chrout('\n')
;
; for ub in 0 to 8 {
; bb = -111
; bb >>= ub
; txt.print_ubbin(bb as ubyte, true)
; txt.chrout('\n')
; }
; txt.chrout('\n')
; TODO this is more optimized: ; ub >>= 7
ubyte scolor2 ; ub <<= 7
scolor2 = (zc>>13) as ubyte + 4 ;
; uu >>=7
; uu <<= 7
;
; zz >>=7
; zz <<=7
;
; bb >>=7
; bb <<=7
scolor2=scolor ; testX()
testX()
} }
asmsub testX() { asmsub testX() {