1 | #ifndef __VFP_NEON_PUSH_POP_H__
|
---|
2 | #define __VFP_NEON_PUSH_POP_H__
|
---|
3 |
|
---|
4 |
|
---|
5 | #if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
|
---|
6 | /* ARM armcc specific functions */
|
---|
7 | #pragma push
|
---|
8 | #pragma arm
|
---|
9 | static __asm void __vfp_neon_push(void) {
|
---|
10 | ARM
|
---|
11 |
|
---|
12 | VMRS R2,FPSCR
|
---|
13 | STMDB SP!,{R2,R4} ; Push FPSCR, maintain 8-byte alignment
|
---|
14 | VSTMDB SP!,{D0-D15}
|
---|
15 | VSTMDB SP!,{D16-D31}
|
---|
16 | BX LR
|
---|
17 | }
|
---|
18 | #pragma pop
|
---|
19 |
|
---|
20 | #pragma push
|
---|
21 | #pragma arm
|
---|
22 | static __asm void __vfp_neon_pop(void) {
|
---|
23 | ARM
|
---|
24 |
|
---|
25 | VLDMIA SP!,{D16-D31}
|
---|
26 | VLDMIA SP!,{D0-D15}
|
---|
27 | LDR R2,[SP]
|
---|
28 | VMSR FPSCR,R2
|
---|
29 | ADD SP,SP,#8
|
---|
30 | BX LR
|
---|
31 | }
|
---|
32 | #pragma pop
|
---|
33 |
|
---|
34 |
|
---|
35 | #pragma push
|
---|
36 | #pragma arm
|
---|
37 | static __asm void __vfp_push(void) {
|
---|
38 | ARM
|
---|
39 |
|
---|
40 | VMRS R2,FPSCR
|
---|
41 | STMDB SP!,{R2,R4} ; Push FPSCR, maintain 8-byte alignment
|
---|
42 | VSTMDB SP!,{D0-D15}
|
---|
43 | BX LR
|
---|
44 | }
|
---|
45 | #pragma pop
|
---|
46 |
|
---|
47 | #pragma push
|
---|
48 | #pragma arm
|
---|
49 | static __asm void __vfp_pop(void) {
|
---|
50 | ARM
|
---|
51 |
|
---|
52 | VLDMIA SP!,{D0-D15}
|
---|
53 | LDR R2,[SP]
|
---|
54 | VMSR FPSCR,R2
|
---|
55 | ADD SP,SP,#8
|
---|
56 | BX LR
|
---|
57 | }
|
---|
58 | #pragma pop
|
---|
59 |
|
---|
60 | #elif (defined (__ICCARM__)) /*---------------- ICC Compiler ---------------------*/
|
---|
61 |
|
---|
62 | __arm static inline void __vfp_neon_push(void) {
|
---|
63 | __asm(
|
---|
64 | "ARM \n"
|
---|
65 | "VMRS R2,FPSCR \n"
|
---|
66 | "STMDB SP!,{R2,R4} \n" // Push FPSCR, maintain 8-byte alignment
|
---|
67 | "VSTMDB SP!,{D0-D15} \n"
|
---|
68 | "VSTMDB SP!,{D16-D31} \n"
|
---|
69 | "BX lr \n" );
|
---|
70 | }
|
---|
71 |
|
---|
72 | __arm static inline void __vfp_neon_pop(void) {
|
---|
73 | __asm(
|
---|
74 | "ARM \n"
|
---|
75 | "VLDMIA SP!,{D16-D31} \n"
|
---|
76 | "VLDMIA SP!,{D0-D15} \n"
|
---|
77 | "LDR R2,[SP] \n"
|
---|
78 | "VMSR FPSCR,R2 \n"
|
---|
79 | "ADD SP,SP,#8 \n"
|
---|
80 | "BX lr \n" );
|
---|
81 | }
|
---|
82 |
|
---|
83 | __arm static inline void __vfp_push(void) {
|
---|
84 | __asm(
|
---|
85 | "ARM \n"
|
---|
86 | "VMRS R2,FPSCR \n"
|
---|
87 | "STMDB SP!,{R2,R4} \n" // Push FPSCR, maintain 8-byte alignment
|
---|
88 | "VSTMDB SP!,{D0-D15} \n"
|
---|
89 | "BX lr \n" );
|
---|
90 | }
|
---|
91 |
|
---|
92 | __arm static inline void __vfp_pop(void) {
|
---|
93 | __asm(
|
---|
94 | "ARM \n"
|
---|
95 | "VLDMIA SP!,{D0-D15} \n"
|
---|
96 | "LDR R2,[SP] \n"
|
---|
97 | "VMSR FPSCR,R2 \n"
|
---|
98 | "ADD SP,SP,#8 \n"
|
---|
99 | "BX lr \n" );
|
---|
100 | }
|
---|
101 |
|
---|
102 | #elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/
|
---|
103 |
|
---|
104 | __attribute__( ( always_inline ) ) __STATIC_INLINE void __vfp_neon_push(void)
|
---|
105 | {
|
---|
106 | __asm__ volatile (
|
---|
107 | ".ARM;"
|
---|
108 |
|
---|
109 | "VMRS R2,FPSCR;"
|
---|
110 | "STMDB SP!,{R2,R4};" // Push FPSCR, maintain 8-byte alignment
|
---|
111 | "VSTMDB SP!,{D0-D15};"
|
---|
112 | "VSTMDB SP!,{D16-D31};"
|
---|
113 | :
|
---|
114 | :
|
---|
115 | : );
|
---|
116 | return;
|
---|
117 | }
|
---|
118 |
|
---|
119 | __attribute__( ( always_inline ) ) __STATIC_INLINE void __vfp_neon_pop(void)
|
---|
120 | {
|
---|
121 | __asm__ volatile (
|
---|
122 | ".ARM;"
|
---|
123 |
|
---|
124 | "VLDMIA SP!,{D16-D31};"
|
---|
125 | "VLDMIA SP!,{D0-D15};"
|
---|
126 | "LDR R2,[SP];"
|
---|
127 | "VMSR FPSCR,R2;"
|
---|
128 | "ADD SP,SP,#8;"
|
---|
129 | :
|
---|
130 | :
|
---|
131 | : );
|
---|
132 | return;
|
---|
133 | }
|
---|
134 |
|
---|
135 | __attribute__( ( always_inline ) ) __STATIC_INLINE void __vfp_push(void)
|
---|
136 | {
|
---|
137 | __asm__ volatile (
|
---|
138 | ".ARM;"
|
---|
139 |
|
---|
140 | "VMRS R2,FPSCR;"
|
---|
141 | "STMDB SP!,{R2,R4};" // Push FPSCR, maintain 8-byte alignment
|
---|
142 | "VSTMDB SP!,{D0-D15};"
|
---|
143 | :
|
---|
144 | :
|
---|
145 | : );
|
---|
146 | return;
|
---|
147 | }
|
---|
148 |
|
---|
149 | __attribute__( ( always_inline ) ) __STATIC_INLINE void __vfp_pop(void)
|
---|
150 | {
|
---|
151 | __asm__ volatile (
|
---|
152 | ".ARM;"
|
---|
153 |
|
---|
154 | "VLDMIA SP!,{D0-D15};"
|
---|
155 | "LDR R2,[SP];"
|
---|
156 | "VMSR FPSCR,R2;"
|
---|
157 | "ADD SP,SP,#8;"
|
---|
158 | :
|
---|
159 | :
|
---|
160 | : );
|
---|
161 | return;
|
---|
162 | }
|
---|
163 |
|
---|
164 | #endif
|
---|
165 |
|
---|
166 | #endif
|
---|