[LLVMdev] Adding custom operation intrinsic for ASIP architectures.

Chris Lattner sabre at nondot.org
Tue Jul 31 23:10:32 PDT 2007


On Tue, 31 Jul 2007, [ISO-8859-1] Mikael Lepistö wrote:
> I was talking with aKor in #llvm how we could implement custom operation
> support for our ASIP architecture. We came into solution that the best
> way would be to write new custom operation intrinsic and optimization
> pass for raising certain type of function calls to those intrinsics
> (similar to raising mallocs).
>
> Basically our custom operation are like calls, with operand name and
> multiple inputs and outputs. e.g. C code:
> __llvm__custom_op_add(a,b,c) would be raised to customop add(i32 %tmp1,
> i32 %tmp24 , i32 %tmp25). Those "__llvm__custom_op_" prefixed function
> will not have function body, but pure declarations in C code level.
>
> Comments are welcome, especially if there anyone else, that needs this
> kind of functionality or if people has already implemented something
> similar.

Sure, this works.  This is exactly the idea of the builtin functions in 
GCC.  For example, in SSE, the __builtin_ia32_movntps function does a 
nontemporal store.

To answer David's question, we already have direct support for this in 
tblgen, for example, include/llvm/IntrinsicsX86.td contains:

let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".
   def int_x86_sse_movnt_ps : GCCBuiltin<"__builtin_ia32_movntps">,
               Intrinsic<[llvm_void_ty, llvm_ptr_ty,
                          llvm_v4f32_ty], [IntrWriteMem]>;
}

and lib/Target/X86/X86InstrSSE.td contains:

def MOVNTPSmr : PSI<0x2B, MRMDestMem, (outs), (ins i128mem:$dst, VR128:$src),
                     "movntps {$src, $dst|$dst, $src}",
                     [(int_x86_sse_movnt_ps addr:$dst, VR128:$src)]>;

There is corresponding code in llvm-gcc to tell GCC how to handle this 
builtin.  Is this what you're looking for?

-Chris

-- 
http://nondot.org/sabre/
http://llvm.org/


More information about the llvm-dev mailing list