Wookey wrote:
That seems an oversimplification. There is usually an FPU (almost
always) and a neon unit (usually). The point is that their presence is
not guaranteed

Debian armhf requires a FPU as part of the baseline. More than
that it requires a FPU as part of the ABI!

Andreas Tille wrote:
It fails to build with

   lib/arm/crc32_impl.h:77:1: error: ‘-mfloat-abi=hard’: selected architecture 
lacks an FPU

This issue is caused by the way current versions of debian/ubuntu 
package/configure gcc

The gcc packaging used to specify cpu and fpu architectures separately, but now 
it specifies
the fpu as an extension of the cpu architecture using the "armv7-a+fp" syntax. 
The result of
this is if you override the CPU architecture on debian armhf you must also 
specify a fpu
(either using a seperate "mfpu" setting or using the syntax for CPU 
architecture extensions).
If you don't then gcc will assume you have no FPU and therefore that it is 
unable to implement
the hard float ABI.

The particular code in question seems to be an implementation of crc32 using 
the crc32 extension
added as an optional feature in armv8. From a quick look it appears to already 
be behind runtime
cpu detection.

At least gcc seems to think that on armv8 floating point and simd always go together, 
"+fp"
is not recognised as an extension to armv8, only "+simd". So I think Ubuntu's 
current patch
which changes the CPU settings for the code that uses the crc extension from an 
architecture
setting of "armv8+crc32" to and architecture setting of "armv8+simd+crc32" is 
correct for
Debian armhf.

You could however argue that it is not correct for Debian armel, I suspect it 
is possible in
theory to have an armv8 CPU that doesn't have any floating point or simd 
support, but does have
the crc32 extension and to run debian armel on such a CPU. In practice I 
suspect such CPUs are
likely to be like hens teeth and I suspect the compiler is unlikely to actually 
use any floating
point or simd instructions when compiling that function anyway.

Still if you want to be safer, you could do something like

--- a/lib/arm/crc32_impl.h
+++ b/lib/arm/crc32_impl.h
@@ -41,7 +41,11 @@
 #      ifdef __clang__
 #        define ATTRIBUTES     __attribute__((target("armv8-a,crc")))
 #      else
-#        define ATTRIBUTES     __attribute__((target("arch=armv8-a+crc")))
+#        ifdef __ARM_PCS_VFP
+#          define ATTRIBUTES   __attribute__((target("arch=armv8-a+simd+crc")))
+#        else
+#          define ATTRIBUTES   __attribute__((target("arch=armv8-a+crc")))
+#        endif
 #      endif
 #    else
 #      ifdef __clang__

Reply via email to