fix uword vs pointer type errors and casts

This commit is contained in:
Irmen de Jong
2025-04-26 20:23:44 +02:00
parent 88269628a2
commit 803e6bd81a
14 changed files with 97 additions and 24 deletions
@@ -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}")
}
}