Commit 850c33a8 authored by Catalin Marinas's avatar Catalin Marinas

Thumb-2: Implement the unified VFP support

This patch modifies the VFP files for the ARM/Thumb-2 unified
assembler syntax.
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 1d082a19
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
* r10 = thread_info structure * r10 = thread_info structure
* lr = failure return * lr = failure return
*/ */
#include <asm/unified.h>
#include <linux/linkage.h> #include <linux/linkage.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
...@@ -33,6 +35,7 @@ ENTRY(vfp_null_entry) ...@@ -33,6 +35,7 @@ ENTRY(vfp_null_entry)
mov pc, lr mov pc, lr
ENDPROC(vfp_null_entry) ENDPROC(vfp_null_entry)
.align 2
.LCvfp: .LCvfp:
.word vfp_vector .word vfp_vector
...@@ -46,6 +49,7 @@ ENTRY(vfp_testing_entry) ...@@ -46,6 +49,7 @@ ENTRY(vfp_testing_entry)
mov pc, r9 @ we have handled the fault mov pc, r9 @ we have handled the fault
ENDPROC(vfp_testing_entry) ENDPROC(vfp_testing_entry)
.align 2
VFP_arch_address: VFP_arch_address:
.word VFP_arch .word VFP_arch
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#include <asm/unified.h>
static inline u32 vfp_shiftright32jamming(u32 val, unsigned int shift) static inline u32 vfp_shiftright32jamming(u32 val, unsigned int shift)
{ {
...@@ -37,6 +38,7 @@ static inline u32 vfp_hi64to32jamming(u64 val) ...@@ -37,6 +38,7 @@ static inline u32 vfp_hi64to32jamming(u64 val)
asm( asm(
"cmp %Q1, #1 @ vfp_hi64to32jamming\n\t" "cmp %Q1, #1 @ vfp_hi64to32jamming\n\t"
"ite cc\n\t"
"movcc %0, %R1\n\t" "movcc %0, %R1\n\t"
"orrcs %0, %R1, #1" "orrcs %0, %R1, #1"
: "=r" (v) : "r" (val) : "cc"); : "=r" (v) : "r" (val) : "cc");
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
* r10 points at the start of the private FP workspace in the thread structure * r10 points at the start of the private FP workspace in the thread structure
* sp points to a struct pt_regs (as defined in include/asm/proc/ptrace.h) * sp points to a struct pt_regs (as defined in include/asm/proc/ptrace.h)
*/ */
#include <asm/unified.h>
#include <asm/thread_info.h> #include <asm/thread_info.h>
#include <asm/vfpmacros.h> #include <asm/vfpmacros.h>
#include "../kernel/entry-header.S" #include "../kernel/entry-header.S"
...@@ -101,8 +103,10 @@ ENTRY(vfp_support_entry) ...@@ -101,8 +103,10 @@ ENTRY(vfp_support_entry)
VFPFSTMIA r4, r5 @ save the working registers VFPFSTMIA r4, r5 @ save the working registers
VFPFMRX r5, FPSCR @ current status VFPFMRX r5, FPSCR @ current status
tst r1, #FPEXC_EX @ is there additional state to save? tst r1, #FPEXC_EX @ is there additional state to save?
itt ne
VFPFMRX r6, FPINST, NE @ FPINST (only if FPEXC.EX is set) VFPFMRX r6, FPINST, NE @ FPINST (only if FPEXC.EX is set)
tstne r1, #FPEXC_FP2V @ is there an FPINST2 to read? tstne r1, #FPEXC_FP2V @ is there an FPINST2 to read?
it ne
VFPFMRX r8, FPINST2, NE @ FPINST2 if needed (and present) VFPFMRX r8, FPINST2, NE @ FPINST2 if needed (and present)
stmia r4, {r1, r5, r6, r8} @ save FPEXC, FPSCR, FPINST, FPINST2 stmia r4, {r1, r5, r6, r8} @ save FPEXC, FPSCR, FPINST, FPINST2
@ and point r4 at the word at the @ and point r4 at the word at the
...@@ -117,8 +121,10 @@ no_old_VFP_process: ...@@ -117,8 +121,10 @@ no_old_VFP_process:
@ FPEXC is in a safe state @ FPEXC is in a safe state
ldmia r10, {r1, r5, r6, r8} @ load FPEXC, FPSCR, FPINST, FPINST2 ldmia r10, {r1, r5, r6, r8} @ load FPEXC, FPSCR, FPINST, FPINST2
tst r1, #FPEXC_EX @ is there additional state to restore? tst r1, #FPEXC_EX @ is there additional state to restore?
itt ne
VFPFMXR FPINST, r6, NE @ restore FPINST (only if FPEXC.EX is set) VFPFMXR FPINST, r6, NE @ restore FPINST (only if FPEXC.EX is set)
tstne r1, #FPEXC_FP2V @ is there an FPINST2 to write? tstne r1, #FPEXC_FP2V @ is there an FPINST2 to write?
it ne
VFPFMXR FPINST2, r8, NE @ FPINST2 if needed (and present) VFPFMXR FPINST2, r8, NE @ FPINST2 if needed (and present)
VFPFMXR FPSCR, r5 @ restore status VFPFMXR FPSCR, r5 @ restore status
...@@ -175,8 +181,10 @@ ENTRY(vfp_save_state) ...@@ -175,8 +181,10 @@ ENTRY(vfp_save_state)
VFPFSTMIA r0, r2 @ save the working registers VFPFSTMIA r0, r2 @ save the working registers
VFPFMRX r2, FPSCR @ current status VFPFMRX r2, FPSCR @ current status
tst r1, #FPEXC_EX @ is there additional state to save? tst r1, #FPEXC_EX @ is there additional state to save?
itt ne
VFPFMRX r3, FPINST, NE @ FPINST (only if FPEXC.EX is set) VFPFMRX r3, FPINST, NE @ FPINST (only if FPEXC.EX is set)
tstne r1, #FPEXC_FP2V @ is there an FPINST2 to read? tstne r1, #FPEXC_FP2V @ is there an FPINST2 to read?
it ne
VFPFMRX r12, FPINST2, NE @ FPINST2 if needed (and present) VFPFMRX r12, FPINST2, NE @ FPINST2 if needed (and present)
stmia r0, {r1, r2, r3, r12} @ save FPEXC, FPSCR, FPINST, FPINST2 stmia r0, {r1, r2, r3, r12} @ save FPEXC, FPSCR, FPINST, FPINST2
mov pc, lr mov pc, lr
......
...@@ -6,11 +6,11 @@ ...@@ -6,11 +6,11 @@
#include "vfp.h" #include "vfp.h"
@ Macros to allow building with old toolkits (with no VFP support) @ Macros to allow building with old toolkits (with no VFP support)
.macro VFPFMRX, rd, sysreg, cond .macro VFPFMRX, rd, sysreg, cond = al
MRC\cond p10, 7, \rd, \sysreg, cr0, 0 @ FMRX \rd, \sysreg MRC\cond p10, 7, \rd, \sysreg, cr0, 0 @ FMRX \rd, \sysreg
.endm .endm
.macro VFPFMXR, sysreg, rd, cond .macro VFPFMXR, sysreg, rd, cond = al
MCR\cond p10, 7, \rd, \sysreg, cr0, 0 @ FMXR \sysreg, \rd MCR\cond p10, 7, \rd, \sysreg, cr0, 0 @ FMXR \sysreg, \rd
.endm .endm
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0 VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0
and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field
cmp \tmp, #2 @ 32 x 64bit registers? cmp \tmp, #2 @ 32 x 64bit registers?
ite eq
ldceql p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31} ldceql p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31}
addne \base, \base, #32*4 @ step over unused register space addne \base, \base, #32*4 @ step over unused register space
#endif #endif
...@@ -41,6 +42,7 @@ ...@@ -41,6 +42,7 @@
VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0 VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0
and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field
cmp \tmp, #2 @ 32 x 64bit registers? cmp \tmp, #2 @ 32 x 64bit registers?
ite eq
stceql p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31} stceql p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31}
addne \base, \base, #32*4 @ step over unused register space addne \base, \base, #32*4 @ step over unused register space
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment