On 03/12/2020 13:53, Sebastian Huber wrote:
On 03/12/2020 13:25, Sebastian Huber wrote:
Hello,
I have a problem that assembler files assembled by GCC issue errors
due to incomplete architecture and FPU options which should be
provided by the assembler command line and not as directives in the
file. For example:
arm-rtems6-gcc -save-temps -c test.c -mthumb -march=armv8-a+crc+simd
-mfloat-abi=hard -wrapper echo
/tmp/sh/rtems/6/lib/gcc/arm-rtems6/10.2.1/cc1 -E -quiet
-D__USES_INITFINI__ test.c -mthumb -mfloat-abi=hard
-march=armv8-a+crc+simd -fpch-preprocess -o test.i
/tmp/sh/rtems/6/lib/gcc/arm-rtems6/10.2.1/cc1 -fpreprocessed test.i
-quiet -dumpbase test.c -mthumb -mfloat-abi=hard
-march=armv8-a+crc+simd -auxbase test -o test.s
/tmp/sh/rtems/6/lib64/gcc/arm-rtems6/10.2.1/../../../../arm-rtems6/bin/as
-march=armv8-a+crc -mfloat-abi=hard -meabi=5 -o test.o test.s
arm-rtems6-gcc -save-temps -c test.c -mthumb -march=armv8-r+crc+simd
-mfloat-abi=hard -wrapper echo
/tmp/sh/rtems/6/lib/gcc/arm-rtems6/10.2.1/cc1 -E -quiet
-D__USES_INITFINI__ test.c -mthumb -mfloat-abi=hard
-march=armv8-r+crc+simd -fpch-preprocess -o test.i
/tmp/sh/rtems/6/lib/gcc/arm-rtems6/10.2.1/cc1 -fpreprocessed test.i
-quiet -dumpbase test.c -mthumb -mfloat-abi=hard
-march=armv8-r+crc+simd -auxbase test -o test.s
/tmp/sh/rtems/6/lib64/gcc/arm-rtems6/10.2.1/../../../../arm-rtems6/bin/as
-march=armv8-r+crc -mfloat-abi=hard -meabi=5 -o test.o test.s
The assembler is called without the "+simd". In Armv7-A and Armv7-R
the FPU was selected by -mfpu options.
It is discarded by arm_rewrite_selected_arch() probably because
(gdb) p *entry
$16 = {name = 0x4c1acc "simd", remove = false, alias = false, isa_bits
= {isa_bit_fp_d32, isa_bit_fp_dbl, isa_bit_fp16conv, isa_bit_fpv5,
isa_bit_vfpv2, isa_bit_vfpv3, isa_bit_vfpv4, isa_bit_neon, isa_nobit
<repeats 54 times>}}
and
#define ISA_ALL_FPU_INTERNAL \
isa_bit_fp16conv, \
isa_bit_crypto, \
isa_bit_vfpv2, \
isa_bit_vfpv3, \
isa_bit_vfpv4, \
isa_bit_fpv5, \
isa_bit_neon, \
isa_bit_fp_dbl, \
isa_bit_fp_d32
So
(gdb) p/x fpu_bits
$17 = {m_bitmap = 0x778e60}
(gdb) p/x opt_bits
$18 = {m_bitmap = 0x778e20}
if (!bitmap_subset_p (opt_bits, fpu_bits))
optlist.push_back (entry->name);
doesn't push back entry->name.
Is this a bug or a feature?
The assembler doesn't complain about a -march=armv8-r+crc+simd and it
makes the assembler error go away, for example:
../../../cpukit/score/cpu/arm/cpu_asm.S: Assembler messages:
../../../cpukit/score/cpu/arm/cpu_asm.S:64: Error: selected processor
does not support `vstm r5,{d8-d15}' in ARM mode
../../../cpukit/score/cpu/arm/cpu_asm.S:110: Error: selected processor
does not support `vldm r5,{d8-d15}' in ARM mode
What fixes the problem is adding the "-mfpu=auto" option. For example:
arm-rtems6-gcc -save-temps -c test.c -mthumb -march=armv8-a+crc+simd
-mfloat-abi=hard -mfpu=auto -wrapper echo
/tmp/sh/rtems/6/lib/gcc/arm-rtems6/10.2.1/cc1 -E -quiet
-D__USES_INITFINI__ test.c -mthumb -mfloat-abi=hard -mfpu=auto
-march=armv8-a+crc+simd -fpch-preprocess -o test.i
/tmp/sh/rtems/6/lib/gcc/arm-rtems6/10.2.1/cc1 -fpreprocessed test.i
-quiet -dumpbase test.c -mthumb -mfloat-abi=hard -mfpu=auto
-march=armv8-a+crc+simd -auxbase test -o test.s
/tmp/sh/rtems/6/lib64/gcc/arm-rtems6/10.2.1/../../../../arm-rtems6/bin/as
-mfpu=neon-fp-armv8 -march=armv8-a+crc -mfloat-abi=hard -meabi=5 -o
test.o test.s
This is not really nice since the -mfpu=auto option seems to have no
effect on the code generation (compiler):
arm-rtems6-gcc -save-temps -E -P -v -dD test.c -mthumb
-march=armv8-a+crc+simd -mfloat-abi=hard -mfpu=auto > auto.txt 2>&1
arm-rtems6-gcc -save-temps -E -P -v -dD test.c -mthumb
-march=armv8-a+crc+simd -mfloat-abi=hard > noauto.txt 2>&1
diff -u auto.txt noauto.txt
--- auto.txt 2020-12-03 15:18:46.466141382 +0100
+++ noauto.txt 2020-12-03 15:18:52.282185710 +0100
@@ -5,8 +5,8 @@
Thread model: rtems
Supported LTO compression algorithms: zlib
gcc version 10.2.1 20201203 [releases/gcc-10 revision
75a5af680a1:72d226ca97d:3444cb38a4d8df2c198ae5b4bdc747ff0c42a940] (GCC)
-COLLECT_GCC_OPTIONS='-save-temps' '-E' '-P' '-v' '-dD' '-mthumb'
'-mfloat-abi=hard' '-mfpu=auto' '-march=armv8-a+crc+simd'
- /tmp/sh/rtems/6/lib/gcc/arm-rtems6/10.2.1/cc1 -E -quiet -v -P
-D__USES_INITFINI__ test.c -mthumb -mfloat-abi=hard -mfpu=auto
-march=armv8-a+crc+simd -fpch-preprocess -dD
+COLLECT_GCC_OPTIONS='-save-temps' '-E' '-P' '-v' '-dD' '-mthumb'
'-mfloat-abi=hard' '-march=armv8-a+crc+simd'
+ /tmp/sh/rtems/6/lib/gcc/arm-rtems6/10.2.1/cc1 -E -quiet -v -P
-D__USES_INITFINI__ test.c -mthumb -mfloat-abi=hard
-march=armv8-a+crc+simd -fpch-preprocess -dD
ignoring nonexistent directory
"/tmp/sh/rtems/6/lib64/gcc/arm-rtems6/10.2.1/../../../../arm-rtems6/sys-include"
#include "..." search starts here:
#include <...> search starts here:
@@ -466,4 +466,4 @@
#define __USES_INITFINI__ 1
COMPILER_PATH=/tmp/sh/rtems/6/lib/gcc/arm-rtems6/10.2.1/:/tmp/sh/rtems/6/lib/gcc/arm-rtems6/10.2.1/:/tmp/sh/rtems/6/lib/gcc/arm-rtems6/:/tmp/sh/rtems/6/lib64/gcc/arm-rtems6/10.2.1/:/tmp/sh/rtems/6/lib64/gcc/arm-rtems6/:/tmp/sh/rtems/6/lib64/gcc/arm-rtems6/10.2.1/../../../../arm-rtems6/bin/
LIBRARY_PATH=/tmp/sh/rtems/6/lib64/gcc/arm-rtems6/10.2.1/:/tmp/sh/rtems/6/lib64/gcc/arm-rtems6/10.2.1/../../../../arm-rtems6/lib/
-COLLECT_GCC_OPTIONS='-save-temps' '-E' '-P' '-v' '-dD' '-mthumb'
'-mfloat-abi=hard' '-mfpu=auto' '-march=armv8-a+crc+simd'
+COLLECT_GCC_OPTIONS='-save-temps' '-E' '-P' '-v' '-dD' '-mthumb'
'-mfloat-abi=hard' '-march=armv8-a+crc+simd'
In the documentation
https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html
we have
"The setting ‘auto’ is the default and is special. It causes the
compiler to select the floating-point and Advanced SIMD instructions
based on the settings of -mcpu and -march."
What does "is the default" mean here? Does the mean that it is the
behaviour if -mfpu= is not given? If yes, then I think it doesn't work
properly.
--
embedded brains GmbH
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.hubere@xxxxxxxxxxxxxxxxxx
phone: +49-89-18 94 741 - 16
fax: +49-89-18 94 741 - 08
Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/