vfpmacros.h (2074B)
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * arch/arm/include/asm/vfpmacros.h 4 * 5 * Assembler-only file containing VFP macros and register definitions. 6 */ 7#include <asm/hwcap.h> 8 9#include <asm/vfp.h> 10 11#ifdef CONFIG_AS_VFP_VMRS_FPINST 12 .macro VFPFMRX, rd, sysreg, cond 13 vmrs\cond \rd, \sysreg 14 .endm 15 16 .macro VFPFMXR, sysreg, rd, cond 17 vmsr\cond \sysreg, \rd 18 .endm 19#else 20 @ Macros to allow building with old toolkits (with no VFP support) 21 .macro VFPFMRX, rd, sysreg, cond 22 MRC\cond p10, 7, \rd, \sysreg, cr0, 0 @ FMRX \rd, \sysreg 23 .endm 24 25 .macro VFPFMXR, sysreg, rd, cond 26 MCR\cond p10, 7, \rd, \sysreg, cr0, 0 @ FMXR \sysreg, \rd 27 .endm 28#endif 29 30 @ read all the working registers back into the VFP 31 .macro VFPFLDMIA, base, tmp 32 .fpu vfpv2 33#if __LINUX_ARM_ARCH__ < 6 34 fldmiax \base!, {d0-d15} 35#else 36 vldmia \base!, {d0-d15} 37#endif 38#ifdef CONFIG_VFPv3 39 .fpu vfpv3 40#if __LINUX_ARM_ARCH__ <= 6 41 ldr \tmp, =elf_hwcap @ may not have MVFR regs 42 ldr \tmp, [\tmp, #0] 43 tst \tmp, #HWCAP_VFPD32 44 vldmiane \base!, {d16-d31} 45 addeq \base, \base, #32*4 @ step over unused register space 46#else 47 VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0 48 and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field 49 cmp \tmp, #2 @ 32 x 64bit registers? 50 vldmiaeq \base!, {d16-d31} 51 addne \base, \base, #32*4 @ step over unused register space 52#endif 53#endif 54 .endm 55 56 @ write all the working registers out of the VFP 57 .macro VFPFSTMIA, base, tmp 58#if __LINUX_ARM_ARCH__ < 6 59 fstmiax \base!, {d0-d15} 60#else 61 vstmia \base!, {d0-d15} 62#endif 63#ifdef CONFIG_VFPv3 64 .fpu vfpv3 65#if __LINUX_ARM_ARCH__ <= 6 66 ldr \tmp, =elf_hwcap @ may not have MVFR regs 67 ldr \tmp, [\tmp, #0] 68 tst \tmp, #HWCAP_VFPD32 69 vstmiane \base!, {d16-d31} 70 addeq \base, \base, #32*4 @ step over unused register space 71#else 72 VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0 73 and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field 74 cmp \tmp, #2 @ 32 x 64bit registers? 75 vstmiaeq \base!, {d16-d31} 76 addne \base, \base, #32*4 @ step over unused register space 77#endif 78#endif 79 .endm