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