| 
									
										
										
										
											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 64bit 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 64bit 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 |