mirror of
https://github.com/irmen/prog8.git
synced 2024-05-31 15:41:34 +00:00
fix bool to uword cast in 6502 codegen
This commit is contained in:
parent
53df0eb707
commit
5d7ddebcad
|
@ -1804,8 +1804,8 @@ internal class AssignmentAsmGen(private val program: PtProgram,
|
||||||
|
|
||||||
when (valueDt) {
|
when (valueDt) {
|
||||||
DataType.BOOL -> {
|
DataType.BOOL -> {
|
||||||
if(targetDt in ByteDatatypes) {
|
if(targetDt in IntegerDatatypes) {
|
||||||
// optimization to assign boolean expression to byte target (just assign the 0 or 1 directly, no cast needed)
|
// optimization to assign boolean expression to integer target (just assign the 0 or 1 directly)
|
||||||
val assignDirect = AsmAssignment(
|
val assignDirect = AsmAssignment(
|
||||||
AsmAssignSource.fromAstSource(value, program, asmgen),
|
AsmAssignSource.fromAstSource(value, program, asmgen),
|
||||||
target,
|
target,
|
||||||
|
@ -1814,7 +1814,7 @@ internal class AssignmentAsmGen(private val program: PtProgram,
|
||||||
)
|
)
|
||||||
assignExpression(assignDirect, target.scope)
|
assignExpression(assignDirect, target.scope)
|
||||||
} else {
|
} else {
|
||||||
throw AssemblyError("expected bool or byte target type")
|
TODO("assign bool to non-integer type $targetDt")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
in ByteDatatypes -> {
|
in ByteDatatypes -> {
|
||||||
|
|
|
@ -11,7 +11,6 @@ import prog8.ast.expressions.*
|
||||||
import prog8.ast.printProgram
|
import prog8.ast.printProgram
|
||||||
import prog8.ast.statements.Assignment
|
import prog8.ast.statements.Assignment
|
||||||
import prog8.ast.statements.IfElse
|
import prog8.ast.statements.IfElse
|
||||||
import prog8.ast.statements.VarDecl
|
|
||||||
import prog8.code.ast.PtAsmSub
|
import prog8.code.ast.PtAsmSub
|
||||||
import prog8.code.ast.PtSub
|
import prog8.code.ast.PtSub
|
||||||
import prog8.code.core.DataType
|
import prog8.code.core.DataType
|
||||||
|
@ -826,4 +825,18 @@ main {
|
||||||
}"""
|
}"""
|
||||||
compileText(C64Target(), true, src, writeAssembly = true) shouldNotBe null
|
compileText(C64Target(), true, src, writeAssembly = true) shouldNotBe null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test("bool to word cast") {
|
||||||
|
val src="""
|
||||||
|
main {
|
||||||
|
sub start() {
|
||||||
|
bool @shared flag, flag2
|
||||||
|
cx16.r0L = (flag and flag2) as ubyte
|
||||||
|
cx16.r0 = (flag and flag2) as uword
|
||||||
|
}
|
||||||
|
}"""
|
||||||
|
|
||||||
|
compileText(VMTarget(), false, src, writeAssembly = true) shouldNotBe null
|
||||||
|
compileText(C64Target(), false, src, writeAssembly = true) shouldNotBe null
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -590,5 +590,27 @@ main {
|
||||||
val valT = (st[17] as Assignment).value
|
val valT = (st[17] as Assignment).value
|
||||||
(valT as IdentifierReference).nameInSource shouldBe listOf("r")
|
(valT as IdentifierReference).nameInSource shouldBe listOf("r")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test("various multi var decl symbol lookups") {
|
||||||
|
val src="""
|
||||||
|
main {
|
||||||
|
sub start() {
|
||||||
|
uword @shared a,b
|
||||||
|
b = a ; works
|
||||||
|
cx16.r1L = lsb(a) ; works
|
||||||
|
funcw(a) ; works
|
||||||
|
funcb(lsb(a)) ; fails :-( TODO FIX
|
||||||
|
}
|
||||||
|
|
||||||
|
sub funcw(uword arg) {
|
||||||
|
arg++
|
||||||
|
}
|
||||||
|
|
||||||
|
sub funcb(ubyte arg) {
|
||||||
|
arg++
|
||||||
|
}
|
||||||
|
}"""
|
||||||
|
compileText(Cx16Target(), false, src) shouldNotBe null
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
TODO
|
TODO
|
||||||
====
|
====
|
||||||
|
|
||||||
|
fix the symbol lookup error lsb(a) when a is in a multi vardecl.
|
||||||
|
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,49 +1,20 @@
|
||||||
%import textio
|
|
||||||
%zeropage basicsafe
|
%zeropage basicsafe
|
||||||
%option no_sysinit
|
%import textio
|
||||||
|
|
||||||
main {
|
main {
|
||||||
ubyte[255] array1
|
|
||||||
ubyte[255] array2
|
|
||||||
uword block1 = memory("b1", 6000 ,0)
|
|
||||||
uword block2 = memory("b2", 6000 ,0)
|
|
||||||
|
|
||||||
sub start() {
|
sub start() {
|
||||||
cbm.SETTIM(0,0,0)
|
uword @shared a,b
|
||||||
|
b = a ; works
|
||||||
|
cx16.r1L = lsb(a) ; works
|
||||||
|
funcw(a) ; works
|
||||||
|
funcb(lsb(a)) ; fails :-(
|
||||||
|
}
|
||||||
|
|
||||||
repeat 2000 {
|
sub funcw(uword arg) {
|
||||||
sys.memcopy(array1, array2, sizeof(array1))
|
arg++
|
||||||
}
|
}
|
||||||
|
|
||||||
txt.print_uw(cbm.RDTIM16())
|
sub funcb(ubyte arg) {
|
||||||
txt.nl()
|
arg++
|
||||||
|
|
||||||
cbm.SETTIM(0,0,0)
|
|
||||||
|
|
||||||
repeat 2000 {
|
|
||||||
cx16.memory_copy(array1, array2, sizeof(array1))
|
|
||||||
}
|
|
||||||
|
|
||||||
txt.print_uw(cbm.RDTIM16())
|
|
||||||
txt.nl()
|
|
||||||
|
|
||||||
cbm.SETTIM(0,0,0)
|
|
||||||
|
|
||||||
repeat 100 {
|
|
||||||
sys.memcopy(block1, block2, 6000)
|
|
||||||
}
|
|
||||||
|
|
||||||
txt.print_uw(cbm.RDTIM16())
|
|
||||||
txt.nl()
|
|
||||||
|
|
||||||
cbm.SETTIM(0,0,0)
|
|
||||||
|
|
||||||
repeat 100 {
|
|
||||||
cx16.memory_copy(block1, block2, 6000)
|
|
||||||
}
|
|
||||||
|
|
||||||
txt.print_uw(cbm.RDTIM16())
|
|
||||||
txt.nl()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user