home *** CD-ROM | disk | FTP | other *** search
-
- ;MCPower
- ; C prototype : MCPower(float *a, float *b, int count)
- ; return a[n] = sqrt(a[n]*a[n] + b[n]*b[n])
- ;
- a1 RN 0
- a2 RN 1
- a3 RN 2
- a4 RN 3
- v1 RN 4
- v2 RN 5
- v3 RN 6
- v4 RN 7
- v5 RN 8
- v6 RN 9
- sl RN 10
- fp RN 11
- ip RN 12
- sp RN 13
- lr RN 14
- pc RN 15
-
- f0 FN 0
- f1 FN 1
- f2 FN 2
- f3 FN 3
- f4 FN 4
- f5 FN 5
- f6 FN 6
- f7 FN 7
-
- AREA |C$$code|, CODE, READONLY
-
- IMPORT |x$stack_overflow|
-
- EXPORT |MCPower|
- EXPORT |MCRevbin|
- EXPORT |MCstepfft|
- EXPORT |MCSwap|
- EXPORT |MCHanning|
-
- |MCPower|
-
- MOV ip, sp
- STMFD sp!, {a1,a2,a3,a4,v1,v2,v3,v4,fp,ip,lr,pc}
- ; SFMFD f4,4,[sp]!
- STFE f7, [sp, #-12]!
- STFE f6, [sp, #-12]!
- STFE f5, [sp, #-12]!
- STFE f4, [sp, #-12]!
- SUB fp, ip, #4
- CMPS sp, sl
- BLLT |x$stack_overflow|
-
- Powerloop
- ADD v1, a1, a3, ASL#2 ; v1 = a[n]
- ADD v2, a2, a3, ASL#2 ; v2 = b[n]
-
- LDFS f1, [v1,#0] ; f1 = a[n]
- MUFS f1, f1, f1 ; f1 = a[n] * a[n]
- LDFS f2, [v2,#0] ; f2 = b[n]
- MUFS f2, f2, f2 ; f2 = b[n] * b[n]
- ADFS f1, f1, f2 ; f1 = a[n] * a[n] + b[n] * b[n]
- SQTS f1, f1
- STFS f1, [v1,#0] ; a[n] = sqrt(a[n]*a[n] + b[n]*b[n]
- SUBS a3, a3, #1
- BNE Powerloop
-
- LDFE f4, [fp, #-92]
- LDFE f5, [fp, #-80]
- LDFE f6, [fp, #-68]
- LDFE f7, [fp, #-56]
- LDMEA fp, {v1,v2,v3,v4,fp,sp,pc}^
-
-
-
- ; s.MCRevbin
- ; MCRevbin - Returns the reversed ordered bits of the argument
- ; C prototype: extern int MCRevbin(int x, int m)
-
-
- |MCRevbin|
-
- MOV a3, #32 ; r2 = word size is loop counter
- MOV a4, #0 ; r3 = 0
- RSB a2, a2, #31 ; r1 = 31 - m
- Revbinloop
- MOVS a1, a1, LSL#1 ; put top bit in carry
- MOVS a4, a4, RRX ; get carry in top bit
- SUBS a3, a3, #1 ; counter--
- BNE Revbinloop
- MOV a1, a4, LSR a2 ; shift right by (31-m)
- MOV pc, lr
-
- ; s.MCstepfft
-
-
- |MCstepfft|
-
- MOV ip, sp
- STMFD sp!, {a1,a2,a3,a4,v1,v2,v3,v4,fp,ip,lr,pc}
- ; SFMFD f4,4,[sp]!
- STFE f7, [sp, #-12]!
- STFE f6, [sp, #-12]!
- STFE f5, [sp, #-12]!
- STFE f4, [sp, #-12]!
- SUB fp, ip, #4
- CMPS sp, sl
- BLLT |x$stack_overflow|
- MOV v3, a1 ; v3 = a
- MOV v2, a2 ; v2 = b
- MOV v4, a3 ; v4 = n
- MOV v1, a4 ; v1 = span
-
- ADR a1, pi
- LDFS f1, [a1,#0] ; f1 = pi
- FLTS f0, v1 ; f0 =(float)span
- DVFS f5, f1, f0 ; angle = f5 = pi/span
- SINS f0, f5 ; incsin = f0 = sin(angle)
- MVFS f4, f0 ; incsin = f4 = f0
- MUFS f5, f5, #0.5 ; f5 = angle * 0.5
- SINS f0, f5 ; f0 = sin(angle * 0.5)
- MUFS f6, f0, #2 ; f6 = 2 * sin(angle * 0.5)
- MUFD f0, f6, f0 ; inccos = f0 = 2 * sin(angle * 0.5) * sin(angle * 0.5)
- MVFS f2, f0 ; inccos = f2 = f0
- MNFS f1, #2 ; f1 = -2
- MUFS f0, f0, f1 ; dcossin = f0 = -2 * inccos
- STFS f0, [sp, #0] ; push dcossin
- MVFS f1, #1 ; cosine = f1 = 1
- MVFS f0, #0 ; sine = f0 = 0
- MOV lr, v1, ASL #1 ; twospan = lr = 2 * span
- pi
- DCFS 3.1415926535897931
-
- MOV a2, #0 ; i = a2 = 0
- i_loop
- MOV a1, a2 ; j = a1 = i
- j_loop
- ADD a4, a1, v1 ; a4 = j + span
- ADD a3, v3, a4, ASL #2 ; a3 = (a + (j+span)) << 2 ie addr of a[j+span]
- LDFS f7, [a3, #0] ; f7 = a[j+span]
- MUFS f3, f7, f1 ; f3 = a[j+span] * cosine
- ADD ip, v2, a4, ASL #2 ; ip = (b + (j+span)) << 2 ie addr of b[j+span]
- LDFS f5, [ip, #0] ; f5 = b[j+span]
- MUFS f6, f5, f0 ; f6 = b[j+span] * sine
- SUFS f3, f3, f6 ; termr = f3 = a[j+span] * cosine - b[j+span] * sine
- MVFS f6, f3 ; f6 = termr
- MUFS f7, f7, f0 ; f7 = a[j+span] * sine
- MUFS f5, f5, f1 ; f5 = b[j+span] * cosine
- ADFS f5, f7, f5 ; termi = f5 = a[j+span] * sine + b[j+span] * cosine
- ADD a4, v3, a1, ASL #2 ; a4 = (a + j) << 2 ie addr a[j]
- LDFS f7, [a4, #0] ; f7 = a[j]
- SUFS f3, f7, f3 ; f3 = a[j] - termr
- STFS f3, [a3, #0] ; a[j+span] = a[j] - termr
- ADD a3, v2, a1, ASL #2 ; a3 = (b + j) << 2 ie addr b[j]
- LDFS f3, [a3, #0] ; f3 = b[j]
- SUFS f3, f3, f5 ; f3 = b[j] - termi
- STFS f3, [ip, #0] ; b[j+span] = b[j] - termi
- LDFS f3, [a4, #0] ; f3 = a[j]
- ADFS f3, f3, f6 ; f3 = a[j] + termr
- STFS f3, [a4, #0] ; a[j] = a[j] + termr
- LDFS f3, [a3, #0] ; f3 = b[j]
- ADFS f3, f3, f5 ; f3 = b[j] + termi
- STFS f3, [a3, #0] ; b[j] = b[j] + termi
- ADD a1, a1, lr ; j = j + twospan
- CMPS a1, v4 ; j < n ?
- BLT j_loop
-
- LDFS f3, [sp, #0] ; pop dcossin in f3
- MUFS f3, f3, f1 ; f3 = dcossin * cosine
- ADFS f2, f3, f2 ; inccos = dcossin * cosine + inccos
- ADFS f1, f1, f2 ; cosine = cosine + inccos
- LDFS f3, [sp, #0] ; pop dcossin in f3
- MUFS f3, f3, f0 ; f3 = dcossin * sine
- ADFS f4, f3, f4 ; incsin = dcossin * sine + incsin
- ADFS f0, f0, f4 ; sine = sine + incsin
- ADD a2, a2, #1 ; i = i + 1
- CMPS a2, v1 ; i < span ?
- BLT i_loop
-
- LDFE f4, [fp, #-92]
- LDFE f5, [fp, #-80]
- LDFE f6, [fp, #-68]
- LDFE f7, [fp, #-56]
- LDMEA fp, {v1,v2,v3,v4,fp,sp,pc}^
-
-
- ; s.MCSwap
- ; MCSwap - swap word sized variables
- ; C prototype: extern void MCSwap(*a, *b)
-
-
-
- |MCSwap|
- MOV ip, sp
- STMFD sp!, {a1,a2,a3,a4,v1,v2,v3,v4,fp,ip,lr,pc}
- SUB fp, ip, #4
- CMPS sp, sl
- BLLT |x$stack_overflow|
-
- LDR v2, [a2,#0]
- SWP v1, v2, [a1]
- STR v1, [a2,#0]
-
- LDMEA fp, {v1,v2,v3,v4,fp,sp,pc}^
-
-
- ;MCHanning
- ; C prototype : MCHanning(float *hanning, int n_data)
- ; return hanning[n] = cos(angle)*cos(angle)
- ; angle = -pi/2.0 + ((pi/n_data)*n)
-
- |MCHanning|
- MOV ip, sp
- STMFD sp!, {a1,a2,a3,a4,v1,v2,v3,v4,fp,ip,lr,pc}
- ; SFMFD f4,4,[sp]!
- STFE f7, [sp, #-12]!
- STFE f6, [sp, #-12]!
- STFE f5, [sp, #-12]!
- STFE f4, [sp, #-12]!
- SUB fp, ip, #4
- CMPS sp, sl
- BLLT |x$stack_overflow|
-
- FLTS f2, a2 ; f2 = (float)n_data
- LDFS f1, = 3.1415926535897931
- DVFS f1, f1, f2 ; step = f1 = PI/n_data
- LDFS f2, = -1.5707963267948966 ; an = f2 = -PI/2
- MOV v1, #0
- Hanningloop
- COSS f3, f2 ;f3 = cos(an)
- MUFS f3, f3, f3 ;f3 = cos(an) * cos(an)
- STFS f3,[a1],#4 ;hanning[n++] = cos(an) * cos(an)
- ADFS f2, f2, f1 ;an = an + step
- ADD v1, v1, #1 ;n++
- CMP v1, a2
- BLT Hanningloop
-
- LDFE f4, [fp, #-92]
- LDFE f5, [fp, #-80]
- LDFE f6, [fp, #-68]
- LDFE f7, [fp, #-56]
- LDMEA fp, {v1,v2,v3,v4,fp,sp,pc}^
-
- END
-