Wolfrum

NEON code for FFT

Mar 27th, 2013
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MPASM 7.20 KB | None | 0 0
  1.  
  2.  
  3.   PRESERVE8
  4.  
  5.   AREA  NE10,CODE,READONLY,ALIGN=3
  6.  
  7.   ARM
  8.  
  9.      EXPORT ne10_radix4_butterfly_float_neon
  10.  
  11. ne10_radix4_butterfly_float_neon FUNCTION
  12.  
  13.  
  14.  
  15.         PUSH    {r4-r12,lr}    ;push r12 to keep stack 8 bytes aligned
  16.         VPUSH   {d8-d15}
  17.  
  18. pDst        RN  R0
  19. pSrc        RN  R1
  20. fftSize     RN  R2
  21. pCoef       RN  R3
  22.  
  23.  
  24. SubFFTSize  RN  R4
  25. SubFFTNum   RN  R5
  26. grpCount    RN  R6
  27. twidStep    RN  R8
  28. setCount    RN  R9
  29. grpStep     RN  R10
  30.  
  31. pT1         RN  R7
  32. pOut1       RN  R11
  33. pTw2        RN  R12
  34. TwdStep     RN  R14
  35. pTmp        RN  R12
  36.  
  37.         LSR     SubFFTNum,fftSize,#2
  38.         MOV     SubFFTSize,#4
  39.         MOV     pT1,pSrc
  40.         LSR     grpCount,SubFFTNum,#2
  41.         MOV     pOut1,pDst
  42.         LSL     fftSize,#1
  43.  
  44. fftGrpLoop
  45.         VLD2        {Q0.F32,Q1.F32},[pT1@256],fftSize  ;/*Load Input Values*/
  46.         VLD2        {Q2.F32,Q3.F32},[pT1@256],fftSize
  47.         VLD2        {Q4.F32,Q5.F32},[pT1@256],fftSize
  48.    ;
  49.  
  50.         ;/*pSrc[0] + pSrc[2]*/
  51.         VADD    Q8.F32,Q0.F32,Q4.F32
  52.         VADD    Q9.F32,Q1.F32,Q5.F32
  53.         ;/*pSrc[0] - pSrc[2]*/
  54.         VSUB    Q10.F32,Q0.F32,Q4.F32
  55.         VSUB    Q11.F32,Q1.F32,Q5.F32
  56.         ;/*pSrc[1] + pSrc[3]*/
  57.         VLD2        {Q6.F32,Q7.F32},[pT1@256],fftSize
  58.  
  59.         VADD    Q12.F32,Q2.F32,Q6.F32
  60.         VADD    Q13.F32,Q3.F32,Q7.F32
  61.         ;/*pSrc[1] - pSrc[3]*/
  62.         VSUB    Q14.F32,Q2.F32,Q6.F32
  63.         VSUB    Q15.F32,Q3.F32,Q7.F32
  64.  
  65.         ;/*Radix-4 Butterfly calculation*/
  66.         ;/*Third Result*/
  67.         VSUB    Q4.F32,Q8.F32,Q12.F32
  68.         VSUB    Q5.F32,Q9.F32,Q13.F32
  69.         ;/*First Result*/
  70.         VADD    Q0.F32,Q8.F32,Q12.F32
  71.         VADD    Q1.F32,Q9.F32,Q13.F32
  72.         ;/*Second result*/
  73.         VADD    Q2.F32,Q10.F32,Q15.F32
  74.         VSUB    Q3.F32,Q11.F32,Q14.F32
  75.         ;/*Fourth Result*/
  76.         VSUB    Q6.F32,Q10.F32,Q15.F32
  77.         VADD    Q7.F32,Q11.F32,Q14.F32
  78.  
  79.         ;/*Get Result in correct order for storing*/
  80.         ;/*4Re2,4Re0,3Re2,3Re0 2Re2,2Re0,1Re2,1Re0*/
  81.         VZIP    Q0.F32,Q4.F32
  82.         ;/*4Re3,4Re1,3Re3,3Re1 2Re3,2Re1,1Re3,1Re1*/
  83.         VZIP    Q2.F32,Q6.F32
  84.  
  85.         ;/*4Im2,4Im0,3Im2,3Im0 2Im2,2Im0,1Im2,1Im0*/
  86.         VZIP    Q1.F32,Q5.F32
  87.         ;/*4Im3,4Im1,3Im2,3Im1 2Im3,2Im1,1Im3,1Im1*/
  88.         VZIP    Q3.F32,Q7.F32
  89.  
  90.         SUB     pT1,pT1,fftSize, LSL #2
  91.  
  92.         MOV         pTmp,#32
  93.         VST4.F32    {d0,d2,d4,d6},[pOut1@256],pTmp
  94.         VST4.F32    {d1,d3,d5,d7},[pOut1@256],pTmp
  95.         SUBS        grpCount,#1
  96.         ADD         pT1,pT1,#32
  97.         VST4.F32    {d8,d10,d12,d14},[pOut1@256],pTmp
  98.         VST4.F32    {d9,d11,d13,d15},[pOut1@256],pTmp
  99.  
  100.         BGT     fftGrpLoop
  101.  
  102.         ;/* Swap Input and Output*/
  103.         MOV     pTmp,pDst
  104.         MOV     pDst,pSrc
  105.         MOV     pSrc,pTmp
  106.  
  107.         ;/*Remaining FFT Stages Second Stage to Last Stage*/
  108.         ;/* Update the Grp count and size for the next stage */
  109.         LSR     SubFFTNum,#2
  110.         LSL     SubFFTSize,#2
  111.  
  112. fftStageLoop
  113.         MOV     grpCount,SubFFTNum
  114.         MOV     grpStep,#0
  115.         ADD     pT1,pSrc,fftSize
  116.         LSL     TwdStep,SubFFTSize,#1
  117.  
  118. fftGrpLoop1
  119.         LSR     setCount,SubFFTSize,#2
  120.         ADD     pOut1,pDst,grpStep,LSL #3
  121.         MOV     pTw2,pCoef
  122.  
  123.         LSL     SubFFTSize,#1
  124.  
  125. fftSetLoop
  126.         VLD2    {Q8.F32,Q9.F32},[pTw2@256],TwdStep
  127.         VLD2    {Q2.F32,Q3.F32},[pT1@256],fftSize
  128.         ;/*CPLX_MUL (pTmpT2, pTw2, pT2);*/
  129.         VMUL   Q14.F32,Q8.F32,Q2.F32
  130.         VMUL   Q15.F32,Q8.F32,Q3.F32
  131.         VLD2    {Q10.F32,Q11.F32},[pTw2@256],TwdStep
  132.         VLD2    {Q4.F32,Q5.F32},[pT1@256],fftSize
  133.         VMLA   Q14.F32,Q9.F32,Q3.F32
  134.         VMLS   Q15.F32,Q9.F32,Q2.F32
  135.  
  136.  
  137.         ;/*CPLX_MUL (pTmpT3, pTw3, pT3);*/
  138.         VMUL   Q2.F32,Q10.F32,Q4.F32
  139.         VMUL   Q3.F32,Q10.F32,Q5.F32
  140.         VLD2    {Q12.F32,Q13.F32},[pTw2@256]
  141.         VLD2    {Q6.F32,Q7.F32},[pT1@256],fftSize
  142.         VMLA   Q2.F32,Q11.F32,Q5.F32
  143.         VMLS   Q3.F32,Q11.F32,Q4.F32
  144.  
  145.         SUB     pT1,pT1,fftSize, LSL #2
  146.  
  147.  
  148.         ;/*CPLX_MUL (pTmpT4, pTw4, pT4);*/
  149.         VMUL   Q4.F32,Q12.F32,Q6.F32
  150.         VMUL   Q5.F32,Q12.F32,Q7.F32
  151.         VLD2    {Q0.F32,Q1.F32},[pT1@256],fftSize
  152.         VMLA   Q4.F32,Q13.F32,Q7.F32
  153.         VMLS   Q5.F32,Q13.F32,Q6.F32
  154.  
  155.  
  156.         ;/*CPLX_ADD (pTmp1, pT1, pTmpT3);*/
  157.         VADD    Q8.F32,Q0.F32,Q2.F32
  158.         VADD    Q9.F32,Q1.F32,Q3.F32
  159.         ;/*CPLX_SUB (pTmp2, pT1, pTmpT3);*/
  160.         VSUB    Q10.F32,Q0.F32,Q2.F32
  161.         VSUB    Q11.F32,Q1.F32,Q3.F32
  162.         ;/*CPLX_ADD (pTmp3, pTmpT2, pTmpT4);*/
  163.         VADD    Q12.F32,Q14.F32,Q4.F32
  164.         VADD    Q13.F32,Q15.F32,Q5.F32
  165.         ;/*CPLX_SUB (pTmp4, pTmpT2, pTmpT4);*/
  166.         VSUB    Q14.F32,Q14.F32,Q4.F32
  167.         VSUB    Q15.F32,Q15.F32,Q5.F32
  168.  
  169.         ;/*CPLX_ADD (pT1, pTmp1, pTmp3);*/
  170.         VADD    Q0.F32,Q8.F32,Q12.F32
  171.         VADD    Q1.F32,Q9.F32,Q13.F32
  172.  
  173.         ;/*CPLX_ADD_SUB_X (pT2, pTmp2, pTmp4);*/
  174.         VADD    Q2.F32,Q10.F32,Q15.F32
  175.         VSUB    Q3.F32,Q11.F32,Q14.F32
  176.  
  177.         ;/*CPLX_SUB (pT3, pTmp1, pTmp3);*/
  178.         VSUB    Q4.F32,Q8.F32,Q12.F32
  179.         VSUB    Q5.F32,Q9.F32,Q13.F32
  180.         ;/*CPLX_SUB_ADD_X (pT4, pTmp2, pTmp4);*/
  181.         VSUB    Q6.F32,Q10.F32,Q15.F32
  182.         VADD    Q7.F32,Q11.F32,Q14.F32
  183.  
  184.         SUBS    setCount,#4
  185.         ;/* Store the Result*/
  186.  
  187.         VST2    {Q0.F32,Q1.F32},[pOut1@256],SubFFTSize
  188.         VST2    {Q2.F32,Q3.F32},[pOut1@256],SubFFTSize
  189.  
  190.         VST2    {Q4.F32,Q5.F32},[pOut1@256],SubFFTSize
  191.         VST2    {Q6.F32,Q7.F32},[pOut1@256],SubFFTSize
  192.  
  193.         SUB     pTw2,pTw2,TwdStep, LSL #1
  194.         SUB     pOut1,pOut1,SubFFTSize, LSL #2
  195.  
  196.         ADD     pT1,pT1,#32
  197.         ADD     pTw2,pTw2,#32
  198.         ADD     pOut1,pOut1,#32
  199.  
  200.         BGT     fftSetLoop
  201.         LSR     SubFFTSize,#1
  202.         SUBS    grpCount,grpCount,#1
  203.         ADD     grpStep,grpStep,SubFFTSize
  204.  
  205.         BGT     fftGrpLoop1
  206.         ;/* Update the Grp count and size for the next stage */
  207.         ADD     twidStep,SubFFTSize,SubFFTSize, LSL #1
  208.         LSRS    SubFFTNum,SubFFTNum,#2
  209.  
  210.         ;/* Swap Input and Output*/
  211.         MOV     pTmp,pDst
  212.         MOV     pDst,pSrc
  213.         MOV     pSrc,pTmp
  214.  
  215.         ADD     pCoef,pCoef,twidStep,LSL #1
  216.  
  217.         LSL     SubFFTSize,SubFFTSize,#2
  218.  
  219.         BGT     fftStageLoop
  220.  
  221.         ;/* if the N is even power of 4, copy the output to dst buffer */
  222.         ASR     fftSize,fftSize,#1
  223.         CLZ     SubFFTNum,fftSize
  224.         MOV     setCount, #32
  225.         SUB     SubFFTNum, setCount, SubFFTNum
  226.         ASR     SubFFTNum,SubFFTNum,#1
  227.         ANDS    SubFFTNum, SubFFTNum, #1
  228.  
  229.         BNE     fftEnd
  230.  
  231.         ASR     grpCount, fftSize, #4
  232. ;fftCopyLoop
  233. ;        VLD1.F32    {d0,d1,d2,d3},[pSrc]!
  234. ;        VLD1.F32    {d4,d5,d6,d7},[pSrc]!
  235. ;        VLD1.F32    {d8,d9,d10,d11},[pSrc]!
  236. ;        VLD1.F32    {d12,d13,d14,d15},[pSrc]!
  237. ;
  238. ;        SUBS        grpCount,#1
  239. ;        VST1.F32    {d0,d1,d2,d3},[pDst]!
  240. ;        VST1.F32    {d4,d5,d6,d7},[pDst]!
  241. ;        VST1.F32    {d8,d9,d10,d11},[pDst]!
  242. ;        VST1.F32    {d12,d13,d14,d15},[pDst]!
  243. ;
  244. ;        BGT         fftCopyLoop
  245.  
  246. fftEnd
  247.         ;/* Retureq From Function*/
  248.         VPOP    {d8-d15}
  249.         POP     {r4-r12,pc}
  250.         ENDP
Advertisement
Add Comment
Please, Sign In to add comment