diff --git a/codeGenIntermediate/src/prog8/codegen/intermediate/BuiltinFuncGen.kt b/codeGenIntermediate/src/prog8/codegen/intermediate/BuiltinFuncGen.kt index fce03a3f4..cf8294ba1 100644 --- a/codeGenIntermediate/src/prog8/codegen/intermediate/BuiltinFuncGen.kt +++ b/codeGenIntermediate/src/prog8/codegen/intermediate/BuiltinFuncGen.kt @@ -348,15 +348,19 @@ internal class BuiltinFuncGen(private val codeGen: IRCodeGen, private val exprGe } private fun funcMkword(call: PtBuiltinFunctionCall): ExpressionCodeResult { - // TODO use ext instruction if msb is 0 val result = mutableListOf() - val msbTr = exprGen.translateExpression(call.args[0]) - addToResult(result, msbTr, msbTr.resultReg, -1) - val lsbTr = exprGen.translateExpression(call.args[1]) - addToResult(result, lsbTr, lsbTr.resultReg, -1) val resultReg = codeGen.registers.nextFree() - result += IRCodeChunk(null, null).also { - it += IRInstruction(Opcode.CONCAT, IRDataType.BYTE, reg1=resultReg, reg2 = msbTr.resultReg, reg3 = lsbTr.resultReg) + if((call.args[0] as? PtNumber)?.number == 0.0) { + // msb is 0, use EXT + val lsbTr = exprGen.translateExpression(call.args[1]) + addToResult(result, lsbTr, lsbTr.resultReg, -1) + addInstr(result, IRInstruction(Opcode.EXT, IRDataType.BYTE, reg1=resultReg, reg2 = lsbTr.resultReg), null) + } else { + val msbTr = exprGen.translateExpression(call.args[0]) + addToResult(result, msbTr, msbTr.resultReg, -1) + val lsbTr = exprGen.translateExpression(call.args[1]) + addToResult(result, lsbTr, lsbTr.resultReg, -1) + addInstr(result, IRInstruction(Opcode.CONCAT, IRDataType.BYTE, reg1=resultReg, reg2 = msbTr.resultReg, reg3 = lsbTr.resultReg), null) } return ExpressionCodeResult(result, IRDataType.WORD, resultReg, -1) } diff --git a/examples/test.p8 b/examples/test.p8 index f9f02a13b..b9f18a3c6 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -5,8 +5,10 @@ main { sub start() { - uword sprite_reg - cx16.r0 = sprite_reg+1 - cx16.vpoke(1, sprite_reg+1, 42) + ubyte lower = 123 + ubyte upper = 0 + uword ww = mkword(upper, lower) + + txt.print_uwhex(ww, true) } }