The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.
Dependents: hello SerialTestv11 SerialTestv12 Sierpinski ... more
mbed 2
This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.
Diff: TARGET_RZ_A1H/TOOLCHAIN_ARM_STD/vfp_neon_push_pop.h
- Revision:
- 171:3a7713b1edbc
- Parent:
- 161:aa5281ff4a02
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TARGET_RZ_A1H/TOOLCHAIN_ARM_STD/vfp_neon_push_pop.h Thu Nov 08 11:45:42 2018 +0000 @@ -0,0 +1,166 @@ +#ifndef __VFP_NEON_PUSH_POP_H__ +#define __VFP_NEON_PUSH_POP_H__ + + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ +#pragma push +#pragma arm +static __asm void __vfp_neon_push(void) { + ARM + + VMRS R2,FPSCR + STMDB SP!,{R2,R4} ; Push FPSCR, maintain 8-byte alignment + VSTMDB SP!,{D0-D15} + VSTMDB SP!,{D16-D31} + BX LR +} +#pragma pop + +#pragma push +#pragma arm +static __asm void __vfp_neon_pop(void) { + ARM + + VLDMIA SP!,{D16-D31} + VLDMIA SP!,{D0-D15} + LDR R2,[SP] + VMSR FPSCR,R2 + ADD SP,SP,#8 + BX LR +} +#pragma pop + + +#pragma push +#pragma arm +static __asm void __vfp_push(void) { + ARM + + VMRS R2,FPSCR + STMDB SP!,{R2,R4} ; Push FPSCR, maintain 8-byte alignment + VSTMDB SP!,{D0-D15} + BX LR +} +#pragma pop + +#pragma push +#pragma arm +static __asm void __vfp_pop(void) { + ARM + + VLDMIA SP!,{D0-D15} + LDR R2,[SP] + VMSR FPSCR,R2 + ADD SP,SP,#8 + BX LR +} +#pragma pop + +#elif (defined (__ICCARM__)) /*---------------- ICC Compiler ---------------------*/ + +__arm static inline void __vfp_neon_push(void) { +__asm( + "ARM \n" + "VMRS R2,FPSCR \n" + "STMDB SP!,{R2,R4} \n" // Push FPSCR, maintain 8-byte alignment + "VSTMDB SP!,{D0-D15} \n" + "VSTMDB SP!,{D16-D31} \n" + "BX lr \n" ); +} + +__arm static inline void __vfp_neon_pop(void) { +__asm( + "ARM \n" + "VLDMIA SP!,{D16-D31} \n" + "VLDMIA SP!,{D0-D15} \n" + "LDR R2,[SP] \n" + "VMSR FPSCR,R2 \n" + "ADD SP,SP,#8 \n" + "BX lr \n" ); +} + +__arm static inline void __vfp_push(void) { +__asm( + "ARM \n" + "VMRS R2,FPSCR \n" + "STMDB SP!,{R2,R4} \n" // Push FPSCR, maintain 8-byte alignment + "VSTMDB SP!,{D0-D15} \n" + "BX lr \n" ); +} + +__arm static inline void __vfp_pop(void) { +__asm( + "ARM \n" + "VLDMIA SP!,{D0-D15} \n" + "LDR R2,[SP] \n" + "VMSR FPSCR,R2 \n" + "ADD SP,SP,#8 \n" + "BX lr \n" ); +} + +#elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/ + +__attribute__( ( always_inline ) ) __STATIC_INLINE void __vfp_neon_push(void) +{ + __asm__ volatile ( + ".ARM;" + + "VMRS R2,FPSCR;" + "STMDB SP!,{R2,R4};" // Push FPSCR, maintain 8-byte alignment + "VSTMDB SP!,{D0-D15};" + "VSTMDB SP!,{D16-D31};" + : + : + : ); + return; +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE void __vfp_neon_pop(void) +{ + __asm__ volatile ( + ".ARM;" + + "VLDMIA SP!,{D16-D31};" + "VLDMIA SP!,{D0-D15};" + "LDR R2,[SP];" + "VMSR FPSCR,R2;" + "ADD SP,SP,#8;" + : + : + : ); + return; +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE void __vfp_push(void) +{ + __asm__ volatile ( + ".ARM;" + + "VMRS R2,FPSCR;" + "STMDB SP!,{R2,R4};" // Push FPSCR, maintain 8-byte alignment + "VSTMDB SP!,{D0-D15};" + : + : + : ); + return; +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE void __vfp_pop(void) +{ + __asm__ volatile ( + ".ARM;" + + "VLDMIA SP!,{D0-D15};" + "LDR R2,[SP];" + "VMSR FPSCR,R2;" + "ADD SP,SP,#8;" + : + : + : ); + return; +} + +#endif + +#endif