mirror of
https://github.com/irmen/prog8.git
synced 2026-04-20 11:17:01 +00:00
fix uword vs pointer type errors and casts
This commit is contained in:
@@ -520,7 +520,7 @@ internal class AssignmentGen(private val codeGen: IRCodeGen, private val express
|
||||
else
|
||||
IRInstruction(Opcode.STOREI, IRDataType.BYTE, reg1 = valueRegister, reg2 = pointerTr.resultReg)
|
||||
}
|
||||
targetPointerDeref.type.isWord || targetPointerDeref.type.isPointer -> { // because pointer is just a word address
|
||||
targetPointerDeref.type.isWord -> {
|
||||
if(zero)
|
||||
IRInstruction(Opcode.STOREZI, IRDataType.WORD, reg1 = pointerTr.resultReg)
|
||||
else
|
||||
@@ -532,6 +532,13 @@ internal class AssignmentGen(private val codeGen: IRCodeGen, private val express
|
||||
else
|
||||
IRInstruction(Opcode.STOREI, IRDataType.FLOAT, fpReg1 = valueRegister, reg1 = pointerTr.resultReg)
|
||||
}
|
||||
targetPointerDeref.type.isPointer -> {
|
||||
TODO()
|
||||
if(zero)
|
||||
IRInstruction(Opcode.STOREZI, IRDataType.WORD, reg1 = pointerTr.resultReg)
|
||||
else
|
||||
IRInstruction(Opcode.STOREI, IRDataType.WORD, reg1 = valueRegister, reg2 = pointerTr.resultReg)
|
||||
}
|
||||
else -> throw AssemblyError("weird pointer dereference type ${targetPointerDeref.type}")
|
||||
}
|
||||
addInstr(result, instr, null)
|
||||
|
||||
@@ -97,7 +97,6 @@ internal class ExpressionGen(private val codeGen: IRCodeGen) {
|
||||
}
|
||||
|
||||
private fun translate(deref: PtPointerDeref): ExpressionCodeResult {
|
||||
require(deref.type.isBasic) { "can only read simple types through pointer dereference" }
|
||||
val result = mutableListOf<IRCodeChunkBase>()
|
||||
val tr = translateExpression(deref.start)
|
||||
result += tr.chunks
|
||||
@@ -108,19 +107,20 @@ internal class ExpressionGen(private val codeGen: IRCodeGen) {
|
||||
addInstr(result, IRInstruction(Opcode.LOADI, IRDataType.BYTE, reg1 = resultReg, reg2 = tr.resultReg), null)
|
||||
return ExpressionCodeResult(result, IRDataType.BYTE, resultReg, -1)
|
||||
}
|
||||
|
||||
deref.type.isWord -> {
|
||||
val resultReg = codeGen.registers.next(IRDataType.WORD)
|
||||
addInstr(result, IRInstruction(Opcode.LOADI, IRDataType.WORD, reg1 = resultReg, reg2 = tr.resultReg), null)
|
||||
return ExpressionCodeResult(result, IRDataType.WORD, resultReg, -1)
|
||||
}
|
||||
|
||||
deref.type.isFloat -> {
|
||||
val resultReg = codeGen.registers.next(IRDataType.FLOAT)
|
||||
addInstr(result, IRInstruction(Opcode.LOADI, IRDataType.FLOAT, fpReg1 = resultReg, reg1 = tr.resultReg), null)
|
||||
return ExpressionCodeResult(result, IRDataType.FLOAT, -1, resultReg)
|
||||
}
|
||||
|
||||
deref.type.isPointer -> {
|
||||
// just return the pointer value itself, a word adress
|
||||
return ExpressionCodeResult(result, IRDataType.WORD, tr.resultReg, -1)
|
||||
}
|
||||
else -> throw AssemblyError("unsupported dereference type ${deref.type}")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user