void dDAGExpressionNodeVariable::CompileCIL(dCIL& cil) { size_t pos = m_name.find (D_SCOPE_PREFIX, 0, strlen (D_SCOPE_PREFIX)); if (pos != 0) { bool state = RenameLocalVariable(m_name); if (!state) { DTRACE (("undefined local variable\n")); _ASSERTE (0); } } if (m_dimExpressions.GetCount()) { dDAGDimensionNode* const dim = m_dimExpressions.GetFirst()->GetInfo(); dim->CompileCIL(cil); dCIL::dListNode* const dimInstruction = cil.NewStatement(); dTreeAdressStmt& addressIndex = dimInstruction->GetInfo(); addressIndex.m_instruction = dTreeAdressStmt::m_assigment; addressIndex.m_arg0.m_label = cil.NewTemp(); addressIndex.m_arg1.m_label = dim->m_result; string result = addressIndex.m_arg0.m_label; dTRACE_INTRUCTION (&addressIndex); for (dList<dDAGDimensionNode*>::dListNode* node = m_dimExpressions.GetFirst()->GetNext(); node; node = node->GetNext()) { dDAGDimensionNode* const dim = node->GetInfo(); dim->CompileCIL(cil); dTreeAdressStmt& stmtMul = cil.NewStatement()->GetInfo(); stmtMul.m_instruction = dTreeAdressStmt::m_assigment; stmtMul.m_operator = dTreeAdressStmt::m_mul; stmtMul.m_arg0.m_label = cil.NewTemp(); stmtMul.m_arg1.m_label = result; stmtMul.m_arg2.m_label = dim->m_arraySize; dTRACE_INTRUCTION (&stmtMul); dTreeAdressStmt& stmtAdd = cil.NewStatement()->GetInfo(); stmtAdd.m_instruction = dTreeAdressStmt::m_assigment; stmtAdd.m_operator = dTreeAdressStmt::m_add; stmtAdd.m_arg0.m_label = cil.NewTemp(); stmtAdd.m_arg1.m_label = stmtMul.m_arg0.m_label; stmtAdd.m_arg2.m_label = dim->m_result; result = stmtAdd.m_arg0.m_label; dTRACE_INTRUCTION (&stmtAdd); } dTreeAdressStmt& dimSize = cil.NewStatement()->GetInfo(); dimSize.m_instruction = dTreeAdressStmt::m_assigment; dimSize.m_operator = dTreeAdressStmt::m_mul; dimSize.m_arg0.m_label = cil.NewTemp(); dimSize.m_arg1.m_label = result; dimSize.m_arg2.m_label = "4"; dTRACE_INTRUCTION (&dimSize); result = dimSize.m_arg0.m_label; _ASSERTE (m_parent); if (m_parent->GetTypeId() == dDAGFunctionStatementAssigment::GetRttiType()) { dDAGFunctionStatementAssigment* const asmt = (dDAGFunctionStatementAssigment*) m_parent; if (asmt->m_leftVariable == this) { //m_result = m_name + '[' + result + ']'; m_result = result; } else { // emit an indirect addressing mode dTreeAdressStmt& tmp = cil.NewStatement()->GetInfo(); // m_result = m_name + '[' + addressIndex.m_arg0.m_label + ']'; // tmp.m_instruction = dTreeAdressStmt::m_assigment; // tmp.m_arg0.m_label = cil.NewTemp(); // tmp.m_arg1.m_label = m_name + '[' + result + ']'; tmp.m_instruction = dTreeAdressStmt::m_load; tmp.m_arg0.m_label = cil.NewTemp(); tmp.m_arg1.m_label = m_name; tmp.m_arg2.m_label = result; dTRACE_INTRUCTION (&tmp); m_result = tmp.m_arg0.m_label; } } else { // emit an indirect addressing mode dTreeAdressStmt& tmp = cil.NewStatement()->GetInfo(); // m_result = m_name + '[' + addressIndex.m_arg0.m_label + ']'; // tmp.m_instruction = dTreeAdressStmt::m_assigment; // tmp.m_arg0.m_label = cil.NewTemp();; // tmp.m_arg1.m_label = m_name + '[' + result + ']'; tmp.m_instruction = dTreeAdressStmt::m_load; tmp.m_arg0.m_label = cil.NewTemp(); tmp.m_arg1.m_label = m_name; tmp.m_arg2.m_label = result; dTRACE_INTRUCTION (&tmp); m_result = tmp.m_arg0.m_label; } } else { m_result = m_name; } }
void dDAGExpressionNodeAssigment::CompileCIL(dCIL& cil) { m_expression->CompileCIL(cil); if (m_leftVariable->m_dimExpressions.GetCount()) { dDAGDimensionNode* const dim = m_leftVariable->m_dimExpressions.GetFirst()->GetInfo(); dim->CompileCIL(cil); dString result = dim->m_result.m_label; for (dList<dDAGDimensionNode*>::dListNode* node = m_leftVariable->m_dimExpressions.GetFirst()->GetNext(); node; node = node->GetNext()) { dAssert (0); dDAGDimensionNode* const dim = node->GetInfo(); dim->CompileCIL(cil); #if 0 dCILInstr& stmtMul = cil.NewStatement()->GetInfo(); stmtMul.m_instruction = dCILInstr::m_assigment; stmtMul.m_operator = dCILInstr::m_mul; stmtMul.m_arg0.m_label = cil.NewTemp(); stmtMul.m_arg1.m_label = result; stmtMul.m_arg2.m_label = dim->m_arraySize; DTRACE_INTRUCTION (&stmtMul); dCILInstr& stmtAdd = cil.NewStatement()->GetInfo(); stmtAdd.m_instruction = dCILInstr::m_assigment; stmtAdd.m_operator = dCILInstr::m_add; stmtAdd.m_arg0.m_label = cil.NewTemp(); stmtAdd.m_arg1.m_label = stmtMul.m_arg0.m_label; stmtAdd.m_arg2 = dim->m_result; result = stmtAdd.m_arg0.m_label; DTRACE_INTRUCTION (&stmtAdd); #endif } dAssert (m_leftVariable->m_parent); dTree<dCILInstr::dArg, dString>::dTreeNode* const variable = dDAG::FindLocalVariable(m_leftVariable->m_name); dAssert (variable); dCILInstr::dArg arg0 (LoadLocalVariable(cil, m_expression->m_result)); dCILInstr::dArg arg1 (LoadLocalVariable(cil, variable->GetInfo())); int size = arg0.GetSizeInByte(); dCILInstrIntergerLogical* const mulOffset = new dCILInstrIntergerLogical(cil, dCILThreeArgInstr::m_mul,cil.NewTemp(), dCILInstr::dArgType(dCILInstr::m_int), result, dCILInstr::dArgType(dCILInstr::m_int), dString(size), dCILInstr::m_constInt); mulOffset->Trace(); dCILInstrIntergerLogical* const address = new dCILInstrIntergerLogical(cil, dCILThreeArgInstr::m_add, cil.NewTemp(), arg1.GetType(), arg1.m_label, arg1.GetType(), mulOffset->GetArg0().m_label, mulOffset->GetArg0().GetType()); address->Trace(); dCILInstrStore* const store = new dCILInstrStore(cil, address->GetArg0().m_label, address->GetArg0().GetType(), arg0.m_label, arg0.GetType()); store->Trace(); m_result = arg0; } else { m_leftVariable->CompileCIL(cil); dCILInstr::dArg arg1 (LoadLocalVariable(cil, m_expression->m_result)); dCILInstrMove* const move = new dCILInstrMove (cil, m_leftVariable->m_result.m_label, m_leftVariable->m_result.GetType(), arg1.m_label, arg1.GetType()); move->Trace(); } }