Commit b92dd30d authored by Catalin Marinas's avatar Catalin Marinas

Add Neon support to ARMv7

This patch enables the use of the Neon extension on ARMv7 (Cortex-A8).
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 4a4dbab9
......@@ -746,6 +746,13 @@ config VFPv3
depends on VFP
default y if CPU_V7
config NEON
bool "NEON Advanced SIMD Extension support"
depends on VFPv3 && CPU_V7
help
Say Y to include support code for NEON, the ARMv7 Advanced SIMD
Extensions.
endmenu
menu "Userspace binary formats"
......
......@@ -484,12 +484,32 @@ __und_usr:
* co-processor instructions. However, we have to watch out
* for the ARM6/ARM7 SWI bug.
*
* Neon is a special case that has to be handled here. Not all
* Neon instructions are co-processor instructions, so we have
* to make a special case of checking for them. Plus, there's
* five groups of them, so we have a table of mask/opcode pairs
* to check against, and if any match then we branch off into the
* Neon handler code.
*
* Emulators may wish to make use of the following registers:
* r0 = instruction opcode.
* r2 = PC+4
* r10 = this threads thread_info structure.
*/
call_fpe:
#ifdef CONFIG_NEON
adr r6, .LCneon_opcodes
2:
ldr r7, [r6],#4 @ mask value
cmp r7, #0
beq 1f @ if mask is 0 then we've done
and r8, r0, r7
ldr r7, [r6],#4 @ opcode bits matching in mask
cmp r8, r7
beq undef_neon @ if == then it's a neon opcode
b 2b
1:
#endif
tst r0, #0x08000000 @ only CDP/CPRT/LDC/STC have bit 27
#if defined(CONFIG_CPU_ARM610) || defined(CONFIG_CPU_ARM710)
and r8, r0, #0x0f000000 @ mask out op-code bits
......@@ -533,6 +553,29 @@ call_fpe:
mov pc, lr @ CP#14 (Debug)
mov pc, lr @ CP#15 (Control)
#ifdef CONFIG_NEON
.align 6
.LCneon_opcodes:
.word 0xfe000000 @ mask
.word 0xf2000000 @ opcode
.word 0x0e000f00 @ mask
.word 0x0c000b00 @ opcode
.word 0xff100000 @ mask
.word 0xf4000000 @ opcode
.word 0x0f000f10 @ mask
.word 0x0e000b10 @ opcode
.word 0x0fe00fd0 @ mask
.word 0x0c400b10 @ opcode
.word 0x00000000 @ mask
.word 0x00000000 @ opcode
#endif
do_fpe:
enable_irq
ldr r4, .LCfp
......@@ -553,6 +596,13 @@ ENTRY(fp_enter)
.word fpundefinstr
.text
#ifdef CONFIG_NEON
undef_neon:
get_thread_info r10
enable_irq
b do_vfp @ Let VFP handler handle this
#endif
fpundefinstr:
mov r0, sp
adr lr, ret_from_exception
......
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