svn commit: r253400 - head/sys/arm/arm
Andrew Turner
andrew at FreeBSD.org
Tue Jul 16 23:19:06 UTC 2013
Author: andrew
Date: Tue Jul 16 23:19:05 2013
New Revision: 253400
URL: http://svnweb.freebsd.org/changeset/base/253400
Log:
Fix vfp:
- We should check is_d32 to see howmany registers we have
- In vfp_restore mark vfpscr as an output register
Without the second part it appears we can return the incorrect value from
vfp_bounce if the VFP condition flags are set as it may override the
register holding the return value.
Modified:
head/sys/arm/arm/vfp.c
Modified: head/sys/arm/arm/vfp.c
==============================================================================
--- head/sys/arm/arm/vfp.c Tue Jul 16 22:14:26 2013 (r253399)
+++ head/sys/arm/arm/vfp.c Tue Jul 16 23:19:05 2013 (r253400)
@@ -202,21 +202,20 @@ vfp_restore(struct vfp_state *vfpsave)
* form ldcl<c>, and similar for stcleq.
*/
#ifdef __clang__
-#define ldcleq "ldcleq"
-#define stcleq "stcleq"
+#define ldclne "ldclne"
+#define stclne "stclne"
#else
-#define ldcleq "ldceql"
-#define stcleq "stceql"
+#define ldclne "ldcnel"
+#define stclne "stcnel"
#endif
if (vfpsave) {
- __asm __volatile("ldc p10, c0, [%0], #128\n" /* d0-d15 */
- "cmp %0, #0\n" /* -D16 or -D32? */
- ldcleq" p11, c0, [%0], #128\n" /* d16-d31 */
- "addne %0, %0, #128\n" /* skip missing regs */
- "ldr %1, [%0]\n" /* set old vfpscr */
- "mcr p10, 7, %1, cr1, c0, 0\n"
- :: "r" (vfpsave), "r" (vfpscr), "r" (is_d32)
- : "cc");
+ __asm __volatile("ldc p10, c0, [%1], #128\n" /* d0-d15 */
+ "cmp %2, #0\n" /* -D16 or -D32? */
+ ldclne" p11, c0, [%1], #128\n" /* d16-d31 */
+ "addeq %1, %1, #128\n" /* skip missing regs */
+ "ldr %0, [%1]\n" /* set old vfpscr */
+ "mcr p10, 7, %0, cr1, c0, 0\n"
+ : "=&r" (vfpscr) : "r" (vfpsave), "r" (is_d32) : "cc");
PCPU_SET(vfpcthread, PCPU_GET(curthread));
}
}
@@ -238,12 +237,12 @@ vfp_store(struct vfp_state *vfpsave)
tmp = fmrx(VFPEXC); /* Is the vfp enabled? */
if (vfpsave && tmp & VFPEXC_EN) {
__asm __volatile("stc p11, c0, [%1], #128\n" /* d0-d15 */
- "cmp %0, #0\n" /* -D16 or -D32? */
- stcleq" p11, c0, [%1], #128\n" /* d16-d31 */
- "addne %1, %1, #128\n" /* skip missing regs */
+ "cmp %2, #0\n" /* -D16 or -D32? */
+ stclne" p11, c0, [%1], #128\n" /* d16-d31 */
+ "addeq %1, %1, #128\n" /* skip missing regs */
"mrc p10, 7, %0, cr1, c0, 0\n" /* fmxr(VFPSCR) */
"str %0, [%1]\n" /* save vfpscr */
- : "=&r" (vfpscr) : "r" (vfpsave), "r" (is_d32) : "cc");
+ : "=&r" (vfpscr) : "r" (vfpsave), "r" (is_d32) : "cc");
}
#undef ldcleq
#undef stcleq
More information about the svn-src-head
mailing list