blob: dae831f2495a01fa505ae11d5a96d028f05e1699 [file] [log] [blame]
Bill Yi4e213d52015-06-23 13:53:11 -07001# MMX 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 value in signed 16-bit input samples
8# int peakval_mmx(signed short *in,int cnt);
9 .global peakval_mmx
10 .type peakval_mmx,@function
11 .align 16
12peakval_mmx:
13 pushl %ebp
14 movl %esp,%ebp
15 pushl %esi
16 pushl %ecx
17 pushl %ebx
18
19 movl 8(%ebp),%esi
20 movl 12(%ebp),%ecx
21
22 pxor %mm7,%mm7 # clear peak
23
241: subl $4,%ecx
25 jl 2f
26 movq (%esi),%mm0
27 movq %mm0,%mm1
28 psraw $15,%mm1 # mm1 = 1's if negative, 0's if positive
29 pxor %mm1,%mm0 # complement negatives
30 psubw %mm1,%mm0 # add 1 to negatives
31 movq %mm7,%mm6 # copy previous peak
32 pcmpgtw %mm0,%mm6 # ff == old peak greater
33 pand %mm6,%mm7 # select old peaks that are greater
34 pandn %mm0,%mm6 # select new values that are greater
35 por %mm6,%mm7
36
37 addl $8,%esi
38 jmp 1b
39
402: movd %mm7,%eax
41 psrlq $16,%mm7
42 andl $0xffff,%eax
43
44 movd %mm7,%edx
45 psrlq $16,%mm7
46 andl $0xffff,%edx
47 cmpl %edx,%eax
48 jnl 3f
49 movl %edx,%eax
503:
51 movd %mm7,%edx
52 psrlq $16,%mm7
53 andl $0xffff,%edx
54 cmpl %edx,%eax
55 jnl 4f
56 movl %edx,%eax
574:
58 movd %mm7,%edx
59 andl $0xffff,%edx
60 cmpl %edx,%eax
61 jnl 5f
62 movl %edx,%eax
635:
64 emms
65 popl %ebx
66 popl %ecx
67 popl %esi
68 popl %ebp
69 ret
70