Module Name:    src
Committed By:   matt
Date:           Fri Dec 27 12:16:01 UTC 2013

Modified Files:
        src/sys/arch/arm/include: armreg.h
        src/sys/arch/arm/vfp: vfp_init.c

Log Message:
Switch to using FP instructions instead of cp10/11 instructions.


To generate a diff of this commit:
cvs rdiff -u -r1.83 -r1.84 src/sys/arch/arm/include/armreg.h
cvs rdiff -u -r1.28 -r1.29 src/sys/arch/arm/vfp/vfp_init.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/include/armreg.h
diff -u src/sys/arch/arm/include/armreg.h:1.83 src/sys/arch/arm/include/armreg.h:1.84
--- src/sys/arch/arm/include/armreg.h:1.83	Sat Sep  7 00:32:33 2013
+++ src/sys/arch/arm/include/armreg.h	Fri Dec 27 12:16:01 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: armreg.h,v 1.83 2013/09/07 00:32:33 matt Exp $	*/
+/*	$NetBSD: armreg.h,v 1.84 2013/12/27 12:16:01 matt Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001 Ben Harris
@@ -650,6 +650,20 @@ static inline void armreg_##name##_write
 	__asm __volatile("mcr " __insnstring :: "r"(__val));	\
 }
 
+#define	ARMREG_READ_INLINE2(name, __insnstring)			\
+static inline uint32_t armreg_##name##_read(void)		\
+{								\
+	uint32_t __rv;						\
+	__asm __volatile(__insnstring : "=r"(__rv));	\
+	return __rv;						\
+}
+
+#define	ARMREG_WRITE_INLINE2(name, __insnstring)		\
+static inline void armreg_##name##_write(uint32_t __val)	\
+{								\
+	__asm __volatile(__insnstring :: "r"(__val));		\
+}
+
 #define	ARMREG_READ64_INLINE(name, __insnstring)		\
 static inline uint64_t armreg_##name##_read(void)		\
 {								\
@@ -665,17 +679,17 @@ static inline void armreg_##name##_write
 }
 
 /* cp10 registers */
-ARMREG_READ_INLINE(fpsid, "p10,7,%0,c0,c0,0") /* VFP System ID */
-ARMREG_READ_INLINE(fpscr, "p10,7,%0,c1,c0,0") /* VFP Status/Control Register */
-ARMREG_WRITE_INLINE(fpscr, "p10,7,%0,c1,c0,0") /* VFP Status/Control Register */
-ARMREG_READ_INLINE(mvfr1, "p10,7,%0,c6,c0,0") /* Media and VFP Feature Register 1 */
-ARMREG_READ_INLINE(mvfr0, "p10,7,%0,c7,c0,0") /* Media and VFP Feature Register 0 */
-ARMREG_READ_INLINE(fpexc, "p10,7,%0,c8,c0,0") /* VFP Exception Register */
-ARMREG_WRITE_INLINE(fpexc, "p10,7,%0,c8,c0,0") /* VFP Exception Register */
-ARMREG_READ_INLINE(fpinst, "p10,7,%0,c9,c0,0") /* VFP Exception Instruction */
-ARMREG_WRITE_INLINE(fpinst, "p10,7,%0,c9,c0,0") /* VFP Exception Instruction */
-ARMREG_READ_INLINE(fpinst2, "p10,7,%0,c10,c0,0") /* VFP Exception Instruction 2 */
-ARMREG_WRITE_INLINE(fpinst2, "p10,7,%0,c10,c0,0") /* VFP Exception Instruction 2 */
+ARMREG_READ_INLINE2(fpsid, "vmrs\t%0, fpsid") /* VFP System ID */
+ARMREG_READ_INLINE2(fpscr, "vmrs\t%0, fpscr") /* VFP Status/Control Register */
+ARMREG_WRITE_INLINE2(fpscr, "vmsr\tfpscr, %0") /* VFP Status/Control Register */
+ARMREG_READ_INLINE2(mvfr1, "vmrs\t%0, mvfr1") /* Media and VFP Feature Register 1 */
+ARMREG_READ_INLINE2(mvfr0, "vmrs\t%0, mvfr0") /* Media and VFP Feature Register 0 */
+ARMREG_READ_INLINE2(fpexc, "vmrs\t%0, fpexc") /* VFP Exception Register */
+ARMREG_WRITE_INLINE2(fpexc, "vmsr\tfpexc, %0") /* VFP Exception Register */
+ARMREG_READ_INLINE2(fpinst, "fmrx\t%0, fpinst") /* VFP Exception Instruction */
+ARMREG_WRITE_INLINE2(fpinst, "fmxr\tfpinst, %0") /* VFP Exception Instruction */
+ARMREG_READ_INLINE2(fpinst2, "fmrx\t%0, fpinst2") /* VFP Exception Instruction 2 */
+ARMREG_WRITE_INLINE2(fpinst2, "fmxr\tfpinst2, %0") /* VFP Exception Instruction 2 */
 
 /* cp15 c0 registers */
 ARMREG_READ_INLINE(midr, "p15,0,%0,c0,c0,0") /* Main ID Register */

Index: src/sys/arch/arm/vfp/vfp_init.c
diff -u src/sys/arch/arm/vfp/vfp_init.c:1.28 src/sys/arch/arm/vfp/vfp_init.c:1.29
--- src/sys/arch/arm/vfp/vfp_init.c:1.28	Sat Dec 14 15:47:18 2013
+++ src/sys/arch/arm/vfp/vfp_init.c	Fri Dec 27 12:16:01 2013
@@ -1,4 +1,4 @@
-/*      $NetBSD: vfp_init.c,v 1.28 2013/12/14 15:47:18 matt Exp $ */
+/*      $NetBSD: vfp_init.c,v 1.29 2013/12/27 12:16:01 matt Exp $ */
 
 /*
  * Copyright (c) 2008 ARM Ltd
@@ -49,19 +49,24 @@ extern int cpu_neon_present;
 
 #ifdef FPU_VFP
 
+#ifdef CPU_CORTEX
+__asm(".fpu\tvfpv4");
+#else
+__asm(".fpu\tvfp");
+#endif
+
 /* FLDMD <X>, {d0-d15} */
 static inline void
 load_vfpregs_lo(const uint64_t *p)
 {
-	/* vldmia rN, {d0-d15} */
-	__asm __volatile("ldc\tp11, c0, [%0], {32}" :: "r" (p) : "memory");
+	__asm __volatile("vldmia %0, {d0-d15}" :: "r" (p) : "memory");
 }
 
 /* FSTMD <X>, {d0-d15} */
 static inline void
 save_vfpregs_lo(uint64_t *p)
 {
-	__asm __volatile("stc\tp11, c0, [%0], {32}" :: "r" (p) : "memory");
+	__asm __volatile("vstmia %0, {d0-d15}" :: "r" (p) : "memory");
 }
 
 #ifdef CPU_CORTEX
@@ -69,14 +74,14 @@ save_vfpregs_lo(uint64_t *p)
 static inline void
 load_vfpregs_hi(const uint64_t *p)
 {
-	__asm __volatile("ldcl\tp11, c0, [%0], {32}" :: "r" (&p[16]) : "memory");
+	__asm __volatile("vldmia\t%0, {d16-d31}" :: "r" (&p[16]) : "memory");
 }
 
 /* FLDMD <X>, {d16-d31} */
 static inline void
 save_vfpregs_hi(uint64_t *p)
 {
-	__asm __volatile("stcl\tp11, c0, [%0], {32}" :: "r" (&p[16]) : "memory");
+	__asm __volatile("vstmia\t%0, {d16-d31}" :: "r" (&p[16]) : "memory");
 }
 #endif
 

Reply via email to