aboutsummaryrefslogtreecommitdiffstats
path: root/codecs/mp3/src/x86intel.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>1999-12-07 05:45:48 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>1999-12-07 05:45:48 +0000
commit878dd470f235a2c945f2410927175a45f052b234 (patch)
tree4fc09f73bccf2e5017fd2dab7019e076351cab9b /codecs/mp3/src/x86intel.c
parent070e10a75492938462eeac565c78c8c16a02fc74 (diff)
Version 0.1.1 from FTP
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@95 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'codecs/mp3/src/x86intel.c')
-rwxr-xr-xcodecs/mp3/src/x86intel.c437
1 files changed, 437 insertions, 0 deletions
diff --git a/codecs/mp3/src/x86intel.c b/codecs/mp3/src/x86intel.c
new file mode 100755
index 000000000..d9f0e6125
--- /dev/null
+++ b/codecs/mp3/src/x86intel.c
@@ -0,0 +1,437 @@
+/* *************************************************** */
+/* ************ DO NOT EDIT THIS FILE!!!! ************ */
+/* *************************************************** */
+/* This file was automatically generated by gas2intel. */
+/* Edit the original gas version instead. */
+
+
+/* FreeAmp - The Free MP3 Player */
+
+/* Based on MP3 decoder originally Copyright (C) 1995-1997 */
+/* Xing Technology Corp. http://www.xingtech.com */
+
+/* Copyright (C) 1999 Mark H. Weaver <mhw@netris.org> */
+
+/* This program is free software; you can redistribute it and/or modify */
+/* it under the terms of the GNU General Public License as published by */
+/* the Free Software Foundation; either version 2 of the License, or */
+/* (at your option) any later version. */
+
+/* This program is distributed in the hope that it will be useful, */
+/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
+/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
+/* GNU General Public License for more details. */
+
+/* You should have received a copy of the GNU General Public License */
+/* along with this program; if not, write to the Free Software */
+/* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* $Id$ */
+/* Generated from Id: x86gas.s,v 1.9 1999/03/05 08:58:18 mhw Exp $ */
+
+
+extern float wincoef[264];
+extern float coef32[31];
+
+#define L_tmp 0
+#define L_pcm 4
+void window_dual(float *vbuf, int vb_ptr, short *pcm)
+{
+__asm {
+
+ mov esi,vb_ptr
+ mov edi,vbuf
+ mov ecx,pcm
+ push ebp
+ sub esp,8
+ mov DWORD PTR [esp+L_pcm],ecx
+
+ mov ebp,511 ; ebp = 511
+ lea ecx,wincoef ; coef = wincoef
+ add esi,16 ; si = vb_ptr + 16
+ mov ebx,esi
+ add ebx,32
+ and ebx,ebp ; bx = (si + 32) & 511
+
+; First 16
+ mov dh,16 ; i = 16
+ align 4
+FirstOuter:
+ fldz ; sum = 0.0
+ mov dl,2 ; j = 2
+ align 4
+FirstInner:
+; REPEAT 4 ; Unrolled loop
+ fld DWORD PTR [ecx] ; Push *coef
+ fmul DWORD PTR [edi+esi*4] ; Multiply by vbuf[si]
+ add esi,64 ; si += 64
+ add ecx,4 ; Advance coef pointer
+ and esi,ebp ; si &= 511
+ faddp st(1),st ; Add to sum
+
+ fld DWORD PTR [ecx] ; Push *coef
+ fmul DWORD PTR [edi+ebx*4] ; Multiply by vbuf[bx]
+ add ebx,64 ; bx += 64
+ add ecx,4 ; Advance coef pointer
+ and ebx,ebp ; bx &= 511
+ fsubp st(1),st ; Subtract from sum
+;--
+ fld DWORD PTR [ecx] ; Push *coef
+ fmul DWORD PTR [edi+esi*4] ; Multiply by vbuf[si]
+ add esi,64 ; si += 64
+ add ecx,4 ; Advance coef pointer
+ and esi,ebp ; si &= 511
+ faddp st(1),st ; Add to sum
+
+ fld DWORD PTR [ecx] ; Push *coef
+ fmul DWORD PTR [edi+ebx*4] ; Multiply by vbuf[bx]
+ add ebx,64 ; bx += 64
+ add ecx,4 ; Advance coef pointer
+ and ebx,ebp ; bx &= 511
+ fsubp st(1),st ; Subtract from sum
+;--
+ fld DWORD PTR [ecx] ; Push *coef
+ fmul DWORD PTR [edi+esi*4] ; Multiply by vbuf[si]
+ add esi,64 ; si += 64
+ add ecx,4 ; Advance coef pointer
+ and esi,ebp ; si &= 511
+ faddp st(1),st ; Add to sum
+
+ fld DWORD PTR [ecx] ; Push *coef
+ fmul DWORD PTR [edi+ebx*4] ; Multiply by vbuf[bx]
+ add ebx,64 ; bx += 64
+ add ecx,4 ; Advance coef pointer
+ and ebx,ebp ; bx &= 511
+ fsubp st(1),st ; Subtract from sum
+;--
+ fld DWORD PTR [ecx] ; Push *coef
+ fmul DWORD PTR [edi+esi*4] ; Multiply by vbuf[si]
+ add esi,64 ; si += 64
+ add ecx,4 ; Advance coef pointer
+ and esi,ebp ; si &= 511
+ faddp st(1),st ; Add to sum
+
+ fld DWORD PTR [ecx] ; Push *coef
+ fmul DWORD PTR [edi+ebx*4] ; Multiply by vbuf[bx]
+ add ebx,64 ; bx += 64
+ add ecx,4 ; Advance coef pointer
+ and ebx,ebp ; bx &= 511
+ fsubp st(1),st ; Subtract from sum
+;--
+; END REPEAT
+
+ dec dl ; --j
+ jg FirstInner ; Jump back if j > 0
+
+ fistp DWORD PTR [esp+L_tmp] ; tmp = (long) round (sum)
+ inc esi ; si++
+ mov eax,DWORD PTR [esp+L_tmp]
+ dec ebx ; bx--
+ mov ebp,eax
+ sar eax,15
+ inc eax
+ sar eax,1
+ jz FirstInRange ; Jump if in range
+
+ sar eax,16 ; Out of range
+ mov ebp,32767
+ xor ebp,eax
+FirstInRange:
+ mov eax,DWORD PTR [esp+L_pcm]
+ mov WORD PTR [eax],bp ; Store sample in *pcm
+ add eax,4 ; Increment pcm
+ mov ebp,511 ; Reload ebp with 511
+ mov DWORD PTR [esp+L_pcm],eax
+
+ dec dh ; --i
+ jg FirstOuter ; Jump back if i > 0
+
+
+; Special case
+ fldz ; sum = 0.0
+ mov dl,4 ; j = 4
+ align 4
+SpecialInner:
+; REPEAT 2 ; Unrolled loop
+ fld DWORD PTR [ecx] ; Push *coef
+ fmul DWORD PTR [edi+ebx*4] ; Multiply by vbuf[bx]
+ add ebx,64 ; bx += 64
+ add ecx,4 ; Increment coef pointer
+ and ebx,ebp ; bx &= 511
+ faddp st(1),st ; Add to sum
+;--
+ fld DWORD PTR [ecx] ; Push *coef
+ fmul DWORD PTR [edi+ebx*4] ; Multiply by vbuf[bx]
+ add ebx,64 ; bx += 64
+ add ecx,4 ; Increment coef pointer
+ and ebx,ebp ; bx &= 511
+ faddp st(1),st ; Add to sum
+;--
+; END REPEAT
+
+ dec dl ; --j
+ jg SpecialInner ; Jump back if j > 0
+
+ fistp DWORD PTR [esp+L_tmp] ; tmp = (long) round (sum)
+ dec esi ; si--
+ mov eax,DWORD PTR [esp+L_tmp]
+ inc ebx ; bx++
+ mov ebp,eax
+ sar eax,15
+ inc eax
+ sar eax,1
+ jz SpecialInRange ; Jump if within range
+
+ sar eax,16 ; Out of range
+ mov ebp,32767
+ xor ebp,eax
+SpecialInRange:
+ mov eax,DWORD PTR [esp+L_pcm]
+ sub ecx,36 ; Readjust coef pointer for last round
+ mov WORD PTR [eax],bp ; Store sample in *pcm
+ add eax,4 ; Increment pcm
+ mov ebp,511 ; Reload ebp with 511
+ mov DWORD PTR [esp+L_pcm],eax
+
+
+; Last 15
+ mov dh,15 ; i = 15
+ align 4
+LastOuter:
+ fldz ; sum = 0.0
+ mov dl,2 ; j = 2
+ align 4
+LastInner:
+; REPEAT 4 ; Unrolled loop
+ fld DWORD PTR [ecx] ; Push *coef
+ fmul DWORD PTR [edi+esi*4] ; Multiply by vbuf[si]
+ add esi,64 ; si += 64
+ sub ecx,4 ; Back up coef pointer
+ and esi,ebp ; si &= 511
+ faddp st(1),st ; Add to sum
+
+ fld DWORD PTR [ecx] ; Push *coef
+ fmul DWORD PTR [edi+ebx*4] ; Multiply by vbuf[bx]
+ add ebx,64 ; bx += 64
+ sub ecx,4 ; Back up coef pointer
+ and ebx,ebp ; bx &= 511
+ faddp st(1),st ; Add to sum
+;--
+ fld DWORD PTR [ecx] ; Push *coef
+ fmul DWORD PTR [edi+esi*4] ; Multiply by vbuf[si]
+ add esi,64 ; si += 64
+ sub ecx,4 ; Back up coef pointer
+ and esi,ebp ; si &= 511
+ faddp st(1),st ; Add to sum
+
+ fld DWORD PTR [ecx] ; Push *coef
+ fmul DWORD PTR [edi+ebx*4] ; Multiply by vbuf[bx]
+ add ebx,64 ; bx += 64
+ sub ecx,4 ; Back up coef pointer
+ and ebx,ebp ; bx &= 511
+ faddp st(1),st ; Add to sum
+;--
+ fld DWORD PTR [ecx] ; Push *coef
+ fmul DWORD PTR [edi+esi*4] ; Multiply by vbuf[si]
+ add esi,64 ; si += 64
+ sub ecx,4 ; Back up coef pointer
+ and esi,ebp ; si &= 511
+ faddp st(1),st ; Add to sum
+
+ fld DWORD PTR [ecx] ; Push *coef
+ fmul DWORD PTR [edi+ebx*4] ; Multiply by vbuf[bx]
+ add ebx,64 ; bx += 64
+ sub ecx,4 ; Back up coef pointer
+ and ebx,ebp ; bx &= 511
+ faddp st(1),st ; Add to sum
+;--
+ fld DWORD PTR [ecx] ; Push *coef
+ fmul DWORD PTR [edi+esi*4] ; Multiply by vbuf[si]
+ add esi,64 ; si += 64
+ sub ecx,4 ; Back up coef pointer
+ and esi,ebp ; si &= 511
+ faddp st(1),st ; Add to sum
+
+ fld DWORD PTR [ecx] ; Push *coef
+ fmul DWORD PTR [edi+ebx*4] ; Multiply by vbuf[bx]
+ add ebx,64 ; bx += 64
+ sub ecx,4 ; Back up coef pointer
+ and ebx,ebp ; bx &= 511
+ faddp st(1),st ; Add to sum
+;--
+; END REPEAT
+
+ dec dl ; --j
+ jg LastInner ; Jump back if j > 0
+
+ fistp DWORD PTR [esp+L_tmp] ; tmp = (long) round (sum)
+ dec esi ; si--
+ mov eax,DWORD PTR [esp+L_tmp]
+ inc ebx ; bx++
+ mov ebp,eax
+ sar eax,15
+ inc eax
+ sar eax,1
+ jz LastInRange ; Jump if in range
+
+ sar eax,16 ; Out of range
+ mov ebp,32767
+ xor ebp,eax
+LastInRange:
+ mov eax,DWORD PTR [esp+L_pcm]
+ mov WORD PTR [eax],bp ; Store sample in *pcm
+ add eax,4 ; Increment pcm
+ mov ebp,511 ; Reload ebp with 511
+ mov DWORD PTR [esp+L_pcm],eax
+
+ dec dh ; --i
+ jg LastOuter ; Jump back if i > 0
+
+ add esp,8
+ pop ebp
+
+ }
+}
+
+/*--------------------------------------------------------------------------- */
+
+#define L_mi 0
+#define L_m 4
+#define L_dummy 8
+#define L_in 12
+#define L_out 16
+#define L_buf 20 /* Temporary buffer */
+#define L_locals 148 /* Bytes used for locals */
+void asm_fdct32(float in[], float out[])
+{
+__asm {
+
+ mov edi,in ; edi = x
+ mov esi,out ; esi = f
+ push ebp
+ sub esp,L_locals
+
+ lea ecx,coef32-128 ; coef = coef32 - (32 * 4)
+ mov DWORD PTR [esp+4],1 ; m = 1
+ mov ebp,16 ; n = 32 / 2
+
+ lea ebx,DWORD PTR [esp+L_buf]
+ mov DWORD PTR [esp+L_out],ebx ; From now on, use temp buf instead of orig x
+ jmp ForwardLoopStart
+
+ align 4
+ForwardOuterLoop:
+ mov edi,DWORD PTR [esp+L_in] ; edi = x
+ mov esi,DWORD PTR [esp+L_out] ; esi = f
+ mov DWORD PTR [esp+L_out],edi ; Exchange mem versions of f/x for next iter
+ForwardLoopStart:
+ mov DWORD PTR [esp+L_in],esi
+ mov ebx,DWORD PTR [esp+L_m] ; ebx = m (temporarily)
+ mov DWORD PTR [esp+L_mi],ebx ; mi = m
+ sal ebx,1 ; Double m for next iter
+ lea ecx,DWORD PTR [ecx+ebp*8] ; coef += n * 8
+ mov DWORD PTR [esp+L_m],ebx ; Store doubled m
+ lea ebx,DWORD PTR [esi+ebp*4] ; ebx = f2 = f + n * 4
+ sal ebp,3 ; n *= 8
+
+ align 4
+ForwardMiddleLoop:
+ mov eax,ebp ; q = n
+ xor edx,edx ; p = 0
+ test eax,8
+ jnz ForwardInnerLoop1
+
+ align 4
+ForwardInnerLoop:
+ sub eax,4 ; q -= 4
+ fld DWORD PTR [edi+eax] ; push x[q]
+ fld DWORD PTR [edi+edx] ; push x[p]
+ fld st(1) ; Duplicate top two stack entries
+ fld st(1)
+ faddp st(1),st
+ fstp DWORD PTR [esi+edx] ; f[p] = x[p] + x[q]
+ fsubrp st(1),st
+ fmul DWORD PTR [ecx+edx]
+ fstp DWORD PTR [ebx+edx] ; f2[p] = coef[p] * (x[p] - x[q])
+ add edx,4 ; p += 4
+
+ForwardInnerLoop1:
+ sub eax,4 ; q -= 4
+ fld DWORD PTR [edi+eax] ; push x[q]
+ fld DWORD PTR [edi+edx] ; push x[p]
+ fld st(1) ; Duplicate top two stack entries
+ fld st(1)
+ faddp st(1),st
+ fstp DWORD PTR [esi+edx] ; f[p] = x[p] + x[q]
+ fsubrp st(1),st
+ fmul DWORD PTR [ecx+edx]
+ fstp DWORD PTR [ebx+edx] ; f2[p] = coef[p] * (x[p] - x[q])
+ add edx,4 ; p += 4
+
+ cmp edx,eax
+ jb ForwardInnerLoop ; Jump back if (p < q)
+
+ add esi,ebp ; f += n
+ add ebx,ebp ; f2 += n
+ add edi,ebp ; x += n
+ dec DWORD PTR [esp+L_mi] ; mi--
+ jg ForwardMiddleLoop ; Jump back if mi > 0
+
+ sar ebp,4 ; n /= 16
+ jg ForwardOuterLoop ; Jump back if n > 0
+
+
+; Setup back loop
+ mov ebx,8 ; ebx = m = 8 (temporarily)
+ mov ebp,ebx ; n = 4 * 2
+
+ align 4
+BackOuterLoop:
+ mov esi,DWORD PTR [esp+L_out] ; esi = f
+ mov DWORD PTR [esp+L_mi],ebx ; mi = m
+ mov edi,DWORD PTR [esp+L_in] ; edi = x
+ mov DWORD PTR [esp+L_m],ebx ; Store m
+ mov DWORD PTR [esp+L_in],esi ; Exchange mem versions of f/x for next iter
+ mov ebx,edi
+ mov DWORD PTR [esp+L_out],edi
+ sub ebx,ebp ; ebx = x2 = x - n
+ sal ebp,1 ; n *= 2
+
+ align 4
+BackMiddleLoop:
+ mov ecx,DWORD PTR [ebx+ebp-4]
+ mov DWORD PTR [esi+ebp-8],ecx ; f[n - 8] = x2[n - 4]
+ fld DWORD PTR [edi+ebp-4] ; push x[n - 4]
+ fst DWORD PTR [esi+ebp-4] ; f[n - 4] = x[n - 4], without popping
+ lea eax,DWORD PTR [ebp-8] ; q = n - 8
+ lea edx,DWORD PTR [ebp-16] ; p = n - 16
+
+ align 4
+BackInnerLoop:
+ mov ecx,DWORD PTR [ebx+eax]
+ mov DWORD PTR [esi+edx],ecx ; f[p] = x2[q]
+ fld DWORD PTR [edi+eax] ; push x[q]
+ fadd st(1),st
+ fxch
+ fstp DWORD PTR [esi+edx+4] ; f[p + 4] = x[q] + x[q + 4]
+ sub eax,4 ; q -= 4
+ sub edx,8 ; p -= 8
+ jge BackInnerLoop ; Jump back if p >= 0
+
+ fstp DWORD PTR [esp+L_dummy] ; Pop (XXX is there a better way to do this?)
+ add esi,ebp ; f += n
+ add ebx,ebp ; x2 += n
+ add edi,ebp ; x += n
+ dec DWORD PTR [esp+L_mi] ; mi--
+ jg BackMiddleLoop ; Jump back if mi > 0
+
+ mov ebx,DWORD PTR [esp+L_m] ; ebx = m (temporarily)
+ sar ebx,1 ; Halve m for next iter
+ jg BackOuterLoop ; Jump back if m > 0
+
+ add esp,L_locals
+ pop ebp
+
+ }
+}
+