mirror of
https://github.com/irmen/prog8.git
synced 2024-05-29 01:41:32 +00:00
ifelse more
This commit is contained in:
parent
577333f2c4
commit
c77cd0da39
|
@ -235,7 +235,7 @@ class AsmGen6502Internal (
|
|||
private val anyExprGen = AnyExprAsmGen(this)
|
||||
private val assignmentAsmGen = AssignmentAsmGen(program, this, anyExprGen, allocator)
|
||||
private val builtinFunctionsAsmGen = BuiltinFunctionsAsmGen(program, this, assignmentAsmGen)
|
||||
private val ifElseAsmgen = IfElseAsmGen(program, this, assignmentAsmGen)
|
||||
private val ifElseAsmgen = IfElseAsmGen(program, this, allocator, assignmentAsmGen)
|
||||
|
||||
fun compileToAssembly(): IAssemblyProgram? {
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@ import prog8.codegen.cpu6502.assignment.AssignmentAsmGen
|
|||
|
||||
internal class IfElseAsmGen(private val program: PtProgram,
|
||||
private val asmgen: AsmGen6502Internal,
|
||||
private val allocator: VariableAllocator,
|
||||
private val assignmentAsmGen: AssignmentAsmGen) {
|
||||
|
||||
fun translate(stmt: PtIfElse) {
|
||||
|
@ -141,24 +142,54 @@ internal class IfElseAsmGen(private val program: PtProgram,
|
|||
translateIfElseBodies("beq", stmt)
|
||||
}
|
||||
"<" -> {
|
||||
// TODO()
|
||||
println("byte if <")
|
||||
fallbackTranslate(stmt)
|
||||
asmgen.assignExpressionToRegister(condition.left, RegisterOrPair.A, signed)
|
||||
cmpAwithByteValue(condition.right)
|
||||
return if(signed) {
|
||||
if(jumpAfterIf!=null)
|
||||
translateJumpElseBodies("bmi", "bpl", jumpAfterIf, stmt.elseScope)
|
||||
else
|
||||
translateIfElseBodies("bpl", stmt)
|
||||
} else {
|
||||
if(jumpAfterIf!=null)
|
||||
translateJumpElseBodies("bcc", "bcs", jumpAfterIf, stmt.elseScope)
|
||||
else
|
||||
translateIfElseBodies("bcs", stmt)
|
||||
}
|
||||
}
|
||||
"<=" -> {
|
||||
// TODO()
|
||||
println("byte if <=")
|
||||
fallbackTranslate(stmt)
|
||||
fallbackTranslate(stmt, true)
|
||||
// asmgen.assignExpressionToRegister(condition.left, RegisterOrPair.A, signed)
|
||||
// cmpAwithByteValue(condition.right)
|
||||
// if(signed) {
|
||||
// TODO("byte if <=")
|
||||
// } else {
|
||||
// TODO("ubyte if <=")
|
||||
// }
|
||||
}
|
||||
">" -> {
|
||||
// TODO()
|
||||
println("byte if >")
|
||||
fallbackTranslate(stmt)
|
||||
fallbackTranslate(stmt, true)
|
||||
// asmgen.assignExpressionToRegister(condition.left, RegisterOrPair.A, signed)
|
||||
// cmpAwithByteValue(condition.right)
|
||||
// return if(signed) {
|
||||
// TODO("byte if >")
|
||||
// } else {
|
||||
// TODO("ubyte if >")
|
||||
// }
|
||||
}
|
||||
">=" -> {
|
||||
// TODO()
|
||||
println("byte if >=")
|
||||
fallbackTranslate(stmt)
|
||||
asmgen.assignExpressionToRegister(condition.left, RegisterOrPair.A, signed)
|
||||
cmpAwithByteValue(condition.right)
|
||||
return if(signed) {
|
||||
if(jumpAfterIf!=null)
|
||||
translateJumpElseBodies("bpl", "bmi", jumpAfterIf, stmt.elseScope)
|
||||
else
|
||||
translateIfElseBodies("bmi", stmt)
|
||||
} else {
|
||||
if(jumpAfterIf!=null)
|
||||
translateJumpElseBodies("bcs", "bcc", jumpAfterIf, stmt.elseScope)
|
||||
else
|
||||
translateIfElseBodies("bcc", stmt)
|
||||
}
|
||||
}
|
||||
else -> fallbackTranslate(stmt, false)
|
||||
}
|
||||
|
@ -293,36 +324,133 @@ internal class IfElseAsmGen(private val program: PtProgram,
|
|||
|
||||
when(condition.operator) {
|
||||
"==" -> {
|
||||
// TODO
|
||||
println("float if ==")
|
||||
fallbackTranslate(stmt)
|
||||
translateFloatsEqualsConditionIntoA(condition.left, condition.right)
|
||||
return if (jumpAfterIf != null)
|
||||
translateJumpElseBodies("bne", "beq", jumpAfterIf, stmt.elseScope)
|
||||
else
|
||||
translateIfElseBodies("beq", stmt)
|
||||
}
|
||||
"!=" -> {
|
||||
// TODO
|
||||
println("float if !=")
|
||||
fallbackTranslate(stmt)
|
||||
translateFloatsEqualsConditionIntoA(condition.left, condition.right)
|
||||
return if (jumpAfterIf != null)
|
||||
translateJumpElseBodies("beq", "bne", jumpAfterIf, stmt.elseScope)
|
||||
else
|
||||
translateIfElseBodies("bne", stmt)
|
||||
}
|
||||
"<" -> {
|
||||
// TODO()
|
||||
println("float if <")
|
||||
fallbackTranslate(stmt)
|
||||
translateFloatsLessConditionIntoA(condition.left, condition.right, false)
|
||||
return if (jumpAfterIf != null)
|
||||
translateJumpElseBodies("bne", "beq", jumpAfterIf, stmt.elseScope)
|
||||
else
|
||||
translateIfElseBodies("beq", stmt)
|
||||
}
|
||||
"<=" -> {
|
||||
// TODO()
|
||||
println("float if <=")
|
||||
fallbackTranslate(stmt)
|
||||
translateFloatsLessConditionIntoA(condition.left, condition.right, true)
|
||||
return if (jumpAfterIf != null)
|
||||
translateJumpElseBodies("bne", "beq", jumpAfterIf, stmt.elseScope)
|
||||
else
|
||||
translateIfElseBodies("beq", stmt)
|
||||
}
|
||||
">" -> {
|
||||
// TODO()
|
||||
println("float if >")
|
||||
fallbackTranslate(stmt)
|
||||
translateFloatsLessConditionIntoA(condition.left, condition.right, true)
|
||||
return if (jumpAfterIf != null)
|
||||
translateJumpElseBodies("beq", "bne", jumpAfterIf, stmt.elseScope)
|
||||
else
|
||||
translateIfElseBodies("bne", stmt)
|
||||
}
|
||||
">=" -> {
|
||||
// TODO()
|
||||
println("float if >=")
|
||||
fallbackTranslate(stmt)
|
||||
translateFloatsLessConditionIntoA(condition.left, condition.right, false)
|
||||
return if (jumpAfterIf != null)
|
||||
translateJumpElseBodies("beq", "bne", jumpAfterIf, stmt.elseScope)
|
||||
else
|
||||
translateIfElseBodies("bne", stmt)
|
||||
}
|
||||
else -> fallbackTranslate(stmt, false)
|
||||
}
|
||||
}
|
||||
|
||||
private fun translateFloatsEqualsConditionIntoA(left: PtExpression, right: PtExpression) {
|
||||
fun equalf(leftName: String, rightName: String) {
|
||||
asmgen.out("""
|
||||
lda #<$leftName
|
||||
ldy #>$leftName
|
||||
sta P8ZP_SCRATCH_W1
|
||||
sty P8ZP_SCRATCH_W1+1
|
||||
lda #<$rightName
|
||||
ldy #>$rightName
|
||||
jsr floats.vars_equal_f""")
|
||||
}
|
||||
fun equalf(expr: PtExpression, rightName: String) {
|
||||
asmgen.assignExpressionToRegister(expr, RegisterOrPair.FAC1, true)
|
||||
asmgen.out("""
|
||||
lda #<$rightName
|
||||
ldy #>$rightName
|
||||
jsr floats.var_fac1_equal_f""")
|
||||
}
|
||||
if(left is PtIdentifier) {
|
||||
when (right) {
|
||||
is PtIdentifier -> equalf(asmgen.asmVariableName(left), asmgen.asmVariableName(right))
|
||||
is PtNumber -> equalf(asmgen.asmVariableName(left), allocator.getFloatAsmConst(right.number))
|
||||
else -> {
|
||||
asmgen.assignExpressionToVariable(right, subroutineFloatEvalResultVar1, DataType.FLOAT)
|
||||
equalf(asmgen.asmVariableName(left), subroutineFloatEvalResultVar1)
|
||||
asmgen.subroutineExtra(left.definingISub()!!).usedFloatEvalResultVar1 = true
|
||||
}
|
||||
}
|
||||
} else {
|
||||
when (right) {
|
||||
is PtIdentifier -> equalf(left, asmgen.asmVariableName(right))
|
||||
is PtNumber -> equalf(left, allocator.getFloatAsmConst(right.number))
|
||||
else -> {
|
||||
asmgen.assignExpressionToVariable(right, subroutineFloatEvalResultVar1, DataType.FLOAT)
|
||||
equalf(left, subroutineFloatEvalResultVar1)
|
||||
asmgen.subroutineExtra(left.definingISub()!!).usedFloatEvalResultVar1 = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun translateFloatsLessConditionIntoA(left: PtExpression, right: PtExpression, lessOrEquals: Boolean) {
|
||||
fun lessf(leftName: String, rightName: String) {
|
||||
asmgen.out("""
|
||||
lda #<$rightName
|
||||
ldy #>$rightName
|
||||
sta P8ZP_SCRATCH_W2
|
||||
sty P8ZP_SCRATCH_W2+1
|
||||
lda #<$leftName
|
||||
ldy #>$leftName""")
|
||||
if(lessOrEquals)
|
||||
asmgen.out("jsr floats.vars_lesseq_f")
|
||||
else
|
||||
asmgen.out("jsr floats.vars_less_f")
|
||||
}
|
||||
fun lessf(expr: PtExpression, rightName: String) {
|
||||
asmgen.assignExpressionToRegister(expr, RegisterOrPair.FAC1, true)
|
||||
asmgen.out(" lda #<$rightName | ldy #>$rightName")
|
||||
if(lessOrEquals)
|
||||
asmgen.out(" jsr floats.var_fac1_lesseq_f")
|
||||
else
|
||||
asmgen.out(" jsr floats.var_fac1_less_f")
|
||||
}
|
||||
if(left is PtIdentifier) {
|
||||
when (right) {
|
||||
is PtIdentifier -> lessf(asmgen.asmVariableName(left), asmgen.asmVariableName(right))
|
||||
is PtNumber -> lessf(asmgen.asmVariableName(left), allocator.getFloatAsmConst(right.number))
|
||||
else -> {
|
||||
asmgen.assignExpressionToVariable(right, subroutineFloatEvalResultVar1, DataType.FLOAT)
|
||||
lessf(asmgen.asmVariableName(left), subroutineFloatEvalResultVar1)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
when (right) {
|
||||
is PtIdentifier -> lessf(left, asmgen.asmVariableName(right))
|
||||
is PtNumber -> lessf(left, allocator.getFloatAsmConst(right.number))
|
||||
else -> {
|
||||
asmgen.assignExpressionToVariable(right, subroutineFloatEvalResultVar1, DataType.FLOAT)
|
||||
lessf(left, subroutineFloatEvalResultVar1)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -221,7 +221,7 @@ var_fac1_greatereq_f .proc
|
|||
.pend
|
||||
|
||||
var_fac1_equal_f .proc
|
||||
; -- are the floats numbers in FAC1 and the variable AY *not* identical? Result in A. Clobbers X.
|
||||
; -- are the floats numbers in FAC1 and the variable AY identical? Result in A. Clobbers X.
|
||||
jsr FCOMP
|
||||
and #1
|
||||
eor #1
|
||||
|
|
|
@ -30,10 +30,10 @@ ok . efficient code for if float comparisons against 0 (== and !=)
|
|||
ok . efficient code for if byte comparisons against a value
|
||||
ok . efficient code for if word comparisons against a value
|
||||
ok . efficient code for if float comparisons against a value
|
||||
ok . efficient code for assignment byte comparisons against 0 (== and !=)
|
||||
ok ok efficient code for assignment byte comparisons against 0 (== and !=)
|
||||
ok . efficient code for assignment word comparisons against 0 (== and !=)
|
||||
ok . efficient code for assignment float comparisons against 0 (== and !=)
|
||||
ok . efficient code for assignment byte comparisons against a value
|
||||
ok FAIL efficient code for assignment byte comparisons against a value ("float if ==" and "float if !=")
|
||||
ok . efficient code for assignment word comparisons against a value
|
||||
ok . efficient code for assignment float comparisons against a value
|
||||
ok ok efficient code for if_cc conditional expressions
|
||||
|
|
|
@ -8,15 +8,6 @@ main {
|
|||
bool @shared staticbool2
|
||||
|
||||
sub start() {
|
||||
cx16.mouse_config2(1) ; enable mouse cursor (sprite 0)
|
||||
while cx16.mouse_pos()==0 {
|
||||
cx16.r0L++
|
||||
}
|
||||
while cx16.mouse_pos()!=0 {
|
||||
cx16.r0L++
|
||||
}
|
||||
|
||||
|
||||
; boolean_const_and_var(true)
|
||||
; staticbool1 = boolean_arrays_and_return()
|
||||
; txt.print_ub(staticbool1 as ubyte)
|
||||
|
@ -36,7 +27,7 @@ main {
|
|||
; efficient_compare_99()
|
||||
; efficient_compare_var()
|
||||
; efficient_assign_cmp_0()
|
||||
; efficient_assign_cmp_99()
|
||||
efficient_assign_cmp_99()
|
||||
; efficient_assign_cmp_var()
|
||||
; if_gotos()
|
||||
; if_code()
|
||||
|
|
Loading…
Reference in New Issue
Block a user