mirror of
https://github.com/irmen/prog8.git
synced 2025-01-13 10:29:52 +00:00
fixed bit shifting by 0. optimized bitshifting code.
This commit is contained in:
parent
8eb69d6eda
commit
e83796b5b9
@ -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
|
||||||
|
@ -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 -
|
||||||
|
+""")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"&" -> {
|
"&" -> {
|
||||||
|
@ -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() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user