diff --git a/codeGeneration/src/prog8/codegen/target/cpu6502/codegen/assignment/AugmentableAssignmentAsmGen.kt b/codeGeneration/src/prog8/codegen/target/cpu6502/codegen/assignment/AugmentableAssignmentAsmGen.kt index 5a3e8c7a6..69f559f79 100644 --- a/codeGeneration/src/prog8/codegen/target/cpu6502/codegen/assignment/AugmentableAssignmentAsmGen.kt +++ b/codeGeneration/src/prog8/codegen/target/cpu6502/codegen/assignment/AugmentableAssignmentAsmGen.kt @@ -744,18 +744,18 @@ internal class AugmentableAssignmentAsmGen(private val program: Program, "^", "xor" -> asmgen.out(" lda $name | eor #$value | sta $name") "==" -> { asmgen.out(""" - lda #$value - cmp $name + lda $name + cmp #$value beq + lda #0 - bne ++ + beq ++ + lda #1 + sta $name""") } "!=" -> { asmgen.out(""" - lda #$value - cmp $name + lda $name + cmp #$value beq + lda #1 bne ++ diff --git a/codeOptimizers/src/prog8/optimizer/BinExprSplitter.kt b/codeOptimizers/src/prog8/optimizer/BinExprSplitter.kt index 4d34be1b6..f4e15e2d8 100644 --- a/codeOptimizers/src/prog8/optimizer/BinExprSplitter.kt +++ b/codeOptimizers/src/prog8/optimizer/BinExprSplitter.kt @@ -46,7 +46,7 @@ X = BinExpr X = LeftExpr */ - if(binExpr.operator in AugmentAssignmentOperators + listOf("==", "!=") && isSimpleTarget(assignment.target)) { + if(binExpr.operator in AugmentAssignmentOperators && isSimpleTarget(assignment.target)) { if(assignment.target isSameAs binExpr.right) return noModifications if(assignment.target isSameAs binExpr.left) { @@ -74,15 +74,6 @@ X = BinExpr X = LeftExpr // ) } - if(binExpr.operator == "==" || binExpr.operator == "!=") { - // don't split if the operand(s) don't fit the type of the resulting variable - val targetDt = assignment.target.inferType(program) - val leftDt = binExpr.left.inferType(program) - val rightDt = binExpr.right.inferType(program) - if(leftDt isNotAssignableTo targetDt || rightDt isNotAssignableTo targetDt) - return noModifications - } - if(binExpr.right.isSimple) { val firstAssign = Assignment(assignment.target.copy(), binExpr.left, AssignmentOrigin.OPTIMIZER, binExpr.left.position) val targetExpr = assignment.target.toExpression() diff --git a/compiler/src/prog8/compiler/astprocessing/TypecastsAdder.kt b/compiler/src/prog8/compiler/astprocessing/TypecastsAdder.kt index 618b0ff53..0fb0ed859 100644 --- a/compiler/src/prog8/compiler/astprocessing/TypecastsAdder.kt +++ b/compiler/src/prog8/compiler/astprocessing/TypecastsAdder.kt @@ -89,7 +89,7 @@ class TypecastsAdder(val program: Program, val options: CompilationOptions, val // determine common datatype and add typecast as required to make left and right equal types - val (commonDt, toFix) = BinaryExpression.commonDatatype(leftDt.getOr(DataType.UNDEFINED), rightDt.getOr(DataType.UNDEFINED), expr.left, expr.operator, expr.right) + val (commonDt, toFix) = BinaryExpression.commonDatatype(leftDt.getOr(DataType.UNDEFINED), rightDt.getOr(DataType.UNDEFINED), expr.left, expr.right) if(toFix!=null) { val modifications = mutableListOf() when { diff --git a/compilerAst/src/prog8/ast/expressions/AstExpressions.kt b/compilerAst/src/prog8/ast/expressions/AstExpressions.kt index c3d46e191..4fa7eb58a 100644 --- a/compilerAst/src/prog8/ast/expressions/AstExpressions.kt +++ b/compilerAst/src/prog8/ast/expressions/AstExpressions.kt @@ -204,7 +204,7 @@ class BinaryExpression(var left: Expression, var operator: String, var right: Ex commonDatatype( leftDt.getOr(DataType.BYTE), rightDt.getOr(DataType.BYTE), - null, "", null + null, null ).first ) } catch (x: FatalAstException) { @@ -227,7 +227,7 @@ class BinaryExpression(var left: Expression, var operator: String, var right: Ex companion object { fun commonDatatype(leftDt: DataType, rightDt: DataType, - left: Expression?, operator: String, right: Expression?): Pair { + left: Expression?, right: Expression?): Pair { // byte + byte -> byte // byte + word -> word // word + byte -> word diff --git a/examples/test.p8 b/examples/test.p8 index 45af49ab3..b5fa41f73 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -7,17 +7,33 @@ main { %option force_output sub start() { - - ubyte foobar = 2 - str @shared @zp name = "irmen" - ubyte[] @shared @zp array = [1,2,3,4] - - txt.print_uwhex(&name, true) + uword b1 + b1 = 'a' + b1 = b1=='z' ; TODO fix code generation! + txt.print("should print 0: ") + txt.print_ub(b1) txt.nl() - txt.print_uwhex(&name, true) - txt.print_ub(foobar) + b1 = 'a' + b1 = b1!='z' ; TODO fix code generation! + txt.print("should print 1: ") + txt.print_ub(b1) txt.nl() +; str text = "???????????" +; void txt.input_chars(text) +; txt.print("\ninput=") +; txt.print(text) +; txt.nl() +; b1 = text[0]=='z' +; txt.print_ub(b1) +; txt.nl() +; +; if text[0]=='z' { +; txt.print("z!\n") +; } +; +; test(text[0]=='z') + ; float fl ; test_stack.test() ; @@ -53,6 +69,12 @@ main { ; test_stack.test() } + sub test(ubyte what) { + txt.print("test: what=") + txt.print_ub(what) + txt.nl() + } + sub func() -> ubyte { txt.print("func!\n") return 99