ARM-E_interpolate_noloop_gnu.s revision 7df30109963092559d3760c0661a020f9daf1030
17ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@***********************************************************
27ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@ Function:    WT_InterpolateNoLoop
37ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@ Processor:   ARM-E
47ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@ Description: the main synthesis function when fetching
57ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@			   wavetable samples.
67ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@              C-callable.
77ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@
87ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@ Usage:
97ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@	void WT_InterpolateNoLoop(
107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@		S_WT_VOICE *pWTVoice,
117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@		S_WT_FRAME *pWTFrame);
127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@
137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@ Copyright Sonic Network Inc. 2004
147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@****************************************************************
157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@ Revision Control:
167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@   $Revision: 496 $
177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@   $Date: 2006-12-11 14:33:26 -0800 (Mon, 11 Dec 2006) $
187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@****************************************************************
197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@
207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@   where:
217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@	S_WT_VOICE *pWTVoice
227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@	PASSED IN: r0
237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@
247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@	S_WT_FRAME *pWTFrame;
257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@	PASSED IN: r1
267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@****************************************************************
277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	.include	"ARM_synth_constants_gnu.inc"
297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	.arm
317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	.text
327ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
337ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
347ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	.global	WT_InterpolateNoLoop
357ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
367ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
377ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@ Register usage
387ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@ --------------
397ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanpWTVoice	.req	r0
407ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanpWTFrame	.req	r1
417ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanpOutputBuffer	.req	r2
427ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmannumSamples	.req	r3
437ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
447ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanphaseIncrement	.req	r4
457ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanpPhaseAccum	.req	r5
467ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanphaseFrac	.req	r6
477ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanphaseFracMask	.req	r7
487ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
497ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantmp0	.req	r1	@ reuse register
507ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantmp1	.req	r8
517ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukmantmp2	.req	r9
527ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
537ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
547ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@SaveRegs	RLIST	{r4-r9,lr}
557ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@RestoreRegs	RLIST	{r4-r9,pc}
567ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
577ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	.func	WT_InterpolateNoLoop
587ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanWT_InterpolateNoLoop:
597ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
607ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	STMFD	sp!, {r4-r9,lr}
617ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
627ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@
637ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@ Fetch parameters from structures
647ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@----------------------------------------------------------------
657ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
667ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	LDR		pOutputBuffer, [pWTFrame, #m_pAudioBuffer]
677ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	LDR		numSamples, [pWTFrame, #m_numSamples]
687ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
697ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	LDR		phaseIncrement, [pWTFrame, #m_phaseIncrement]
707ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	LDR		pPhaseAccum, [pWTVoice, #m_pPhaseAccum]
717ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	LDR		phaseFrac, [pWTVoice, #m_phaseFrac]
727ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	LDR		phaseFracMask,=PHASE_FRAC_MASK
737ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
747ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha BrukmanInterpolationLoop:
757ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
767ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	.ifdef	SAMPLES_8_BIT
777ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	LDRSB	tmp0, [pPhaseAccum]				@ tmp0 = x0
787ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	LDRSB	tmp1, [pPhaseAccum, #1]			@ tmp1 = x1
797ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	.else
807ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	LDRSH	tmp0, [pPhaseAccum]				@ tmp0 = x0
817ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	LDRSH	tmp1, [pPhaseAccum, #2]			@ tmp1 = x1
827ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	.endif
837ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
847ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	ADD		tmp2, phaseIncrement, phaseFrac	@ increment pointer here to avoid pipeline stall
857ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
867ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	SUB		tmp1, tmp1, tmp0				@ tmp1 = x1 - x0
877ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	SMULBB	tmp1, phaseFrac, tmp1			@ tmp1 = phaseFrac * tmp2
887ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
897ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@ This section performs a gain adjustment of -12dB for 16-bit samples
907ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@ or +36dB for 8-bit samples. For a high quality synthesizer, the output
917ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@ can be set to full scale, however if the filter is used, it can overflow
927ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@ with certain coefficients and signal sources. In this case, either a
937ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@ saturation operation should take in the filter before scaling back to
947ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@ 16 bits or the signal path should be increased to 18 bits or more.
957ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
967ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	.ifdef	SAMPLES_8_BIT
977ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	MOV		tmp0, tmp0, LSL #6							@ boost 8-bit signal by 36dB
987ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	.else
997ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	MOV		tmp0, tmp0, ASR #2							@ reduce 16-bit signal by 12dB
1007ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	.endif
1017ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1027ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	ADD		tmp1, tmp0, tmp1, ASR #(NUM_EG1_FRAC_BITS-6)	@ tmp1 = tmp0 + (tmp1 >> (15-6))
1037ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman															@	   = x0 + f * (x1 - x0) == interpolated result
1047ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1057ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	STRH	tmp1, [pOutputBuffer], #NEXT_OUTPUT_PCM	@ *pOutputBuffer++ = interpolated result
1067ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1077ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@ carry overflow from fraction to integer portion
1087ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	ADD	pPhaseAccum, pPhaseAccum, tmp2, LSR #(NUM_PHASE_FRAC_BITS - NEXT_INPUT_PCM_SHIFT)
1097ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	AND	phaseFrac, tmp2, phaseFracMask		@ nphaseFrac = frac part
1107ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1117ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	SUBS	numSamples, numSamples, #1
1127ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	BGT		InterpolationLoop
1137ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1147ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@ Clean up and store any changes that were caused during the loop
1157ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@----------------------------------------------------------------
1167ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1177ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	@ update and store phase
1187ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	STR		pPhaseAccum, [pWTVoice, #m_pPhaseAccum]
1197ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	STR		phaseFrac, [pWTVoice, #m_phaseFrac]
1207ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1217ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@
1227ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@ Return to calling function
1237ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman@----------------------------------------------------------------
1247ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1257ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	LDMFD	sp!,{r4-r9,lr}
1267ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	BX		lr
1277ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1287ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	.endfunc
1297ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman	.end
1307ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman
1317ae6ff442a26212a0cc4c1929b8b0a105dc988e4Misha Brukman