2005-04-16 15:20:36 -07:00
/*
2008-08-02 10:55:55 +01:00
* arch / arm / include / asm / vfpmacros . h
2005-04-16 15:20:36 -07:00
*
* Assembler - only file containing VFP macros and register definitions .
*/
2010-07-01 13:41:05 +01:00
# include <asm/hwcap.h>
2012-10-02 18:01:25 +01:00
# include <asm/vfp.h>
2005-04-16 15:20:36 -07:00
@ Macros to allow building with old toolkits ( with no VFP support )
. macro VFPFMRX , rd , sysreg , cond
MRC \ cond p10 , 7 , \ rd , \ sysreg , cr0 , 0 @ FMRX \ rd , \ sysreg
. endm
. macro VFPFMXR , sysreg , rd , cond
MCR \ cond p10 , 7 , \ rd , \ sysreg , cr0 , 0 @ FMXR \ sysreg , \ rd
. endm
@ read all the working registers back into the VFP
2007-09-25 15:22:24 +01:00
. macro VFPFLDMIA , base , tmp
2006-04-10 21:32:42 +01:00
# if __LINUX_ARM_ARCH__ < 6
2005-04-16 15:20:36 -07:00
LDC p11 , cr0 , [ \ base ] , # 33 * 4 @ FLDMIAX \ base ! , { d0 - d15 }
2006-04-10 21:32:42 +01:00
# else
LDC p11 , cr0 , [ \ base ] , # 32 * 4 @ FLDMIAD \ base ! , { d0 - d15 }
2007-09-25 15:22:24 +01:00
# endif
# ifdef CONFIG_VFPv3
2010-07-01 13:41:05 +01:00
# if __LINUX_ARM_ARCH__ <= 6
ldr \ tmp , = elf_hwcap @ may not have MVFR regs
ldr \ tmp , [ \ tmp , # 0 ]
2012-10-23 20:32:59 +01:00
tst \ tmp , # HWCAP_VFPD32
ldcnel p11 , cr0 , [ \ base ] , # 32 * 4 @ FLDMIAD \ base ! , { d16 - d31 }
addeq \ base , \ base , # 32 * 4 @ step over unused register space
2010-07-01 13:41:05 +01:00
# else
2007-09-25 15:22:24 +01:00
VFPFMRX \ tmp , MVFR0 @ Media and VFP Feature Register 0
and \ tmp , \ tmp , # MVFR0_A_SIMD_MASK @ A_SIMD field
cmp \ tmp , # 2 @ 32 x 64 bit registers ?
ldceql p11 , cr0 , [ \ base ] , # 32 * 4 @ FLDMIAD \ base ! , { d16 - d31 }
addne \ base , \ base , # 32 * 4 @ step over unused register space
2010-07-01 13:41:05 +01:00
# endif
2006-04-10 21:32:42 +01:00
# endif
2005-04-16 15:20:36 -07:00
. endm
@ write all the working registers out of the VFP
2007-09-25 15:22:24 +01:00
. macro VFPFSTMIA , base , tmp
2006-04-10 21:32:42 +01:00
# if __LINUX_ARM_ARCH__ < 6
2005-04-16 15:20:36 -07:00
STC p11 , cr0 , [ \ base ] , # 33 * 4 @ FSTMIAX \ base ! , { d0 - d15 }
2006-04-10 21:32:42 +01:00
# else
STC p11 , cr0 , [ \ base ] , # 32 * 4 @ FSTMIAD \ base ! , { d0 - d15 }
2007-09-25 15:22:24 +01:00
# endif
# ifdef CONFIG_VFPv3
2010-07-01 13:41:05 +01:00
# if __LINUX_ARM_ARCH__ <= 6
ldr \ tmp , = elf_hwcap @ may not have MVFR regs
ldr \ tmp , [ \ tmp , # 0 ]
2012-10-23 20:32:59 +01:00
tst \ tmp , # HWCAP_VFPD32
stcnel p11 , cr0 , [ \ base ] , # 32 * 4 @ FSTMIAD \ base ! , { d16 - d31 }
addeq \ base , \ base , # 32 * 4 @ step over unused register space
2010-07-01 13:41:05 +01:00
# else
2007-09-25 15:22:24 +01:00
VFPFMRX \ tmp , MVFR0 @ Media and VFP Feature Register 0
and \ tmp , \ tmp , # MVFR0_A_SIMD_MASK @ A_SIMD field
cmp \ tmp , # 2 @ 32 x 64 bit registers ?
stceql p11 , cr0 , [ \ base ] , # 32 * 4 @ FSTMIAD \ base ! , { d16 - d31 }
addne \ base , \ base , # 32 * 4 @ step over unused register space
2010-07-01 13:41:05 +01:00
# endif
2006-04-10 21:32:42 +01:00
# endif
2005-04-16 15:20:36 -07:00
. endm