[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