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? -Dave
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
Eli Friedman <eli.friedman at gmail.com> writes:> 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.Because in some cases users may want to explicitly use non-VEX encoded instructions. So we need to differentiate. -Dave