]> Git Repo - linux.git/blob - arch/arm/include/asm/vfpmacros.h
Linux 6.14-rc3
[linux.git] / arch / arm / include / asm / vfpmacros.h
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         .macro  VFPFMRX, rd, sysreg, cond
12         vmrs\cond       \rd, \sysreg
13         .endm
14
15         .macro  VFPFMXR, sysreg, rd, cond
16         vmsr\cond       \sysreg, \rd
17         .endm
18
19         @ read all the working registers back into the VFP
20         .macro  VFPFLDMIA, base, tmp
21         .fpu    vfpv2
22 #if __LINUX_ARM_ARCH__ < 6
23         fldmiax \base!, {d0-d15}
24 #else
25         vldmia  \base!, {d0-d15}
26 #endif
27 #ifdef CONFIG_VFPv3
28         .fpu    vfpv3
29 #if __LINUX_ARM_ARCH__ <= 6
30         ldr     \tmp, =elf_hwcap                    @ may not have MVFR regs
31         ldr     \tmp, [\tmp, #0]
32         tst     \tmp, #HWCAP_VFPD32
33         vldmiane \base!, {d16-d31}
34         addeq   \base, \base, #32*4                 @ step over unused register space
35 #else
36         VFPFMRX \tmp, MVFR0                         @ Media and VFP Feature Register 0
37         and     \tmp, \tmp, #MVFR0_A_SIMD_MASK      @ A_SIMD field
38         cmp     \tmp, #2                            @ 32 x 64bit registers?
39         vldmiaeq \base!, {d16-d31}
40         addne   \base, \base, #32*4                 @ step over unused register space
41 #endif
42 #endif
43         .endm
44
45         @ write all the working registers out of the VFP
46         .macro  VFPFSTMIA, base, tmp
47 #if __LINUX_ARM_ARCH__ < 6
48         fstmiax \base!, {d0-d15}
49 #else
50         vstmia  \base!, {d0-d15}
51 #endif
52 #ifdef CONFIG_VFPv3
53         .fpu    vfpv3
54 #if __LINUX_ARM_ARCH__ <= 6
55         ldr     \tmp, =elf_hwcap                    @ may not have MVFR regs
56         ldr     \tmp, [\tmp, #0]
57         tst     \tmp, #HWCAP_VFPD32
58         vstmiane \base!, {d16-d31}
59         addeq   \base, \base, #32*4                 @ step over unused register space
60 #else
61         VFPFMRX \tmp, MVFR0                         @ Media and VFP Feature Register 0
62         and     \tmp, \tmp, #MVFR0_A_SIMD_MASK      @ A_SIMD field
63         cmp     \tmp, #2                            @ 32 x 64bit registers?
64         vstmiaeq \base!, {d16-d31}
65         addne   \base, \base, #32*4                 @ step over unused register space
66 #endif
67 #endif
68         .endm
This page took 0.034715 seconds and 4 git commands to generate.