diff --git a/src/parser.cpp b/src/parser.cpp index 7e6e502..a7a6abe 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -214,6 +214,42 @@ namespace Solstice { code.push_back(codeBlock); break; } + case SolNodeType::Multiply: { + ensure2(children[0], SolDataType::Int, SolDataType::Double); + ensure2(children[1], SolDataType::Int, SolDataType::Double); + SolGroundCodeBlock codeBlock; + outputId = "tmp_" + std::to_string(tmpIdIterator++); + GroundInstruction gi = groundCreateInstruction(MULTIPLY); + if (children.size() < 2) { + std::cout << "Need more stuff to add\n"; + } + groundAddReferenceToInstruction(&gi, groundCreateReference(VALREF, children[0].outputId.data())); + groundAddReferenceToInstruction(&gi, groundCreateReference(VALREF, children[1].outputId.data())); + groundAddReferenceToInstruction(&gi, groundCreateReference(DIRREF, outputId.data())); + codeBlock.code.push_back(gi); + if (isTemp(children[0].outputId)) codeBlock.toBeDropped.push_back(children[0].outputId); + if (isTemp(children[1].outputId)) codeBlock.toBeDropped.push_back(children[1].outputId); + code.push_back(codeBlock); + break; + } + case SolNodeType::Divide: { + ensure2(children[0], SolDataType::Int, SolDataType::Double); + ensure2(children[1], SolDataType::Int, SolDataType::Double); + SolGroundCodeBlock codeBlock; + outputId = "tmp_" + std::to_string(tmpIdIterator++); + GroundInstruction gi = groundCreateInstruction(DIVIDE); + if (children.size() < 2) { + std::cout << "Need more stuff to add\n"; + } + groundAddReferenceToInstruction(&gi, groundCreateReference(VALREF, children[0].outputId.data())); + groundAddReferenceToInstruction(&gi, groundCreateReference(VALREF, children[1].outputId.data())); + groundAddReferenceToInstruction(&gi, groundCreateReference(DIRREF, outputId.data())); + codeBlock.code.push_back(gi); + if (isTemp(children[0].outputId)) codeBlock.toBeDropped.push_back(children[0].outputId); + if (isTemp(children[1].outputId)) codeBlock.toBeDropped.push_back(children[1].outputId); + code.push_back(codeBlock); + break; + } case SolNodeType::Equal: { ensuresame(children[0], children[1]); SolGroundCodeBlock codeBlock;