xref: /aosp_15_r20/external/fec/peak_sse2_assist.s (revision 638691a093b4f9473cd6ee8f3e0139deef159a86)
1*638691a0SAndroid Build Coastguard Worker# SSE2 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 Public License (GPL)
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_sse2(signed short *in,int cnt);
9*638691a0SAndroid Build Coastguard Worker	.global peakval_sse2
10*638691a0SAndroid Build Coastguard Worker	.type peakval_sse2,@function
11*638691a0SAndroid Build Coastguard Worker	.align 16
12*638691a0SAndroid Build Coastguard Workerpeakval_sse2:
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 %xmm7,%xmm7	# clear peak
22*638691a0SAndroid Build Coastguard Worker
23*638691a0SAndroid Build Coastguard Worker1:	subl $8,%ecx
24*638691a0SAndroid Build Coastguard Worker	jl 2f
25*638691a0SAndroid Build Coastguard Worker	movaps (%esi),%xmm0
26*638691a0SAndroid Build Coastguard Worker	movaps %xmm0,%xmm1
27*638691a0SAndroid Build Coastguard Worker	psraw $15,%xmm1		# xmm1 = 1's if negative, 0's if positive
28*638691a0SAndroid Build Coastguard Worker	pxor %xmm1,%xmm0	# complement negatives
29*638691a0SAndroid Build Coastguard Worker	psubw %xmm1,%xmm0	# add 1 to negatives
30*638691a0SAndroid Build Coastguard Worker	pmaxsw %xmm0,%xmm7	# store peak
31*638691a0SAndroid Build Coastguard Worker
32*638691a0SAndroid Build Coastguard Worker	addl $16,%esi
33*638691a0SAndroid Build Coastguard Worker	jmp 1b
34*638691a0SAndroid Build Coastguard Worker
35*638691a0SAndroid Build Coastguard Worker2:	movaps %xmm7,%xmm0
36*638691a0SAndroid Build Coastguard Worker	psrldq $8,%xmm0
37*638691a0SAndroid Build Coastguard Worker	pmaxsw %xmm0,%xmm7
38*638691a0SAndroid Build Coastguard Worker	movaps %xmm7,%xmm0
39*638691a0SAndroid Build Coastguard Worker	psrlq $32,%xmm0
40*638691a0SAndroid Build Coastguard Worker	pmaxsw %xmm0,%xmm7
41*638691a0SAndroid Build Coastguard Worker	movaps %xmm7,%xmm0
42*638691a0SAndroid Build Coastguard Worker	psrlq $16,%xmm0
43*638691a0SAndroid Build Coastguard Worker	pmaxsw %xmm0,%xmm7	# min value in low word of %xmm7
44*638691a0SAndroid Build Coastguard Worker
45*638691a0SAndroid Build Coastguard Worker	movd %xmm7,%eax
46*638691a0SAndroid Build Coastguard Worker	andl $0xffff,%eax
47*638691a0SAndroid Build Coastguard Worker
48*638691a0SAndroid Build Coastguard Worker	popl %ecx
49*638691a0SAndroid Build Coastguard Worker	popl %esi
50*638691a0SAndroid Build Coastguard Worker	popl %ebp
51*638691a0SAndroid Build Coastguard Worker	ret
52