1///*****************************************************************************
2//*
3//* Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
4//*
5//* Licensed under the Apache License, Version 2.0 (the "License");
6//* you may not use this file except in compliance with the License.
7//* You may obtain a copy of the License at:
8//*
9//* http://www.apache.org/licenses/LICENSE-2.0
10//*
11//* Unless required by applicable law or agreed to in writing, software
12//* distributed under the License is distributed on an "AS IS" BASIS,
13//* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14//* See the License for the specific language governing permissions and
15//* limitations under the License.
16//*
17//*****************************************************************************/
18///**
19// *******************************************************************************
20// * ,:file
21// *  ihevc_mem_fns_neon.s
22// *
23// * ,:brief
24// *  Contains function definitions for memory manipulation
25// *
26// * ,:author
27// *     Naveen SR
28// *
29// * ,:par List of Functions:
30// *  - ihevc_memcpy()
31// *  - ihevc_memset_mul_8()
32// *  - ihevc_memset_16bit_mul_8()
33// *
34// * ,:remarks
35// *  None
36// *
37// *******************************************************************************
38//*/
39
40///**
41//*******************************************************************************
42//*
43//* ,:brief
44//*   memcpy of a 1d array
45//*
46//* ,:par Description:
47//*   Does memcpy of 8bit data from source to destination for 8,16 or 32 number of bytes
48//*
49//* ,:param[in] pu1_dst
50//*  UWORD8 pointer to the destination
51//*
52//* ,:param[in] pu1_src
53//*  UWORD8 pointer to the source
54//*
55//* ,:param[in] num_bytes
56//*  number of bytes to copy
57//* ,:returns
58//*
59//* ,:remarks
60//*  None
61//*
62//*******************************************************************************
63//*/
64//void ihevc_memcpy_mul_8(UWORD8 *pu1_dst,
65//                      UWORD8 *pu1_src,
66//                      UWORD8 num_bytes)
67//**************Variables Vs Registers*************************
68//    x0 => *pu1_dst
69//    x1 => *pu1_src
70//    x2 => num_bytes
71
72.text
73.p2align 2
74
75
76    .global ihevc_memcpy_mul_8_av8
77.type ihevc_memcpy_mul_8_av8, %function
78
79ihevc_memcpy_mul_8_av8:
80
81LOOP_NEON_MEMCPY_MUL_8:
82    // Memcpy 8 bytes
83    LD1         {v0.8b},[x1],#8
84    ST1         {v0.8b},[x0],#8
85
86    SUBS        x2,x2,#8
87    BNE         LOOP_NEON_MEMCPY_MUL_8
88    ret
89
90
91
92//*******************************************************************************
93//*/
94//void ihevc_memcpy(UWORD8 *pu1_dst,
95//                  UWORD8 *pu1_src,
96//                  UWORD8 num_bytes)
97//**************Variables Vs Registers*************************
98//    x0 => *pu1_dst
99//    x1 => *pu1_src
100//    x2 => num_bytes
101
102
103
104    .global ihevc_memcpy_av8
105.type ihevc_memcpy_av8, %function
106
107ihevc_memcpy_av8:
108    SUBS        x2,x2,#8
109    BLT         ARM_MEMCPY
110LOOP_NEON_MEMCPY:
111    // Memcpy 8 bytes
112    LD1         {v0.8b},[x1],#8
113    ST1         {v0.8b},[x0],#8
114
115    SUBS        x2,x2,#8
116    BGE         LOOP_NEON_MEMCPY
117    CMP         x2,#-8
118    BEQ         MEMCPY_RETURN
119
120ARM_MEMCPY:
121    ADD         x2,x2,#8
122
123LOOP_ARM_MEMCPY:
124    LDRB        w3,[x1],#1
125    STRB        w3,[x0],#1
126    SUBS        x2,x2,#1
127    BNE         LOOP_ARM_MEMCPY
128MEMCPY_RETURN:
129    ret
130
131
132
133
134//void ihevc_memset_mul_8(UWORD8 *pu1_dst,
135//                       UWORD8 value,
136//                       UWORD8 num_bytes)
137//**************Variables Vs Registers*************************
138//    x0 => *pu1_dst
139//    x1 => value
140//    x2 => num_bytes
141
142.text
143.p2align 2
144
145
146
147    .global ihevc_memset_mul_8_av8
148.type ihevc_memset_mul_8_av8, %function
149
150ihevc_memset_mul_8_av8:
151
152// Assumptions: numbytes is either 8, 16 or 32
153    dup         v0.8b,w1
154LOOP_MEMSET_MUL_8:
155    // Memset 8 bytes
156    ST1         {v0.8b},[x0],#8
157
158    SUBS        x2,x2,#8
159    BNE         LOOP_MEMSET_MUL_8
160
161    ret
162
163
164
165
166//void ihevc_memset(UWORD8 *pu1_dst,
167//                       UWORD8 value,
168//                       UWORD8 num_bytes)
169//**************Variables Vs Registers*************************
170//    x0 => *pu1_dst
171//    x1 => value
172//    x2 => num_bytes
173
174
175
176    .global ihevc_memset_av8
177.type ihevc_memset_av8, %function
178
179ihevc_memset_av8:
180    SUBS        x2,x2,#8
181    BLT         ARM_MEMSET
182    dup         v0.8b,w1
183LOOP_NEON_MEMSET:
184    // Memcpy 8 bytes
185    ST1         {v0.8b},[x0],#8
186
187    SUBS        x2,x2,#8
188    BGE         LOOP_NEON_MEMSET
189    CMP         x2,#-8
190    BEQ         MEMSET_RETURN
191
192ARM_MEMSET:
193    ADD         x2,x2,#8
194
195LOOP_ARM_MEMSET:
196    STRB        w1,[x0],#1
197    SUBS        x2,x2,#1
198    BNE         LOOP_ARM_MEMSET
199
200MEMSET_RETURN:
201    ret
202
203
204
205
206//void ihevc_memset_16bit_mul_8(UWORD16 *pu2_dst,
207//                                      UWORD16 value,
208//                                      UWORD8 num_words)
209//**************Variables Vs Registers*************************
210//    x0 => *pu2_dst
211//    x1 => value
212//    x2 => num_words
213
214.text
215.p2align 2
216
217
218
219    .global ihevc_memset_16bit_mul_8_av8
220.type ihevc_memset_16bit_mul_8_av8, %function
221
222ihevc_memset_16bit_mul_8_av8:
223
224// Assumptions: num_words is either 8, 16 or 32
225
226    // Memset 8 words
227    dup         v0.8h,w1
228LOOP_MEMSET_16BIT_MUL_8:
229    ST1         {v0.8h},[x0],#16
230
231    SUBS        x2,x2,#8
232    BNE         LOOP_MEMSET_16BIT_MUL_8
233
234    ret
235
236
237
238
239//void ihevc_memset_16bit(UWORD16 *pu2_dst,
240//                       UWORD16 value,
241//                       UWORD8 num_words)
242//**************Variables Vs Registers*************************
243//    x0 => *pu2_dst
244//    x1 => value
245//    x2 => num_words
246
247
248
249    .global ihevc_memset_16bit_av8
250.type ihevc_memset_16bit_av8, %function
251
252ihevc_memset_16bit_av8:
253    SUBS        x2,x2,#8
254    BLT         ARM_MEMSET_16BIT
255    dup         v0.8h,w1
256LOOP_NEON_MEMSET_16BIT:
257    // Memset 8 words
258    ST1         {v0.8h},[x0],#16
259
260    SUBS        x2,x2,#8
261    BGE         LOOP_NEON_MEMSET_16BIT
262    CMP         x2,#-8
263    BEQ         MEMSET_16BIT_RETURN
264
265ARM_MEMSET_16BIT:
266    ADD         x2,x2,#8
267
268LOOP_ARM_MEMSET_16BIT:
269    STRH        w1,[x0],#2
270    SUBS        x2,x2,#1
271    BNE         LOOP_ARM_MEMSET_16BIT
272
273MEMSET_16BIT_RETURN:
274    ret
275
276
277
278
279    .section .note.GNU-stack,"",%progbits
280
281