@@ -101,77 +101,6 @@ namespace lsp
101101 );
102102 }
103103
104- void pmix_v2 (float *dst, const float *src1, const float *src2, const float *k, size_t count)
105- {
106- ARCH_ARM_ASM
107- (
108- // x16 blocks
109- __ASM_EMIT (" subs %[count], #16" )
110- __ASM_EMIT (" blo 2f" )
111- __ASM_EMIT (" 1:" )
112- __ASM_EMIT (" vldm %[src1]!, {q0-q3}" ) // q0 = d
113- __ASM_EMIT (" vldm %[src2]!, {q4-q7}" ) // q4 = s
114- __ASM_EMIT (" vldm %[k]!, {q8-q11}" ) // q8 = k
115- __ASM_EMIT (" vsub.f32 q4, q4, q0" ) // q4 = s - d
116- __ASM_EMIT (" vsub.f32 q5, q5, q1" )
117- __ASM_EMIT (" vsub.f32 q6, q6, q2" )
118- __ASM_EMIT (" vsub.f32 q7, q7, q3" )
119- __ASM_EMIT (" vmla.f32 q0, q4, q8" ) // q0 = d + (s-d)*k
120- __ASM_EMIT (" vmla.f32 q1, q5, q9" )
121- __ASM_EMIT (" vmla.f32 q2, q6, q10" )
122- __ASM_EMIT (" vmla.f32 q3, q7, q11" )
123- __ASM_EMIT (" subs %[count], #16" )
124- __ASM_EMIT (" vstm %[dst]!, {q0-q3}" )
125- __ASM_EMIT (" bhs 1b" )
126- // x8 block
127- __ASM_EMIT (" 2:" )
128- __ASM_EMIT (" adds %[count], #8" )
129- __ASM_EMIT (" blt 4f" )
130- __ASM_EMIT (" vldm %[src1]!, {q0-q1}" ) // q0 = d
131- __ASM_EMIT (" vldm %[src2]!, {q4-q5}" ) // q4 = s
132- __ASM_EMIT (" vldm %[k]!, {q8-q9}" ) // q8 = k
133- __ASM_EMIT (" vsub.f32 q4, q4, q0" ) // q4 = s - d
134- __ASM_EMIT (" vsub.f32 q5, q5, q1" )
135- __ASM_EMIT (" vmla.f32 q0, q4, q8" ) // q0 = d + (s-d)*k
136- __ASM_EMIT (" vmla.f32 q1, q5, q9" )
137- __ASM_EMIT (" sub %[count], #8" )
138- __ASM_EMIT (" vstm %[dst]!, {q0-q1}" )
139- // x4 blocks
140- __ASM_EMIT (" 4:" )
141- __ASM_EMIT (" adds %[count], #4" )
142- __ASM_EMIT (" blt 6f" )
143- __ASM_EMIT (" vldm %[src1]!, {q0}" ) // q0 = d
144- __ASM_EMIT (" vldm %[src2]!, {q4}" ) // q4 = s
145- __ASM_EMIT (" vldm %[k]!, {q8}" ) // q8 = k
146- __ASM_EMIT (" vsub.f32 q4, q4, q0" ) // q4 = s - d
147- __ASM_EMIT (" vmla.f32 q0, q4, q8" ) // q0 = d + (s-d)*k
148- __ASM_EMIT (" sub %[count], #4" )
149- __ASM_EMIT (" vstm %[dst]!, {q0}" )
150- // x1 blocks
151- __ASM_EMIT (" 6:" )
152- __ASM_EMIT (" adds %[count], #3" )
153- __ASM_EMIT (" blt 8f" )
154- __ASM_EMIT (" 7:" )
155- __ASM_EMIT (" vld1.32 {d0[], d1[]}, [%[src1]]!" ) // q0 = d
156- __ASM_EMIT (" vld1.32 {d8[], d9[]}, [%[src2]]!" ) // q4 = s
157- __ASM_EMIT (" vld1.32 {d16[], d17[]}, [%[k]]!" ) // q8 = k
158- __ASM_EMIT (" vsub.f32 q4, q4, q0" ) // q4 = s - d
159- __ASM_EMIT (" vmla.f32 q0, q4, q8" ) // q0 = d + (s-d)*k
160- __ASM_EMIT (" subs %[count], #1" )
161- __ASM_EMIT (" vst1.32 {d0[0]}, [%[dst]]!" )
162- __ASM_EMIT (" bge 7b" )
163- // end
164- __ASM_EMIT (" 8:" )
165-
166- : [dst] " +r" (dst), [src1] " +r" (src1), [src2] " +r" (src2), [k] " +r" (k),
167- [count] " +r" (count)
168- :
169- : " cc" , " memory" ,
170- " q0" , " q1" , " q2" , " q3" , " q4" , " q5" , " q6" , " q7" ,
171- " q8" , " q9" , " q10" , " q11"
172- );
173- }
174-
175104 void pmix_k1 (float *dst, const float *src, float k, size_t count)
176105 {
177106 ARCH_ARM_ASM
@@ -240,73 +169,6 @@ namespace lsp
240169 );
241170 }
242171
243- void pmix_k2 (float *dst, const float *src1, const float *src2, float k, size_t count)
244- {
245- ARCH_ARM_ASM
246- (
247- // x16 blocks
248- __ASM_EMIT (" subs %[count], #16" )
249- __ASM_EMIT (" vld1.32 {d16[], d17[]}, [%[k]]" ) // q8 = k
250- __ASM_EMIT (" blo 2f" )
251- __ASM_EMIT (" 1:" )
252- __ASM_EMIT (" vldm %[src1]!, {q0-q3}" ) // q0 = d
253- __ASM_EMIT (" vldm %[src2]!, {q4-q7}" ) // q4 = s
254- __ASM_EMIT (" vsub.f32 q4, q4, q0" ) // q4 = s - d
255- __ASM_EMIT (" vsub.f32 q5, q5, q1" )
256- __ASM_EMIT (" vsub.f32 q6, q6, q2" )
257- __ASM_EMIT (" vsub.f32 q7, q7, q3" )
258- __ASM_EMIT (" vmla.f32 q0, q4, q8" ) // q0 = d + (s-d)*k
259- __ASM_EMIT (" vmla.f32 q1, q5, q8" )
260- __ASM_EMIT (" vmla.f32 q2, q6, q8" )
261- __ASM_EMIT (" vmla.f32 q3, q7, q8" )
262- __ASM_EMIT (" subs %[count], #16" )
263- __ASM_EMIT (" vstm %[dst]!, {q0-q3}" )
264- __ASM_EMIT (" bhs 1b" )
265- // x8 block
266- __ASM_EMIT (" 2:" )
267- __ASM_EMIT (" adds %[count], #8" )
268- __ASM_EMIT (" blt 4f" )
269- __ASM_EMIT (" vldm %[src1]!, {q0-q1}" ) // q0 = d
270- __ASM_EMIT (" vldm %[src2]!, {q4-q5}" ) // q4 = s
271- __ASM_EMIT (" vsub.f32 q4, q4, q0" ) // q4 = s - d
272- __ASM_EMIT (" vsub.f32 q5, q5, q1" )
273- __ASM_EMIT (" vmla.f32 q0, q4, q8" ) // q0 = d + (s-d)*k
274- __ASM_EMIT (" vmla.f32 q1, q5, q8" )
275- __ASM_EMIT (" sub %[count], #8" )
276- __ASM_EMIT (" vstm %[dst]!, {q0-q1}" )
277- // x4 blocks
278- __ASM_EMIT (" 4:" )
279- __ASM_EMIT (" adds %[count], #4" )
280- __ASM_EMIT (" blt 6f" )
281- __ASM_EMIT (" vldm %[src1]!, {q0}" ) // q0 = d
282- __ASM_EMIT (" vldm %[src2]!, {q4}" ) // q4 = s
283- __ASM_EMIT (" vsub.f32 q4, q4, q0" ) // q4 = s - d
284- __ASM_EMIT (" vmla.f32 q0, q4, q8" ) // q0 = d + (s-d)*k
285- __ASM_EMIT (" sub %[count], #4" )
286- __ASM_EMIT (" vstm %[dst]!, {q0}" )
287- // x1 blocks
288- __ASM_EMIT (" 6:" )
289- __ASM_EMIT (" adds %[count], #3" )
290- __ASM_EMIT (" blt 8f" )
291- __ASM_EMIT (" 7:" )
292- __ASM_EMIT (" vld1.32 {d0[], d1[]}, [%[src1]]!" ) // q0 = d
293- __ASM_EMIT (" vld1.32 {d8[], d9[]}, [%[src2]]!" ) // q4 = s
294- __ASM_EMIT (" vsub.f32 q4, q4, q0" ) // q4 = s - d
295- __ASM_EMIT (" vmla.f32 q0, q4, q8" ) // q0 = d + (s-d)*k
296- __ASM_EMIT (" subs %[count], #1" )
297- __ASM_EMIT (" vst1.32 {d0[0]}, [%[dst]]!" )
298- __ASM_EMIT (" bge 7b" )
299- // end
300- __ASM_EMIT (" 8:" )
301-
302- : [dst] " +r" (dst), [src1] " +r" (src1), [src2] " +r" (src2),
303- [count] " +r" (count)
304- : [k] " r" (&k)
305- : " cc" , " memory" ,
306- " q0" , " q1" , " q2" , " q3" , " q4" , " q5" , " q6" , " q7" ,
307- " q8"
308- );
309- }
310172 } /* namespace neon_d32 */
311173} /* namespace lsp */
312174
0 commit comments