[LLVMdev] GCCBuiltin and Intrinsic Mapping

Eli Friedman eli.friedman at gmail.com
Sun Sep 12 15:45:34 PDT 2010


On Sun, Sep 12, 2010 at 3:25 PM, David Greene <dag at cray.com> wrote:
> I've run into an issue specifying intrinsics for AVX.
>
> Right now one can use GCCBuiltin to get automatic CBE (and other)
> support for emitting intrinsics as gcc builtins.  It looks like
> this:
>
>  def int_x86_sse3_hadd_pd : GCCBuiltin<"__builtin_ia32_haddpd">,
>              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty,
>                         llvm_v2f64_ty], [IntrNoMem]>;
>
> AVX has 128-bit instructions that work exactly like SSE instructions
> except they have non-destructive operands.  gcc defines intrinsics for
> 256-bit operations but does not define special intrinsics for 128-bit
> AVX instructions.  So one has to use the SSE intrinsics:
>
>   def int_x86_avx_vhadd_pd_xmm : GCCBuiltin<"__builtin_ia32_haddpd">,
>              Intrinsic<[llvm_v2f64_ty], [llvm_v2f64_ty, llvm_v2f64_ty],
>                        [IntrNoMem]>;
>
> Unfortunately, this doesn't work:
>
> /ptmp/dag/universal_build/merge/developer/DEFAULT/llvm/tblgen: Intrinsic 'int_x86_sse3_hadd_pd': duplicate GCC builtin name!
>
> Apparently it's not possible to define two different LLVM intrinsics
> that map to the same GCCBuiltin.  Is this a known limitation?  How
> complicated would it be to lift this restriction?

int_x86_avx_vhadd_pd_xmm doesn't exist on trunk.  Why does it exist on
your branch if the semantics are exactly equivalent to
int_x86_sse3_hadd_pd?  The register allocator can handle converting to
three-address form if the target provides the appropriate hooks.

-Eli




More information about the llvm-dev mailing list