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