Skip to content
Snippets Groups Projects
  1. Jul 21, 2020
    • Stefan Agner's avatar
      ARM: 8991/1: use VFP assembler mnemonics if available · 2cbd1cc3
      Stefan Agner authored
      The integrated assembler of Clang 10 and earlier do not allow to access
      the VFP registers through the coprocessor load/store instructions:
      arch/arm/vfp/vfpmodule.c:342:2: error: invalid operand for instruction
              fmxr(FPEXC, fpexc & ~(FPEXC_EX|FPEXC_DEX|FPEXC_FP2V|FPEXC_VV|FPEXC_TRAP_MASK));
              ^
      arch/arm/vfp/vfpinstr.h:79:6: note: expanded from macro 'fmxr'
              asm("mcr p10, 7, %0, " vfpreg(_vfp_) ", cr0, 0 @ fmxr   " #_vfp_ ", %0"
                  ^
      <inline asm>:1:6: note: instantiated into assembly here
              mcr p10, 7, r0, cr8, cr0, 0 @ fmxr      FPEXC, r0
                  ^
      
      This has been addressed with Clang 11 [0]. However, to support earlier
      versions of Clang and for better readability use of VFP assembler
      mnemonics still is preferred.
      
      Ideally we would replace this code with the unified assembler language
      mnemonics vmrs/vmsr on call sites along with .fpu assembler directives.
      The GNU assembler supports the .fpu directive at least since 2.17 (when
      documentation has been added). Since Linux requires binutils 2.21 it is
      safe to use .fpu directive. However, binutils does not allow to use
      FPINST or FPINST2 as an argument to vmrs/vmsr instructions up to
      binutils 2.24 (see binutils commit 16d02dc907c5):
      arch/arm/vfp/vfphw.S: Assembler messages:
      arch/arm/vfp/vfphw.S:162: Error: operand 0 must be FPSID or FPSCR pr FPEXC -- `vmsr FPINST,r6'
      arch/arm/vfp/vfphw.S:165: Error: operand 0 must be FPSID or FPSCR pr FPEXC -- `vmsr FPINST2,r8'
      arch/arm/vfp/vfphw.S:235: Error: operand 1 must be a VFP extension System Register -- `vmrs r3,FPINST'
      arch/arm/vfp/vfphw.S:238: Error: operand 1 must be a VFP extension System Register -- `vmrs r12,FPINST2'
      
      Use as-instr in Kconfig to check if FPINST/FPINST2 can be used. If they
      can be used make use of .fpu directives and UAL VFP mnemonics for
      register access.
      
      This allows to build vfpmodule.c with Clang and its integrated assembler.
      
      [0] https://reviews.llvm.org/D59733
      
      Link: https://github.com/ClangBuiltLinux/linux/issues/905
      
      
      
      Signed-off-by: default avatarStefan Agner <stefan@agner.ch>
      Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
      2cbd1cc3
Loading