张超
2009-Jul-30 08:38 UTC
[LLVMdev] How to produce a "Intrinsic Function" call instruction?
Hi, all. I have noticed that LLVM supports some Intrinsic Functions such as *"** llvm.sadd.with.overflow"* described in http://llvm.org/docs/LangRef.html#int_sadd_overflow. We can use these functions and needn't define the function bodies. For example, I can manually insert codes: * %res = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %a, i32 %b) %sum = extractvalue {i32, i1} %res, 0 %obit = extractvalue {i32, i1} %res, 1 br i1 %obit, label %overflow, label %normal* into an assembly file, and it works OK. And now, my question is "How to produce such a call instruction using the LLVM classes?" I have also noticed that LLVM provides some classes like "*MemCpyInst"* to wrap the "*llvm.memcpy"* Intrinsic. But other intrinsic functions such as *" **llvm.sadd.with.overflow"* I've mentioned above don't have the corresponding classes. How to deal with it? Anyone could help me? Thank you! -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20090730/3b6011a4/attachment.html>
Olivier Meurant
2009-Jul-30 09:05 UTC
[LLVMdev] How to produce a "Intrinsic Function" call instruction?
You can use your module to get the function or if not available create the function and use it like any other functions you may have. This how I do : Function fun = 0; if ((fun=module->getFunction("llvm.sadd.with.overflow"))==0) { vector<Type*> fun_arguments; fun_arguments.push_back(...); //depends on your type fun_arguments.push_back(...); //depends on your type FunctionType *fun_type = FunctionType::get(Type::VoidTy, fun_arguments, false); fun = llvm::Function::Create(fun_type, GlobalValue::ExternalLinkage, "llvm.sadd.with.overflow", module); } // insert your call to fun here Olivier. On Thu, Jul 30, 2009 at 10:38 AM, 张超 <gausszhch at gmail.com> wrote:> Hi, all. > I have noticed that LLVM supports some Intrinsic Functions such as *"** > llvm.sadd.with.overflow"* described in > http://llvm.org/docs/LangRef.html#int_sadd_overflow. We can use these > functions and needn't define the function bodies. > > For example, I can manually insert codes: > > * %res = call {i32, i1} @llvm.sadd.with.overflow.i32(i32 %a, i32 %b) > %sum = extractvalue {i32, i1} %res, 0 > %obit = extractvalue {i32, i1} %res, 1 > br i1 %obit, label %overflow, label %normal* > > into an assembly file, and it works OK. > > And now, my question is "How to produce such a call instruction using the > LLVM classes?" > > I have also noticed that LLVM provides some classes like "*MemCpyInst"* to > wrap the "*llvm.memcpy"* Intrinsic. But other intrinsic functions such as > *"**llvm.sadd.with.overflow"* I've mentioned above don't have the > corresponding classes. How to deal with it? > > Anyone could help me? Thank you! > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20090730/29ec6d41/attachment.html>
Ralf Karrenberg
2009-Jul-30 09:23 UTC
[LLVMdev] How to produce a "Intrinsic Function" call instruction?
Hey, ?? wrote:> I have also noticed that LLVM provides some classes like > "/*MemCpyInst"*/ to wrap the "/*llvm.memcpy"*/ Intrinsic. But other > intrinsic functions such as /*"*//*llvm.sadd.with.overflow"*/ I've > mentioned above don't have the corresponding classes. How to deal with it?For special instruction set intrinsics like SSE, you can use Intrinsic::getDeclaration() which returns an llvm::Function* : Intrinsic::getDeclaration(module, Intrinsic::sadd_with_overflow); Have a look at include/llvm/Intrinsics.gen for the exact names. Cheers, Ralf