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