15e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// 25e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 35e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// 45e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// Use of this source code is governed by a BSD-style license 55e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// that can be found in the LICENSE file in the root of the source 65e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// tree. An additional intellectual property rights grant can be found 75e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// in the file PATENTS. All contributing project authors may 85e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// be found in the AUTHORS file in the root of the source tree. 95e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// 105e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// This file was originally licensed as follows. It has been 115e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// relicensed with permission from the copyright holders. 125e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 135e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// 145e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// 155e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// File Name: armSP_FFT_CToC_SC16_Radix2_ls_unsafe_s.s 165e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// OpenMAX DL: v1.0.2 175e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// Last Modified Revision: 6741 185e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// Last Modified Date: Wed, 18 Jul 2007 195e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// 205e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. 215e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// 225e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// 235e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// 245e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// Description: 255e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// Compute a Radix 2 FFT stage for a N point complex signal 265e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// 275e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// 285e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 295e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 305e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// Include standard headers 315e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 32bdf981cb383b7ec472ee86d2fedb53937285f894rtoy@google.com#include "dl/api/arm/armCOMM_s.h" 33bdf981cb383b7ec472ee86d2fedb53937285f894rtoy@google.com#include "dl/api/arm/omxtypes_s.h" 345e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 355e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 365e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// Import symbols required from other files 375e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// (For example tables) 385e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 395e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 405e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 415e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 425e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// Set debugging level 435e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@//DEBUG_ON SETL {TRUE} 445e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 455e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 465e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// Guarding implementation by the processor name 475e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 485e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 495e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 505e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 515e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 525e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 535e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 545e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// Guarding implementation by the processor name 555e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 565e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 575e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@//Input Registers 585e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 595e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define pSrc r0 605e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define pDst r2 615e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define pTwiddle r1 625e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define subFFTNum r6 635e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define subFFTSize r7 645e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 655e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 665e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@//Output Registers 675e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 685e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 695e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@//Local Scratch Registers 705e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 715e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 725e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define outPointStep r3 735e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define grpCount r4 745e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define dstStep r5 755e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define pTmp r4 765e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define step r8 775e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 785e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com@// Neon Registers 795e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 805e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define dWr D0.S16 815e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define dWi D1.S16 825e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define dXr0 D2.S16 835e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define dXi0 D3.S16 845e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define dXr1 D4.S16 855e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define dXi1 D5.S16 865e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define dYr0 D6.S16 875e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define dYi0 D7.S16 885e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define dYr1 D8.S16 895e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define dYi1 D9.S16 905e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define qT0 Q5.S32 915e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com#define qT1 Q6.S32 925e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 935e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 945e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com .MACRO FFTSTAGE scaled, inverse, name 955e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 965e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 97a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com MOV outPointStep,subFFTSize,LSL #2 985e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com @// Update grpCount and grpSize rightaway 995e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1005e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com MOV subFFTNum,#1 @//after the last stage 101a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com LSL grpCount,subFFTSize,#1 1025e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1035e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com @// update subFFTSize for the next stage 104a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com MOV subFFTSize,grpCount 1055e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1065e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com SUB step,outPointStep,#4 @// step = -4+outPointStep 1075e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com RSB dstStep,step,#0 @// dstStep = -4-outPointStep+8 = -step 1085e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com @//RSB dstStep,outPointStep,#16 1095e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1105e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1115e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com @// Loop on 2 grps at a time for the last stage 1125e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1135e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.comgrpLoop\name: 1145e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com VLD2 {dWr[0],dWi[0]},[pTwiddle]! @// grp 0 1155e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com VLD2 {dWr[1],dWi[1]},[pTwiddle]! @// grp 1 1165e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1175e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com @//VLD2 {dWr,dWi},[pTwiddle],#16 1185e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1195e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com VLD4 {dXr0[0],dXi0[0],dXr1[0],dXi1[0]},[pSrc]! @// grp 0 1205e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com VLD4 {dXr0[1],dXi0[1],dXr1[1],dXi1[1]},[pSrc]! @// grp 1 1215e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1225e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1235e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com @//VLD4 {dXr0,dXi0,dXr1,dXi1},[pSrc],#32 1245e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com SUBS grpCount,grpCount,#4 @// grpCount is multiplied by 2 1255e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1265e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com .ifeqs "\inverse", "TRUE" 127a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com VMULL qT0,dXr1,dWr 1285e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com VMLAL qT0,dXi1,dWi @// real part 129a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com VMULL qT1,dXi1,dWr 1305e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com VMLSL qT1,dXr1,dWi @// imag part 1315e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1325e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com .ELSE 133a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com VMULL qT0,dXr1,dWr 1345e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com VMLSL qT0,dXi1,dWi @// real part 135a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com VMULL qT1,dXi1,dWr 1365e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com VMLAL qT1,dXr1,dWi @// imag part 1375e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1385e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com .ENDIF 1395e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 140a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com VRSHRN dXr1,qT0,#15 141a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com VRSHRN dXi1,qT1,#15 1425e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1435e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1445e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com .ifeqs "\scaled", "TRUE" 1455e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 146a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com VHSUB dYr0,dXr0,dXr1 147a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com VHSUB dYi0,dXi0,dXi1 148a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com VHADD dYr1,dXr0,dXr1 149a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com VHADD dYi1,dXi0,dXi1 1505e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1515e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com .ELSE 1525e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 153a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com VSUB dYr0,dXr0,dXr1 154a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com VSUB dYi0,dXi0,dXi1 155a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com VADD dYr1,dXr0,dXr1 156a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com VADD dYi1,dXi0,dXi1 1575e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1585e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1595e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com .ENDIF 1605e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 161a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com VST2 {dYr0[0],dYi0[0]},[pDst]! 1625e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com VST2 {dYr0[1],dYi0[1]},[pDst],step @// step = -4+outPointStep 1635e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 164a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com VST2 {dYr1[0],dYi1[0]},[pDst]! 1655e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com VST2 {dYr1[1],dYi1[1]},[pDst],dstStep @// dstStep = -4-outPointStep+8 = -step 1665e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1675e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com @//VST2 {dYr0,dYi0},[pDst],outPointStep 1685e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com @//VST2 {dYr1,dYi1},[pDst],dstStep @// dstStep = step = -outPointStep + 16 1695e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1705e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com BGT grpLoop\name 1715e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1725e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1735e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com @// Reset and Swap pSrc and pDst for the next stage 174a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com MOV pTmp,pDst 1755e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com SUB pDst,pSrc,outPointStep,LSL #1 @// pDst -= 2*size; pSrc -= 4*size bytes 176a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com SUB pSrc,pTmp,outPointStep 1775e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1785e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com @// Reset pTwiddle for the next stage 1795e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com SUB pTwiddle,pTwiddle,outPointStep @// pTwiddle -= 2*size bytes 1805e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1815e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com .endm 1825e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1835e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1845e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 185a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com M_START armSP_FFTFwd_CToC_SC16_Radix2_ls_OutOfPlace_unsafe,r4 1865e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com FFTSTAGE "FALSE","FALSE",FWD 187a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com M_END 188a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com 1895e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1905e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 191a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com M_START armSP_FFTInv_CToC_SC16_Radix2_ls_OutOfPlace_unsafe,r4 1925e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com FFTSTAGE "FALSE","TRUE",INV 193a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com M_END 1945e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1955e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 1965e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 197a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com M_START armSP_FFTFwd_CToC_SC16_Sfs_Radix2_ls_OutOfPlace_unsafe,r4 1985e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com FFTSTAGE "TRUE","FALSE",FWDSFS 199a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com M_END 200a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com 2015e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 2025e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 203a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com M_START armSP_FFTInv_CToC_SC16_Sfs_Radix2_ls_OutOfPlace_unsafe,r4 2045e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com FFTSTAGE "TRUE","TRUE",INVSFS 205a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com M_END 206a2c02e342750946639b77d1a42f9a9da85a84b82rtoy@google.com 2075e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 2085e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 2095e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com 2105e49351d609862d862bd3d3b8dbd133205079b84rtoy@google.com .END 211