• 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/905Signed-off-by: default avatarStefan Agner <stefan@agner.ch>
    Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
    2cbd1cc3
vfpinstr.h 2.86 KB