MatMult::MatMult(OMR::JitBuilder::TypeDictionary *types) : OMR::JitBuilder::MethodBuilder(types) { DefineLine(LINETOSTR(__LINE__)); DefineFile(__FILE__); DefineName("matmult"); pDouble = types->PointerTo(Double); // C = A * B, all NxN matrices DefineParameter("C", pDouble); DefineParameter("A", pDouble); DefineParameter("B", pDouble); DefineParameter("N", Int32); DefineReturnType(NoType); DefineLocal("sum", Double); }
bool InliningRecursiveFibonacciMethod::buildIL() { TR::IlBuilder *baseCase=NULL, *recursiveCase=NULL; IfThenElse(&baseCase, &recursiveCase, LessThan( Load("n"), ConstInt32(2))); DefineLocal("result", Int32); baseCase->Store("result", baseCase-> Load("n")); TR::IlValue *nMinusOne = recursiveCase-> Sub( recursiveCase-> Load("n"), recursiveCase-> ConstInt32(1)); TR::IlValue *fib_nMinusOne; if (_inlineDepth > 0) { // memory leak here, but just an example InliningRecursiveFibonacciMethod *inlineFib = new InliningRecursiveFibonacciMethod(this); fib_nMinusOne = recursiveCase->Call(inlineFib, 1, nMinusOne); } else fib_nMinusOne = recursiveCase->Call("fib", 1, nMinusOne); TR::IlValue *nMinusTwo = recursiveCase-> Sub( recursiveCase-> Load("n"), recursiveCase-> ConstInt32(2)); TR::IlValue *fib_nMinusTwo; if (_inlineDepth > 0) { // memory leak here, but just an example InliningRecursiveFibonacciMethod *inlineFib = new InliningRecursiveFibonacciMethod(this); fib_nMinusTwo = recursiveCase->Call(inlineFib, 1, nMinusTwo); } else fib_nMinusTwo = recursiveCase->Call("fib", 1, nMinusTwo); recursiveCase->Store("result", recursiveCase-> Add(fib_nMinusOne, fib_nMinusTwo)); #if defined(RFIB_DEBUG_OUTPUT) Call("printString", 1, ConstInt64((int64_t)prefix)); Call("printInt32", 1, Load("n")); Call("printString", 1, ConstInt64((int64_t)middle)); Call("printInt32", 1, Load("result")); Call("printString", 1, ConstInt64((int64_t)suffix)); #endif Return( Load("result")); return true; }