xref: /aosp_15_r20/external/fec/peakval_mmx_assist.s (revision 638691a093b4f9473cd6ee8f3e0139deef159a86)
1*638691a0SAndroid Build Coastguard Worker# MMX 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 value in signed 16-bit input samples
8*638691a0SAndroid Build Coastguard Worker#  int peakval_mmx_assist(signed short *in,int cnt);
9*638691a0SAndroid Build Coastguard Worker	.global peakval_mmx_assist
10*638691a0SAndroid Build Coastguard Worker	.type peakval_mmx_assist,@function
11*638691a0SAndroid Build Coastguard Worker	.align 16
12*638691a0SAndroid Build Coastguard Workerpeakval_mmx_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	pushl %ebx
18*638691a0SAndroid Build Coastguard Worker
19*638691a0SAndroid Build Coastguard Worker	movl 8(%ebp),%esi
20*638691a0SAndroid Build Coastguard Worker	movl 12(%ebp),%ecx
21*638691a0SAndroid Build Coastguard Worker
22*638691a0SAndroid Build Coastguard Worker	pxor %mm7,%mm7		# clear peak
23*638691a0SAndroid Build Coastguard Worker
24*638691a0SAndroid Build Coastguard Worker1:	subl $4,%ecx
25*638691a0SAndroid Build Coastguard Worker	jl 2f
26*638691a0SAndroid Build Coastguard Worker	movq (%esi),%mm0
27*638691a0SAndroid Build Coastguard Worker	movq %mm0,%mm1
28*638691a0SAndroid Build Coastguard Worker	psraw $15,%mm1		# mm1 = 1's if negative, 0's if positive
29*638691a0SAndroid Build Coastguard Worker	pxor %mm1,%mm0		# complement negatives
30*638691a0SAndroid Build Coastguard Worker	psubw %mm1,%mm0		# add 1 to negatives
31*638691a0SAndroid Build Coastguard Worker	movq %mm7,%mm6		# copy previous peak
32*638691a0SAndroid Build Coastguard Worker	pcmpgtw %mm0,%mm6	# ff == old peak greater
33*638691a0SAndroid Build Coastguard Worker	pand %mm6,%mm7		# select old peaks that are greater
34*638691a0SAndroid Build Coastguard Worker	pandn %mm0,%mm6		# select new values that are greater
35*638691a0SAndroid Build Coastguard Worker	por %mm6,%mm7
36*638691a0SAndroid Build Coastguard Worker
37*638691a0SAndroid Build Coastguard Worker	addl $8,%esi
38*638691a0SAndroid Build Coastguard Worker	jmp 1b
39*638691a0SAndroid Build Coastguard Worker
40*638691a0SAndroid Build Coastguard Worker2:	movd %mm7,%eax
41*638691a0SAndroid Build Coastguard Worker	psrlq $16,%mm7
42*638691a0SAndroid Build Coastguard Worker	andl $0xffff,%eax
43*638691a0SAndroid Build Coastguard Worker
44*638691a0SAndroid Build Coastguard Worker	movd %mm7,%edx
45*638691a0SAndroid Build Coastguard Worker	psrlq $16,%mm7
46*638691a0SAndroid Build Coastguard Worker	andl $0xffff,%edx
47*638691a0SAndroid Build Coastguard Worker	cmpl %edx,%eax
48*638691a0SAndroid Build Coastguard Worker	jnl  3f
49*638691a0SAndroid Build Coastguard Worker	movl %edx,%eax
50*638691a0SAndroid Build Coastguard Worker3:
51*638691a0SAndroid Build Coastguard Worker	movd %mm7,%edx
52*638691a0SAndroid Build Coastguard Worker	psrlq $16,%mm7
53*638691a0SAndroid Build Coastguard Worker	andl $0xffff,%edx
54*638691a0SAndroid Build Coastguard Worker	cmpl %edx,%eax
55*638691a0SAndroid Build Coastguard Worker	jnl 4f
56*638691a0SAndroid Build Coastguard Worker	movl %edx,%eax
57*638691a0SAndroid Build Coastguard Worker4:
58*638691a0SAndroid Build Coastguard Worker	movd %mm7,%edx
59*638691a0SAndroid Build Coastguard Worker	andl $0xffff,%edx
60*638691a0SAndroid Build Coastguard Worker	cmpl %edx,%eax
61*638691a0SAndroid Build Coastguard Worker	jnl 5f
62*638691a0SAndroid Build Coastguard Worker	movl %edx,%eax
63*638691a0SAndroid Build Coastguard Worker5:
64*638691a0SAndroid Build Coastguard Worker	emms
65*638691a0SAndroid Build Coastguard Worker	popl %ebx
66*638691a0SAndroid Build Coastguard Worker	popl %ecx
67*638691a0SAndroid Build Coastguard Worker	popl %esi
68*638691a0SAndroid Build Coastguard Worker	popl %ebp
69*638691a0SAndroid Build Coastguard Worker	ret
70*638691a0SAndroid Build Coastguard Worker
71