void DotBuilder::doCall(ASTCall* element) { const Vector<ASTElement*>& arguments = element->getArguments(); size_t i, len = arguments.getLength(); size_t celter = len / 2; _sb.appendFormat(" N_%u [label=\"", element->getElementId()); _sb.appendFormat("<F0>%s", Hash<Function>::dataToKey(element->getFunction())); for (i = 0; i < len; i++) { _sb.appendFormat("<A%u>", (unsigned int)i); } _sb.appendString("\"];\n"); for (i = 0; i < len; i++) { _sb.appendFormat(" N_%u:A%u -> N_%u:F0;\n", element->getElementId(), (unsigned int)i, arguments[i]->getElementId()); } for (i = 0; i < len; i++) { doElement(arguments[i]); } }
virtual bool run(void* _func, StringBuilder& result, StringBuilder& expected) { typedef void (*Func)(int*); Func func = asmjit_cast<Func>(_func); int i; int resultBuf[32]; int expectedBuf[32]; for (i = 0; i < ASMJIT_ARRAY_SIZE(resultBuf); i++) expectedBuf[i] = i * 32; bool success = true; func(resultBuf); for (i = 0; i < ASMJIT_ARRAY_SIZE(resultBuf); i++) { result.appendFormat("%d", resultBuf[i]); expected.appendFormat("%d", expectedBuf[1]); success &= (resultBuf[i] == expectedBuf[i]); } return success; }
void DotBuilder::doOperator(ASTOperator* element) { uint operatorType = element->getOperatorType(); ASTElement* left = element->getLeft(); ASTElement* right = element->getRight(); const char* opString = NULL; switch (operatorType) { case MOPERATOR_ASSIGN: opString = "="; break; case MOPERATOR_PLUS : opString = "+"; break; case MOPERATOR_MINUS : opString = "-"; break; case MOPERATOR_MUL : opString = "*"; break; case MOPERATOR_DIV : opString = "/"; break; case MOPERATOR_MOD : opString = "%"; break; case MOPERATOR_POW : opString = "^"; break; default: MP_ASSERT_NOT_REACHED(); } _sb.appendFormat(" N_%u [label=\"<L>|<F0>%s|<R>\"];\n", element->getElementId(), opString); _sb.appendFormat(" N_%u:L -> N_%u:F0;\n", element->getElementId(), left->getElementId()); _sb.appendFormat(" N_%u:R -> N_%u:F0;\n", element->getElementId(), right->getElementId()); doElement(left); doElement(right); }
void DotBuilder::doTransform(ASTTransform* element) { uint transformType = element->getTransformType(); ASTElement* child = element->getChild(); const char* opString = NULL; switch (transformType) { case MTRANSFORM_NONE : opString = ""; break; case MTRANSFORM_NEGATE: opString = "-"; break; default: MP_ASSERT_NOT_REACHED(); } _sb.appendFormat(" N_%u [label=\"<F0>%s\"];\n", element->getElementId(), opString); _sb.appendFormat(" N_%u -> N_%u:F0;\n", element->getElementId(), child->getElementId()); doElement(child); }
void DotBuilder::doBlock(ASTBlock* element) { Vector<ASTElement*>& children = element->_elements; size_t i, len = children.getLength(); _sb.appendFormat(" N_%u [label=\"", element->getElementId()); for (i = 0; i < len; i++) _sb.appendFormat("<F%u> |", (uint)i); _sb.appendFormat(" \"];\n", element->getElementId()); for (i = 0; i < len; i++) { _sb.appendFormat(" N_%u:F%u -> N_%u:F0\n", element->getElementId(), (uint)i, children[i]->getElementId()); } for (i = 0; i < len; i++) { doElement(children[i]); } }
virtual bool run(void* _func, StringBuilder& result, StringBuilder& expected) { typedef void (*Func)(uint32_t*, const uint32_t*, size_t); Func func = asmjit_cast<Func>(_func); enum { kBufferSize = 32 }; uint32_t dstBuffer[kBufferSize]; uint32_t srcBuffer[kBufferSize]; uint i; for (i = 0; i < kBufferSize; i++) { dstBuffer[i] = 0; srcBuffer[i] = i; } func(dstBuffer, srcBuffer, kBufferSize); result.setString("buf={"); expected.setString("buf={"); for (i = 0; i < kBufferSize; i++) { if (i != 0) { result.appendString(", "); expected.appendString(", "); } result.appendFormat("%u", static_cast<uint>(dstBuffer[i])); expected.appendFormat("%u", static_cast<uint>(srcBuffer[i])); } result.appendString("}"); expected.appendString("}"); return memcmp(dstBuffer, srcBuffer, kBufferSize * sizeof(uint32_t)) == 0; }
void DotBuilder::doVariable(ASTVariable* element) { _sb.appendFormat(" N_%u [label=\"<F0>", element->getElementId()) .appendEscaped(Hash<Variable>::dataToKey(element->getVariable())) .appendString("\"];\n"); }
void DotBuilder::doConstant(ASTConstant* element) { _sb.appendFormat(" N_%u [label=\"<F0>%f\"];\n", element->getElementId(), element->getValue()); }