[LLVMdev] ARM NEON intrinsics in clang

Stanislav Manilov stanislav.manilov at gmail.com
Thu Sep 26 09:52:09 PDT 2013

Hello Renato,

It turned out I just didn't do the cross-compilation correctly, and Tim
Northover already pointed me to a guide you have written on it (
http://clang.llvm.org/docs/CrossCompilation.html), so I will read that
before continuing with my efforts.

To answer your question I am testing on a pandaboard currently, which has
an arm cortex-a9 processor, which I think is 64-bit.

I am much happy to compile the latest code and am successfully doing so. I
tried to compile release 2.9, as I (wrongly) believed that I need llvm-gcc
in order to compile NEON code on LLVM.

Tim's minimalist example worked on my clang3.4:

$ cat > neon.c
#include <arm_neon.h>

float32x4_t my_func(float32x4_t lhs, float32x4_t rhs) {
  return vaddq_f32(lhs, rhs);
$ clang --target=arm-linux-gnueabihf -mcpu=cortex-a15 -ffreestanding
-O3 -S -o - neon.c

however it doesn't if I remove the -ffreestanding flag. I need to figure
this out next.

Thank you for your help.

 - Stan

On Thu, Sep 26, 2013 at 4:01 PM, Renato Golin <renato.golin at linaro.org>wrote:

>  On 26 September 2013 12:22, Stanislav Manilov <S.Z.Manilov at sms.ed.ac.uk>wrote:
>>  In the process I found out that clang doesn't support NEON (as per
>> http://blog.llvm.org/2010/04/arm-advanced-simd-neon-intrinsics-and.html),
>> but there has been at least some effort in adding it (
>> https://www.codeaurora.org/patches/quic/llvm/32040/clang-Initial-Neon-support.patch
>> ).
>  Hi Stanislav,
>  LLVM does support NEON on ARM32 for a very long time. The commit you're
> referring is about AArch64, and yes, support for ARM64 NEON is patchy at
> the moment, but it's progressing quite quickly. What back-end are you
> trying to use? 32-bits or 64-bits?
>   I also tried compiling LLVM 2.9 + llvm-gcc but that failed too many
>> times and I gave up. After some discussions with colleagues (notably
>> Alberto Magni, who added OpenCL support to clang some time ago
>> http://lists.cs.uiuc.edu/pipermail/cfe-dev/2010-November/012293.html) my
>> current plan is to implement the ARM NEON intrinsics as a shared library,
>> using attributes as in:
>  LLVM 2.9 is really old, and llvm-gcc is discontinued, so I wouldn't even
> try that. If you don't want to use trunk, I recommend you to use LLVM with
> Clang 3.3 and see what you get.
>   typedef float float4 __attribute__((ext_vector_type(4)));
>> or if that doesn't work, I will try to implement the intrinsics in clang
>> itself (not sure this is the best way of doing it).
>>  Ideally, I want to be able to compile C code that includes ARM NEON
>> intrinsics to other targets (TI processors, e.g.).
>  So, if I get it right, you have a file with ARM NEON intrinsics (the
> ones defined in arm_neon.h) and passed it through LLVM 2.9 with LLVM-GCC
> front-end and failed.
>  As of 2010, LLVM can compile every single NEON instruction, but you
> should use LLVM's own version of arm_neon.h, since the type definitions do
> vary between toolchains. In the end, they amount to the same thing on each
> toolchain, but their representation can be different.
>  I suggest you try with Clang 3.3 and if that fails, we'll start from
> there.
>  cheers,
> --renato
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130926/4334c9cf/attachment.html>

More information about the llvm-dev mailing list