summaryrefslogtreecommitdiffstats
path: root/arm-wt-22k/lib_src/ARM-E_mastergain_gnu.s
diff options
context:
space:
mode:
Diffstat (limited to 'arm-wt-22k/lib_src/ARM-E_mastergain_gnu.s')
-rw-r--r--arm-wt-22k/lib_src/ARM-E_mastergain_gnu.s109
1 files changed, 109 insertions, 0 deletions
diff --git a/arm-wt-22k/lib_src/ARM-E_mastergain_gnu.s b/arm-wt-22k/lib_src/ARM-E_mastergain_gnu.s
new file mode 100644
index 0000000..b4e905b
--- /dev/null
+++ b/arm-wt-22k/lib_src/ARM-E_mastergain_gnu.s
@@ -0,0 +1,109 @@
+@***********************************************************
+@ Function: SynthMasterGain
+@ Processor: ARM-E
+@ Description: Copies 32-bit synth output to 16-bit buffer
+@ with saturated gain control
+@ C-callable.
+@
+@ Usage:
+@ SynthMasterGain(
+@ pInputBuffer
+@ pOutputBuffer,
+@ nGain,
+@ nNumLoopSamples
+@ );
+@
+@ Copyright Sonic Network Inc. 2004
+@****************************************************************
+@ Revision Control:
+@ $Revision: 496 $
+@ $Date: 2006-12-11 14:33:26 -0800 (Mon, 11 Dec 2006) $
+@****************************************************************
+@
+@ where:
+@ long *pInputBuffer
+@ PASSED IN: r0
+@
+@ EAS_PCM *pOutputBuffer
+@ PASSED IN: r1
+@
+@ short nGain
+@ PASSED IN: r2
+@
+@ EAS_U16 nNumLoopSamples
+@ PASSED IN: r3
+@
+@****************************************************************
+
+ .include "ARM_synth_constants_gnu.inc"
+
+ .arm
+ .text
+
+ .func SynthMasterGain
+SynthMasterGain:
+
+ .global SynthMasterGain @ allow other files to use this function
+
+
+
+
+
+@ Stack frame
+@ -----------
+ .equ RET_ADDR_SZ, 0 @return address
+ .equ REG_SAVE_SZ, 0 @save-on-entry registers saved
+ .equ FRAME_SZ, (8) @local variables
+ .equ ARG_BLK_SZ, 0 @argument block
+
+ .equ PARAM_OFFSET, (ARG_BLK_SZ + FRAME_SZ + REG_SAVE_SZ + RET_ADDR_SZ)
+
+@ Register usage
+@ --------------
+pnInputBuffer .req r0
+pnOutputBuffer .req r1
+nGain .req r2
+nNumLoopSamples .req r3
+
+ STMFD sp!,{r4-r6,r14} @Save any save-on-entry registers that are used
+
+ LDR r6, =0x7fff @constant for saturation tests
+
+loop:
+ LDR r4, [pnInputBuffer], #4 @fetch 1st output sample
+
+ LDR r5, [pnInputBuffer], #4 @fetch 2nd output sample
+
+ SMULWB r4, r4, nGain @output = gain * input
+
+ CMP r4, r6 @check for positive saturation
+ MOVGT r4, r6 @saturate
+ CMN r4, r6 @check for negative saturation
+ MVNLT r4, r6 @saturate
+
+ SMULWB r5, r5, nGain @output = gain * input
+
+ STRH r4, [pnOutputBuffer], #NEXT_OUTPUT_PCM @save 1st output sample
+
+ CMP r5, r6 @check for positive saturation
+ MOVGT r5, r6 @saturate
+ CMN r5, r6 @check for negative saturation
+ MVNLT r5, r6 @saturate
+ STRH r5, [pnOutputBuffer], #NEXT_OUTPUT_PCM @save 2nd output sample
+
+ SUBS nNumLoopSamples, nNumLoopSamples, #2
+ BGT loop
+
+@
+@ Return to calling function
+@----------------------------------------------------------------
+
+ LDMFD sp!,{r4-r6, lr} @ return to calling function
+ BX lr
+
+@*****************************************************************************
+
+ .endfunc @ end of function/procedure
+
+ .end @ end of assembly code
+