xref: /aosp_15_r20/external/fec/peakval_sse_assist.s (revision 638691a093b4f9473cd6ee8f3e0139deef159a86)
1*638691a0SAndroid Build Coastguard Worker# SSE assist routines for peakval
2*638691a0SAndroid Build Coastguard Worker# Copyright 2001 Phil Karn, KA9Q
3*638691a0SAndroid Build Coastguard Worker# May be used under the terms of the GNU Lesser General Public License (LGPL)
4*638691a0SAndroid Build Coastguard Worker
5*638691a0SAndroid Build Coastguard Worker	.text
6*638691a0SAndroid Build Coastguard Worker
7*638691a0SAndroid Build Coastguard Worker# Find peak absolute value in signed 16-bit input samples
8*638691a0SAndroid Build Coastguard Worker#  int peakval_sse_assist(signed short *in,int cnt);
9*638691a0SAndroid Build Coastguard Worker	.global peakval_sse_assist
10*638691a0SAndroid Build Coastguard Worker	.type peakval_sse_assist,@function
11*638691a0SAndroid Build Coastguard Worker	.align 16
12*638691a0SAndroid Build Coastguard Workerpeakval_sse_assist:
13*638691a0SAndroid Build Coastguard Worker	pushl %ebp
14*638691a0SAndroid Build Coastguard Worker	movl %esp,%ebp
15*638691a0SAndroid Build Coastguard Worker	pushl %esi
16*638691a0SAndroid Build Coastguard Worker	pushl %ecx
17*638691a0SAndroid Build Coastguard Worker
18*638691a0SAndroid Build Coastguard Worker	movl 8(%ebp),%esi
19*638691a0SAndroid Build Coastguard Worker	movl 12(%ebp),%ecx
20*638691a0SAndroid Build Coastguard Worker
21*638691a0SAndroid Build Coastguard Worker	pxor %mm7,%mm7		# clear peak
22*638691a0SAndroid Build Coastguard Worker
23*638691a0SAndroid Build Coastguard Worker1:	subl $4,%ecx
24*638691a0SAndroid Build Coastguard Worker	jl 2f
25*638691a0SAndroid Build Coastguard Worker	movq (%esi),%mm0
26*638691a0SAndroid Build Coastguard Worker	movq %mm0,%mm1
27*638691a0SAndroid Build Coastguard Worker	psraw $15,%mm1		# mm1 = 1's if negative, 0's if positive
28*638691a0SAndroid Build Coastguard Worker	pxor %mm1,%mm0		# complement negatives
29*638691a0SAndroid Build Coastguard Worker	psubw %mm1,%mm0		# add 1 to negatives
30*638691a0SAndroid Build Coastguard Worker	pmaxsw %mm0,%mm7	# store peak
31*638691a0SAndroid Build Coastguard Worker
32*638691a0SAndroid Build Coastguard Worker	addl $8,%esi
33*638691a0SAndroid Build Coastguard Worker	jmp 1b
34*638691a0SAndroid Build Coastguard Worker
35*638691a0SAndroid Build Coastguard Worker2:	movq %mm7,%mm0
36*638691a0SAndroid Build Coastguard Worker	psrlq $32,%mm0
37*638691a0SAndroid Build Coastguard Worker	pmaxsw %mm0,%mm7
38*638691a0SAndroid Build Coastguard Worker	movq %mm7,%mm0
39*638691a0SAndroid Build Coastguard Worker	psrlq $16,%mm0
40*638691a0SAndroid Build Coastguard Worker	pmaxsw %mm0,%mm7	# min value in low word of %mm7
41*638691a0SAndroid Build Coastguard Worker
42*638691a0SAndroid Build Coastguard Worker	movd %mm7,%eax
43*638691a0SAndroid Build Coastguard Worker	andl $0xffff,%eax
44*638691a0SAndroid Build Coastguard Worker
45*638691a0SAndroid Build Coastguard Worker	emms
46*638691a0SAndroid Build Coastguard Worker	popl %ecx
47*638691a0SAndroid Build Coastguard Worker	popl %esi
48*638691a0SAndroid Build Coastguard Worker	popl %ebp
49*638691a0SAndroid Build Coastguard Worker	ret
50