Hi there.  Currently you can't use NEON instructions in inline
assembly if the compiler is set to -mfpu=vfp such as Ubuntu's
-mfpu=vfpv3-d16.  Trying code like this:

int main()
{
   asm("veor d1, d2, d3");
   return 0;
}

gives an error message like:

test.s: Assembler messages:
test.s:29: Error: selected processor does not support Thumb mode `veor d1,d2,d3'

The problem is that -mfpu=vfpv3-d16 has two jobs:  it tells the
compiler what instructions to use, and also tells the assembler what
instructions are valid.  We might want the compiler to use the VFP for
compatibility or power reasons, but still be able to use NEON
instructions in inline assembler without passing extra flags.

Inserting ".fpu neon" to the start of the inline assembly fixes the
problem.  Is this valid?  Are assembly files with multiple .fpu
statements allowed?  Passing '-Wa,-mfpu=neon' to GCC doesn't work as
gas seems to ignore the second -mfpu.

What's the best way to handle this? Some options are:
 * Add '.fpu neon' directives to the start of any inline assembly
 * Separate out the features, so you can specify the capabilities with
one option and restrict the compiler to a subset with another.
Something like '-mfpu=neon -mfpu-tune=vfpv3-d16'
 * Relax the assembler so that any instructions are accepted.  We'd
lose some checking of GCC's output though.

-- Michael

_______________________________________________
linaro-toolchain mailing list
linaro-toolchain@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-toolchain

Reply via email to