xref: /OK3568_Linux_fs/kernel/sound/soc/rockchip/vad_preprocess_arm64.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun/*
3*4882a593Smuzhiyun * Rockchip VAD Preprocess
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2018 Fuzhou Rockchip Electronics Co., Ltd
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun	.arch armv8-a
10*4882a593Smuzhiyun	.file	"vad_preprocess_arm64.S"
11*4882a593Smuzhiyun	.text
12*4882a593Smuzhiyun	.align	2
13*4882a593Smuzhiyun	.global	vad_preprocess_init
14*4882a593Smuzhiyun	.type	vad_preprocess_init, %function
15*4882a593Smuzhiyunvad_preprocess_init:
16*4882a593Smuzhiyun	adrp	x2, .LANCHOR0
17*4882a593Smuzhiyun	add	x1, x2, :lo12:.LANCHOR0
18*4882a593Smuzhiyun	ldr	w3, [x0, 8]
19*4882a593Smuzhiyun	strh	w3, [x2, #:lo12:.LANCHOR0]
20*4882a593Smuzhiyun	ldr	w2, [x0, 4]
21*4882a593Smuzhiyun	strh	w2, [x1, 2]
22*4882a593Smuzhiyun	ldr	w2, [x0, 12]
23*4882a593Smuzhiyun	strh	w2, [x1, 4]
24*4882a593Smuzhiyun	ldr	w2, [x0]
25*4882a593Smuzhiyun	strh	w2, [x1, 6]
26*4882a593Smuzhiyun	ldr	w2, [x0, 16]
27*4882a593Smuzhiyun	and	w0, w2, 511
28*4882a593Smuzhiyun	tbz	x2, 9, .L2
29*4882a593Smuzhiyun	mvn	w0, w0
30*4882a593Smuzhiyun.L2:
31*4882a593Smuzhiyun	strh	w0, [x1, 8]
32*4882a593Smuzhiyun	ret
33*4882a593Smuzhiyun	.size	vad_preprocess_init, .-vad_preprocess_init
34*4882a593Smuzhiyun	.align	2
35*4882a593Smuzhiyun	.global	vad_preprocess
36*4882a593Smuzhiyun	.type	vad_preprocess, %function
37*4882a593Smuzhiyunvad_preprocess:
38*4882a593Smuzhiyun	adrp	x4, .LANCHOR0
39*4882a593Smuzhiyun	add	x2, x4, :lo12:.LANCHOR0
40*4882a593Smuzhiyun	mov	w8, 15349
41*4882a593Smuzhiyun	ldrsh	w1, [x2, 8]
42*4882a593Smuzhiyun	ldrsh	w7, [x2, 10]
43*4882a593Smuzhiyun	ldrsh	w6, [x2, 12]
44*4882a593Smuzhiyun	ldrsh	w3, [x2, 16]
45*4882a593Smuzhiyun	mul	w0, w1, w0
46*4882a593Smuzhiyun	mov	w1, 32
47*4882a593Smuzhiyun	sdiv	w0, w0, w1
48*4882a593Smuzhiyun	ldrsh	w1, [x2, 14]
49*4882a593Smuzhiyun	mov	w2, -30697
50*4882a593Smuzhiyun	mul	w2, w7, w2
51*4882a593Smuzhiyun	mul	w5, w0, w8
52*4882a593Smuzhiyun	sxtw	x2, w2
53*4882a593Smuzhiyun	add	x2, x2, w5, sxtw
54*4882a593Smuzhiyun	smaddl	x3, w3, w8, x2
55*4882a593Smuzhiyun	mov	w2, -30632
56*4882a593Smuzhiyun	smsubl	x2, w6, w2, x3
57*4882a593Smuzhiyun	mov	w3, 14379
58*4882a593Smuzhiyun	smsubl	x1, w1, w3, x2
59*4882a593Smuzhiyun	cmp	x1, 0
60*4882a593Smuzhiyun	ble	.L5
61*4882a593Smuzhiyun	add	x1, x1, 8192
62*4882a593Smuzhiyun	asr	x1, x1, 14
63*4882a593Smuzhiyun.L6:
64*4882a593Smuzhiyun	add	x2, x4, :lo12:.LANCHOR0
65*4882a593Smuzhiyun	sxth	w1, w1
66*4882a593Smuzhiyun	cmp	w1, 0
67*4882a593Smuzhiyun	ldrh	w3, [x2, 18]
68*4882a593Smuzhiyun	strh	w0, [x2, 10]
69*4882a593Smuzhiyun	add	w3, w3, 1
70*4882a593Smuzhiyun	ldr	w0, [x2, 20]
71*4882a593Smuzhiyun	sxth	w3, w3
72*4882a593Smuzhiyun	strh	w1, [x2, 12]
73*4882a593Smuzhiyun	csneg	w1, w1, w1, ge
74*4882a593Smuzhiyun	strh	w3, [x2, 18]
75*4882a593Smuzhiyun	negs	w5, w3
76*4882a593Smuzhiyun	add	w0, w1, w0
77*4882a593Smuzhiyun	strh	w7, [x2, 16]
78*4882a593Smuzhiyun	and	w3, w3, 255
79*4882a593Smuzhiyun	strh	w6, [x2, 14]
80*4882a593Smuzhiyun	and	w5, w5, 255
81*4882a593Smuzhiyun	str	w0, [x2, 20]
82*4882a593Smuzhiyun	csneg	w3, w3, w5, mi
83*4882a593Smuzhiyun	cbnz	w3, .L7
84*4882a593Smuzhiyun	ldr	w3, [x2, 24]
85*4882a593Smuzhiyun	cmp	w3, 99
86*4882a593Smuzhiyun	bgt	.L8
87*4882a593Smuzhiyun	add	w0, w0, 128
88*4882a593Smuzhiyun	mov	w5, 256
89*4882a593Smuzhiyun	add	x2, x2, 32
90*4882a593Smuzhiyun	sdiv	w0, w0, w5
91*4882a593Smuzhiyun	strh	w0, [x2, w3, sxtw 1]
92*4882a593Smuzhiyun.L9:
93*4882a593Smuzhiyun	add	x2, x4, :lo12:.LANCHOR0
94*4882a593Smuzhiyun	cmp	w3, 99
95*4882a593Smuzhiyun	ldrsh	w0, [x2, 32]
96*4882a593Smuzhiyun	bgt	.L11
97*4882a593Smuzhiyun	add	x2, x2, 32
98*4882a593Smuzhiyun	mov	x5, 0
99*4882a593Smuzhiyun.L12:
100*4882a593Smuzhiyun	add	x5, x5, 1
101*4882a593Smuzhiyun	cmp	w3, w5
102*4882a593Smuzhiyun	bgt	.L13
103*4882a593Smuzhiyun.L14:
104*4882a593Smuzhiyun	add	x2, x4, :lo12:.LANCHOR0
105*4882a593Smuzhiyun	mov	w6, 230
106*4882a593Smuzhiyun	add	w3, w3, 1
107*4882a593Smuzhiyun	ldrsh	w5, [x2, 6]
108*4882a593Smuzhiyun	strh	wzr, [x2, 18]
109*4882a593Smuzhiyun	stp	wzr, w3, [x2, 20]
110*4882a593Smuzhiyun	mul	w5, w5, w6
111*4882a593Smuzhiyun	mov	w6, 26
112*4882a593Smuzhiyun	add	w5, w5, 128
113*4882a593Smuzhiyun	madd	w0, w0, w6, w5
114*4882a593Smuzhiyun	mov	w5, 256
115*4882a593Smuzhiyun	sdiv	w0, w0, w5
116*4882a593Smuzhiyun	strh	w0, [x2, 6]
117*4882a593Smuzhiyun.L7:
118*4882a593Smuzhiyun	add	x0, x4, :lo12:.LANCHOR0
119*4882a593Smuzhiyun	ldrsh	w3, [x4, #:lo12:.LANCHOR0]
120*4882a593Smuzhiyun	ldrsh	w2, [x0, 6]
121*4882a593Smuzhiyun	ldrsh	w5, [x0, 2]
122*4882a593Smuzhiyun	madd	w2, w2, w5, w3
123*4882a593Smuzhiyun	cmp	w1, w2
124*4882a593Smuzhiyun	ble	.L16
125*4882a593Smuzhiyun	ldrh	w1, [x0, 432]
126*4882a593Smuzhiyun	add	w1, w1, 1
127*4882a593Smuzhiyun	sxth	w1, w1
128*4882a593Smuzhiyun	strh	w1, [x0, 432]
129*4882a593Smuzhiyun	ldrsh	w0, [x0, 4]
130*4882a593Smuzhiyun	cmp	w0, w1
131*4882a593Smuzhiyun	cset	w0, lt
132*4882a593Smuzhiyun	ret
133*4882a593Smuzhiyun.L5:
134*4882a593Smuzhiyun	sub	x1, x1, #8192
135*4882a593Smuzhiyun	mov	x2, 16384
136*4882a593Smuzhiyun	sdiv	x1, x1, x2
137*4882a593Smuzhiyun	b	.L6
138*4882a593Smuzhiyun.L8:
139*4882a593Smuzhiyun	add	x5, x2, 34
140*4882a593Smuzhiyun	add	x2, x2, 232
141*4882a593Smuzhiyun.L10:
142*4882a593Smuzhiyun	ldrh	w6, [x5]
143*4882a593Smuzhiyun	add	x5, x5, 2
144*4882a593Smuzhiyun	strh	w6, [x5, -4]
145*4882a593Smuzhiyun	cmp	x2, x5
146*4882a593Smuzhiyun	bne	.L10
147*4882a593Smuzhiyun	add	w0, w0, 128
148*4882a593Smuzhiyun	mov	w5, 256
149*4882a593Smuzhiyun	add	x2, x4, :lo12:.LANCHOR0
150*4882a593Smuzhiyun	sdiv	w0, w0, w5
151*4882a593Smuzhiyun	strh	w0, [x2, 230]
152*4882a593Smuzhiyun	b	.L9
153*4882a593Smuzhiyun.L13:
154*4882a593Smuzhiyun	lsl	x6, x5, 1
155*4882a593Smuzhiyun	ldrsh	w7, [x6, x2]
156*4882a593Smuzhiyun	ldrh	w6, [x6, x2]
157*4882a593Smuzhiyun	cmp	w7, w0
158*4882a593Smuzhiyun	csel	w0, w6, w0, le
159*4882a593Smuzhiyun	sxth	w0, w0
160*4882a593Smuzhiyun	b	.L12
161*4882a593Smuzhiyun.L11:
162*4882a593Smuzhiyun	add	x5, x2, 34
163*4882a593Smuzhiyun	add	x2, x2, 232
164*4882a593Smuzhiyun.L15:
165*4882a593Smuzhiyun	ldrsh	w7, [x5]
166*4882a593Smuzhiyun	ldrh	w6, [x5], 2
167*4882a593Smuzhiyun	cmp	w7, w0
168*4882a593Smuzhiyun	csel	w0, w6, w0, le
169*4882a593Smuzhiyun	cmp	x2, x5
170*4882a593Smuzhiyun	sxth	w0, w0
171*4882a593Smuzhiyun	bne	.L15
172*4882a593Smuzhiyun	b	.L14
173*4882a593Smuzhiyun.L16:
174*4882a593Smuzhiyun	strh	wzr, [x0, 432]
175*4882a593Smuzhiyun	mov	w0, 0
176*4882a593Smuzhiyun	ret
177*4882a593Smuzhiyun	.size	vad_preprocess, .-vad_preprocess
178*4882a593Smuzhiyun	.align	2
179*4882a593Smuzhiyun	.global	vad_preprocess_destroy
180*4882a593Smuzhiyun	.type	vad_preprocess_destroy, %function
181*4882a593Smuzhiyunvad_preprocess_destroy:
182*4882a593Smuzhiyun	adrp	x0, .LANCHOR0
183*4882a593Smuzhiyun	add	x0, x0, :lo12:.LANCHOR0
184*4882a593Smuzhiyun	add	x2, x0, 32
185*4882a593Smuzhiyun	mov	x1, 0
186*4882a593Smuzhiyun	strh	wzr, [x0, 10]
187*4882a593Smuzhiyun	strh	wzr, [x0, 16]
188*4882a593Smuzhiyun	strh	wzr, [x0, 12]
189*4882a593Smuzhiyun	strh	wzr, [x0, 14]
190*4882a593Smuzhiyun	strh	wzr, [x0, 18]
191*4882a593Smuzhiyun	strh	wzr, [x0, 432]
192*4882a593Smuzhiyun.L21:
193*4882a593Smuzhiyun	strh	wzr, [x1, x2]
194*4882a593Smuzhiyun	add	x1, x1, 2
195*4882a593Smuzhiyun	cmp	x1, 200
196*4882a593Smuzhiyun	bne	.L21
197*4882a593Smuzhiyun	mov	w1, 32
198*4882a593Smuzhiyun	strh	wzr, [x0, 6]
199*4882a593Smuzhiyun	strh	w1, [x0, 8]
200*4882a593Smuzhiyun	stp	wzr, wzr, [x0, 20]
201*4882a593Smuzhiyun	ret
202*4882a593Smuzhiyun	.size	vad_preprocess_destroy, .-vad_preprocess_destroy
203*4882a593Smuzhiyun	.align	2
204*4882a593Smuzhiyun	.global	vad_preprocess_update_params
205*4882a593Smuzhiyun	.type	vad_preprocess_update_params, %function
206*4882a593Smuzhiyunvad_preprocess_update_params:
207*4882a593Smuzhiyun	adrp	x1, .LANCHOR0+6
208*4882a593Smuzhiyun	ldrsh	w1, [x1, #:lo12:.LANCHOR0+6]
209*4882a593Smuzhiyun	str	w1, [x0]
210*4882a593Smuzhiyun	ret
211*4882a593Smuzhiyun	.size	vad_preprocess_update_params, .-vad_preprocess_update_params
212*4882a593Smuzhiyun	.bss
213*4882a593Smuzhiyun	.align	3
214*4882a593Smuzhiyun	.set	.LANCHOR0,. + 0
215*4882a593Smuzhiyun	.type	g_sound_thd, %object
216*4882a593Smuzhiyun	.size	g_sound_thd, 2
217*4882a593Smuzhiyung_sound_thd:
218*4882a593Smuzhiyun	.zero	2
219*4882a593Smuzhiyun	.type	g_noise_level, %object
220*4882a593Smuzhiyun	.size	g_noise_level, 2
221*4882a593Smuzhiyung_noise_level:
222*4882a593Smuzhiyun	.zero	2
223*4882a593Smuzhiyun	.type	g_vad_con_thd, %object
224*4882a593Smuzhiyun	.size	g_vad_con_thd, 2
225*4882a593Smuzhiyung_vad_con_thd:
226*4882a593Smuzhiyun	.zero	2
227*4882a593Smuzhiyun	.type	g_noise_abs, %object
228*4882a593Smuzhiyun	.size	g_noise_abs, 2
229*4882a593Smuzhiyung_noise_abs:
230*4882a593Smuzhiyun	.zero	2
231*4882a593Smuzhiyun	.type	g_signal_gain, %object
232*4882a593Smuzhiyun	.size	g_signal_gain, 2
233*4882a593Smuzhiyung_signal_gain:
234*4882a593Smuzhiyun	.zero	2
235*4882a593Smuzhiyun	.type	g_xn_1, %object
236*4882a593Smuzhiyun	.size	g_xn_1, 2
237*4882a593Smuzhiyung_xn_1:
238*4882a593Smuzhiyun	.zero	2
239*4882a593Smuzhiyun	.type	g_yn_1, %object
240*4882a593Smuzhiyun	.size	g_yn_1, 2
241*4882a593Smuzhiyung_yn_1:
242*4882a593Smuzhiyun	.zero	2
243*4882a593Smuzhiyun	.type	g_yn_2, %object
244*4882a593Smuzhiyun	.size	g_yn_2, 2
245*4882a593Smuzhiyung_yn_2:
246*4882a593Smuzhiyun	.zero	2
247*4882a593Smuzhiyun	.type	g_xn_2, %object
248*4882a593Smuzhiyun	.size	g_xn_2, 2
249*4882a593Smuzhiyung_xn_2:
250*4882a593Smuzhiyun	.zero	2
251*4882a593Smuzhiyun	.type	g_sample_cnt, %object
252*4882a593Smuzhiyun	.size	g_sample_cnt, 2
253*4882a593Smuzhiyung_sample_cnt:
254*4882a593Smuzhiyun	.zero	2
255*4882a593Smuzhiyun	.type	g_sum_abs_frm, %object
256*4882a593Smuzhiyun	.size	g_sum_abs_frm, 4
257*4882a593Smuzhiyung_sum_abs_frm:
258*4882a593Smuzhiyun	.zero	4
259*4882a593Smuzhiyun	.type	frm_count, %object
260*4882a593Smuzhiyun	.size	frm_count, 4
261*4882a593Smuzhiyunfrm_count:
262*4882a593Smuzhiyun	.zero	4
263*4882a593Smuzhiyun	.zero	4
264*4882a593Smuzhiyun	.type	g_ave_abs_rec, %object
265*4882a593Smuzhiyun	.size	g_ave_abs_rec, 400
266*4882a593Smuzhiyung_ave_abs_rec:
267*4882a593Smuzhiyun	.zero	400
268*4882a593Smuzhiyun	.type	g_vad_cnt, %object
269*4882a593Smuzhiyun	.size	g_vad_cnt, 2
270*4882a593Smuzhiyung_vad_cnt:
271*4882a593Smuzhiyun	.zero	2
272*4882a593Smuzhiyun	.ident	"GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404"
273*4882a593Smuzhiyun	.section	.note.GNU-stack,"",@progbits
274