diff options
author | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
---|---|---|
committer | Matt A. Tobin <mattatobin@localhost.localdomain> | 2018-02-02 04:16:08 -0500 |
commit | 5f8de423f190bbb79a62f804151bc24824fa32d8 (patch) | |
tree | 10027f336435511475e392454359edea8e25895d /media/openmax_dl | |
parent | 49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff) | |
download | uxp-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz |
Add m-esr52 at 52.6.0
Diffstat (limited to 'media/openmax_dl')
64 files changed, 22154 insertions, 0 deletions
diff --git a/media/openmax_dl/LICENSE b/media/openmax_dl/LICENSE new file mode 100644 index 0000000000..845a9342eb --- /dev/null +++ b/media/openmax_dl/LICENSE @@ -0,0 +1,39 @@ +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file in the root of the source tree. All +contributing project authors may be found in the AUTHORS file in the +root of the source tree. + +The files were originally licensed by ARM Limited. + +The following files: + + * dl/api/omxtypes.h + * dl/sp/api/omxSP.h + +are licensed by Khronos: + +Copyright (c) 2005-2008,2015 The Khronos Group Inc. + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and/or associated documentation files (the +"Materials"), to deal in the Materials without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Materials, and to +permit persons to whom the Materials are furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Materials. + +MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS +KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS +SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT + https://www.khronos.org/registry/ + +THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. diff --git a/media/openmax_dl/OWNERS b/media/openmax_dl/OWNERS new file mode 100644 index 0000000000..34fc598f0b --- /dev/null +++ b/media/openmax_dl/OWNERS @@ -0,0 +1,3 @@ +ajm@google.com +kma@google.com +rtoy@google.com diff --git a/media/openmax_dl/README.chromium b/media/openmax_dl/README.chromium new file mode 100644 index 0000000000..3dbc3ffe29 --- /dev/null +++ b/media/openmax_dl/README.chromium @@ -0,0 +1,19 @@ +Name: OpenMAX DL +Short Name: OpenMax DL +URL: https://silver.arm.com/download/Software/Graphics/OX000-BU-00010-r1p0-00bet0/OX000-BU-00010-r1p0-00bet0.tgz +Version: 1.0.2 +License: BSD +License File: LICENSE +Security Critical: yes + +Description: +Implementation of OpenMAX DL spec from ARM. This is used to support +WebAudio for Chromium on Android. + +Local Modifications: +Only the FFT routines from the OpenMAX DL package are included. The +code was modified to work with gcc and a new implementation for a +floating-point FFT was added. + +The original ARM license is unclear, but Google has obtained +permission to relicense this code under a BSD license. diff --git a/media/openmax_dl/README.mozilla b/media/openmax_dl/README.mozilla new file mode 100644 index 0000000000..1dbf41b605 --- /dev/null +++ b/media/openmax_dl/README.mozilla @@ -0,0 +1,9 @@ +Bug 1158741 added an omxSP_FFTInv_CCSToR_F32_Sfs_unscaled function as an +optimization which performs the same operation as +omxSP_FFTInv_CCSToR_F32_Sfs except it doesn't scale the results by the +length of the FFT. For consistency with other FFT routines used, it does +multiply the results by two. + +The affected files are: +media/openmax_dl/dl/sp/api/omxSP.h +media/openmax_dl/dl/sp/src/omxSP_FFTInv_CCSToR_F32_Sfs_unscaled_s.S diff --git a/media/openmax_dl/dl/Makefile.in b/media/openmax_dl/dl/Makefile.in new file mode 100644 index 0000000000..d1bf329134 --- /dev/null +++ b/media/openmax_dl/dl/Makefile.in @@ -0,0 +1,7 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +ifeq (WINNT,$(OS_TARGET)) +VISIBILITY_FLAGS = +endif diff --git a/media/openmax_dl/dl/api/armCOMM_s.h b/media/openmax_dl/dl/api/armCOMM_s.h new file mode 100644 index 0000000000..2dc5d6b32a --- /dev/null +++ b/media/openmax_dl/dl/api/armCOMM_s.h @@ -0,0 +1,412 @@ +@// -*- Mode: asm; -*- +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. +@// + +@// +@// File Name: armCOMM_s.h +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 13871 +@// Last Modified Date: Fri, 09 May 2008 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// ARM optimized OpenMAX common header file +@// + + .set _SBytes, 0 @ Number of scratch bytes on stack + .set _Workspace, 0 @ Stack offset of scratch workspace + + .set _RRegList, 0 @ R saved register list (last register number) + .set _DRegList, 0 @ D saved register list (last register number) + + @// Work out a list of R saved registers, and how much stack space is needed. + @// gas doesn't support setting a variable to a string, so we set _RRegList to + @// the register number. + .macro _M_GETRREGLIST rreg + .ifeqs "\rreg", "" + @ Nothing needs to be saved + .exitm + .endif + @ If rreg is lr or r4, save lr and r4 + .ifeqs "\rreg", "lr" + .set _RRegList, 4 + .exitm + .endif + + .ifeqs "\rreg", "r4" + .set _RRegList, 4 + .exitm + .endif + + @ If rreg = r5 or r6, save up to register r6 + .ifeqs "\rreg", "r5" + .set _RRegList, 6 + .exitm + .endif + .ifeqs "\rreg", "r6" + .set _RRegList, 6 + .exitm + .endif + + @ If rreg = r7 or r8, save up to register r8 + .ifeqs "\rreg", "r7" + .set _RRegList, 8 + .exitm + .endif + .ifeqs "\rreg", "r8" + .set _RRegList, 8 + .exitm + .endif + + @ If rreg = r9 or r10, save up to register r10 + .ifeqs "\rreg", "r9" + .set _RRegList, 10 + .exitm + .endif + .ifeqs "\rreg", "r10" + .set _RRegList, 10 + .exitm + .endif + + @ If rreg = r11 or r12, save up to register r12 + .ifeqs "\rreg", "r11" + .set _RRegList, 12 + .exitm + .endif + .ifeqs "\rreg", "r12" + .set _RRegList, 12 + .exitm + .endif + + .warning "Unrecognized saved r register limit: \rreg" + .endm + + @ Work out list of D saved registers, like for R registers. + .macro _M_GETDREGLIST dreg + .ifeqs "\dreg", "" + .set _DRegList, 0 + .exitm + .endif + + .ifeqs "\dreg", "d8" + .set _DRegList, 8 + .exitm + .endif + + .ifeqs "\dreg", "d9" + .set _DRegList, 9 + .exitm + .endif + + .ifeqs "\dreg", "d10" + .set _DRegList, 10 + .exitm + .endif + + .ifeqs "\dreg", "d11" + .set _DRegList, 11 + .exitm + .endif + + .ifeqs "\dreg", "d12" + .set _DRegList, 12 + .exitm + .endif + + .ifeqs "\dreg", "d13" + .set _DRegList, 13 + .exitm + .endif + + .ifeqs "\dreg", "d14" + .set _DRegList, 14 + .exitm + .endif + + .ifeqs "\dreg", "d15" + .set _DRegList, 15 + .exitm + .endif + + .warning "Unrecognized saved d register limit: \rreg" + .endm + +@////////////////////////////////////////////////////////// +@// Function header and footer macros +@////////////////////////////////////////////////////////// + + @ Function Header Macro + @ Generates the function prologue + @ Note that functions should all be "stack-moves-once" + @ The FNSTART and FNEND macros should be the only places + @ where the stack moves. + @ + @ name = function name + @ rreg = "" don't stack any registers + @ "lr" stack "lr" only + @ "rN" stack registers "r4-rN,lr" + @ dreg = "" don't stack any D registers + @ "dN" stack registers "d8-dN" + @ + @ Note: ARM Archicture procedure call standard AAPCS + @ states that r4-r11, sp, d8-d15 must be preserved by + @ a compliant function. + .macro M_START name, rreg, dreg + .set _Workspace, 0 + + @ Define the function and make it external. + .global \name + .func \name + .section .text.\name,"ax",%progbits + .arch armv7-a + .fpu neon + .object_arch armv4 + .align 2 +\name : +.fnstart + @ Save specified R registers + _M_GETRREGLIST \rreg + _M_PUSH_RREG + + @ Save specified D registers + _M_GETDREGLIST \dreg + _M_PUSH_DREG + + @ Ensure size claimed on stack is 8-byte aligned + .if (_SBytes & 7) != 0 + .set _SBytes, _SBytes + (8 - (_SBytes & 7)) + .endif + .if _SBytes != 0 + sub sp, sp, #_SBytes + .endif + .endm + + @ Function Footer Macro + @ Generates the function epilogue + .macro M_END + @ Restore the stack pointer to its original value on function entry + .if _SBytes != 0 + add sp, sp, #_SBytes + .endif + @ Restore any saved R or D registers. + _M_RET + .fnend + .endfunc + @ Reset the global stack tracking variables back to their + @ initial values. + .set _SBytes, 0 + .endm + + @// Based on the value of _DRegList, push the specified set of registers + @// to the stack. Is there a better way? + .macro _M_PUSH_DREG + .if _DRegList == 8 + vpush {d8} + .exitm + .endif + + .if _DRegList == 9 + vpush {d8-d9} + .exitm + .endif + + .if _DRegList == 10 + vpush {d8-d10} + .exitm + .endif + + .if _DRegList == 11 + vpush {d8-d11} + .exitm + .endif + + .if _DRegList == 12 + vpush {d8-d12} + .exitm + .endif + + .if _DRegList == 13 + vpush {d8-d13} + .exitm + .endif + + .if _DRegList == 14 + vpush {d8-d14} + .exitm + .endif + + .if _DRegList == 15 + vpush {d8-d15} + .exitm + .endif + .endm + + @// Based on the value of _RRegList, push the specified set of registers + @// to the stack. Is there a better way? + .macro _M_PUSH_RREG + .if _RRegList == 4 + stmfd sp!, {r4, lr} + .exitm + .endif + + .if _RRegList == 6 + stmfd sp!, {r4-r6, lr} + .exitm + .endif + + .if _RRegList == 8 + stmfd sp!, {r4-r8, lr} + .exitm + .endif + + .if _RRegList == 10 + stmfd sp!, {r4-r10, lr} + .exitm + .endif + + .if _RRegList == 12 + stmfd sp!, {r4-r12, lr} + .exitm + .endif + .endm + + @// The opposite of _M_PUSH_DREG + .macro _M_POP_DREG + .if _DRegList == 8 + vpop {d8} + .exitm + .endif + + .if _DRegList == 9 + vpop {d8-d9} + .exitm + .endif + + .if _DRegList == 10 + vpop {d8-d10} + .exitm + .endif + + .if _DRegList == 11 + vpop {d8-d11} + .exitm + .endif + + .if _DRegList == 12 + vpop {d8-d12} + .exitm + .endif + + .if _DRegList == 13 + vpop {d8-d13} + .exitm + .endif + + .if _DRegList == 14 + vpop {d8-d14} + .exitm + .endif + + .if _DRegList == 15 + vpop {d8-d15} + .exitm + .endif + .endm + + @// The opposite of _M_PUSH_RREG + .macro _M_POP_RREG cc + .if _RRegList == 0 + bx\cc lr + .exitm + .endif + .if _RRegList == 4 + ldm\cc\()fd sp!, {r4, pc} + .exitm + .endif + + .if _RRegList == 6 + ldm\cc\()fd sp!, {r4-r6, pc} + .exitm + .endif + + .if _RRegList == 8 + ldm\cc\()fd sp!, {r4-r8, pc} + .exitm + .endif + + .if _RRegList == 10 + ldm\cc\()fd sp!, {r4-r10, pc} + .exitm + .endif + + .if _RRegList == 12 + ldm\cc\()fd sp!, {r4-r12, pc} + .exitm + .endif + .endm + + @ Produce function return instructions + .macro _M_RET cc + _M_POP_DREG \cc + _M_POP_RREG \cc + .endm + + @// Allocate 4-byte aligned area of name + @// |name| and size |size| bytes. + .macro M_ALLOC4 name, size + .if (_SBytes & 3) != 0 + .set _SBytes, _SBytes + (4 - (_SBytes & 3)) + .endif + .set \name\()_F, _SBytes + .set _SBytes, _SBytes + \size + + .endm + + @ Load word from stack + .macro M_LDR r, a0, a1, a2, a3 + _M_DATA "ldr", 4, \r, \a0, \a1, \a2, \a3 + .endm + + @ Store word to stack + .macro M_STR r, a0, a1, a2, a3 + _M_DATA "str", 4, \r, \a0, \a1, \a2, \a3 + .endm + + @ Macro to perform a data access operation + @ Such as LDR or STR + @ The addressing mode is modified such that + @ 1. If no address is given then the name is taken + @ as a stack offset + @ 2. If the addressing mode is not available for the + @ state being assembled for (eg Thumb) then a suitable + @ addressing mode is substituted. + @ + @ On Entry: + @ $i = Instruction to perform (eg "LDRB") + @ $a = Required byte alignment + @ $r = Register(s) to transfer (eg "r1") + @ $a0,$a1,$a2. Addressing mode and condition. One of: + @ label {,cc} + @ [base] {,,,cc} + @ [base, offset]{!} {,,cc} + @ [base, offset, shift]{!} {,cc} + @ [base], offset {,,cc} + @ [base], offset, shift {,cc} + @ + @ WARNING: Most of the above are not supported, except the first case. + .macro _M_DATA i, a, r, a0, a1, a2, a3 + .set _Offset, _Workspace + \a0\()_F + \i\a1 \r, [sp, #_Offset] + .endm diff --git a/media/openmax_dl/dl/api/armOMX.h b/media/openmax_dl/dl/api/armOMX.h new file mode 100644 index 0000000000..0ad21c42ce --- /dev/null +++ b/media/openmax_dl/dl/api/armOMX.h @@ -0,0 +1,289 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + * + * This file was originally licensed as follows. It has been + * relicensed with permission from the copyright holders. + */ + +/* + * + * File Name: armOMX_ReleaseVersion.h + * OpenMAX DL: v1.0.2 + * Last Modified Revision: 15322 + * Last Modified Date: Wed, 15 Oct 2008 + * + * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. + * + * + * + * This file allows a version of the OMX DL libraries to be built where some or + * all of the function names can be given a user specified suffix. + * + * You might want to use it where: + * + * - you want to rename a function "out of the way" so that you could replace + * a function with a different version (the original version would still be + * in the library just with a different name - so you could debug the new + * version by comparing it to the output of the old) + * + * - you want to rename all the functions to versions with a suffix so that + * you can include two versions of the library and choose between functions + * at runtime. + * + * e.g. omxIPBM_Copy_U8_C1R could be renamed omxIPBM_Copy_U8_C1R_CortexA8 + * + */ + + +#ifndef _armOMX_H_ +#define _armOMX_H_ + +#define ARMOMX_ENABLE_RENAMING 0 +#if ARMOMX_ENABLE_RENAMING + +/* We need to define these two macros in order to expand and concatenate the names */ +#define OMXCAT2BAR(A, B) omx ## A ## B +#define OMXCATBAR(A, B) OMXCAT2BAR(A, B) + +/* Define the suffix to add to all functions - the default is no suffix */ +#define BARE_SUFFIX + + + +/* Define what happens to the bare suffix-less functions, down to the sub-domain accuracy */ +#define OMXACAAC_SUFFIX BARE_SUFFIX +#define OMXACMP3_SUFFIX BARE_SUFFIX +#define OMXICJP_SUFFIX BARE_SUFFIX +#define OMXIPBM_SUFFIX BARE_SUFFIX +#define OMXIPCS_SUFFIX BARE_SUFFIX +#define OMXIPPP_SUFFIX BARE_SUFFIX +#define OMXSP_SUFFIX BARE_SUFFIX +#define OMXVCCOMM_SUFFIX BARE_SUFFIX +#define OMXVCM4P10_SUFFIX BARE_SUFFIX +#define OMXVCM4P2_SUFFIX BARE_SUFFIX + + + + +/* Define what the each bare, un-suffixed OpenMAX API function names is to be renamed */ +#define omxACAAC_DecodeChanPairElt OMXCATBAR(ACAAC_DecodeChanPairElt, OMXACAAC_SUFFIX) +#define omxACAAC_DecodeDatStrElt OMXCATBAR(ACAAC_DecodeDatStrElt, OMXACAAC_SUFFIX) +#define omxACAAC_DecodeFillElt OMXCATBAR(ACAAC_DecodeFillElt, OMXACAAC_SUFFIX) +#define omxACAAC_DecodeIsStereo_S32 OMXCATBAR(ACAAC_DecodeIsStereo_S32, OMXACAAC_SUFFIX) +#define omxACAAC_DecodeMsPNS_S32_I OMXCATBAR(ACAAC_DecodeMsPNS_S32_I, OMXACAAC_SUFFIX) +#define omxACAAC_DecodeMsStereo_S32_I OMXCATBAR(ACAAC_DecodeMsStereo_S32_I, OMXACAAC_SUFFIX) +#define omxACAAC_DecodePrgCfgElt OMXCATBAR(ACAAC_DecodePrgCfgElt, OMXACAAC_SUFFIX) +#define omxACAAC_DecodeTNS_S32_I OMXCATBAR(ACAAC_DecodeTNS_S32_I, OMXACAAC_SUFFIX) +#define omxACAAC_DeinterleaveSpectrum_S32 OMXCATBAR(ACAAC_DeinterleaveSpectrum_S32, OMXACAAC_SUFFIX) +#define omxACAAC_EncodeTNS_S32_I OMXCATBAR(ACAAC_EncodeTNS_S32_I, OMXACAAC_SUFFIX) +#define omxACAAC_LongTermPredict_S32 OMXCATBAR(ACAAC_LongTermPredict_S32, OMXACAAC_SUFFIX) +#define omxACAAC_LongTermReconstruct_S32_I OMXCATBAR(ACAAC_LongTermReconstruct_S32_I, OMXACAAC_SUFFIX) +#define omxACAAC_MDCTFwd_S32 OMXCATBAR(ACAAC_MDCTFwd_S32, OMXACAAC_SUFFIX) +#define omxACAAC_MDCTInv_S32_S16 OMXCATBAR(ACAAC_MDCTInv_S32_S16, OMXACAAC_SUFFIX) +#define omxACAAC_NoiselessDecode OMXCATBAR(ACAAC_NoiselessDecode, OMXACAAC_SUFFIX) +#define omxACAAC_QuantInv_S32_I OMXCATBAR(ACAAC_QuantInv_S32_I, OMXACAAC_SUFFIX) +#define omxACAAC_UnpackADIFHeader OMXCATBAR(ACAAC_UnpackADIFHeader, OMXACAAC_SUFFIX) +#define omxACAAC_UnpackADTSFrameHeader OMXCATBAR(ACAAC_UnpackADTSFrameHeader, OMXACAAC_SUFFIX) + + +#define omxACMP3_HuffmanDecode_S32 OMXCATBAR(ACMP3_HuffmanDecode_S32, OMXACMP3_SUFFIX) +#define omxACMP3_HuffmanDecodeSfb_S32 OMXCATBAR(ACMP3_HuffmanDecodeSfb_S32, OMXACMP3_SUFFIX) +#define omxACMP3_HuffmanDecodeSfbMbp_S32 OMXCATBAR(ACMP3_HuffmanDecodeSfbMbp_S32, OMXACMP3_SUFFIX) +#define omxACMP3_MDCTInv_S32 OMXCATBAR(ACMP3_MDCTInv_S32, OMXACMP3_SUFFIX) +#define omxACMP3_ReQuantize_S32_I OMXCATBAR(ACMP3_ReQuantize_S32_I, OMXACMP3_SUFFIX) +#define omxACMP3_ReQuantizeSfb_S32_I OMXCATBAR(ACMP3_ReQuantizeSfb_S32_I, OMXACMP3_SUFFIX) +#define omxACMP3_SynthPQMF_S32_S16 OMXCATBAR(ACMP3_SynthPQMF_S32_S16, OMXACMP3_SUFFIX) +#define omxACMP3_UnpackFrameHeader OMXCATBAR(ACMP3_UnpackFrameHeader, OMXACMP3_SUFFIX) +#define omxACMP3_UnpackScaleFactors_S8 OMXCATBAR(ACMP3_UnpackScaleFactors_S8, OMXACMP3_SUFFIX) +#define omxACMP3_UnpackSideInfo OMXCATBAR(ACMP3_UnpackSideInfo, OMXACMP3_SUFFIX) + +#define omxICJP_CopyExpand_U8_C3 OMXCATBAR(ICJP_CopyExpand_U8_C3, OMXICJP_SUFFIX) +#define omxICJP_DCTFwd_S16 OMXCATBAR(ICJP_DCTFwd_S16, OMXICJP_SUFFIX) +#define omxICJP_DCTFwd_S16_I OMXCATBAR(ICJP_DCTFwd_S16_I, OMXICJP_SUFFIX) +#define omxICJP_DCTInv_S16 OMXCATBAR(ICJP_DCTInv_S16, OMXICJP_SUFFIX) +#define omxICJP_DCTInv_S16_I OMXCATBAR(ICJP_DCTInv_S16_I, OMXICJP_SUFFIX) +#define omxICJP_DCTQuantFwd_Multiple_S16 OMXCATBAR(ICJP_DCTQuantFwd_Multiple_S16, OMXICJP_SUFFIX) +#define omxICJP_DCTQuantFwd_S16 OMXCATBAR(ICJP_DCTQuantFwd_S16, OMXICJP_SUFFIX) +#define omxICJP_DCTQuantFwd_S16_I OMXCATBAR(ICJP_DCTQuantFwd_S16_I, OMXICJP_SUFFIX) +#define omxICJP_DCTQuantFwdTableInit OMXCATBAR(ICJP_DCTQuantFwdTableInit, OMXICJP_SUFFIX) +#define omxICJP_DCTQuantInv_Multiple_S16 OMXCATBAR(ICJP_DCTQuantInv_Multiple_S16, OMXICJP_SUFFIX) +#define omxICJP_DCTQuantInv_S16 OMXCATBAR(ICJP_DCTQuantInv_S16, OMXICJP_SUFFIX) +#define omxICJP_DCTQuantInv_S16_I OMXCATBAR(ICJP_DCTQuantInv_S16_I, OMXICJP_SUFFIX) +#define omxICJP_DCTQuantInvTableInit OMXCATBAR(ICJP_DCTQuantInvTableInit, OMXICJP_SUFFIX) +#define omxICJP_DecodeHuffman8x8_Direct_S16_C1 OMXCATBAR(ICJP_DecodeHuffman8x8_Direct_S16_C1, OMXICJP_SUFFIX) +#define omxICJP_DecodeHuffmanSpecGetBufSize_U8 OMXCATBAR(ICJP_DecodeHuffmanSpecGetBufSize_U8, OMXICJP_SUFFIX) +#define omxICJP_DecodeHuffmanSpecInit_U8 OMXCATBAR(ICJP_DecodeHuffmanSpecInit_U8, OMXICJP_SUFFIX) +#define omxICJP_EncodeHuffman8x8_Direct_S16_U1_C1 OMXCATBAR(ICJP_EncodeHuffman8x8_Direct_S16_U1_C1, OMXICJP_SUFFIX) +#define omxICJP_EncodeHuffmanSpecGetBufSize_U8 OMXCATBAR(ICJP_EncodeHuffmanSpecGetBufSize_U8, OMXICJP_SUFFIX) +#define omxICJP_EncodeHuffmanSpecInit_U8 OMXCATBAR(ICJP_EncodeHuffmanSpecInit_U8, OMXICJP_SUFFIX) + +#define omxIPBM_AddC_U8_C1R_Sfs OMXCATBAR(IPBM_AddC_U8_C1R_Sfs, OMXIPBM_SUFFIX) +#define omxIPBM_Copy_U8_C1R OMXCATBAR(IPBM_Copy_U8_C1R, OMXIPBM_SUFFIX) +#define omxIPBM_Copy_U8_C3R OMXCATBAR(IPBM_Copy_U8_C3R, OMXIPBM_SUFFIX) +#define omxIPBM_Mirror_U8_C1R OMXCATBAR(IPBM_Mirror_U8_C1R, OMXIPBM_SUFFIX) +#define omxIPBM_MulC_U8_C1R_Sfs OMXCATBAR(IPBM_MulC_U8_C1R_Sfs, OMXIPBM_SUFFIX) + +#define omxIPCS_ColorTwistQ14_U8_C3R OMXCATBAR(IPCS_ColorTwistQ14_U8_C3R, OMXIPCS_SUFFIX) +#define omxIPCS_BGR565ToYCbCr420LS_MCU_U16_S16_C3P3R OMXCATBAR(IPCS_BGR565ToYCbCr420LS_MCU_U16_S16_C3P3R, OMXIPCS_SUFFIX) +#define omxIPCS_BGR565ToYCbCr422LS_MCU_U16_S16_C3P3R OMXCATBAR(IPCS_BGR565ToYCbCr422LS_MCU_U16_S16_C3P3R, OMXIPCS_SUFFIX) +#define omxIPCS_BGR565ToYCbCr444LS_MCU_U16_S16_C3P3R OMXCATBAR(IPCS_BGR565ToYCbCr444LS_MCU_U16_S16_C3P3R, OMXIPCS_SUFFIX) +#define omxIPCS_BGR888ToYCbCr420LS_MCU_U8_S16_C3P3R OMXCATBAR(IPCS_BGR888ToYCbCr420LS_MCU_U8_S16_C3P3R, OMXIPCS_SUFFIX) +#define omxIPCS_BGR888ToYCbCr422LS_MCU_U8_S16_C3P3R OMXCATBAR(IPCS_BGR888ToYCbCr422LS_MCU_U8_S16_C3P3R, OMXIPCS_SUFFIX) +#define omxIPCS_BGR888ToYCbCr444LS_MCU_U8_S16_C3P3R OMXCATBAR(IPCS_BGR888ToYCbCr444LS_MCU_U8_S16_C3P3R, OMXIPCS_SUFFIX) +#define omxIPCS_YCbCr420RszCscRotBGR_U8_P3C3R OMXCATBAR(IPCS_YCbCr420RszCscRotBGR_U8_P3C3R, OMXIPCS_SUFFIX) +#define omxIPCS_YCbCr420RszRot_U8_P3R OMXCATBAR(IPCS_YCbCr420RszRot_U8_P3R, OMXIPCS_SUFFIX) +#define omxIPCS_YCbCr420ToBGR565_U8_U16_P3C3R OMXCATBAR(IPCS_YCbCr420ToBGR565_U8_U16_P3C3R, OMXIPCS_SUFFIX) +#define omxIPCS_YCbCr420ToBGR565LS_MCU_S16_U16_P3C3R OMXCATBAR(IPCS_YCbCr420ToBGR565LS_MCU_S16_U16_P3C3R, OMXIPCS_SUFFIX) +#define omxIPCS_YCbCr420ToBGR888LS_MCU_S16_U8_P3C3R OMXCATBAR(IPCS_YCbCr420ToBGR888LS_MCU_S16_U8_P3C3R, OMXIPCS_SUFFIX) +#define omxIPCS_YCbCr422RszCscRotBGR_U8_P3C3R OMXCATBAR(IPCS_YCbCr422RszCscRotBGR_U8_P3C3R, OMXIPCS_SUFFIX) +#define omxIPCS_CbYCrY422RszCscRotBGR_U8_U16_C2R OMXCATBAR(IPCS_CbYCrY422RszCscRotBGR_U8_U16_C2R, OMXIPCS_SUFFIX) +#define omxIPCS_YCbCr422RszRot_U8_P3R OMXCATBAR(IPCS_YCbCr422RszRot_U8_P3R, OMXIPCS_SUFFIX) +#define omxIPCS_YCbYCr422ToBGR565_U8_U16_C2C3R OMXCATBAR(IPCS_YCbYCr422ToBGR565_U8_U16_C2C3R, OMXIPCS_SUFFIX) +#define omxIPCS_YCbCr422ToBGR565LS_MCU_S16_U16_P3C3R OMXCATBAR(IPCS_YCbCr422ToBGR565LS_MCU_S16_U16_P3C3R, OMXIPCS_SUFFIX) +#define omxIPCS_YCbYCr422ToBGR888_U8_C2C3R OMXCATBAR(IPCS_YCbYCr422ToBGR888_U8_C2C3R, OMXIPCS_SUFFIX) +#define omxIPCS_YCbCr422ToBGR888LS_MCU_S16_U8_P3C3R OMXCATBAR(IPCS_YCbCr422ToBGR888LS_MCU_S16_U8_P3C3R, OMXIPCS_SUFFIX) +#define omxIPCS_YCbCr422ToBGR888LS_MCU_S16_U8_P3C3R OMXCATBAR(IPCS_YCbCr422ToBGR888LS_MCU_S16_U8_P3C3R, OMXIPCS_SUFFIX) +#define omxIPCS_CbYCrY422ToYCbCr420Rotate_U8_C2P3R OMXCATBAR(IPCS_CbYCrY422ToYCbCr420Rotate_U8_C2P3R, OMXIPCS_SUFFIX) +#define omxIPCS_YCbCr422ToYCbCr420Rotate_U8_P3R OMXCATBAR(IPCS_YCbCr422ToYCbCr420Rotate_U8_P3R, OMXIPCS_SUFFIX) +#define omxIPCS_YCbCr444ToBGR565_U8_U16_C3R OMXCATBAR(IPCS_YCbCr444ToBGR565_U8_U16_C3R, OMXIPCS_SUFFIX) +#define omxIPCS_YCbCr444ToBGR565_U8_U16_P3C3R OMXCATBAR(IPCS_YCbCr444ToBGR565_U8_U16_P3C3R, OMXIPCS_SUFFIX) +#define omxIPCS_YCbCr444ToBGR565LS_MCU_S16_U16_P3C3R OMXCATBAR(IPCS_YCbCr444ToBGR565LS_MCU_S16_U16_P3C3R, OMXIPCS_SUFFIX) +#define omxIPCS_YCbCr444ToBGR888_U8_C3R OMXCATBAR(IPCS_YCbCr444ToBGR888_U8_C3R, OMXIPCS_SUFFIX) + +#define omxIPPP_Deblock_HorEdge_U8_I OMXCATBAR(IPPP_Deblock_HorEdge_U8_I, OMXIPPP_SUFFIX) +#define omxIPPP_Deblock_VerEdge_U8_I OMXCATBAR(IPPP_Deblock_VerEdge_U8_I, OMXIPPP_SUFFIX) +#define omxIPPP_FilterFIR_U8_C1R OMXCATBAR(IPPP_FilterFIR_U8_C1R, OMXIPPP_SUFFIX) +#define omxIPPP_FilterMedian_U8_C1R OMXCATBAR(IPPP_FilterMedian_U8_C1R, OMXIPPP_SUFFIX) +#define omxIPPP_GetCentralMoment_S64 OMXCATBAR(IPPP_GetCentralMoment_S64, OMXIPPP_SUFFIX) +#define omxIPPP_GetSpatialMoment_S64 OMXCATBAR(IPPP_GetSpatialMoment_S64, OMXIPPP_SUFFIX) +#define omxIPPP_MomentGetStateSize OMXCATBAR(IPPP_MomentGetStateSize, OMXIPPP_SUFFIX) +#define omxIPPP_MomentInit OMXCATBAR(IPPP_MomentInit, OMXIPPP_SUFFIX) +#define omxIPPP_Moments_U8_C1R OMXCATBAR(IPPP_Moments_U8_C1R, OMXIPPP_SUFFIX) +#define omxIPPP_Moments_U8_C3R OMXCATBAR(IPPP_Moments_U8_C3R, OMXIPPP_SUFFIX) + +#define omxSP_BlockExp_S16 OMXCATBAR(SP_BlockExp_S16, OMXSP_SUFFIX) +#define omxSP_BlockExp_S32 OMXCATBAR(SP_BlockExp_S32, OMXSP_SUFFIX) +#define omxSP_Copy_S16 OMXCATBAR(SP_Copy_S16, OMXSP_SUFFIX) +#define omxSP_DotProd_S16 OMXCATBAR(SP_DotProd_S16, OMXSP_SUFFIX) +#define omxSP_DotProd_S16_Sfs OMXCATBAR(SP_DotProd_S16_Sfs, OMXSP_SUFFIX) +#define omxSP_FFTFwd_CToC_SC16_Sfs OMXCATBAR(SP_FFTFwd_CToC_SC16_Sfs, OMXSP_SUFFIX) +#define omxSP_FFTFwd_CToC_SC32_Sfs OMXCATBAR(SP_FFTFwd_CToC_SC32_Sfs, OMXSP_SUFFIX) +#define omxSP_FFTFwd_RToCCS_S16S32_Sfs OMXCATBAR(SP_FFTFwd_RToCCS_S16S32_Sfs, OMXSP_SUFFIX) +#define omxSP_FFTFwd_RToCCS_S32_Sfs OMXCATBAR(SP_FFTFwd_RToCCS_S32_Sfs, OMXSP_SUFFIX) +#define omxSP_FFTGetBufSize_C_SC16 OMXCATBAR(SP_FFTGetBufSize_C_SC16, OMXSP_SUFFIX) +#define omxSP_FFTGetBufSize_C_SC32 OMXCATBAR(SP_FFTGetBufSize_C_SC32, OMXSP_SUFFIX) +#define omxSP_FFTGetBufSize_R_S16S32 OMXCATBAR(SP_FFTGetBufSize_R_S16S32, OMXSP_SUFFIX) +#define omxSP_FFTGetBufSize_R_S32 OMXCATBAR(SP_FFTGetBufSize_R_S32, OMXSP_SUFFIX) +#define omxSP_FFTInit_C_SC16 OMXCATBAR(SP_FFTInit_C_SC16, OMXSP_SUFFIX) +#define omxSP_FFTInit_C_SC32 OMXCATBAR(SP_FFTInit_C_SC32, OMXSP_SUFFIX) +#define omxSP_FFTInit_R_S16S32 OMXCATBAR(SP_FFTInit_R_S16S32, OMXSP_SUFFIX) +#define omxSP_FFTInit_R_S32 OMXCATBAR(SP_FFTInit_R_S32, OMXSP_SUFFIX) +#define omxSP_FFTInv_CCSToR_S32_Sfs OMXCATBAR(SP_FFTInv_CCSToR_S32_Sfs, OMXSP_SUFFIX) +#define omxSP_FFTInv_CCSToR_S32S16_Sfs OMXCATBAR(SP_FFTInv_CCSToR_S32S16_Sfs, OMXSP_SUFFIX) +#define omxSP_FFTInv_CToC_SC16_Sfs OMXCATBAR(SP_FFTInv_CToC_SC16_Sfs, OMXSP_SUFFIX) +#define omxSP_FFTInv_CToC_SC32_Sfs OMXCATBAR(SP_FFTInv_CToC_SC32_Sfs, OMXSP_SUFFIX) +#define omxSP_FilterMedian_S32 OMXCATBAR(SP_FilterMedian_S32, OMXSP_SUFFIX) +#define omxSP_FilterMedian_S32_I OMXCATBAR(SP_FilterMedian_S32_I, OMXSP_SUFFIX) +#define omxSP_FIR_Direct_S16 OMXCATBAR(SP_FIR_Direct_S16, OMXSP_SUFFIX) +#define omxSP_FIR_Direct_S16_I OMXCATBAR(SP_FIR_Direct_S16_I, OMXSP_SUFFIX) +#define omxSP_FIR_Direct_S16_ISfs OMXCATBAR(SP_FIR_Direct_S16_ISfs, OMXSP_SUFFIX) +#define omxSP_FIR_Direct_S16_Sfs OMXCATBAR(SP_FIR_Direct_S16_Sfs, OMXSP_SUFFIX) +#define omxSP_FIROne_Direct_S16 OMXCATBAR(SP_FIROne_Direct_S16, OMXSP_SUFFIX) +#define omxSP_FIROne_Direct_S16_I OMXCATBAR(SP_FIROne_Direct_S16_I, OMXSP_SUFFIX) +#define omxSP_FIROne_Direct_S16_ISfs OMXCATBAR(SP_FIROne_Direct_S16_ISfs, OMXSP_SUFFIX) +#define omxSP_FIROne_Direct_S16_Sfs OMXCATBAR(SP_FIROne_Direct_S16_Sfs, OMXSP_SUFFIX) +#define omxSP_IIR_BiQuadDirect_S16 OMXCATBAR(SP_IIR_BiQuadDirect_S16, OMXSP_SUFFIX) +#define omxSP_IIR_BiQuadDirect_S16_I OMXCATBAR(SP_IIR_BiQuadDirect_S16_I, OMXSP_SUFFIX) +#define omxSP_IIR_Direct_S16 OMXCATBAR(SP_IIR_Direct_S16, OMXSP_SUFFIX) +#define omxSP_IIR_Direct_S16_I OMXCATBAR(SP_IIR_Direct_S16_I, OMXSP_SUFFIX) +#define omxSP_IIROne_BiQuadDirect_S16 OMXCATBAR(SP_IIROne_BiQuadDirect_S16, OMXSP_SUFFIX) +#define omxSP_IIROne_BiQuadDirect_S16_I OMXCATBAR(SP_IIROne_BiQuadDirect_S16_I, OMXSP_SUFFIX) +#define omxSP_IIROne_Direct_S16 OMXCATBAR(SP_IIROne_Direct_S16, OMXSP_SUFFIX) +#define omxSP_IIROne_Direct_S16_I OMXCATBAR(SP_IIROne_Direct_S16_I, OMXSP_SUFFIX) + +#define omxVCCOMM_Average_16x OMXCATBAR(VCCOMM_Average_16x, OMXVCCOMM_SUFFIX) +#define omxVCCOMM_Average_8x OMXCATBAR(VCCOMM_Average_8x, OMXVCCOMM_SUFFIX) +#define omxVCCOMM_ComputeTextureErrorBlock OMXCATBAR(VCCOMM_ComputeTextureErrorBlock, OMXVCCOMM_SUFFIX) +#define omxVCCOMM_ComputeTextureErrorBlock_SAD OMXCATBAR(VCCOMM_ComputeTextureErrorBlock_SAD, OMXVCCOMM_SUFFIX) +#define omxVCCOMM_Copy16x16 OMXCATBAR(VCCOMM_Copy16x16, OMXVCCOMM_SUFFIX) +#define omxVCCOMM_Copy8x8 OMXCATBAR(VCCOMM_Copy8x8, OMXVCCOMM_SUFFIX) +#define omxVCCOMM_ExpandFrame_I OMXCATBAR(VCCOMM_ExpandFrame_I, OMXVCCOMM_SUFFIX) +#define omxVCCOMM_LimitMVToRect OMXCATBAR(VCCOMM_LimitMVToRect, OMXVCCOMM_SUFFIX) +#define omxVCCOMM_SAD_16x OMXCATBAR(VCCOMM_SAD_16x, OMXVCCOMM_SUFFIX) +#define omxVCCOMM_SAD_8x OMXCATBAR(VCCOMM_SAD_8x, OMXVCCOMM_SUFFIX) + +#define omxVCM4P10_Average_4x OMXCATBAR(VCM4P10_Average_4x, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_BlockMatch_Half OMXCATBAR(VCM4P10_BlockMatch_Half, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_BlockMatch_Integer OMXCATBAR(VCM4P10_BlockMatch_Integer, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_BlockMatch_Quarter OMXCATBAR(VCM4P10_BlockMatch_Quarter, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_DeblockChroma_I OMXCATBAR(VCM4P10_DeblockChroma_I, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_DeblockLuma_I OMXCATBAR(VCM4P10_DeblockLuma_I, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_DecodeChromaDcCoeffsToPairCAVLC OMXCATBAR(VCM4P10_DecodeChromaDcCoeffsToPairCAVLC, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_DecodeCoeffsToPairCAVLC OMXCATBAR(VCM4P10_DecodeCoeffsToPairCAVLC, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_DequantTransformResidualFromPairAndAdd OMXCATBAR(VCM4P10_DequantTransformResidualFromPairAndAdd, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_FilterDeblockingChroma_HorEdge_I OMXCATBAR(VCM4P10_FilterDeblockingChroma_HorEdge_I, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_FilterDeblockingChroma_VerEdge_I OMXCATBAR(VCM4P10_FilterDeblockingChroma_VerEdge_I, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_FilterDeblockingLuma_HorEdge_I OMXCATBAR(VCM4P10_FilterDeblockingLuma_HorEdge_I, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_FilterDeblockingLuma_VerEdge_I OMXCATBAR(VCM4P10_FilterDeblockingLuma_VerEdge_I, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_GetVLCInfo OMXCATBAR(VCM4P10_GetVLCInfo, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_InterpolateChroma OMXCATBAR(VCM4P10_InterpolateChroma, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_InterpolateHalfHor_Luma OMXCATBAR(VCM4P10_InterpolateHalfHor_Luma, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_InterpolateHalfVer_Luma OMXCATBAR(VCM4P10_InterpolateHalfVer_Luma, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_InterpolateLuma OMXCATBAR(VCM4P10_InterpolateLuma, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_InvTransformDequant_ChromaDC OMXCATBAR(VCM4P10_InvTransformDequant_ChromaDC, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_InvTransformDequant_LumaDC OMXCATBAR(VCM4P10_InvTransformDequant_LumaDC, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_InvTransformResidualAndAdd OMXCATBAR(VCM4P10_InvTransformResidualAndAdd, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_MEGetBufSize OMXCATBAR(VCM4P10_MEGetBufSize, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_MEInit OMXCATBAR(VCM4P10_MEInit, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_MotionEstimationMB OMXCATBAR(VCM4P10_MotionEstimationMB, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_PredictIntra_16x16 OMXCATBAR(VCM4P10_PredictIntra_16x16, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_PredictIntra_4x4 OMXCATBAR(VCM4P10_PredictIntra_4x4, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_PredictIntraChroma_8x8 OMXCATBAR(VCM4P10_PredictIntraChroma_8x8, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_SAD_4x OMXCATBAR(VCM4P10_SAD_4x, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_SADQuar_16x OMXCATBAR(VCM4P10_SADQuar_16x, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_SADQuar_4x OMXCATBAR(VCM4P10_SADQuar_4x, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_SADQuar_8x OMXCATBAR(VCM4P10_SADQuar_8x, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_SATD_4x4 OMXCATBAR(VCM4P10_SATD_4x4, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_SubAndTransformQDQResidual OMXCATBAR(VCM4P10_SubAndTransformQDQResidual, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_TransformDequantChromaDCFromPair OMXCATBAR(VCM4P10_TransformDequantChromaDCFromPair, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_TransformDequantLumaDCFromPair OMXCATBAR(VCM4P10_TransformDequantLumaDCFromPair, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_TransformQuant_ChromaDC OMXCATBAR(VCM4P10_TransformQuant_ChromaDC, OMXVCM4P10_SUFFIX) +#define omxVCM4P10_TransformQuant_LumaDC OMXCATBAR(VCM4P10_TransformQuant_LumaDC, OMXVCM4P10_SUFFIX) + +#define omxVCM4P2_BlockMatch_Half_16x16 OMXCATBAR(VCM4P2_BlockMatch_Half_16x16, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_BlockMatch_Half_8x8 OMXCATBAR(VCM4P2_BlockMatch_Half_8x8, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_BlockMatch_Integer_16x16 OMXCATBAR(VCM4P2_BlockMatch_Integer_16x16, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_BlockMatch_Integer_8x8 OMXCATBAR(VCM4P2_BlockMatch_Integer_8x8, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_DCT8x8blk OMXCATBAR(VCM4P2_DCT8x8blk, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_DecodeBlockCoef_Inter OMXCATBAR(VCM4P2_DecodeBlockCoef_Inter, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_DecodeBlockCoef_Intra OMXCATBAR(VCM4P2_DecodeBlockCoef_Intra, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_DecodePadMV_PVOP OMXCATBAR(VCM4P2_DecodePadMV_PVOP, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_DecodeVLCZigzag_Inter OMXCATBAR(VCM4P2_DecodeVLCZigzag_Inter, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_DecodeVLCZigzag_IntraACVLC OMXCATBAR(VCM4P2_DecodeVLCZigzag_IntraACVLC, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_DecodeVLCZigzag_IntraDCVLC OMXCATBAR(VCM4P2_DecodeVLCZigzag_IntraDCVLC, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_EncodeMV OMXCATBAR(VCM4P2_EncodeMV, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_EncodeVLCZigzag_Inter OMXCATBAR(VCM4P2_EncodeVLCZigzag_Inter, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_EncodeVLCZigzag_IntraACVLC OMXCATBAR(VCM4P2_EncodeVLCZigzag_IntraACVLC, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_EncodeVLCZigzag_IntraDCVLC OMXCATBAR(VCM4P2_EncodeVLCZigzag_IntraDCVLC, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_FindMVpred OMXCATBAR(VCM4P2_FindMVpred, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_IDCT8x8blk OMXCATBAR(VCM4P2_IDCT8x8blk, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_MCReconBlock OMXCATBAR(VCM4P2_MCReconBlock, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_MEGetBufSize OMXCATBAR(VCM4P2_MEGetBufSize, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_MEInit OMXCATBAR(VCM4P2_MEInit, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_MotionEstimationMB OMXCATBAR(VCM4P2_MotionEstimationMB, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_PredictReconCoefIntra OMXCATBAR(VCM4P2_PredictReconCoefIntra, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_QuantInter_I OMXCATBAR(VCM4P2_QuantInter_I, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_QuantIntra_I OMXCATBAR(VCM4P2_QuantIntra_I, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_QuantInvInter_I OMXCATBAR(VCM4P2_QuantInvInter_I, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_QuantInvIntra_I OMXCATBAR(VCM4P2_QuantInvIntra_I, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_TransRecBlockCoef_inter OMXCATBAR(VCM4P2_TransRecBlockCoef_inter, OMXVCM4P2_SUFFIX) +#define omxVCM4P2_TransRecBlockCoef_intra OMXCATBAR(VCM4P2_TransRecBlockCoef_intra, OMXVCM4P2_SUFFIX) + +#endif /* endif ARMOMX_ENABLE_RENAMING */ +#endif /* _armOMX_h_ */ diff --git a/media/openmax_dl/dl/api/omxtypes.h b/media/openmax_dl/dl/api/omxtypes.h new file mode 100644 index 0000000000..97718eac22 --- /dev/null +++ b/media/openmax_dl/dl/api/omxtypes.h @@ -0,0 +1,286 @@ +/** + * File: omxtypes.h + * Brief: Defines basic Data types used in OpenMAX v1.0.2 header files. + * + * Copyright (c) 2005-2008,2015 The Khronos Group Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and/or associated documentation files (the + * "Materials"), to deal in the Materials without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Materials, and to + * permit persons to whom the Materials are furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Materials. + * + * MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS + * KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS + * SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT + * https://www.khronos.org/registry/ + * + * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. + * + */ + +#ifndef _OMXTYPES_H_ +#define _OMXTYPES_H_ + +#include <limits.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Maximum FFT order supported by the twiddle table. Only used by the + * float FFT routines. Must be consistent with the table in + * armSP_FFT_F32TwiddleTable.c. + */ +#ifdef BIG_FFT_TABLE +#define TWIDDLE_TABLE_ORDER 15 +#else +#define TWIDDLE_TABLE_ORDER 12 +#endif + +#define OMX_IN +#define OMX_OUT +#define OMX_INOUT + + +typedef enum { + + /* Mandatory return codes - use cases are explicitly described for each function */ + OMX_Sts_NoErr = 0, /* No error, the function completed successfully */ + OMX_Sts_Err = -2, /* Unknown/unspecified error */ + OMX_Sts_InvalidBitstreamValErr = -182, /* Invalid value detected during bitstream processing */ + OMX_Sts_MemAllocErr = -9, /* Not enough memory allocated for the operation */ + OMX_StsACAAC_GainCtrErr = -159, /* AAC: Unsupported gain control data detected */ + OMX_StsACAAC_PrgNumErr = -167, /* AAC: Invalid number of elements for one program */ + OMX_StsACAAC_CoefValErr = -163, /* AAC: Invalid quantized coefficient value */ + OMX_StsACAAC_MaxSfbErr = -162, /* AAC: Invalid maxSfb value in relation to numSwb */ + OMX_StsACAAC_PlsDataErr = -160, /* AAC: pulse escape sequence data error */ + + /* Optional return codes - use cases are explicitly described for each function*/ + OMX_Sts_BadArgErr = -5, /* Bad Arguments */ + + OMX_StsACAAC_TnsNumFiltErr = -157, /* AAC: Invalid number of TNS filters */ + OMX_StsACAAC_TnsLenErr = -156, /* AAC: Invalid TNS region length */ + OMX_StsACAAC_TnsOrderErr = -155, /* AAC: Invalid order of TNS filter */ + OMX_StsACAAC_TnsCoefResErr = -154, /* AAC: Invalid bit-resolution for TNS filter coefficients */ + OMX_StsACAAC_TnsCoefErr = -153, /* AAC: Invalid TNS filter coefficients */ + OMX_StsACAAC_TnsDirectErr = -152, /* AAC: Invalid TNS filter direction */ + + OMX_StsICJP_JPEGMarkerErr = -183, /* JPEG marker encountered within an entropy-coded block; */ + /* Huffman decoding operation terminated early. */ + OMX_StsICJP_JPEGMarker = -181, /* JPEG marker encountered; Huffman decoding */ + /* operation terminated early. */ + OMX_StsIPPP_ContextMatchErr = -17, /* Context parameter doesn't match to the operation */ + + OMX_StsSP_EvenMedianMaskSizeErr = -180, /* Even size of the Median Filter mask was replaced by the odd one */ + + OMX_Sts_MaximumEnumeration = INT_MAX /*Placeholder, forces enum of size OMX_INT*/ + + } OMXResult; /** Return value or error value returned from a function. Identical to OMX_INT */ + + +/* OMX_U8 */ +#if UCHAR_MAX == 0xff +typedef unsigned char OMX_U8; +#elif USHRT_MAX == 0xff +typedef unsigned short int OMX_U8; +#else +#error OMX_U8 undefined +#endif + + +/* OMX_S8 */ +#if SCHAR_MAX == 0x7f +typedef signed char OMX_S8; +#elif SHRT_MAX == 0x7f +typedef signed short int OMX_S8; +#else +#error OMX_S8 undefined +#endif + + +/* OMX_U16 */ +#if USHRT_MAX == 0xffff +typedef unsigned short int OMX_U16; +#elif UINT_MAX == 0xffff +typedef unsigned int OMX_U16; +#else +#error OMX_U16 undefined +#endif + + +/* OMX_S16 */ +#if SHRT_MAX == 0x7fff +typedef signed short int OMX_S16; +#elif INT_MAX == 0x7fff +typedef signed int OMX_S16; +#else +#error OMX_S16 undefined +#endif + + +/* OMX_U32 */ +#if UINT_MAX == 0xffffffff +typedef unsigned int OMX_U32; +#elif LONG_MAX == 0xffffffff +typedef unsigned long int OMX_U32; +#else +#error OMX_U32 undefined +#endif + + +/* OMX_S32 */ +#if INT_MAX == 0x7fffffff +typedef signed int OMX_S32; +#elif LONG_MAX == 0x7fffffff +typedef long signed int OMX_S32; +#else +#error OMX_S32 undefined +#endif + + +/* OMX_U64 & OMX_S64 */ +#if defined( _WIN32 ) || defined ( _WIN64 ) + typedef __int64 OMX_S64; /** Signed 64-bit integer */ + typedef unsigned __int64 OMX_U64; /** Unsigned 64-bit integer */ + #define OMX_MIN_S64 (0x8000000000000000i64) + #define OMX_MIN_U64 (0x0000000000000000i64) + #define OMX_MAX_S64 (0x7FFFFFFFFFFFFFFFi64) + #define OMX_MAX_U64 (0xFFFFFFFFFFFFFFFFi64) +#else + typedef long long OMX_S64; /** Signed 64-bit integer */ + typedef unsigned long long OMX_U64; /** Unsigned 64-bit integer */ + #define OMX_MIN_S64 (0x8000000000000000LL) + #define OMX_MIN_U64 (0x0000000000000000LL) + #define OMX_MAX_S64 (0x7FFFFFFFFFFFFFFFLL) + #define OMX_MAX_U64 (0xFFFFFFFFFFFFFFFFLL) +#endif + + +/* OMX_SC8 */ +typedef struct +{ + OMX_S8 Re; /** Real part */ + OMX_S8 Im; /** Imaginary part */ + +} OMX_SC8; /** Signed 8-bit complex number */ + + +/* OMX_SC16 */ +typedef struct +{ + OMX_S16 Re; /** Real part */ + OMX_S16 Im; /** Imaginary part */ + +} OMX_SC16; /** Signed 16-bit complex number */ + + +/* OMX_SC32 */ +typedef struct +{ + OMX_S32 Re; /** Real part */ + OMX_S32 Im; /** Imaginary part */ + +} OMX_SC32; /** Signed 32-bit complex number */ + + +/* OMX_SC64 */ +typedef struct +{ + OMX_S64 Re; /** Real part */ + OMX_S64 Im; /** Imaginary part */ + +} OMX_SC64; /** Signed 64-bit complex number */ + + +/* OMX_F32 */ +typedef float OMX_F32; /** Single precision floating point,IEEE 754 */ + +/* OMX_F64 */ +typedef double OMX_F64; /** Double precision floating point,IEEE 754 */ + +/* OMX_FC32 */ +typedef struct +{ + OMX_F32 Re; /** Real part */ + OMX_F32 Im; /** Imaginary part */ + +} OMX_FC32; /** single precision floating point complex number */ + +/* OMX_FC64 */ +typedef struct +{ + OMX_F64 Re; /** Real part */ + OMX_F64 Im; /** Imaginary part */ + +} OMX_FC64; /** double precision floating point complex number */ + +/* OMX_INT */ +typedef int OMX_INT; /** signed integer corresponding to machine word length, has maximum signed value INT_MAX*/ + + +#define OMX_MIN_S8 (-128) +#define OMX_MIN_U8 0 +#define OMX_MIN_S16 (-32768) +#define OMX_MIN_U16 0 +#define OMX_MIN_S32 (-2147483647-1) +#define OMX_MIN_U32 0 + +#define OMX_MAX_S8 (127) +#define OMX_MAX_U8 (255) +#define OMX_MAX_S16 (32767) +#define OMX_MAX_U16 (0xFFFF) +#define OMX_MAX_S32 (2147483647) +#define OMX_MAX_U32 (0xFFFFFFFF) + +typedef void OMXVoid; + +#ifndef NULL +#define NULL ((void*)0) +#endif + +/** Defines the geometric position and size of a rectangle, + * where x,y defines the coordinates of the top left corner + * of the rectangle, with dimensions width in the x-direction + * and height in the y-direction */ +typedef struct { + OMX_INT x; /** x-coordinate of top left corner of rectangle */ + OMX_INT y; /** y-coordinate of top left corner of rectangle */ + OMX_INT width; /** Width in the x-direction. */ + OMX_INT height; /** Height in the y-direction. */ +}OMXRect; + + +/** Defines the geometric position of a point, */ +typedef struct +{ + OMX_INT x; /** x-coordinate */ + OMX_INT y; /** y-coordinate */ + +} OMXPoint; + + +/** Defines the dimensions of a rectangle, or region of interest in an image */ +typedef struct +{ + OMX_INT width; /** Width of the rectangle, in the x-direction */ + OMX_INT height; /** Height of the rectangle, in the y-direction */ + +} OMXSize; + +#ifdef __cplusplus +} +#endif +#endif /* _OMXTYPES_H_ */ diff --git a/media/openmax_dl/dl/api/omxtypes_s.h b/media/openmax_dl/dl/api/omxtypes_s.h new file mode 100644 index 0000000000..d880d351fd --- /dev/null +++ b/media/openmax_dl/dl/api/omxtypes_s.h @@ -0,0 +1,76 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. +@// + +@// +@// File Name: omxtypes_s.h +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 9622 +@// Last Modified Date: Wed, 06 Feb 2008 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// + +@// Mandatory return codes - use cases are explicitly described for each function + .equ OMX_Sts_NoErr, 0 @// No error the function completed successfully + .equ OMX_Sts_Err, -2 @// Unknown/unspecified error + .equ OMX_Sts_InvalidBitstreamValErr, -182 @// Invalid value detected during bitstream processing + .equ OMX_Sts_MemAllocErr, -9 @// Not enough memory allocated for the operation + .equ OMX_StsACAAC_GainCtrErr, -159 @// AAC: Unsupported gain control data detected + .equ OMX_StsACAAC_PrgNumErr, -167 @// AAC: Invalid number of elements for one program + .equ OMX_StsACAAC_CoefValErr, -163 @// AAC: Invalid quantized coefficient value + .equ OMX_StsACAAC_MaxSfbErr, -162 @// AAC: Invalid maxSfb value in relation to numSwb + .equ OMX_StsACAAC_PlsDataErr, -160 @// AAC: pulse escape sequence data error + +@// Optional return codes - use cases are explicitly described for each function + .equ OMX_Sts_BadArgErr, -5 @// Bad Arguments + + .equ OMX_StsACAAC_TnsNumFiltErr, -157 @// AAC: Invalid number of TNS filters + .equ OMX_StsACAAC_TnsLenErr, -156 @// AAC: Invalid TNS region length + .equ OMX_StsACAAC_TnsOrderErr, -155 @// AAC: Invalid order of TNS filter + .equ OMX_StsACAAC_TnsCoefResErr, -154 @// AAC: Invalid bit-resolution for TNS filter coefficients + .equ OMX_StsACAAC_TnsCoefErr, -153 @// AAC: Invalid TNS filter coefficients + .equ OMX_StsACAAC_TnsDirectErr, -152 @// AAC: Invalid TNS filter direction + .equ OMX_StsICJP_JPEGMarkerErr, -183 @// JPEG marker encountered within an entropy-coded block; + @// Huffman decoding operation terminated early. + .equ OMX_StsICJP_JPEGMarker, -181 @// JPEG marker encountered; Huffman decoding + @// operation terminated early. + .equ OMX_StsIPPP_ContextMatchErr, -17 @// Context parameter doesn't match to the operation + + .equ OMX_StsSP_EvenMedianMaskSizeErr, -180 @// Even size of the Median Filter mask was replaced by the odd one + + .equ OMX_Sts_MaximumEnumeration, 0x7FFFFFFF + + + + .equ OMX_MIN_S8, (-128) + .equ OMX_MIN_U8, 0 + .equ OMX_MIN_S16, (-32768) + .equ OMX_MIN_U16, 0 + + + .equ OMX_MIN_S32, (-2147483647-1) + .equ OMX_MIN_U32, 0 + + .equ OMX_MAX_S8, (127) + .equ OMX_MAX_U8, (255) + .equ OMX_MAX_S16, (32767) + .equ OMX_MAX_U16, (0xFFFF) + .equ OMX_MAX_S32, (2147483647) + .equ OMX_MAX_U32, (0xFFFFFFFF) + + .equ OMX_VC_UPPER, 0x1 @// Used by the PredictIntra functions + .equ OMX_VC_LEFT, 0x2 @// Used by the PredictIntra functions + .equ OMX_VC_UPPER_RIGHT, 0x40 @// Used by the PredictIntra functions + + .equ NULL, 0 diff --git a/media/openmax_dl/dl/moz.build b/media/openmax_dl/dl/moz.build new file mode 100644 index 0000000000..9c8e10037a --- /dev/null +++ b/media/openmax_dl/dl/moz.build @@ -0,0 +1,92 @@ +# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- +# vim: set filetype=python: +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +if CONFIG['CPU_ARCH'] == 'arm' and CONFIG['BUILD_ARM_NEON']: + Library('openmax_dl') + + EXPORTS.dl.api += [ + 'api/armCOMM_s.h', + 'api/armOMX.h', + 'api/omxtypes.h', + 'api/omxtypes_s.h', + ] + + EXPORTS.dl.sp.api += [ + 'sp/api/armSP.h', + 'sp/api/omxSP.h', + ] + + SOURCES += [ + 'sp/src/armSP_FFT_F32TwiddleTable.c', + 'sp/src/armSP_FFT_S32TwiddleTable.c', + 'sp/src/omxSP_FFTGetBufSize_C_FC32.c', + 'sp/src/omxSP_FFTGetBufSize_C_SC16.c', + 'sp/src/omxSP_FFTGetBufSize_C_SC32.c', + 'sp/src/omxSP_FFTGetBufSize_R_F32.c', + 'sp/src/omxSP_FFTGetBufSize_R_S16S32.c', + 'sp/src/omxSP_FFTGetBufSize_R_S32.c', + 'sp/src/omxSP_FFTInit_C_FC32.c', + 'sp/src/omxSP_FFTInit_C_SC16.c', + 'sp/src/omxSP_FFTInit_C_SC32.c', + 'sp/src/omxSP_FFTInit_R_F32.c', + 'sp/src/omxSP_FFTInit_R_S16S32.c', + 'sp/src/omxSP_FFTInit_R_S32.c', + ] + + SOURCES += [ + 'sp/src/armSP_FFT_CToC_FC32_Radix2_fs_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_FC32_Radix2_ls_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_FC32_Radix2_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_FC32_Radix4_fs_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_FC32_Radix4_ls_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_FC32_Radix4_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_FC32_Radix8_fs_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_SC16_Radix2_fs_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_SC16_Radix2_ls_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_SC16_Radix2_ps_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_SC16_Radix2_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_SC16_Radix4_fs_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_SC16_Radix4_ls_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_SC16_Radix4_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_SC16_Radix8_fs_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_SC32_Radix2_fs_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_SC32_Radix2_ls_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_SC32_Radix2_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_SC32_Radix4_fs_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_SC32_Radix4_ls_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_SC32_Radix4_unsafe_s.S', + 'sp/src/armSP_FFT_CToC_SC32_Radix8_fs_unsafe_s.S', + 'sp/src/armSP_FFTInv_CCSToR_F32_preTwiddleRadix2_unsafe_s.S', + 'sp/src/armSP_FFTInv_CCSToR_S32_preTwiddleRadix2_unsafe_s.S', + 'sp/src/omxSP_FFTFwd_CToC_FC32_Sfs_s.S', + 'sp/src/omxSP_FFTFwd_CToC_SC16_Sfs_s.S', + 'sp/src/omxSP_FFTFwd_CToC_SC32_Sfs_s.S', + 'sp/src/omxSP_FFTFwd_RToCCS_F32_Sfs_s.S', + 'sp/src/omxSP_FFTFwd_RToCCS_S16S32_Sfs_s.S', + 'sp/src/omxSP_FFTFwd_RToCCS_S32_Sfs_s.S', + 'sp/src/omxSP_FFTInv_CCSToR_F32_Sfs_s.S', + 'sp/src/omxSP_FFTInv_CCSToR_F32_Sfs_unscaled_s.S', + 'sp/src/omxSP_FFTInv_CCSToR_S32_Sfs_s.S', + 'sp/src/omxSP_FFTInv_CCSToR_S32S16_Sfs_s.S', + 'sp/src/omxSP_FFTInv_CToC_FC32_Sfs_s.S', + 'sp/src/omxSP_FFTInv_CToC_SC16_Sfs_s.S', + 'sp/src/omxSP_FFTInv_CToC_SC32_Sfs_s.S', + ] + + LOCAL_INCLUDES += [ + '..', + 'api' + ] + + DEFINES['BIG_FFT_TABLE'] = True + + FINAL_LIBRARY = 'xul' + + if CONFIG['CLANG_CXX']: + ASFLAGS += [ + '-no-integrated-as', + ] + diff --git a/media/openmax_dl/dl/sp/api/armSP.h b/media/openmax_dl/dl/sp/api/armSP.h new file mode 100644 index 0000000000..f615a87c7a --- /dev/null +++ b/media/openmax_dl/dl/sp/api/armSP.h @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + * + * This file was originally licensed as follows. It has been + * relicensed with permission from the copyright holders. + */ + +/** + * + * File Name: armSP.h + * OpenMAX DL: v1.0.2 + * Last Modified Revision: 7014 + * Last Modified Date: Wed, 01 Aug 2007 + * + * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. + * + * + * + * File: armSP.h + * Brief: Declares API's/Basic Data types used across the OpenMAX Signal Processing domain + * + */ +#ifndef _armSP_H_ +#define _armSP_H_ + +#include "dl/api/omxtypes.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** FFT Specific declarations */ +extern OMX_S32 armSP_FFT_S32TwiddleTable[1026]; +extern OMX_F32 armSP_FFT_F32TwiddleTable[]; + +typedef struct ARMsFFTSpec_SC32_Tag +{ + OMX_U32 N; + OMX_U16 *pBitRev; + OMX_SC32 *pTwiddle; + OMX_SC32 *pBuf; +}ARMsFFTSpec_SC32; + + +typedef struct ARMsFFTSpec_SC16_Tag +{ + OMX_U32 N; + OMX_U16 *pBitRev; + OMX_SC16 *pTwiddle; + OMX_SC16 *pBuf; +}ARMsFFTSpec_SC16; + +typedef struct ARMsFFTSpec_R_SC32_Tag +{ + OMX_U32 N; + OMX_U16 *pBitRev; + OMX_SC32 *pTwiddle; + OMX_S32 *pBuf; +}ARMsFFTSpec_R_SC32; + +typedef struct ARMsFFTSpec_R_FC32_Tag +{ + OMX_U32 N; + OMX_U16* pBitRev; + OMX_FC32* pTwiddle; + OMX_F32* pBuf; +} ARMsFFTSpec_R_FC32; + +typedef struct ARMsFFTSpec_FC32_Tag +{ + OMX_U32 N; + OMX_U16* pBitRev; + OMX_FC32* pTwiddle; + OMX_FC32* pBuf; +} ARMsFFTSpec_FC32; + +#ifdef __cplusplus +} +#endif + +#endif + +/*End of File*/ + + + diff --git a/media/openmax_dl/dl/sp/api/omxSP.h b/media/openmax_dl/dl/sp/api/omxSP.h new file mode 100644 index 0000000000..f2a3f5db67 --- /dev/null +++ b/media/openmax_dl/dl/sp/api/omxSP.h @@ -0,0 +1,2620 @@ +/** + * File: omxSP.h + * Brief: OpenMAX DL v1.0.2 - Signal Processing library + * + * Copyright (c) 2005-2008,2015 The Khronos Group Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and/or associated documentation files (the + * "Materials"), to deal in the Materials without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Materials, and to + * permit persons to whom the Materials are furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Materials. + * + * MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS + * KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS + * SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT + * https://www.khronos.org/registry/ + * + * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. + * + */ + +/* *****************************************************************************************/ + +#ifndef _OMXSP_H_ +#define _OMXSP_H_ + +#include "dl/api/omxtypes.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/* 2.1 Vendor-Specific FFT Data Structures */ + typedef void OMXFFTSpec_C_SC16; + typedef void OMXFFTSpec_C_SC32; + typedef void OMXFFTSpec_R_S16S32; + typedef void OMXFFTSpec_R_S16; + typedef void OMXFFTSpec_R_S32; + typedef void OMXFFTSpec_R_F32; + typedef void OMXFFTSpec_C_FC32; + +/** + * Function: omxSP_Copy_S16 (2.2.1.1.1) + * + * Description: + * Copies the len elements of the vector pointed to by pSrcinto the len + * elements of the vector pointed to by pDst. That is: + * pDst[i] = pSrc[i], for (i=0, 1, ..., len-1) + * + * Input Arguments: + * + * pSrc - pointer to the source vector + * len - number of elements contained in the source and destination vectors + * + * Output Arguments: + * + * pDst - pointer to the destination vector + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments detected; returned if one or more of + * the following is true: + * - pSrc or pDst is NULL + * - len < 0 + * + */ +OMXResult omxSP_Copy_S16 ( + const OMX_S16 *pSrc, + OMX_S16 *pDst, + OMX_INT len +); + + + +/** + * Function: omxSP_DotProd_S16 (2.2.2.1.1) + * + * Description: + * Calculates the dot product of the two input vectors. This function does + * not perform scaling. The internal accumulator width must be at least 32 + * bits. If any of the partially accumulated values exceeds the range of a + * signed 32-bit integer then the result is undefined. + * + * Input Arguments: + * + * pSrc1 - pointer to the first input vector; must be aligned on an 8-byte + * boundary. + * pSrc2 - pointer to the second input vector; must be aligned on an 8-byte + * boundary. + * len - length of the vectors in pSrc1 and pSrc2 + * + * Output Arguments: + * + * Return Value: + * + * The dot product result Note: this function returns the actual result + * rather than the standard OMXError. + * + */ +OMX_S32 omxSP_DotProd_S16 ( + const OMX_S16 *pSrc1, + const OMX_S16 *pSrc2, + OMX_INT len +); + + + +/** + * Function: omxSP_DotProd_S16_Sfs (2.2.2.1.2) + * + * Description: + * Calculates the dot product of the two input signals with output scaling + * and saturation, i.e., the result is multiplied by two to the power of the + * negative (-)scalefactor (scaled) prior to return. The result is saturated + * with rounding if the scaling operation produces a value outside the range + * of a signed 32-bit integer. Rounding behavior is defined in section 1.6.7 + * Integer Scaling and Rounding Conventions. The internal accumulator width + * must be at least 32 bits. The result is undefined if any of the partially + * accumulated values exceeds the range of a signed 32-bit integer. + * + * Input Arguments: + * + * pSrc1 - pointer to the first input vector; must be aligned on an 8-byte + * boundary. + * pSrc2 - pointer to the second input vector; must be aligned on an 8-byte + * boundary. + * len - length of the vectors in pSrc1 and pSrc2 + * scaleFactor - integer scalefactor + * + * Output Arguments: + * + * Return Value: + * + * The dot product result Note: This function returns the actual result + * rather than the standard OMXError. + * + */ +OMX_S32 omxSP_DotProd_S16_Sfs ( + const OMX_S16 *pSrc1, + const OMX_S16 *pSrc2, + OMX_INT len, + OMX_INT scaleFactor +); + + + +/** + * Function: omxSP_BlockExp_S16 (2.2.2.2.2) + * + * Description: + * Block exponent calculation for 16-bit and 32-bit signals (count leading + * sign bits). These functions compute the number of extra sign bits of all + * values in the 16-bit and 32-bit input vector pSrc and return the minimum + * sign bit count. This is also the maximum shift value that could be used in + * scaling the block of data. The functions BlockExp_S16 and + * BlockExp_S32 return the values 15 and 31, respectively, for input vectors in + * which all entries are equal to zero. + * + * Note: These functions differ from other DL functions by not returning the + * standard OMXError but the actual result. + * + * Input Arguments: + * + * pSrc - pointer to the input vector + * len - number of elements contained in the input and output + * vectors (0 < len < 65536) + * + * Output Arguments: + * + * none + * + * Return Value: + * + * Maximum exponent that may be used in scaling + * + */ +OMX_INT omxSP_BlockExp_S16 ( + const OMX_S16 *pSrc, + OMX_INT len +); + + + +/** + * Function: omxSP_BlockExp_S32 (2.2.2.2.2) + * + * Description: + * Block exponent calculation for 16-bit and 32-bit signals (count leading + * sign bits). These functions compute the number of extra sign bits of all + * values in the 16-bit and 32-bit input vector pSrc and return the minimum + * sign bit count. This is also the maximum shift value that could be used in + * scaling the block of data. The functions BlockExp_S16 and + * BlockExp_S32 return the values 15 and 31, respectively, for input vectors in + * which all entries are equal to zero. + * + * Note: These functions differ from other DL functions by not returning the + * standard OMXError but the actual result. + * + * Input Arguments: + * + * pSrc - pointer to the input vector + * len - number of elements contained in the input and output + * vectors (0 < len < 65536) + * + * Output Arguments: + * + * none + * + * Return Value: + * + * Maximum exponent that may be used in scaling + * + */ +OMX_INT omxSP_BlockExp_S32 ( + const OMX_S32 *pSrc, + OMX_INT len +); + + + +/** + * Function: omxSP_FIR_Direct_S16 (2.2.3.1.1) + * + * Description: + * Block FIR filtering for 16-bit data type. This function applies the + * FIR filter defined by the coefficient vector pTapsQ15 to a vector of + * input data. The result is saturated with rounding if the operation + * produces a value outside the range of a signed 16-bit integer. + * Rounding behavior is defined in: + * section 1.6.7 "Integer Scaling and Rounding Conventions". + * The internal accumulator width must be at least 32 bits. The result + * is undefined if any of the partially accumulated values exceeds the + * range of a signed 32-bit integer. + * + * + * Input Arguments: + * + * pSrc - pointer to the vector of input samples to which the + * filter is applied + * sampLen - the number of samples contained in the input and output + * vectors + * pTapsQ15 - pointer to the vector that contains the filter coefficients, + * represented in Q0.15 format (defined in section 1.6.5). Given + * that: + * -32768 = pTapsQ15(k) < 32768, + * 0 = k <tapsLen, + * the range on the actual filter coefficients is -1 = bK <1, and + * therefore coefficient normalization may be required during the + * filter design process. + * tapsLen - the number of taps, or, equivalently, the filter order + 1 + * pDelayLine - pointer to the 2.tapsLen -element filter memory buffer + * (state). The user is responsible for allocation, initialization, + * and de-allocation. The filter memory elements are initialized to + * zero in most applications. + * pDelayLineIndex - pointer to the filter memory index that is maintained + * internally by the function. The user should initialize the value + * of this index to zero. + * + * Output Arguments: + * + * pDst - pointer to the vector of filtered output samples + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - One or more of the following pointers is NULL: + * - pSrc, + * - pDst, + * - pSrcDst, + * - pTapsQ15, + * - pDelayLine, or + * - pDelayLineIndex + * - samplen < 0 + * - tapslen < 1 + * - *pDelayLineIndex < 0 or *pDelayLineIndex >= (2 * tapslen). + * + */ +OMXResult omxSP_FIR_Direct_S16 ( + const OMX_S16 *pSrc, + OMX_S16 *pDst, + OMX_INT sampLen, + const OMX_S16 *pTapsQ15, + OMX_INT tapsLen, + OMX_S16 *pDelayLine, + OMX_INT *pDelayLineIndex +); + + + +/** + * Function: omxSP_FIR_Direct_S16_I (2.2.3.1.1) + * + * Description: + * Block FIR filtering for 16-bit data type. This function applies the + * FIR filter defined by the coefficient vector pTapsQ15 to a vector of + * input data. The result is saturated with rounding if the operation + * produces a value outside the range of a signed 16-bit integer. + * Rounding behavior is defined in: + * section 1.6.7 "Integer Scaling and Rounding Conventions". + * The internal accumulator width must be at least 32 bits. The result + * is undefined if any of the partially accumulated values exceeds the + * range of a signed 32-bit integer. + * + * Input Arguments: + * + * pSrcDst - pointer to the vector of input samples to which the + * filter is applied + * sampLen - the number of samples contained in the input and output + * vectors + * pTapsQ15 - pointer to the vector that contains the filter coefficients, + * represented in Q0.15 format (defined in section 1.6.5). Given + * that: + * -32768 = pTapsQ15(k) < 32768, + * 0 = k <tapsLen, + * the range on the actual filter coefficients is -1 = bK <1, and + * therefore coefficient normalization may be required during the + * filter design process. + * tapsLen - the number of taps, or, equivalently, the filter order + 1 + * pDelayLine - pointer to the 2.tapsLen -element filter memory buffer + * (state). The user is responsible for allocation, initialization, + * and de-allocation. The filter memory elements are initialized to + * zero in most applications. + * pDelayLineIndex - pointer to the filter memory index that is maintained + * internally by the function. The user should initialize the value + * of this index to zero. + * + * Output Arguments: + * + * pSrcDst - pointer to the vector of filtered output samples + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - One or more of the following pointers is NULL: + * - pSrc, + * - pDst, + * - pSrcDst, + * - pTapsQ15, + * - pDelayLine, or + * - pDelayLineIndex + * - samplen < 0 + * - tapslen < 1 + * - *pDelayLineIndex < 0 or *pDelayLineIndex >= (2 * tapslen). + * + */ +OMXResult omxSP_FIR_Direct_S16_I ( + OMX_S16 *pSrcDst, + OMX_INT sampLen, + const OMX_S16 *pTapsQ15, + OMX_INT tapsLen, + OMX_S16 *pDelayLine, + OMX_INT *pDelayLineIndex +); + + + +/** + * Function: omxSP_FIR_Direct_S16_Sfs (2.2.3.1.1) + * + * Description: + * Block FIR filtering for 16-bit data type. This function applies + * the FIR filter defined by the coefficient vector pTapsQ15 to a + * vector of input data. The output is multiplied by 2 to the negative + * power of scalefactor (i.e., 2^-scalefactor) before returning to the caller. + * Scaling and rounding conventions are defined in section 1.6.7. + * The internal accumulator width must be at least 32 bits. + * The result is undefined if any of the partially accumulated + * values exceeds the range of a signed 32-bit integer. + * + * Input Arguments: + * + * pSrc - pointer to the vector of input samples to which the + * filter is applied + * sampLen - the number of samples contained in the input and output + * vectors + * pTapsQ15 - pointer to the vector that contains the filter coefficients, + * represented in Q0.15 format (defined in section 1.6.5). Given + * that: + * -32768 = pTapsQ15(k) < 32768, + * 0 = k <tapsLen, + * the range on the actual filter coefficients is -1 = bK <1, and + * therefore coefficient normalization may be required during the + * filter design process. + * tapsLen - the number of taps, or, equivalently, the filter order + 1 + * pDelayLine - pointer to the 2.tapsLen -element filter memory buffer + * (state). The user is responsible for allocation, initialization, + * and de-allocation. The filter memory elements are initialized to + * zero in most applications. + * pDelayLineIndex - pointer to the filter memory index that is maintained + * internally by the function. The user should initialize the value + * of this index to zero. + * scaleFactor - saturation fixed scalefactor + * + * Output Arguments: + * + * pDst - pointer to the vector of filtered output samples + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - One or more of the following pointers is NULL: + * - pSrc, + * - pDst, + * - pSrcDst, + * - pTapsQ15, + * - pDelayLine, or + * - pDelayLineIndex + * - samplen < 0 + * - tapslen < 1 + * - scaleFactor < 0 + * - *pDelayLineIndex < 0 or *pDelayLineIndex >= (2 * tapslen). + * + */ +OMXResult omxSP_FIR_Direct_S16_Sfs ( + const OMX_S16 *pSrc, + OMX_S16 *pDst, + OMX_INT sampLen, + const OMX_S16 *pTapsQ15, + OMX_INT tapsLen, + OMX_S16 *pDelayLine, + OMX_INT *pDelayLineIndex, + OMX_INT scaleFactor +); + + + +/** + * Function: omxSP_FIR_Direct_S16_ISfs (2.2.3.1.1) + * + * Description: + * Block FIR filtering for 16-bit data type. This function applies + * the FIR filter defined by the coefficient vector pTapsQ15 to a + * vector of input data. The output is multiplied by 2 to the negative + * power of scalefactor (i.e., 2^-scalefactor) before returning to the caller. + * Scaling and rounding conventions are defined in section 1.6.7. + * The internal accumulator width must be at least 32 bits. + * The result is undefined if any of the partially accumulated + * values exceeds the range of a signed 32-bit integer. + * + * Input Arguments: + * + * pSrcDst - pointer to the vector of input samples to which the + * filter is applied + * sampLen - the number of samples contained in the input and output + * vectors + * pTapsQ15 - pointer to the vector that contains the filter coefficients, + * represented in Q0.15 format (defined in section 1.6.5). Given + * that: + * -32768 = pTapsQ15(k) < 32768, + * 0 = k <tapsLen, + * the range on the actual filter coefficients is -1 = bK <1, and + * therefore coefficient normalization may be required during the + * filter design process. + * tapsLen - the number of taps, or, equivalently, the filter order + 1 + * pDelayLine - pointer to the 2.tapsLen -element filter memory buffer + * (state). The user is responsible for allocation, initialization, + * and de-allocation. The filter memory elements are initialized to + * zero in most applications. + * pDelayLineIndex - pointer to the filter memory index that is maintained + * internally by the function. The user should initialize the value + * of this index to zero. + * scaleFactor - saturation fixed scalefactor + * + * Output Arguments: + * + * pSrcDst - pointer to the vector of filtered output samples + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - One or more of the following pointers is NULL: + * - pSrc, + * - pDst, + * - pSrcDst, + * - pTapsQ15, + * - pDelayLine, or + * - pDelayLineIndex + * - samplen < 0 + * - tapslen < 1 + * - scaleFactor < 0 + * - *pDelayLineIndex < 0 or *pDelayLineIndex >= (2 * tapslen). + * + */ +OMXResult omxSP_FIR_Direct_S16_ISfs ( + OMX_S16 *pSrcDst, + OMX_INT sampLen, + const OMX_S16 *pTapsQ15, + OMX_INT tapsLen, + OMX_S16 *pDelayLine, + OMX_INT *pDelayLineIndex, + OMX_INT scaleFactor +); + + + +/** + * Function: omxSP_FIROne_Direct_S16 (2.2.3.1.2) + * + * Description: + * Single-sample FIR filtering for 16-bit data type. These functions apply + * the FIR filter defined by the coefficient vector pTapsQ15 to a single + * sample of input data. The result is saturated with rounding if the + * operation produces a value outside the range of a signed 16-bit integer. + * Rounding behavior is defined in: + * section 1.6.7 "Integer Scaling and Rounding Conventions". + * The internal accumulator width must be at least 32 bits. The result is + * undefined if any of the partially accumulated values exceeds the range of a + * signed 32-bit integer. + * + * Input Arguments: + * + * val - the single input sample to which the filter is + * applied. + * pTapsQ15 - pointer to the vector that contains the filter coefficients, + * represented in Q0.15 format (as defined in section 1.6.5). Given + * that: + * -32768 = pTapsQ15(k) < 32768, + * 0 = k < tapsLen, + * the range on the actual filter coefficients is -1 = bK <1, and + * therefore coefficient normalization may be required during the + * filter design process. + * tapsLen - the number of taps, or, equivalently, the filter order + 1 + * pDelayLine - pointer to the 2.tapsLen -element filter memory buffer + * (state). The user is responsible for allocation, initialization, + * and de-allocation. The filter memory elements are initialized to + * zero in most applications. + * pDelayLineIndex - pointer to the filter memory index that is maintained + * internally by the function. The user should initialize the value + * of this index to zero. + * + * Output Arguments: + * + * pResult - pointer to the filtered output sample + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - One or more of the following pointers is NULL: + * - pResult, + * - pTapsQ15, + * - pDelayLine, or + * - pDelayLineIndex + * - tapslen < 1 + * - *pDelayLineIndex < 0 or *pDelayLineIndex >= (2 * tapslen) + * + */ +OMXResult omxSP_FIROne_Direct_S16 ( + OMX_S16 val, + OMX_S16 *pResult, + const OMX_S16 *pTapsQ15, + OMX_INT tapsLen, + OMX_S16 *pDelayLine, + OMX_INT *pDelayLineIndex +); + + + +/** + * Function: omxSP_FIROne_Direct_S16_I (2.2.3.1.2) + * + * Description: + * Single-sample FIR filtering for 16-bit data type. These functions apply + * the FIR filter defined by the coefficient vector pTapsQ15 to a single + * sample of input data. The result is saturated with rounding if the + * operation produces a value outside the range of a signed 16-bit integer. + * Rounding behavior is defined in: + * section 1.6.7 "Integer Scaling and Rounding Conventions". + * The internal accumulator width must be at least 32 bits. The result is + * undefined if any of the partially accumulated values exceeds the range of a + * signed 32-bit integer. + * + * Input Arguments: + * + * pValResult - pointer to the single input sample to which the filter is + * applied. + * pTapsQ15 - pointer to the vector that contains the filter coefficients, + * represented in Q0.15 format (as defined in section 1.6.5). Given + * that: + * -32768 = pTapsQ15(k) < 32768, + * 0 = k < tapsLen, + * the range on the actual filter coefficients is -1 = bK <1, and + * therefore coefficient normalization may be required during the + * filter design process. + * tapsLen - the number of taps, or, equivalently, the filter order + 1 + * pDelayLine - pointer to the 2.tapsLen -element filter memory buffer + * (state). The user is responsible for allocation, initialization, + * and de-allocation. The filter memory elements are initialized to + * zero in most applications. + * pDelayLineIndex - pointer to the filter memory index that is maintained + * internally by the function. The user should initialize the value + * of this index to zero. + * + * Output Arguments: + * + * pValResult - pointer to the filtered output sample + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - One or more of the following pointers is NULL: + * - pValResult, + * - pTapsQ15, + * - pDelayLine, or + * - pDelayLineIndex + * - tapslen < 1 + * - *pDelayLineIndex < 0 or *pDelayLineIndex >= (2 * tapslen) + * + */ +OMXResult omxSP_FIROne_Direct_S16_I ( + OMX_S16 *pValResult, + const OMX_S16 *pTapsQ15, + OMX_INT tapsLen, + OMX_S16 *pDelayLine, + OMX_INT *pDelayLineIndex +); + + + +/** + * Function: omxSP_FIROne_Direct_S16_Sfs (2.2.3.1.2) + * + * Description: + * Single-sample FIR filtering for 16-bit data type. These functions apply + * the FIR filter defined by the coefficient vector pTapsQ15 to a single + * sample of input data. The output is multiplied by 2 to the negative power + * of scalefactor (i.e., 2^-scalefactor) before returning to the user. + * Scaling and rounding conventions are defined in section 1.6.7. + * The internal accumulator width must be at least 32 bits. + * The result is undefined if any of the partially accumulated values exceeds + * the range of a signed 32-bit integer. + * + * Input Arguments: + * + * val - the single input sample to which the filter is + * applied. + * pTapsQ15 - pointer to the vector that contains the filter coefficients, + * represented in Q0.15 format (as defined in section 1.6.5). Given + * that: + * -32768 = pTapsQ15(k) < 32768, + * 0 = k < tapsLen, + * the range on the actual filter coefficients is -1 = bK <1, and + * therefore coefficient normalization may be required during the + * filter design process. + * tapsLen - the number of taps, or, equivalently, the filter order + 1 + * pDelayLine - pointer to the 2.tapsLen -element filter memory buffer + * (state). The user is responsible for allocation, initialization, + * and de-allocation. The filter memory elements are initialized to + * zero in most applications. + * pDelayLineIndex - pointer to the filter memory index that is maintained + * internally by the function. The user should initialize the value + * of this index to zero. + * scaleFactor - saturation fixed scaleFactor + * + * Output Arguments: + * + * pResult - pointer to the filtered output sample + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - One or more of the following pointers is NULL: + * - pResult, + * - pTapsQ15, + * - pDelayLine, or + * - pDelayLineIndex + * - tapslen < 1 + * - scaleFactor < 0 + * - *pDelayLineIndex < 0 or *pDelayLineIndex >= (2 * tapslen) + * + */ +OMXResult omxSP_FIROne_Direct_S16_Sfs ( + OMX_S16 val, + OMX_S16 *pResult, + const OMX_S16 *pTapsQ15, + OMX_INT tapsLen, + OMX_S16 *pDelayLine, + OMX_INT *pDelayLineIndex, + OMX_INT scaleFactor +); + + + +/** + * Function: omxSP_FIROne_Direct_S16_ISfs (2.2.3.1.2) + * + * Description: + * Single-sample FIR filtering for 16-bit data type. These functions apply + * the FIR filter defined by the coefficient vector pTapsQ15 to a single + * sample of input data. The output is multiplied by 2 to the negative power + * of scalefactor (i.e., 2^-scalefactor) before returning to the user. + * Scaling and rounding conventions are defined in section 1.6.7. + * The internal accumulator width must be at least 32 bits. + * The result is undefined if any of the partially accumulated values exceeds + * the range of a signed 32-bit integer. + * + * Input Arguments: + * + * pValResult - the pointer to a single input sample to which the filter is + * applied. + * pTapsQ15 - pointer to the vector that contains the filter coefficients, + * represented in Q0.15 format (as defined in section 1.6.5). Given + * that: + * -32768 = pTapsQ15(k) < 32768, + * 0 = k < tapsLen, + * the range on the actual filter coefficients is -1 = bK <1, and + * therefore coefficient normalization may be required during the + * filter design process. + * tapsLen - the number of taps, or, equivalently, the filter order + 1 + * pDelayLine - pointer to the 2.tapsLen -element filter memory buffer + * (state). The user is responsible for allocation, initialization, + * and de-allocation. The filter memory elements are initialized to + * zero in most applications. + * pDelayLineIndex - pointer to the filter memory index that is maintained + * internally by the function. The user should initialize the value + * of this index to zero. + * scaleFactor - saturation fixed scaleFactor + * + * Output Arguments: + * + * pValResult - pointer to the filtered output sample + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - One or more of the following pointers is NULL: + * - pValResult, + * - pTapsQ15, + * - pDelayLine, or + * - pDelayLineIndex + * - tapslen < 1 + * - scaleFactor < 0 + * - *pDelayLineIndex < 0 or *pDelayLineIndex >= (2 * tapslen) + * + */ +OMXResult omxSP_FIROne_Direct_S16_ISfs ( + OMX_S16 *pValResult, + const OMX_S16 *pTapsQ15, + OMX_INT tapsLen, + OMX_S16 *pDelayLine, + OMX_INT *pDelayLineIndex, + OMX_INT scaleFactor +); + + + +/** + * Function: omxSP_IIR_Direct_S16 (2.2.3.2.1) + * + * Description: + * Block IIR filtering for 16-bit data. This function applies the direct form + * II IIR filter defined by the coefficient vector pTaps to a vector of input + * data. The internal accumulator width must be at least 32 bits, and the + * result is saturated if the operation produces a value outside the range of + * a signed 16-bit integer, i.e., the output will saturate to 0x8000 (-32768) + * for a negative overflow or 0x7fff (32767) for a positive overflow. The + * result is undefined if any of the partially accumulated values exceeds the + * range of a signed 32-bit integer. + * + * Input Arguments: + * + * pSrc - pointer to the vector of input samples to which the + * filter is applied + * len - the number of samples contained in both the input and output + * vectors + * pTaps - pointer to the 2L+2-element vector that contains the combined + * numerator and denominator filter coefficients from the system + * transfer function, H(z). Coefficient scaling and coefficient + * vector organization should follow the conventions described + * above. The value of the coefficient scaleFactor exponent must be + * non-negative (sf=0). + * order - the maximum of the degrees of the numerator and denominator + * coefficient polynomials from the system transfer function, H(z). + * In the notation of section 2.2.3.2, the parameter + * order=max(K,M)=L gives the maximum delay, in samples, used to + * compute each output sample. + * pDelayLine - pointer to the L-element filter memory buffer (state). The + * user is responsible for allocation, initialization, and + * deallocation. The filter memory elements are initialized to zero + * in most applications. + * + * Output Arguments: + * + * pDst - pointer to the vector of filtered output samples + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - one or more of the following pointers is NULL: + * - pSrc, + * - pDst, + * - pTaps, or + * - pDelayLine. + * - len < 0 + * - pTaps[order+1] < 0 (negative scaling) + * - order < 1 + * + */ +OMXResult omxSP_IIR_Direct_S16 ( + const OMX_S16 *pSrc, + OMX_S16 *pDst, + OMX_INT len, + const OMX_S16 *pTaps, + OMX_INT order, + OMX_S32 *pDelayLine +); + + + +/** + * Function: omxSP_IIR_Direct_S16_I (2.2.3.2.1) + * + * Description: + * Block IIR filtering for 16-bit data. This function applies the direct form + * II IIR filter defined by the coefficient vector pTaps to a vector of input + * data. The internal accumulator width must be at least 32 bits, and the + * result is saturated if the operation produces a value outside the range of + * a signed 16-bit integer, i.e., the output will saturate to 0x8000 (-32768) + * for a negative overflow or 0x7fff (32767) for a positive overflow. The + * result is undefined if any of the partially accumulated values exceeds the + * range of a signed 32-bit integer. + * + * Input Arguments: + * + * pSrcDst - pointer to the vector of input samples to which the + * filter is applied + * len - the number of samples contained in both the input and output + * vectors + * pTaps - pointer to the 2L+2-element vector that contains the combined + * numerator and denominator filter coefficients from the system + * transfer function, H(z). Coefficient scaling and coefficient + * vector organization should follow the conventions described + * above. The value of the coefficient scaleFactor exponent must be + * non-negative (sf>=0). + * order - the maximum of the degrees of the numerator and denominator + * coefficient polynomials from the system transfer function, H(z). + * In the notation of section 2.2.3.2, the parameter + * order=max(K,M)=L gives the maximum delay, in samples, used to + * compute each output sample. + * pDelayLine - pointer to the L-element filter memory buffer (state). The + * user is responsible for allocation, initialization, and + * deallocation. The filter memory elements are initialized to zero + * in most applications. + * + * Output Arguments: + * + * pSrcDst - pointer to the vector of filtered output samples + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - one or more of the following pointers is NULL: + * - pSrcDst, + * - pTaps, or + * - pDelayLine. + * - len < 0 + * - pTaps[order+1] < 0 (negative scaling) + * - order < 1 + * + */ +OMXResult omxSP_IIR_Direct_S16_I ( + OMX_S16 *pSrcDst, + OMX_INT len, + const OMX_S16 *pTaps, + OMX_INT order, + OMX_S32 *pDelayLine +); + + + +/** + * Function: omxSP_IIROne_Direct_S16 (2.2.3.2.2) + * + * Description: + * Single sample IIR filtering for 16-bit data. This function applies the + * direct form II IIR filter defined by the coefficient vector pTaps to a + * single sample of input data. The internal accumulator width must be at + * least 32 bits, and the result is saturated if the operation produces a + * value outside the range of a signed 16-bit integer, i.e., the output will + * saturate to 0x8000 (-32768) for a negative overflow or 0x7fff (32767) for a + * positive overflow. The result is undefined if any of the partially + * accumulated values exceeds the range of a signed 32-bit integer. + * + * Input Arguments: + * + * val - the single input sample to which the filter is + * applied. + * pTaps - pointer to the 2L+2 -element vector that contains the combined + * numerator and denominator filter coefficients from the system + * transfer function, H(z). Coefficient scaling and coefficient + * vector organization should follow the conventions described + * above. The value of the coefficient scaleFactor exponent must be + * non-negative (sf>=0). + * order - the maximum of the degrees of the numerator and denominator + * coefficient polynomials from the system transfer function, H(z). + * In the notation of section 2.2.3.2, the parameter + * order=max(K,M)=L gives the maximum delay, in samples, used to + * compute each output sample. + * pDelayLine - pointer to the L-element filter memory buffer (state). The + * user is responsible for allocation, initialization, and + * deallocation. The filter memory elements are initialized to zero + * in most applications. + * + * Output Arguments: + * + * pResult - pointer to the filtered output sample + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - one or more of the following pointers is NULL: pResult, + * pTaps, or pDelayLine. + * - order < 1 + * - pTaps[order+1] < 0 (negative scaling) + * + */ +OMXResult omxSP_IIROne_Direct_S16 ( + OMX_S16 val, + OMX_S16 *pResult, + const OMX_S16 *pTaps, + OMX_INT order, + OMX_S32 *pDelayLine +); + + + +/** + * Function: omxSP_IIROne_Direct_S16_I (2.2.3.2.2) + * + * Description: + * Single sample IIR filtering for 16-bit data. This function applies the + * direct form II IIR filter defined by the coefficient vector pTaps to a + * single sample of input data. The internal accumulator width must be at + * least 32 bits, and the result is saturated if the operation produces a + * value outside the range of a signed 16-bit integer, i.e., the output will + * saturate to 0x8000 (-32768) for a negative overflow or 0x7fff (32767) for a + * positive overflow. The result is undefined if any of the partially + * accumulated values exceeds the range of a signed 32-bit integer. + * + * Input Arguments: + * + * pValResult - pointer to the single input sample to which the filter is + * applied. + * pTaps - pointer to the 2L+2 -element vector that contains the combined + * numerator and denominator filter coefficients from the system + * transfer function, H(z). Coefficient scaling and coefficient + * vector organization should follow the conventions described + * above. The value of the coefficient scaleFactor exponent must be + * non-negative (sf>=0). + * order - the maximum of the degrees of the numerator and denominator + * coefficient polynomials from the system transfer function, H(z). + * In the notation of section 2.2.3.2, the parameter + * order=max(K,M)=L gives the maximum delay, in samples, used to + * compute each output sample. + * pDelayLine - pointer to the L-element filter memory buffer (state). The + * user is responsible for allocation, initialization, and + * deallocation. The filter memory elements are initialized to zero + * in most applications. + * + * Output Arguments: + * + * pValResult - pointer to the filtered output sample + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - one or more of the following pointers is NULL: + * pValResult, pTaps, or pDelayLine. + * - order < 1 + * - pTaps[order+1] < 0 (negative scaling) + * + */ +OMXResult omxSP_IIROne_Direct_S16_I ( + OMX_S16 *pValResult, + const OMX_S16 *pTaps, + OMX_INT order, + OMX_S32 *pDelayLine +); + + + +/** + * Function: omxSP_IIR_BiQuadDirect_S16 (2.2.3.3.1) + * + * Description: + * Block biquad IIR filtering for 16-bit data type. This function applies the + * direct form II biquad IIR cascade defined by the coefficient vector pTaps + * to a vector of input data. The internal accumulator width must be at least + * 32 bits, and the result is saturated if the operation produces a value + * outside the range of a signed 16-bit integer, i.e., the output will + * saturate to 0x8000 (-32768) for a negative overflow or 0x7fff (32767) for a + * positive overflow. The result is undefined if any of the partially + * accumulated values exceeds the range of a signed 32-bit integer. + * + * Input Arguments: + * + * pSrc - pointer to the vector of input samples to which the + * filter is applied + * len - the number of samples contained in both the input and output + * vectors + * pTaps - pointer to the 6P -element vector that contains the combined + * numerator and denominator filter coefficients from the biquad + * cascade. Coefficient scaling and coefficient vector organization + * should follow the conventions described above. The value of the + * coefficient scaleFactor exponent must be non-negative. (sfp>=0). + * numBiquad - the number of biquads contained in the IIR filter cascade: + * (P) + * pDelayLine - pointer to the 2P -element filter memory buffer (state). + * The user is responsible for allocation, initialization, and + * de-allocation. The filter memory elements are initialized to + * zero in most applications. + * + * Output Arguments: + * + * pDst - pointer to the vector of filtered output samples + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - one or more of the following pointers is NULL: pSrc, pDst, + * pTaps, or pDelayLine. + * - len < 0 + * - numBiquad < 1 + * - pTaps[3+n*6] < 0, for 0 <= n < numBiquad (negative scaling) + * + */ +OMXResult omxSP_IIR_BiQuadDirect_S16 ( + const OMX_S16 *pSrc, + OMX_S16 *pDst, + OMX_INT len, + const OMX_S16 *pTaps, + OMX_INT numBiquad, + OMX_S32 *pDelayLine +); + + + +/** + * Function: omxSP_IIR_BiQuadDirect_S16_I (2.2.3.3.1) + * + * Description: + * Block biquad IIR filtering for 16-bit data type. This function applies the + * direct form II biquad IIR cascade defined by the coefficient vector pTaps + * to a vector of input data. The internal accumulator width must be at least + * 32 bits, and the result is saturated if the operation produces a value + * outside the range of a signed 16-bit integer, i.e., the output will + * saturate to 0x8000 (-32768) for a negative overflow or 0x7fff (32767) for a + * positive overflow. The result is undefined if any of the partially + * accumulated values exceeds the range of a signed 32-bit integer. + * + * Input Arguments: + * + * pSrcDst - pointer to the vector of input samples to which the + * filter is applied + * len - the number of samples contained in both the input and output + * vectors + * pTaps - pointer to the 6P -element vector that contains the combined + * numerator and denominator filter coefficients from the biquad + * cascade. Coefficient scaling and coefficient vector organization + * should follow the conventions described above. The value of the + * coefficient scaleFactor exponent must be non-negative. (sfp>=0). + * numBiquad - the number of biquads contained in the IIR filter cascade: + * (P) + * pDelayLine - pointer to the 2P -element filter memory buffer (state). + * The user is responsible for allocation, initialization, and + * de-allocation. The filter memory elements are initialized to + * zero in most applications. + * + * Output Arguments: + * + * pSrcDst - pointer to the vector of filtered output samples + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - one or more of the following pointers is NULL: + * pSrcDst, pTaps, or pDelayLine. + * - len < 0 + * - numBiquad < 1 + * - pTaps[3+n*6] < 0, for 0 <= n < numBiquad (negative scaling) + * + */ +OMXResult omxSP_IIR_BiQuadDirect_S16_I ( + OMX_S16 *pSrcDst, + OMX_INT len, + const OMX_S16 *pTaps, + OMX_INT numBiquad, + OMX_S32 *pDelayLine +); + + + +/** + * Function: omxSP_IIROne_BiQuadDirect_S16 (2.2.3.3.2) + * + * Description: + * Single-sample biquad IIR filtering for 16-bit data type. This function + * applies the direct form II biquad IIR cascade defined by the coefficient + * vector pTaps to a single sample of input data. The internal accumulator + * width must be at least 32 bits, and the result is saturated if the + * operation produces a value outside the range of a signed 16-bit integer, + * i.e., the output will saturate to 0x8000 (-32768) for a negative overflow + * or 0x7fff (32767) for a positive overflow. The result is undefined if any + * of the partially accumulated values exceeds the range of a signed 32-bit + * integer. + * + * Input Arguments: + * + * val - the single input sample to which the filter is + * applied. + * pTaps - pointer to the 6P-element vector that contains the combined + * numerator and denominator filter coefficients from the biquad + * cascade. Coefficient scaling and coefficient vector organization + * should follow the conventions described above. The value of the + * coefficient scalefactor exponent must be non-negative: (sfp>=0). + * numBiquad - the number of biquads contained in the IIR filter cascade: + * (P) + * pDelayLine - pointer to the 2p-element filter memory buffer (state). The + * user is responsible for allocation, initialization, and + * deallocation. The filter memory elements are initialized to zero + * in most applications. + * + * Output Arguments: + * + * pResult - pointer to the filtered output sample + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - one or more of the following pointers is NULL: pResult, + * pValResult, pTaps, or pDelayLine. + * - numBiquad < 1 + * - pTaps[3+n*6] < 0, for 0 <= n < numBiquad (negative scaling) + * + */ +OMXResult omxSP_IIROne_BiQuadDirect_S16 ( + OMX_S16 val, + OMX_S16 *pResult, + const OMX_S16 *pTaps, + OMX_INT numBiquad, + OMX_S32 *pDelayLine +); + + + +/** + * Function: omxSP_IIROne_BiQuadDirect_S16_I (2.2.3.3.2) + * + * Description: + * Single-sample biquad IIR filtering for 16-bit data type. This function + * applies the direct form II biquad IIR cascade defined by the coefficient + * vector pTaps to a single sample of input data. The internal accumulator + * width must be at least 32 bits, and the result is saturated if the + * operation produces a value outside the range of a signed 16-bit integer, + * i.e., the output will saturate to 0x8000 (-32768) for a negative overflow + * or 0x7fff (32767) for a positive overflow. The result is undefined if any + * of the partially accumulated values exceeds the range of a signed 32-bit + * integer. + * + * Input Arguments: + * + * pValResult - pointer to the single input sample to which the filter is + * applied. + * pTaps - pointer to the 6P-element vector that contains the combined + * numerator and denominator filter coefficients from the biquad + * cascade. Coefficient scaling and coefficient vector organization + * should follow the conventions described above. The value of the + * coefficient scalefactor exponent must be non-negative: (sfp>=0). + * numBiquad - the number of biquads contained in the IIR filter cascade: + * (P) + * pDelayLine - pointer to the 2p-element filter memory buffer (state). The + * user is responsible for allocation, initialization, and + * deallocation. The filter memory elements are initialized to zero + * in most applications. + * + * Output Arguments: + * + * pValResult - pointer to the filtered output sample + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - one or more of the following pointers is NULL: + * pValResult, pTaps, or pDelayLine. + * - numBiquad < 1 + * - pTaps[3+n*6] < 0, for 0 <= n < numBiquad (negative scaling) + * + */ +OMXResult omxSP_IIROne_BiQuadDirect_S16_I ( + OMX_S16 *pValResult, + const OMX_S16 *pTaps, + OMX_INT numBiquad, + OMX_S32 *pDelayLine +); + + + +/** + * Function: omxSP_FilterMedian_S32 (2.2.3.4.1) + * + * Description: + * This function computes the median over the region specified by the median + * mask for the every element of the input array. The median outputs are + * stored in the corresponding elements of the output vector. + * + * Input Arguments: + * + * pSrc - pointer to the input vector + * len - number of elements contained in the input and output vectors (0 < + * len < 65536) + * maskSize - median mask size; if an even value is specified, the function + * subtracts 1 and uses the odd value of the filter mask for median + * filtering (0 < maskSize < 256) + * + * Output Arguments: + * + * pDst - pointer to the median-filtered output vector + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - one or more of the following pointers is NULL: pSrc, pDst. + * - len < 0 + * - maskSize < 1 or maskSize> 255 + * OMX_StsSP_EvenMedianMaskSizeErr - even mask size replaced by odd mask + * size + * + */ +OMXResult omxSP_FilterMedian_S32 ( + const OMX_S32 *pSrc, + OMX_S32 *pDst, + OMX_INT len, + OMX_INT maskSize +); + + + +/** + * Function: omxSP_FilterMedian_S32_I (2.2.3.4.1) + * + * Description: + * This function computes the median over the region specified by the median + * mask for the every element of the input array. The median outputs are + * stored in the corresponding elements of the output vector. + * + * Input Arguments: + * + * pSrcDst - pointer to the input vector + * len - number of elements contained in the input and output vectors (0 < + * len < 65536) + * maskSize - median mask size; if an even value is specified, the function + * subtracts 1 and uses the odd value of the filter mask for median + * filtering (0 < maskSize < 256) + * + * Output Arguments: + * + * pSrcDst - pointer to the median-filtered output vector + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - pSrcDst is NULL. + * - len < 0 + * - maskSize < 1 or maskSize> 255 + * OMX_StsSP_EvenMedianMaskSizeErr - even mask size replaced by odd mask + * size + * + */ +OMXResult omxSP_FilterMedian_S32_I ( + OMX_S32 *pSrcDst, + OMX_INT len, + OMX_INT maskSize +); + + + +/** + * Function: omxSP_FFTInit_C_SC16 (2.2.4.1.2) + * + * Description: + * These functions initialize the specification structures required for the + * complex FFT and IFFT functions. Desired block length is specified as an + * input. The function <FFTInit_C_SC16> is used to initialize the + * specification structures for functions <FFTFwd_CToC_SC16_Sfs> and + * <FFTInv_CToC_SC16_Sfs>. + * + * Memory for the specification structure *pFFTSpec + * must be allocated prior to calling these functions and should be 4-byte + * aligned for omxSP_FFTInit_C_SC16. + * + * The space required for *pFFTSpec, in bytes, can be + * determined using <FFTGetBufSize_C_SC16>. + * + * Input Arguments: + * + * order - base-2 logarithm of the desired block length; + * valid in the range [0,12] + * + * Output Arguments: + * + * pFFTSpec - pointer to initialized specification structure + * + * Return Value: + * + * OMX_Sts_NoErr -no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - pFFTSpec is either NULL or violates the 4-byte alignment + * restrictions + * - order < 0 or order > 12 + * + */ +OMXResult omxSP_FFTInit_C_SC16 ( + OMXFFTSpec_C_SC16 *pFFTSpec, + OMX_INT order +); + + + +/** + * Function: omxSP_FFTInit_C_SC32 (2.2.4.1.2) + * + * Description: + * These functions initialize the specification structures required for the + * complex FFT and IFFT functions. Desired block length is specified as an + * input. The function <FFTInit_C_SC32> is used to initialize + * the specification structures for the functions <FFTFwd_CToC_SC32_Sfs> and + * <FFTInv_CToC_SC32_Sfs>. + * + * Memory for the specification structure *pFFTSpec must be allocated prior + * to calling these functions and should be 8-byte aligned for + * omxSP_FFTInit_C_SC32. + * + * The space required for *pFFTSpec, in bytes, can be + * determined using <FFTGetBufSize_C_SC32>. + * + * Input Arguments: + * + * order - base-2 logarithm of the desired block length; valid in the range + * [0,12] + * + * Output Arguments: + * + * pFFTSpec - pointer to initialized specification structure + * + * Return Value: + * + * OMX_Sts_NoErr -no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - pFFTSpec is either NULL or violates the 8-byte alignment + * restrictions + * - order < 0 or order > 12 + * + */ +OMXResult omxSP_FFTInit_C_SC32 ( + OMXFFTSpec_C_SC32 *pFFTSpec, + OMX_INT order +); + +/** + * Function: omxSP_FFTInit_C_FC32 (2.2.4.1.2) + * + * Description: + * These functions initialize the specification structures required for the + * complex FFT and IFFT functions. Desired block length is specified as an + * input. The function <FFTInit_C_FC32> is used to initialize + * the specification structures for the functions <FFTFwd_CToC_FC32_Sfs> and + * <FFTInv_CToC_FC32_Sfs>. + * + * Memory for the specification structure *pFFTSpec must be allocated prior + * to calling these functions and should be 8-byte aligned for + * omxSP_FFTInit_C_FC32. + * + * The space required for *pFFTSpec, in bytes, can be + * determined using <FFTGetBufSize_C_FC32>. + * + * Input Arguments: + * + * order - base-2 logarithm of the desired block length; valid in the range + * [1,15] + * + * Output Arguments: + * + * pFFTSpec - pointer to initialized specification structure + * + * Return Value: + * + * OMX_Sts_NoErr -no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - pFFTSpec is either NULL or violates the 8-byte alignment + * restrictions + * - order < 1 or order > 15 + * + */ +OMXResult omxSP_FFTInit_C_FC32( + OMXFFTSpec_C_FC32* pFFTSpec, + OMX_INT order +); + + + +/** + * Function: omxSP_FFTInit_R_S16S32 (2.2.4.1.4) + * + * Description: + * These functions initialize specification structures required for the real + * FFT and IFFT functions. The function <FFTInit_R_S16S32> is used to + * initialize the specification structures for functions + * <FFTFwd_RToCCS_S16S32_Sfs> and <FFTInv_CCSToR_S32S16_Sfs>. + * + * Memory for + * *pFFTFwdSpec must be allocated before calling these functions and should be + * 8-byte aligned. The number of bytes required for *pFFTFwdSpec can be + * determined using <FFTGetBufSize_R_S16S32>. + * + * Input Arguments: + * + * order - base-2 logarithm of the desired block length; valid in the range + * [0,12] + * + * Output Arguments: + * + * pFFTFwdSpec - pointer to the initialized specification structure + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - pFFTFwdSpec is either NULL or violates the 8-byte alignment + * restrictions + * - order < 0 or order > 12 + * + */ +OMXResult omxSP_FFTInit_R_S16S32( + OMXFFTSpec_R_S16S32* pFFTFwdSpec, + OMX_INT order +); + + + +/** + * Function: omxSP_FFTInit_R_S16 + * + * Description: + * These functions initialize specification structures required for the real + * FFT and IFFT functions. The function <FFTInit_R_S16> is used + * to initialize the specification structures for functions + * <FFTFwd_RToCCS_S16_Sfs> and <FFTInv_CCSToR_S16_Sfs>. + * + * Memory for *pFFTFwdSpec must be allocated before calling these functions + * and should be 8-byte aligned. + * + * The number of bytes required for *pFFTFwdSpec can be + * determined using <FFTGetBufSize_R_S16>. + * + * Input Arguments: + * + * order - base-2 logarithm of the desired block length; valid in the range + * [1,12] + * + * Output Arguments: + * + * pFFTFwdSpec - pointer to the initialized specification structure + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - pFFTFwdSpec is either NULL or violates the 8-byte alignment + * restrictions + * - order < 1 or order > 12 + * + */ +OMXResult omxSP_FFTInit_R_S16 ( + OMXFFTSpec_R_S32*pFFTFwdSpec, + OMX_INT order +); + +/** + * Function: omxSP_FFTInit_R_S32 (2.2.4.1.4) + * + * Description: + * These functions initialize specification structures required for the real + * FFT and IFFT functions. The function <FFTInit_R_S32> is used to initialize + * the specification structures for functions <FFTFwd_RToCCS_S32_Sfs> + * and <FFTInv_CCSToR_S32_Sfs>. + * + * Memory for *pFFTFwdSpec must be allocated before calling these functions + * and should be 8-byte aligned. + * + * The number of bytes required for *pFFTFwdSpec can be + * determined using <FFTGetBufSize_R_S32>. + * + * Input Arguments: + * + * order - base-2 logarithm of the desired block length; valid in the range + * [0,12] + * + * Output Arguments: + * + * pFFTFwdSpec - pointer to the initialized specification structure + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - pFFTFwdSpec is either NULL or violates the 8-byte alignment + * restrictions + * - order < 0 or order > 12 + * + */ +OMXResult omxSP_FFTInit_R_S32 ( + OMXFFTSpec_R_S32*pFFTFwdSpec, + OMX_INT order +); + +/** + * Function: omxSP_FFTInit_R_F32 + * + * Description: + * These functions initialize specification structures required for the real + * FFT and IFFT functions. The function <FFTInit_R_F32> is used to initialize + * the specification structures for functions <FFTFwd_RToCCS_F32_Sfs> + * and <FFTInv_CCSToR_F32_Sfs>. + * + * Memory for *pFFTFwdSpec must be allocated before calling these functions + * and should be 8-byte aligned. + * + * The number of bytes required for *pFFTFwdSpec can be + * determined using <FFTGetBufSize_R_F32>. + * + * Input Arguments: + * + * order - base-2 logarithm of the desired block length; valid in the range + * [1,15] + * + * Output Arguments: + * + * pFFTFwdSpec - pointer to the initialized specification structure + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - pFFTFwdSpec is either NULL or violates the 8-byte alignment + * restrictions + * - order < 1 or order > 15 + * + */ +OMXResult omxSP_FFTInit_R_F32( + OMXFFTSpec_R_F32* pFFTFwdSpec, + OMX_INT order +); + +/** + * Function: omxSP_FFTGetBufSize_C_SC16 (2.2.4.1.6) + * + * Description: + * These functions compute the size of the specification structure + * required for the length 2^order complex FFT and IFFT functions. The function + * <FFTGetBufSize_C_SC16> is used in conjunction with the 16-bit functions + * <FFTFwd_CToC_SC16_Sfs> and <FFTInv_CToC_SC16_Sfs>. + * + * Input Arguments: + * + * order - base-2 logarithm of the desired block length; valid in the range + * [0,12] + * + * Output Arguments: + * + * pSize - pointer to the number of bytes required for the specification + * structure + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - pSize is NULL + * - order < 0 or order > 12 + * + */ +OMXResult omxSP_FFTGetBufSize_C_SC16 ( + OMX_INT order, + OMX_INT *pSize +); + + + +/** + * Function: omxSP_FFTGetBufSize_C_SC32 (2.2.4.1.6) + * + * Description: + * These functions compute the size of the specification structure + * required for the length 2^order complex FFT and IFFT functions. The function + * <FFTGetBufSize_C_SC32> is used in conjunction with the 32-bit functions + * <FFTFwd_CToC_SC32_Sfs> and <FFTInv_CToC_SC32_Sfs>. + * + * Input Arguments: + * + * order - base-2 logarithm of the desired block length; valid in the range + * [0,12] + * + * Output Arguments: + * + * pSize - pointer to the number of bytes required for the specification + * structure + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - pSize is NULL + * - order < 0 or order > 12 + * + */ +OMXResult omxSP_FFTGetBufSize_C_SC32 ( + OMX_INT order, + OMX_INT *pSize +); + +/** + * Function: omxSP_FFTGetBufSize_C_FC32 + * + * Description: + * These functions compute the size of the specification structure + * required for the length 2^order complex FFT and IFFT functions. The function + * <FFTGetBufSize_C_FC32> is used in conjunction with the 32-bit functions + * <FFTFwd_CToC_FC32_Sfs> and <FFTInv_CToC_FC32_Sfs>. + * + * Input Arguments: + * + * order - base-2 logarithm of the desired block length; valid in the range + * [1,15] + * + * Output Arguments: + * + * pSize - pointer to the number of bytes required for the specification + * structure + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments; returned if one or more of the + * following is true: + * - pSize is NULL + * - order < 1 or order > 15 + * + */ +OMXResult omxSP_FFTGetBufSize_C_FC32( + OMX_INT order, + OMX_INT* pSize +); + + +/** + * Function: omxSP_FFTGetBufSize_R_S16S32 (2.2.4.1.8) + * + * Description: + * order These functions compute the size of the specification structure + * required for the length 2^order real FFT and IFFT functions. The function + * <FFTGetBufSize_R_S16S32> is used in conjunction with the 16-bit functions + * <FFTFwd_RToCCS_S16S32_Sfs> and <FFTInv_CCSToR_S32S16_Sfs>. + * + * Input Arguments: + * + * order - base-2 logarithm of the length; valid in the range [0,12] + * + * Output Arguments: + * + * pSize - pointer to the number of bytes required for the specification + * structure + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments The function returns + * OMX_Sts_BadArgErr if one or more of the following is true: + * pSize is NULL + * order < 0 or order > 12 + * + */ +OMXResult omxSP_FFTGetBufSize_R_S16S32( + OMX_INT order, + OMX_INT* pSize +); + + +/** + * Function: omxSP_FFTGetBufSize_R_S16 + * + * Description: + * These functions compute the size of the specification structure + * required for the length 2^order real FFT and IFFT functions. The function + * <FFTGetBufSize_R_S16> is used in conjunction with the 16-bit + * functions <FFTFwd_RToCCS_S16_Sfs> and <FFTInv_CCSToR_S16_Sfs>. + * + * Input Arguments: + * + * order - base-2 logarithm of the length; valid in the range + * [1,12] + * + * Output Arguments: + * + * pSize - pointer to the number of bytes required for the specification + * structure + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments The function returns + * OMX_Sts_BadArgErr if one or more of the following is true: + * pSize is NULL + * order < 1 or order > 12 + * + */ +OMXResult omxSP_FFTGetBufSize_R_S16 ( + OMX_INT order, + OMX_INT *pSize +); + +/** + * Function: omxSP_FFTGetBufSize_R_S32 (2.2.4.1.8) + * + * Description: + * These functions compute the size of the specification structure + * required for the length 2^order real FFT and IFFT functions. The function + * <FFTGetBufSize_R_S32> is used in conjunction with the 32-bit functions + * <FFTFwd_RToCCS_S32_Sfs> and <FFTInv_CCSToR_S32_Sfs>. + * + * Input Arguments: + * + * order - base-2 logarithm of the length; valid in the range [0,12] + * + * Output Arguments: + * + * pSize - pointer to the number of bytes required for the specification + * structure + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments The function returns + * OMX_Sts_BadArgErr if one or more of the following is true: + * pSize is NULL + * order < 0 or order > 12 + * + */ +OMXResult omxSP_FFTGetBufSize_R_S32 ( + OMX_INT order, + OMX_INT *pSize +); + +/** + * Function: omxSP_FFTGetBufSize_R_F32 + * + * Description: + * These functions compute the size of the specification structure + * required for the length 2^order real FFT and IFFT functions. The function + * <FFTGetBufSize_R_F32> is used in conjunction with the 32-bit functions + * <FFTFwd_RToCCS_F32_Sfs> and <FFTInv_CCSToR_F32_Sfs>. + * + * Input Arguments: + * + * order - base-2 logarithm of the length; valid in the range [1,15] + * + * Output Arguments: + * + * pSize - pointer to the number of bytes required for the specification + * structure + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments The function returns + * OMX_Sts_BadArgErr if one or more of the following is true: + * pSize is NULL + * order < 1 or order > 15 + * + */ +OMXResult omxSP_FFTGetBufSize_R_F32( + OMX_INT order, + OMX_INT* pSize +); + + + +/** + * Function: omxSP_FFTFwd_CToC_SC16_Sfs (2.2.4.2.2) + * + * Description: + * Compute an FFT for a complex signal of length of 2^order, + * where 0 <= order <= 12. + * Transform length is determined by the specification structure, which + * must be initialized prior to calling the FFT function using the appropriate + * helper, i.e., <FFTInit_C_sc32> or <FFTInit_C_SC16>. The relationship + * between the input and output sequences can be expressed in terms of the + * DFT, i.e., + * + * X[k] = 2^(-scaleFactor) . SUM[n=0...N-1]x[n].e^(-jnk.2.pi/N) + * k = 0,1,2,..., N-1 + * N = 2^order + * + * Input Arguments: + * pSrc - pointer to the input signal, a complex-valued vector of length 2^order; + * must be aligned on a 32 byte boundary. + * pFFTSpec - pointer to the preallocated and initialized specification + * structure + * scaleFactor - output scale factor; the range for is [0,16] + * + * Output Arguments: + * pDst - pointer to the complex-valued output vector, of length 2^order; + * must be aligned on an 32-byte boundary. + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - returned if one or more of the following conditions + * is true: + * - one or more of the following pointers is NULL: pSrc, pDst, or + * pFFTSpec. + * - pSrc or pDst is not 32-byte aligned + * - scaleFactor<0 or scaleFactor>16 + * + */ + +OMXResult omxSP_FFTFwd_CToC_SC16_Sfs ( + const OMX_SC16 *pSrc, + OMX_SC16 *pDst, + const OMXFFTSpec_C_SC16 *pFFTSpec, + OMX_INT scaleFactor +); + +OMXResult omxSP_FFTFwd_CToC_SC16_Sfs_neon ( + const OMX_SC16 *pSrc, + OMX_SC16 *pDst, + const OMXFFTSpec_C_SC16 *pFFTSpec, + OMX_INT scaleFactor +); + +/** + * Function: omxSP_FFTFwd_CToC_SC32_Sfs (2.2.4.2.2) + * + * Description: + * Compute an FFT for a complex signal of length of 2^order, + * where 0 <= order <= 12. + * Transform length is determined by the specification structure, which + * must be initialized prior to calling the FFT function using the appropriate + * helper, i.e., <FFTInit_C_sc32> or <FFTInit_C_SC16>. The relationship + * between the input and output sequences can be expressed in terms of the + * DFT, i.e., + * + * X[k] = 2^(-scaleFactor) . SUM[n=0...N-1]x[n].e^(-jnk.2.pi/N) + * k = 0,1,2,..., N-1 + * N = 2^order + * + * Input Arguments: + * pSrc - pointer to the input signal, a complex-valued vector of length 2^order; + * must be aligned on a 32 byte boundary. + * pFFTSpec - pointer to the preallocated and initialized specification + * structure + * scaleFactor - output scale factor; the range is [0,32] + * + * Output Arguments: + * pDst - pointer to the complex-valued output vector, of length 2^order; must be + * aligned on an 32-byte boundary. + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - returned if one or more of the following conditions + * is true: + * - one or more of the following pointers is NULL: pSrc, pDst, or + * pFFTSpec. + * - pSrc or pDst is not 32-byte aligned + * - scaleFactor<0 or scaleFactor >32 + * + */ +OMXResult omxSP_FFTFwd_CToC_SC32_Sfs ( + const OMX_SC32 *pSrc, + OMX_SC32 *pDst, + const OMXFFTSpec_C_SC32 *pFFTSpec, + OMX_INT scaleFactor +); + + + +/** + * Function: omxSP_FFTInv_CToC_SC16_Sfs (2.2.4.2.4) + * + * Description: + * These functions compute an inverse FFT for a complex signal of length + * of 2^order, where 0 <= order <= 12. Transform length is determined by the + * specification structure, which must be initialized prior to calling the FFT + * function using the appropriate helper, i.e., <FFTInit_C_sc32> or + * <FFTInit_C_SC16>. The relationship between the input and output sequences + * can be expressed in terms of the IDFT, i.e.: + * + * x[n] = (2^(-scalefactor)/N) . SUM[k=0,...,N-1] X[k].e^(jnk.2.pi/N) + * n=0,1,2,...N-1 + * N=2^order. + * + * Input Arguments: + * pSrc - pointer to the complex-valued input signal, of length 2^order ; + * must be aligned on a 32-byte boundary. + * pFFTSpec - pointer to the preallocated and initialized specification + * structure + * scaleFactor - scale factor of the output. Valid range is [0,16]. + * + * Output Arguments: + * order + * pDst - pointer to the complex-valued output signal, of length 2^order; + * must be aligned on a 32-byte boundary. + * + * Return Value: + * + * Positive value - the shift scale that was performed inside + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - returned if one or more of the following conditions + * is true: + * - one or more of the following pointers is NULL: pSrc, pDst, or + * pFFTSpec. + * - pSrc or pDst is not 32-byte aligned + * - scaleFactor<0 or scaleFactor>16 + * + */ +OMXResult omxSP_FFTInv_CToC_SC16_Sfs ( + const OMX_SC16 *pSrc, + OMX_SC16 *pDst, + const OMXFFTSpec_C_SC16 *pFFTSpec, + OMX_INT scaleFactor +); + +OMXResult omxSP_FFTInv_CToC_SC16_Sfs_neon ( + const OMX_SC16 *pSrc, + OMX_SC16 *pDst, + const OMXFFTSpec_C_SC16 *pFFTSpec, + OMX_INT scaleFactor +); + + + + +/** + * Function: omxSP_FFTInv_CToC_SC32_Sfs (2.2.4.2.4) + * + * Description: + * These functions compute an inverse FFT for a complex signal of length + * of 2^order, where 0 <= order <= 12. Transform length is determined by the + * specification structure, which must be initialized prior to calling the FFT + * function using the appropriate helper, i.e., <FFTInit_C_sc32> or + * <FFTInit_C_SC16>. The relationship between the input and output sequences + * can be expressed in terms of the IDFT, i.e.: + * + * x[n] = (2^(-scalefactor)/N) . SUM[k=0,...,N-1] X[k].e^(jnk.2.pi/N) + * n=0,1,2,...N-1 + * N=2^order. + * + * Input Arguments: + * pSrc - pointer to the complex-valued input signal, of length 2^order ; + * must be aligned on a 32-byte boundary. + * pFFTSpec - pointer to the preallocated and initialized specification + * structure + * scaleFactor - scale factor of the output. Valid range is [0,32]. + * + * Output Arguments: + * order + * pDst - pointer to the complex-valued output signal, of length 2^order; + * must be aligned on a 32-byte boundary. + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - returned if one or more of the following conditions + * is true: + * - one or more of the following pointers is NULL: pSrc, pDst, or + * pFFTSpec. + * - pSrc or pDst is not 32-byte aligned + * - scaleFactor<0 or scaleFactor>32 + * + */ +OMXResult omxSP_FFTInv_CToC_SC32_Sfs ( + const OMX_SC32 *pSrc, + OMX_SC32 *pDst, + const OMXFFTSpec_C_SC32 *pFFTSpec, + OMX_INT scaleFactor +); + + + +/** + * Function: omxSP_FFTFwd_RToCCS_S16S32_Sfs (2.2.4.4.2) + * + * Description: + * These functions compute an FFT for a real-valued signal of length of 2^order, + * where 0 <= order <= 12. Transform length is determined by the + * specification structure, which must be initialized prior to calling the FFT + * function using the appropriate helper, i.e., <FFTInit_R_S16S32>. + * The relationship between the input and output sequences + * can be expressed in terms of the DFT, i.e.: + * + * x[n] = (2^(-scalefactor)/N) . SUM[k=0,...,N-1] X[k].e^(jnk.2.pi/N) + * n=0,1,2,...N-1 + * N=2^order. + * + * The conjugate-symmetric output sequence is represented using a CCS vector, + * which is of length N+2, and is organized as follows: + * + * Index: 0 1 2 3 4 5 . . . N-2 N-1 N N+1 + * Component: R0 0 R1 I1 R2 I2 . . . R[N/2-1] I[N/2-1] R[N/2] 0 + * + * where R[n] and I[n], respectively, denote the real and imaginary components + * for FFT bin 'n'. Bins are numbered from 0 to N/2, where N is the FFT length. + * Bin index 0 corresponds to the DC component, and bin index N/2 corresponds to the + * foldover frequency. + * + * Input Arguments: + * pSrc - pointer to the real-valued input sequence, of length 2^order; + * must be aligned on a 32-byte boundary. + * pFFTSpec - pointer to the preallocated and initialized specification + * structure + * scaleFactor - output scale factor; valid range is [0, 32] + * + * Output Arguments: + * pDst - pointer to output sequence, represented using CCS format, of + * length (2^order)+2; must be aligned on a 32-byte boundary. + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments, if one or more of the following is true: + * - one of the pointers pSrc, pDst, or pFFTSpec is NULL + * - pSrc or pDst is not aligned on a 32-byte boundary + * - scaleFactor<0 or scaleFactor >32 + * + */ +OMXResult omxSP_FFTFwd_RToCCS_S16S32_Sfs ( + const OMX_S16 *pSrc, + OMX_S32 *pDst, + const OMXFFTSpec_R_S16S32 *pFFTSpec, + OMX_INT scaleFactor +); + + +/** + * Function: omxSP_FFTFwd_RToCCS_S16_Sfs + * + * Description: + * These functions compute an FFT for a real-valued signal of length of 2^order, + * where 0 < order <= 12. Transform length is determined by the + * specification structure, which must be initialized prior to calling the FFT + * function using the appropriate helper, i.e., <FFTInit_R_S16>. + * The relationship between the input and output sequences can + * be expressed in terms of the DFT, i.e.: + * + * x[n] = (2^(-scalefactor)/N) . SUM[k=0,...,N-1] X[k].e^(jnk.2.pi/N) + * n=0,1,2,...N-1 + * N=2^order. + * + * The conjugate-symmetric output sequence is represented using a CCS vector, + * which is of length N+2, and is organized as follows: + * + * Index: 0 1 2 3 4 5 . . . N-2 N-1 N N+1 + * Component: R0 0 R1 I1 R2 I2 . . . R[N/2-1] I[N/2-1] R[N/2] 0 + * + * where R[n] and I[n], respectively, denote the real and imaginary components + * for FFT bin 'n'. Bins are numbered from 0 to N/2, where N is the FFT length. + * Bin index 0 corresponds to the DC component, and bin index N/2 corresponds to + * the foldover frequency. + * + * Input Arguments: + * pSrc - pointer to the real-valued input sequence, of length 2^order; + * must be aligned on a 32-byte boundary. + * pFFTSpec - pointer to the preallocated and initialized specification + * structure + * scaleFactor - output scale factor; valid range is [0, 16] + * + * Output Arguments: + * pDst - pointer to output sequence, represented using CCS format, of + * length (2^order)+2; must be aligned on a 32-byte boundary. + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments, if one or more of followings is true: + * - one of the pointers pSrc, pDst, or pFFTSpec is NULL + * - pSrc or pDst is not aligned on a 32-byte boundary + * - scaleFactor<0 or scaleFactor >16 + * + */ +OMXResult omxSP_FFTFwd_RToCCS_S16_Sfs ( + const OMX_S16* pSrc, + OMX_S16* pDst, + const OMXFFTSpec_R_S16* pFFTSpec, + OMX_INT scaleFactor +); + + +/** + * Function: omxSP_FFTFwd_RToCCS_S32_Sfs (2.2.4.4.2) + * + * Description: + * These functions compute an FFT for a real-valued signal of length of 2^order, + * where 0 <= order <= 12. Transform length is determined by the + * specification structure, which must be initialized prior to calling the FFT + * function using the appropriate helper, i.e., <FFTInit_R_S32>. + * The relationship between the input and output sequences + * can be expressed in terms of the DFT, i.e.: + * + * x[n] = (2^(-scalefactor)/N) . SUM[k=0,...,N-1] X[k].e^(jnk.2.pi/N) + * n=0,1,2,...N-1 + * N=2^order. + * + * The conjugate-symmetric output sequence is represented using a CCS vector, + * which is of length N+2, and is organized as follows: + * + * Index: 0 1 2 3 4 5 . . . N-2 N-1 N N+1 + * Component: R0 0 R1 I1 R2 I2 . . . R[N/2-1] I[N/2-1] R[N/2] 0 + * + * where R[n] and I[n], respectively, denote the real and imaginary components + * for FFT bin 'n'. Bins are numbered from 0 to N/2, where N is the FFT length. + * Bin index 0 corresponds to the DC component, and bin index N/2 corresponds to the + * foldover frequency. + * + * Input Arguments: + * pSrc - pointer to the real-valued input sequence, of length 2^order; + * must be aligned on a 32-byte boundary. + * pFFTSpec - pointer to the preallocated and initialized specification + * structure + * scaleFactor - output scale factor; valid range is [0, 32] + * + * Output Arguments: + * pDst - pointer to output sequence, represented using CCS format, of + * length (2^order)+2; must be aligned on a 32-byte boundary. + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments, if one or more of the following is true: + * - one of the pointers pSrc, pDst, or pFFTSpec is NULL + * - pSrc or pDst is not aligned on a 32-byte boundary + * - scaleFactor<0 or scaleFactor >32 + * + */ +OMXResult omxSP_FFTFwd_RToCCS_S32_Sfs ( + const OMX_S32 *pSrc, + OMX_S32 *pDst, + const OMXFFTSpec_R_S32 *pFFTSpec, + OMX_INT scaleFactor +); + +/** + * Function: omxSP_FFTFwd_CToC_FC32_Sfs (2.2.4.2.2) + * + * Description: + * Compute an FFT for a complex signal of length of 2^order, + * where 0 <= order <= 15. + * Transform length is determined by the specification structure, which + * must be initialized prior to calling the FFT function using the appropriate + * helper, i.e., <FFTInit_C_sc32> or <FFTInit_C_SC16>. The relationship + * between the input and output sequences can be expressed in terms of the + * DFT, i.e., + * + * X[k] = SUM[n=0...N-1]x[n].e^(-jnk.2.pi/N) + * k = 0,1,2,..., N-1 + * N = 2^order + * + * Input Arguments: + * pSrc - pointer to the input signal, a complex-valued vector of length + * 2^order; must be aligned on a 32 byte boundary. + * pFFTSpec - pointer to the preallocated and initialized specification + * structure + * + * Output Arguments: + * pDst - pointer to the complex-valued output vector, of length 2^order; + * must be aligned on an 32-byte boundary. + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - returned if one or more of the following conditions + * is true: + * - one or more of the following pointers is NULL: pSrc, pDst, or + * pFFTSpec. + * - pSrc or pDst is not 32-byte aligned + * - scaleFactor<0 or scaleFactor >32 + * + */ +OMXResult omxSP_FFTFwd_CToC_FC32_Sfs ( + const OMX_FC32 *pSrc, + OMX_FC32 *pDst, + const OMXFFTSpec_C_FC32 *pFFTSpec +); +#ifdef __arm__ +/* + * Non-NEON version + */ +OMXResult omxSP_FFTFwd_CToC_FC32_Sfs_vfp ( + const OMX_FC32 *pSrc, + OMX_FC32 *pDst, + const OMXFFTSpec_C_FC32 *pFFTSpec +); +#endif + +/** + * Function: omxSP_FFTFwd_RToCCS_F32_Sfs + * + * Description: + * These functions compute an FFT for a real-valued signal of length + * of 2^order, where 0 <= order <= 12. Transform length is determined + * by the specification structure, which must be initialized prior to + * calling the FFT function using the appropriate helper, i.e., + * <FFTInit_R_F32>. The relationship between the input and output + * sequences can be expressed in terms of the DFT, i.e.: + * + * x[n] = (2^(-scalefactor)/N) . SUM[k=0,...,N-1] X[k].e^(jnk.2.pi/N) + * n=0,1,2,...N-1 + * N=2^order. + * + * The conjugate-symmetric output sequence is represented using a CCS vector, + * which is of length N+2, and is organized as follows: + * + * Index: 0 1 2 3 4 5 . . . N-2 N-1 N N+1 + * Component: R0 0 R1 I1 R2 I2 . . . R[N/2-1] I[N/2-1] R[N/2] 0 + * + * where R[n] and I[n], respectively, denote the real and imaginary + * components for FFT bin 'n'. Bins are numbered from 0 to N/2, where + * N is the FFT length. Bin index 0 corresponds to the DC component, + * and bin index N/2 corresponds to the foldover frequency. + * + * Input Arguments: + * pSrc - pointer to the real-valued input sequence, of length 2^order; + * must be aligned on a 32-byte boundary. + * pFFTSpec - pointer to the preallocated and initialized specification + * structure + * + * Output Arguments: + * pDst - pointer to output sequence, represented using CCS format, of + * length (2^order)+2; must be aligned on a 32-byte boundary. + * + * Return Value: + * + * OMX_Sts_NoErr - no error + + * OMX_Sts_BadArgErr - bad arguments, if one or more of the + * following is true: - one of the pointers pSrc, pDst, or pFFTSpec + * is NULL - pSrc or pDst is not aligned on a 32-byte boundary + * + */ +OMXResult omxSP_FFTFwd_RToCCS_F32_Sfs( + const OMX_F32* pSrc, + OMX_F32* pDst, + const OMXFFTSpec_R_F32* pFFTSpec +); + +#ifdef __arm__ +/* + * Non-NEON version of omxSP_FFTFwd_RToCCS_F32_Sfs + */ +OMXResult omxSP_FFTFwd_RToCCS_F32_Sfs_vfp( + const OMX_F32* pSrc, + OMX_F32* pDst, + const OMXFFTSpec_R_F32* pFFTSpec +); + +/* + * Just like omxSP_FFTFwd_RToCCS_F32_Sfs, but automatically detects + * whether NEON is available or not and chooses the appropriate + * routine. + */ +extern OMXResult (*omxSP_FFTFwd_RToCCS_F32)( + const OMX_F32* pSrc, + OMX_F32* pDst, + const OMXFFTSpec_R_F32* pFFTSpec +); +#else +#define omxSP_FFTFwd_RToCCS_F32 omxSP_FFTFwd_RToCCS_F32_Sfs +#endif + +/** + * Function: omxSP_FFTInv_CCSToR_S32S16_Sfs (2.2.4.4.4) + * + * Description: + * These functions compute the inverse FFT for a conjugate-symmetric input + * sequence. Transform length is determined by the specification structure, + * which must be initialized prior to calling the FFT function using + * <FFTInit_R_S16S32>. For a transform of length M, the input sequence is + * represented using a packed CCS vector of length M+2, and is organized + * as follows: + * + * Index: 0 1 2 3 4 5 . . . M-2 M-1 M M+1 + * Component R[0] 0 R[1] I[1] R[2] I[2] . . . R[M/2-1] I[M/2-1] R[M/2] 0 + * + * where R[n] and I[n], respectively, denote the real and imaginary components for FFT bin n. + * Bins are numbered from 0 to M/2, where M is the FFT length. Bin index 0 + * corresponds to the DC component, and bin index M/2 corresponds to the + * foldover frequency. + * + * Input Arguments: + * pSrc - pointer to the complex-valued input sequence represented using + * CCS format, of length (2^order) + 2; must be aligned on a 32-byte + * boundary. + * pFFTSpec - pointer to the preallocated and initialized specification + * structure + * scaleFactor - output scalefactor; range is [0,16] + * + * Output Arguments: + * pDst - pointer to the real-valued output sequence, of length 2^order ; must be + * aligned on a 32-byte boundary. + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments if one or more of the following is true: + * - pSrc, pDst, or pFFTSpec is NULL + * - pSrc or pDst is not aligned on a 32-byte boundary + * - scaleFactor<0 or scaleFactor >16 + * + */ +OMXResult omxSP_FFTInv_CCSToR_S32S16_Sfs ( + const OMX_S32 *pSrc, + OMX_S16 *pDst, + const OMXFFTSpec_R_S16S32 *pFFTSpec, + OMX_INT scaleFactor +); + + +/** + * Function: omxSP_FFTInv_CCSToR_S16_Sfs + * + * Description: + * These functions compute the inverse FFT for a conjugate-symmetric input + * sequence. Transform length is determined by the specification structure, + * which must be initialized prior to calling the FFT function using + * <FFTInit_R_S16>. For a transform of length M, the input + * sequence is represented using a packed CCS vector of length + * M+2, and is organized as follows: + * + * Index: 0 1 2 3 4 5 . . . M-2 M-1 M M+1 + * Component R[0] 0 R[1] I[1] R[2] I[2] . . . R[M/2-1] I[M/2-1] R[M/2] 0 + * + * where R[n] and I[n], respectively, denote the real and imaginary components + * for FFT bin n. + * Bins are numbered from 0 to M/2, where M is the FFT length. Bin index 0 + * corresponds to the DC component, and bin index M/2 corresponds to the + * foldover frequency. + * + * Input Arguments: + * pSrc - pointer to the complex-valued input sequence represented using + * CCS format, of length (2^order) + 2; must be aligned on a 32-byte + * boundary. + * pFFTSpec - pointer to the preallocated and initialized specification + * structure + * scaleFactor - output scalefactor; range is [0,16] + * + * Output Arguments: + * pDst - pointer to the real-valued output sequence, of length 2^order ; must + * be aligned on a 32-byte boundary. + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments if one or more of the following is true: + * - pSrc, pDst, or pFFTSpec is NULL + * - pSrc or pDst is not aligned on a 32-byte boundary + * - scaleFactor<0 or scaleFactor >16 + * + */ +OMXResult omxSP_FFTInv_CCSToR_S16_Sfs ( + const OMX_S16* pSrc, + OMX_S16* pDst, + const OMXFFTSpec_R_S16* pFFTSpec, + OMX_INT scaleFactor +); + +/** + * Function: omxSP_FFTInv_CCSToR_S32_Sfs (2.2.4.4.4) + * + * Description: + * These functions compute the inverse FFT for a conjugate-symmetric input + * sequence. Transform length is determined by the specification structure, + * which must be initialized prior to calling the FFT function using + * <FFTInit_R_S32>. For a transform of length M, the input sequence is + * represented using a packed CCS vector of length M+2, and is organized + * as follows: + * + * Index: 0 1 2 3 4 5 . . . M-2 M-1 M M+1 + * Component R[0] 0 R[1] I[1] R[2] I[2] . . . R[M/2-1] I[M/2-1] R[M/2] 0 + * + * where R[n] and I[n], respectively, denote the real and imaginary components for FFT bin n. + * Bins are numbered from 0 to M/2, where M is the FFT length. Bin index 0 + * corresponds to the DC component, and bin index M/2 corresponds to the + * foldover frequency. + * + * Input Arguments: + * pSrc - pointer to the complex-valued input sequence represented using + * CCS format, of length (2^order) + 2; must be aligned on a 32-byte + * boundary. + * pFFTSpec - pointer to the preallocated and initialized specification + * structure + * scaleFactor - output scalefactor; range is [0,32] + * + * Output Arguments: + * pDst - pointer to the real-valued output sequence, of length 2^order ; must be + * aligned on a 32-byte boundary. + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - bad arguments if one or more of the following is true: + * - pSrc, pDst, or pFFTSpec is NULL + * - pSrc or pDst is not aligned on a 32-byte boundary + * - scaleFactor<0 or scaleFactor >32 + * + */ +OMXResult omxSP_FFTInv_CCSToR_S32_Sfs ( + const OMX_S32 *pSrc, + OMX_S32 *pDst, + const OMXFFTSpec_R_S32 *pFFTSpec, + OMX_INT scaleFactor +); + +/** + * Function: omxSP_FFTInv_CToC_FC32_Sfs (2.2.4.2.4) + * + * Description: + * These functions compute an inverse FFT for a complex signal of + * length of 2^order, where 0 <= order <= 15. Transform length is + * determined by the specification structure, which must be + * initialized prior to calling the FFT function using the appropriate + * helper, i.e., <FFTInit_C_FC32>. The relationship between the input + * and output sequences can be expressed in terms of the IDFT, i.e.: + * + * x[n] = SUM[k=0,...,N-1] X[k].e^(jnk.2.pi/N) + * n=0,1,2,...N-1 + * N=2^order. + * + * Input Arguments: + * pSrc - pointer to the complex-valued input signal, of length 2^order ; + * must be aligned on a 32-byte boundary. + * pFFTSpec - pointer to the preallocated and initialized specification + * structure + * + * Output Arguments: + * order + * pDst - pointer to the complex-valued output signal, of length 2^order; + * must be aligned on a 32-byte boundary. + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * OMX_Sts_BadArgErr - returned if one or more of the following conditions + * is true: + * - one or more of the following pointers is NULL: pSrc, pDst, or + * pFFTSpec. + * - pSrc or pDst is not 32-byte aligned + * - scaleFactor<0 or scaleFactor>32 + * + */ +OMXResult omxSP_FFTInv_CToC_FC32_Sfs ( + const OMX_FC32 *pSrc, + OMX_FC32 *pDst, + const OMXFFTSpec_C_FC32 *pFFTSpec +); +#ifdef __arm__ +/* + * Non-NEON version + */ +OMXResult omxSP_FFTInv_CToC_FC32_Sfs_vfp ( + const OMX_FC32 *pSrc, + OMX_FC32 *pDst, + const OMXFFTSpec_C_FC32 *pFFTSpec +); +#endif + +/** + * Function: omxSP_FFTInv_CCSToR_F32_Sfs + * + * Description: + * These functions compute the inverse FFT for a conjugate-symmetric input + * sequence. Transform length is determined by the specification structure, + * which must be initialized prior to calling the FFT function using + * <FFTInit_R_F32>. For a transform of length M, the input sequence is + * represented using a packed CCS vector of length M+2, and is organized + * as follows: + * + * Index: 0 1 2 3 4 5 . . . M-2 M-1 M M+1 + * Comp: R[0] 0 R[1] I[1] R[2] I[2] . . . R[M/2-1] I[M/2-1] R[M/2] 0 + * + * where R[n] and I[n], respectively, denote the real and imaginary + * components for FFT bin n. Bins are numbered from 0 to M/2, where M + * is the FFT length. Bin index 0 corresponds to the DC component, + * and bin index M/2 corresponds to the foldover frequency. + * + * Input Arguments: + * pSrc - pointer to the complex-valued input sequence represented + * using CCS format, of length (2^order) + 2; must be aligned on a + * 32-byte boundary. + * pFFTSpec - pointer to the preallocated and initialized + * specification structure + * + * Output Arguments: + * pDst - pointer to the real-valued output sequence, of length + * 2^order ; must be aligned on a 32-byte boundary. + * + * Return Value: + * + * OMX_Sts_NoErr - no error + + * OMX_Sts_BadArgErr - bad arguments if one or more of the + * following is true: + * - pSrc, pDst, or pFFTSpec is NULL + * - pSrc or pDst is not aligned on a 32-byte boundary + * - scaleFactor<0 or scaleFactor >32 + * + */ +OMXResult omxSP_FFTInv_CCSToR_F32_Sfs( + const OMX_F32* pSrc, + OMX_F32* pDst, + const OMXFFTSpec_R_F32* pFFTSpec +); + +#ifdef __arm__ +/* + * Non-NEON version of omxSP_FFTInv_CCSToR_F32_Sfs + */ +OMXResult omxSP_FFTInv_CCSToR_F32_Sfs_vfp( + const OMX_F32* pSrc, + OMX_F32* pDst, + const OMXFFTSpec_R_F32* pFFTSpec +); + +/* + * Just like omxSP_FFTInv_CCSToR_F32_Sfs, but automatically detects + * whether NEON is available or not and chooses the appropriate + * routine. + */ +extern OMXResult (*omxSP_FFTInv_CCSToR_F32)( + const OMX_F32* pSrc, + OMX_F32* pDst, + const OMXFFTSpec_R_F32* pFFTSpec); +#else +#define omxSP_FFTInv_CCSToR_F32 omxSP_FFTInv_CCSToR_F32_Sfs +#endif + +/* + * Just like omxSP_FFTInv_CCSToR_F32_Sfs, but does not scale the result. + * (Actually, we multiple by two for consistency with other FFT routines in + * use.) + */ +OMXResult omxSP_FFTInv_CCSToR_F32_Sfs_unscaled( + const OMX_F32* pSrc, + OMX_F32* pDst, + const OMXFFTSpec_R_F32* pFFTSpec +); + + +#ifdef __cplusplus +} +#endif + +#endif /** end of #define _OMXSP_H_ */ + +/** EOF */ + diff --git a/media/openmax_dl/dl/sp/src/armSP_FFTInv_CCSToR_F32_preTwiddleRadix2_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFTInv_CCSToR_F32_preTwiddleRadix2_unsafe_s.S new file mode 100644 index 0000000000..f375991f7d --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFTInv_CCSToR_F32_preTwiddleRadix2_unsafe_s.S @@ -0,0 +1,294 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This is a modification of +@// armSP_FFTInv_CCSToR_S32_preTwiddleRadix2_unsafe_s.s to support float +@// instead of SC32. +@// + +@// +@// Description: +@// Compute the "preTwiddleRadix2" stage prior to the call to the complexFFT +@// It does a Z(k) = Feven(k) + jW^(-k) FOdd(k); k=0,1,2,...N/2-1 computation +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + @// Guarding implementation by the processor name + + + +@//Input Registers + +#define pSrc r0 +#define pDst r1 +#define pFFTSpec r2 +#define scale r3 + + +@// Output registers +#define result r0 + +@//Local Scratch Registers + +#define argTwiddle r1 +#define argDst r2 +#define argScale r4 +#define tmpOrder r4 +#define pTwiddle r4 +#define pOut r5 +#define subFFTSize r7 +#define subFFTNum r6 +#define N r6 +#define order r14 +#define diff r9 +@// Total num of radix stages required to complete the FFT +#define count r8 +#define x0r r4 +#define x0i r5 +#define diffMinusOne r2 +#define round r3 + +#define pOut1 r2 +#define size r7 +#define step r8 +#define step1 r9 +#define twStep r10 +#define pTwiddleTmp r11 +#define argTwiddle1 r12 +#define zero r14 + +@// Neon registers + +#define dX0 D0.F32 +#define dShift D1.F32 +#define dX1 D1.F32 +#define dY0 D2.F32 +#define dY1 D3.F32 +#define dX0r D0.F32 +#define dX0i D1.F32 +#define dX1r D2.F32 +#define dX1i D3.F32 +#define dW0r D4.F32 +#define dW0i D5.F32 +#define dW1r D6.F32 +#define dW1i D7.F32 +#define dT0 D8.F32 +#define dT1 D9.F32 +#define dT2 D10.F32 +#define dT3 D11.F32 +#define qT0 D12.F32 +#define qT1 D14.F32 +#define qT2 D16.F32 +#define qT3 D18.F32 +#define dY0r D4.F32 +#define dY0i D5.F32 +#define dY1r D6.F32 +#define dY1i D7.F32 + +#define dY2 D4.F32 +#define dY3 D5.F32 +#define dW0 D6.F32 +#define dW1 D7.F32 +#define dW0Tmp D10.F32 +#define dW1Neg D11.F32 + +#define half D13.F32 + +@ Structure offsets for the FFTSpec + .set ARMsFFTSpec_N, 0 + .set ARMsFFTSpec_pBitRev, 4 + .set ARMsFFTSpec_pTwiddle, 8 + .set ARMsFFTSpec_pBuf, 12 + + .MACRO FFTSTAGE scaled, inverse, name + + @// Read the size from structure and take log + LDR N, [pFFTSpec, #ARMsFFTSpec_N] + + @// Read other structure parameters + LDR pTwiddle, [pFFTSpec, #ARMsFFTSpec_pTwiddle] + LDR pOut, [pFFTSpec, #ARMsFFTSpec_pBuf] + + VMOV half, 0.5 + + + MOV size,N,ASR #1 @// preserve the contents of N + MOV step,N,LSL #2 @// step = N/2 * 8 bytes + + + @// Z(k) = 1/2 {[F(k) + F'(N/2-k)] +j*W^(-k) [F(k) - F'(N/2-k)]} + @// Note: W^(k) is stored as negated value and also need to + @// conjugate the values from the table + + @// Z(0) : no need of twiddle multiply + @// Z(0) = 1/2 { [F(0) + F'(N/2)] +j [F(0) - F'(N/2)] } + + VLD1 dX0,[pSrc],step + ADD pOut1,pOut,step @// pOut1 = pOut+ N/2*8 bytes + + VLD1 dX1,[pSrc]! + @// twStep = 3N/8 * 8 bytes pointing to W^1 + SUB twStep,step,size,LSL #1 + + MOV step1,size,LSL #2 @// step1 = N/4 * 8 = N/2*4 bytes + SUB step1,step1,#8 @// (N/4-1)*8 bytes + + VADD dY0,dX0,dX1 @// [b+d | a+c] + VSUB dY1,dX0,dX1 @// [b-d | a-c] + VMUL dY0, dY0, half[0] + VMUL dY1, dY1, half[0] + + @// dY0= [a-c | a+c] ;dY1= [b-d | b+d] + VZIP dY0,dY1 + + VSUB dX0,dY0,dY1 + SUBS size,size,#2 + VADD dX1,dY0,dY1 + + SUB pSrc,pSrc,step + + VST1 dX0[0],[pOut1]! + ADD pTwiddleTmp,pTwiddle,#8 @// W^2 + VST1 dX1[1],[pOut1]! + ADD argTwiddle1,pTwiddle,twStep @// W^1 + + + BLT decrementScale\name + BEQ lastElement\name + + + @// Z(k) = 1/2[F(k) + F'(N/2-k)] +j*W^(-k) [F(k) - F'(N/2-k)] + @// Note: W^k is stored as negative values in the table and also + @// need to conjugate the values from the table. + @// + @// Process 4 elements at a time. E.g: Z(1),Z(2) and Z(N/2-2),Z(N/2-1) + @// since both of them require F(1),F(2) and F(N/2-2),F(N/2-1) + + + SUB step,step,#24 +evenOddButterflyLoop\name : + + + VLD1 dW0r,[argTwiddle1],step1 + VLD1 dW1r,[argTwiddle1]! + + VLD2 {dX0r,dX0i},[pSrc],step + SUB argTwiddle1,argTwiddle1,step1 + VLD2 {dX1r,dX1i},[pSrc]! + + SUB step1,step1,#8 @// (N/4-2)*8 bytes + VLD1 dW0i,[pTwiddleTmp],step1 + VLD1 dW1i,[pTwiddleTmp]! + SUB pSrc,pSrc,step + + SUB pTwiddleTmp,pTwiddleTmp,step1 + VREV64 dX1r,dX1r + VREV64 dX1i,dX1i + SUBS size,size,#4 + + + VSUB dT2,dX0r,dX1r @// a-c + VADD dT3,dX0i,dX1i @// b+d + VADD dT0,dX0r,dX1r @// a+c + VSUB dT1,dX0i,dX1i @// b-d + SUB step1,step1,#8 + + VMUL dT2, dT2, half[0] + VMUL dT3, dT3, half[0] + + VMUL dT0, dT0, half[0] + VMUL dT1, dT1, half[0] + + VZIP dW1r,dW1i + VZIP dW0r,dW0i + + + VMUL dX1r,dW1r,dT2 + VMUL dX1i,dW1r,dT3 + VMUL dX0r,dW0r,dT2 + VMUL dX0i,dW0r,dT3 + + VMLS dX1r,dW1i,dT3 + VMLA dX1i,dW1i,dT2 + + VMLA dX0r,dW0i,dT3 + VMLS dX0i,dW0i,dT2 + + + VADD dY1r,dT0,dX1i @// F(N/2 -1) + VSUB dY1i,dX1r,dT1 + + VREV64 dY1r,dY1r + VREV64 dY1i,dY1i + + + VADD dY0r,dT0,dX0i @// F(1) + VSUB dY0i,dT1,dX0r + + + VST2 {dY0r,dY0i},[pOut1],step + VST2 {dY1r,dY1i},[pOut1]! + SUB pOut1,pOut1,step + SUB step,step,#32 @// (N/2-4)*8 bytes + + + BGT evenOddButterflyLoop\name + + + @// set both the ptrs to the last element + SUB pSrc,pSrc,#8 + SUB pOut1,pOut1,#8 + + @// Last element can be expanded as follows + @// 1/2[Z(k) + Z'(k)] - j w^-k [Z(k) - Z'(k)] (since W^k is stored as + @// -ve) + @// 1/2[(a+jb) + (a-jb)] - j w^-k [(a+jb) - (a-jb)] + @// 1/2[2a+j0] - j (c-jd) [0+j2b] + @// (a+bc, -bd) + @// Since (c,d) = (0,1) for the last element, result is just (a,-b) + +lastElement\name : + VLD1 dX0r,[pSrc] + + VST1 dX0r[0],[pOut1]! + VNEG dX0r,dX0r + VST1 dX0r[1],[pOut1] + + + +decrementScale\name : + + .endm + + M_START armSP_FFTInv_CCSToR_F32_preTwiddleRadix2_unsafe,r4 + + FFTSTAGE "FALSE","TRUE",Inv + M_END + + .end diff --git a/media/openmax_dl/dl/sp/src/armSP_FFTInv_CCSToR_S32_preTwiddleRadix2_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFTInv_CCSToR_S32_preTwiddleRadix2_unsafe_s.S new file mode 100644 index 0000000000..57fef7a940 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFTInv_CCSToR_S32_preTwiddleRadix2_unsafe_s.S @@ -0,0 +1,321 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. +@// + +@// +@// File Name: armSP_FFTInv_CCSToR_S32_preTwiddleRadix2_unsafe_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 7485 +@// Last Modified Date: Fri, 21 Sep 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute the "preTwiddleRadix2" stage prior to the call to the complexFFT +@// It does a Z(k) = Feven(k) + jW^(-k) FOdd(k); k=0,1,2,...N/2-1 computation +@// It implements both "scaled"(by 1/2) and "unsclaed" versions of the above formula +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + @// Guarding implementation by the processor name + + + +@//Input Registers + +#define pSrc r0 +#define pDst r1 +#define pFFTSpec r2 +#define scale r3 + + +@// Output registers +#define result r0 + +@//Local Scratch Registers + +#define argTwiddle r1 +#define argDst r2 +#define argScale r4 +#define tmpOrder r4 +#define pTwiddle r4 +#define pOut r5 +#define subFFTSize r7 +#define subFFTNum r6 +#define N r6 +#define order r14 +#define diff r9 +#define count r8 @// Total num of radix stages required to comple the FFT +#define x0r r4 +#define x0i r5 +#define diffMinusOne r2 +#define round r3 + +#define pOut1 r2 +#define size r7 +#define step r8 +#define step1 r9 +#define twStep r10 +#define pTwiddleTmp r11 +#define argTwiddle1 r12 +#define zero r14 + +@// Neon registers + +#define dX0 D0.S32 +#define dShift D1.S32 +#define dX1 D1.S32 +#define dY0 D2.S32 +#define dY1 D3.S32 +#define dX0r D0.S32 +#define dX0i D1.S32 +#define dX1r D2.S32 +#define dX1i D3.S32 +#define dW0r D4.S32 +#define dW0i D5.S32 +#define dW1r D6.S32 +#define dW1i D7.S32 +#define dT0 D8.S32 +#define dT1 D9.S32 +#define dT2 D10.S32 +#define dT3 D11.S32 +#define qT0 Q6.S64 +#define qT1 Q7.S64 +#define qT2 Q8.S64 +#define qT3 Q9.S64 +#define dY0r D4.S32 +#define dY0i D5.S32 +#define dY1r D6.S32 +#define dY1i D7.S32 + +#define dY2 D4.S32 +#define dY3 D5.S32 +#define dW0 D6.S32 +#define dW1 D7.S32 +#define dW0Tmp D10.S32 +#define dW1Neg D11.S32 + + +@ Structure offsets for the FFTSpec + .set ARMsFFTSpec_N, 0 + .set ARMsFFTSpec_pBitRev, 4 + .set ARMsFFTSpec_pTwiddle, 8 + .set ARMsFFTSpec_pBuf, 12 + + + .MACRO FFTSTAGE scaled, inverse, name + + @// Read the size from structure and take log + LDR N, [pFFTSpec, #ARMsFFTSpec_N] + + @// Read other structure parameters + LDR pTwiddle, [pFFTSpec, #ARMsFFTSpec_pTwiddle] + LDR pOut, [pFFTSpec, #ARMsFFTSpec_pBuf] + + + + MOV size,N,ASR #1 @// preserve the contents of N + MOV step,N,LSL #2 @// step = N/2 * 8 bytes + + + @// Z(k) = 1/2 {[F(k) + F'(N/2-k)] +j*W^(-k) [F(k) - F'(N/2-k)]} + @// Note: W^(k) is stored as negated value and also need to conjugate the values from the table + + @// Z(0) : no need of twiddle multiply + @// Z(0) = 1/2 { [F(0) + F'(N/2)] +j [F(0) - F'(N/2)] } + + VLD1 dX0,[pSrc],step + ADD pOut1,pOut,step @// pOut1 = pOut+ N/2*8 bytes + + VLD1 dX1,[pSrc]! + SUB twStep,step,size,LSL #1 @// twStep = 3N/8 * 8 bytes pointing to W^1 + + MOV step1,size,LSL #2 @// step1 = N/4 * 8 = N/2*4 bytes + SUB step1,step1,#8 @// (N/4-1)*8 bytes + + VHADD dY0,dX0,dX1 @// [b+d | a+c] + VHSUB dY1,dX0,dX1 @// [b-d | a-c] + VZIP dY0,dY1 @// dY0= [a-c | a+c] ;dY1= [b-d | b+d] + + .ifeqs "\scaled", "TRUE" + VHSUB dX0,dY0,dY1 + SUBS size,size,#2 + VHADD dX1,dY0,dY1 + .else + VSUB dX0,dY0,dY1 + SUBS size,size,#2 + VADD dX1,dY0,dY1 + .endif + + SUB pSrc,pSrc,step + + VST1 dX0[0],[pOut1]! + ADD pTwiddleTmp,pTwiddle,#8 @// W^2 + VST1 dX1[1],[pOut1]! + ADD argTwiddle1,pTwiddle,twStep @// W^1 + + + BLT decrementScale\name + BEQ lastElement\name + + + @// Z(k) = 1/2[F(k) + F'(N/2-k)] +j*W^(-k) [F(k) - F'(N/2-k)] + @// Note: W^k is stored as negative values in the table and also need to conjugate the values from the table + @// Process 4 elements at a time. E.g: Z(1),Z(2) and Z(N/2-2),Z(N/2-1) since both of them + @// require F(1),F(2) and F(N/2-2),F(N/2-1) + + + SUB step,step,#24 +evenOddButterflyLoop\name : + + + VLD1 dW0r,[argTwiddle1],step1 + VLD1 dW1r,[argTwiddle1]! + + VLD2 {dX0r,dX0i},[pSrc],step + SUB argTwiddle1,argTwiddle1,step1 + VLD2 {dX1r,dX1i},[pSrc]! + + SUB step1,step1,#8 @// (N/4-2)*8 bytes + VLD1 dW0i,[pTwiddleTmp],step1 + VLD1 dW1i,[pTwiddleTmp]! + SUB pSrc,pSrc,step + + SUB pTwiddleTmp,pTwiddleTmp,step1 + VREV64 dX1r,dX1r + VREV64 dX1i,dX1i + SUBS size,size,#4 + + + VHSUB dT2,dX0r,dX1r @// a-c + VHADD dT3,dX0i,dX1i @// b+d + SUB step1,step1,#8 + VHADD dT0,dX0r,dX1r @// a+c + VHSUB dT1,dX0i,dX1i @// b-d + + VZIP dW1r,dW1i + VZIP dW0r,dW0i + + + VMULL qT0,dW1r,dT2 + VMLSL qT0,dW1i,dT3 + VMULL qT1,dW1r,dT3 + VMLAL qT1,dW1i,dT2 + + VMULL qT2,dW0r,dT2 + VMLAL qT2,dW0i,dT3 + VMULL qT3,dW0r,dT3 + VMLSL qT3,dW0i,dT2 + + + VRSHRN dX1r,qT0,#31 + VRSHRN dX1i,qT1,#31 + + .ifeqs "\scaled", "TRUE" + VHADD dY1r,dT0,dX1i @// F(N/2 -1) + VHSUB dY1i,dX1r,dT1 + .else + VADD dY1r,dT0,dX1i @// F(N/2 -1) + VSUB dY1i,dX1r,dT1 + + .endif + + + VREV64 dY1r,dY1r + VREV64 dY1i,dY1i + + + VRSHRN dX0r,qT2,#31 + VRSHRN dX0i,qT3,#31 + + .ifeqs "\scaled", "TRUE" + VHADD dY0r,dT0,dX0i @// F(1) + VHSUB dY0i,dT1,dX0r + .else + VADD dY0r,dT0,dX0i @// F(1) + VSUB dY0i,dT1,dX0r + .endif + + + VST2 {dY0r,dY0i},[pOut1],step + VST2 {dY1r,dY1i},[pOut1]! + SUB pOut1,pOut1,step + SUB step,step,#32 @// (N/2-4)*8 bytes + + + BGT evenOddButterflyLoop\name + + + SUB pSrc,pSrc,#8 @// set both the ptrs to the last element + SUB pOut1,pOut1,#8 + + @// Last element can be expanded as follows + @// 1/2[Z(k) + Z'(k)] - j w^-k [Z(k) - Z'(k)] (since W^k is stored as -ve) + @// 1/2[(a+jb) + (a-jb)] - j w^-k [(a+jb) - (a-jb)] + @// 1/2[2a+j0] - j (c-jd) [0+j2b] + @// (a+bc, -bd) + @// Since (c,d) = (0,1) for the last element, result is just (a,-b) + +lastElement\name : + VLD1 dX0r,[pSrc] + + .ifeqs "\scaled", "TRUE" + VSHR dX0r,dX0r,#1 + .endif + + VST1 dX0r[0],[pOut1]! + VNEG dX0r,dX0r + VST1 dX0r[1],[pOut1] + + + +decrementScale\name : + + .ifeqs "\scaled", "TRUE" + SUB scale,scale,#1 + .endif + + .endm + + M_START armSP_FFTInv_CCSToR_S32_preTwiddleRadix2_unsafe,r4 + + FFTSTAGE "FALSE","TRUE",Inv + M_END + + M_START armSP_FFTInv_CCSToR_S32_Sfs_preTwiddleRadix2_unsafe,r4 + + FFTSTAGE "TRUE","TRUE",InvSfs + M_END + + + .end diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix2_fs_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix2_fs_unsafe_s.S new file mode 100644 index 0000000000..323eb8319d --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix2_fs_unsafe_s.S @@ -0,0 +1,134 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This is a modification of armSP_FFT_CToC_SC32_Radix2_fs_unsafe_s.S +@// to support float instead of SC32. +@// + +@// +@// Description: +@// Compute the first stage of a Radix 2 DIT in-order out-of-place FFT +@// stage for a N point complex signal. +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + +@// Guarding implementation by the processor name + + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define pPingPongBuf r5 +#define subFFTNum r6 +#define subFFTSize r7 + + +@//Output Registers + + +@//Local Scratch Registers + +#define pointStep r3 +#define outPointStep r3 +#define grpSize r4 +#define setCount r4 +#define step r8 +#define dstStep r8 + +@// Neon Registers + +#define dX0 D0.F32 +#define dX1 D1.F32 +#define dY0 D2.F32 +#define dY1 D3.F32 + + + .MACRO FFTSTAGE scaled, inverse, name + + @// Define stack arguments + + + @// update subFFTSize and subFFTNum into RN6 and RN7 for the next stage + + + MOV subFFTSize,#2 + LSR grpSize,subFFTNum,#1 + MOV subFFTNum,grpSize + + + @// pT0+1 increments pT0 by 8 bytes + @// pT0+pointStep = increment of 8*pointStep bytes = 4*grpSize bytes + @// Note: outPointStep = pointStep for firststage + @// Note: setCount = grpSize/2 (reuse the updated grpSize for setCount) + + MOV pointStep,grpSize,LSL #3 + RSB step,pointStep,#8 + + + @// Loop on the sets for grp zero + +grpZeroSetLoop\name : + + VLD1 dX0,[pSrc],pointStep + VLD1 dX1,[pSrc],step @// step = -pointStep + 8 + SUBS setCount,setCount,#1 + + VADD dY0,dX0,dX1 + VSUB dY1,dX0,dX1 + + VST1 dY0,[pDst],outPointStep + @// dstStep = step = -pointStep + 8 + VST1 dY1,[pDst],dstStep + + BGT grpZeroSetLoop\name + + + @// reset pSrc to pDst for the next stage + SUB pSrc,pDst,pointStep @// pDst -= 2*grpSize + MOV pDst,pPingPongBuf + + .endm + + + + M_START armSP_FFTFwd_CToC_FC32_Radix2_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",fwd + M_END + + + + M_START armSP_FFTInv_CToC_FC32_Radix2_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",inv + M_END + + .end diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix2_ls_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix2_ls_unsafe_s.S new file mode 100644 index 0000000000..a61b86096b --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix2_ls_unsafe_s.S @@ -0,0 +1,153 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This is a modification of armSP_FFT_CToC_SC32_Radix2_ls_unsafe_s.S +@// to support float instead of SC32. +@// + +@// +@// Description: +@// Compute the last stage of a Radix 2 DIT in-order out-of-place FFT +@// stage for a N point complex signal. +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + +@// Guarding implementation by the processor name + + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define subFFTNum r6 +#define subFFTSize r7 + + +@//Output Registers + + +@//Local Scratch Registers + + +#define outPointStep r3 +#define grpCount r4 +#define dstStep r5 +#define pTmp r4 + +@// Neon Registers + +#define dWr d0.f32 +#define dWi d1.f32 +#define dXr0 d2.f32 +#define dXi0 d3.f32 +#define dXr1 d4.f32 +#define dXi1 d5.f32 +#define dYr0 d6.f32 +#define dYi0 d7.f32 +#define dYr1 d8.f32 +#define dYi1 d9.f32 +#define qT0 d10.f32 +#define qT1 d12.f32 + + .MACRO FFTSTAGE scaled, inverse, name + + + MOV outPointStep,subFFTSize,LSL #3 + @// Update grpCount and grpSize rightaway + + MOV subFFTNum,#1 @//after the last stage + LSL grpCount,subFFTSize,#1 + + @// update subFFTSize for the next stage + MOV subFFTSize,grpCount + + RSB dstStep,outPointStep,#16 + + + @// Loop on 2 grps at a time for the last stage + +radix2lsGrpLoop\name : + @ dWr = [pTwiddle[0].Re, pTwiddle[1].Re] + @ dWi = [pTwiddle[0].Im, pTwiddle[1].Im] + VLD2 {dWr,dWi},[pTwiddle, :64]! + + @ dXr0 = [pSrc[0].Re, pSrc[2].Re] + @ dXi0 = [pSrc[0].Im, pSrc[2].Im] + @ dXr1 = [pSrc[1].Re, pSrc[3].Re] + @ dXi1 = [pSrc[1].Im, pSrc[3].Im] + VLD4 {dXr0,dXi0,dXr1,dXi1},[pSrc, :128]! + SUBS grpCount,grpCount,#4 @// grpCount is multiplied by 2 + + .ifeqs "\inverse", "TRUE" + VMUL qT0,dWr,dXr1 + VMLA qT0,dWi,dXi1 @// real part + VMUL qT1,dWr,dXi1 + VMLS qT1,dWi,dXr1 @// imag part + + .else + + VMUL qT0,dWr,dXr1 + VMLS qT0,dWi,dXi1 @// real part + VMUL qT1,dWr,dXi1 + VMLA qT1,dWi,dXr1 @// imag part + + .endif + + VSUB dYr0,dXr0,qT0 + VSUB dYi0,dXi0,qT1 + VADD dYr1,dXr0,qT0 + VADD dYi1,dXi0,qT1 + + VST2 {dYr0,dYi0},[pDst],outPointStep + VST2 {dYr1,dYi1},[pDst],dstStep @// dstStep = step = -outPointStep + 16 + + BGT radix2lsGrpLoop\name + + + @// Reset and Swap pSrc and pDst for the next stage + MOV pTmp,pDst + SUB pDst,pSrc,outPointStep,LSL #1 @// pDst -= 4*size; pSrc -= 8*size bytes + SUB pSrc,pTmp,outPointStep + + @// Reset pTwiddle for the next stage + SUB pTwiddle,pTwiddle,outPointStep @// pTwiddle -= 4*size bytes + + .endm + + + + M_START armSP_FFTFwd_CToC_FC32_Radix2_ls_OutOfPlace_unsafe,r4,"" + FFTSTAGE "FALSE","FALSE",fwd + M_END + + + + M_START armSP_FFTInv_CToC_FC32_Radix2_ls_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",inv + M_END + + .end diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix2_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix2_unsafe_s.S new file mode 100644 index 0000000000..73c1f4b82f --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix2_unsafe_s.S @@ -0,0 +1,191 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This is a modification of armSP_FFT_CToC_SC32_Radix2_unsafe_s.s +@// to support float instead of SC32. +@// + +@// Description: +@// Compute a Radix 2 DIT in-order out-of-place FFT stage for an N point +@// complex signal. This handles the general stage, not the first or last +@// stage. +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + +@// Guarding implementation by the processor name + + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define subFFTNum r6 +#define subFFTSize r7 + + +@//Output Registers + + +@//Local Scratch Registers + +#define outPointStep r3 +#define pointStep r4 +#define grpCount r5 +#define setCount r8 +@//const RN 9 +#define step r10 +#define dstStep r11 +#define pTable r9 +#define pTmp r9 + +@// Neon Registers + +#define dW D0.F32 +#define dX0 D2.F32 +#define dX1 D3.F32 +#define dX2 D4.F32 +#define dX3 D5.F32 +#define dY0 D6.F32 +#define dY1 D7.F32 +#define dY2 D8.F32 +#define dY3 D9.F32 +#define qT0 D10.F32 +#define qT1 D11.F32 + + + .MACRO FFTSTAGE scaled, inverse, name + + @// Define stack arguments + + + @// Update grpCount and grpSize rightaway inorder to reuse pGrpCount + @// and pGrpSize regs + + LSR subFFTNum,subFFTNum,#1 @//grpSize + LSL grpCount,subFFTSize,#1 + + + @// pT0+1 increments pT0 by 8 bytes + @// pT0+pointStep = increment of 8*pointStep bytes = 4*grpSize bytes + MOV pointStep,subFFTNum,LSL #2 + + @// update subFFTSize for the next stage + MOV subFFTSize,grpCount + + @// pOut0+1 increments pOut0 by 8 bytes + @// pOut0+outPointStep == increment of 8*outPointStep bytes = + @// 4*size bytes + SMULBB outPointStep,grpCount,pointStep + LSL pointStep,pointStep,#1 + + + RSB step,pointStep,#16 + RSB dstStep,outPointStep,#16 + + @// Loop on the groups + +radix2GrpLoop\name : + MOV setCount,pointStep,LSR #3 + VLD1 dW,[pTwiddle],pointStep @//[wi | wr] + + + @// Loop on the sets + + +radix2SetLoop\name : + + + @// point0: dX0-real part dX1-img part + VLD2 {dX0,dX1},[pSrc],pointStep + @// point1: dX2-real part dX3-img part + VLD2 {dX2,dX3},[pSrc],step + + SUBS setCount,setCount,#2 + + .ifeqs "\inverse", "TRUE" + VMUL qT0,dX2,dW[0] + VMLA qT0,dX3,dW[1] @// real part + VMUL qT1,dX3,dW[0] + VMLS qT1,dX2,dW[1] @// imag part + + .else + + VMUL qT0,dX2,dW[0] + VMLS qT0,dX3,dW[1] @// real part + VMUL qT1,dX3,dW[0] + VMLA qT1,dX2,dW[1] @// imag part + + .endif + + VSUB dY0,dX0,qT0 + VSUB dY1,dX1,qT1 + VADD dY2,dX0,qT0 + VADD dY3,dX1,qT1 + + VST2 {dY0,dY1},[pDst],outPointStep + @// dstStep = -outPointStep + 16 + VST2 {dY2,dY3},[pDst],dstStep + + BGT radix2SetLoop\name + + SUBS grpCount,grpCount,#2 + ADD pSrc,pSrc,pointStep + BGT radix2GrpLoop\name + + + @// Reset and Swap pSrc and pDst for the next stage + MOV pTmp,pDst + @// pDst -= 4*size; pSrc -= 8*size bytes + SUB pDst,pSrc,outPointStep,LSL #1 + SUB pSrc,pTmp,outPointStep + + @// Reset pTwiddle for the next stage + @// pTwiddle -= 4*size bytes + SUB pTwiddle,pTwiddle,outPointStep + + + .endm + + + + M_START armSP_FFTFwd_CToC_FC32_Radix2_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",FWD + M_END + + + + M_START armSP_FFTInv_CToC_FC32_Radix2_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",INV + M_END + + + .end diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_fs_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_fs_unsafe_s.S new file mode 100644 index 0000000000..a65ff82348 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_fs_unsafe_s.S @@ -0,0 +1,251 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// +@// This is a modification of armSP_FFT_CToC_SC32_Radix4_fs_unsafe_s.s +@// to support float instead of SC32. +@// + +@// +@// Description: +@// Compute a first stage Radix 4 FFT stage for a N point complex signal +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + +@// Import symbols required from other files +@// (For example tables) + + + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + +@// Guarding implementation by the processor name + + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define pPingPongBuf r5 +#define subFFTNum r6 +#define subFFTSize r7 + + +@//Output Registers + + +@//Local Scratch Registers + +#define grpSize r3 +@// Reuse grpSize as setCount +#define setCount r3 +#define pointStep r4 +#define outPointStep r4 +#define setStep r8 +#define step1 r9 +#define step3 r10 + +@// Neon Registers + +#define dXr0 D0.F32 +#define dXi0 D1.F32 +#define dXr1 D2.F32 +#define dXi1 D3.F32 +#define dXr2 D4.F32 +#define dXi2 D5.F32 +#define dXr3 D6.F32 +#define dXi3 D7.F32 +#define dYr0 D8.F32 +#define dYi0 D9.F32 +#define dYr1 D10.F32 +#define dYi1 D11.F32 +#define dYr2 D12.F32 +#define dYi2 D13.F32 +#define dYr3 D14.F32 +#define dYi3 D15.F32 +#define qX0 Q0.F32 +#define qX1 Q1.F32 +#define qX2 Q2.F32 +#define qX3 Q3.F32 +#define qY0 Q4.F32 +#define qY1 Q5.F32 +#define qY2 Q6.F32 +#define qY3 Q7.F32 +#define dZr0 D16.F32 +#define dZi0 D17.F32 +#define dZr1 D18.F32 +#define dZi1 D19.F32 +#define dZr2 D20.F32 +#define dZi2 D21.F32 +#define dZr3 D22.F32 +#define dZi3 D23.F32 +#define qZ0 Q8.F32 +#define qZ1 Q9.F32 +#define qZ2 Q10.F32 +#define qZ3 Q11.F32 + + + .MACRO FFTSTAGE scaled, inverse, name + + @// Define stack arguments + + @// pT0+1 increments pT0 by 8 bytes + @// pT0+pointStep = increment of 8*pointStep bytes = 2*grpSize bytes + @// Note: outPointStep = pointStep for firststage + + MOV pointStep,subFFTNum,LSL #1 + + + @// Update pSubFFTSize and pSubFFTNum regs + VLD2 {dXr0,dXi0},[pSrc, :128],pointStep @// data[0] + @// subFFTSize = 1 for the first stage + MOV subFFTSize,#4 + + @// Note: setCount = subFFTNum/4 (reuse the grpSize reg for setCount) + LSR grpSize,subFFTNum,#2 + VLD2 {dXr1,dXi1},[pSrc, :128],pointStep @// data[1] + MOV subFFTNum,grpSize + + + @// Calculate the step of input data for the next set + @//MOV setStep,pointStep,LSL #1 + MOV setStep,grpSize,LSL #4 + VLD2 {dXr2,dXi2},[pSrc, :128],pointStep @// data[2] + @// setStep = 3*pointStep + ADD setStep,setStep,pointStep + @// setStep = - 3*pointStep+16 + RSB setStep,setStep,#16 + + @// data[3] & update pSrc for the next set + VLD2 {dXr3,dXi3},[pSrc, :128],setStep + @// step1 = 2*pointStep + MOV step1,pointStep,LSL #1 + + VADD qY0,qX0,qX2 + + @// step3 = -pointStep + RSB step3,pointStep,#0 + + @// grp = 0 a special case since all the twiddle factors are 1 + @// Loop on the sets : 2 sets at a time + +radix4fsGrpZeroSetLoop\name : + + + + @// Decrement setcount + SUBS setCount,setCount,#2 + + + @// finish first stage of 4 point FFT + + + VSUB qY2,qX0,qX2 + + VLD2 {dXr0,dXi0},[pSrc, :128],step1 @// data[0] + VADD qY1,qX1,qX3 + VLD2 {dXr2,dXi2},[pSrc, :128],step3 @// data[2] + VSUB qY3,qX1,qX3 + + + @// finish second stage of 4 point FFT + + .ifeqs "\inverse", "TRUE" + + VLD2 {dXr1,dXi1},[pSrc, :128],step1 @// data[1] + VADD qZ0,qY0,qY1 + + @// data[3] & update pSrc for the next set, but not if it's the + @// last iteration so that we don't read past the end of the + @// input array. + BEQ radix4SkipLastUpdateInv\name + VLD2 {dXr3,dXi3},[pSrc, :128],setStep +radix4SkipLastUpdateInv\name: + VSUB dZr3,dYr2,dYi3 + + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VADD dZi3,dYi2,dYr3 + + VSUB qZ1,qY0,qY1 + VST2 {dZr3,dZi3},[pDst, :128],outPointStep + + VADD dZr2,dYr2,dYi3 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + VSUB dZi2,dYi2,dYr3 + + VADD qY0,qX0,qX2 @// u0 for next iteration + VST2 {dZr2,dZi2},[pDst, :128],setStep + + + .else + + VLD2 {dXr1,dXi1},[pSrc, :128],step1 @// data[1] + VADD qZ0,qY0,qY1 + + @// data[3] & update pSrc for the next set, but not if it's the + @// last iteration so that we don't read past the end of the + @// input array. + BEQ radix4SkipLastUpdateFwd\name + VLD2 {dXr3,dXi3},[pSrc, :128],setStep +radix4SkipLastUpdateFwd\name: + VADD dZr2,dYr2,dYi3 + + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VSUB dZi2,dYi2,dYr3 + + VSUB qZ1,qY0,qY1 + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + + VSUB dZr3,dYr2,dYi3 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + VADD dZi3,dYi2,dYr3 + + VADD qY0,qX0,qX2 @// u0 for next iteration + VST2 {dZr3,dZi3},[pDst, :128],setStep + + .endif + + BGT radix4fsGrpZeroSetLoop\name + + @// reset pSrc to pDst for the next stage + SUB pSrc,pDst,pointStep @// pDst -= 2*grpSize + MOV pDst,pPingPongBuf + + + .endm + + + + M_START armSP_FFTFwd_CToC_FC32_Radix4_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",fwd + M_END + + + + M_START armSP_FFTInv_CToC_FC32_Radix4_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",inv + M_END + + + .end diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_ls_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_ls_unsafe_s.S new file mode 100644 index 0000000000..29a1b6981e --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_ls_unsafe_s.S @@ -0,0 +1,339 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This is a modification of armSP_FFT_CToC_SC32_Radix4_ls_unsafe_s.s +@// to support float instead of SC32. +@// + +@// +@// Description: +@// Compute a Radix 4 FFT stage for a N point complex signal +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + +@// Import symbols required from other files +@// (For example tables) + + + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + +@// Guarding implementation by the processor name + + +@// Import symbols required from other files +@// (For example tables) + @//IMPORT armAAC_constTable + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define subFFTNum r6 +#define subFFTSize r7 + + + +@//Output Registers + + +@//Local Scratch Registers + +#define outPointStep r3 +#define grpCount r4 +#define dstStep r5 +#define grpTwStep r8 +#define stepTwiddle r9 +#define twStep r10 +#define pTmp r4 +#define step16 r11 +#define step24 r12 + + +@// Neon Registers + +#define dButterfly1Real02 D0.F32 +#define dButterfly1Imag02 D1.F32 +#define dButterfly1Real13 D2.F32 +#define dButterfly1Imag13 D3.F32 +#define dButterfly2Real02 D4.F32 +#define dButterfly2Imag02 D5.F32 +#define dButterfly2Real13 D6.F32 +#define dButterfly2Imag13 D7.F32 +#define dXr0 D0.F32 +#define dXi0 D1.F32 +#define dXr1 D2.F32 +#define dXi1 D3.F32 +#define dXr2 D4.F32 +#define dXi2 D5.F32 +#define dXr3 D6.F32 +#define dXi3 D7.F32 + +#define dYr0 D16.F32 +#define dYi0 D17.F32 +#define dYr1 D18.F32 +#define dYi1 D19.F32 +#define dYr2 D20.F32 +#define dYi2 D21.F32 +#define dYr3 D22.F32 +#define dYi3 D23.F32 + +#define dW1r D8.F32 +#define dW1i D9.F32 +#define dW2r D10.F32 +#define dW2i D11.F32 +#define dW3r D12.F32 +#define dW3i D13.F32 +#define qT0 d14.f32 +#define qT1 d16.F32 +#define qT2 d18.F32 +#define qT3 d20.f32 +#define qT4 d22.f32 +#define qT5 d24.f32 + +#define dZr0 D14.F32 +#define dZi0 D15.F32 +#define dZr1 D26.F32 +#define dZi1 D27.F32 +#define dZr2 D28.F32 +#define dZi2 D29.F32 +#define dZr3 D30.F32 +#define dZi3 D31.F32 + +#define qX0 Q0.F32 +#define qY0 Q8.F32 +#define qY1 Q9.F32 +#define qY2 Q10.F32 +#define qY3 Q11.F32 +#define qZ0 Q7.F32 +#define qZ1 Q13.F32 +#define qZ2 Q14.F32 +#define qZ3 Q15.F32 + + + + .MACRO FFTSTAGE scaled, inverse , name + + @// Define stack arguments + + + @// pOut0+1 increments pOut0 by 8 bytes + @// pOut0+outPointStep == increment of 8*outPointStep bytes + MOV outPointStep,subFFTSize,LSL #3 + + @// Update grpCount and grpSize rightaway + + VLD2 {dW1r,dW1i},[pTwiddle, :128] @// [wi|wr] + MOV step16,#16 + LSL grpCount,subFFTSize,#2 + + VLD1 dW2r,[pTwiddle, :64] @// [wi|wr] + MOV subFFTNum,#1 @//after the last stage + + VLD1 dW3r,[pTwiddle, :64],step16 @// [wi|wr] + MOV stepTwiddle,#0 + + VLD1 dW2i,[pTwiddle, :64]! @// [wi|wr] + SUB grpTwStep,stepTwiddle,#8 @// grpTwStep = -8 to start with + + @// update subFFTSize for the next stage + MOV subFFTSize,grpCount + VLD1 dW3i,[pTwiddle, :64],grpTwStep @// [wi|wr] + MOV dstStep,outPointStep,LSL #1 + + @// AC.r AC.i BD.r BD.i + VLD4 {dButterfly1Real02,dButterfly1Imag02,dButterfly1Real13,dButterfly1Imag13},[pSrc, :256]! + ADD dstStep,dstStep,outPointStep @// dstStep = 3*outPointStep + RSB dstStep,dstStep,#16 @// dstStep = - 3*outPointStep+16 + MOV step24,#24 + + @// AC.r AC.i BD.r BD.i + VLD4 {dButterfly2Real02,dButterfly2Imag02,dButterfly2Real13,dButterfly2Imag13},[pSrc, :256]! + + + @// Process two groups at a time + +radix4lsGrpLoop\name : + + VZIP dW2r,dW2i + ADD stepTwiddle,stepTwiddle,#16 + VZIP dW3r,dW3i + ADD grpTwStep,stepTwiddle,#4 + VUZP dButterfly1Real13, dButterfly2Real13 @// B.r D.r + SUB twStep,stepTwiddle,#16 @// -16+stepTwiddle + VUZP dButterfly1Imag13, dButterfly2Imag13 @// B.i D.i + MOV grpTwStep,grpTwStep,LSL #1 + VUZP dButterfly1Real02, dButterfly2Real02 @// A.r C.r + RSB grpTwStep,grpTwStep,#0 @// -8-2*stepTwiddle + + + VUZP dButterfly1Imag02, dButterfly2Imag02 @// A.i C.i + + + @// grpCount is multiplied by 4 + SUBS grpCount,grpCount,#8 + + .ifeqs "\inverse", "TRUE" + VMUL dZr1,dW1r,dXr1 + VMLA dZr1,dW1i,dXi1 @// real part + VMUL dZi1,dW1r,dXi1 + VMLS dZi1,dW1i,dXr1 @// imag part + + .else + + VMUL dZr1,dW1r,dXr1 + VMLS dZr1,dW1i,dXi1 @// real part + VMUL dZi1,dW1r,dXi1 + VMLA dZi1,dW1i,dXr1 @// imag part + + .endif + + VLD2 {dW1r,dW1i},[pTwiddle, :128],stepTwiddle @// [wi|wr] + + .ifeqs "\inverse", "TRUE" + VMUL dZr2,dW2r,dXr2 + VMLA dZr2,dW2i,dXi2 @// real part + VMUL dZi2,dW2r,dXi2 + VLD1 dW2r,[pTwiddle, :64],step16 @// [wi|wr] + VMLS dZi2,dW2i,dXr2 @// imag part + + .else + + VMUL dZr2,dW2r,dXr2 + VMLS dZr2,dW2i,dXi2 @// real part + VMUL dZi2,dW2r,dXi2 + VLD1 dW2r,[pTwiddle, :64],step16 @// [wi|wr] + VMLA dZi2,dW2i,dXr2 @// imag part + + .endif + + + VLD1 dW2i,[pTwiddle, :64],twStep @// [wi|wr] + + @// move qX0 so as to load for the next iteration + VMOV qZ0,qX0 + + .ifeqs "\inverse", "TRUE" + VMUL dZr3,dW3r,dXr3 + VMLA dZr3,dW3i,dXi3 @// real part + VMUL dZi3,dW3r,dXi3 + VLD1 dW3r,[pTwiddle, :64],step24 + VMLS dZi3,dW3i,dXr3 @// imag part + + .else + + VMUL dZr3,dW3r,dXr3 + VMLS dZr3,dW3i,dXi3 @// real part + VMUL dZi3,dW3r,dXi3 + VLD1 dW3r,[pTwiddle, :64],step24 + VMLA dZi3,dW3i,dXr3 @// imag part + + .endif + + VLD1 dW3i,[pTwiddle, :64],grpTwStep @// [wi|wr] + + @// Don't do the load on the last iteration so we don't read past the end + @// of pSrc. + addeq pSrc, pSrc, #64 + beq radix4lsSkipRead\name + @// AC.r AC.i BD.r BD.i + VLD4 {dButterfly1Real02,dButterfly1Imag02,dButterfly1Real13,dButterfly1Imag13},[pSrc, :256]! + + @// AC.r AC.i BD.r BD.i + VLD4 {dButterfly2Real02,dButterfly2Imag02,dButterfly2Real13,dButterfly2Imag13},[pSrc, :256]! +radix4lsSkipRead\name: + + @// finish first stage of 4 point FFT + + VADD qY0,qZ0,qZ2 + VSUB qY2,qZ0,qZ2 + VADD qY1,qZ1,qZ3 + VSUB qY3,qZ1,qZ3 + + + @// finish second stage of 4 point FFT + + .ifeqs "\inverse", "TRUE" + + VSUB qZ0,qY2,qY1 + + VADD dZr3,dYr0,dYi3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VSUB dZi3,dYi0,dYr3 + + VADD qZ2,qY2,qY1 + VST2 {dZr3,dZi3},[pDst, :128],outPointStep + + VSUB dZr1,dYr0,dYi3 + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + VADD dZi1,dYi0,dYr3 + + @// dstStep = -outPointStep + 16 + VST2 {dZr1,dZi1},[pDst, :128],dstStep + + + .else + + VSUB qZ0,qY2,qY1 + + VSUB dZr1,dYr0,dYi3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VADD dZi1,dYi0,dYr3 + + VADD qZ2,qY2,qY1 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + + VADD dZr3,dYr0,dYi3 + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + VSUB dZi3,dYi0,dYr3 + + @// dstStep = -outPointStep + 16 + VST2 {dZr3,dZi3},[pDst, :128],dstStep + + + .endif + + BGT radix4lsGrpLoop\name + + + @// Reset and Swap pSrc and pDst for the next stage + MOV pTmp,pDst + @// Extra increment done in final iteration of the loop + SUB pSrc,pSrc,#64 + @// pDst -= 4*size; pSrc -= 8*size bytes + SUB pDst,pSrc,outPointStep,LSL #2 + SUB pSrc,pTmp,outPointStep + SUB pTwiddle,pTwiddle,subFFTSize,LSL #1 + @// Extra increment done in final iteration of the loop + SUB pTwiddle,pTwiddle,#16 + + .endm + + + M_START armSP_FFTFwd_CToC_FC32_Radix4_ls_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",fwd + M_END + + + M_START armSP_FFTInv_CToC_FC32_Radix4_ls_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",inv + M_END + + + .end diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_unsafe_s.S new file mode 100644 index 0000000000..cbb8f25608 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix4_unsafe_s.S @@ -0,0 +1,331 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// +@// This is a modification of armSP_FFT_CToC_SC32_Radix4_unsafe_s.s +@// to support float instead of SC32. +@// + +@// +@// Description: +@// Compute a Radix 4 FFT stage for a N point complex signal +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + +@// Guarding implementation by the processor name + + +@// Import symbols required from other files +@// (For example tables) + + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define subFFTNum r6 +#define subFFTSize r7 + + + +@//Output Registers + + +@//Local Scratch Registers + +#define grpCount r3 +#define pointStep r4 +#define outPointStep r5 +#define stepTwiddle r12 +#define setCount r14 +#define srcStep r8 +#define setStep r9 +#define dstStep r10 +#define twStep r11 +#define t1 r3 + +@// Neon Registers + +#define dW1 D0.F32 +#define dW2 D1.F32 +#define dW3 D2.F32 + +#define dXr0 D4.F32 +#define dXi0 D5.F32 +#define dXr1 D6.F32 +#define dXi1 D7.F32 +#define dXr2 D8.F32 +#define dXi2 D9.F32 +#define dXr3 D10.F32 +#define dXi3 D11.F32 +#define dYr0 D12.F32 +#define dYi0 D13.F32 +#define dYr1 D14.F32 +#define dYi1 D15.F32 +#define dYr2 D16.F32 +#define dYi2 D17.F32 +#define dYr3 D18.F32 +#define dYi3 D19.F32 +#define qT0 d16.f32 +#define qT1 d18.f32 +#define qT2 d12.f32 +#define qT3 d14.f32 +#define dZr0 D20.F32 +#define dZi0 D21.F32 +#define dZr1 D22.F32 +#define dZi1 D23.F32 +#define dZr2 D24.F32 +#define dZi2 D25.F32 +#define dZr3 D26.F32 +#define dZi3 D27.F32 + +#define qY0 Q6.F32 +#define qY1 Q7.F32 +#define qY2 Q8.F32 +#define qY3 Q9.F32 +#define qX0 Q2.F32 +#define qZ0 Q10.F32 +#define qZ1 Q11.F32 +#define qZ2 Q12.F32 +#define qZ3 Q13.F32 + + .MACRO FFTSTAGE scaled, inverse , name + + @// Define stack arguments + + + @// Update grpCount and grpSize rightaway inorder to reuse + @// pGrpCount and pGrpSize regs + + LSL grpCount,subFFTSize,#2 + LSR subFFTNum,subFFTNum,#2 + MOV subFFTSize,grpCount + + VLD1 dW1,[pTwiddle] @//[wi | wr] + @// pT0+1 increments pT0 by 8 bytes + @// pT0+pointStep = increment of 8*pointStep bytes = 2*grpSize bytes + MOV pointStep,subFFTNum,LSL #1 + + + @// pOut0+1 increments pOut0 by 8 bytes + @// pOut0+outPointStep == increment of 8*outPointStep bytes + @// = 2*size bytes + + MOV stepTwiddle,#0 + VLD1 dW2,[pTwiddle] @//[wi | wr] + SMULBB outPointStep,grpCount,pointStep + LSL pointStep,pointStep,#2 @// 2*grpSize + + VLD1 dW3,[pTwiddle] @//[wi | wr] + MOV srcStep,pointStep,LSL #1 @// srcStep = 2*pointStep + ADD setStep,srcStep,pointStep @// setStep = 3*pointStep + + RSB setStep,setStep,#0 @// setStep = - 3*pointStep + SUB srcStep,srcStep,#16 @// srcStep = 2*pointStep-16 + + MOV dstStep,outPointStep,LSL #1 + ADD dstStep,dstStep,outPointStep @// dstStep = 3*outPointStep + @// dstStep = - 3*outPointStep+16 + RSB dstStep,dstStep,#16 + + + +radix4GrpLoop\name : + + VLD2 {dXr0,dXi0},[pSrc],pointStep @// data[0] + ADD stepTwiddle,stepTwiddle,pointStep + VLD2 {dXr1,dXi1},[pSrc],pointStep @// data[1] + @// set pTwiddle to the first point + ADD pTwiddle,pTwiddle,stepTwiddle + VLD2 {dXr2,dXi2},[pSrc],pointStep @// data[2] + MOV twStep,stepTwiddle,LSL #2 + + @// data[3] & update pSrc for the next set + VLD2 {dXr3,dXi3},[pSrc],setStep + SUB twStep,stepTwiddle,twStep @// twStep = -3*stepTwiddle + + MOV setCount,pointStep,LSR #3 + @// set pSrc to data[0] of the next set + ADD pSrc,pSrc,#16 + @// increment to data[1] of the next set + ADD pSrc,pSrc,pointStep + + + @// Loop on the sets + +radix4SetLoop\name : + + + + .ifeqs "\inverse", "TRUE" + VMUL dZr1,dXr1,dW1[0] + VMUL dZi1,dXi1,dW1[0] + VMUL dZr2,dXr2,dW2[0] + VMUL dZi2,dXi2,dW2[0] + VMUL dZr3,dXr3,dW3[0] + VMUL dZi3,dXi3,dW3[0] + + VMLA dZr1,dXi1,dW1[1] @// real part + VMLS dZi1,dXr1,dW1[1] @// imag part + + @// data[1] for next iteration + VLD2 {dXr1,dXi1},[pSrc],pointStep + + VMLA dZr2,dXi2,dW2[1] @// real part + VMLS dZi2,dXr2,dW2[1] @// imag part + + @// data[2] for next iteration + VLD2 {dXr2,dXi2},[pSrc],pointStep + + VMLA dZr3,dXi3,dW3[1] @// real part + VMLS dZi3,dXr3,dW3[1] @// imag part + .else + VMUL dZr1,dXr1,dW1[0] + VMUL dZi1,dXi1,dW1[0] + VMUL dZr2,dXr2,dW2[0] + VMUL dZi2,dXi2,dW2[0] + VMUL dZr3,dXr3,dW3[0] + VMUL dZi3,dXi3,dW3[0] + + VMLS dZr1,dXi1,dW1[1] @// real part + VMLA dZi1,dXr1,dW1[1] @// imag part + + @// data[1] for next iteration + VLD2 {dXr1,dXi1},[pSrc],pointStep + + VMLS dZr2,dXi2,dW2[1] @// real part + VMLA dZi2,dXr2,dW2[1] @// imag part + + @// data[2] for next iteration + VLD2 {dXr2,dXi2},[pSrc],pointStep + + VMLS dZr3,dXi3,dW3[1] @// real part + VMLA dZi3,dXr3,dW3[1] @// imag part + .endif + + @// data[3] & update pSrc to data[0] + @// But don't read on the very last iteration because that reads past + @// the end of pSrc. The last iteration is grpCount = 4, setCount = 2. + cmp grpCount, #4 + cmpeq setCount, #2 @// Test setCount if grpCount = 4 + @// These are executed only if both grpCount = 4 and setCount = 2 + addeq pSrc, pSrc, setStep + beq radix4SkipRead\name + VLD2 {dXr3,dXi3},[pSrc],setStep +radix4SkipRead\name: + SUBS setCount,setCount,#2 + + @// finish first stage of 4 point FFT + VADD qY0,qX0,qZ2 + VSUB qY2,qX0,qZ2 + + @// data[0] for next iteration + VLD2 {dXr0,dXi0},[pSrc, :128]! + VADD qY1,qZ1,qZ3 + VSUB qY3,qZ1,qZ3 + + @// finish second stage of 4 point FFT + + VSUB qZ0,qY2,qY1 + + + .ifeqs "\inverse", "TRUE" + + VADD dZr3,dYr0,dYi3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VSUB dZi3,dYi0,dYr3 + + VADD qZ2,qY2,qY1 + VST2 {dZr3,dZi3},[pDst, :128],outPointStep + + VSUB dZr1,dYr0,dYi3 + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + VADD dZi1,dYi0,dYr3 + + VST2 {dZr1,dZi1},[pDst, :128],dstStep + + + .else + + VSUB dZr1,dYr0,dYi3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VADD dZi1,dYi0,dYr3 + + VADD qZ2,qY2,qY1 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + + VADD dZr3,dYr0,dYi3 + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + VSUB dZi3,dYi0,dYr3 + + VST2 {dZr3,dZi3},[pDst, :128],dstStep + + + .endif + + @// increment to data[1] of the next set + ADD pSrc,pSrc,pointStep + BGT radix4SetLoop\name + + + VLD1 dW1,[pTwiddle, :64],stepTwiddle @//[wi | wr] + @// subtract 4 since grpCount multiplied by 4 + SUBS grpCount,grpCount,#4 + VLD1 dW2,[pTwiddle, :64],stepTwiddle @//[wi | wr] + @// increment pSrc for the next grp + ADD pSrc,pSrc,srcStep + VLD1 dW3,[pTwiddle, :64],twStep @//[wi | wr] + BGT radix4GrpLoop\name + + + @// Reset and Swap pSrc and pDst for the next stage + MOV t1,pDst + @// pDst -= 2*size; pSrc -= 8*size bytes + SUB pDst,pSrc,outPointStep,LSL #2 + SUB pSrc,t1,outPointStep + + + .endm + + + M_START armSP_FFTFwd_CToC_FC32_Radix4_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",FWD + M_END + + + M_START armSP_FFTInv_CToC_FC32_Radix4_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",INV + M_END + + + .end diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix8_fs_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix8_fs_unsafe_s.S new file mode 100644 index 0000000000..68f53c3d0a --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_FC32_Radix8_fs_unsafe_s.S @@ -0,0 +1,422 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This is a modification of armSP_FFT_CToC_FC32_Radix8_fs_unsafe_s.s +@// to support float instead of SC32. +@// + +@// +@// Description: +@// Compute a first stage Radix 8 FFT stage for a N point complex signal +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + +@// Import symbols required from other files +@// (For example tables) + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + +@// Guarding implementation by the processor name + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define subFFTNum r6 +#define subFFTSize r7 +@// dest buffer for the next stage (not pSrc for first stage) +#define pPingPongBuf r5 + + +@//Output Registers + + +@//Local Scratch Registers + +#define grpSize r3 +@// Reuse grpSize as setCount +#define setCount r3 +#define pointStep r4 +#define outPointStep r4 +#define setStep r8 +#define step1 r9 +#define step2 r10 +#define t0 r11 + + +@// Neon Registers + +#define dXr0 D0.F32 +#define dXi0 D1.F32 +#define dXr1 D2.F32 +#define dXi1 D3.F32 +#define dXr2 D4.F32 +#define dXi2 D5.F32 +#define dXr3 D6.F32 +#define dXi3 D7.F32 +#define dXr4 D8.F32 +#define dXi4 D9.F32 +#define dXr5 D10.F32 +#define dXi5 D11.F32 +#define dXr6 D12.F32 +#define dXi6 D13.F32 +#define dXr7 D14.F32 +#define dXi7 D15.F32 +#define qX0 Q0.F32 +#define qX1 Q1.F32 +#define qX2 Q2.F32 +#define qX3 Q3.F32 +#define qX4 Q4.F32 +#define qX5 Q5.F32 +#define qX6 Q6.F32 +#define qX7 Q7.F32 + +#define dUr0 D16.F32 +#define dUi0 D17.F32 +#define dUr2 D18.F32 +#define dUi2 D19.F32 +#define dUr4 D20.F32 +#define dUi4 D21.F32 +#define dUr6 D22.F32 +#define dUi6 D23.F32 +#define dUr1 D24.F32 +#define dUi1 D25.F32 +#define dUr3 D26.F32 +#define dUi3 D27.F32 +#define dUr5 D28.F32 +#define dUi5 D29.F32 +@// reuse dXr7 and dXi7 +#define dUr7 D30.F32 +#define dUi7 D31.F32 +#define qU0 Q8.F32 +#define qU1 Q12.F32 +#define qU2 Q9.F32 +#define qU3 Q13.F32 +#define qU4 Q10.F32 +#define qU5 Q14.F32 +#define qU6 Q11.F32 +#define qU7 Q15.F32 + + +#define dVr0 D24.F32 +#define dVi0 D25.F32 +#define dVr2 D26.F32 +#define dVi2 D27.F32 +#define dVr4 D28.F32 +#define dVi4 D29.F32 +#define dVr6 D30.F32 +#define dVi6 D31.F32 +#define dVr1 D16.F32 +#define dVi1 D17.F32 +#define dVr3 D18.F32 +#define dVi3 D19.F32 +#define dVr5 D20.F32 +#define dVi5 D21.F32 +#define dVr7 D22.F32 +#define dVi7 D23.F32 +#define qV0 Q12.F32 +#define qV1 Q8.F32 +#define qV2 Q13.F32 +#define qV3 Q9.F32 +#define qV4 Q14.F32 +#define qV5 Q10.F32 +#define qV6 Q15.F32 +#define qV7 Q11.F32 + +#define dYr0 D16.F32 +#define dYi0 D17.F32 +#define dYr2 D18.F32 +#define dYi2 D19.F32 +#define dYr4 D20.F32 +#define dYi4 D21.F32 +#define dYr6 D22.F32 +#define dYi6 D23.F32 +#define dYr1 D24.F32 +#define dYi1 D25.F32 +#define dYr3 D26.F32 +#define dYi3 D27.F32 +#define dYr5 D28.F32 +#define dYi5 D29.F32 +#define dYr7 D30.F32 +#define dYi7 D31.F32 +#define qY0 Q8.F32 +#define qY1 Q12.F32 +#define qY2 Q9.F32 +#define qY3 Q13.F32 +#define qY4 Q10.F32 +#define qY5 Q14.F32 +#define qY6 Q11.F32 +#define qY7 Q15.F32 + +#define dT0 D14.F32 +#define dT1 D15.F32 + + + .MACRO FFTSTAGE scaled, inverse, name + + @// Define stack arguments + + @// Update pSubFFTSize and pSubFFTNum regs + @// subFFTSize = 1 for the first stage + MOV subFFTSize,#8 + ADR t0,ONEBYSQRT2\name + + @// Note: setCount = subFFTNum/8 (reuse the grpSize reg for setCount) + LSR grpSize,subFFTNum,#3 + MOV subFFTNum,grpSize + + + @// pT0+1 increments pT0 by 8 bytes + @// pT0+pointStep = increment of 8*pointStep bytes = grpSize bytes + @// Note: outPointStep = pointStep for firststage + + MOV pointStep,grpSize,LSL #3 + + + @// Calculate the step of input data for the next set + @//MOV step1,pointStep,LSL #1 @// step1 = 2*pointStep + VLD2 {dXr0,dXi0},[pSrc, :128],pointStep @// data[0] + MOV step1,grpSize,LSL #4 + + MOV step2,pointStep,LSL #3 + VLD2 {dXr1,dXi1},[pSrc, :128],pointStep @// data[1] + SUB step2,step2,pointStep @// step2 = 7*pointStep + @// setStep = - 7*pointStep+16 + RSB setStep,step2,#16 + + VLD2 {dXr2,dXi2},[pSrc, :128],pointStep @// data[2] + VLD2 {dXr3,dXi3},[pSrc, :128],pointStep @// data[3] + VLD2 {dXr4,dXi4},[pSrc, :128],pointStep @// data[4] + VLD2 {dXr5,dXi5},[pSrc, :128],pointStep @// data[5] + VLD2 {dXr6,dXi6},[pSrc, :128],pointStep @// data[6] + @// data[7] & update pSrc for the next set + @// setStep = -7*pointStep + 16 + VLD2 {dXr7,dXi7},[pSrc, :128],setStep + @// grp = 0 a special case since all the twiddle factors are 1 + @// Loop on the sets + +radix8fsGrpZeroSetLoop\name : + + @// Decrement setcount + SUBS setCount,setCount,#2 + + + @// finish first stage of 8 point FFT + + VADD qU0,qX0,qX4 + VADD qU2,qX1,qX5 + VADD qU4,qX2,qX6 + VADD qU6,qX3,qX7 + + @// finish second stage of 8 point FFT + + VADD qV0,qU0,qU4 + VSUB qV2,qU0,qU4 + VADD qV4,qU2,qU6 + VSUB qV6,qU2,qU6 + + @// finish third stage of 8 point FFT + + VADD qY0,qV0,qV4 + VSUB qY4,qV0,qV4 + VST2 {dYr0,dYi0},[pDst, :128],step1 @// store y0 + + .ifeqs "\inverse", "TRUE" + + VSUB dYr2,dVr2,dVi6 + VADD dYi2,dVi2,dVr6 + + VADD dYr6,dVr2,dVi6 + VST2 {dYr2,dYi2},[pDst, :128],step1 @// store y2 + VSUB dYi6,dVi2,dVr6 + + VSUB qU1,qX0,qX4 + VST2 {dYr4,dYi4},[pDst, :128],step1 @// store y4 + + VSUB qU3,qX1,qX5 + VSUB qU5,qX2,qX6 + VST2 {dYr6,dYi6},[pDst, :128],step1 @// store y6 + + .ELSE + + VADD dYr6,dVr2,dVi6 + VSUB dYi6,dVi2,dVr6 + + VSUB dYr2,dVr2,dVi6 + VST2 {dYr6,dYi6},[pDst, :128],step1 @// store y2 + VADD dYi2,dVi2,dVr6 + + + VSUB qU1,qX0,qX4 + VST2 {dYr4,dYi4},[pDst, :128],step1 @// store y4 + VSUB qU3,qX1,qX5 + VSUB qU5,qX2,qX6 + VST2 {dYr2,dYi2},[pDst, :128],step1 @// store y6 + + + .ENDIF + + @// finish first stage of 8 point FFT + + VSUB qU7,qX3,qX7 + VLD1 dT0[0], [t0] + + @// finish second stage of 8 point FFT + + VSUB dVr1,dUr1,dUi5 + @// data[0] for next iteration + VLD2 {dXr0,dXi0},[pSrc, :128],pointStep + VADD dVi1,dUi1,dUr5 + VADD dVr3,dUr1,dUi5 + VLD2 {dXr1,dXi1},[pSrc, :128],pointStep @// data[1] + VSUB dVi3,dUi1,dUr5 + + VSUB dVr5,dUr3,dUi7 + VLD2 {dXr2,dXi2},[pSrc, :128],pointStep @// data[2] + VADD dVi5,dUi3,dUr7 + VADD dVr7,dUr3,dUi7 + VLD2 {dXr3,dXi3},[pSrc, :128],pointStep @// data[3] + VSUB dVi7,dUi3,dUr7 + + @// finish third stage of 8 point FFT + + .ifeqs "\inverse", "TRUE" + + @// calculate a*v5 + VMUL dT1,dVr5,dT0[0] @// use dVi0 for dT1 + + VLD2 {dXr4,dXi4},[pSrc, :128],pointStep @// data[4] + VMUL dVi5,dVi5,dT0[0] + + VLD2 {dXr5,dXi5},[pSrc, :128],pointStep @// data[5] + VSUB dVr5,dT1,dVi5 @// a * V5 + VADD dVi5,dT1,dVi5 + + VLD2 {dXr6,dXi6},[pSrc, :128],pointStep @// data[6] + + @// calculate b*v7 + VMUL dT1,dVr7,dT0[0] + VMUL dVi7,dVi7,dT0[0] + + VADD qY1,qV1,qV5 + VSUB qY5,qV1,qV5 + + + VADD dVr7,dT1,dVi7 @// b * V7 + VSUB dVi7,dVi7,dT1 + SUB pDst, pDst, step2 @// set pDst to y1 + + @// On the last iteration, this will read past the end of pSrc, + @// so skip this read. + BEQ radix8SkipLastUpdateInv\name + VLD2 {dXr7,dXi7},[pSrc, :128],setStep @// data[7] +radix8SkipLastUpdateInv\name: + + VSUB dYr3,dVr3,dVr7 + VSUB dYi3,dVi3,dVi7 + VST2 {dYr1,dYi1},[pDst, :128],step1 @// store y1 + VADD dYr7,dVr3,dVr7 + VADD dYi7,dVi3,dVi7 + + + VST2 {dYr3,dYi3},[pDst, :128],step1 @// store y3 + VST2 {dYr5,dYi5},[pDst, :128],step1 @// store y5 + VST2 {dYr7,dYi7},[pDst, :128] @// store y7 + ADD pDst, pDst, #16 + + .ELSE + + @// calculate b*v7 + VMUL dT1,dVr7,dT0[0] + VLD2 {dXr4,dXi4},[pSrc, :128],pointStep @// data[4] + VMUL dVi7,dVi7,dT0[0] + + VLD2 {dXr5,dXi5},[pSrc, :128],pointStep @// data[5] + VADD dVr7,dT1,dVi7 @// b * V7 + VSUB dVi7,dVi7,dT1 + + VLD2 {dXr6,dXi6},[pSrc, :128],pointStep @// data[6] + + @// calculate a*v5 + VMUL dT1,dVr5,dT0[0] @// use dVi0 for dT1 + VMUL dVi5,dVi5,dT0[0] + + VADD dYr7,dVr3,dVr7 + VADD dYi7,dVi3,dVi7 + SUB pDst, pDst, step2 @// set pDst to y1 + + VSUB dVr5,dT1,dVi5 @// a * V5 + VADD dVi5,dT1,dVi5 + + @// On the last iteration, this will read past the end of pSrc, + @// so skip this read. + BEQ radix8SkipLastUpdateFwd\name + VLD2 {dXr7,dXi7},[pSrc, :128],setStep @// data[7] +radix8SkipLastUpdateFwd\name: + + VSUB qY5,qV1,qV5 + + VSUB dYr3,dVr3,dVr7 + VST2 {dYr7,dYi7},[pDst, :128],step1 @// store y1 + VSUB dYi3,dVi3,dVi7 + VADD qY1,qV1,qV5 + + + VST2 {dYr5,dYi5},[pDst, :128],step1 @// store y3 + VST2 {dYr3,dYi3},[pDst, :128],step1 @// store y5 + VST2 {dYr1,dYi1},[pDst, :128]! @// store y7 + + .ENDIF + + + @// update pDst for the next set + SUB pDst, pDst, step2 + BGT radix8fsGrpZeroSetLoop\name + + + @// reset pSrc to pDst for the next stage + SUB pSrc,pDst,pointStep @// pDst -= 2*grpSize + MOV pDst,pPingPongBuf + + + + .endm + + + @// Allocate stack memory required by the function + + + M_START armSP_FFTFwd_CToC_FC32_Radix8_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",FWD + M_END +ONEBYSQRT2FWD: .float 0.7071067811865476e0 + + M_START armSP_FFTInv_CToC_FC32_Radix8_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",INV + M_END +ONEBYSQRT2INV: .float 0.7071067811865476e0 + + + .end diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix2_fs_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix2_fs_unsafe_s.S new file mode 100644 index 0000000000..a16c79f75e --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix2_fs_unsafe_s.S @@ -0,0 +1,170 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. + +@// +@// +@// File Name: armSP_FFT_CToC_SC16_Radix2_fs_unsafe_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 6693 +@// Last Modified Date: Tue, 10 Jul 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute a Radix 2 FFT stage for a N point complex signal +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + +@// Guarding implementation by the processor name + + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define pPingPongBuf r5 +#define subFFTNum r6 +#define subFFTSize r7 + + +@//Output Registers + + +@//Local Scratch Registers + +#define pointStep r3 +#define outPointStep r3 +#define grpSize r4 +#define setCount r4 +#define step r8 +#define dstStep r8 + +@// Neon Registers + +#define dX0 D0.S16 +#define dX1 D1.S16 +#define dY0 D2.S16 +#define dY1 D3.S16 +#define dX0S32 D0.S32 +#define dX1S32 D1.S32 +#define dY0S32 D2.S32 +#define dY1S32 D3.S32 + + + .MACRO FFTSTAGE scaled, inverse, name + + @// Define stack arguments + + + @// update subFFTSize and subFFTNum into RN6 and RN7 for the next stage + + + MOV subFFTSize,#2 + LSR grpSize,subFFTNum,#1 + MOV subFFTNum,grpSize + + + @// pT0+1 increments pT0 by 8 bytes + @// pT0+pointStep = increment of 4*pointStep bytes = 2*grpSize bytes + @// Note: outPointStep = pointStep for firststage + @// Note: setCount = grpSize/2 (reuse the updated grpSize for setCount) + + MOV pointStep,grpSize,LSL #2 + RSB step,pointStep,#4 + + + @// Loop on the sets for grp zero: 1 set at a time + +grpZeroSetLoop\name: + + VLD1 {dX0S32[0]},[pSrc],pointStep + VLD1 {dX1S32[0]},[pSrc],step @// step = -pointStep + 4 + SUBS setCount,setCount,#1 @// decrement the loop counter + + .ifeqs "\scaled", "TRUE" + + VHADD dY0,dX0,dX1 + VHSUB dY1,dX0,dX1 + + .ELSE + + VADD dY0,dX0,dX1 + VSUB dY1,dX0,dX1 + + + .ENDIF + + VST1 {dY0S32[0]},[pDst],outPointStep + VST1 {dY1S32[0]},[pDst],dstStep @// dstStep = step = -pointStep + 4 + + BGT grpZeroSetLoop\name + + + @// reset pSrc to pDst for the next stage + SUB pSrc,pDst,pointStep @// pDst -= 2*grpSize + MOV pDst,pPingPongBuf + + .endm + + + + M_START armSP_FFTFwd_CToC_SC16_Radix2_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",FWD + M_END + + + + M_START armSP_FFTInv_CToC_SC16_Radix2_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",INV + M_END + + + + M_START armSP_FFTFwd_CToC_SC16_Sfs_Radix2_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","FALSE",FWDSFS + M_END + + + + M_START armSP_FFTInv_CToC_SC16_Sfs_Radix2_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","TRUE",INVSFS + M_END + + + + + .END diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix2_ls_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix2_ls_unsafe_s.S new file mode 100644 index 0000000000..9f7b531d30 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix2_ls_unsafe_s.S @@ -0,0 +1,210 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. + +@// +@// +@// File Name: armSP_FFT_CToC_SC16_Radix2_ls_unsafe_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 6741 +@// Last Modified Date: Wed, 18 Jul 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute a Radix 2 FFT stage for a N point complex signal +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + +@// Guarding implementation by the processor name + + + + + + + +@// Guarding implementation by the processor name + + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define subFFTNum r6 +#define subFFTSize r7 + + +@//Output Registers + + +@//Local Scratch Registers + + +#define outPointStep r3 +#define grpCount r4 +#define dstStep r5 +#define pTmp r4 +#define step r8 + +@// Neon Registers + +#define dWr D0.S16 +#define dWi D1.S16 +#define dXr0 D2.S16 +#define dXi0 D3.S16 +#define dXr1 D4.S16 +#define dXi1 D5.S16 +#define dYr0 D6.S16 +#define dYi0 D7.S16 +#define dYr1 D8.S16 +#define dYi1 D9.S16 +#define qT0 Q5.S32 +#define qT1 Q6.S32 + + + .MACRO FFTSTAGE scaled, inverse, name + + + MOV outPointStep,subFFTSize,LSL #2 + @// Update grpCount and grpSize rightaway + + MOV subFFTNum,#1 @//after the last stage + LSL grpCount,subFFTSize,#1 + + @// update subFFTSize for the next stage + MOV subFFTSize,grpCount + + SUB step,outPointStep,#4 @// step = -4+outPointStep + RSB dstStep,step,#0 @// dstStep = -4-outPointStep+8 = -step + @//RSB dstStep,outPointStep,#16 + + + @// Loop on 2 grps at a time for the last stage + +grpLoop\name: + VLD2 {dWr[0],dWi[0]},[pTwiddle]! @// grp 0 + VLD2 {dWr[1],dWi[1]},[pTwiddle]! @// grp 1 + + @//VLD2 {dWr,dWi},[pTwiddle],#16 + + VLD4 {dXr0[0],dXi0[0],dXr1[0],dXi1[0]},[pSrc]! @// grp 0 + VLD4 {dXr0[1],dXi0[1],dXr1[1],dXi1[1]},[pSrc]! @// grp 1 + + + @//VLD4 {dXr0,dXi0,dXr1,dXi1},[pSrc],#32 + SUBS grpCount,grpCount,#4 @// grpCount is multiplied by 2 + + .ifeqs "\inverse", "TRUE" + VMULL qT0,dXr1,dWr + VMLAL qT0,dXi1,dWi @// real part + VMULL qT1,dXi1,dWr + VMLSL qT1,dXr1,dWi @// imag part + + .ELSE + VMULL qT0,dXr1,dWr + VMLSL qT0,dXi1,dWi @// real part + VMULL qT1,dXi1,dWr + VMLAL qT1,dXr1,dWi @// imag part + + .ENDIF + + VRSHRN dXr1,qT0,#15 + VRSHRN dXi1,qT1,#15 + + + .ifeqs "\scaled", "TRUE" + + VHSUB dYr0,dXr0,dXr1 + VHSUB dYi0,dXi0,dXi1 + VHADD dYr1,dXr0,dXr1 + VHADD dYi1,dXi0,dXi1 + + .ELSE + + VSUB dYr0,dXr0,dXr1 + VSUB dYi0,dXi0,dXi1 + VADD dYr1,dXr0,dXr1 + VADD dYi1,dXi0,dXi1 + + + .ENDIF + + VST2 {dYr0[0],dYi0[0]},[pDst]! + VST2 {dYr0[1],dYi0[1]},[pDst],step @// step = -4+outPointStep + + VST2 {dYr1[0],dYi1[0]},[pDst]! + VST2 {dYr1[1],dYi1[1]},[pDst],dstStep @// dstStep = -4-outPointStep+8 = -step + + @//VST2 {dYr0,dYi0},[pDst],outPointStep + @//VST2 {dYr1,dYi1},[pDst],dstStep @// dstStep = step = -outPointStep + 16 + + BGT grpLoop\name + + + @// Reset and Swap pSrc and pDst for the next stage + MOV pTmp,pDst + SUB pDst,pSrc,outPointStep,LSL #1 @// pDst -= 2*size; pSrc -= 4*size bytes + SUB pSrc,pTmp,outPointStep + + @// Reset pTwiddle for the next stage + SUB pTwiddle,pTwiddle,outPointStep @// pTwiddle -= 2*size bytes + + .endm + + + + M_START armSP_FFTFwd_CToC_SC16_Radix2_ls_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",FWD + M_END + + + + M_START armSP_FFTInv_CToC_SC16_Radix2_ls_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",INV + M_END + + + + M_START armSP_FFTFwd_CToC_SC16_Sfs_Radix2_ls_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","FALSE",FWDSFS + M_END + + + + M_START armSP_FFTInv_CToC_SC16_Sfs_Radix2_ls_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","TRUE",INVSFS + M_END + + + + + .END diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix2_ps_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix2_ps_unsafe_s.S new file mode 100644 index 0000000000..666f4f349a --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix2_ps_unsafe_s.S @@ -0,0 +1,216 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. + +@// +@// +@// File Name: armSP_FFT_CToC_SC16_Radix2_ps_unsafe_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 6740 +@// Last Modified Date: Wed, 18 Jul 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute a Radix 2 FFT stage for a N point complex signal +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + + +@// Guarding implementation by the processor name + + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define subFFTNum r6 +#define subFFTSize r7 + + +@//Output Registers + + +@//Local Scratch Registers + +#define outPointStep r3 +#define grpCount r4 +#define dstStep r5 +#define twStep r8 +#define pTmp r4 + +@// Neon Registers + +#define dW1S32 D0.S32 +#define dW2S32 D1.S32 +#define dW1 D0.S16 +#define dW2 D1.S16 + +#define dX0 D2.S16 +#define dX1 D3.S16 +#define dX2 D4.S16 +#define dX3 D5.S16 +#define dY0 D6.S16 +#define dY1 D7.S16 +#define dY2 D8.S16 +#define dY3 D9.S16 +#define qT0 Q5.S32 +#define qT1 Q6.S32 + + + .MACRO FFTSTAGE scaled, inverse, name + + @// Define stack arguments + + + @// Update grpCount and grpSize rightaway inorder to reuse pGrpCount and pGrpSize regs + + + LSL grpCount,subFFTSize,#1 + + + @// update subFFTSize for the next stage + MOV subFFTSize,grpCount + + @// pOut0+1 increments pOut0 by 8 bytes + @// pOut0+outPointStep == increment of 4*outPointStep bytes = 2*size bytes + SMULBB outPointStep,grpCount,subFFTNum + MOV twStep,subFFTNum,LSL #1 + LSR subFFTNum,subFFTNum,#1 @//grpSize + + + RSB dstStep,outPointStep,#8 + + + @// Note: pointStep is 8 in this case: so need of extra reg + @// Loop on the groups: 2 groups at a time + +grpLoop\name: + + VLD1 dW1S32[],[pTwiddle],twStep @//[wi | wr] + VLD1 dW2S32[],[pTwiddle],twStep + + @// Process the sets for each grp: 2 sets at a time (no set looping required) + + VLD1 dX0,[pSrc]! @// point0: of set0,set1 of grp0 + VLD1 dX1,[pSrc]! @// point1: of set0,set1 of grp0 + VLD1 dX2,[pSrc]! @// point0: of set0,set1 of grp1 + VLD1 dX3,[pSrc]! @// point1: of set0,set1 of grp1 + + SUBS grpCount,grpCount,#4 @// decrement the loop counter + VUZP dW1,dW2 + VUZP dX1,dX3 + + .ifeqs "\inverse", "TRUE" + VMULL qT0,dX1,dW1 + VMLAL qT0,dX3,dW2 @// real part + VMULL qT1,dX3,dW1 + VMLSL qT1,dX1,dW2 @// imag part + + .ELSE + VMULL qT0,dX1,dW1 + VMLSL qT0,dX3,dW2 @// real part + VMULL qT1,dX3,dW1 + VMLAL qT1,dX1,dW2 @// imag part + + .ENDIF + + VRSHRN dX1,qT0,#15 + VRSHRN dX3,qT1,#15 + + VZIP dX1,dX3 + + + .ifeqs "\scaled", "TRUE" + + VHSUB dY0,dX0,dX1 + VHADD dY1,dX0,dX1 + VHSUB dY2,dX2,dX3 + VHADD dY3,dX2,dX3 + + .ELSE + + VSUB dY0,dX0,dX1 + VADD dY1,dX0,dX1 + VSUB dY2,dX2,dX3 + VADD dY3,dX2,dX3 + + + + .ENDIF + + VST1 dY0,[pDst],outPointStep @// point0: of set0,set1 of grp0 + VST1 dY1,[pDst],dstStep @// dstStep = -outPointStep + 8 + VST1 dY2,[pDst],outPointStep @// point0: of set0,set1 of grp1 + VST1 dY3,[pDst],dstStep @// point1: of set0,set1 of grp1 + + + BGT grpLoop\name + + + @// Reset and Swap pSrc and pDst for the next stage + MOV pTmp,pDst + SUB pDst,pSrc,outPointStep,LSL #1 @// pDst -= 2*size; pSrc -= 4*size bytes + SUB pSrc,pTmp,outPointStep + + @// Reset pTwiddle for the next stage + SUB pTwiddle,pTwiddle,outPointStep @// pTwiddle -= 2*size bytes + + .endm + + + + M_START armSP_FFTFwd_CToC_SC16_Radix2_ps_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",FWD + M_END + + + + M_START armSP_FFTInv_CToC_SC16_Radix2_ps_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",INV + M_END + + + + M_START armSP_FFTFwd_CToC_SC16_Sfs_Radix2_ps_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","FALSE",FWDSFS + M_END + + + + M_START armSP_FFTInv_CToC_SC16_Sfs_Radix2_ps_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","TRUE",INVSFS + M_END + + + + .END diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix2_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix2_unsafe_s.S new file mode 100644 index 0000000000..f9bbebcca9 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix2_unsafe_s.S @@ -0,0 +1,219 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. + +@// +@// +@// File Name: armSP_FFT_CToC_SC16_Radix2_unsafe_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 5892 +@// Last Modified Date: Thu, 07 Jun 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute a Radix 2 FFT stage for a N point complex signal +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + + @// Guarding implementation by the processor name + + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define subFFTNum r6 +#define subFFTSize r7 + + +@//Output Registers + + +@//Local Scratch Registers + +#define outPointStep r3 +#define pointStep r4 +#define grpCount r5 +#define setCount r8 +#define step r10 +#define dstStep r11 +#define pTmp r9 + +@// Neon Registers + +#define dW D0.S16 +#define dX0 D2.S16 +#define dX1 D3.S16 +#define dX2 D4.S16 +#define dX3 D5.S16 +#define dY0 D6.S16 +#define dY1 D7.S16 +#define dY2 D8.S16 +#define dY3 D9.S16 +#define qT0 Q3.S32 +#define qT1 Q4.S32 + + + + .MACRO FFTSTAGE scaled, inverse, name + + @// Define stack arguments + + + @// Update grpCount and grpSize rightaway inorder to reuse pGrpCount and pGrpSize regs + + LSR subFFTNum,subFFTNum,#1 @//grpSize + LSL grpCount,subFFTSize,#1 + + + @// pT0+1 increments pT0 by 8 bytes + @// pT0+pointStep = increment of 4*pointStep bytes = 2*grpSize bytes + MOV pointStep,subFFTNum,LSL #1 + + @// update subFFTSize for the next stage + MOV subFFTSize,grpCount + + @// pOut0+1 increments pOut0 by 8 bytes + @// pOut0+outPointStep == increment of 4*outPointStep bytes = 2*size bytes + SMULBB outPointStep,grpCount,pointStep + LSL pointStep,pointStep,#1 + + + RSB step,pointStep,#16 + RSB dstStep,outPointStep,#16 + + @// Loop on the groups + +grpLoop\name: + + VLD1 dW,[pTwiddle],pointStep @//[wi | wr] + MOV setCount,pointStep,LSR #2 + + + @// Loop on the sets: 4 at a time + + +setLoop\name: + + + VLD2 {dX0,dX1},[pSrc],pointStep @// point0: dX0-real part dX1-img part + VLD2 {dX2,dX3},[pSrc],step @// point1: dX2-real part dX3-img part + + SUBS setCount,setCount,#4 + + .ifeqs "\inverse", "TRUE" + VMULL qT0,dX2,dW[0] + VMLAL qT0,dX3,dW[1] @// real part + VMULL qT1,dX3,dW[0] + VMLSL qT1,dX2,dW[1] @// imag part + + .ELSE + + VMULL qT0,dX2,dW[0] + VMLSL qT0,dX3,dW[1] @// real part + VMULL qT1,dX3,dW[0] + VMLAL qT1,dX2,dW[1] @// imag part + + .ENDIF + + VRSHRN dX2,qT0,#15 + VRSHRN dX3,qT1,#15 + + .ifeqs "\scaled", "TRUE" + VHSUB dY0,dX0,dX2 + VHSUB dY1,dX1,dX3 + VHADD dY2,dX0,dX2 + VHADD dY3,dX1,dX3 + + .ELSE + VSUB dY0,dX0,dX2 + VSUB dY1,dX1,dX3 + VADD dY2,dX0,dX2 + VADD dY3,dX1,dX3 + + .ENDIF + + VST2 {dY0,dY1},[pDst],outPointStep + VST2 {dY2,dY3},[pDst],dstStep @// dstStep = -outPointStep + 16 + + BGT setLoop\name + + SUBS grpCount,grpCount,#2 + ADD pSrc,pSrc,pointStep + BGT grpLoop\name + + + @// Reset and Swap pSrc and pDst for the next stage + MOV pTmp,pDst + SUB pDst,pSrc,outPointStep,LSL #1 @// pDst -= 2*size; pSrc -= 4*size bytes + SUB pSrc,pTmp,outPointStep + + @// Reset pTwiddle for the next stage + SUB pTwiddle,pTwiddle,outPointStep @// pTwiddle -= 2*size bytes + + + .endm + + + + M_START armSP_FFTFwd_CToC_SC16_Radix2_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",FWD + M_END + + + + M_START armSP_FFTInv_CToC_SC16_Radix2_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",INV + M_END + + + + M_START armSP_FFTFwd_CToC_SC16_Sfs_Radix2_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","FALSE",FWDSFS + M_END + + + + M_START armSP_FFTInv_CToC_SC16_Sfs_Radix2_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","TRUE",INVSFS + M_END + + + + + + .END diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix4_fs_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix4_fs_unsafe_s.S new file mode 100644 index 0000000000..ed0683fe73 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix4_fs_unsafe_s.S @@ -0,0 +1,314 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. + +@// +@// +@// File Name: armSP_FFT_CToC_SC16_Radix4_fs_unsafe_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 7761 +@// Last Modified Date: Wed, 26 Sep 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute a first stage Radix 4 FFT stage for a N point complex signal +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + +@// Import symbols required from other files +@// (For example tables) + + + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + +@// Guarding implementation by the processor name + + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define pPingPongBuf r5 +#define subFFTNum r6 +#define subFFTSize r7 + + +@//Output Registers + + +@//Local Scratch Registers + +#define grpSize r3 +@// Reuse grpSize as setCount +#define setCount r3 +#define pointStep r4 +#define outPointStep r4 +#define setStep r8 +#define step1 r9 +#define step3 r10 + +@// Neon Registers + +#define dXr0 D0.S16 +#define dXi0 D1.S16 +#define dXr1 D2.S16 +#define dXi1 D3.S16 +#define dXr2 D4.S16 +#define dXi2 D5.S16 +#define dXr3 D6.S16 +#define dXi3 D7.S16 +#define dYr0 D8.S16 +#define dYi0 D9.S16 +#define dYr1 D10.S16 +#define dYi1 D11.S16 +#define dYr2 D12.S16 +#define dYi2 D13.S16 +#define dYr3 D14.S16 +#define dYi3 D15.S16 +#define dZr0 D16.S16 +#define dZi0 D17.S16 +#define dZr1 D18.S16 +#define dZi1 D19.S16 +#define dZr2 D20.S16 +#define dZi2 D21.S16 +#define dZr3 D22.S16 +#define dZi3 D23.S16 +#define qY0 Q4.S16 +#define qY2 Q6.S16 +#define qX0 Q0.S16 +#define qX2 Q2.S16 + +#define qY1 Q5.S16 +#define qY3 Q7.S16 +#define qX1 Q1.S16 +#define qX3 Q3.S16 +#define qZ0 Q8.S16 +#define qZ1 Q9.S16 + + + .MACRO FFTSTAGE scaled, inverse, name + + @// Define stack arguments + + MOV pointStep,subFFTNum + @// Update pSubFFTSize and pSubFFTNum regs + + + VLD2 {dXr0,dXi0},[pSrc, :128],pointStep @// data[0] + @// Note: setCount = subFFTNum/4 (reuse the grpSize reg for setCount) + LSR grpSize,subFFTNum,#2 + MOV subFFTNum,grpSize + + + @// pT0+1 increments pT0 by 4 bytes + @// pT0+pointStep = increment of 4*pointStep bytes = grpSize bytes + @// Note: outPointStep = pointStep for firststage + VLD2 {dXr1,dXi1},[pSrc, :128],pointStep @// data[1] + + + @// Calculate the step of input data for the next set + @//MOV setStep,pointStep,LSL #1 + MOV setStep,grpSize,LSL #3 + VLD2 {dXr2,dXi2},[pSrc, :128],pointStep @// data[2] + MOV step1,setStep + ADD setStep,setStep,pointStep @// setStep = 3*pointStep + RSB setStep,setStep,#16 @// setStep = - 3*pointStep+16 + + + VLD2 {dXr3,dXi3},[pSrc, :128],setStep @// data[3] + MOV subFFTSize,#4 @// subFFTSize = 1 for the first stage + + + .ifeqs "\scaled", "TRUE" + VHADD qY0,qX0,qX2 @// u0 + .ELSE + VADD qY0,qX0,qX2 @// u0 + .ENDIF + RSB step3,pointStep,#0 + + @// grp = 0 a special case since all the twiddle factors are 1 + @// Loop on the sets: 4 sets at a time + +grpZeroSetLoop\name: + + + .ifeqs "\scaled", "TRUE" + + @// finish first stage of 4 point FFT + + VHSUB qY2,qX0,qX2 @// u1 + SUBS setCount,setCount,#4 @// decrement the set loop counter + + VLD2 {dXr0,dXi0},[pSrc, :128],step1 @// data[0] + VHADD qY1,qX1,qX3 @// u2 + VLD2 {dXr2,dXi2},[pSrc, :128],step3 + VHSUB qY3,qX1,qX3 @// u3 + + + + @// finish second stage of 4 point FFT + + VLD2 {dXr1,dXi1},[pSrc, :128],step1 @// data[1] + VHADD qZ0,qY0,qY1 @// y0 + + VLD2 {dXr3,dXi3},[pSrc, :128],setStep + + + .ifeqs "\inverse", "TRUE" + + VHSUB dZr3,dYr2,dYi3 @// y3 + VHADD dZi3,dYi2,dYr3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + + VHSUB qZ1,qY0,qY1 @// y2 + VST2 {dZr3,dZi3},[pDst, :128],outPointStep + + VHADD dZr2,dYr2,dYi3 @// y1 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + VHSUB dZi2,dYi2,dYr3 + + VHADD qY0,qX0,qX2 @// u0 (next loop) + VST2 {dZr2,dZi2},[pDst, :128],setStep + + + .ELSE + + VHADD dZr2,dYr2,dYi3 @// y1 + VHSUB dZi2,dYi2,dYr3 + + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VHSUB qZ1,qY0,qY1 @// y2 + + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + VHSUB dZr3,dYr2,dYi3 @// y3 + VHADD dZi3,dYi2,dYr3 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + VHADD qY0,qX0,qX2 @// u0 (next loop) + VST2 {dZr3,dZi3},[pDst, :128],setStep + + .ENDIF + + + .ELSE + + @// finish first stage of 4 point FFT + + VSUB qY2,qX0,qX2 @// u1 + SUBS setCount,setCount,#4 @// decrement the set loop counter + + VLD2 {dXr0,dXi0},[pSrc, :128],step1 @// data[0] + VADD qY1,qX1,qX3 @// u2 + VLD2 {dXr2,dXi2},[pSrc, :128],step3 + VSUB qY3,qX1,qX3 @// u3 + + + + @// finish second stage of 4 point FFT + + VLD2 {dXr1,dXi1},[pSrc, :128],step1 @// data[1] + VADD qZ0,qY0,qY1 @// y0 + + VLD2 {dXr3,dXi3},[pSrc, :128],setStep + + + .ifeqs "\inverse", "TRUE" + + VSUB dZr3,dYr2,dYi3 @// y3 + VADD dZi3,dYi2,dYr3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + + VSUB qZ1,qY0,qY1 @// y2 + VST2 {dZr3,dZi3},[pDst, :128],outPointStep + + VADD dZr2,dYr2,dYi3 @// y1 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + VSUB dZi2,dYi2,dYr3 + + VADD qY0,qX0,qX2 @// u0 (next loop) + VST2 {dZr2,dZi2},[pDst, :128],setStep + + + .ELSE + + VADD dZr2,dYr2,dYi3 @// y1 + VSUB dZi2,dYi2,dYr3 + + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VSUB qZ1,qY0,qY1 @// y2 + + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + VSUB dZr3,dYr2,dYi3 @// y3 + VADD dZi3,dYi2,dYr3 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + VADD qY0,qX0,qX2 @// u0 (next loop) + VST2 {dZr3,dZi3},[pDst, :128],setStep + + .ENDIF + + + .ENDIF + + BGT grpZeroSetLoop\name + + + @// reset pSrc to pDst for the next stage + SUB pSrc,pDst,pointStep @// pDst -= grpSize + MOV pDst,pPingPongBuf + + + .endm + + + + M_START armSP_FFTFwd_CToC_SC16_Radix4_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",FWD + M_END + + + + M_START armSP_FFTInv_CToC_SC16_Radix4_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",INV + M_END + + + M_START armSP_FFTFwd_CToC_SC16_Sfs_Radix4_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","FALSE",FWDSFS + M_END + + + M_START armSP_FFTInv_CToC_SC16_Sfs_Radix4_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","TRUE",INVSFS + M_END + + + + + + .END diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix4_ls_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix4_ls_unsafe_s.S new file mode 100644 index 0000000000..bf0099af33 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix4_ls_unsafe_s.S @@ -0,0 +1,410 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. + +@// +@// +@// File Name: armSP_FFT_CToC_SC16_Radix4_ls_unsafe_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 7765 +@// Last Modified Date: Thu, 27 Sep 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute a Radix 4 FFT stage for a N point complex signal +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + +@// Guarding implementation by the processor name + + + + + + +@// Guarding implementation by the processor name + + +@// Import symbols required from other files +@// (For example tables) + @//IMPORT armAAC_constTable + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define subFFTNum r6 +#define subFFTSize r7 + + + +@//Output Registers + + +@//Local Scratch Registers + +#define outPointStep r3 +#define grpCount r4 +#define dstStep r5 +#define pw1 r8 +#define pw2 r9 +#define pw3 r10 +#define pTmp r4 + + +@// Neon Registers + +#define dButterfly1Real02 D0.S16 +#define dButterfly1Imag02 D1.S16 +#define dButterfly1Real13 D2.S16 +#define dButterfly1Imag13 D3.S16 +#define dButterfly2Real02 D4.S16 +#define dButterfly2Imag02 D5.S16 +#define dButterfly2Real13 D6.S16 +#define dButterfly2Imag13 D7.S16 +#define dXr0 D0.S16 +#define dXi0 D1.S16 +#define dXr1 D2.S16 +#define dXi1 D3.S16 +#define dXr2 D4.S16 +#define dXi2 D5.S16 +#define dXr3 D6.S16 +#define dXi3 D7.S16 + +#define dW1rS32 D8.S32 +#define dW1iS32 D9.S32 +#define dW2rS32 D10.S32 +#define dW2iS32 D11.S32 +#define dW3rS32 D12.S32 +#define dW3iS32 D13.S32 + +#define dW1r D8.S16 +#define dW1i D9.S16 +#define dW2r D10.S16 +#define dW2i D11.S16 +#define dW3r D12.S16 +#define dW3i D13.S16 + +#define dTmp0 D12.S16 +#define dTmp1 D13.S16 +#define dTmp1S32 D13.S32 +#define dTmp2S32 D14.S32 +#define dTmp3S32 D15.S32 + +#define dYr0 D18.S16 +#define dYi0 D19.S16 +#define dYr1 D16.S16 +#define dYi1 D17.S16 +#define dYr2 D20.S16 +#define dYi2 D21.S16 +#define dYr3 D14.S16 +#define dYi3 D15.S16 +#define qY0 Q9.S16 +#define qY1 Q8.S16 +#define qY2 Q10.S16 +#define qY3 Q7.S16 + +#define qX0 Q0.S16 +#define qX1 Q1.S16 +#define qX2 Q2.S16 +#define qX3 Q3.S16 + +#define qT0 Q9.S32 +#define qT1 Q10.S32 +#define qT2 Q7.S32 +#define qT3 Q8.S32 + +#define dZr0 D22.S16 +#define dZi0 D23.S16 +#define dZr1 D24.S16 +#define dZi1 D25.S16 +#define dZr2 D26.S16 +#define dZi2 D27.S16 +#define dZr3 D28.S16 +#define dZi3 D29.S16 + +#define qZ0 Q11.S16 +#define qZ1 Q12.S16 +#define qZ2 Q13.S16 +#define qZ3 Q14.S16 + + + .MACRO FFTSTAGE scaled, inverse , name + + @// Define stack arguments + + MOV pw2,pTwiddle + VLD4 {dW2r,dW2i,dTmp0,dTmp1},[pw2, :256]! + + MOV pw3,pTwiddle + MOV pw1,pTwiddle + @// pOut0+1 increments pOut0 by 8 bytes + @// pOut0+outPointStep == increment of 4*outPointStep bytes + MOV outPointStep,subFFTSize,LSL #2 + + VLD3 {dW3rS32,dTmp1S32,dTmp2S32},[pw3, :64]! + MOV subFFTNum,#1 @//after the last stage + LSL grpCount,subFFTSize,#2 + + + @// Update grpCount and grpSize rightaway + VLD3 {dW3iS32,dTmp2S32,dTmp3S32},[pw3, :64]! + + @// update subFFTSize for the next stage + MOV subFFTSize,grpCount + MOV dstStep,outPointStep,LSL #1 + + VLD2 {dW1r,dW1i}, [pw1, :128]! + + + ADD dstStep,dstStep,outPointStep @// dstStep = 3*outPointStep + RSB dstStep,dstStep,#16 @// dstStep = - 3*outPointStep+16 + + VLD4 {dButterfly1Real02,dButterfly1Imag02,dButterfly1Real13,dButterfly1Imag13},[pSrc, :256]! @// AC.r AC.i BD.r BD.i + VLD4 {dButterfly2Real02,dButterfly2Imag02,dButterfly2Real13,dButterfly2Imag13},[pSrc, :256]! @// AC.r AC.i BD.r BD.i + + @// Process 4 groups at a time + +grpLoop\name: + + + @// Rearrange the third twiddle + VUZP dW3r,dW3i + SUBS grpCount,grpCount,#16 @// grpCount is multiplied by 4 + + + VUZP dButterfly1Real13, dButterfly2Real13 @// B.r D.r + VUZP dButterfly1Imag13, dButterfly2Imag13 @// B.i D.i + VUZP dButterfly1Real02, dButterfly2Real02 @// A.r C.r + VUZP dButterfly1Imag02, dButterfly2Imag02 @// A.i C.i + + + .ifeqs "\inverse", "TRUE" + VMULL qT0,dXr1,dW1r + VMLAL qT0,dXi1,dW1i @// real part + VMULL qT1,dXi1,dW1r + VMLSL qT1,dXr1,dW1i @// imag part + + .ELSE + VMULL qT0,dXr1,dW1r + VMLSL qT0,dXi1,dW1i @// real part + VMULL qT1,dXi1,dW1r + VMLAL qT1,dXr1,dW1i @// imag part + + .ENDIF + + @// Load the first twiddle for 4 groups : w^1 + @// w^1 twiddle (i+0,i+1,i+2,i+3) for group 0,1,2,3 + + VLD2 {dW1r,dW1i}, [pw1, :128]! + + .ifeqs "\inverse", "TRUE" + VMULL qT2,dXr2,dW2r + VMLAL qT2,dXi2,dW2i @// real part + VMULL qT3,dXi2,dW2r + VMLSL qT3,dXr2,dW2i @// imag part + + .ELSE + VMULL qT2,dXr2,dW2r + VMLSL qT2,dXi2,dW2i @// real part + VMULL qT3,dXi2,dW2r + VMLAL qT3,dXr2,dW2i @// imag part + + .ENDIF + + VRSHRN dZr1,qT0,#15 + VRSHRN dZi1,qT1,#15 + + + + .ifeqs "\inverse", "TRUE" + VMULL qT0,dXr3,dW3r + VMLAL qT0,dXi3,dW3i @// real part + VMULL qT1,dXi3,dW3r + VMLSL qT1,dXr3,dW3i @// imag part + + .ELSE + VMULL qT0,dXr3,dW3r + VMLSL qT0,dXi3,dW3i @// real part + VMULL qT1,dXi3,dW3r + VMLAL qT1,dXr3,dW3i @// imag part + + .ENDIF + + @// Load the second twiddle for 4 groups : w^2 + @// w^2 twiddle (2i+0,2i+2,2i+4,2i+6) for group 0,1,2,3 + VLD4 {dW2r,dW2i,dTmp0,dTmp1},[pw2, :256]! + + + VRSHRN dZr2,qT2,#15 + VRSHRN dZi2,qT3,#15 + + @// Load the third twiddle for 4 groups : w^3 + @// w^3 twiddle (3i+0,3i+3,3i+6,3i+9) for group 0,1,2,3 + + VLD3 {dW3rS32,dTmp1S32,dTmp2S32},[pw3, :64]! + + VRSHRN dZr3,qT0,#15 + VRSHRN dZi3,qT1,#15 + + VLD3 {dW3iS32,dTmp2S32,dTmp3S32},[pw3, :64]! + + .ifeqs "\scaled", "TRUE" + + @// finish first stage of 4 point FFT + + VHADD qY0,qX0,qZ2 + VHSUB qY2,qX0,qZ2 + VHADD qY1,qZ1,qZ3 + VLD4 {dButterfly1Real02,dButterfly1Imag02,dButterfly1Real13,dButterfly1Imag13},[pSrc, :256]! @// AC.r AC.i BD.r BD.i + + VHSUB qY3,qZ1,qZ3 + + @// finish second stage of 4 point FFT + + VHSUB qZ0,qY2,qY1 + VHADD qZ2,qY2,qY1 + VLD4 {dButterfly2Real02,dButterfly2Imag02,dButterfly2Real13,dButterfly2Imag13},[pSrc, :256]! @// AC.r AC.i BD.r BD.i + + + .ifeqs "\inverse", "TRUE" + + VHADD dZr3,dYr0,dYi3 @// y3 = u0-ju3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VHSUB dZi3,dYi0,dYr3 + + VHSUB dZr1,dYr0,dYi3 @// y1 = u0+ju3 + VHADD dZi1,dYi0,dYr3 + VST2 {dZr3,dZi3},[pDst, :128],outPointStep + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + VST2 {dZr1,dZi1},[pDst, :128],dstStep @// dstStep = -3*outPointStep + 16 + + .ELSE + + VHSUB dZr1,dYr0,dYi3 @// y1 = u0+ju3 + VHADD dZi1,dYi0,dYr3 + + VHADD dZr3,dYr0,dYi3 @// y3 = u0-ju3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VHSUB dZi3,dYi0,dYr3 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + VST2 {dZr3,dZi3},[pDst, :128],dstStep @// dstStep = -3*outPointStep + 16 + + .ENDIF + + .ELSE + + @// finish first stage of 4 point FFT + + VADD qY0,qX0,qZ2 + VSUB qY2,qX0,qZ2 + VADD qY1,qZ1,qZ3 + VLD4 {dButterfly1Real02,dButterfly1Imag02,dButterfly1Real13,dButterfly1Imag13},[pSrc, :256]! @// AC.r AC.i BD.r BD.i + + VSUB qY3,qZ1,qZ3 + + @// finish second stage of 4 point FFT + + VSUB qZ0,qY2,qY1 + VADD qZ2,qY2,qY1 + VLD4 {dButterfly2Real02,dButterfly2Imag02,dButterfly2Real13,dButterfly2Imag13},[pSrc, :256]! @// AC.r AC.i BD.r BD.i + + + .ifeqs "\inverse", "TRUE" + + VADD dZr3,dYr0,dYi3 @// y3 = u0-ju3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VSUB dZi3,dYi0,dYr3 + + VSUB dZr1,dYr0,dYi3 @// y1 = u0+ju3 + VADD dZi1,dYi0,dYr3 + VST2 {dZr3,dZi3},[pDst, :128],outPointStep + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + VST2 {dZr1,dZi1},[pDst, :128],dstStep @// dstStep = -3*outPointStep + 16 + + .ELSE + + VSUB dZr1,dYr0,dYi3 @// y1 = u0+ju3 + VADD dZi1,dYi0,dYr3 + + VADD dZr3,dYr0,dYi3 @// y3 = u0-ju3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VSUB dZi3,dYi0,dYr3 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + VST2 {dZr3,dZi3},[pDst, :128],dstStep @// dstStep = -3*outPointStep + 16 + + .ENDIF + + + + + .ENDIF + + BGT grpLoop\name + + + @// Reset and Swap pSrc and pDst for the next stage + MOV pTmp,pDst + SUB pSrc,pSrc,#64 @// Extra increment currently done in the loop + SUB pDst,pSrc,outPointStep,LSL #2 @// pDst -= size; pSrc -= 4*size bytes + SUB pSrc,pTmp,outPointStep + + .endm + + + M_START armSP_FFTFwd_CToC_SC16_Radix4_ls_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",FWD + M_END + + + M_START armSP_FFTInv_CToC_SC16_Radix4_ls_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",INV + M_END + + + M_START armSP_FFTFwd_CToC_SC16_Sfs_Radix4_ls_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","FALSE",FWDSFS + M_END + + + M_START armSP_FFTInv_CToC_SC16_Sfs_Radix4_ls_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","TRUE",INVSFS + M_END + + + + + + + .END diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix4_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix4_unsafe_s.S new file mode 100644 index 0000000000..5fc6c7877f --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix4_unsafe_s.S @@ -0,0 +1,400 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. + +@// +@// +@// File Name: armSP_FFT_CToC_SC16_Radix4_unsafe_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 7761 +@// Last Modified Date: Wed, 26 Sep 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute a Radix 4 FFT stage for a N point complex signal +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + + +@// Import symbols required from other files +@// (For example tables) + + + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + +@// Guarding implementation by the processor name + + + + @// Guarding implementation by the processor name + + +@// Import symbols required from other files +@// (For example tables) + + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define subFFTNum r6 +#define subFFTSize r7 + + + +@//Output Registers + + +@//Local Scratch Registers + +#define grpCount r3 +#define pointStep r4 +#define outPointStep r5 +#define stepTwiddle r12 +#define setCount r14 +#define srcStep r8 +#define setStep r9 +#define dstStep r10 +#define twStep r11 +#define t1 r3 + +@// Neon Registers + +#define dW1 D0.S16 +#define dW2 D1.S16 +#define dW3 D2.S16 + +#define dXr0 D4.S16 +#define dXi0 D5.S16 +#define dXr1 D6.S16 +#define dXi1 D7.S16 +#define dXr2 D8.S16 +#define dXi2 D9.S16 +#define dXr3 D10.S16 +#define dXi3 D11.S16 +#define dYr0 D12.S16 +#define dYi0 D13.S16 +#define dYr1 D14.S16 +#define dYi1 D15.S16 +#define dYr2 D16.S16 +#define dYi2 D17.S16 +#define dYr3 D18.S16 +#define dYi3 D19.S16 +#define qT0 Q8.S32 +#define qT1 Q9.S32 +#define qT2 Q6.S32 +#define qT3 Q7.S32 + +#define dZr0 D20.S16 +#define dZi0 D21.S16 +#define dZr1 D22.S16 +#define dZi1 D23.S16 +#define dZr2 D24.S16 +#define dZi2 D25.S16 +#define dZr3 D26.S16 +#define dZi3 D27.S16 +#define qY0 Q6.S16 +#define qY1 Q7.S16 +#define qY2 Q8.S16 +#define qY3 Q9.S16 +#define qX0 Q2.S16 +#define qZ0 Q10.S16 +#define qZ1 Q11.S16 +#define qZ2 Q12.S16 +#define qZ3 Q13.S16 + + + .MACRO FFTSTAGE scaled, inverse , name + + @// Define stack arguments + + + @// Update grpCount and grpSize rightaway inorder to reuse pGrpCount and pGrpSize regs + + LSL grpCount,subFFTSize,#2 + LSR subFFTNum,subFFTNum,#2 + MOV subFFTSize,grpCount + + + @// pOut0+1 increments pOut0 by 4 bytes + @// pOut0+outPointStep == increment of 4*outPointStep bytes = size bytes + + MOV stepTwiddle,#0 + SMULBB outPointStep,grpCount,subFFTNum + + @// pT0+1 increments pT0 by 4 bytes + @// pT0+pointStep = increment of 4*pointStep bytes = grpSize bytes + + LSL pointStep,subFFTNum,#2 @// 2*grpSize + + VLD1 dW1,[pTwiddle, :64] @//[wi | wr] + MOV srcStep,pointStep,LSL #1 @// srcStep = 2*pointStep + VLD1 dW2,[pTwiddle, :64] @//[wi | wr] + ADD setStep,srcStep,pointStep @// setStep = 3*pointStep + SUB srcStep,srcStep,#16 @// srcStep = 2*pointStep-16 + VLD1 dW3,[pTwiddle, :64] + @//RSB setStep,setStep,#16 @// setStep = - 3*pointStep+16 + RSB setStep,setStep,#0 @// setStep = - 3*pointStep + + MOV dstStep,outPointStep,LSL #1 + ADD dstStep,dstStep,outPointStep @// dstStep = 3*outPointStep + RSB dstStep,dstStep,#16 @// dstStep = - 3*outPointStep+16 + + + +grpLoop\name: + + VLD2 {dXr0,dXi0},[pSrc, :128],pointStep @// data[0] + ADD stepTwiddle,stepTwiddle,pointStep + VLD2 {dXr1,dXi1},[pSrc, :128],pointStep @// data[1] + ADD pTwiddle,pTwiddle,stepTwiddle @// set pTwiddle to the first point + VLD2 {dXr2,dXi2},[pSrc, :128],pointStep @// data[2] + MOV twStep,stepTwiddle,LSL #2 + VLD2 {dXr3,dXi3},[pSrc, :128],setStep @// data[3] & reset pSrc + + SUB twStep,stepTwiddle,twStep @// twStep = -3*stepTwiddle + + + MOV setCount,pointStep,LSR #2 + ADD pSrc,pSrc,#16 @// set pSrc to data[0] of the next set + ADD pSrc,pSrc,pointStep @// increment to data[1] of the next set + + @// Loop on the sets : 4 at a time + +setLoop\name: + + SUBS setCount,setCount,#4 @// decrement the loop counter + + .ifeqs "\inverse", "TRUE" + VMULL qT0,dXr1,dW1[0] + VMLAL qT0,dXi1,dW1[1] @// real part + VMULL qT1,dXi1,dW1[0] + VMLSL qT1,dXr1,dW1[1] @// imag part + + .ELSE + VMULL qT0,dXr1,dW1[0] + VMLSL qT0,dXi1,dW1[1] @// real part + VMULL qT1,dXi1,dW1[0] + VMLAL qT1,dXr1,dW1[1] @// imag part + + .ENDIF + + VLD2 {dXr1,dXi1},[pSrc, :128],pointStep @// data[1] + + .ifeqs "\inverse", "TRUE" + VMULL qT2,dXr2,dW2[0] + VMLAL qT2,dXi2,dW2[1] @// real part + VMULL qT3,dXi2,dW2[0] + VMLSL qT3,dXr2,dW2[1] @// imag part + + .ELSE + VMULL qT2,dXr2,dW2[0] + VMLSL qT2,dXi2,dW2[1] @// real part + VMULL qT3,dXi2,dW2[0] + VMLAL qT3,dXr2,dW2[1] @// imag part + + .ENDIF + + VRSHRN dZr1,qT0,#15 + VRSHRN dZi1,qT1,#15 + + + VLD2 {dXr2,dXi2},[pSrc, :128],pointStep @// data[2] + + .ifeqs "\inverse", "TRUE" + VMULL qT0,dXr3,dW3[0] + VMLAL qT0,dXi3,dW3[1] @// real part + VMULL qT1,dXi3,dW3[0] + VMLSL qT1,dXr3,dW3[1] @// imag part + + .ELSE + VMULL qT0,dXr3,dW3[0] + VMLSL qT0,dXi3,dW3[1] @// real part + VMULL qT1,dXi3,dW3[0] + VMLAL qT1,dXr3,dW3[1] @// imag part + + .ENDIF + + VRSHRN dZr2,qT2,#15 + VRSHRN dZi2,qT3,#15 + + + VRSHRN dZr3,qT0,#15 + VRSHRN dZi3,qT1,#15 + VLD2 {dXr3,dXi3},[pSrc, :128],setStep @// data[3] & update pSrc for the next set + + + .ifeqs "\scaled", "TRUE" + + @// finish first stage of 4 point FFT + VHADD qY0,qX0,qZ2 + VHSUB qY2,qX0,qZ2 + + VLD2 {dXr0,dXi0},[pSrc, :128]! @// data[0] + VHADD qY1,qZ1,qZ3 + VHSUB qY3,qZ1,qZ3 + + + @// finish second stage of 4 point FFT + + .ifeqs "\inverse", "TRUE" + + VHSUB qZ0,qY2,qY1 + + VHADD dZr2,dYr0,dYi3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VHSUB dZi2,dYi0,dYr3 + + VHADD qZ1,qY2,qY1 + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + + VHSUB dZr3,dYr0,dYi3 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + VHADD dZi3,dYi0,dYr3 + VST2 {dZr3,dZi3},[pDst, :128],dstStep + + + .ELSE + + VHSUB qZ0,qY2,qY1 + + VHSUB dZr3,dYr0,dYi3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VHADD dZi3,dYi0,dYr3 + + VHADD qZ1,qY2,qY1 + VST2 {dZr3,dZi3},[pDst, :128],outPointStep + + VHADD dZr2,dYr0,dYi3 + VHSUB dZi2,dYi0,dYr3 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + VST2 {dZr2,dZi2},[pDst, :128],dstStep + + + .ENDIF + + + .ELSE + + @// finish first stage of 4 point FFT + VADD qY0,qX0,qZ2 + VSUB qY2,qX0,qZ2 + + VLD2 {dXr0,dXi0},[pSrc]! @// data[0] + VADD qY1,qZ1,qZ3 + VSUB qY3,qZ1,qZ3 + + + @// finish second stage of 4 point FFT + + + .ifeqs "\inverse", "TRUE" + + VSUB qZ0,qY2,qY1 + + VADD dZr2,dYr0,dYi3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VSUB dZi2,dYi0,dYr3 + + VADD qZ1,qY2,qY1 + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + + VSUB dZr3,dYr0,dYi3 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + VADD dZi3,dYi0,dYr3 + VST2 {dZr3,dZi3},[pDst, :128],dstStep + + + .ELSE + + VSUB qZ0,qY2,qY1 + + VSUB dZr3,dYr0,dYi3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VADD dZi3,dYi0,dYr3 + + VADD qZ1,qY2,qY1 + VST2 {dZr3,dZi3},[pDst, :128],outPointStep + + VADD dZr2,dYr0,dYi3 + VSUB dZi2,dYi0,dYr3 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + VST2 {dZr2,dZi2},[pDst, :128],dstStep + + + .ENDIF + + + + .ENDIF + + ADD pSrc,pSrc,pointStep @// increment to data[1] of the next set + BGT setLoop\name + + VLD1 dW1,[pTwiddle, :64],stepTwiddle @//[wi | wr] + SUBS grpCount,grpCount,#4 @// subtract 4 since grpCount multiplied by 4 + VLD1 dW2,[pTwiddle, :64],stepTwiddle @//[wi | wr] + ADD pSrc,pSrc,srcStep @// increment pSrc for the next grp + VLD1 dW3,[pTwiddle, :64],twStep @//[wi | wr] + + + + BGT grpLoop\name + + + @// Reset and Swap pSrc and pDst for the next stage + MOV t1,pDst + SUB pDst,pSrc,outPointStep,LSL #2 @// pDst -= size; pSrc -= 4*size bytes + SUB pSrc,t1,outPointStep + + + .endm + + + M_START armSP_FFTFwd_CToC_SC16_Radix4_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",FWD + M_END + + + M_START armSP_FFTInv_CToC_SC16_Radix4_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",INV + M_END + + + M_START armSP_FFTFwd_CToC_SC16_Sfs_Radix4_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","FALSE",FWDSFS + M_END + + + M_START armSP_FFTInv_CToC_SC16_Sfs_Radix4_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","TRUE",INVSFS + M_END + + + + + + .END diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix8_fs_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix8_fs_unsafe_s.S new file mode 100644 index 0000000000..b67260e22d --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC16_Radix8_fs_unsafe_s.S @@ -0,0 +1,619 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. + +@// +@// +@// File Name: armSP_FFT_CToC_SC16_Radix8_fs_unsafe_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 7766 +@// Last Modified Date: Thu, 27 Sep 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute a first stage Radix 8 FFT stage for a N point complex signal +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + +@// Guarding implementation by the processor name + + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define subFFTNum r6 +#define subFFTSize r7 +@// dest buffer for the next stage (not pSrc for first stage) +#define pPingPongBuf r5 + + +@//Output Registers + + +@//Local Scratch Registers + +#define grpSize r3 +@// Reuse grpSize as setCount +#define setCount r3 +#define pointStep r4 +#define outPointStep r4 +#define setStep r8 +#define step1 r9 +#define step2 r10 +#define t0 r11 + + +@// Neon Registers + +#define dXr0 D14.S16 +#define dXi0 D15.S16 +#define dXr1 D2.S16 +#define dXi1 D3.S16 +#define dXr2 D4.S16 +#define dXi2 D5.S16 +#define dXr3 D6.S16 +#define dXi3 D7.S16 +#define dXr4 D8.S16 +#define dXi4 D9.S16 +#define dXr5 D10.S16 +#define dXi5 D11.S16 +#define dXr6 D12.S16 +#define dXi6 D13.S16 +#define dXr7 D0.S16 +#define dXi7 D1.S16 +#define qX0 Q7.S16 +#define qX1 Q1.S16 +#define qX2 Q2.S16 +#define qX3 Q3.S16 +#define qX4 Q4.S16 +#define qX5 Q5.S16 +#define qX6 Q6.S16 +#define qX7 Q0.S16 + +#define dUr0 D16.S16 +#define dUi0 D17.S16 +#define dUr2 D18.S16 +#define dUi2 D19.S16 +#define dUr4 D20.S16 +#define dUi4 D21.S16 +#define dUr6 D22.S16 +#define dUi6 D23.S16 +#define dUr1 D24.S16 +#define dUi1 D25.S16 +#define dUr3 D26.S16 +#define dUi3 D27.S16 +#define dUr5 D28.S16 +#define dUi5 D29.S16 +@// reuse dXr7 and dXi7 +#define dUr7 D30.S16 +#define dUi7 D31.S16 +#define qU0 Q8.S16 +#define qU1 Q12.S16 +#define qU2 Q9.S16 +#define qU3 Q13.S16 +#define qU4 Q10.S16 +#define qU5 Q14.S16 +#define qU6 Q11.S16 +#define qU7 Q15.S16 + + + +#define dVr0 D24.S16 +#define dVi0 D25.S16 +#define dVr2 D26.S16 +#define dVi2 D27.S16 +#define dVr4 D28.S16 +#define dVi4 D29.S16 +#define dVr6 D30.S16 +#define dVi6 D31.S16 +#define dVr1 D16.S16 +#define dVi1 D17.S16 +#define dVr3 D18.S16 +#define dVi3 D19.S16 +#define dVr5 D20.S16 +#define dVi5 D21.S16 +@// reuse dUi7 +#define dVr7 D22.S16 +@// reuse dUr7 +#define dVi7 D23.S16 +#define qV0 Q12.S16 +#define qV1 Q8.S16 +#define qV2 Q13.S16 +#define qV3 Q9.S16 +#define qV4 Q14.S16 +#define qV5 Q10.S16 +#define qV6 Q15.S16 +#define qV7 Q11.S16 + + + +#define dYr0 D16.S16 +#define dYi0 D17.S16 +#define dYr2 D18.S16 +#define dYi2 D19.S16 +#define dYr4 D20.S16 +#define dYi4 D21.S16 +#define dYr6 D22.S16 +#define dYi6 D23.S16 +#define dYr1 D24.S16 +#define dYi1 D25.S16 +#define dYr3 D26.S16 +#define dYi3 D27.S16 +#define dYr5 D28.S16 +#define dYi5 D29.S16 +@// reuse dYr4 and dYi4 +#define dYr7 D30.S16 +#define dYi7 D31.S16 +#define qY0 Q8.S16 +#define qY1 Q12.S16 +#define qY2 Q9.S16 +#define qY3 Q13.S16 +#define qY4 Q10.S16 +#define qY5 Q14.S16 +#define qY6 Q11.S16 +#define qY7 Q15.S16 + + +#define dT0 D0.S16 +#define dT1 D1.S16 + + +@// Define constants + .set ONEBYSQRT2, 0x00005A82 @// Q15 format + + + .MACRO FFTSTAGE scaled, inverse , name + + @// Define stack arguments + + @// Update pSubFFTSize and pSubFFTNum regs + MOV subFFTSize,#8 @// subFFTSize = 1 for the first stage + LDR t0,=ONEBYSQRT2 @// t0=(1/sqrt(2)) as Q15 format + + @// Note: setCount = subFFTNum/8 (reuse the grpSize reg for setCount) + LSR grpSize,subFFTNum,#3 + MOV subFFTNum,grpSize + + + @// pT0+1 increments pT0 by 4 bytes + @// pT0+pointStep = increment of 4*pointStep bytes = grpSize/2 bytes + @// Note: outPointStep = pointStep for firststage + + MOV pointStep,grpSize,LSL #2 + + + @// Calculate the step of input data for the next set + @//MOV step1,pointStep,LSL #1 @// step1 = 2*pointStep + VLD2 {dXr0,dXi0},[pSrc, :128],pointStep @// data[0] + MOV step1,grpSize,LSL #3 + + MOV step2,pointStep,LSL #3 + VLD2 {dXr1,dXi1},[pSrc, :128],pointStep @// data[1] + SUB step2,step2,pointStep @// step2 = 7*pointStep + RSB setStep,step2,#16 @// setStep = - 7*pointStep+16 + + + + VLD2 {dXr2,dXi2},[pSrc, :128],pointStep @// data[2] + VLD2 {dXr3,dXi3},[pSrc, :128],pointStep @// data[3] + VLD2 {dXr4,dXi4},[pSrc, :128],pointStep @// data[4] + VLD2 {dXr5,dXi5},[pSrc, :128],pointStep @// data[5] + VLD2 {dXr6,dXi6},[pSrc, :128],pointStep @// data[6] + VLD2 {dXr7,dXi7},[pSrc, :128],setStep @// data[7] & update pSrc for the next set + @// setStep = -7*pointStep + 16 + @// grp = 0 a special case since all the twiddle factors are 1 + @// Loop on the sets : 4 sets at a time + +grpZeroSetLoop\name: + + @// Decrement setcount + SUBS setCount,setCount,#4 @// decrement the set loop counter + + + .ifeqs "\scaled", "TRUE" + @// finish first stage of 8 point FFT + + VHADD qU0,qX0,qX4 + VHADD qU2,qX1,qX5 + VHADD qU4,qX2,qX6 + VHADD qU6,qX3,qX7 + + @// finish second stage of 8 point FFT + + VHADD qV0,qU0,qU4 + VHSUB qV2,qU0,qU4 + VHADD qV4,qU2,qU6 + VHSUB qV6,qU2,qU6 + + @// finish third stage of 8 point FFT + + VHADD qY0,qV0,qV4 + VHSUB qY4,qV0,qV4 + VST2 {dYr0,dYi0},[pDst, :128],step1 @// store y0 + + .ifeqs "\inverse", "TRUE" + + VHSUB dYr2,dVr2,dVi6 + VHADD dYi2,dVi2,dVr6 + + VHADD dYr6,dVr2,dVi6 + VST2 {dYr2,dYi2},[pDst, :128],step1 @// store y2 + VHSUB dYi6,dVi2,dVr6 + + VHSUB qU1,qX0,qX4 + VST2 {dYr4,dYi4},[pDst, :128],step1 @// store y4 + + VHSUB qU3,qX1,qX5 + VHSUB qU5,qX2,qX6 + VST2 {dYr6,dYi6},[pDst, :128],step1 @// store y6 + + .ELSE + + VHADD dYr6,dVr2,dVi6 + VHSUB dYi6,dVi2,dVr6 + + VHSUB dYr2,dVr2,dVi6 + VST2 {dYr6,dYi6},[pDst, :128],step1 @// store y2 + VHADD dYi2,dVi2,dVr6 + + + VHSUB qU1,qX0,qX4 + VST2 {dYr4,dYi4},[pDst, :128],step1 @// store y4 + VHSUB qU3,qX1,qX5 + VHSUB qU5,qX2,qX6 + VST2 {dYr2,dYi2},[pDst, :128],step1 @// store y6 + + + .ENDIF + + @// finish first stage of 8 point FFT + + VHSUB qU7,qX3,qX7 + VMOV dT0[0],t0 + + @// finish second stage of 8 point FFT + + VHSUB dVr1,dUr1,dUi5 + VLD2 {dXr0,dXi0},[pSrc, :128],pointStep @// data[0] for next iteration + VHADD dVi1,dUi1,dUr5 + VHADD dVr3,dUr1,dUi5 + VLD2 {dXr1,dXi1},[pSrc, :128],pointStep @// data[1] + VHSUB dVi3,dUi1,dUr5 + + VHSUB dVr5,dUr3,dUi7 + VLD2 {dXr2,dXi2},[pSrc, :128],pointStep @// data[2] + VHADD dVi5,dUi3,dUr7 + VHADD dVr7,dUr3,dUi7 + VLD2 {dXr3,dXi3},[pSrc, :128],pointStep @// data[3] + VHSUB dVi7,dUi3,dUr7 + + @// finish third stage of 8 point FFT + + .ifeqs "\inverse", "TRUE" + + @// calculate a*v5 + VQRDMULH dT1,dVr5,dT0[0] @// use dVi0 for dT1 + VLD2 {dXr4,dXi4},[pSrc, :128],pointStep @// data[4] + VQRDMULH dVi5,dVi5,dT0[0] + + VLD2 {dXr5,dXi5},[pSrc, :128],pointStep @// data[5] + VSUB dVr5,dT1,dVi5 @// a * V5 + VADD dVi5,dT1,dVi5 + + VLD2 {dXr6,dXi6},[pSrc, :128],pointStep @// data[6] + + @// calculate b*v7 + VQRDMULH dT1,dVr7,dT0[0] + VQRDMULH dVi7,dVi7,dT0[0] + + VHADD qY1,qV1,qV5 + VHSUB qY5,qV1,qV5 + + + VADD dVr7,dT1,dVi7 @// b * V7 + VSUB dVi7,dVi7,dT1 + SUB pDst, pDst, step2 @// set pDst to y1 + + VLD2 {dXr7,dXi7},[pSrc, :128],setStep @// data[7] + + + VHSUB dYr3,dVr3,dVr7 + VHSUB dYi3,dVi3,dVi7 + VST2 {dYr1,dYi1},[pDst, :128],step1 @// store y1 + VHADD dYr7,dVr3,dVr7 + VHADD dYi7,dVi3,dVi7 + + + VST2 {dYr3,dYi3},[pDst, :128],step1 @// store y3 + VST2 {dYr5,dYi5},[pDst, :128],step1 @// store y5 +#if 0 + VST2 {dYr7,dYi7},[pDst, :128],#16 @// store y7 +#else + VST2 {dYr7,dYi7},[pDst, :128]! @// store y7 +#endif + .ELSE + + @// calculate b*v7 + VQRDMULH dT1,dVr7,dT0[0] + VLD2 {dXr4,dXi4},[pSrc, :128],pointStep @// data[4] + VQRDMULH dVi7,dVi7,dT0[0] + + VLD2 {dXr5,dXi5},[pSrc, :128],pointStep @// data[5] + VADD dVr7,dT1,dVi7 @// b * V7 + VSUB dVi7,dVi7,dT1 + + VLD2 {dXr6,dXi6},[pSrc, :128],pointStep @// data[6] + + @// calculate a*v5 + VQRDMULH dT1,dVr5,dT0[0] @// use dVi0 for dT1 + VQRDMULH dVi5,dVi5,dT0[0] + + VHADD dYr7,dVr3,dVr7 + VHADD dYi7,dVi3,dVi7 + SUB pDst, pDst, step2 @// set pDst to y1 + + VSUB dVr5,dT1,dVi5 @// a * V5 + VADD dVi5,dT1,dVi5 + VLD2 {dXr7,dXi7},[pSrc, :128],setStep @// data[7] + + VHSUB qY5,qV1,qV5 + + VHSUB dYr3,dVr3,dVr7 + VST2 {dYr7,dYi7},[pDst, :128],step1 @// store y1 + VHSUB dYi3,dVi3,dVi7 + VHADD qY1,qV1,qV5 + + + VST2 {dYr5,dYi5},[pDst, :128],step1 @// store y3 + VST2 {dYr3,dYi3},[pDst, :128],step1 @// store y5 +#if 0 + VST2 {dYr1,dYi1},[pDst, :128],#16 @// store y7 +#else + VST2 {dYr1,dYi1},[pDst, :128]! @// store y7 +#endif + + .ENDIF + + + + .ELSE + @// finish first stage of 8 point FFT + + VADD qU0,qX0,qX4 + VADD qU2,qX1,qX5 + VADD qU4,qX2,qX6 + VADD qU6,qX3,qX7 + + @// finish second stage of 8 point FFT + + VADD qV0,qU0,qU4 + VSUB qV2,qU0,qU4 + VADD qV4,qU2,qU6 + VSUB qV6,qU2,qU6 + + @// finish third stage of 8 point FFT + + VADD qY0,qV0,qV4 + VSUB qY4,qV0,qV4 + VST2 {dYr0,dYi0},[pDst, :128],step1 @// store y0 + + .ifeqs "\inverse", "TRUE" + + VSUB dYr2,dVr2,dVi6 + VADD dYi2,dVi2,dVr6 + + VADD dYr6,dVr2,dVi6 + VST2 {dYr2,dYi2},[pDst, :128],step1 @// store y2 + VSUB dYi6,dVi2,dVr6 + + VSUB qU1,qX0,qX4 + VST2 {dYr4,dYi4},[pDst, :128],step1 @// store y4 + + VSUB qU3,qX1,qX5 + VSUB qU5,qX2,qX6 + VST2 {dYr6,dYi6},[pDst, :128],step1 @// store y6 + + .ELSE + + VADD dYr6,dVr2,dVi6 + VSUB dYi6,dVi2,dVr6 + + VSUB dYr2,dVr2,dVi6 + VST2 {dYr6,dYi6},[pDst, :128],step1 @// store y2 + VADD dYi2,dVi2,dVr6 + + + VSUB qU1,qX0,qX4 + VST2 {dYr4,dYi4},[pDst, :128],step1 @// store y4 + VSUB qU3,qX1,qX5 + VSUB qU5,qX2,qX6 + VST2 {dYr2,dYi2},[pDst, :128],step1 @// store y6 + + + .ENDIF + + @// finish first stage of 8 point FFT + + VSUB qU7,qX3,qX7 + VMOV dT0[0],t0 + + @// finish second stage of 8 point FFT + + VSUB dVr1,dUr1,dUi5 + VLD2 {dXr0,dXi0},[pSrc, :128],pointStep @// data[0] for next iteration + VADD dVi1,dUi1,dUr5 + VADD dVr3,dUr1,dUi5 + VLD2 {dXr1,dXi1},[pSrc, :128],pointStep @// data[1] + VSUB dVi3,dUi1,dUr5 + + VSUB dVr5,dUr3,dUi7 + VLD2 {dXr2,dXi2},[pSrc, :128],pointStep @// data[2] + VADD dVi5,dUi3,dUr7 + VADD dVr7,dUr3,dUi7 + VLD2 {dXr3,dXi3},[pSrc, :128],pointStep @// data[3] + VSUB dVi7,dUi3,dUr7 + + @// finish third stage of 8 point FFT + + .ifeqs "\inverse", "TRUE" + + @// calculate a*v5 + VQRDMULH dT1,dVr5,dT0[0] @// use dVi0 for dT1 + VLD2 {dXr4,dXi4},[pSrc, :128],pointStep @// data[4] + VQRDMULH dVi5,dVi5,dT0[0] + + VLD2 {dXr5,dXi5},[pSrc, :128],pointStep @// data[5] + VSUB dVr5,dT1,dVi5 @// a * V5 + VADD dVi5,dT1,dVi5 + + VLD2 {dXr6,dXi6},[pSrc, :128],pointStep @// data[6] + + @// calculate b*v7 + VQRDMULH dT1,dVr7,dT0[0] + VQRDMULH dVi7,dVi7,dT0[0] + + VADD qY1,qV1,qV5 + VSUB qY5,qV1,qV5 + + + VADD dVr7,dT1,dVi7 @// b * V7 + VSUB dVi7,dVi7,dT1 + SUB pDst, pDst, step2 @// set pDst to y1 + + VLD2 {dXr7,dXi7},[pSrc, :128],setStep @// data[7] + + + VSUB dYr3,dVr3,dVr7 + VSUB dYi3,dVi3,dVi7 + VST2 {dYr1,dYi1},[pDst, :128],step1 @// store y1 + VADD dYr7,dVr3,dVr7 + VADD dYi7,dVi3,dVi7 + + + VST2 {dYr3,dYi3},[pDst, :128],step1 @// store y3 + VST2 {dYr5,dYi5},[pDst, :128],step1 @// store y5 +#if 0 + VST2 {dYr7,dYi7},[pDst, :128],#16 @// store y7 +#else + VST2 {dYr7,dYi7},[pDst, :128]! @// store y7 +#endif + .ELSE + + @// calculate b*v7 + VQRDMULH dT1,dVr7,dT0[0] + VLD2 {dXr4,dXi4},[pSrc, :128],pointStep @// data[4] + VQRDMULH dVi7,dVi7,dT0[0] + + VLD2 {dXr5,dXi5},[pSrc, :128],pointStep @// data[5] + VADD dVr7,dT1,dVi7 @// b * V7 + VSUB dVi7,dVi7,dT1 + + VLD2 {dXr6,dXi6},[pSrc, :128],pointStep @// data[6] + + @// calculate a*v5 + VQRDMULH dT1,dVr5,dT0[0] @// use dVi0 for dT1 + VQRDMULH dVi5,dVi5,dT0[0] + + VADD dYr7,dVr3,dVr7 + VADD dYi7,dVi3,dVi7 + SUB pDst, pDst, step2 @// set pDst to y1 + + VSUB dVr5,dT1,dVi5 @// a * V5 + VADD dVi5,dT1,dVi5 + VLD2 {dXr7,dXi7},[pSrc, :128],setStep @// data[7] + + VSUB qY5,qV1,qV5 + + VSUB dYr3,dVr3,dVr7 + VST2 {dYr7,dYi7},[pDst, :128],step1 @// store y1 + VSUB dYi3,dVi3,dVi7 + VADD qY1,qV1,qV5 + + + VST2 {dYr5,dYi5},[pDst, :128],step1 @// store y3 + VST2 {dYr3,dYi3},[pDst, :128],step1 @// store y5 +#if 0 + VST2 {dYr1,dYi1},[pDst, :128],#16 @// store y7 +#else + VST2 {dYr1,dYi1},[pDst, :128]! @// store y7 +#endif + + .ENDIF + + + .ENDIF + + SUB pDst, pDst, step2 @// update pDst for the next set + BGT grpZeroSetLoop\name + + + @// reset pSrc to pDst for the next stage + SUB pSrc,pDst,pointStep @// pDst -= 2*grpSize + MOV pDst,pPingPongBuf + + + + .endm + + + @// Allocate stack memory required by the function + + + M_START armSP_FFTFwd_CToC_SC16_Radix8_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",FWD + M_END + + + M_START armSP_FFTInv_CToC_SC16_Radix8_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",INV + M_END + + + M_START armSP_FFTFwd_CToC_SC16_Sfs_Radix8_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","FALSE",FWDSFS + M_END + + + M_START armSP_FFTInv_CToC_SC16_Sfs_Radix8_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","TRUE",INVSFS + M_END + + + + + + .END diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix2_fs_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix2_fs_unsafe_s.S new file mode 100644 index 0000000000..3bc5f02a74 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix2_fs_unsafe_s.S @@ -0,0 +1,163 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. + +@// +@// +@// File Name: armSP_FFT_CToC_SC32_Radix2_fs_unsafe_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 5995 +@// Last Modified Date: Fri, 08 Jun 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute the first stage of a Radix 2 DIT in-order out-of-place FFT +@// stage for a N point complex signal. +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + +@// Guarding implementation by the processor name + + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define pPingPongBuf r5 +#define subFFTNum r6 +#define subFFTSize r7 + + +@//Output Registers + + +@//Local Scratch Registers + +#define pointStep r3 +#define outPointStep r3 +#define grpSize r4 +#define setCount r4 +#define step r8 +#define dstStep r8 + +@// Neon Registers + +#define dX0 D0.S32 +#define dX1 D1.S32 +#define dY0 D2.S32 +#define dY1 D3.S32 + + + .MACRO FFTSTAGE scaled, inverse, name + + @// Define stack arguments + + + @// update subFFTSize and subFFTNum into RN6 and RN7 for the next stage + + + MOV subFFTSize,#2 + LSR grpSize,subFFTNum,#1 + MOV subFFTNum,grpSize + + + @// pT0+1 increments pT0 by 8 bytes + @// pT0+pointStep = increment of 8*pointStep bytes = 4*grpSize bytes + @// Note: outPointStep = pointStep for firststage + @// Note: setCount = grpSize/2 (reuse the updated grpSize for setCount) + + MOV pointStep,grpSize,LSL #3 + RSB step,pointStep,#8 + + + @// Loop on the sets for grp zero + +grpZeroSetLoop\name : + + VLD1 dX0,[pSrc],pointStep + VLD1 dX1,[pSrc],step @// step = -pointStep + 8 + SUBS setCount,setCount,#1 @// decrement the loop counter + + .ifeqs "\scaled", "TRUE" + + VHADD dY0,dX0,dX1 + VHSUB dY1,dX0,dX1 + + .ELSE + + VADD dY0,dX0,dX1 + VSUB dY1,dX0,dX1 + + + .ENDIF + + VST1 dY0,[pDst],outPointStep + VST1 dY1,[pDst],dstStep @// dstStep = step = -pointStep + 8 + + BGT grpZeroSetLoop\name + + + @// reset pSrc to pDst for the next stage + SUB pSrc,pDst,pointStep @// pDst -= 2*grpSize + MOV pDst,pPingPongBuf + + .endm + + + + M_START armSP_FFTFwd_CToC_SC32_Radix2_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",fwd + M_END + + + + M_START armSP_FFTInv_CToC_SC32_Radix2_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",inv + M_END + + + + M_START armSP_FFTFwd_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","FALSE",fwdsfs + M_END + + + + M_START armSP_FFTInv_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","TRUE",invsfs + M_END + + .end diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix2_ls_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix2_ls_unsafe_s.S new file mode 100644 index 0000000000..b5b039011d --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix2_ls_unsafe_s.S @@ -0,0 +1,184 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. +@// + +@// +@// File Name: armSP_FFT_CToC_SC32_Radix2_ls_unsafe_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 7493 +@// Last Modified Date: Mon, 24 Sep 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute the last stage of a Radix 2 DIT in-order out-of-place FFT +@// stage for a N point complex signal. +@// + + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + +@// Guarding implementation by the processor name + + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define subFFTNum r6 +#define subFFTSize r7 + + +@//Output Registers + + +@//Local Scratch Registers + + +#define outPointStep r3 +#define grpCount r4 +#define dstStep r5 +#define pTmp r4 + +@// Neon Registers + +#define dWr D0.S32 +#define dWi d1.s32 +#define dXr0 d2.s32 +#define dXi0 d3.s32 +#define dXr1 d4.s32 +#define dXi1 d5.s32 +#define dYr0 d6.s32 +#define dYi0 d7.s32 +#define dYr1 d8.s32 +#define dYi1 d9.s32 +#define qT0 q5.s64 +#define qT1 q6.s64 + + .macro FFTSTAGE scaled, inverse, name + + + MOV outPointStep,subFFTSize,LSL #3 + @// Update grpCount and grpSize rightaway + + MOV subFFTNum,#1 @//after the last stage + LSL grpCount,subFFTSize,#1 + + @// update subFFTSize for the next stage + MOV subFFTSize,grpCount + + RSB dstStep,outPointStep,#16 + + + @// Loop on 2 grps at a time for the last stage + +grpLoop\name : + VLD2 {dWr,dWi},[pTwiddle, :64]! + + VLD4 {dXr0,dXi0,dXr1,dXi1},[pSrc, :128]! + SUBS grpCount,grpCount,#4 @// grpCount is multiplied by 2 + + .ifeqs "\inverse", "TRUE" + VMULL qT0,dWr,dXr1 + VMLAL qT0,dWi,dXi1 @// real part + VMULL qT1,dWr,dXi1 + VMLSL qT1,dWi,dXr1 @// imag part + + .else + + VMULL qT0,dWr,dXr1 + VMLSL qT0,dWi,dXi1 @// real part + VMULL qT1,dWr,dXi1 + VMLAL qT1,dWi,dXr1 @// imag part + + .endif + + VRSHRN dXr1,qT0,#31 + VRSHRN dXi1,qT1,#31 + + + .ifeqs "\scaled", "TRUE" + + VHSUB dYr0,dXr0,dXr1 + VHSUB dYi0,dXi0,dXi1 + VHADD dYr1,dXr0,dXr1 + VHADD dYi1,dXi0,dXi1 + + .else + + VSUB dYr0,dXr0,dXr1 + VSUB dYi0,dXi0,dXi1 + VADD dYr1,dXr0,dXr1 + VADD dYi1,dXi0,dXi1 + + + .endif + + VST2 {dYr0,dYi0},[pDst],outPointStep + VST2 {dYr1,dYi1},[pDst],dstStep @// dstStep = step = -outPointStep + 16 + + bgt grpLoop\name + + + @// Reset and Swap pSrc and pDst for the next stage + MOV pTmp,pDst + SUB pDst,pSrc,outPointStep,LSL #1 @// pDst -= 4*size; pSrc -= 8*size bytes + SUB pSrc,pTmp,outPointStep + + @// Reset pTwiddle for the next stage + SUB pTwiddle,pTwiddle,outPointStep @// pTwiddle -= 4*size bytes + + .endm + + + + M_START armSP_FFTFwd_CToC_SC32_Radix2_ls_OutOfPlace_unsafe,r4,"" + FFTSTAGE "FALSE","FALSE",fwd + M_END + + + + M_START armSP_FFTInv_CToC_SC32_Radix2_ls_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",inv + M_END + + + + M_START armSP_FFTFwd_CToC_SC32_Sfs_Radix2_ls_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","FALSE",fwdsfs + M_END + + + + M_START armSP_FFTInv_CToC_SC32_Sfs_Radix2_ls_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","TRUE",invsfs + M_END + + .end diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix2_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix2_unsafe_s.S new file mode 100644 index 0000000000..a9700ec3ea --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix2_unsafe_s.S @@ -0,0 +1,216 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. +@// + +@// +@// File Name: armSP_FFT_CToC_SC32_Radix2_unsafe_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 5638 +@// Last Modified Date: Wed, 06 Jun 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute a Radix 2 DIT in-order out-of-place FFT stage for a N point complex signal. +@// This handle the general stage, not the first or last stage. +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + +@// Guarding implementation by the processor name + + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define subFFTNum r6 +#define subFFTSize r7 + + +@//Output Registers + + +@//Local Scratch Registers + +#define outPointStep r3 +#define pointStep r4 +#define grpCount r5 +#define setCount r8 +@//const RN 9 +#define step r10 +#define dstStep r11 +#define pTable r9 +#define pTmp r9 + +@// Neon Registers + +#define dW D0.S32 +#define dX0 D2.S32 +#define dX1 D3.S32 +#define dX2 D4.S32 +#define dX3 D5.S32 +#define dY0 D6.S32 +#define dY1 D7.S32 +#define dY2 D8.S32 +#define dY3 D9.S32 +#define qT0 Q3.S64 +#define qT1 Q4.S64 + + + + .MACRO FFTSTAGE scaled, inverse, name + + @// Define stack arguments + + + @// Update grpCount and grpSize rightaway inorder to reuse pGrpCount and pGrpSize regs + + LSR subFFTNum,subFFTNum,#1 @//grpSize + LSL grpCount,subFFTSize,#1 + + + @// pT0+1 increments pT0 by 8 bytes + @// pT0+pointStep = increment of 8*pointStep bytes = 4*grpSize bytes + MOV pointStep,subFFTNum,LSL #2 + + @// update subFFTSize for the next stage + MOV subFFTSize,grpCount + + @// pOut0+1 increments pOut0 by 8 bytes + @// pOut0+outPointStep == increment of 8*outPointStep bytes = 4*size bytes + SMULBB outPointStep,grpCount,pointStep + LSL pointStep,pointStep,#1 + + + RSB step,pointStep,#16 + RSB dstStep,outPointStep,#16 + + @// Loop on the groups + +grpLoop\name : + MOV setCount,pointStep,LSR #3 + VLD1 dW,[pTwiddle],pointStep @//[wi | wr] + + + @// Loop on the sets + + +setLoop\name : + + + VLD2 {dX0,dX1},[pSrc],pointStep @// point0: dX0-real part dX1-img part + VLD2 {dX2,dX3},[pSrc],step @// point1: dX2-real part dX3-img part + + SUBS setCount,setCount,#2 + + .ifeqs "\inverse", "TRUE" + VMULL qT0,dX2,dW[0] + VMLAL qT0,dX3,dW[1] @// real part + VMULL qT1,dX3,dW[0] + VMLSL qT1,dX2,dW[1] @// imag part + + .else + + VMULL qT0,dX2,dW[0] + VMLSL qT0,dX3,dW[1] @// real part + VMULL qT1,dX3,dW[0] + VMLAL qT1,dX2,dW[1] @// imag part + + .endif + + VRSHRN dX2,qT0,#31 + VRSHRN dX3,qT1,#31 + + .ifeqs "\scaled", "TRUE" + VHSUB dY0,dX0,dX2 + VHSUB dY1,dX1,dX3 + VHADD dY2,dX0,dX2 + VHADD dY3,dX1,dX3 + + .else + VSUB dY0,dX0,dX2 + VSUB dY1,dX1,dX3 + VADD dY2,dX0,dX2 + VADD dY3,dX1,dX3 + + .endif + + VST2 {dY0,dY1},[pDst],outPointStep + VST2 {dY2,dY3},[pDst],dstStep @// dstStep = -outPointStep + 16 + + BGT setLoop\name + + SUBS grpCount,grpCount,#2 + ADD pSrc,pSrc,pointStep + BGT grpLoop\name + + + @// Reset and Swap pSrc and pDst for the next stage + MOV pTmp,pDst + SUB pDst,pSrc,outPointStep,LSL #1 @// pDst -= 4*size; pSrc -= 8*size bytes + SUB pSrc,pTmp,outPointStep + + @// Reset pTwiddle for the next stage + SUB pTwiddle,pTwiddle,outPointStep @// pTwiddle -= 4*size bytes + + + .endm + + + + M_START armSP_FFTFwd_CToC_SC32_Radix2_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",FWD + M_END + + + + M_START armSP_FFTInv_CToC_SC32_Radix2_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",INV + M_END + + + + M_START armSP_FFTFwd_CToC_SC32_Sfs_Radix2_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","FALSE",FWDSFS + M_END + + + + M_START armSP_FFTInv_CToC_SC32_Sfs_Radix2_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","TRUE",INVSFS + M_END + + .end diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix4_fs_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix4_fs_unsafe_s.S new file mode 100644 index 0000000000..4193f8bc71 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix4_fs_unsafe_s.S @@ -0,0 +1,320 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. +@// + +@// +@// File Name: armSP_FFT_CToC_SC32_Radix4_fs_unsafe_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 7767 +@// Last Modified Date: Thu, 27 Sep 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute a first stage Radix 4 FFT stage for a N point complex signal +@// + + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + +@// Import symbols required from other files +@// (For example tables) + + + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + +@// Guarding implementation by the processor name + + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define pPingPongBuf r5 +#define subFFTNum r6 +#define subFFTSize r7 + + +@//Output Registers + + +@//Local Scratch Registers + +#define grpSize r3 +@// Reuse grpSize as setCount +#define setCount r3 +#define pointStep r4 +#define outPointStep r4 +#define setStep r8 +#define step1 r9 +#define step3 r10 + +@// Neon Registers + +#define dXr0 D0.S32 +#define dXi0 D1.S32 +#define dXr1 D2.S32 +#define dXi1 D3.S32 +#define dXr2 D4.S32 +#define dXi2 D5.S32 +#define dXr3 D6.S32 +#define dXi3 D7.S32 +#define dYr0 D8.S32 +#define dYi0 D9.S32 +#define dYr1 D10.S32 +#define dYi1 D11.S32 +#define dYr2 D12.S32 +#define dYi2 D13.S32 +#define dYr3 D14.S32 +#define dYi3 D15.S32 +#define qX0 Q0.S32 +#define qX1 Q1.S32 +#define qX2 Q2.S32 +#define qX3 Q3.S32 +#define qY0 Q4.S32 +#define qY1 Q5.S32 +#define qY2 Q6.S32 +#define qY3 Q7.S32 +#define dZr0 D16.S32 +#define dZi0 D17.S32 +#define dZr1 D18.S32 +#define dZi1 D19.S32 +#define dZr2 D20.S32 +#define dZi2 D21.S32 +#define dZr3 D22.S32 +#define dZi3 D23.S32 +#define qZ0 Q8.S32 +#define qZ1 Q9.S32 +#define qZ2 Q10.S32 +#define qZ3 Q11.S32 + + + .MACRO FFTSTAGE scaled, inverse, name + + @// Define stack arguments + + @// pT0+1 increments pT0 by 8 bytes + @// pT0+pointStep = increment of 8*pointStep bytes = 2*grpSize bytes + @// Note: outPointStep = pointStep for firststage + + MOV pointStep,subFFTNum,LSL #1 + + + @// Update pSubFFTSize and pSubFFTNum regs + VLD2 {dXr0,dXi0},[pSrc, :128],pointStep @// data[0] + MOV subFFTSize,#4 @// subFFTSize = 1 for the first stage + + @// Note: setCount = subFFTNum/4 (reuse the grpSize reg for setCount) + LSR grpSize,subFFTNum,#2 + VLD2 {dXr1,dXi1},[pSrc, :128],pointStep @// data[1] + MOV subFFTNum,grpSize + + + @// Calculate the step of input data for the next set + @//MOV setStep,pointStep,LSL #1 + MOV setStep,grpSize,LSL #4 + VLD2 {dXr2,dXi2},[pSrc, :128],pointStep @// data[2] + ADD setStep,setStep,pointStep @// setStep = 3*pointStep + RSB setStep,setStep,#16 @// setStep = - 3*pointStep+16 + + VLD2 {dXr3,dXi3},[pSrc, :128],setStep @// data[3] & update pSrc for the next set + MOV step1,pointStep,LSL #1 @// step1 = 2*pointStep + + .ifeqs "\scaled", "TRUE" + VHADD qY0,qX0,qX2 + .else + VADD qY0,qX0,qX2 + .endif + + RSB step3,pointStep,#0 @// step3 = -pointStep + + @// grp = 0 a special case since all the twiddle factors are 1 + @// Loop on the sets : 2 sets at a time + +grpZeroSetLoop\name : + + + + @// Decrement setcount + SUBS setCount,setCount,#2 @// decrement the set loop counter + + .ifeqs "\scaled", "TRUE" + + @// finish first stage of 4 point FFT + + VHSUB qY2,qX0,qX2 + + VLD2 {dXr0,dXi0},[pSrc, :128],step1 @// data[0] + VHADD qY1,qX1,qX3 + VLD2 {dXr2,dXi2},[pSrc, :128],step3 @// data[2] + VHSUB qY3,qX1,qX3 + + + @// finish second stage of 4 point FFT + + .ifeqs "\inverse", "TRUE" + + VLD2 {dXr1,dXi1},[pSrc, :128],step1 @// data[1] + VHADD qZ0,qY0,qY1 + + VLD2 {dXr3,dXi3},[pSrc, :128],setStep @// data[3] & update pSrc for the next set + VHSUB dZr3,dYr2,dYi3 + + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VHADD dZi3,dYi2,dYr3 + + VHSUB qZ1,qY0,qY1 + VST2 {dZr3,dZi3},[pDst, :128],outPointStep + + VHADD dZr2,dYr2,dYi3 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + VHSUB dZi2,dYi2,dYr3 + + VHADD qY0,qX0,qX2 @// u0 for next iteration + VST2 {dZr2,dZi2},[pDst, :128],setStep + + + .else + + VLD2 {dXr1,dXi1},[pSrc, :128],step1 @// data[1] + VHADD qZ0,qY0,qY1 + + VLD2 {dXr3,dXi3},[pSrc, :128],setStep @// data[3] & update pSrc for the next set + VHADD dZr2,dYr2,dYi3 + + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VHSUB dZi2,dYi2,dYr3 + + VHSUB qZ1,qY0,qY1 + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + + VHSUB dZr3,dYr2,dYi3 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + VHADD dZi3,dYi2,dYr3 + + VHADD qY0,qX0,qX2 @// u0 for next iteration + VST2 {dZr3,dZi3},[pDst, :128],setStep + + .endif + + + + .else + + @// finish first stage of 4 point FFT + + + VSUB qY2,qX0,qX2 + + VLD2 {dXr0,dXi0},[pSrc, :128],step1 @// data[0] + VADD qY1,qX1,qX3 + VLD2 {dXr2,dXi2},[pSrc, :128],step3 @// data[2] + VSUB qY3,qX1,qX3 + + + @// finish second stage of 4 point FFT + + .ifeqs "\inverse", "TRUE" + + VLD2 {dXr1,dXi1},[pSrc, :128],step1 @// data[1] + VADD qZ0,qY0,qY1 + + VLD2 {dXr3,dXi3},[pSrc, :128],setStep @// data[3] & update pSrc for the next set + VSUB dZr3,dYr2,dYi3 + + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VADD dZi3,dYi2,dYr3 + + VSUB qZ1,qY0,qY1 + VST2 {dZr3,dZi3},[pDst, :128],outPointStep + + VADD dZr2,dYr2,dYi3 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + VSUB dZi2,dYi2,dYr3 + + VADD qY0,qX0,qX2 @// u0 for next iteration + VST2 {dZr2,dZi2},[pDst, :128],setStep + + + .else + + VLD2 {dXr1,dXi1},[pSrc, :128],step1 @// data[1] + VADD qZ0,qY0,qY1 + + VLD2 {dXr3,dXi3},[pSrc, :128],setStep @// data[3] & update pSrc for the next set + VADD dZr2,dYr2,dYi3 + + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VSUB dZi2,dYi2,dYr3 + + VSUB qZ1,qY0,qY1 + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + + VSUB dZr3,dYr2,dYi3 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + VADD dZi3,dYi2,dYr3 + + VADD qY0,qX0,qX2 @// u0 for next iteration + VST2 {dZr3,dZi3},[pDst, :128],setStep + + .endif + + .endif + + BGT grpZeroSetLoop\name + + @// reset pSrc to pDst for the next stage + SUB pSrc,pDst,pointStep @// pDst -= 2*grpSize + MOV pDst,pPingPongBuf + + + .endm + + + + M_START armSP_FFTFwd_CToC_SC32_Radix4_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",fwd + M_END + + + + M_START armSP_FFTInv_CToC_SC32_Radix4_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",inv + M_END + + + M_START armSP_FFTFwd_CToC_SC32_Sfs_Radix4_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","FALSE",fwdsfs + M_END + + + M_START armSP_FFTInv_CToC_SC32_Sfs_Radix4_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","TRUE",invsfs + M_END + + .end diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix4_ls_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix4_ls_unsafe_s.S new file mode 100644 index 0000000000..dc2238a70c --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix4_ls_unsafe_s.S @@ -0,0 +1,404 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. +@// + +@// +@// File Name: armSP_FFT_CToC_SC32_Radix4_ls_unsafe_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 7767 +@// Last Modified Date: Thu, 27 Sep 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute a Radix 4 FFT stage for a N point complex signal +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + +@// Import symbols required from other files +@// (For example tables) + + + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + +@// Guarding implementation by the processor name + + +@// Import symbols required from other files +@// (For example tables) + @//IMPORT armAAC_constTable + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define subFFTNum r6 +#define subFFTSize r7 + + + +@//Output Registers + + +@//Local Scratch Registers + +#define outPointStep r3 +#define grpCount r4 +#define dstStep r5 +#define grpTwStep r8 +#define stepTwiddle r9 +#define twStep r10 +#define pTmp r4 +#define step16 r11 +#define step24 r12 + + +@// Neon Registers + +#define dButterfly1Real02 D0.S32 +#define dButterfly1Imag02 D1.S32 +#define dButterfly1Real13 D2.S32 +#define dButterfly1Imag13 D3.S32 +#define dButterfly2Real02 D4.S32 +#define dButterfly2Imag02 D5.S32 +#define dButterfly2Real13 D6.S32 +#define dButterfly2Imag13 D7.S32 +#define dXr0 D0.S32 +#define dXi0 D1.S32 +#define dXr1 D2.S32 +#define dXi1 D3.S32 +#define dXr2 D4.S32 +#define dXi2 D5.S32 +#define dXr3 D6.S32 +#define dXi3 D7.S32 + +#define dYr0 D16.S32 +#define dYi0 D17.S32 +#define dYr1 D18.S32 +#define dYi1 D19.S32 +#define dYr2 D20.S32 +#define dYi2 D21.S32 +#define dYr3 D22.S32 +#define dYi3 D23.S32 + +#define dW1r D8.S32 +#define dW1i D9.S32 +#define dW2r D10.S32 +#define dW2i D11.S32 +#define dW3r D12.S32 +#define dW3i D13.S32 +#define qT0 Q7.S64 +#define qT1 Q8.S64 +#define qT2 Q9.S64 +#define qT3 Q10.S64 +#define qT4 Q11.S64 +#define qT5 Q12.S64 + +#define dZr0 D14.S32 +#define dZi0 D15.S32 +#define dZr1 D26.S32 +#define dZi1 D27.S32 +#define dZr2 D28.S32 +#define dZi2 D29.S32 +#define dZr3 D30.S32 +#define dZi3 D31.S32 + +#define qX0 Q0.S32 +#define qY0 Q8.S32 +#define qY1 Q9.S32 +#define qY2 Q10.S32 +#define qY3 Q11.S32 +#define qZ0 Q7.S32 +#define qZ1 Q13.S32 +#define qZ2 Q14.S32 +#define qZ3 Q15.S32 + + + + .MACRO FFTSTAGE scaled, inverse , name + + @// Define stack arguments + + + @// pOut0+1 increments pOut0 by 8 bytes + @// pOut0+outPointStep == increment of 8*outPointStep bytes + MOV outPointStep,subFFTSize,LSL #3 + + @// Update grpCount and grpSize rightaway + + VLD2 {dW1r,dW1i},[pTwiddle, :128] @// [wi|wr] + MOV step16,#16 + LSL grpCount,subFFTSize,#2 + + VLD1 dW2r,[pTwiddle, :64] @// [wi|wr] + MOV subFFTNum,#1 @//after the last stage + + VLD1 dW3r,[pTwiddle, :64],step16 @// [wi|wr] + MOV stepTwiddle,#0 + + VLD1 dW2i,[pTwiddle, :64]! @// [wi|wr] + SUB grpTwStep,stepTwiddle,#8 @// grpTwStep = -8 to start with + + @// update subFFTSize for the next stage + MOV subFFTSize,grpCount + VLD1 dW3i,[pTwiddle, :64],grpTwStep @// [wi|wr] + MOV dstStep,outPointStep,LSL #1 + + VLD4 {dButterfly1Real02,dButterfly1Imag02,dButterfly1Real13,dButterfly1Imag13},[pSrc, :256]! @// AC.r AC.i BD.r BD.i + ADD dstStep,dstStep,outPointStep @// dstStep = 3*outPointStep + RSB dstStep,dstStep,#16 @// dstStep = - 3*outPointStep+16 + MOV step24,#24 + + VLD4 {dButterfly2Real02,dButterfly2Imag02,dButterfly2Real13,dButterfly2Imag13},[pSrc, :256]! @// AC.r AC.i BD.r BD.i + + + @// Process two groups at a time + +grpLoop\name : + + VZIP dW2r,dW2i + ADD stepTwiddle,stepTwiddle,#16 @// increment for the next iteration + VZIP dW3r,dW3i + ADD grpTwStep,stepTwiddle,#4 + VUZP dButterfly1Real13, dButterfly2Real13 @// B.r D.r + SUB twStep,stepTwiddle,#16 @// -16+stepTwiddle + VUZP dButterfly1Imag13, dButterfly2Imag13 @// B.i D.i + MOV grpTwStep,grpTwStep,LSL #1 + VUZP dButterfly1Real02, dButterfly2Real02 @// A.r C.r + RSB grpTwStep,grpTwStep,#0 @// -8-2*stepTwiddle + + + VUZP dButterfly1Imag02, dButterfly2Imag02 @// A.i C.i + + + SUBS grpCount,grpCount,#8 @// grpCount is multiplied by 4 + + .ifeqs "\inverse", "TRUE" + VMULL qT0,dW1r,dXr1 + VMLAL qT0,dW1i,dXi1 @// real part + VMULL qT1,dW1r,dXi1 + VMLSL qT1,dW1i,dXr1 @// imag part + + .else + + VMULL qT0,dW1r,dXr1 + VMLSL qT0,dW1i,dXi1 @// real part + VMULL qT1,dW1r,dXi1 + VMLAL qT1,dW1i,dXr1 @// imag part + + .endif + + VLD2 {dW1r,dW1i},[pTwiddle, :128],stepTwiddle @// [wi|wr] + + .ifeqs "\inverse", "TRUE" + VMULL qT2,dW2r,dXr2 + VMLAL qT2,dW2i,dXi2 @// real part + VMULL qT3,dW2r,dXi2 + VLD1 dW2r,[pTwiddle, :64],step16 @// [wi|wr] + VMLSL qT3,dW2i,dXr2 @// imag part + + .else + + VMULL qT2,dW2r,dXr2 + VMLSL qT2,dW2i,dXi2 @// real part + VMULL qT3,dW2r,dXi2 + VLD1 dW2r,[pTwiddle, :64],step16 @// [wi|wr] + VMLAL qT3,dW2i,dXr2 @// imag part + + .endif + + + VRSHRN dZr1,qT0,#31 + VLD1 dW2i,[pTwiddle, :64],twStep @// [wi|wr] + VRSHRN dZi1,qT1,#31 + + VMOV qZ0,qX0 @// move qX0 so as to load for the next iteration + VLD4 {dButterfly1Real02,dButterfly1Imag02,dButterfly1Real13,dButterfly1Imag13},[pSrc, :256]! @// AC.r AC.i BD.r BD.i + + + .ifeqs "\inverse", "TRUE" + VMULL qT4,dW3r,dXr3 + VMLAL qT4,dW3i,dXi3 @// real part + VMULL qT5,dW3r,dXi3 + VLD1 dW3r,[pTwiddle, :64],step24 + VMLSL qT5,dW3i,dXr3 @// imag part + + .else + + VMULL qT4,dW3r,dXr3 + VMLSL qT4,dW3i,dXi3 @// real part + VMULL qT5,dW3r,dXi3 + VLD1 dW3r,[pTwiddle, :64],step24 + VMLAL qT5,dW3i,dXr3 @// imag part + + .endif + + VRSHRN dZr2,qT2,#31 + VLD1 dW3i,[pTwiddle, :64],grpTwStep @// [wi|wr] + VRSHRN dZi2,qT3,#31 + + VRSHRN dZr3,qT4,#31 + VRSHRN dZi3,qT5,#31 + VLD4 {dButterfly2Real02,dButterfly2Imag02,dButterfly2Real13,dButterfly2Imag13},[pSrc, :256]! @// AC.r AC.i BD.r BD.i + + + .ifeqs "\scaled", "TRUE" + + @// finish first stage of 4 point FFT + + VHADD qY0,qZ0,qZ2 + VHSUB qY2,qZ0,qZ2 + VHADD qY1,qZ1,qZ3 + VHSUB qY3,qZ1,qZ3 + + + @// finish second stage of 4 point FFT + + .ifeqs "\inverse", "TRUE" + + VHSUB qZ0,qY2,qY1 + + VHADD dZr3,dYr0,dYi3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VHSUB dZi3,dYi0,dYr3 + + VHADD qZ2,qY2,qY1 + VST2 {dZr3,dZi3},[pDst, :128],outPointStep + + VHSUB dZr1,dYr0,dYi3 + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + VHADD dZi1,dYi0,dYr3 + + VST2 {dZr1,dZi1},[pDst, :128],dstStep @// dstStep = -outPointStep + 16 + + + .else + + VHSUB qZ0,qY2,qY1 + + VHSUB dZr1,dYr0,dYi3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VHADD dZi1,dYi0,dYr3 + + VHADD qZ2,qY2,qY1 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + + VHADD dZr3,dYr0,dYi3 + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + VHSUB dZi3,dYi0,dYr3 + + VST2 {dZr3,dZi3},[pDst, :128],dstStep @// dstStep = -outPointStep + 16 + + + .endif + + + + .else + + @// finish first stage of 4 point FFT + + VADD qY0,qZ0,qZ2 + VSUB qY2,qZ0,qZ2 + VADD qY1,qZ1,qZ3 + VSUB qY3,qZ1,qZ3 + + + @// finish second stage of 4 point FFT + + .ifeqs "\inverse", "TRUE" + + VSUB qZ0,qY2,qY1 + + VADD dZr3,dYr0,dYi3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VSUB dZi3,dYi0,dYr3 + + VADD qZ2,qY2,qY1 + VST2 {dZr3,dZi3},[pDst, :128],outPointStep + + VSUB dZr1,dYr0,dYi3 + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + VADD dZi1,dYi0,dYr3 + + VST2 {dZr1,dZi1},[pDst, :128],dstStep @// dstStep = -outPointStep + 16 + + + .else + + VSUB qZ0,qY2,qY1 + + VSUB dZr1,dYr0,dYi3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VADD dZi1,dYi0,dYr3 + + VADD qZ2,qY2,qY1 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + + VADD dZr3,dYr0,dYi3 + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + VSUB dZi3,dYi0,dYr3 + + VST2 {dZr3,dZi3},[pDst, :128],dstStep @// dstStep = -outPointStep + 16 + + + .endif + + .endif + + BGT grpLoop\name + + + @// Reset and Swap pSrc and pDst for the next stage + MOV pTmp,pDst + SUB pSrc,pSrc,#64 @// Extra increment done in final iteration of the loop + SUB pDst,pSrc,outPointStep,LSL #2 @// pDst -= 4*size; pSrc -= 8*size bytes + SUB pSrc,pTmp,outPointStep + SUB pTwiddle,pTwiddle,subFFTSize,LSL #1 + SUB pTwiddle,pTwiddle,#16 @// Extra increment done in final iteration of the loop + + .endm + + + M_START armSP_FFTFwd_CToC_SC32_Radix4_ls_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",fwd + M_END + + + M_START armSP_FFTInv_CToC_SC32_Radix4_ls_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",inv + M_END + + + M_START armSP_FFTFwd_CToC_SC32_Sfs_Radix4_ls_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","FALSE",fwdsfs + M_END + + + M_START armSP_FFTInv_CToC_SC32_Sfs_Radix4_ls_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","TRUE",invsfs + M_END + + + .end diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix4_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix4_unsafe_s.S new file mode 100644 index 0000000000..82ad5c8ea7 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix4_unsafe_s.S @@ -0,0 +1,395 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. +@// + +@// +@// File Name: armSP_FFT_CToC_SC32_Radix4_unsafe_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 7767 +@// Last Modified Date: Thu, 27 Sep 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute a Radix 4 FFT stage for a N point complex signal +@// + + + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + +@// Guarding implementation by the processor name + + +@// Import symbols required from other files +@// (For example tables) + + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define subFFTNum r6 +#define subFFTSize r7 + + + +@//Output Registers + + +@//Local Scratch Registers + +#define grpCount r3 +#define pointStep r4 +#define outPointStep r5 +#define stepTwiddle r12 +#define setCount r14 +#define srcStep r8 +#define setStep r9 +#define dstStep r10 +#define twStep r11 +#define t1 r3 + +@// Neon Registers + +#define dW1 D0.S32 +#define dW2 D1.S32 +#define dW3 D2.S32 + +#define dXr0 D4.S32 +#define dXi0 D5.S32 +#define dXr1 D6.S32 +#define dXi1 D7.S32 +#define dXr2 D8.S32 +#define dXi2 D9.S32 +#define dXr3 D10.S32 +#define dXi3 D11.S32 +#define dYr0 D12.S32 +#define dYi0 D13.S32 +#define dYr1 D14.S32 +#define dYi1 D15.S32 +#define dYr2 D16.S32 +#define dYi2 D17.S32 +#define dYr3 D18.S32 +#define dYi3 D19.S32 +#define qT0 Q8.S64 +#define qT1 Q9.S64 +#define qT2 Q6.S64 +#define qT3 Q7.S64 + +#define dZr0 D20.S32 +#define dZi0 D21.S32 +#define dZr1 D22.S32 +#define dZi1 D23.S32 +#define dZr2 D24.S32 +#define dZi2 D25.S32 +#define dZr3 D26.S32 +#define dZi3 D27.S32 + +#define qY0 Q6.S32 +#define qY1 Q7.S32 +#define qY2 Q8.S32 +#define qY3 Q9.S32 +#define qX0 Q2.S32 +#define qZ0 Q10.S32 +#define qZ1 Q11.S32 +#define qZ2 Q12.S32 +#define qZ3 Q13.S32 + + + .MACRO FFTSTAGE scaled, inverse , name + + @// Define stack arguments + + + @// Update grpCount and grpSize rightaway inorder to reuse pGrpCount and pGrpSize regs + + LSL grpCount,subFFTSize,#2 + LSR subFFTNum,subFFTNum,#2 + MOV subFFTSize,grpCount + + VLD1 dW1,[pTwiddle] @//[wi | wr] + @// pT0+1 increments pT0 by 8 bytes + @// pT0+pointStep = increment of 8*pointStep bytes = 2*grpSize bytes + MOV pointStep,subFFTNum,LSL #1 + + + @// pOut0+1 increments pOut0 by 8 bytes + @// pOut0+outPointStep == increment of 8*outPointStep bytes = 2*size bytes + + MOV stepTwiddle,#0 + VLD1 dW2,[pTwiddle] @//[wi | wr] + SMULBB outPointStep,grpCount,pointStep + LSL pointStep,pointStep,#2 @// 2*grpSize + + VLD1 dW3,[pTwiddle] @//[wi | wr] + MOV srcStep,pointStep,LSL #1 @// srcStep = 2*pointStep + ADD setStep,srcStep,pointStep @// setStep = 3*pointStep + @//RSB setStep,setStep,#16 @// setStep = - 3*pointStep+16 + RSB setStep,setStep,#0 @// setStep = - 3*pointStep + SUB srcStep,srcStep,#16 @// srcStep = 2*pointStep-16 + + MOV dstStep,outPointStep,LSL #1 + ADD dstStep,dstStep,outPointStep @// dstStep = 3*outPointStep + RSB dstStep,dstStep,#16 @// dstStep = - 3*outPointStep+16 + + + +grpLoop\name : + + VLD2 {dXr0,dXi0},[pSrc],pointStep @// data[0] + ADD stepTwiddle,stepTwiddle,pointStep + VLD2 {dXr1,dXi1},[pSrc],pointStep @// data[1] + ADD pTwiddle,pTwiddle,stepTwiddle @// set pTwiddle to the first point + VLD2 {dXr2,dXi2},[pSrc],pointStep @// data[2] + MOV twStep,stepTwiddle,LSL #2 + + VLD2 {dXr3,dXi3},[pSrc],setStep @// data[3] & update pSrc for the next set + SUB twStep,stepTwiddle,twStep @// twStep = -3*stepTwiddle + + MOV setCount,pointStep,LSR #3 + ADD pSrc,pSrc,#16 @// set pSrc to data[0] of the next set + ADD pSrc,pSrc,pointStep @// increment to data[1] of the next set + + + @// Loop on the sets + +setLoop\name : + + + + SUBS setCount,setCount,#2 @// decrement the loop counter + + .ifeqs "\inverse", "TRUE" + VMULL qT0,dXr1,dW1[0] + VMLAL qT0,dXi1,dW1[1] @// real part + VMULL qT1,dXi1,dW1[0] + VMLSL qT1,dXr1,dW1[1] @// imag part + + .else + VMULL qT0,dXr1,dW1[0] + VMLSL qT0,dXi1,dW1[1] @// real part + VMULL qT1,dXi1,dW1[0] + VMLAL qT1,dXr1,dW1[1] @// imag part + + .endif + + VLD2 {dXr1,dXi1},[pSrc],pointStep @// data[1] for next iteration + + .ifeqs "\inverse", "TRUE" + VMULL qT2,dXr2,dW2[0] + VMLAL qT2,dXi2,dW2[1] @// real part + VMULL qT3,dXi2,dW2[0] + VMLSL qT3,dXr2,dW2[1] @// imag part + + .else + VMULL qT2,dXr2,dW2[0] + VMLSL qT2,dXi2,dW2[1] @// real part + VMULL qT3,dXi2,dW2[0] + VMLAL qT3,dXr2,dW2[1] @// imag part + + .endif + + VRSHRN dZr1,qT0,#31 + VRSHRN dZi1,qT1,#31 + VLD2 {dXr2,dXi2},[pSrc],pointStep @// data[2] for next iteration + + + .ifeqs "\inverse", "TRUE" + VMULL qT0,dXr3,dW3[0] + VMLAL qT0,dXi3,dW3[1] @// real part + VMULL qT1,dXi3,dW3[0] + VMLSL qT1,dXr3,dW3[1] @// imag part + + .else + VMULL qT0,dXr3,dW3[0] + VMLSL qT0,dXi3,dW3[1] @// real part + VMULL qT1,dXi3,dW3[0] + VMLAL qT1,dXr3,dW3[1] @// imag part + + .endif + + VRSHRN dZr2,qT2,#31 + VRSHRN dZi2,qT3,#31 + + + VRSHRN dZr3,qT0,#31 + VRSHRN dZi3,qT1,#31 + VLD2 {dXr3,dXi3},[pSrc],setStep @// data[3] & update pSrc to data[0] + + .ifeqs "\scaled", "TRUE" + + @// finish first stage of 4 point FFT + VHADD qY0,qX0,qZ2 + VHSUB qY2,qX0,qZ2 + + VLD2 {dXr0,dXi0},[pSrc]! @// data[0] for next iteration + VHADD qY1,qZ1,qZ3 + VHSUB qY3,qZ1,qZ3 + + @// finish second stage of 4 point FFT + + VHSUB qZ0,qY2,qY1 + + + .ifeqs "\inverse", "TRUE" + + VHADD dZr3,dYr0,dYi3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VHSUB dZi3,dYi0,dYr3 + + VHADD qZ2,qY2,qY1 + VST2 {dZr3,dZi3},[pDst, :128],outPointStep + + VHSUB dZr1,dYr0,dYi3 + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + VHADD dZi1,dYi0,dYr3 + + VST2 {dZr1,dZi1},[pDst, :128],dstStep + + + .else + + VHSUB dZr1,dYr0,dYi3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VHADD dZi1,dYi0,dYr3 + + VHADD qZ2,qY2,qY1 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + + VHADD dZr3,dYr0,dYi3 + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + VHSUB dZi3,dYi0,dYr3 + + VST2 {dZr3,dZi3},[pDst, :128],dstStep + + + .endif + + + .else + + @// finish first stage of 4 point FFT + VADD qY0,qX0,qZ2 + VSUB qY2,qX0,qZ2 + + VLD2 {dXr0,dXi0},[pSrc, :128]! @// data[0] for next iteration + VADD qY1,qZ1,qZ3 + VSUB qY3,qZ1,qZ3 + + @// finish second stage of 4 point FFT + + VSUB qZ0,qY2,qY1 + + + .ifeqs "\inverse", "TRUE" + + VADD dZr3,dYr0,dYi3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VSUB dZi3,dYi0,dYr3 + + VADD qZ2,qY2,qY1 + VST2 {dZr3,dZi3},[pDst, :128],outPointStep + + VSUB dZr1,dYr0,dYi3 + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + VADD dZi1,dYi0,dYr3 + + VST2 {dZr1,dZi1},[pDst, :128],dstStep + + + .else + + VSUB dZr1,dYr0,dYi3 + VST2 {dZr0,dZi0},[pDst, :128],outPointStep + VADD dZi1,dYi0,dYr3 + + VADD qZ2,qY2,qY1 + VST2 {dZr1,dZi1},[pDst, :128],outPointStep + + VADD dZr3,dYr0,dYi3 + VST2 {dZr2,dZi2},[pDst, :128],outPointStep + VSUB dZi3,dYi0,dYr3 + + VST2 {dZr3,dZi3},[pDst, :128],dstStep + + + .endif + + .endif + + ADD pSrc,pSrc,pointStep @// increment to data[1] of the next set + BGT setLoop\name + + + VLD1 dW1,[pTwiddle, :64],stepTwiddle @//[wi | wr] + SUBS grpCount,grpCount,#4 @// subtract 4 since grpCount multiplied by 4 + VLD1 dW2,[pTwiddle, :64],stepTwiddle @//[wi | wr] + ADD pSrc,pSrc,srcStep @// increment pSrc for the next grp + VLD1 dW3,[pTwiddle, :64],twStep @//[wi | wr] + BGT grpLoop\name + + + @// Reset and Swap pSrc and pDst for the next stage + MOV t1,pDst + SUB pDst,pSrc,outPointStep,LSL #2 @// pDst -= 2*size; pSrc -= 8*size bytes + SUB pSrc,t1,outPointStep + + + .endm + + + M_START armSP_FFTFwd_CToC_SC32_Radix4_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",FWD + M_END + + + M_START armSP_FFTInv_CToC_SC32_Radix4_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",INV + M_END + + + M_START armSP_FFTFwd_CToC_SC32_Sfs_Radix4_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","FALSE",FWDSFS + M_END + + + M_START armSP_FFTInv_CToC_SC32_Sfs_Radix4_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","TRUE",INVSFS + M_END + + + .end diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix8_fs_unsafe_s.S b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix8_fs_unsafe_s.S new file mode 100644 index 0000000000..081e2f6ccd --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_CToC_SC32_Radix8_fs_unsafe_s.S @@ -0,0 +1,595 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. +@// + +@// +@// File Name: armSP_FFT_CToC_SC32_Radix8_fs_unsafe_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 7770 +@// Last Modified Date: Thu, 27 Sep 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute a first stage Radix 8 FFT stage for a N point complex signal +@// + + + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + +@// Import symbols required from other files +@// (For example tables) + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + +@// Guarding implementation by the processor name + +@//Input Registers + +#define pSrc r0 +#define pDst r2 +#define pTwiddle r1 +#define subFFTNum r6 +#define subFFTSize r7 +@// dest buffer for the next stage (not pSrc for first stage) +#define pPingPongBuf r5 + + +@//Output Registers + + +@//Local Scratch Registers + +#define grpSize r3 +@// Reuse grpSize as setCount +#define setCount r3 +#define pointStep r4 +#define outPointStep r4 +#define setStep r8 +#define step1 r9 +#define step2 r10 +#define t0 r11 + + +@// Neon Registers + +#define dXr0 D0.S32 +#define dXi0 D1.S32 +#define dXr1 D2.S32 +#define dXi1 D3.S32 +#define dXr2 D4.S32 +#define dXi2 D5.S32 +#define dXr3 D6.S32 +#define dXi3 D7.S32 +#define dXr4 D8.S32 +#define dXi4 D9.S32 +#define dXr5 D10.S32 +#define dXi5 D11.S32 +#define dXr6 D12.S32 +#define dXi6 D13.S32 +#define dXr7 D14.S32 +#define dXi7 D15.S32 +#define qX0 Q0.S32 +#define qX1 Q1.S32 +#define qX2 Q2.S32 +#define qX3 Q3.S32 +#define qX4 Q4.S32 +#define qX5 Q5.S32 +#define qX6 Q6.S32 +#define qX7 Q7.S32 + +#define dUr0 D16.S32 +#define dUi0 D17.S32 +#define dUr2 D18.S32 +#define dUi2 D19.S32 +#define dUr4 D20.S32 +#define dUi4 D21.S32 +#define dUr6 D22.S32 +#define dUi6 D23.S32 +#define dUr1 D24.S32 +#define dUi1 D25.S32 +#define dUr3 D26.S32 +#define dUi3 D27.S32 +#define dUr5 D28.S32 +#define dUi5 D29.S32 +@// reuse dXr7 and dXi7 +#define dUr7 D30.S32 +#define dUi7 D31.S32 +#define qU0 Q8.S32 +#define qU1 Q12.S32 +#define qU2 Q9.S32 +#define qU3 Q13.S32 +#define qU4 Q10.S32 +#define qU5 Q14.S32 +#define qU6 Q11.S32 +#define qU7 Q15.S32 + + + +#define dVr0 D24.S32 +#define dVi0 D25.S32 +#define dVr2 D26.S32 +#define dVi2 D27.S32 +#define dVr4 D28.S32 +#define dVi4 D29.S32 +#define dVr6 D30.S32 +#define dVi6 D31.S32 +#define dVr1 D16.S32 +#define dVi1 D17.S32 +#define dVr3 D18.S32 +#define dVi3 D19.S32 +#define dVr5 D20.S32 +#define dVi5 D21.S32 +#define dVr7 D22.S32 +#define dVi7 D23.S32 +#define qV0 Q12.S32 +#define qV1 Q8.S32 +#define qV2 Q13.S32 +#define qV3 Q9.S32 +#define qV4 Q14.S32 +#define qV5 Q10.S32 +#define qV6 Q15.S32 +#define qV7 Q11.S32 + + + +#define dYr0 D16.S32 +#define dYi0 D17.S32 +#define dYr2 D18.S32 +#define dYi2 D19.S32 +#define dYr4 D20.S32 +#define dYi4 D21.S32 +#define dYr6 D22.S32 +#define dYi6 D23.S32 +#define dYr1 D24.S32 +#define dYi1 D25.S32 +#define dYr3 D26.S32 +#define dYi3 D27.S32 +#define dYr5 D28.S32 +#define dYi5 D29.S32 +#define dYr7 D30.S32 +#define dYi7 D31.S32 +#define qY0 Q8.S32 +#define qY1 Q12.S32 +#define qY2 Q9.S32 +#define qY3 Q13.S32 +#define qY4 Q10.S32 +#define qY5 Q14.S32 +#define qY6 Q11.S32 +#define qY7 Q15.S32 + + +#define dT0 D14.S32 +#define dT1 D15.S32 + +@// Define constants + .set ONEBYSQRT2, 0x5A82799A @// Q31 format + + + .MACRO FFTSTAGE scaled, inverse, name + + @// Define stack arguments + + @// Update pSubFFTSize and pSubFFTNum regs + MOV subFFTSize,#8 @// subFFTSize = 1 for the first stage + LDR t0,=ONEBYSQRT2 @// t0=(1/sqrt(2)) as Q31 value + + @// Note: setCount = subFFTNum/8 (reuse the grpSize reg for setCount) + LSR grpSize,subFFTNum,#3 + MOV subFFTNum,grpSize + + + @// pT0+1 increments pT0 by 8 bytes + @// pT0+pointStep = increment of 8*pointStep bytes = grpSize bytes + @// Note: outPointStep = pointStep for firststage + + MOV pointStep,grpSize,LSL #3 + + + @// Calculate the step of input data for the next set + @//MOV step1,pointStep,LSL #1 @// step1 = 2*pointStep + VLD2 {dXr0,dXi0},[pSrc, :128],pointStep @// data[0] + MOV step1,grpSize,LSL #4 + + MOV step2,pointStep,LSL #3 + VLD2 {dXr1,dXi1},[pSrc, :128],pointStep @// data[1] + SUB step2,step2,pointStep @// step2 = 7*pointStep + RSB setStep,step2,#16 @// setStep = - 7*pointStep+16 + + VLD2 {dXr2,dXi2},[pSrc, :128],pointStep @// data[2] + VLD2 {dXr3,dXi3},[pSrc, :128],pointStep @// data[3] + VLD2 {dXr4,dXi4},[pSrc, :128],pointStep @// data[4] + VLD2 {dXr5,dXi5},[pSrc, :128],pointStep @// data[5] + VLD2 {dXr6,dXi6},[pSrc, :128],pointStep @// data[6] + VLD2 {dXr7,dXi7},[pSrc, :128],setStep @// data[7] & update pSrc for the next set + @// setStep = -7*pointStep + 16 + @// grp = 0 a special case since all the twiddle factors are 1 + @// Loop on the sets + +grpZeroSetLoop\name : + + @// Decrement setcount + SUBS setCount,setCount,#2 @// decrement the set loop counter + + + .ifeqs "\scaled", "TRUE" + @// finish first stage of 8 point FFT + + VHADD qU0,qX0,qX4 + VHADD qU2,qX1,qX5 + VHADD qU4,qX2,qX6 + VHADD qU6,qX3,qX7 + + @// finish second stage of 8 point FFT + + VHADD qV0,qU0,qU4 + VHSUB qV2,qU0,qU4 + VHADD qV4,qU2,qU6 + VHSUB qV6,qU2,qU6 + + @// finish third stage of 8 point FFT + + VHADD qY0,qV0,qV4 + VHSUB qY4,qV0,qV4 + VST2 {dYr0,dYi0},[pDst, :128],step1 @// store y0 + + .ifeqs "\inverse", "TRUE" + + VHSUB dYr2,dVr2,dVi6 + VHADD dYi2,dVi2,dVr6 + + VHADD dYr6,dVr2,dVi6 + VST2 {dYr2,dYi2},[pDst, :128],step1 @// store y2 + VHSUB dYi6,dVi2,dVr6 + + VHSUB qU1,qX0,qX4 + VST2 {dYr4,dYi4},[pDst, :128],step1 @// store y4 + + VHSUB qU3,qX1,qX5 + VHSUB qU5,qX2,qX6 + VST2 {dYr6,dYi6},[pDst, :128],step1 @// store y6 + + .ELSE + + VHADD dYr6,dVr2,dVi6 + VHSUB dYi6,dVi2,dVr6 + + VHSUB dYr2,dVr2,dVi6 + VST2 {dYr6,dYi6},[pDst, :128],step1 @// store y2 + VHADD dYi2,dVi2,dVr6 + + + VHSUB qU1,qX0,qX4 + VST2 {dYr4,dYi4},[pDst, :128],step1 @// store y4 + VHSUB qU3,qX1,qX5 + VHSUB qU5,qX2,qX6 + VST2 {dYr2,dYi2},[pDst, :128],step1 @// store y6 + + + .ENDIF + + @// finish first stage of 8 point FFT + + VHSUB qU7,qX3,qX7 + VMOV dT0[0],t0 + + @// finish second stage of 8 point FFT + + VHSUB dVr1,dUr1,dUi5 + VLD2 {dXr0,dXi0},[pSrc, :128],pointStep @// data[0] for next iteration + VHADD dVi1,dUi1,dUr5 + VHADD dVr3,dUr1,dUi5 + VLD2 {dXr1,dXi1},[pSrc, :128],pointStep @// data[1] + VHSUB dVi3,dUi1,dUr5 + + VHSUB dVr5,dUr3,dUi7 + VLD2 {dXr2,dXi2},[pSrc, :128],pointStep @// data[2] + VHADD dVi5,dUi3,dUr7 + VHADD dVr7,dUr3,dUi7 + VLD2 {dXr3,dXi3},[pSrc, :128],pointStep @// data[3] + VHSUB dVi7,dUi3,dUr7 + + @// finish third stage of 8 point FFT + + .ifeqs "\inverse", "TRUE" + + @// calculate a*v5 + VQRDMULH dT1,dVr5,dT0[0] @// use dVi0 for dT1 + VLD2 {dXr4,dXi4},[pSrc, :128],pointStep @// data[4] + VQRDMULH dVi5,dVi5,dT0[0] + + VLD2 {dXr5,dXi5},[pSrc, :128],pointStep @// data[5] + VSUB dVr5,dT1,dVi5 @// a * V5 + VADD dVi5,dT1,dVi5 + + VLD2 {dXr6,dXi6},[pSrc, :128],pointStep @// data[6] + + @// calculate b*v7 + VQRDMULH dT1,dVr7,dT0[0] + VQRDMULH dVi7,dVi7,dT0[0] + + VHADD qY1,qV1,qV5 + VHSUB qY5,qV1,qV5 + + + VADD dVr7,dT1,dVi7 @// b * V7 + VSUB dVi7,dVi7,dT1 + SUB pDst, pDst, step2 @// set pDst to y1 + + VLD2 {dXr7,dXi7},[pSrc, :128],setStep @// data[7] + + + VHSUB dYr3,dVr3,dVr7 + VHSUB dYi3,dVi3,dVi7 + VST2 {dYr1,dYi1},[pDst, :128],step1 @// store y1 + VHADD dYr7,dVr3,dVr7 + VHADD dYi7,dVi3,dVi7 + + + VST2 {dYr3,dYi3},[pDst, :128],step1 @// store y3 + VST2 {dYr5,dYi5},[pDst, :128],step1 @// store y5 + VST2 {dYr7,dYi7},[pDst, :128]! @// store y7 + + .ELSE + + @// calculate b*v7 + VQRDMULH dT1,dVr7,dT0[0] + VLD2 {dXr4,dXi4},[pSrc, :128],pointStep @// data[4] + VQRDMULH dVi7,dVi7,dT0[0] + + VLD2 {dXr5,dXi5},[pSrc, :128],pointStep @// data[5] + VADD dVr7,dT1,dVi7 @// b * V7 + VSUB dVi7,dVi7,dT1 + + VLD2 {dXr6,dXi6},[pSrc, :128],pointStep @// data[6] + + @// calculate a*v5 + VQRDMULH dT1,dVr5,dT0[0] @// use dVi0 for dT1 + VQRDMULH dVi5,dVi5,dT0[0] + + VHADD dYr7,dVr3,dVr7 + VHADD dYi7,dVi3,dVi7 + SUB pDst, pDst, step2 @// set pDst to y1 + + VSUB dVr5,dT1,dVi5 @// a * V5 + VADD dVi5,dT1,dVi5 + VLD2 {dXr7,dXi7},[pSrc, :128],setStep @// data[7] + + VHSUB qY5,qV1,qV5 + + VHSUB dYr3,dVr3,dVr7 + VST2 {dYr7,dYi7},[pDst, :128],step1 @// store y1 + VHSUB dYi3,dVi3,dVi7 + VHADD qY1,qV1,qV5 + + + VST2 {dYr5,dYi5},[pDst, :128],step1 @// store y3 + VST2 {dYr3,dYi3},[pDst, :128],step1 @// store y5 + VST2 {dYr1,dYi1},[pDst, :128]! @// store y7 + + .ENDIF + + + + .ELSE + @// finish first stage of 8 point FFT + + VADD qU0,qX0,qX4 + VADD qU2,qX1,qX5 + VADD qU4,qX2,qX6 + VADD qU6,qX3,qX7 + + @// finish second stage of 8 point FFT + + VADD qV0,qU0,qU4 + VSUB qV2,qU0,qU4 + VADD qV4,qU2,qU6 + VSUB qV6,qU2,qU6 + + @// finish third stage of 8 point FFT + + VADD qY0,qV0,qV4 + VSUB qY4,qV0,qV4 + VST2 {dYr0,dYi0},[pDst, :128],step1 @// store y0 + + .ifeqs "\inverse", "TRUE" + + VSUB dYr2,dVr2,dVi6 + VADD dYi2,dVi2,dVr6 + + VADD dYr6,dVr2,dVi6 + VST2 {dYr2,dYi2},[pDst, :128],step1 @// store y2 + VSUB dYi6,dVi2,dVr6 + + VSUB qU1,qX0,qX4 + VST2 {dYr4,dYi4},[pDst, :128],step1 @// store y4 + + VSUB qU3,qX1,qX5 + VSUB qU5,qX2,qX6 + VST2 {dYr6,dYi6},[pDst, :128],step1 @// store y6 + + .ELSE + + VADD dYr6,dVr2,dVi6 + VSUB dYi6,dVi2,dVr6 + + VSUB dYr2,dVr2,dVi6 + VST2 {dYr6,dYi6},[pDst, :128],step1 @// store y2 + VADD dYi2,dVi2,dVr6 + + + VSUB qU1,qX0,qX4 + VST2 {dYr4,dYi4},[pDst, :128],step1 @// store y4 + VSUB qU3,qX1,qX5 + VSUB qU5,qX2,qX6 + VST2 {dYr2,dYi2},[pDst, :128],step1 @// store y6 + + + .ENDIF + + @// finish first stage of 8 point FFT + + VSUB qU7,qX3,qX7 + VMOV dT0[0],t0 + + @// finish second stage of 8 point FFT + + VSUB dVr1,dUr1,dUi5 + VLD2 {dXr0,dXi0},[pSrc, :128],pointStep @// data[0] for next iteration + VADD dVi1,dUi1,dUr5 + VADD dVr3,dUr1,dUi5 + VLD2 {dXr1,dXi1},[pSrc, :128],pointStep @// data[1] + VSUB dVi3,dUi1,dUr5 + + VSUB dVr5,dUr3,dUi7 + VLD2 {dXr2,dXi2},[pSrc, :128],pointStep @// data[2] + VADD dVi5,dUi3,dUr7 + VADD dVr7,dUr3,dUi7 + VLD2 {dXr3,dXi3},[pSrc, :128],pointStep @// data[3] + VSUB dVi7,dUi3,dUr7 + + @// finish third stage of 8 point FFT + + .ifeqs "\inverse", "TRUE" + + @// calculate a*v5 + VQRDMULH dT1,dVr5,dT0[0] @// use dVi0 for dT1 + VLD2 {dXr4,dXi4},[pSrc, :128],pointStep @// data[4] + VQRDMULH dVi5,dVi5,dT0[0] + + VLD2 {dXr5,dXi5},[pSrc, :128],pointStep @// data[5] + VSUB dVr5,dT1,dVi5 @// a * V5 + VADD dVi5,dT1,dVi5 + + VLD2 {dXr6,dXi6},[pSrc, :128],pointStep @// data[6] + + @// calculate b*v7 + VQRDMULH dT1,dVr7,dT0[0] + VQRDMULH dVi7,dVi7,dT0[0] + + VADD qY1,qV1,qV5 + VSUB qY5,qV1,qV5 + + + VADD dVr7,dT1,dVi7 @// b * V7 + VSUB dVi7,dVi7,dT1 + SUB pDst, pDst, step2 @// set pDst to y1 + + VLD2 {dXr7,dXi7},[pSrc, :128],setStep @// data[7] + + + VSUB dYr3,dVr3,dVr7 + VSUB dYi3,dVi3,dVi7 + VST2 {dYr1,dYi1},[pDst, :128],step1 @// store y1 + VADD dYr7,dVr3,dVr7 + VADD dYi7,dVi3,dVi7 + + + VST2 {dYr3,dYi3},[pDst, :128],step1 @// store y3 + VST2 {dYr5,dYi5},[pDst, :128],step1 @// store y5 + VST2 {dYr7,dYi7},[pDst, :128]! @// store y7 + + .ELSE + + @// calculate b*v7 + VQRDMULH dT1,dVr7,dT0[0] + VLD2 {dXr4,dXi4},[pSrc, :128],pointStep @// data[4] + VQRDMULH dVi7,dVi7,dT0[0] + + VLD2 {dXr5,dXi5},[pSrc, :128],pointStep @// data[5] + VADD dVr7,dT1,dVi7 @// b * V7 + VSUB dVi7,dVi7,dT1 + + VLD2 {dXr6,dXi6},[pSrc, :128],pointStep @// data[6] + + @// calculate a*v5 + VQRDMULH dT1,dVr5,dT0[0] @// use dVi0 for dT1 + VQRDMULH dVi5,dVi5,dT0[0] + + VADD dYr7,dVr3,dVr7 + VADD dYi7,dVi3,dVi7 + SUB pDst, pDst, step2 @// set pDst to y1 + + VSUB dVr5,dT1,dVi5 @// a * V5 + VADD dVi5,dT1,dVi5 + VLD2 {dXr7,dXi7},[pSrc, :128],setStep @// data[7] + + VSUB qY5,qV1,qV5 + + VSUB dYr3,dVr3,dVr7 + VST2 {dYr7,dYi7},[pDst, :128],step1 @// store y1 + VSUB dYi3,dVi3,dVi7 + VADD qY1,qV1,qV5 + + + VST2 {dYr5,dYi5},[pDst, :128],step1 @// store y3 + VST2 {dYr3,dYi3},[pDst, :128],step1 @// store y5 + VST2 {dYr1,dYi1},[pDst, :128]! @// store y7 + + .ENDIF + + + .ENDIF + + SUB pDst, pDst, step2 @// update pDst for the next set + BGT grpZeroSetLoop\name + + + @// reset pSrc to pDst for the next stage + SUB pSrc,pDst,pointStep @// pDst -= 2*grpSize + MOV pDst,pPingPongBuf + + + + .endm + + + @// Allocate stack memory required by the function + + + M_START armSP_FFTFwd_CToC_SC32_Radix8_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","FALSE",FWD + M_END + + + M_START armSP_FFTInv_CToC_SC32_Radix8_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "FALSE","TRUE",INV + M_END + + + M_START armSP_FFTFwd_CToC_SC32_Sfs_Radix8_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","FALSE",FWDSFS + M_END + + + M_START armSP_FFTInv_CToC_SC32_Sfs_Radix8_fs_OutOfPlace_unsafe,r4 + FFTSTAGE "TRUE","TRUE",INVSFS + M_END + + + .end diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_F32TwiddleTable.c b/media/openmax_dl/dl/sp/src/armSP_FFT_F32TwiddleTable.c new file mode 100644 index 0000000000..87d98614fa --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_F32TwiddleTable.c @@ -0,0 +1,4643 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + * + */ + +/* + * Description: + * Twiddle table for Forward FFT in float format. + * It contains complex pairs [-cos (W * i), -sin (W * i)] where W = -2*PI/N + * and 0<= i<= N/8. N is the max size of the FFT. Here N = 2^12 + * Values for N/8 < i < N are generated in the FFTInit function using the + * symmetries of cos and sine. + * + * We use the negative to be consistent with the S32 version. +**/ + +#include "dl/api/omxtypes.h" + +#define TWIDDLE_TABLE_ENTRIES ((1 << TWIDDLE_TABLE_ORDER) / 8) + +const OMX_F32 armSP_FFT_F32TwiddleTable[2 * TWIDDLE_TABLE_ENTRIES + 2] = { +#if TWIDDLE_TABLE_ORDER == 15 + -1.000000000000000e+00, 0.000000000000000e+00, + -9.999999816164293e-01, 1.917475973107033e-04, + -9.999999264657179e-01, 3.834951875713956e-04, + -9.999998345478677e-01, 5.752427637320661e-04, + -9.999997058628822e-01, 7.669903187427045e-04, + -9.999995404107661e-01, 9.587378455533014e-04, + -9.999993381915255e-01, 1.150485337113848e-03, + -9.999990992051678e-01, 1.342232786374338e-03, + -9.999988234517019e-01, 1.533980186284766e-03, + -9.999985109311378e-01, 1.725727529795126e-03, + -9.999981616434870e-01, 1.917474809855419e-03, + -9.999977755887623e-01, 2.109222019415644e-03, + -9.999973527669782e-01, 2.300969151425805e-03, + -9.999968931781499e-01, 2.492716198835908e-03, + -9.999963968222944e-01, 2.684463154595962e-03, + -9.999958636994299e-01, 2.876210011655979e-03, + -9.999952938095762e-01, 3.067956762965976e-03, + -9.999946871527541e-01, 3.259703401475973e-03, + -9.999940437289858e-01, 3.451449920135994e-03, + -9.999933635382952e-01, 3.643196311896068e-03, + -9.999926465807072e-01, 3.834942569706228e-03, + -9.999918928562480e-01, 4.026688686516512e-03, + -9.999911023649456e-01, 4.218434655276963e-03, + -9.999902751068289e-01, 4.410180468937631e-03, + -9.999894110819284e-01, 4.601926120448570e-03, + -9.999885102902757e-01, 4.793671602759841e-03, + -9.999875727319041e-01, 4.985416908821511e-03, + -9.999865984068480e-01, 5.177162031583651e-03, + -9.999855873151432e-01, 5.368906963996342e-03, + -9.999845394568270e-01, 5.560651699009674e-03, + -9.999834548319377e-01, 5.752396229573736e-03, + -9.999823334405153e-01, 5.944140548638633e-03, + -9.999811752826011e-01, 6.135884649154475e-03, + -9.999799803582377e-01, 6.327628524071378e-03, + -9.999787486674688e-01, 6.519372166339468e-03, + -9.999774802103399e-01, 6.711115568908879e-03, + -9.999761749868976e-01, 6.902858724729756e-03, + -9.999748329971898e-01, 7.094601626752250e-03, + -9.999734542412659e-01, 7.286344267926521e-03, + -9.999720387191767e-01, 7.478086641202744e-03, + -9.999705864309741e-01, 7.669828739531097e-03, + -9.999690973767116e-01, 7.861570555861772e-03, + -9.999675715564438e-01, 8.053312083144972e-03, + -9.999660089702269e-01, 8.245053314330906e-03, + -9.999644096181183e-01, 8.436794242369799e-03, + -9.999627735001769e-01, 8.628534860211886e-03, + -9.999611006164628e-01, 8.820275160807411e-03, + -9.999593909670375e-01, 9.012015137106633e-03, + -9.999576445519639e-01, 9.203754782059820e-03, + -9.999558613713061e-01, 9.395494088617251e-03, + -9.999540414251298e-01, 9.587233049729225e-03, + -9.999521847135018e-01, 9.778971658346043e-03, + -9.999502912364905e-01, 9.970709907418030e-03, + -9.999483609941654e-01, 1.016244778989551e-02, + -9.999463939865975e-01, 1.035418529872884e-02, + -9.999443902138591e-01, 1.054592242686838e-02, + -9.999423496760239e-01, 1.073765916726449e-02, + -9.999402723731670e-01, 1.092939551286757e-02, + -9.999381583053646e-01, 1.112113145662802e-02, + -9.999360074726946e-01, 1.131286699149626e-02, + -9.999338198752360e-01, 1.150460211042271e-02, + -9.999315955130692e-01, 1.169633680635784e-02, + -9.999293343862761e-01, 1.188807107225209e-02, + -9.999270364949396e-01, 1.207980490105596e-02, + -9.999247018391445e-01, 1.227153828571993e-02, + -9.999223304189765e-01, 1.246327121919451e-02, + -9.999199222345228e-01, 1.265500369443024e-02, + -9.999174772858718e-01, 1.284673570437766e-02, + -9.999149955731135e-01, 1.303846724198733e-02, + -9.999124770963392e-01, 1.323019830020983e-02, + -9.999099218556415e-01, 1.342192887199577e-02, + -9.999073298511143e-01, 1.361365895029574e-02, + -9.999047010828529e-01, 1.380538852806039e-02, + -9.999020355509539e-01, 1.399711759824037e-02, + -9.998993332555154e-01, 1.418884615378634e-02, + -9.998965941966367e-01, 1.438057418764901e-02, + -9.998938183744185e-01, 1.457230169277906e-02, + -9.998910057889630e-01, 1.476402866212725e-02, + -9.998881564403733e-01, 1.495575508864430e-02, + -9.998852703287545e-01, 1.514748096528099e-02, + -9.998823474542126e-01, 1.533920628498810e-02, + -9.998793878168549e-01, 1.553093104071645e-02, + -9.998763914167904e-01, 1.572265522541686e-02, + -9.998733582541293e-01, 1.591437883204018e-02, + -9.998702883289830e-01, 1.610610185353729e-02, + -9.998671816414644e-01, 1.629782428285906e-02, + -9.998640381916877e-01, 1.648954611295644e-02, + -9.998608579797685e-01, 1.668126733678033e-02, + -9.998576410058239e-01, 1.687298794728171e-02, + -9.998543872699719e-01, 1.706470793741156e-02, + -9.998510967723322e-01, 1.725642730012088e-02, + -9.998477695130259e-01, 1.744814602836069e-02, + -9.998444054921752e-01, 1.763986411508205e-02, + -9.998410047099040e-01, 1.783158155323604e-02, + -9.998375671663371e-01, 1.802329833577375e-02, + -9.998340928616010e-01, 1.821501445564629e-02, + -9.998305817958234e-01, 1.840672990580482e-02, + -9.998270339691334e-01, 1.859844467920051e-02, + -9.998234493816616e-01, 1.879015876878455e-02, + -9.998198280335394e-01, 1.898187216750818e-02, + -9.998161699249004e-01, 1.917358486832262e-02, + -9.998124750558788e-01, 1.936529686417916e-02, + -9.998087434266105e-01, 1.955700814802908e-02, + -9.998049750372329e-01, 1.974871871282373e-02, + -9.998011698878843e-01, 1.994042855151444e-02, + -9.997973279787047e-01, 2.013213765705259e-02, + -9.997934493098353e-01, 2.032384602238959e-02, + -9.997895338814188e-01, 2.051555364047688e-02, + -9.997855816935992e-01, 2.070726050426589e-02, + -9.997815927465217e-01, 2.089896660670814e-02, + -9.997775670403329e-01, 2.109067194075512e-02, + -9.997735045751810e-01, 2.128237649935839e-02, + -9.997694053512153e-01, 2.147408027546951e-02, + -9.997652693685865e-01, 2.166578326204008e-02, + -9.997610966274466e-01, 2.185748545202174e-02, + -9.997568871279491e-01, 2.204918683836614e-02, + -9.997526408702488e-01, 2.224088741402496e-02, + -9.997483578545018e-01, 2.243258717194993e-02, + -9.997440380808654e-01, 2.262428610509280e-02, + -9.997396815494987e-01, 2.281598420640535e-02, + -9.997352882605617e-01, 2.300768146883937e-02, + -9.997308582142160e-01, 2.319937788534672e-02, + -9.997263914106245e-01, 2.339107344887926e-02, + -9.997218878499513e-01, 2.358276815238889e-02, + -9.997173475323622e-01, 2.377446198882755e-02, + -9.997127704580239e-01, 2.396615495114721e-02, + -9.997081566271049e-01, 2.415784703229986e-02, + -9.997035060397746e-01, 2.434953822523753e-02, + -9.996988186962042e-01, 2.454122852291229e-02, + -9.996940945965660e-01, 2.473291791827622e-02, + -9.996893337410336e-01, 2.492460640428147e-02, + -9.996845361297821e-01, 2.511629397388019e-02, + -9.996797017629879e-01, 2.530798062002457e-02, + -9.996748306408287e-01, 2.549966633566685e-02, + -9.996699227634838e-01, 2.569135111375929e-02, + -9.996649781311333e-01, 2.588303494725420e-02, + -9.996599967439592e-01, 2.607471782910390e-02, + -9.996549786021447e-01, 2.626639975226076e-02, + -9.996499237058742e-01, 2.645808070967719e-02, + -9.996448320553336e-01, 2.664976069430562e-02, + -9.996397036507102e-01, 2.684143969909853e-02, + -9.996345384921923e-01, 2.703311771700843e-02, + -9.996293365799701e-01, 2.722479474098788e-02, + -9.996240979142346e-01, 2.741647076398944e-02, + -9.996188224951786e-01, 2.760814577896574e-02, + -9.996135103229960e-01, 2.779981977886944e-02, + -9.996081613978821e-01, 2.799149275665324e-02, + -9.996027757200335e-01, 2.818316470526987e-02, + -9.995973532896484e-01, 2.837483561767210e-02, + -9.995918941069260e-01, 2.856650548681273e-02, + -9.995863981720671e-01, 2.875817430564461e-02, + -9.995808654852737e-01, 2.894984206712064e-02, + -9.995752960467492e-01, 2.914150876419372e-02, + -9.995696898566986e-01, 2.933317438981684e-02, + -9.995640469153277e-01, 2.952483893694298e-02, + -9.995583672228443e-01, 2.971650239852519e-02, + -9.995526507794570e-01, 2.990816476751655e-02, + -9.995468975853760e-01, 3.009982603687020e-02, + -9.995411076408129e-01, 3.029148619953928e-02, + -9.995352809459805e-01, 3.048314524847701e-02, + -9.995294175010931e-01, 3.067480317663663e-02, + -9.995235173063663e-01, 3.086645997697141e-02, + -9.995175803620170e-01, 3.105811564243470e-02, + -9.995116066682634e-01, 3.124977016597986e-02, + -9.995055962253253e-01, 3.144142354056030e-02, + -9.994995490334236e-01, 3.163307575912948e-02, + -9.994934650927806e-01, 3.182472681464089e-02, + -9.994873444036201e-01, 3.201637670004806e-02, + -9.994811869661670e-01, 3.220802540830459e-02, + -9.994749927806478e-01, 3.239967293236409e-02, + -9.994687618472900e-01, 3.259131926518023e-02, + -9.994624941663232e-01, 3.278296439970672e-02, + -9.994561897379773e-01, 3.297460832889734e-02, + -9.994498485624845e-01, 3.316625104570586e-02, + -9.994434706400778e-01, 3.335789254308614e-02, + -9.994370559709915e-01, 3.354953281399207e-02, + -9.994306045554617e-01, 3.374117185137758e-02, + -9.994241163937256e-01, 3.393280964819666e-02, + -9.994175914860217e-01, 3.412444619740333e-02, + -9.994110298325898e-01, 3.431608149195165e-02, + -9.994044314336713e-01, 3.450771552479575e-02, + -9.993977962895086e-01, 3.469934828888980e-02, + -9.993911244003460e-01, 3.489097977718800e-02, + -9.993844157664286e-01, 3.508260998264462e-02, + -9.993776703880028e-01, 3.527423889821395e-02, + -9.993708882653172e-01, 3.546586651685035e-02, + -9.993640693986205e-01, 3.565749283150822e-02, + -9.993572137881640e-01, 3.584911783514202e-02, + -9.993503214341994e-01, 3.604074152070623e-02, + -9.993433923369802e-01, 3.623236388115540e-02, + -9.993364264967612e-01, 3.642398490944411e-02, + -9.993294239137984e-01, 3.661560459852703e-02, + -9.993223845883495e-01, 3.680722294135883e-02, + -9.993153085206731e-01, 3.699883993089426e-02, + -9.993081957110295e-01, 3.719045556008812e-02, + -9.993010461596801e-01, 3.738206982189523e-02, + -9.992938598668878e-01, 3.757368270927049e-02, + -9.992866368329167e-01, 3.776529421516886e-02, + -9.992793770580327e-01, 3.795690433254531e-02, + -9.992720805425026e-01, 3.814851305435489e-02, + -9.992647472865944e-01, 3.834012037355269e-02, + -9.992573772905781e-01, 3.853172628309387e-02, + -9.992499705547244e-01, 3.872333077593362e-02, + -9.992425270793058e-01, 3.891493384502719e-02, + -9.992350468645959e-01, 3.910653548332989e-02, + -9.992275299108696e-01, 3.929813568379706e-02, + -9.992199762184035e-01, 3.948973443938412e-02, + -9.992123857874753e-01, 3.968133174304653e-02, + -9.992047586183639e-01, 3.987292758773981e-02, + -9.991970947113499e-01, 4.006452196641952e-02, + -9.991893940667149e-01, 4.025611487204128e-02, + -9.991816566847423e-01, 4.044770629756078e-02, + -9.991738825657164e-01, 4.063929623593374e-02, + -9.991660717099230e-01, 4.083088468011595e-02, + -9.991582241176494e-01, 4.102247162306324e-02, + -9.991503397891841e-01, 4.121405705773152e-02, + -9.991424187248169e-01, 4.140564097707674e-02, + -9.991344609248392e-01, 4.159722337405489e-02, + -9.991264663895434e-01, 4.178880424162206e-02, + -9.991184351192235e-01, 4.198038357273436e-02, + -9.991103671141749e-01, 4.217196136034795e-02, + -9.991022623746941e-01, 4.236353759741907e-02, + -9.990941209010791e-01, 4.255511227690402e-02, + -9.990859426936293e-01, 4.274668539175913e-02, + -9.990777277526454e-01, 4.293825693494082e-02, + -9.990694760784293e-01, 4.312982689940555e-02, + -9.990611876712846e-01, 4.332139527810983e-02, + -9.990528625315159e-01, 4.351296206401024e-02, + -9.990445006594293e-01, 4.370452725006342e-02, + -9.990361020553323e-01, 4.389609082922607e-02, + -9.990276667195337e-01, 4.408765279445494e-02, + -9.990191946523435e-01, 4.427921313870685e-02, + -9.990106858540734e-01, 4.447077185493867e-02, + -9.990021403250360e-01, 4.466232893610732e-02, + -9.989935580655457e-01, 4.485388437516982e-02, + -9.989849390759180e-01, 4.504543816508320e-02, + -9.989762833564698e-01, 4.523699029880459e-02, + -9.989675909075193e-01, 4.542854076929115e-02, + -9.989588617293861e-01, 4.562008956950014e-02, + -9.989500958223912e-01, 4.581163669238884e-02, + -9.989412931868569e-01, 4.600318213091462e-02, + -9.989324538231067e-01, 4.619472587803491e-02, + -9.989235777314658e-01, 4.638626792670716e-02, + -9.989146649122604e-01, 4.657780826988894e-02, + -9.989057153658183e-01, 4.676934690053786e-02, + -9.988967290924684e-01, 4.696088381161159e-02, + -9.988877060925413e-01, 4.715241899606787e-02, + -9.988786463663687e-01, 4.734395244686448e-02, + -9.988695499142836e-01, 4.753548415695930e-02, + -9.988604167366205e-01, 4.772701411931025e-02, + -9.988512468337152e-01, 4.791854232687533e-02, + -9.988420402059048e-01, 4.811006877261259e-02, + -9.988327968535280e-01, 4.830159344948014e-02, + -9.988235167769245e-01, 4.849311635043618e-02, + -9.988141999764354e-01, 4.868463746843894e-02, + -9.988048464524034e-01, 4.887615679644676e-02, + -9.987954562051724e-01, 4.906767432741801e-02, + -9.987860292350876e-01, 4.925919005431114e-02, + -9.987765655424956e-01, 4.945070397008466e-02, + -9.987670651277444e-01, 4.964221606769716e-02, + -9.987575279911833e-01, 4.983372634010728e-02, + -9.987479541331629e-01, 5.002523478027373e-02, + -9.987383435540352e-01, 5.021674138115531e-02, + -9.987286962541537e-01, 5.040824613571086e-02, + -9.987190122338729e-01, 5.059974903689928e-02, + -9.987092914935490e-01, 5.079125007767958e-02, + -9.986995340335393e-01, 5.098274925101080e-02, + -9.986897398542026e-01, 5.117424654985208e-02, + -9.986799089558991e-01, 5.136574196716259e-02, + -9.986700413389901e-01, 5.155723549590161e-02, + -9.986601370038385e-01, 5.174872712902846e-02, + -9.986501959508083e-01, 5.194021685950254e-02, + -9.986402181802653e-01, 5.213170468028332e-02, + -9.986302036925760e-01, 5.232319058433035e-02, + -9.986201524881089e-01, 5.251467456460322e-02, + -9.986100645672333e-01, 5.270615661406163e-02, + -9.985999399303204e-01, 5.289763672566532e-02, + -9.985897785777422e-01, 5.308911489237413e-02, + -9.985795805098725e-01, 5.328059110714795e-02, + -9.985693457270861e-01, 5.347206536294673e-02, + -9.985590742297593e-01, 5.366353765273052e-02, + -9.985487660182699e-01, 5.385500796945944e-02, + -9.985384210929967e-01, 5.404647630609366e-02, + -9.985280394543202e-01, 5.423794265559345e-02, + -9.985176211026222e-01, 5.442940701091913e-02, + -9.985071660382855e-01, 5.462086936503111e-02, + -9.984966742616946e-01, 5.481232971088985e-02, + -9.984861457732354e-01, 5.500378804145592e-02, + -9.984755805732948e-01, 5.519524434968993e-02, + -9.984649786622612e-01, 5.538669862855260e-02, + -9.984543400405248e-01, 5.557815087100468e-02, + -9.984436647084763e-01, 5.576960107000703e-02, + -9.984329526665084e-01, 5.596104921852057e-02, + -9.984222039150150e-01, 5.615249530950629e-02, + -9.984114184543913e-01, 5.634393933592529e-02, + -9.984005962850336e-01, 5.653538129073870e-02, + -9.983897374073402e-01, 5.672682116690775e-02, + -9.983788418217100e-01, 5.691825895739374e-02, + -9.983679095285438e-01, 5.710969465515806e-02, + -9.983569405282434e-01, 5.730112825316216e-02, + -9.983459348212124e-01, 5.749255974436757e-02, + -9.983348924078550e-01, 5.768398912173590e-02, + -9.983238132885776e-01, 5.787541637822886e-02, + -9.983126974637873e-01, 5.806684150680819e-02, + -9.983015449338929e-01, 5.825826450043575e-02, + -9.982903556993044e-01, 5.844968535207348e-02, + -9.982791297604332e-01, 5.864110405468334e-02, + -9.982678671176921e-01, 5.883252060122744e-02, + -9.982565677714952e-01, 5.902393498466793e-02, + -9.982452317222579e-01, 5.921534719796706e-02, + -9.982338589703968e-01, 5.940675723408715e-02, + -9.982224495163305e-01, 5.959816508599059e-02, + -9.982110033604782e-01, 5.978957074663987e-02, + -9.981995205032607e-01, 5.998097420899755e-02, + -9.981880009451003e-01, 6.017237546602626e-02, + -9.981764446864205e-01, 6.036377451068874e-02, + -9.981648517276462e-01, 6.055517133594779e-02, + -9.981532220692038e-01, 6.074656593476629e-02, + -9.981415557115205e-01, 6.093795830010720e-02, + -9.981298526550256e-01, 6.112934842493359e-02, + -9.981181129001492e-01, 6.132073630220858e-02, + -9.981063364473230e-01, 6.151212192489538e-02, + -9.980945232969800e-01, 6.170350528595730e-02, + -9.980826734495546e-01, 6.189488637835772e-02, + -9.980707869054823e-01, 6.208626519506009e-02, + -9.980588636652002e-01, 6.227764172902797e-02, + -9.980469037291468e-01, 6.246901597322500e-02, + -9.980349070977618e-01, 6.266038792061487e-02, + -9.980228737714862e-01, 6.285175756416140e-02, + -9.980108037507625e-01, 6.304312489682849e-02, + -9.979986970360344e-01, 6.323448991158007e-02, + -9.979865536277470e-01, 6.342585260138023e-02, + -9.979743735263470e-01, 6.361721295919310e-02, + -9.979621567322820e-01, 6.380857097798290e-02, + -9.979499032460012e-01, 6.399992665071394e-02, + -9.979376130679553e-01, 6.419127997035064e-02, + -9.979252861985960e-01, 6.438263092985747e-02, + -9.979129226383766e-01, 6.457397952219898e-02, + -9.979005223877516e-01, 6.476532574033989e-02, + -9.978880854471771e-01, 6.495666957724487e-02, + -9.978756118171102e-01, 6.514801102587883e-02, + -9.978631014980095e-01, 6.533935007920663e-02, + -9.978505544903351e-01, 6.553068673019333e-02, + -9.978379707945483e-01, 6.572202097180399e-02, + -9.978253504111116e-01, 6.591335279700380e-02, + -9.978126933404893e-01, 6.610468219875808e-02, + -9.977999995831465e-01, 6.629600917003213e-02, + -9.977872691395500e-01, 6.648733370379145e-02, + -9.977745020101678e-01, 6.667865579300156e-02, + -9.977616981954696e-01, 6.686997543062811e-02, + -9.977488576959257e-01, 6.706129260963682e-02, + -9.977359805120086e-01, 6.725260732299350e-02, + -9.977230666441916e-01, 6.744391956366405e-02, + -9.977101160929496e-01, 6.763522932461448e-02, + -9.976971288587585e-01, 6.782653659881087e-02, + -9.976841049420960e-01, 6.801784137921939e-02, + -9.976710443434410e-01, 6.820914365880633e-02, + -9.976579470632737e-01, 6.840044343053801e-02, + -9.976448131020754e-01, 6.859174068738094e-02, + -9.976316424603293e-01, 6.878303542230163e-02, + -9.976184351385196e-01, 6.897432762826675e-02, + -9.976051911371316e-01, 6.916561729824298e-02, + -9.975919104566526e-01, 6.935690442519721e-02, + -9.975785930975708e-01, 6.954818900209630e-02, + -9.975652390603758e-01, 6.973947102190730e-02, + -9.975518483455584e-01, 6.993075047759731e-02, + -9.975384209536113e-01, 7.012202736213352e-02, + -9.975249568850280e-01, 7.031330166848325e-02, + -9.975114561403035e-01, 7.050457338961386e-02, + -9.974979187199342e-01, 7.069584251849285e-02, + -9.974843446244179e-01, 7.088710904808780e-02, + -9.974707338542537e-01, 7.107837297136640e-02, + -9.974570864099419e-01, 7.126963428129640e-02, + -9.974434022919844e-01, 7.146089297084568e-02, + -9.974296815008842e-01, 7.165214903298221e-02, + -9.974159240371460e-01, 7.184340246067403e-02, + -9.974021299012753e-01, 7.203465324688933e-02, + -9.973882990937795e-01, 7.222590138459632e-02, + -9.973744316151671e-01, 7.241714686676341e-02, + -9.973605274659479e-01, 7.260838968635899e-02, + -9.973465866466332e-01, 7.279962983635167e-02, + -9.973326091577355e-01, 7.299086730971004e-02, + -9.973185949997686e-01, 7.318210209940289e-02, + -9.973045441732480e-01, 7.337333419839903e-02, + -9.972904566786902e-01, 7.356456359966743e-02, + -9.972763325166132e-01, 7.375579029617710e-02, + -9.972621716875362e-01, 7.394701428089720e-02, + -9.972479741919799e-01, 7.413823554679698e-02, + -9.972337400304663e-01, 7.432945408684576e-02, + -9.972194692035187e-01, 7.452066989401300e-02, + -9.972051617116618e-01, 7.471188296126821e-02, + -9.971908175554219e-01, 7.490309328158108e-02, + -9.971764367353262e-01, 7.509430084792130e-02, + -9.971620192519033e-01, 7.528550565325877e-02, + -9.971475651056835e-01, 7.547670769056339e-02, + -9.971330742971981e-01, 7.566790695280523e-02, + -9.971185468269800e-01, 7.585910343295445e-02, + -9.971039826955633e-01, 7.605029712398126e-02, + -9.970893819034834e-01, 7.624148801885607e-02, + -9.970747444512773e-01, 7.643267611054928e-02, + -9.970600703394830e-01, 7.662386139203149e-02, + -9.970453595686400e-01, 7.681504385627334e-02, + -9.970306121392895e-01, 7.700622349624564e-02, + -9.970158280519733e-01, 7.719740030491920e-02, + -9.970010073072353e-01, 7.738857427526505e-02, + -9.969861499056202e-01, 7.757974540025422e-02, + -9.969712558476743e-01, 7.777091367285795e-02, + -9.969563251339453e-01, 7.796207908604749e-02, + -9.969413577649822e-01, 7.815324163279423e-02, + -9.969263537413351e-01, 7.834440130606970e-02, + -9.969113130635557e-01, 7.853555809884548e-02, + -9.968962357321972e-01, 7.872671200409330e-02, + -9.968811217478138e-01, 7.891786301478494e-02, + -9.968659711109613e-01, 7.910901112389238e-02, + -9.968507838221966e-01, 7.930015632438760e-02, + -9.968355598820782e-01, 7.949129860924277e-02, + -9.968202992911657e-01, 7.968243797143013e-02, + -9.968050020500204e-01, 7.987357440392200e-02, + -9.967896681592046e-01, 8.006470789969089e-02, + -9.967742976192820e-01, 8.025583845170932e-02, + -9.967588904308180e-01, 8.044696605295001e-02, + -9.967434465943789e-01, 8.063809069638571e-02, + -9.967279661105325e-01, 8.082921237498933e-02, + -9.967124489798480e-01, 8.102033108173386e-02, + -9.966968952028961e-01, 8.121144680959244e-02, + -9.966813047802483e-01, 8.140255955153824e-02, + -9.966656777124782e-01, 8.159366930054465e-02, + -9.966500140001601e-01, 8.178477604958508e-02, + -9.966343136438699e-01, 8.197587979163307e-02, + -9.966185766441851e-01, 8.216698051966231e-02, + -9.966028030016841e-01, 8.235807822664654e-02, + -9.965869927169470e-01, 8.254917290555967e-02, + -9.965711457905548e-01, 8.274026454937569e-02, + -9.965552622230905e-01, 8.293135315106870e-02, + -9.965393420151379e-01, 8.312243870361291e-02, + -9.965233851672824e-01, 8.331352119998268e-02, + -9.965073916801108e-01, 8.350460063315243e-02, + -9.964913615542109e-01, 8.369567699609672e-02, + -9.964752947901722e-01, 8.388675028179023e-02, + -9.964591913885854e-01, 8.407782048320770e-02, + -9.964430513500426e-01, 8.426888759332407e-02, + -9.964268746751372e-01, 8.445995160511433e-02, + -9.964106613644641e-01, 8.465101251155362e-02, + -9.963944114186193e-01, 8.484207030561713e-02, + -9.963781248382002e-01, 8.503312498028028e-02, + -9.963618016238057e-01, 8.522417652851848e-02, + -9.963454417760359e-01, 8.541522494330733e-02, + -9.963290452954924e-01, 8.560627021762253e-02, + -9.963126121827780e-01, 8.579731234443990e-02, + -9.962961424384968e-01, 8.598835131673534e-02, + -9.962796360632546e-01, 8.617938712748490e-02, + -9.962630930576581e-01, 8.637041976966475e-02, + -9.962465134223155e-01, 8.656144923625117e-02, + -9.962298971578365e-01, 8.675247552022054e-02, + -9.962132442648320e-01, 8.694349861454938e-02, + -9.961965547439142e-01, 8.713451851221430e-02, + -9.961798285956970e-01, 8.732553520619206e-02, + -9.961630658207950e-01, 8.751654868945953e-02, + -9.961462664198246e-01, 8.770755895499366e-02, + -9.961294303934037e-01, 8.789856599577159e-02, + -9.961125577421511e-01, 8.808956980477050e-02, + -9.960956484666873e-01, 8.828057037496774e-02, + -9.960787025676340e-01, 8.847156769934077e-02, + -9.960617200456140e-01, 8.866256177086715e-02, + -9.960447009012520e-01, 8.885355258252460e-02, + -9.960276451351736e-01, 8.904454012729089e-02, + -9.960105527480059e-01, 8.923552439814401e-02, + -9.959934237403774e-01, 8.942650538806196e-02, + -9.959762581129178e-01, 8.961748309002296e-02, + -9.959590558662583e-01, 8.980845749700528e-02, + -9.959418170010313e-01, 8.999942860198734e-02, + -9.959245415178708e-01, 9.019039639794770e-02, + -9.959072294174117e-01, 9.038136087786498e-02, + -9.958898807002907e-01, 9.057232203471799e-02, + -9.958724953671457e-01, 9.076327986148562e-02, + -9.958550734186158e-01, 9.095423435114693e-02, + -9.958376148553416e-01, 9.114518549668100e-02, + -9.958201196779649e-01, 9.133613329106718e-02, + -9.958025878871292e-01, 9.152707772728483e-02, + -9.957850194834788e-01, 9.171801879831346e-02, + -9.957674144676598e-01, 9.190895649713272e-02, + -9.957497728403195e-01, 9.209989081672239e-02, + -9.957320946021064e-01, 9.229082175006235e-02, + -9.957143797536706e-01, 9.248174929013260e-02, + -9.956966282956635e-01, 9.267267342991331e-02, + -9.956788402287375e-01, 9.286359416238472e-02, + -9.956610155535469e-01, 9.305451148052725e-02, + -9.956431542707469e-01, 9.324542537732138e-02, + -9.956252563809943e-01, 9.343633584574779e-02, + -9.956073218849470e-01, 9.362724287878720e-02, + -9.955893507832646e-01, 9.381814646942055e-02, + -9.955713430766078e-01, 9.400904661062884e-02, + -9.955532987656385e-01, 9.419994329539320e-02, + -9.955352178510204e-01, 9.439083651669494e-02, + -9.955171003334181e-01, 9.458172626751545e-02, + -9.954989462134978e-01, 9.477261254083624e-02, + -9.954807554919269e-01, 9.496349532963899e-02, + -9.954625281693744e-01, 9.515437462690549e-02, + -9.954442642465103e-01, 9.534525042561762e-02, + -9.954259637240062e-01, 9.553612271875747e-02, + -9.954076266025349e-01, 9.572699149930716e-02, + -9.953892528827707e-01, 9.591785676024904e-02, + -9.953708425653890e-01, 9.610871849456551e-02, + -9.953523956510668e-01, 9.629957669523913e-02, + -9.953339121404823e-01, 9.649043135525259e-02, + -9.953153920343151e-01, 9.668128246758873e-02, + -9.952968353332461e-01, 9.687213002523047e-02, + -9.952782420379577e-01, 9.706297402116092e-02, + -9.952596121491334e-01, 9.725381444836327e-02, + -9.952409456674581e-01, 9.744465129982087e-02, + -9.952222425936184e-01, 9.763548456851720e-02, + -9.952035029283015e-01, 9.782631424743586e-02, + -9.951847266721969e-01, 9.801714032956060e-02, + -9.951659138259946e-01, 9.820796280787528e-02, + -9.951470643903865e-01, 9.839878167536388e-02, + -9.951281783660655e-01, 9.858959692501058e-02, + -9.951092557537261e-01, 9.878040854979962e-02, + -9.950902965540640e-01, 9.897121654271543e-02, + -9.950713007677762e-01, 9.916202089674250e-02, + -9.950522683955610e-01, 9.935282160486554e-02, + -9.950331994381186e-01, 9.954361866006932e-02, + -9.950140938961497e-01, 9.973441205533883e-02, + -9.949949517703570e-01, 9.992520178365907e-02, + -9.949757730614441e-01, 1.001159878380153e-01, + -9.949565577701164e-01, 1.003067702113929e-01, + -9.949373058970801e-01, 1.004975488967772e-01, + -9.949180174430432e-01, 1.006883238871540e-01, + -9.948986924087149e-01, 1.008790951755089e-01, + -9.948793307948056e-01, 1.010698627548278e-01, + -9.948599326020273e-01, 1.012606266180968e-01, + -9.948404978310932e-01, 1.014513867583021e-01, + -9.948210264827179e-01, 1.016421431684298e-01, + -9.948015185576171e-01, 1.018328958414665e-01, + -9.947819740565083e-01, 1.020236447703987e-01, + -9.947623929801099e-01, 1.022143899482132e-01, + -9.947427753291420e-01, 1.024051313678967e-01, + -9.947231211043257e-01, 1.025958690224363e-01, + -9.947034303063839e-01, 1.027866029048190e-01, + -9.946837029360402e-01, 1.029773330080322e-01, + -9.946639389940204e-01, 1.031680593250632e-01, + -9.946441384810507e-01, 1.033587818488996e-01, + -9.946243013978594e-01, 1.035495005725291e-01, + -9.946044277451757e-01, 1.037402154889394e-01, + -9.945845175237303e-01, 1.039309265911185e-01, + -9.945645707342554e-01, 1.041216338720546e-01, + -9.945445873774843e-01, 1.043123373247358e-01, + -9.945245674541517e-01, 1.045030369421506e-01, + -9.945045109649937e-01, 1.046937327172874e-01, + -9.944844179107476e-01, 1.048844246431350e-01, + -9.944642882921524e-01, 1.050751127126820e-01, + -9.944441221099480e-01, 1.052657969189176e-01, + -9.944239193648760e-01, 1.054564772548307e-01, + -9.944036800576791e-01, 1.056471537134106e-01, + -9.943834041891014e-01, 1.058378262876467e-01, + -9.943630917598886e-01, 1.060284949705284e-01, + -9.943427427707873e-01, 1.062191597550455e-01, + -9.943223572225458e-01, 1.064098206341877e-01, + -9.943019351159136e-01, 1.066004776009450e-01, + -9.942814764516416e-01, 1.067911306483074e-01, + -9.942609812304818e-01, 1.069817797692652e-01, + -9.942404494531879e-01, 1.071724249568088e-01, + -9.942198811205150e-01, 1.073630662039288e-01, + -9.941992762332189e-01, 1.075537035036156e-01, + -9.941786347920576e-01, 1.077443368488603e-01, + -9.941579567977897e-01, 1.079349662326537e-01, + -9.941372422511757e-01, 1.081255916479869e-01, + -9.941164911529771e-01, 1.083162130878512e-01, + -9.940957035039569e-01, 1.085068305452379e-01, + -9.940748793048794e-01, 1.086974440131387e-01, + -9.940540185565102e-01, 1.088880534845452e-01, + -9.940331212596164e-01, 1.090786589524492e-01, + -9.940121874149662e-01, 1.092692604098428e-01, + -9.939912170233294e-01, 1.094598578497180e-01, + -9.939702100854769e-01, 1.096504512650671e-01, + -9.939491666021811e-01, 1.098410406488826e-01, + -9.939280865742158e-01, 1.100316259941570e-01, + -9.939069700023561e-01, 1.102222072938831e-01, + -9.938858168873781e-01, 1.104127845410536e-01, + -9.938646272300597e-01, 1.106033577286617e-01, + -9.938434010311802e-01, 1.107939268497006e-01, + -9.938221382915197e-01, 1.109844918971634e-01, + -9.938008390118601e-01, 1.111750528640437e-01, + -9.937795031929846e-01, 1.113656097433352e-01, + -9.937581308356774e-01, 1.115561625280315e-01, + -9.937367219407246e-01, 1.117467112111266e-01, + -9.937152765089132e-01, 1.119372557856146e-01, + -9.936937945410318e-01, 1.121277962444896e-01, + -9.936722760378700e-01, 1.123183325807462e-01, + -9.936507210002191e-01, 1.125088647873787e-01, + -9.936291294288717e-01, 1.126993928573819e-01, + -9.936075013246216e-01, 1.128899167837505e-01, + -9.935858366882640e-01, 1.130804365594796e-01, + -9.935641355205953e-01, 1.132709521775643e-01, + -9.935423978224136e-01, 1.134614636309999e-01, + -9.935206235945181e-01, 1.136519709127819e-01, + -9.934988128377094e-01, 1.138424740159057e-01, + -9.934769655527892e-01, 1.140329729333672e-01, + -9.934550817405610e-01, 1.142234676581623e-01, + -9.934331614018294e-01, 1.144139581832869e-01, + -9.934112045374001e-01, 1.146044445017374e-01, + -9.933892111480807e-01, 1.147949266065101e-01, + -9.933671812346796e-01, 1.149854044906015e-01, + -9.933451147980069e-01, 1.151758781470082e-01, + -9.933230118388740e-01, 1.153663475687271e-01, + -9.933008723580933e-01, 1.155568127487553e-01, + -9.932786963564790e-01, 1.157472736800897e-01, + -9.932564838348464e-01, 1.159377303557278e-01, + -9.932342347940123e-01, 1.161281827686669e-01, + -9.932119492347945e-01, 1.163186309119048e-01, + -9.931896271580126e-01, 1.165090747784390e-01, + -9.931672685644872e-01, 1.166995143612677e-01, + -9.931448734550404e-01, 1.168899496533888e-01, + -9.931224418304956e-01, 1.170803806478006e-01, + -9.930999736916776e-01, 1.172708073375015e-01, + -9.930774690394123e-01, 1.174612297154900e-01, + -9.930549278745273e-01, 1.176516477747649e-01, + -9.930323501978514e-01, 1.178420615083250e-01, + -9.930097360102146e-01, 1.180324709091693e-01, + -9.929870853124484e-01, 1.182228759702972e-01, + -9.929643981053856e-01, 1.184132766847078e-01, + -9.929416743898605e-01, 1.186036730454007e-01, + -9.929189141667083e-01, 1.187940650453756e-01, + -9.928961174367660e-01, 1.189844526776323e-01, + -9.928732842008717e-01, 1.191748359351709e-01, + -9.928504144598651e-01, 1.193652148109914e-01, + -9.928275082145868e-01, 1.195555892980941e-01, + -9.928045654658791e-01, 1.197459593894796e-01, + -9.927815862145856e-01, 1.199363250781485e-01, + -9.927585704615511e-01, 1.201266863571015e-01, + -9.927355182076218e-01, 1.203170432193397e-01, + -9.927124294536455e-01, 1.205073956578641e-01, + -9.926893042004707e-01, 1.206977436656761e-01, + -9.926661424489480e-01, 1.208880872357771e-01, + -9.926429441999288e-01, 1.210784263611686e-01, + -9.926197094542661e-01, 1.212687610348526e-01, + -9.925964382128143e-01, 1.214590912498308e-01, + -9.925731304764288e-01, 1.216494169991055e-01, + -9.925497862459667e-01, 1.218397382756789e-01, + -9.925264055222861e-01, 1.220300550725534e-01, + -9.925029883062470e-01, 1.222203673827315e-01, + -9.924795345987100e-01, 1.224106751992162e-01, + -9.924560444005377e-01, 1.226009785150102e-01, + -9.924325177125937e-01, 1.227912773231168e-01, + -9.924089545357428e-01, 1.229815716165391e-01, + -9.923853548708517e-01, 1.231718613882805e-01, + -9.923617187187879e-01, 1.233621466313447e-01, + -9.923380460804204e-01, 1.235524273387354e-01, + -9.923143369566196e-01, 1.237427035034565e-01, + -9.922905913482574e-01, 1.239329751185122e-01, + -9.922668092562066e-01, 1.241232421769066e-01, + -9.922429906813417e-01, 1.243135046716442e-01, + -9.922191356245385e-01, 1.245037625957297e-01, + -9.921952440866739e-01, 1.246940159421676e-01, + -9.921713160686265e-01, 1.248842647039631e-01, + -9.921473515712761e-01, 1.250745088741212e-01, + -9.921233505955037e-01, 1.252647484456471e-01, + -9.920993131421918e-01, 1.254549834115462e-01, + -9.920752392122241e-01, 1.256452137648243e-01, + -9.920511288064857e-01, 1.258354394984870e-01, + -9.920269819258634e-01, 1.260256606055403e-01, + -9.920027985712445e-01, 1.262158770789903e-01, + -9.919785787435186e-01, 1.264060889118434e-01, + -9.919543224435760e-01, 1.265962960971058e-01, + -9.919300296723085e-01, 1.267864986277844e-01, + -9.919057004306093e-01, 1.269766964968859e-01, + -9.918813347193730e-01, 1.271668896974172e-01, + -9.918569325394955e-01, 1.273570782223854e-01, + -9.918324938918738e-01, 1.275472620647980e-01, + -9.918080187774064e-01, 1.277374412176623e-01, + -9.917835071969935e-01, 1.279276156739861e-01, + -9.917589591515361e-01, 1.281177854267771e-01, + -9.917343746419368e-01, 1.283079504690434e-01, + -9.917097536690995e-01, 1.284981107937932e-01, + -9.916850962339294e-01, 1.286882663940347e-01, + -9.916604023373332e-01, 1.288784172627765e-01, + -9.916356719802187e-01, 1.290685633930274e-01, + -9.916109051634954e-01, 1.292587047777961e-01, + -9.915861018880735e-01, 1.294488414100918e-01, + -9.915612621548653e-01, 1.296389732829236e-01, + -9.915363859647839e-01, 1.298291003893009e-01, + -9.915114733187439e-01, 1.300192227222333e-01, + -9.914865242176615e-01, 1.302093402747306e-01, + -9.914615386624538e-01, 1.303994530398027e-01, + -9.914365166540394e-01, 1.305895610104597e-01, + -9.914114581933385e-01, 1.307796641797117e-01, + -9.913863632812723e-01, 1.309697625405694e-01, + -9.913612319187635e-01, 1.311598560860433e-01, + -9.913360641067361e-01, 1.313499448091442e-01, + -9.913108598461154e-01, 1.315400287028831e-01, + -9.912856191378282e-01, 1.317301077602712e-01, + -9.912603419828024e-01, 1.319201819743198e-01, + -9.912350283819674e-01, 1.321102513380404e-01, + -9.912096783362541e-01, 1.323003158444447e-01, + -9.911842918465942e-01, 1.324903754865445e-01, + -9.911588689139214e-01, 1.326804302573521e-01, + -9.911334095391702e-01, 1.328704801498794e-01, + -9.911079137232769e-01, 1.330605251571391e-01, + -9.910823814671786e-01, 1.332505652721436e-01, + -9.910568127718143e-01, 1.334406004879057e-01, + -9.910312076381241e-01, 1.336306307974383e-01, + -9.910055660670494e-01, 1.338206561937547e-01, + -9.909798880595327e-01, 1.340106766698681e-01, + -9.909541736165185e-01, 1.342006922187920e-01, + -9.909284227389520e-01, 1.343907028335401e-01, + -9.909026354277800e-01, 1.345807085071262e-01, + -9.908768116839507e-01, 1.347707092325643e-01, + -9.908509515084136e-01, 1.349607050028687e-01, + -9.908250549021195e-01, 1.351506958110539e-01, + -9.907991218660204e-01, 1.353406816501342e-01, + -9.907731524010698e-01, 1.355306625131246e-01, + -9.907471465082227e-01, 1.357206383930399e-01, + -9.907211041884352e-01, 1.359106092828953e-01, + -9.906950254426646e-01, 1.361005751757062e-01, + -9.906689102718701e-01, 1.362905360644880e-01, + -9.906427586770116e-01, 1.364804919422563e-01, + -9.906165706590506e-01, 1.366704428020271e-01, + -9.905903462189501e-01, 1.368603886368164e-01, + -9.905640853576744e-01, 1.370503294396404e-01, + -9.905377880761888e-01, 1.372402652035156e-01, + -9.905114543754603e-01, 1.374301959214586e-01, + -9.904850842564571e-01, 1.376201215864860e-01, + -9.904586777201486e-01, 1.378100421916151e-01, + -9.904322347675060e-01, 1.379999577298628e-01, + -9.904057553995013e-01, 1.381898681942466e-01, + -9.903792396171082e-01, 1.383797735777839e-01, + -9.903526874213014e-01, 1.385696738734925e-01, + -9.903260988130573e-01, 1.387595690743904e-01, + -9.902994737933536e-01, 1.389494591734955e-01, + -9.902728123631691e-01, 1.391393441638262e-01, + -9.902461145234840e-01, 1.393292240384010e-01, + -9.902193802752800e-01, 1.395190987902385e-01, + -9.901926096195400e-01, 1.397089684123576e-01, + -9.901658025572484e-01, 1.398988328977772e-01, + -9.901389590893906e-01, 1.400886922395167e-01, + -9.901120792169538e-01, 1.402785464305954e-01, + -9.900851629409260e-01, 1.404683954640330e-01, + -9.900582102622971e-01, 1.406582393328492e-01, + -9.900312211820580e-01, 1.408480780300641e-01, + -9.900041957012009e-01, 1.410379115486977e-01, + -9.899771338207196e-01, 1.412277398817705e-01, + -9.899500355416090e-01, 1.414175630223030e-01, + -9.899229008648655e-01, 1.416073809633160e-01, + -9.898957297914867e-01, 1.417971936978304e-01, + -9.898685223224716e-01, 1.419870012188673e-01, + -9.898412784588205e-01, 1.421768035194480e-01, + -9.898139982015353e-01, 1.423666005925942e-01, + -9.897866815516186e-01, 1.425563924313273e-01, + -9.897593285100752e-01, 1.427461790286695e-01, + -9.897319390779106e-01, 1.429359603776427e-01, + -9.897045132561318e-01, 1.431257364712692e-01, + -9.896770510457472e-01, 1.433155073025715e-01, + -9.896495524477665e-01, 1.435052728645723e-01, + -9.896220174632009e-01, 1.436950331502945e-01, + -9.895944460930625e-01, 1.438847881527610e-01, + -9.895668383383651e-01, 1.440745378649952e-01, + -9.895391942001239e-01, 1.442642822800204e-01, + -9.895115136793552e-01, 1.444540213908605e-01, + -9.894837967770768e-01, 1.446437551905390e-01, + -9.894560434943077e-01, 1.448334836720802e-01, + -9.894282538320682e-01, 1.450232068285082e-01, + -9.894004277913804e-01, 1.452129246528475e-01, + -9.893725653732670e-01, 1.454026371381226e-01, + -9.893446665787526e-01, 1.455923442773583e-01, + -9.893167314088630e-01, 1.457820460635799e-01, + -9.892887598646252e-01, 1.459717424898122e-01, + -9.892607519470676e-01, 1.461614335490809e-01, + -9.892327076572200e-01, 1.463511192344115e-01, + -9.892046269961138e-01, 1.465407995388298e-01, + -9.891765099647810e-01, 1.467304744553617e-01, + -9.891483565642556e-01, 1.469201439770336e-01, + -9.891201667955727e-01, 1.471098080968718e-01, + -9.890919406597688e-01, 1.472994668079028e-01, + -9.890636781578815e-01, 1.474891201031536e-01, + -9.890353792909503e-01, 1.476787679756510e-01, + -9.890070440600153e-01, 1.478684104184222e-01, + -9.889786724661185e-01, 1.480580474244947e-01, + -9.889502645103030e-01, 1.482476789868960e-01, + -9.889218201936132e-01, 1.484373050986540e-01, + -9.888933395170951e-01, 1.486269257527965e-01, + -9.888648224817956e-01, 1.488165409423519e-01, + -9.888362690887635e-01, 1.490061506603484e-01, + -9.888076793390485e-01, 1.491957548998148e-01, + -9.887790532337015e-01, 1.493853536537797e-01, + -9.887503907737754e-01, 1.495749469152722e-01, + -9.887216919603238e-01, 1.497645346773215e-01, + -9.886929567944020e-01, 1.499541169329570e-01, + -9.886641852770662e-01, 1.501436936752082e-01, + -9.886353774093748e-01, 1.503332648971050e-01, + -9.886065331923864e-01, 1.505228305916774e-01, + -9.885776526271620e-01, 1.507123907519556e-01, + -9.885487357147632e-01, 1.509019453709700e-01, + -9.885197824562533e-01, 1.510914944417513e-01, + -9.884907928526966e-01, 1.512810379573302e-01, + -9.884617669051593e-01, 1.514705759107378e-01, + -9.884327046147083e-01, 1.516601082950053e-01, + -9.884036059824124e-01, 1.518496351031642e-01, + -9.883744710093413e-01, 1.520391563282461e-01, + -9.883452996965661e-01, 1.522286719632827e-01, + -9.883160920451597e-01, 1.524181820013063e-01, + -9.882868480561958e-01, 1.526076864353491e-01, + -9.882575677307495e-01, 1.527971852584434e-01, + -9.882282510698974e-01, 1.529866784636220e-01, + -9.881988980747176e-01, 1.531761660439178e-01, + -9.881695087462891e-01, 1.533656479923639e-01, + -9.881400830856926e-01, 1.535551243019934e-01, + -9.881106210940098e-01, 1.537445949658400e-01, + -9.880811227723241e-01, 1.539340599769373e-01, + -9.880515881217201e-01, 1.541235193283194e-01, + -9.880220171432835e-01, 1.543129730130201e-01, + -9.879924098381019e-01, 1.545024210240739e-01, + -9.879627662072634e-01, 1.546918633545154e-01, + -9.879330862518584e-01, 1.548812999973793e-01, + -9.879033699729778e-01, 1.550707309457005e-01, + -9.878736173717142e-01, 1.552601561925142e-01, + -9.878438284491617e-01, 1.554495757308559e-01, + -9.878140032064155e-01, 1.556389895537609e-01, + -9.877841416445722e-01, 1.558283976542652e-01, + -9.877542437647295e-01, 1.560178000254048e-01, + -9.877243095679870e-01, 1.562071966602159e-01, + -9.876943390554451e-01, 1.563965875517349e-01, + -9.876643322282057e-01, 1.565859726929984e-01, + -9.876342890873722e-01, 1.567753520770434e-01, + -9.876042096340492e-01, 1.569647256969068e-01, + -9.875740938693424e-01, 1.571540935456259e-01, + -9.875439417943592e-01, 1.573434556162382e-01, + -9.875137534102084e-01, 1.575328119017815e-01, + -9.874835287179997e-01, 1.577221623952936e-01, + -9.874532677188446e-01, 1.579115070898127e-01, + -9.874229704138554e-01, 1.581008459783770e-01, + -9.873926368041462e-01, 1.582901790540252e-01, + -9.873622668908324e-01, 1.584795063097960e-01, + -9.873318606750304e-01, 1.586688277387283e-01, + -9.873014181578584e-01, 1.588581433338614e-01, + -9.872709393404354e-01, 1.590474530882348e-01, + -9.872404242238823e-01, 1.592367569948878e-01, + -9.872098728093208e-01, 1.594260550468606e-01, + -9.871792850978743e-01, 1.596153472371931e-01, + -9.871486610906676e-01, 1.598046335589254e-01, + -9.871180007888263e-01, 1.599939140050983e-01, + -9.870873041934779e-01, 1.601831885687522e-01, + -9.870565713057510e-01, 1.603724572429283e-01, + -9.870258021267756e-01, 1.605617200206675e-01, + -9.869949966576830e-01, 1.607509768950112e-01, + -9.869641548996057e-01, 1.609402278590011e-01, + -9.869332768536777e-01, 1.611294729056788e-01, + -9.869023625210345e-01, 1.613187120280864e-01, + -9.868714119028125e-01, 1.615079452192661e-01, + -9.868404250001497e-01, 1.616971724722604e-01, + -9.868094018141855e-01, 1.618863937801118e-01, + -9.867783423460604e-01, 1.620756091358633e-01, + -9.867472465969166e-01, 1.622648185325580e-01, + -9.867161145678971e-01, 1.624540219632392e-01, + -9.866849462601467e-01, 1.626432194209503e-01, + -9.866537416748113e-01, 1.628324108987352e-01, + -9.866225008130385e-01, 1.630215963896378e-01, + -9.865912236759764e-01, 1.632107758867024e-01, + -9.865599102647754e-01, 1.633999493829732e-01, + -9.865285605805867e-01, 1.635891168714950e-01, + -9.864971746245629e-01, 1.637782783453127e-01, + -9.864657523978579e-01, 1.639674337974712e-01, + -9.864342939016272e-01, 1.641565832210158e-01, + -9.864027991370272e-01, 1.643457266089922e-01, + -9.863712681052160e-01, 1.645348639544460e-01, + -9.863397008073530e-01, 1.647239952504232e-01, + -9.863080972445987e-01, 1.649131204899699e-01, + -9.862764574181151e-01, 1.651022396661327e-01, + -9.862447813290655e-01, 1.652913527719580e-01, + -9.862130689786145e-01, 1.654804598004928e-01, + -9.861813203679283e-01, 1.656695607447841e-01, + -9.861495354981739e-01, 1.658586555978793e-01, + -9.861177143705201e-01, 1.660477443528258e-01, + -9.860858569861368e-01, 1.662368270026714e-01, + -9.860539633461954e-01, 1.664259035404641e-01, + -9.860220334518686e-01, 1.666149739592521e-01, + -9.859900673043301e-01, 1.668040382520837e-01, + -9.859580649047555e-01, 1.669930964120077e-01, + -9.859260262543211e-01, 1.671821484320729e-01, + -9.858939513542052e-01, 1.673711943053284e-01, + -9.858618402055870e-01, 1.675602340248236e-01, + -9.858296928096470e-01, 1.677492675836079e-01, + -9.857975091675675e-01, 1.679382949747312e-01, + -9.857652892805313e-01, 1.681273161912434e-01, + -9.857330331497235e-01, 1.683163312261948e-01, + -9.857007407763299e-01, 1.685053400726359e-01, + -9.856684121615376e-01, 1.686943427236173e-01, + -9.856360473065354e-01, 1.688833391721900e-01, + -9.856036462125134e-01, 1.690723294114050e-01, + -9.855712088806627e-01, 1.692613134343138e-01, + -9.855387353121761e-01, 1.694502912339680e-01, + -9.855062255082473e-01, 1.696392628034193e-01, + -9.854736794700718e-01, 1.698282281357198e-01, + -9.854410971988462e-01, 1.700171872239220e-01, + -9.854084786957684e-01, 1.702061400610781e-01, + -9.853758239620377e-01, 1.703950866402409e-01, + -9.853431329988548e-01, 1.705840269544636e-01, + -9.853104058074216e-01, 1.707729609967992e-01, + -9.852776423889412e-01, 1.709618887603012e-01, + -9.852448427446185e-01, 1.711508102380233e-01, + -9.852120068756594e-01, 1.713397254230193e-01, + -9.851791347832711e-01, 1.715286343083434e-01, + -9.851462264686622e-01, 1.717175368870500e-01, + -9.851132819330427e-01, 1.719064331521935e-01, + -9.850803011776238e-01, 1.720953230968290e-01, + -9.850472842036182e-01, 1.722842067140114e-01, + -9.850142310122398e-01, 1.724730839967960e-01, + -9.849811416047040e-01, 1.726619549382383e-01, + -9.849480159822270e-01, 1.728508195313941e-01, + -9.849148541460272e-01, 1.730396777693194e-01, + -9.848816560973237e-01, 1.732285296450703e-01, + -9.848484218373370e-01, 1.734173751517035e-01, + -9.848151513672891e-01, 1.736062142822754e-01, + -9.847818446884034e-01, 1.737950470298432e-01, + -9.847485018019042e-01, 1.739838733874638e-01, + -9.847151227090176e-01, 1.741726933481948e-01, + -9.846817074109709e-01, 1.743615069050937e-01, + -9.846482559089926e-01, 1.745503140512185e-01, + -9.846147682043126e-01, 1.747391147796272e-01, + -9.845812442981622e-01, 1.749279090833782e-01, + -9.845476841917740e-01, 1.751166969555299e-01, + -9.845140878863818e-01, 1.753054783891413e-01, + -9.844804553832209e-01, 1.754942533772714e-01, + -9.844467866835279e-01, 1.756830219129795e-01, + -9.844130817885407e-01, 1.758717839893250e-01, + -9.843793406994985e-01, 1.760605395993678e-01, + -9.843455634176419e-01, 1.762492887361679e-01, + -9.843117499442128e-01, 1.764380313927854e-01, + -9.842779002804544e-01, 1.766267675622809e-01, + -9.842440144276111e-01, 1.768154972377150e-01, + -9.842100923869290e-01, 1.770042204121487e-01, + -9.841761341596553e-01, 1.771929370786433e-01, + -9.841421397470386e-01, 1.773816472302600e-01, + -9.841081091503285e-01, 1.775703508600607e-01, + -9.840740423707764e-01, 1.777590479611072e-01, + -9.840399394096350e-01, 1.779477385264616e-01, + -9.840058002681579e-01, 1.781364225491863e-01, + -9.839716249476003e-01, 1.783251000223440e-01, + -9.839374134492189e-01, 1.785137709389975e-01, + -9.839031657742715e-01, 1.787024352922100e-01, + -9.838688819240172e-01, 1.788910930750447e-01, + -9.838345618997166e-01, 1.790797442805654e-01, + -9.838002057026316e-01, 1.792683889018357e-01, + -9.837658133340252e-01, 1.794570269319199e-01, + -9.837313847951621e-01, 1.796456583638822e-01, + -9.836969200873081e-01, 1.798342831907871e-01, + -9.836624192117303e-01, 1.800229014056995e-01, + -9.836278821696972e-01, 1.802115130016844e-01, + -9.835933089624787e-01, 1.804001179718072e-01, + -9.835586995913459e-01, 1.805887163091333e-01, + -9.835240540575713e-01, 1.807773080067286e-01, + -9.834893723624287e-01, 1.809658930576590e-01, + -9.834546545071933e-01, 1.811544714549908e-01, + -9.834199004931415e-01, 1.813430431917905e-01, + -9.833851103215512e-01, 1.815316082611250e-01, + -9.833502839937015e-01, 1.817201666560611e-01, + -9.833154215108728e-01, 1.819087183696662e-01, + -9.832805228743470e-01, 1.820972633950076e-01, + -9.832455880854071e-01, 1.822858017251533e-01, + -9.832106171453376e-01, 1.824743333531711e-01, + -9.831756100554244e-01, 1.826628582721293e-01, + -9.831405668169545e-01, 1.828513764750963e-01, + -9.831054874312163e-01, 1.830398879551410e-01, + -9.830703718994996e-01, 1.832283927053321e-01, + -9.830352202230956e-01, 1.834168907187391e-01, + -9.830000324032966e-01, 1.836053819884313e-01, + -9.829648084413964e-01, 1.837938665074784e-01, + -9.829295483386902e-01, 1.839823442689505e-01, + -9.828942520964741e-01, 1.841708152659177e-01, + -9.828589197160461e-01, 1.843592794914505e-01, + -9.828235511987052e-01, 1.845477369386196e-01, + -9.827881465457520e-01, 1.847361876004960e-01, + -9.827527057584878e-01, 1.849246314701508e-01, + -9.827172288382160e-01, 1.851130685406555e-01, + -9.826817157862409e-01, 1.853014988050819e-01, + -9.826461666038680e-01, 1.854899222565019e-01, + -9.826105812924048e-01, 1.856783388879876e-01, + -9.825749598531592e-01, 1.858667486926117e-01, + -9.825393022874412e-01, 1.860551516634466e-01, + -9.825036085965618e-01, 1.862435477935656e-01, + -9.824678787818332e-01, 1.864319370760416e-01, + -9.824321128445691e-01, 1.866203195039483e-01, + -9.823963107860847e-01, 1.868086950703593e-01, + -9.823604726076962e-01, 1.869970637683485e-01, + -9.823245983107213e-01, 1.871854255909903e-01, + -9.822886878964788e-01, 1.873737805313591e-01, + -9.822527413662894e-01, 1.875621285825296e-01, + -9.822167587214745e-01, 1.877504697375768e-01, + -9.821807399633571e-01, 1.879388039895759e-01, + -9.821446850932616e-01, 1.881271313316024e-01, + -9.821085941125136e-01, 1.883154517567321e-01, + -9.820724670224400e-01, 1.885037652580409e-01, + -9.820363038243690e-01, 1.886920718286052e-01, + -9.820001045196305e-01, 1.888803714615014e-01, + -9.819638691095552e-01, 1.890686641498062e-01, + -9.819275975954755e-01, 1.892569498865967e-01, + -9.818912899787251e-01, 1.894452286649502e-01, + -9.818549462606386e-01, 1.896335004779442e-01, + -9.818185664425525e-01, 1.898217653186564e-01, + -9.817821505258043e-01, 1.900100231801650e-01, + -9.817456985117330e-01, 1.901982740555481e-01, + -9.817092104016788e-01, 1.903865179378845e-01, + -9.816726861969831e-01, 1.905747548202527e-01, + -9.816361258989891e-01, 1.907629846957321e-01, + -9.815995295090407e-01, 1.909512075574018e-01, + -9.815628970284836e-01, 1.911394233983414e-01, + -9.815262284586648e-01, 1.913276322116309e-01, + -9.814895238009321e-01, 1.915158339903502e-01, + -9.814527830566355e-01, 1.917040287275798e-01, + -9.814160062271255e-01, 1.918922164164002e-01, + -9.813791933137546e-01, 1.920803970498924e-01, + -9.813423443178760e-01, 1.922685706211375e-01, + -9.813054592408447e-01, 1.924567371232168e-01, + -9.812685380840167e-01, 1.926448965492121e-01, + -9.812315808487497e-01, 1.928330488922052e-01, + -9.811945875364023e-01, 1.930211941452784e-01, + -9.811575581483348e-01, 1.932093323015140e-01, + -9.811204926859087e-01, 1.933974633539947e-01, + -9.810833911504867e-01, 1.935855872958036e-01, + -9.810462535434328e-01, 1.937737041200238e-01, + -9.810090798661126e-01, 1.939618138197388e-01, + -9.809718701198928e-01, 1.941499163880324e-01, + -9.809346243061416e-01, 1.943380118179886e-01, + -9.808973424262284e-01, 1.945261001026916e-01, + -9.808600244815239e-01, 1.947141812352260e-01, + -9.808226704734001e-01, 1.949022552086765e-01, + -9.807852804032304e-01, 1.950903220161282e-01, + -9.807478542723898e-01, 1.952783816506665e-01, + -9.807103920822540e-01, 1.954664341053770e-01, + -9.806728938342005e-01, 1.956544793733454e-01, + -9.806353595296081e-01, 1.958425174476578e-01, + -9.805977891698568e-01, 1.960305483214008e-01, + -9.805601827563278e-01, 1.962185719876609e-01, + -9.805225402904041e-01, 1.964065884395250e-01, + -9.804848617734694e-01, 1.965945976700802e-01, + -9.804471472069091e-01, 1.967825996724141e-01, + -9.804093965921099e-01, 1.969705944396143e-01, + -9.803716099304598e-01, 1.971585819647689e-01, + -9.803337872233480e-01, 1.973465622409659e-01, + -9.802959284721653e-01, 1.975345352612940e-01, + -9.802580336783036e-01, 1.977225010188419e-01, + -9.802201028431561e-01, 1.979104595066987e-01, + -9.801821359681174e-01, 1.980984107179536e-01, + -9.801441330545836e-01, 1.982863546456962e-01, + -9.801060941039518e-01, 1.984742912830164e-01, + -9.800680191176206e-01, 1.986622206230042e-01, + -9.800299080969901e-01, 1.988501426587501e-01, + -9.799917610434612e-01, 1.990380573833447e-01, + -9.799535779584367e-01, 1.992259647898788e-01, + -9.799153588433205e-01, 1.994138648714438e-01, + -9.798771036995176e-01, 1.996017576211310e-01, + -9.798388125284347e-01, 1.997896430320321e-01, + -9.798004853314798e-01, 1.999775210972392e-01, + -9.797621221100618e-01, 2.001653918098444e-01, + -9.797237228655912e-01, 2.003532551629404e-01, + -9.796852875994799e-01, 2.005411111496200e-01, + -9.796468163131412e-01, 2.007289597629761e-01, + -9.796083090079895e-01, 2.009168009961022e-01, + -9.795697656854405e-01, 2.011046348420919e-01, + -9.795311863469115e-01, 2.012924612940390e-01, + -9.794925709938208e-01, 2.014802803450377e-01, + -9.794539196275882e-01, 2.016680919881825e-01, + -9.794152322496348e-01, 2.018558962165680e-01, + -9.793765088613832e-01, 2.020436930232893e-01, + -9.793377494642568e-01, 2.022314824014415e-01, + -9.792989540596810e-01, 2.024192643441202e-01, + -9.792601226490820e-01, 2.026070388444211e-01, + -9.792212552338877e-01, 2.027948058954404e-01, + -9.791823518155269e-01, 2.029825654902744e-01, + -9.791434123954302e-01, 2.031703176220198e-01, + -9.791044369750292e-01, 2.033580622837733e-01, + -9.790654255557569e-01, 2.035457994686322e-01, + -9.790263781390476e-01, 2.037335291696939e-01, + -9.789872947263370e-01, 2.039212513800561e-01, + -9.789481753190622e-01, 2.041089660928169e-01, + -9.789090199186613e-01, 2.042966733010744e-01, + -9.788698285265741e-01, 2.044843729979272e-01, + -9.788306011442415e-01, 2.046720651764742e-01, + -9.787913377731057e-01, 2.048597498298144e-01, + -9.787520384146103e-01, 2.050474269510472e-01, + -9.787127030702004e-01, 2.052350965332723e-01, + -9.786733317413222e-01, 2.054227585695896e-01, + -9.786339244294232e-01, 2.056104130530992e-01, + -9.785944811359523e-01, 2.057980599769018e-01, + -9.785550018623596e-01, 2.059856993340979e-01, + -9.785154866100969e-01, 2.061733311177887e-01, + -9.784759353806168e-01, 2.063609553210755e-01, + -9.784363481753737e-01, 2.065485719370599e-01, + -9.783967249958231e-01, 2.067361809588437e-01, + -9.783570658434216e-01, 2.069237823795291e-01, + -9.783173707196277e-01, 2.071113761922186e-01, + -9.782776396259005e-01, 2.072989623900147e-01, + -9.782378725637011e-01, 2.074865409660206e-01, + -9.781980695344914e-01, 2.076741119133396e-01, + -9.781582305397350e-01, 2.078616752250751e-01, + -9.781183555808967e-01, 2.080492308943309e-01, + -9.780784446594424e-01, 2.082367789142113e-01, + -9.780384977768396e-01, 2.084243192778206e-01, + -9.779985149345571e-01, 2.086118519782635e-01, + -9.779584961340648e-01, 2.087993770086449e-01, + -9.779184413768344e-01, 2.089868943620701e-01, + -9.778783506643381e-01, 2.091744040316446e-01, + -9.778382239980504e-01, 2.093619060104742e-01, + -9.777980613794464e-01, 2.095494002916649e-01, + -9.777578628100028e-01, 2.097368868683233e-01, + -9.777176282911975e-01, 2.099243657335559e-01, + -9.776773578245099e-01, 2.101118368804696e-01, + -9.776370514114208e-01, 2.102993003021717e-01, + -9.775967090534119e-01, 2.104867559917697e-01, + -9.775563307519665e-01, 2.106742039423714e-01, + -9.775159165085693e-01, 2.108616441470849e-01, + -9.774754663247062e-01, 2.110490765990184e-01, + -9.774349802018643e-01, 2.112365012912807e-01, + -9.773944581415323e-01, 2.114239182169807e-01, + -9.773539001452000e-01, 2.116113273692276e-01, + -9.773133062143587e-01, 2.117987287411308e-01, + -9.772726763505009e-01, 2.119861223258003e-01, + -9.772320105551203e-01, 2.121735081163461e-01, + -9.771913088297123e-01, 2.123608861058784e-01, + -9.771505711757732e-01, 2.125482562875081e-01, + -9.771097975948009e-01, 2.127356186543459e-01, + -9.770689880882945e-01, 2.129229731995032e-01, + -9.770281426577544e-01, 2.131103199160914e-01, + -9.769872613046824e-01, 2.132976587972223e-01, + -9.769463440305817e-01, 2.134849898360081e-01, + -9.769053908369565e-01, 2.136723130255610e-01, + -9.768644017253126e-01, 2.138596283589937e-01, + -9.768233766971572e-01, 2.140469358294194e-01, + -9.767823157539987e-01, 2.142342354299510e-01, + -9.767412188973466e-01, 2.144215271537022e-01, + -9.767000861287118e-01, 2.146088109937868e-01, + -9.766589174496070e-01, 2.147960869433189e-01, + -9.766177128615456e-01, 2.149833549954128e-01, + -9.765764723660426e-01, 2.151706151431834e-01, + -9.765351959646145e-01, 2.153578673797455e-01, + -9.764938836587786e-01, 2.155451116982145e-01, + -9.764525354500541e-01, 2.157323480917059e-01, + -9.764111513399610e-01, 2.159195765533355e-01, + -9.763697313300211e-01, 2.161067970762195e-01, + -9.763282754217573e-01, 2.162940096534743e-01, + -9.762867836166936e-01, 2.164812142782167e-01, + -9.762452559163558e-01, 2.166684109435637e-01, + -9.762036923222706e-01, 2.168555996426326e-01, + -9.761620928359661e-01, 2.170427803685410e-01, + -9.761204574589719e-01, 2.172299531144068e-01, + -9.760787861928188e-01, 2.174171178733482e-01, + -9.760370790390390e-01, 2.176042746384836e-01, + -9.759953359991660e-01, 2.177914234029319e-01, + -9.759535570747343e-01, 2.179785641598122e-01, + -9.759117422672802e-01, 2.181656969022438e-01, + -9.758698915783410e-01, 2.183528216233463e-01, + -9.758280050094557e-01, 2.185399383162398e-01, + -9.757860825621639e-01, 2.187270469740444e-01, + -9.757441242380073e-01, 2.189141475898808e-01, + -9.757021300385286e-01, 2.191012401568698e-01, + -9.756600999652716e-01, 2.192883246681325e-01, + -9.756180340197818e-01, 2.194754011167903e-01, + -9.755759322036057e-01, 2.196624694959650e-01, + -9.755337945182914e-01, 2.198495297987787e-01, + -9.754916209653881e-01, 2.200365820183536e-01, + -9.754494115464464e-01, 2.202236261478124e-01, + -9.754071662630183e-01, 2.204106621802779e-01, + -9.753648851166570e-01, 2.205976901088735e-01, + -9.753225681089169e-01, 2.207847099267226e-01, + -9.752802152413542e-01, 2.209717216269491e-01, + -9.752378265155258e-01, 2.211587252026770e-01, + -9.751954019329904e-01, 2.213457206470308e-01, + -9.751529414953076e-01, 2.215327079531352e-01, + -9.751104452040389e-01, 2.217196871141152e-01, + -9.750679130607465e-01, 2.219066581230961e-01, + -9.750253450669941e-01, 2.220936209732035e-01, + -9.749827412243471e-01, 2.222805756575634e-01, + -9.749401015343718e-01, 2.224675221693019e-01, + -9.748974259986358e-01, 2.226544605015455e-01, + -9.748547146187084e-01, 2.228413906474211e-01, + -9.748119673961598e-01, 2.230283126000558e-01, + -9.747691843325618e-01, 2.232152263525770e-01, + -9.747263654294873e-01, 2.234021318981124e-01, + -9.746835106885107e-01, 2.235890292297900e-01, + -9.746406201112076e-01, 2.237759183407382e-01, + -9.745976936991550e-01, 2.239627992240855e-01, + -9.745547314539312e-01, 2.241496718729609e-01, + -9.745117333771157e-01, 2.243365362804936e-01, + -9.744686994702896e-01, 2.245233924398132e-01, + -9.744256297350350e-01, 2.247102403440494e-01, + -9.743825241729355e-01, 2.248970799863325e-01, + -9.743393827855759e-01, 2.250839113597928e-01, + -9.742962055745424e-01, 2.252707344575612e-01, + -9.742529925414225e-01, 2.254575492727685e-01, + -9.742097436878052e-01, 2.256443557985463e-01, + -9.741664590152803e-01, 2.258311540280262e-01, + -9.741231385254396e-01, 2.260179439543400e-01, + -9.740797822198757e-01, 2.262047255706202e-01, + -9.740363901001826e-01, 2.263914988699992e-01, + -9.739929621679558e-01, 2.265782638456100e-01, + -9.739494984247922e-01, 2.267650204905857e-01, + -9.739059988722896e-01, 2.269517687980598e-01, + -9.738624635120473e-01, 2.271385087611662e-01, + -9.738188923456661e-01, 2.273252403730389e-01, + -9.737752853747481e-01, 2.275119636268123e-01, + -9.737316426008964e-01, 2.276986785156212e-01, + -9.736879640257157e-01, 2.278853850326005e-01, + -9.736442496508120e-01, 2.280720831708857e-01, + -9.736004994777924e-01, 2.282587729236124e-01, + -9.735567135082656e-01, 2.284454542839165e-01, + -9.735128917438414e-01, 2.286321272449342e-01, + -9.734690341861311e-01, 2.288187917998022e-01, + -9.734251408367470e-01, 2.290054479416573e-01, + -9.733812116973033e-01, 2.291920956636368e-01, + -9.733372467694149e-01, 2.293787349588780e-01, + -9.732932460546982e-01, 2.295653658205189e-01, + -9.732492095547712e-01, 2.297519882416975e-01, + -9.732051372712528e-01, 2.299386022155522e-01, + -9.731610292057635e-01, 2.301252077352219e-01, + -9.731168853599251e-01, 2.303118047938454e-01, + -9.730727057353605e-01, 2.304983933845624e-01, + -9.730284903336942e-01, 2.306849735005122e-01, + -9.729842391565517e-01, 2.308715451348350e-01, + -9.729399522055602e-01, 2.310581082806711e-01, + -9.728956294823478e-01, 2.312446629311611e-01, + -9.728512709885442e-01, 2.314312090794458e-01, + -9.728068767257804e-01, 2.316177467186665e-01, + -9.727624466956886e-01, 2.318042758419648e-01, + -9.727179808999022e-01, 2.319907964424824e-01, + -9.726734793400564e-01, 2.321773085133617e-01, + -9.726289420177873e-01, 2.323638120477450e-01, + -9.725843689347322e-01, 2.325503070387752e-01, + -9.725397600925302e-01, 2.327367934795954e-01, + -9.724951154928212e-01, 2.329232713633490e-01, + -9.724504351372468e-01, 2.331097406831797e-01, + -9.724057190274498e-01, 2.332962014322316e-01, + -9.723609671650741e-01, 2.334826536036491e-01, + -9.723161795517653e-01, 2.336690971905768e-01, + -9.722713561891700e-01, 2.338555321861598e-01, + -9.722264970789363e-01, 2.340419585835434e-01, + -9.721816022227134e-01, 2.342283763758732e-01, + -9.721366716221522e-01, 2.344147855562952e-01, + -9.720917052789044e-01, 2.346011861179556e-01, + -9.720467031946235e-01, 2.347875780540010e-01, + -9.720016653709639e-01, 2.349739613575783e-01, + -9.719565918095817e-01, 2.351603360218347e-01, + -9.719114825121340e-01, 2.353467020399178e-01, + -9.718663374802794e-01, 2.355330594049755e-01, + -9.718211567156777e-01, 2.357194081101558e-01, + -9.717759402199901e-01, 2.359057481486074e-01, + -9.717306879948792e-01, 2.360920795134789e-01, + -9.716854000420085e-01, 2.362784021979196e-01, + -9.716400763630434e-01, 2.364647161950788e-01, + -9.715947169596502e-01, 2.366510214981064e-01, + -9.715493218334966e-01, 2.368373181001524e-01, + -9.715038909862518e-01, 2.370236059943672e-01, + -9.714584244195860e-01, 2.372098851739016e-01, + -9.714129221351709e-01, 2.373961556319066e-01, + -9.713673841346795e-01, 2.375824173615336e-01, + -9.713218104197862e-01, 2.377686703559342e-01, + -9.712762009921665e-01, 2.379549146082605e-01, + -9.712305558534974e-01, 2.381411501116648e-01, + -9.711848750054570e-01, 2.383273768592998e-01, + -9.711391584497251e-01, 2.385135948443184e-01, + -9.710934061879825e-01, 2.386998040598740e-01, + -9.710476182219111e-01, 2.388860044991200e-01, + -9.710017945531947e-01, 2.390721961552106e-01, + -9.709559351835180e-01, 2.392583790213000e-01, + -9.709100401145670e-01, 2.394445530905426e-01, + -9.708641093480295e-01, 2.396307183560936e-01, + -9.708181428855939e-01, 2.398168748111080e-01, + -9.707721407289504e-01, 2.400030224487415e-01, + -9.707261028797901e-01, 2.401891612621499e-01, + -9.706800293398061e-01, 2.403752912444894e-01, + -9.706339201106922e-01, 2.405614123889167e-01, + -9.705877751941436e-01, 2.407475246885884e-01, + -9.705415945918571e-01, 2.409336281366619e-01, + -9.704953783055306e-01, 2.411197227262946e-01, + -9.704491263368631e-01, 2.413058084506444e-01, + -9.704028386875555e-01, 2.414918853028693e-01, + -9.703565153593094e-01, 2.416779532761280e-01, + -9.703101563538281e-01, 2.418640123635792e-01, + -9.702637616728161e-01, 2.420500625583821e-01, + -9.702173313179792e-01, 2.422361038536960e-01, + -9.701708652910245e-01, 2.424221362426809e-01, + -9.701243635936603e-01, 2.426081597184968e-01, + -9.700778262275964e-01, 2.427941742743042e-01, + -9.700312531945440e-01, 2.429801799032639e-01, + -9.699846444962152e-01, 2.431661765985369e-01, + -9.699380001343240e-01, 2.433521643532847e-01, + -9.698913201105851e-01, 2.435381431606691e-01, + -9.698446044267148e-01, 2.437241130138522e-01, + -9.697978530844309e-01, 2.439100739059963e-01, + -9.697510660854521e-01, 2.440960258302642e-01, + -9.697042434314989e-01, 2.442819687798190e-01, + -9.696573851242924e-01, 2.444679027478242e-01, + -9.696104911655559e-01, 2.446538277274433e-01, + -9.695635615570132e-01, 2.448397437118407e-01, + -9.695165963003900e-01, 2.450256506941805e-01, + -9.694695953974131e-01, 2.452115486676275e-01, + -9.694225588498103e-01, 2.453974376253470e-01, + -9.693754866593113e-01, 2.455833175605041e-01, + -9.693283788276467e-01, 2.457691884662646e-01, + -9.692812353565485e-01, 2.459550503357946e-01, + -9.692340562477500e-01, 2.461409031622605e-01, + -9.691868415029860e-01, 2.463267469388290e-01, + -9.691395911239923e-01, 2.465125816586672e-01, + -9.690923051125062e-01, 2.466984073149424e-01, + -9.690449834702662e-01, 2.468842239008224e-01, + -9.689976261990124e-01, 2.470700314094753e-01, + -9.689502333004858e-01, 2.472558298340693e-01, + -9.689028047764289e-01, 2.474416191677733e-01, + -9.688553406285856e-01, 2.476273994037563e-01, + -9.688078408587010e-01, 2.478131705351877e-01, + -9.687603054685214e-01, 2.479989325552371e-01, + -9.687127344597948e-01, 2.481846854570748e-01, + -9.686651278342701e-01, 2.483704292338710e-01, + -9.686174855936975e-01, 2.485561638787966e-01, + -9.685698077398289e-01, 2.487418893850225e-01, + -9.685220942744174e-01, 2.489276057457201e-01, + -9.684743451992168e-01, 2.491133129540614e-01, + -9.684265605159832e-01, 2.492990110032182e-01, + -9.683787402264733e-01, 2.494846998863630e-01, + -9.683308843324452e-01, 2.496703795966686e-01, + -9.682829928356587e-01, 2.498560501273080e-01, + -9.682350657378743e-01, 2.500417114714547e-01, + -9.681871030408544e-01, 2.502273636222824e-01, + -9.681391047463624e-01, 2.504130065729652e-01, + -9.680910708561630e-01, 2.505986403166777e-01, + -9.680430013720223e-01, 2.507842648465945e-01, + -9.679948962957077e-01, 2.509698801558907e-01, + -9.679467556289878e-01, 2.511554862377419e-01, + -9.678985793736327e-01, 2.513410830853239e-01, + -9.678503675314136e-01, 2.515266706918126e-01, + -9.678021201041033e-01, 2.517122490503847e-01, + -9.677538370934755e-01, 2.518978181542170e-01, + -9.677055185013055e-01, 2.520833779964864e-01, + -9.676571643293699e-01, 2.522689285703708e-01, + -9.676087745794465e-01, 2.524544698690477e-01, + -9.675603492533144e-01, 2.526400018856955e-01, + -9.675118883527541e-01, 2.528255246134926e-01, + -9.674633918795476e-01, 2.530110380456179e-01, + -9.674148598354775e-01, 2.531965421752506e-01, + -9.673662922223285e-01, 2.533820369955702e-01, + -9.673176890418863e-01, 2.535675224997566e-01, + -9.672690502959378e-01, 2.537529986809900e-01, + -9.672203759862714e-01, 2.539384655324511e-01, + -9.671716661146766e-01, 2.541239230473206e-01, + -9.671229206829444e-01, 2.543093712187800e-01, + -9.670741396928670e-01, 2.544948100400107e-01, + -9.670253231462380e-01, 2.546802395041948e-01, + -9.669764710448521e-01, 2.548656596045146e-01, + -9.669275833905057e-01, 2.550510703341525e-01, + -9.668786601849959e-01, 2.552364716862917e-01, + -9.668297014301218e-01, 2.554218636541155e-01, + -9.667807071276833e-01, 2.556072462308074e-01, + -9.667316772794818e-01, 2.557926194095516e-01, + -9.666826118873201e-01, 2.559779831835324e-01, + -9.666335109530021e-01, 2.561633375459345e-01, + -9.665843744783331e-01, 2.563486824899429e-01, + -9.665352024651197e-01, 2.565340180087430e-01, + -9.664859949151698e-01, 2.567193440955207e-01, + -9.664367518302927e-01, 2.569046607434619e-01, + -9.663874732122989e-01, 2.570899679457531e-01, + -9.663381590630001e-01, 2.572752656955811e-01, + -9.662888093842097e-01, 2.574605539861331e-01, + -9.662394241777419e-01, 2.576458328105964e-01, + -9.661900034454125e-01, 2.578311021621590e-01, + -9.661405471890387e-01, 2.580163620340090e-01, + -9.660910554104388e-01, 2.582016124193349e-01, + -9.660415281114324e-01, 2.583868533113256e-01, + -9.659919652938406e-01, 2.585720847031703e-01, + -9.659423669594855e-01, 2.587573065880587e-01, + -9.658927331101909e-01, 2.589425189591805e-01, + -9.658430637477815e-01, 2.591277218097262e-01, + -9.657933588740837e-01, 2.593129151328862e-01, + -9.657436184909248e-01, 2.594980989218517e-01, + -9.656938426001337e-01, 2.596832731698138e-01, + -9.656440312035406e-01, 2.598684378699643e-01, + -9.655941843029768e-01, 2.600535930154952e-01, + -9.655443019002752e-01, 2.602387385995988e-01, + -9.654943839972695e-01, 2.604238746154680e-01, + -9.654444305957954e-01, 2.606090010562958e-01, + -9.653944416976894e-01, 2.607941179152755e-01, + -9.653444173047894e-01, 2.609792251856011e-01, + -9.652943574189347e-01, 2.611643228604665e-01, + -9.652442620419658e-01, 2.613494109330664e-01, + -9.651941311757247e-01, 2.615344893965955e-01, + -9.651439648220544e-01, 2.617195582442490e-01, + -9.650937629827996e-01, 2.619046174692226e-01, + -9.650435256598059e-01, 2.620896670647120e-01, + -9.649932528549203e-01, 2.622747070239136e-01, + -9.649429445699914e-01, 2.624597373400240e-01, + -9.648926008068689e-01, 2.626447580062400e-01, + -9.648422215674036e-01, 2.628297690157592e-01, + -9.647918068534479e-01, 2.630147703617790e-01, + -9.647413566668553e-01, 2.631997620374976e-01, + -9.646908710094810e-01, 2.633847440361133e-01, + -9.646403498831809e-01, 2.635697163508249e-01, + -9.645897932898128e-01, 2.637546789748313e-01, + -9.645392012312352e-01, 2.639396319013323e-01, + -9.644885737093084e-01, 2.641245751235275e-01, + -9.644379107258939e-01, 2.643095086346171e-01, + -9.643872122828543e-01, 2.644944324278016e-01, + -9.643364783820537e-01, 2.646793464962819e-01, + -9.642857090253575e-01, 2.648642508332593e-01, + -9.642349042146322e-01, 2.650491454319353e-01, + -9.641840639517458e-01, 2.652340302855118e-01, + -9.641331882385676e-01, 2.654189053871913e-01, + -9.640822770769681e-01, 2.656037707301763e-01, + -9.640313304688193e-01, 2.657886263076699e-01, + -9.639803484159941e-01, 2.659734721128756e-01, + -9.639293309203671e-01, 2.661583081389970e-01, + -9.638782779838142e-01, 2.663431343792382e-01, + -9.638271896082123e-01, 2.665279508268037e-01, + -9.637760657954398e-01, 2.667127574748984e-01, + -9.637249065473765e-01, 2.668975543167273e-01, + -9.636737118659032e-01, 2.670823413454962e-01, + -9.636224817529022e-01, 2.672671185544109e-01, + -9.635712162102573e-01, 2.674518859366776e-01, + -9.635199152398531e-01, 2.676366434855031e-01, + -9.634685788435760e-01, 2.678213911940941e-01, + -9.634172070233133e-01, 2.680061290556583e-01, + -9.633657997809540e-01, 2.681908570634032e-01, + -9.633143571183882e-01, 2.683755752105369e-01, + -9.632628790375071e-01, 2.685602834902679e-01, + -9.632113655402035e-01, 2.687449818958050e-01, + -9.631598166283714e-01, 2.689296704203573e-01, + -9.631082323039062e-01, 2.691143490571344e-01, + -9.630566125687043e-01, 2.692990177993461e-01, + -9.630049574246639e-01, 2.694836766402028e-01, + -9.629532668736839e-01, 2.696683255729151e-01, + -9.629015409176650e-01, 2.698529645906939e-01, + -9.628497795585090e-01, 2.700375936867506e-01, + -9.627979827981190e-01, 2.702222128542969e-01, + -9.627461506383994e-01, 2.704068220865448e-01, + -9.626942830812559e-01, 2.705914213767069e-01, + -9.626423801285957e-01, 2.707760107179960e-01, + -9.625904417823269e-01, 2.709605901036252e-01, + -9.625384680443592e-01, 2.711451595268080e-01, + -9.624864589166034e-01, 2.713297189807584e-01, + -9.624344144009721e-01, 2.715142684586907e-01, + -9.623823344993784e-01, 2.716988079538195e-01, + -9.623302192137374e-01, 2.718833374593597e-01, + -9.622780685459651e-01, 2.720678569685269e-01, + -9.622258824979790e-01, 2.722523664745367e-01, + -9.621736610716979e-01, 2.724368659706052e-01, + -9.621214042690416e-01, 2.726213554499490e-01, + -9.620691120919316e-01, 2.728058349057848e-01, + -9.620167845422906e-01, 2.729903043313299e-01, + -9.619644216220423e-01, 2.731747637198019e-01, + -9.619120233331122e-01, 2.733592130644187e-01, + -9.618595896774266e-01, 2.735436523583987e-01, + -9.618071206569135e-01, 2.737280815949605e-01, + -9.617546162735020e-01, 2.739125007673233e-01, + -9.617020765291225e-01, 2.740969098687064e-01, + -9.616495014257068e-01, 2.742813088923297e-01, + -9.615968909651879e-01, 2.744656978314132e-01, + -9.615442451495000e-01, 2.746500766791777e-01, + -9.614915639805790e-01, 2.748344454288439e-01, + -9.614388474603617e-01, 2.750188040736332e-01, + -9.613860955907862e-01, 2.752031526067673e-01, + -9.613333083737923e-01, 2.753874910214681e-01, + -9.612804858113206e-01, 2.755718193109581e-01, + -9.612276279053135e-01, 2.757561374684601e-01, + -9.611747346577141e-01, 2.759404454871972e-01, + -9.611218060704674e-01, 2.761247433603928e-01, + -9.610688421455194e-01, 2.763090310812711e-01, + -9.610158428848172e-01, 2.764933086430560e-01, + -9.609628082903098e-01, 2.766775760389724e-01, + -9.609097383639468e-01, 2.768618332622453e-01, + -9.608566331076797e-01, 2.770460803060999e-01, + -9.608034925234608e-01, 2.772303171637622e-01, + -9.607503166132440e-01, 2.774145438284581e-01, + -9.606971053789845e-01, 2.775987602934143e-01, + -9.606438588226386e-01, 2.777829665518577e-01, + -9.605905769461641e-01, 2.779671625970154e-01, + -9.605372597515200e-01, 2.781513484221151e-01, + -9.604839072406668e-01, 2.783355240203849e-01, + -9.604305194155658e-01, 2.785196893850531e-01, + -9.603770962781801e-01, 2.787038445093485e-01, + -9.603236378304739e-01, 2.788879893865003e-01, + -9.602701440744128e-01, 2.790721240097378e-01, + -9.602166150119634e-01, 2.792562483722912e-01, + -9.601630506450940e-01, 2.794403624673905e-01, + -9.601094509757739e-01, 2.796244662882666e-01, + -9.600558160059739e-01, 2.798085598281504e-01, + -9.600021457376660e-01, 2.799926430802732e-01, + -9.599484401728232e-01, 2.801767160378670e-01, + -9.598946993134205e-01, 2.803607786941638e-01, + -9.598409231614338e-01, 2.805448310423962e-01, + -9.597871117188399e-01, 2.807288730757972e-01, + -9.597332649876177e-01, 2.809129047876000e-01, + -9.596793829697468e-01, 2.810969261710383e-01, + -9.596254656672082e-01, 2.812809372193461e-01, + -9.595715130819845e-01, 2.814649379257579e-01, + -9.595175252160593e-01, 2.816489282835086e-01, + -9.594635020714175e-01, 2.818329082858334e-01, + -9.594094436500455e-01, 2.820168779259676e-01, + -9.593553499539308e-01, 2.822008371971476e-01, + -9.593012209850622e-01, 2.823847860926094e-01, + -9.592470567454301e-01, 2.825687246055897e-01, + -9.591928572370257e-01, 2.827526527293259e-01, + -9.591386224618419e-01, 2.829365704570554e-01, + -9.590843524218727e-01, 2.831204777820158e-01, + -9.590300471191137e-01, 2.833043746974457e-01, + -9.589757065555611e-01, 2.834882611965835e-01, + -9.589213307332132e-01, 2.836721372726684e-01, + -9.588669196540690e-01, 2.838560029189398e-01, + -9.588124733201293e-01, 2.840398581286372e-01, + -9.587579917333957e-01, 2.842237028950010e-01, + -9.587034748958716e-01, 2.844075372112719e-01, + -9.586489228095612e-01, 2.845913610706904e-01, + -9.585943354764702e-01, 2.847751744664983e-01, + -9.585397128986057e-01, 2.849589773919370e-01, + -9.584850550779761e-01, 2.851427698402487e-01, + -9.584303620165909e-01, 2.853265518046759e-01, + -9.583756337164612e-01, 2.855103232784613e-01, + -9.583208701795989e-01, 2.856940842548483e-01, + -9.582660714080177e-01, 2.858778347270806e-01, + -9.582112374037323e-01, 2.860615746884020e-01, + -9.581563681687588e-01, 2.862453041320571e-01, + -9.581014637051147e-01, 2.864290230512907e-01, + -9.580465240148186e-01, 2.866127314393478e-01, + -9.579915490998904e-01, 2.867964292894741e-01, + -9.579365389623514e-01, 2.869801165949156e-01, + -9.578814936042244e-01, 2.871637933489184e-01, + -9.578264130275329e-01, 2.873474595447295e-01, + -9.577712972343023e-01, 2.875311151755959e-01, + -9.577161462265589e-01, 2.877147602347652e-01, + -9.576609600063306e-01, 2.878983947154852e-01, + -9.576057385756463e-01, 2.880820186110041e-01, + -9.575504819365365e-01, 2.882656319145708e-01, + -9.574951900910326e-01, 2.884492346194342e-01, + -9.574398630411677e-01, 2.886328267188438e-01, + -9.573845007889759e-01, 2.888164082060495e-01, + -9.573291033364928e-01, 2.889999790743014e-01, + -9.572736706857552e-01, 2.891835393168502e-01, + -9.572182028388012e-01, 2.893670889269470e-01, + -9.571626997976702e-01, 2.895506278978430e-01, + -9.571071615644028e-01, 2.897341562227903e-01, + -9.570515881410410e-01, 2.899176738950408e-01, + -9.569959795296282e-01, 2.901011809078471e-01, + -9.569403357322088e-01, 2.902846772544623e-01, + -9.568846567508289e-01, 2.904681629281398e-01, + -9.568289425875354e-01, 2.906516379221332e-01, + -9.567731932443769e-01, 2.908351022296968e-01, + -9.567174087234030e-01, 2.910185558440851e-01, + -9.566615890266651e-01, 2.912019987585529e-01, + -9.566057341562151e-01, 2.913854309663557e-01, + -9.565498441141068e-01, 2.915688524607490e-01, + -9.564939189023951e-01, 2.917522632349893e-01, + -9.564379585231362e-01, 2.919356632823328e-01, + -9.563819629783877e-01, 2.921190525960364e-01, + -9.563259322702082e-01, 2.923024311693576e-01, + -9.562698664006580e-01, 2.924857989955539e-01, + -9.562137653717985e-01, 2.926691560678835e-01, + -9.561576291856921e-01, 2.928525023796048e-01, + -9.561014578444030e-01, 2.930358379239768e-01, + -9.560452513499964e-01, 2.932191626942586e-01, + -9.559890097045389e-01, 2.934024766837101e-01, + -9.559327329100983e-01, 2.935857798855912e-01, + -9.558764209687436e-01, 2.937690722931624e-01, + -9.558200738825454e-01, 2.939523538996847e-01, + -9.557636916535754e-01, 2.941356246984190e-01, + -9.557072742839066e-01, 2.943188846826274e-01, + -9.556508217756133e-01, 2.945021338455717e-01, + -9.555943341307711e-01, 2.946853721805143e-01, + -9.555378113514569e-01, 2.948685996807183e-01, + -9.554812534397488e-01, 2.950518163394467e-01, + -9.554246603977263e-01, 2.952350221499632e-01, + -9.553680322274704e-01, 2.954182171055320e-01, + -9.553113689310627e-01, 2.956014011994174e-01, + -9.552546705105870e-01, 2.957845744248843e-01, + -9.551979369681277e-01, 2.959677367751979e-01, + -9.551411683057708e-01, 2.961508882436238e-01, + -9.550843645256034e-01, 2.963340288234282e-01, + -9.550275256297142e-01, 2.965171585078775e-01, + -9.549706516201928e-01, 2.967002772902383e-01, + -9.549137424991305e-01, 2.968833851637783e-01, + -9.548567982686196e-01, 2.970664821217647e-01, + -9.547998189307537e-01, 2.972495681574658e-01, + -9.547428044876279e-01, 2.974326432641500e-01, + -9.546857549413383e-01, 2.976157074350862e-01, + -9.546286702939827e-01, 2.977987606635435e-01, + -9.545715505476596e-01, 2.979818029427918e-01, + -9.545143957044695e-01, 2.981648342661009e-01, + -9.544572057665135e-01, 2.983478546267414e-01, + -9.543999807358945e-01, 2.985308640179841e-01, + -9.543427206147165e-01, 2.987138624331003e-01, + -9.542854254050847e-01, 2.988968498653618e-01, + -9.542280951091057e-01, 2.990798263080405e-01, + -9.541707297288873e-01, 2.992627917544088e-01, + -9.541133292665388e-01, 2.994457461977399e-01, + -9.540558937241707e-01, 2.996286896313068e-01, + -9.539984231038945e-01, 2.998116220483834e-01, + -9.539409174078235e-01, 2.999945434422436e-01, + -9.538833766380718e-01, 3.001774538061620e-01, + -9.538258007967550e-01, 3.003603531334135e-01, + -9.537681898859903e-01, 3.005432414172735e-01, + -9.537105439078957e-01, 3.007261186510175e-01, + -9.536528628645905e-01, 3.009089848279219e-01, + -9.535951467581957e-01, 3.010918399412631e-01, + -9.535373955908333e-01, 3.012746839843179e-01, + -9.534796093646266e-01, 3.014575169503639e-01, + -9.534217880817003e-01, 3.016403388326788e-01, + -9.533639317441803e-01, 3.018231496245407e-01, + -9.533060403541939e-01, 3.020059493192281e-01, + -9.532481139138693e-01, 3.021887379100200e-01, + -9.531901524253367e-01, 3.023715153901960e-01, + -9.531321558907268e-01, 3.025542817530356e-01, + -9.530741243121722e-01, 3.027370369918191e-01, + -9.530160576918065e-01, 3.029197810998273e-01, + -9.529579560317647e-01, 3.031025140703411e-01, + -9.528998193341829e-01, 3.032852358966417e-01, + -9.528416476011987e-01, 3.034679465720113e-01, + -9.527834408349509e-01, 3.036506460897319e-01, + -9.527251990375796e-01, 3.038333344430864e-01, + -9.526669222112262e-01, 3.040160116253576e-01, + -9.526086103580333e-01, 3.041986776298291e-01, + -9.525502634801449e-01, 3.043813324497849e-01, + -9.524918815797063e-01, 3.045639760785091e-01, + -9.524334646588640e-01, 3.047466085092865e-01, + -9.523750127197659e-01, 3.049292297354024e-01, + -9.523165257645609e-01, 3.051118397501421e-01, + -9.522580037953996e-01, 3.052944385467917e-01, + -9.521994468144336e-01, 3.054770261186374e-01, + -9.521408548238158e-01, 3.056596024589661e-01, + -9.520822278257006e-01, 3.058421675610651e-01, + -9.520235658222436e-01, 3.060247214182218e-01, + -9.519648688156014e-01, 3.062072640237242e-01, + -9.519061368079323e-01, 3.063897953708609e-01, + -9.518473698013956e-01, 3.065723154529207e-01, + -9.517885677981521e-01, 3.067548242631928e-01, + -9.517297308003638e-01, 3.069373217949669e-01, + -9.516708588101939e-01, 3.071198080415331e-01, + -9.516119518298068e-01, 3.073022829961818e-01, + -9.515530098613686e-01, 3.074847466522041e-01, + -9.514940329070464e-01, 3.076671990028912e-01, + -9.514350209690083e-01, 3.078496400415349e-01, + -9.513759740494244e-01, 3.080320697614273e-01, + -9.513168921504656e-01, 3.082144881558611e-01, + -9.512577752743040e-01, 3.083968952181292e-01, + -9.511986234231132e-01, 3.085792909415251e-01, + -9.511394365990682e-01, 3.087616753193425e-01, + -9.510802148043450e-01, 3.089440483448757e-01, + -9.510209580411211e-01, 3.091264100114194e-01, + -9.509616663115751e-01, 3.093087603122687e-01, + -9.509023396178871e-01, 3.094910992407191e-01, + -9.508429779622382e-01, 3.096734267900664e-01, + -9.507835813468111e-01, 3.098557429536071e-01, + -9.507241497737896e-01, 3.100380477246379e-01, + -9.506646832453589e-01, 3.102203410964559e-01, + -9.506051817637053e-01, 3.104026230623587e-01, + -9.505456453310166e-01, 3.105848936156445e-01, + -9.504860739494817e-01, 3.107671527496115e-01, + -9.504264676212909e-01, 3.109494004575586e-01, + -9.503668263486358e-01, 3.111316367327853e-01, + -9.503071501337093e-01, 3.113138615685909e-01, + -9.502474389787052e-01, 3.114960749582759e-01, + -9.501876928858193e-01, 3.116782768951405e-01, + -9.501279118572481e-01, 3.118604673724860e-01, + -9.500680958951896e-01, 3.120426463836135e-01, + -9.500082450018430e-01, 3.122248139218249e-01, + -9.499483591794090e-01, 3.124069699804224e-01, + -9.498884384300893e-01, 3.125891145527087e-01, + -9.498284827560871e-01, 3.127712476319868e-01, + -9.497684921596067e-01, 3.129533692115602e-01, + -9.497084666428538e-01, 3.131354792847328e-01, + -9.496484062080355e-01, 3.133175778448090e-01, + -9.495883108573600e-01, 3.134996648850935e-01, + -9.495281805930367e-01, 3.136817403988915e-01, + -9.494680154172765e-01, 3.138638043795085e-01, + -9.494078153322916e-01, 3.140458568202507e-01, + -9.493475803402952e-01, 3.142278977144244e-01, + -9.492873104435021e-01, 3.144099270553367e-01, + -9.492270056441282e-01, 3.145919448362947e-01, + -9.491666659443907e-01, 3.147739510506061e-01, + -9.491062913465083e-01, 3.149559456915791e-01, + -9.490458818527006e-01, 3.151379287525224e-01, + -9.489854374651887e-01, 3.153199002267449e-01, + -9.489249581861952e-01, 3.155018601075560e-01, + -9.488644440179433e-01, 3.156838083882657e-01, + -9.488038949626585e-01, 3.158657450621840e-01, + -9.487433110225665e-01, 3.160476701226219e-01, + -9.486826921998951e-01, 3.162295835628903e-01, + -9.486220384968730e-01, 3.164114853763010e-01, + -9.485613499157303e-01, 3.165933755561658e-01, + -9.485006264586983e-01, 3.167752540957973e-01, + -9.484398681280096e-01, 3.169571209885081e-01, + -9.483790749258981e-01, 3.171389762276118e-01, + -9.483182468545991e-01, 3.173208198064217e-01, + -9.482573839163491e-01, 3.175026517182523e-01, + -9.481964861133856e-01, 3.176844719564180e-01, + -9.481355534479480e-01, 3.178662805142337e-01, + -9.480745859222762e-01, 3.180480773850149e-01, + -9.480135835386122e-01, 3.182298625620775e-01, + -9.479525462991987e-01, 3.184116360387378e-01, + -9.478914742062798e-01, 3.185933978083124e-01, + -9.478303672621010e-01, 3.187751478641185e-01, + -9.477692254689092e-01, 3.189568861994737e-01, + -9.477080488289521e-01, 3.191386128076959e-01, + -9.476468373444793e-01, 3.193203276821036e-01, + -9.475855910177411e-01, 3.195020308160157e-01, + -9.475243098509896e-01, 3.196837222027514e-01, + -9.474629938464777e-01, 3.198654018356305e-01, + -9.474016430064599e-01, 3.200470697079731e-01, + -9.473402573331920e-01, 3.202287258130999e-01, + -9.472788368289309e-01, 3.204103701443318e-01, + -9.472173814959348e-01, 3.205920026949903e-01, + -9.471558913364633e-01, 3.207736234583973e-01, + -9.470943663527772e-01, 3.209552324278752e-01, + -9.470328065471386e-01, 3.211368295967467e-01, + -9.469712119218109e-01, 3.213184149583349e-01, + -9.469095824790588e-01, 3.214999885059635e-01, + -9.468479182211480e-01, 3.216815502329566e-01, + -9.467862191503460e-01, 3.218631001326386e-01, + -9.467244852689212e-01, 3.220446381983345e-01, + -9.466627165791434e-01, 3.222261644233696e-01, + -9.466009130832835e-01, 3.224076788010699e-01, + -9.465390747836141e-01, 3.225891813247613e-01, + -9.464772016824087e-01, 3.227706719877707e-01, + -9.464152937819421e-01, 3.229521507834253e-01, + -9.463533510844906e-01, 3.231336177050523e-01, + -9.462913735923316e-01, 3.233150727459800e-01, + -9.462293613077438e-01, 3.234965158995367e-01, + -9.461673142330074e-01, 3.236779471590512e-01, + -9.461052323704034e-01, 3.238593665178529e-01, + -9.460431157222146e-01, 3.240407739692714e-01, + -9.459809642907248e-01, 3.242221695066370e-01, + -9.459187780782191e-01, 3.244035531232802e-01, + -9.458565570869839e-01, 3.245849248125321e-01, + -9.457943013193070e-01, 3.247662845677242e-01, + -9.457320107774772e-01, 3.249476323821884e-01, + -9.456696854637847e-01, 3.251289682492571e-01, + -9.456073253805213e-01, 3.253102921622629e-01, + -9.455449305299797e-01, 3.254916041145393e-01, + -9.454825009144537e-01, 3.256729040994198e-01, + -9.454200365362391e-01, 3.258541921102386e-01, + -9.453575373976323e-01, 3.260354681403302e-01, + -9.452950035009312e-01, 3.262167321830297e-01, + -9.452324348484350e-01, 3.263979842316725e-01, + -9.451698314424442e-01, 3.265792242795944e-01, + -9.451071932852606e-01, 3.267604523201317e-01, + -9.450445203791871e-01, 3.269416683466214e-01, + -9.449818127265281e-01, 3.271228723524005e-01, + -9.449190703295892e-01, 3.273040643308067e-01, + -9.448562931906772e-01, 3.274852442751780e-01, + -9.447934813121003e-01, 3.276664121788531e-01, + -9.447306346961678e-01, 3.278475680351708e-01, + -9.446677533451905e-01, 3.280287118374707e-01, + -9.446048372614803e-01, 3.282098435790925e-01, + -9.445418864473505e-01, 3.283909632533766e-01, + -9.444789009051155e-01, 3.285720708536637e-01, + -9.444158806370913e-01, 3.287531663732950e-01, + -9.443528256455948e-01, 3.289342498056122e-01, + -9.442897359329444e-01, 3.291153211439573e-01, + -9.442266115014598e-01, 3.292963803816727e-01, + -9.441634523534618e-01, 3.294774275121017e-01, + -9.441002584912727e-01, 3.296584625285875e-01, + -9.440370299172158e-01, 3.298394854244739e-01, + -9.439737666336160e-01, 3.300204961931054e-01, + -9.439104686427991e-01, 3.302014948278266e-01, + -9.438471359470927e-01, 3.303824813219828e-01, + -9.437837685488251e-01, 3.305634556689195e-01, + -9.437203664503262e-01, 3.307444178619829e-01, + -9.436569296539272e-01, 3.309253678945195e-01, + -9.435934581619604e-01, 3.311063057598764e-01, + -9.435299519767595e-01, 3.312872314514008e-01, + -9.434664111006593e-01, 3.314681449624409e-01, + -9.434028355359962e-01, 3.316490462863447e-01, + -9.433392252851077e-01, 3.318299354164611e-01, + -9.432755803503325e-01, 3.320108123461394e-01, + -9.432119007340106e-01, 3.321916770687292e-01, + -9.431481864384834e-01, 3.323725295775806e-01, + -9.430844374660935e-01, 3.325533698660442e-01, + -9.430206538191847e-01, 3.327341979274711e-01, + -9.429568355001021e-01, 3.329150137552127e-01, + -9.428929825111922e-01, 3.330958173426208e-01, + -9.428290948548027e-01, 3.332766086830479e-01, + -9.427651725332825e-01, 3.334573877698468e-01, + -9.427012155489819e-01, 3.336381545963709e-01, + -9.426372239042525e-01, 3.338189091559736e-01, + -9.425731976014469e-01, 3.339996514420094e-01, + -9.425091366429192e-01, 3.341803814478327e-01, + -9.424450410310249e-01, 3.343610991667987e-01, + -9.423809107681205e-01, 3.345418045922629e-01, + -9.423167458565638e-01, 3.347224977175812e-01, + -9.422525462987140e-01, 3.349031785361102e-01, + -9.421883120969318e-01, 3.350838470412066e-01, + -9.421240432535786e-01, 3.352645032262278e-01, + -9.420597397710173e-01, 3.354451470845316e-01, + -9.419954016516126e-01, 3.356257786094763e-01, + -9.419310288977296e-01, 3.358063977944205e-01, + -9.418666215117353e-01, 3.359870046327234e-01, + -9.418021794959976e-01, 3.361675991177445e-01, + -9.417377028528862e-01, 3.363481812428440e-01, + -9.416731915847714e-01, 3.365287510013824e-01, + -9.416086456940252e-01, 3.367093083867206e-01, + -9.415440651830208e-01, 3.368898533922201e-01, + -9.414794500541326e-01, 3.370703860112426e-01, + -9.414148003097363e-01, 3.372509062371506e-01, + -9.413501159522090e-01, 3.374314140633068e-01, + -9.412853969839287e-01, 3.376119094830746e-01, + -9.412206434072752e-01, 3.377923924898175e-01, + -9.411558552246292e-01, 3.379728630768997e-01, + -9.410910324383728e-01, 3.381533212376859e-01, + -9.410261750508893e-01, 3.383337669655411e-01, + -9.409612830645633e-01, 3.385142002538309e-01, + -9.408963564817808e-01, 3.386946210959212e-01, + -9.408313953049289e-01, 3.388750294851784e-01, + -9.407663995363961e-01, 3.390554254149696e-01, + -9.407013691785719e-01, 3.392358088786619e-01, + -9.406363042338476e-01, 3.394161798696234e-01, + -9.405712047046152e-01, 3.395965383812221e-01, + -9.405060705932683e-01, 3.397768844068269e-01, + -9.404409019022018e-01, 3.399572179398069e-01, + -9.403756986338115e-01, 3.401375389735317e-01, + -9.403104607904951e-01, 3.403178475013717e-01, + -9.402451883746509e-01, 3.404981435166972e-01, + -9.401798813886789e-01, 3.406784270128792e-01, + -9.401145398349803e-01, 3.408586979832894e-01, + -9.400491637159574e-01, 3.410389564212997e-01, + -9.399837530340140e-01, 3.412192023202824e-01, + -9.399183077915550e-01, 3.413994356736104e-01, + -9.398528279909867e-01, 3.415796564746572e-01, + -9.397873136347166e-01, 3.417598647167963e-01, + -9.397217647251533e-01, 3.419400603934022e-01, + -9.396561812647072e-01, 3.421202434978495e-01, + -9.395905632557893e-01, 3.423004140235135e-01, + -9.395249107008122e-01, 3.424805719637698e-01, + -9.394592236021899e-01, 3.426607173119944e-01, + -9.393935019623375e-01, 3.428408500615640e-01, + -9.393277457836714e-01, 3.430209702058555e-01, + -9.392619550686092e-01, 3.432010777382465e-01, + -9.391961298195699e-01, 3.433811726521150e-01, + -9.391302700389736e-01, 3.435612549408394e-01, + -9.390643757292420e-01, 3.437413245977985e-01, + -9.389984468927975e-01, 3.439213816163717e-01, + -9.389324835320646e-01, 3.441014259899388e-01, + -9.388664856494681e-01, 3.442814577118802e-01, + -9.388004532474348e-01, 3.444614767755765e-01, + -9.387343863283925e-01, 3.446414831744090e-01, + -9.386682848947702e-01, 3.448214769017593e-01, + -9.386021489489984e-01, 3.450014579510097e-01, + -9.385359784935086e-01, 3.451814263155425e-01, + -9.384697735307338e-01, 3.453613819887412e-01, + -9.384035340631081e-01, 3.455413249639891e-01, + -9.383372600930670e-01, 3.457212552346701e-01, + -9.382709516230472e-01, 3.459011727941690e-01, + -9.382046086554865e-01, 3.460810776358704e-01, + -9.381382311928244e-01, 3.462609697531600e-01, + -9.380718192375013e-01, 3.464408491394235e-01, + -9.380053727919588e-01, 3.466207157880473e-01, + -9.379388918586403e-01, 3.468005696924183e-01, + -9.378723764399899e-01, 3.469804108459237e-01, + -9.378058265384531e-01, 3.471602392419512e-01, + -9.377392421564770e-01, 3.473400548738891e-01, + -9.376726232965095e-01, 3.475198577351261e-01, + -9.376059699610000e-01, 3.476996478190514e-01, + -9.375392821523992e-01, 3.478794251190545e-01, + -9.374725598731593e-01, 3.480591896285256e-01, + -9.374058031257330e-01, 3.482389413408553e-01, + -9.373390119125750e-01, 3.484186802494346e-01, + -9.372721862361410e-01, 3.485984063476549e-01, + -9.372053260988880e-01, 3.487781196289084e-01, + -9.371384315032741e-01, 3.489578200865875e-01, + -9.370715024517592e-01, 3.491375077140850e-01, + -9.370045389468037e-01, 3.493171825047944e-01, + -9.369375409908699e-01, 3.494968444521095e-01, + -9.368705085864210e-01, 3.496764935494248e-01, + -9.368034417359216e-01, 3.498561297901349e-01, + -9.367363404418376e-01, 3.500357531676352e-01, + -9.366692047066362e-01, 3.502153636753216e-01, + -9.366020345327856e-01, 3.503949613065901e-01, + -9.365348299227555e-01, 3.505745460548375e-01, + -9.364675908790170e-01, 3.507541179134611e-01, + -9.364003174040421e-01, 3.509336768758584e-01, + -9.363330095003042e-01, 3.511132229354275e-01, + -9.362656671702783e-01, 3.512927560855671e-01, + -9.361982904164401e-01, 3.514722763196763e-01, + -9.361308792412670e-01, 3.516517836311546e-01, + -9.360634336472375e-01, 3.518312780134020e-01, + -9.359959536368314e-01, 3.520107594598191e-01, + -9.359284392125297e-01, 3.521902279638068e-01, + -9.358608903768146e-01, 3.523696835187666e-01, + -9.357933071321699e-01, 3.525491261181005e-01, + -9.357256894810804e-01, 3.527285557552107e-01, + -9.356580374260320e-01, 3.529079724235002e-01, + -9.355903509695124e-01, 3.530873761163725e-01, + -9.355226301140099e-01, 3.532667668272312e-01, + -9.354548748620146e-01, 3.534461445494808e-01, + -9.353870852160178e-01, 3.536255092765260e-01, + -9.353192611785116e-01, 3.538048610017721e-01, + -9.352514027519899e-01, 3.539841997186248e-01, + -9.351835099389476e-01, 3.541635254204903e-01, + -9.351155827418809e-01, 3.543428381007755e-01, + -9.350476211632874e-01, 3.545221377528874e-01, + -9.349796252056658e-01, 3.547014243702338e-01, + -9.349115948715161e-01, 3.548806979462228e-01, + -9.348435301633395e-01, 3.550599584742629e-01, + -9.347754310836387e-01, 3.552392059477633e-01, + -9.347072976349174e-01, 3.554184403601336e-01, + -9.346391298196808e-01, 3.555976617047839e-01, + -9.345709276404350e-01, 3.557768699751246e-01, + -9.345026910996879e-01, 3.559560651645668e-01, + -9.344344201999480e-01, 3.561352472665221e-01, + -9.343661149437258e-01, 3.563144162744024e-01, + -9.342977753335325e-01, 3.564935721816201e-01, + -9.342294013718808e-01, 3.566727149815883e-01, + -9.341609930612845e-01, 3.568518446677203e-01, + -9.340925504042590e-01, 3.570309612334300e-01, + -9.340240734033204e-01, 3.572100646721320e-01, + -9.339555620609867e-01, 3.573891549772409e-01, + -9.338870163797769e-01, 3.575682321421723e-01, + -9.338184363622110e-01, 3.577472961603419e-01, + -9.337498220108106e-01, 3.579263470251660e-01, + -9.336811733280984e-01, 3.581053847300616e-01, + -9.336124903165985e-01, 3.582844092684458e-01, + -9.335437729788362e-01, 3.584634206337365e-01, + -9.334750213173380e-01, 3.586424188193520e-01, + -9.334062353346315e-01, 3.588214038187109e-01, + -9.333374150332462e-01, 3.590003756252325e-01, + -9.332685604157120e-01, 3.591793342323365e-01, + -9.331996714845607e-01, 3.593582796334431e-01, + -9.331307482423252e-01, 3.595372118219731e-01, + -9.330617906915394e-01, 3.597161307913476e-01, + -9.329927988347390e-01, 3.598950365349881e-01, + -9.329237726744601e-01, 3.600739290463170e-01, + -9.328547122132411e-01, 3.602528083187569e-01, + -9.327856174536211e-01, 3.604316743457307e-01, + -9.327164883981403e-01, 3.606105271206623e-01, + -9.326473250493404e-01, 3.607893666369756e-01, + -9.325781274097644e-01, 3.609681928880952e-01, + -9.325088954819566e-01, 3.611470058674462e-01, + -9.324396292684624e-01, 3.613258055684543e-01, + -9.323703287718285e-01, 3.615045919845453e-01, + -9.323009939946028e-01, 3.616833651091458e-01, + -9.322316249393345e-01, 3.618621249356830e-01, + -9.321622216085744e-01, 3.620408714575842e-01, + -9.320927840048740e-01, 3.622196046682775e-01, + -9.320233121307865e-01, 3.623983245611913e-01, + -9.319538059888660e-01, 3.625770311297548e-01, + -9.318842655816681e-01, 3.627557243673972e-01, + -9.318146909117497e-01, 3.629344042675486e-01, + -9.317450819816687e-01, 3.631130708236395e-01, + -9.316754387939846e-01, 3.632917240291008e-01, + -9.316057613512578e-01, 3.634703638773638e-01, + -9.315360496560503e-01, 3.636489903618605e-01, + -9.314663037109251e-01, 3.638276034760235e-01, + -9.313965235184466e-01, 3.640062032132855e-01, + -9.313267090811804e-01, 3.641847895670799e-01, + -9.312568604016934e-01, 3.643633625308406e-01, + -9.311869774825537e-01, 3.645419220980021e-01, + -9.311170603263308e-01, 3.647204682619993e-01, + -9.310471089355953e-01, 3.648990010162673e-01, + -9.309771233129189e-01, 3.650775203542422e-01, + -9.309071034608751e-01, 3.652560262693603e-01, + -9.308370493820382e-01, 3.654345187550584e-01, + -9.307669610789837e-01, 3.656129978047739e-01, + -9.306968385542889e-01, 3.657914634119446e-01, + -9.306266818105318e-01, 3.659699155700087e-01, + -9.305564908502918e-01, 3.661483542724053e-01, + -9.304862656761498e-01, 3.663267795125736e-01, + -9.304160062906875e-01, 3.665051912839534e-01, + -9.303457126964885e-01, 3.666835895799849e-01, + -9.302753848961371e-01, 3.668619743941091e-01, + -9.302050228922191e-01, 3.670403457197672e-01, + -9.301346266873214e-01, 3.672187035504010e-01, + -9.300641962840324e-01, 3.673970478794527e-01, + -9.299937316849415e-01, 3.675753787003653e-01, + -9.299232328926397e-01, 3.677536960065820e-01, + -9.298526999097187e-01, 3.679319997915464e-01, + -9.297821327387722e-01, 3.681102900487030e-01, + -9.297115313823944e-01, 3.682885667714966e-01, + -9.296408958431813e-01, 3.684668299533723e-01, + -9.295702261237299e-01, 3.686450795877760e-01, + -9.294995222266386e-01, 3.688233156681539e-01, + -9.294287841545068e-01, 3.690015381879528e-01, + -9.293580119099355e-01, 3.691797471406200e-01, + -9.292872054955268e-01, 3.693579425196031e-01, + -9.292163649138840e-01, 3.695361243183506e-01, + -9.291454901676117e-01, 3.697142925303112e-01, + -9.290745812593159e-01, 3.698924471489341e-01, + -9.290036381916034e-01, 3.700705881676691e-01, + -9.289326609670828e-01, 3.702487155799664e-01, + -9.288616495883637e-01, 3.704268293792768e-01, + -9.287906040580570e-01, 3.706049295590517e-01, + -9.287195243787748e-01, 3.707830161127426e-01, + -9.286484105531305e-01, 3.709610890338020e-01, + -9.285772625837388e-01, 3.711391483156826e-01, + -9.285060804732156e-01, 3.713171939518375e-01, + -9.284348642241780e-01, 3.714952259357208e-01, + -9.283636138392444e-01, 3.716732442607865e-01, + -9.282923293210347e-01, 3.718512489204895e-01, + -9.282210106721694e-01, 3.720292399082850e-01, + -9.281496578952712e-01, 3.722072172176288e-01, + -9.280782709929631e-01, 3.723851808419774e-01, + -9.280068499678700e-01, 3.725631307747873e-01, + -9.279353948226179e-01, 3.727410670095158e-01, + -9.278639055598338e-01, 3.729189895396208e-01, + -9.277923821821463e-01, 3.730968983585606e-01, + -9.277208246921852e-01, 3.732747934597940e-01, + -9.276492330925812e-01, 3.734526748367803e-01, + -9.275776073859667e-01, 3.736305424829793e-01, + -9.275059475749752e-01, 3.738083963918512e-01, + -9.274342536622413e-01, 3.739862365568570e-01, + -9.273625256504011e-01, 3.741640629714579e-01, + -9.272907635420917e-01, 3.743418756291159e-01, + -9.272189673399518e-01, 3.745196745232932e-01, + -9.271471370466209e-01, 3.746974596474526e-01, + -9.270752726647401e-01, 3.748752309950575e-01, + -9.270033741969517e-01, 3.750529885595719e-01, + -9.269314416458991e-01, 3.752307323344599e-01, + -9.268594750142272e-01, 3.754084623131866e-01, + -9.267874743045817e-01, 3.755861784892172e-01, + -9.267154395196103e-01, 3.757638808560177e-01, + -9.266433706619612e-01, 3.759415694070544e-01, + -9.265712677342843e-01, 3.761192441357943e-01, + -9.264991307392305e-01, 3.762969050357048e-01, + -9.264269596794522e-01, 3.764745521002538e-01, + -9.263547545576029e-01, 3.766521853229096e-01, + -9.262825153763372e-01, 3.768298046971413e-01, + -9.262102421383114e-01, 3.770074102164183e-01, + -9.261379348461826e-01, 3.771850018742104e-01, + -9.260655935026093e-01, 3.773625796639883e-01, + -9.259932181102515e-01, 3.775401435792229e-01, + -9.259208086717701e-01, 3.777176936133856e-01, + -9.258483651898273e-01, 3.778952297599485e-01, + -9.257758876670867e-01, 3.780727520123840e-01, + -9.257033761062132e-01, 3.782502603641652e-01, + -9.256308305098727e-01, 3.784277548087656e-01, + -9.255582508807327e-01, 3.786052353396591e-01, + -9.254856372214615e-01, 3.787827019503205e-01, + -9.254129895347291e-01, 3.789601546342247e-01, + -9.253403078232063e-01, 3.791375933848473e-01, + -9.252675920895657e-01, 3.793150181956644e-01, + -9.251948423364805e-01, 3.794924290601526e-01, + -9.251220585666259e-01, 3.796698259717889e-01, + -9.250492407826776e-01, 3.798472089240512e-01, + -9.249763889873132e-01, 3.800245779104173e-01, + -9.249035031832109e-01, 3.802019329243660e-01, + -9.248305833730508e-01, 3.803792739593766e-01, + -9.247576295595139e-01, 3.805566010089285e-01, + -9.246846417452824e-01, 3.807339140665021e-01, + -9.246116199330400e-01, 3.809112131255781e-01, + -9.245385641254714e-01, 3.810884981796375e-01, + -9.244654743252626e-01, 3.812657692221624e-01, + -9.243923505351010e-01, 3.814430262466347e-01, + -9.243191927576752e-01, 3.816202692465374e-01, + -9.242460009956749e-01, 3.817974982153536e-01, + -9.241727752517912e-01, 3.819747131465672e-01, + -9.240995155287163e-01, 3.821519140336626e-01, + -9.240262218291438e-01, 3.823291008701245e-01, + -9.239528941557686e-01, 3.825062736494382e-01, + -9.238795325112867e-01, 3.826834323650898e-01, + -9.238061368983954e-01, 3.828605770105654e-01, + -9.237327073197933e-01, 3.830377075793520e-01, + -9.236592437781800e-01, 3.832148240649372e-01, + -9.235857462762567e-01, 3.833919264608087e-01, + -9.235122148167256e-01, 3.835690147604549e-01, + -9.234386494022904e-01, 3.837460889573650e-01, + -9.233650500356557e-01, 3.839231490450284e-01, + -9.232914167195276e-01, 3.841001950169350e-01, + -9.232177494566135e-01, 3.842772268665755e-01, + -9.231440482496219e-01, 3.844542445874408e-01, + -9.230703131012624e-01, 3.846312481730226e-01, + -9.229965440142462e-01, 3.848082376168129e-01, + -9.229227409912857e-01, 3.849852129123042e-01, + -9.228489040350941e-01, 3.851621740529899e-01, + -9.227750331483864e-01, 3.853391210323633e-01, + -9.227011283338786e-01, 3.855160538439188e-01, + -9.226271895942879e-01, 3.856929724811511e-01, + -9.225532169323328e-01, 3.858698769375553e-01, + -9.224792103507332e-01, 3.860467672066272e-01, + -9.224051698522099e-01, 3.862236432818630e-01, + -9.223310954394854e-01, 3.864005051567594e-01, + -9.222569871152830e-01, 3.865773528248139e-01, + -9.221828448823276e-01, 3.867541862795242e-01, + -9.221086687433452e-01, 3.869310055143886e-01, + -9.220344587010628e-01, 3.871078105229060e-01, + -9.219602147582092e-01, 3.872846012985758e-01, + -9.218859369175140e-01, 3.874613778348979e-01, + -9.218116251817081e-01, 3.876381401253727e-01, + -9.217372795535239e-01, 3.878148881635012e-01, + -9.216629000356947e-01, 3.879916219427849e-01, + -9.215884866309555e-01, 3.881683414567257e-01, + -9.215140393420420e-01, 3.883450466988262e-01, + -9.214395581716914e-01, 3.885217376625896e-01, + -9.213650431226423e-01, 3.886984143415192e-01, + -9.212904941976345e-01, 3.888750767291193e-01, + -9.212159113994087e-01, 3.890517248188944e-01, + -9.211412947307073e-01, 3.892283586043497e-01, + -9.210666441942736e-01, 3.894049780789909e-01, + -9.209919597928523e-01, 3.895815832363243e-01, + -9.209172415291895e-01, 3.897581740698564e-01, + -9.208424894060322e-01, 3.899347505730947e-01, + -9.207677034261288e-01, 3.901113127395469e-01, + -9.206928835922291e-01, 3.902878605627212e-01, + -9.206180299070840e-01, 3.904643940361266e-01, + -9.205431423734455e-01, 3.906409131532724e-01, + -9.204682209940671e-01, 3.908174179076685e-01, + -9.203932657717036e-01, 3.909939082928254e-01, + -9.203182767091106e-01, 3.911703843022539e-01, + -9.202432538090454e-01, 3.913468459294656e-01, + -9.201681970742663e-01, 3.915232931679724e-01, + -9.200931065075332e-01, 3.916997260112869e-01, + -9.200179821116066e-01, 3.918761444529223e-01, + -9.199428238892486e-01, 3.920525484863921e-01, + -9.198676318432230e-01, 3.922289381052103e-01, + -9.197924059762939e-01, 3.924053133028917e-01, + -9.197171462912274e-01, 3.925816740729515e-01, + -9.196418527907905e-01, 3.927580204089053e-01, + -9.195665254777515e-01, 3.929343523042695e-01, + -9.194911643548801e-01, 3.931106697525608e-01, + -9.194157694249471e-01, 3.932869727472964e-01, + -9.193403406907243e-01, 3.934632612819943e-01, + -9.192648781549854e-01, 3.936395353501729e-01, + -9.191893818205045e-01, 3.938157949453510e-01, + -9.191138516900578e-01, 3.939920400610481e-01, + -9.190382877664220e-01, 3.941682706907841e-01, + -9.189626900523756e-01, 3.943444868280796e-01, + -9.188870585506980e-01, 3.945206884664556e-01, + -9.188113932641700e-01, 3.946968755994336e-01, + -9.187356941955735e-01, 3.948730482205358e-01, + -9.186599613476919e-01, 3.950492063232848e-01, + -9.185841947233095e-01, 3.952253499012037e-01, + -9.185083943252123e-01, 3.954014789478164e-01, + -9.184325601561869e-01, 3.955775934566468e-01, + -9.183566922190217e-01, 3.957536934212201e-01, + -9.182807905165061e-01, 3.959297788350613e-01, + -9.182048550514309e-01, 3.961058496916963e-01, + -9.181288858265880e-01, 3.962819059846515e-01, + -9.180528828447704e-01, 3.964579477074539e-01, + -9.179768461087727e-01, 3.966339748536308e-01, + -9.179007756213905e-01, 3.968099874167103e-01, + -9.178246713854206e-01, 3.969859853902209e-01, + -9.177485334036612e-01, 3.971619687676916e-01, + -9.176723616789119e-01, 3.973379375426521e-01, + -9.175961562139730e-01, 3.975138917086323e-01, + -9.175199170116463e-01, 3.976898312591632e-01, + -9.174436440747352e-01, 3.978657561877758e-01, + -9.173673374060439e-01, 3.980416664880018e-01, + -9.172909970083779e-01, 3.982175621533736e-01, + -9.172146228845443e-01, 3.983934431774240e-01, + -9.171382150373507e-01, 3.985693095536863e-01, + -9.170617734696068e-01, 3.987451612756944e-01, + -9.169852981841230e-01, 3.989209983369829e-01, + -9.169087891837110e-01, 3.990968207310865e-01, + -9.168322464711839e-01, 3.992726284515410e-01, + -9.167556700493560e-01, 3.994484214918821e-01, + -9.166790599210427e-01, 3.996241998456468e-01, + -9.166024160890608e-01, 3.997999635063720e-01, + -9.165257385562282e-01, 3.999757124675953e-01, + -9.164490273253642e-01, 4.001514467228551e-01, + -9.163722823992891e-01, 4.003271662656901e-01, + -9.162955037808248e-01, 4.005028710896395e-01, + -9.162186914727942e-01, 4.006785611882432e-01, + -9.161418454780214e-01, 4.008542365550417e-01, + -9.160649657993317e-01, 4.010298971835756e-01, + -9.159880524395520e-01, 4.012055430673867e-01, + -9.159111054015099e-01, 4.013811742000168e-01, + -9.158341246880347e-01, 4.015567905750085e-01, + -9.157571103019567e-01, 4.017323921859050e-01, + -9.156800622461077e-01, 4.019079790262497e-01, + -9.156029805233202e-01, 4.020835510895870e-01, + -9.155258651364285e-01, 4.022591083694615e-01, + -9.154487160882678e-01, 4.024346508594184e-01, + -9.153715333816748e-01, 4.026101785530037e-01, + -9.152943170194870e-01, 4.027856914437635e-01, + -9.152170670045439e-01, 4.029611895252449e-01, + -9.151397833396853e-01, 4.031366727909953e-01, + -9.150624660277529e-01, 4.033121412345625e-01, + -9.149851150715893e-01, 4.034875948494953e-01, + -9.149077304740387e-01, 4.036630336293426e-01, + -9.148303122379462e-01, 4.038384575676541e-01, + -9.147528603661582e-01, 4.040138666579799e-01, + -9.146753748615224e-01, 4.041892608938707e-01, + -9.145978557268878e-01, 4.043646402688778e-01, + -9.145203029651044e-01, 4.045400047765530e-01, + -9.144427165790239e-01, 4.047153544104486e-01, + -9.143650965714986e-01, 4.048906891641176e-01, + -9.142874429453824e-01, 4.050660090311133e-01, + -9.142097557035307e-01, 4.052413140049899e-01, + -9.141320348487995e-01, 4.054166040793016e-01, + -9.140542803840466e-01, 4.055918792476039e-01, + -9.139764923121306e-01, 4.057671395034521e-01, + -9.138986706359117e-01, 4.059423848404025e-01, + -9.138208153582511e-01, 4.061176152520118e-01, + -9.137429264820114e-01, 4.062928307318374e-01, + -9.136650040100563e-01, 4.064680312734370e-01, + -9.135870479452508e-01, 4.066432168703690e-01, + -9.135090582904611e-01, 4.068183875161923e-01, + -9.134310350485547e-01, 4.069935432044665e-01, + -9.133529782224002e-01, 4.071686839287516e-01, + -9.132748878148678e-01, 4.073438096826080e-01, + -9.131967638288282e-01, 4.075189204595969e-01, + -9.131186062671542e-01, 4.076940162532801e-01, + -9.130404151327192e-01, 4.078690970572198e-01, + -9.129621904283982e-01, 4.080441628649787e-01, + -9.128839321570672e-01, 4.082192136701201e-01, + -9.128056403216035e-01, 4.083942494662080e-01, + -9.127273149248859e-01, 4.085692702468068e-01, + -9.126489559697939e-01, 4.087442760054814e-01, + -9.125705634592087e-01, 4.089192667357974e-01, + -9.124921373960126e-01, 4.090942424313210e-01, + -9.124136777830890e-01, 4.092692030856186e-01, + -9.123351846233227e-01, 4.094441486922576e-01, + -9.122566579195998e-01, 4.096190792448057e-01, + -9.121780976748072e-01, 4.097939947368311e-01, + -9.120995038918335e-01, 4.099688951619029e-01, + -9.120208765735683e-01, 4.101437805135902e-01, + -9.119422157229026e-01, 4.103186507854633e-01, + -9.118635213427285e-01, 4.104935059710924e-01, + -9.117847934359394e-01, 4.106683460640487e-01, + -9.117060320054299e-01, 4.108431710579039e-01, + -9.116272370540957e-01, 4.110179809462302e-01, + -9.115484085848340e-01, 4.111927757226002e-01, + -9.114695466005430e-01, 4.113675553805872e-01, + -9.113906511041224e-01, 4.115423199137652e-01, + -9.113117220984728e-01, 4.117170693157086e-01, + -9.112327595864962e-01, 4.118918035799922e-01, + -9.111537635710959e-01, 4.120665227001916e-01, + -9.110747340551764e-01, 4.122412266698829e-01, + -9.109956710416431e-01, 4.124159154826427e-01, + -9.109165745334034e-01, 4.125905891320482e-01, + -9.108374445333650e-01, 4.127652476116773e-01, + -9.107582810444376e-01, 4.129398909151081e-01, + -9.106790840695316e-01, 4.131145190359194e-01, + -9.105998536115589e-01, 4.132891319676910e-01, + -9.105205896734327e-01, 4.134637297040024e-01, + -9.104412922580672e-01, 4.136383122384345e-01, + -9.103619613683780e-01, 4.138128795645683e-01, + -9.102825970072818e-01, 4.139874316759854e-01, + -9.102031991776965e-01, 4.141619685662681e-01, + -9.101237678825417e-01, 4.143364902289991e-01, + -9.100443031247375e-01, 4.145109966577618e-01, + -9.099648049072057e-01, 4.146854878461400e-01, + -9.098852732328692e-01, 4.148599637877183e-01, + -9.098057081046522e-01, 4.150344244760816e-01, + -9.097261095254802e-01, 4.152088699048156e-01, + -9.096464774982795e-01, 4.153833000675062e-01, + -9.095668120259783e-01, 4.155577149577404e-01, + -9.094871131115054e-01, 4.157321145691054e-01, + -9.094073807577913e-01, 4.159064988951888e-01, + -9.093276149677673e-01, 4.160808679295792e-01, + -9.092478157443663e-01, 4.162552216658655e-01, + -9.091679830905224e-01, 4.164295600976372e-01, + -9.090881170091706e-01, 4.166038832184843e-01, + -9.090082175032475e-01, 4.167781910219976e-01, + -9.089282845756906e-01, 4.169524835017682e-01, + -9.088483182294391e-01, 4.171267606513879e-01, + -9.087683184674329e-01, 4.173010224644489e-01, + -9.086882852926134e-01, 4.174752689345443e-01, + -9.086082187079232e-01, 4.176495000552674e-01, + -9.085281187163061e-01, 4.178237158202123e-01, + -9.084479853207073e-01, 4.179979162229736e-01, + -9.083678185240729e-01, 4.181721012571463e-01, + -9.082876183293505e-01, 4.183462709163263e-01, + -9.082073847394887e-01, 4.185204251941097e-01, + -9.081271177574376e-01, 4.186945640840936e-01, + -9.080468173861483e-01, 4.188686875798751e-01, + -9.079664836285734e-01, 4.190427956750524e-01, + -9.078861164876663e-01, 4.192168883632239e-01, + -9.078057159663819e-01, 4.193909656379889e-01, + -9.077252820676764e-01, 4.195650274929469e-01, + -9.076448147945072e-01, 4.197390739216982e-01, + -9.075643141498326e-01, 4.199131049178436e-01, + -9.074837801366126e-01, 4.200871204749845e-01, + -9.074032127578081e-01, 4.202611205867229e-01, + -9.073226120163814e-01, 4.204351052466612e-01, + -9.072419779152958e-01, 4.206090744484025e-01, + -9.071613104575162e-01, 4.207830281855505e-01, + -9.070806096460085e-01, 4.209569664517094e-01, + -9.069998754837396e-01, 4.211308892404840e-01, + -9.069191079736781e-01, 4.213047965454796e-01, + -9.068383071187934e-01, 4.214786883603023e-01, + -9.067574729220566e-01, 4.216525646785583e-01, + -9.066766053864395e-01, 4.218264254938549e-01, + -9.065957045149153e-01, 4.220002707997997e-01, + -9.065147703104588e-01, 4.221741005900008e-01, + -9.064338027760455e-01, 4.223479148580671e-01, + -9.063528019146524e-01, 4.225217135976078e-01, + -9.062717677292577e-01, 4.226954968022330e-01, + -9.061907002228407e-01, 4.228692644655531e-01, + -9.061095993983820e-01, 4.230430165811790e-01, + -9.060284652588636e-01, 4.232167531427226e-01, + -9.059472978072685e-01, 4.233904741437960e-01, + -9.058660970465809e-01, 4.235641795780120e-01, + -9.057848629797866e-01, 4.237378694389838e-01, + -9.057035956098720e-01, 4.239115437203256e-01, + -9.056222949398253e-01, 4.240852024156516e-01, + -9.055409609726356e-01, 4.242588455185770e-01, + -9.054595937112933e-01, 4.244324730227174e-01, + -9.053781931587901e-01, 4.246060849216891e-01, + -9.052967593181188e-01, 4.247796812091088e-01, + -9.052152921922736e-01, 4.249532618785939e-01, + -9.051337917842497e-01, 4.251268269237624e-01, + -9.050522580970436e-01, 4.253003763382326e-01, + -9.049706911336532e-01, 4.254739101156238e-01, + -9.048890908970775e-01, 4.256474282495556e-01, + -9.048074573903165e-01, 4.258209307336482e-01, + -9.047257906163719e-01, 4.259944175615224e-01, + -9.046440905782462e-01, 4.261678887267996e-01, + -9.045623572789433e-01, 4.263413442231018e-01, + -9.044805907214682e-01, 4.265147840440515e-01, + -9.043987909088274e-01, 4.266882081832719e-01, + -9.043169578440283e-01, 4.268616166343864e-01, + -9.042350915300797e-01, 4.270350093910197e-01, + -9.041531919699918e-01, 4.272083864467963e-01, + -9.040712591667754e-01, 4.273817477953418e-01, + -9.039892931234433e-01, 4.275550934302821e-01, + -9.039072938430090e-01, 4.277284233452438e-01, + -9.038252613284875e-01, 4.279017375338541e-01, + -9.037431955828946e-01, 4.280750359897407e-01, + -9.036610966092480e-01, 4.282483187065320e-01, + -9.035789644105661e-01, 4.284215856778567e-01, + -9.034967989898685e-01, 4.285948368973444e-01, + -9.034146003501763e-01, 4.287680723586251e-01, + -9.033323684945118e-01, 4.289412920553295e-01, + -9.032501034258984e-01, 4.291144959810888e-01, + -9.031678051473607e-01, 4.292876841295346e-01, + -9.030854736619246e-01, 4.294608564942995e-01, + -9.030031089726172e-01, 4.296340130690164e-01, + -9.029207110824667e-01, 4.298071538473187e-01, + -9.028382799945028e-01, 4.299802788228406e-01, + -9.027558157117561e-01, 4.301533879892169e-01, + -9.026733182372588e-01, 4.303264813400826e-01, + -9.025907875740439e-01, 4.304995588690738e-01, + -9.025082237251459e-01, 4.306726205698268e-01, + -9.024256266936004e-01, 4.308456664359787e-01, + -9.023429964824442e-01, 4.310186964611670e-01, + -9.022603330947155e-01, 4.311917106390299e-01, + -9.021776365334536e-01, 4.313647089632063e-01, + -9.020949068016989e-01, 4.315376914273355e-01, + -9.020121439024932e-01, 4.317106580250573e-01, + -9.019293478388795e-01, 4.318836087500122e-01, + -9.018465186139017e-01, 4.320565435958415e-01, + -9.017636562306057e-01, 4.322294625561867e-01, + -9.016807606920377e-01, 4.324023656246901e-01, + -9.015978320012457e-01, 4.325752527949946e-01, + -9.015148701612787e-01, 4.327481240607437e-01, + -9.014318751751870e-01, 4.329209794155813e-01, + -9.013488470460220e-01, 4.330938188531520e-01, + -9.012657857768366e-01, 4.332666423671009e-01, + -9.011826913706845e-01, 4.334394499510741e-01, + -9.010995638306210e-01, 4.336122415987176e-01, + -9.010164031597023e-01, 4.337850173036785e-01, + -9.009332093609862e-01, 4.339577770596044e-01, + -9.008499824375314e-01, 4.341305208601433e-01, + -9.007667223923979e-01, 4.343032486989440e-01, + -9.006834292286470e-01, 4.344759605696557e-01, + -9.006001029493409e-01, 4.346486564659283e-01, + -9.005167435575435e-01, 4.348213363814123e-01, + -9.004333510563198e-01, 4.349940003097587e-01, + -9.003499254487356e-01, 4.351666482446193e-01, + -9.002664667378585e-01, 4.353392801796461e-01, + -9.001829749267568e-01, 4.355118961084920e-01, + -9.000994500185004e-01, 4.356844960248105e-01, + -9.000158920161603e-01, 4.358570799222555e-01, + -8.999323009228085e-01, 4.360296477944816e-01, + -8.998486767415186e-01, 4.362021996351440e-01, + -8.997650194753651e-01, 4.363747354378983e-01, + -8.996813291274239e-01, 4.365472551964012e-01, + -8.995976057007722e-01, 4.367197589043094e-01, + -8.995138491984880e-01, 4.368922465552804e-01, + -8.994300596236509e-01, 4.370647181429724e-01, + -8.993462369793416e-01, 4.372371736610441e-01, + -8.992623812686420e-01, 4.374096131031548e-01, + -8.991784924946353e-01, 4.375820364629644e-01, + -8.990945706604058e-01, 4.377544437341334e-01, + -8.990106157690391e-01, 4.379268349103229e-01, + -8.989266278236219e-01, 4.380992099851945e-01, + -8.988426068272424e-01, 4.382715689524104e-01, + -8.987585527829894e-01, 4.384439118056337e-01, + -8.986744656939538e-01, 4.386162385385277e-01, + -8.985903455632270e-01, 4.387885491447563e-01, + -8.985061923939020e-01, 4.389608436179843e-01, + -8.984220061890725e-01, 4.391331219518769e-01, + -8.983377869518343e-01, 4.393053841401000e-01, + -8.982535346852836e-01, 4.394776301763198e-01, + -8.981692493925181e-01, 4.396498600542035e-01, + -8.980849310766368e-01, 4.398220737674185e-01, + -8.980005797407399e-01, 4.399942713096333e-01, + -8.979161953879287e-01, 4.401664526745163e-01, + -8.978317780213056e-01, 4.403386178557372e-01, + -8.977473276439747e-01, 4.405107668469659e-01, + -8.976628442590409e-01, 4.406828996418729e-01, + -8.975783278696102e-01, 4.408550162341294e-01, + -8.974937784787903e-01, 4.410271166174072e-01, + -8.974091960896897e-01, 4.411992007853787e-01, + -8.973245807054183e-01, 4.413712687317167e-01, + -8.972399323290872e-01, 4.415433204500949e-01, + -8.971552509638085e-01, 4.417153559341873e-01, + -8.970705366126959e-01, 4.418873751776689e-01, + -8.969857892788640e-01, 4.420593781742147e-01, + -8.969010089654288e-01, 4.422313649175010e-01, + -8.968161956755073e-01, 4.424033354012041e-01, + -8.967313494122179e-01, 4.425752896190012e-01, + -8.966464701786802e-01, 4.427472275645700e-01, + -8.965615579780150e-01, 4.429191492315890e-01, + -8.964766128133441e-01, 4.430910546137369e-01, + -8.963916346877908e-01, 4.432629437046933e-01, + -8.963066236044795e-01, 4.434348164981385e-01, + -8.962215795665360e-01, 4.436066729877530e-01, + -8.961365025770868e-01, 4.437785131672182e-01, + -8.960513926392601e-01, 4.439503370302161e-01, + -8.959662497561852e-01, 4.441221445704292e-01, + -8.958810739309924e-01, 4.442939357815406e-01, + -8.957958651668135e-01, 4.444657106572340e-01, + -8.957106234667813e-01, 4.446374691911938e-01, + -8.956253488340301e-01, 4.448092113771049e-01, + -8.955400412716950e-01, 4.449809372086527e-01, + -8.954547007829124e-01, 4.451526466795236e-01, + -8.953693273708203e-01, 4.453243397834042e-01, + -8.952839210385576e-01, 4.454960165139817e-01, + -8.951984817892642e-01, 4.456676768649443e-01, + -8.951130096260818e-01, 4.458393208299803e-01, + -8.950275045521526e-01, 4.460109484027789e-01, + -8.949419665706208e-01, 4.461825595770301e-01, + -8.948563956846310e-01, 4.463541543464238e-01, + -8.947707918973296e-01, 4.465257327046513e-01, + -8.946851552118640e-01, 4.466972946454041e-01, + -8.945994856313827e-01, 4.468688401623742e-01, + -8.945137831590356e-01, 4.470403692492544e-01, + -8.944280477979738e-01, 4.472118818997383e-01, + -8.943422795513495e-01, 4.473833781075196e-01, + -8.942564784223160e-01, 4.475548578662930e-01, + -8.941706444140283e-01, 4.477263211697536e-01, + -8.940847775296420e-01, 4.478977680115973e-01, + -8.939988777723142e-01, 4.480691983855204e-01, + -8.939129451452033e-01, 4.482406122852199e-01, + -8.938269796514686e-01, 4.484120097043934e-01, + -8.937409812942710e-01, 4.485833906367392e-01, + -8.936549500767725e-01, 4.487547550759560e-01, + -8.935688860021359e-01, 4.489261030157433e-01, + -8.934827890735259e-01, 4.490974344498010e-01, + -8.933966592941077e-01, 4.492687493718299e-01, + -8.933104966670482e-01, 4.494400477755311e-01, + -8.932243011955153e-01, 4.496113296546065e-01, + -8.931380728826783e-01, 4.497825950027587e-01, + -8.930518117317074e-01, 4.499538438136905e-01, + -8.929655177457744e-01, 4.501250760811057e-01, + -8.928791909280517e-01, 4.502962917987086e-01, + -8.927928312817136e-01, 4.504674909602041e-01, + -8.927064388099354e-01, 4.506386735592976e-01, + -8.926200135158932e-01, 4.508098395896953e-01, + -8.925335554027646e-01, 4.509809890451039e-01, + -8.924470644737287e-01, 4.511521219192306e-01, + -8.923605407319654e-01, 4.513232382057835e-01, + -8.922739841806558e-01, 4.514943378984711e-01, + -8.921873948229825e-01, 4.516654209910025e-01, + -8.921007726621291e-01, 4.518364874770875e-01, + -8.920141177012805e-01, 4.520075373504364e-01, + -8.919274299436225e-01, 4.521785706047604e-01, + -8.918407093923427e-01, 4.523495872337709e-01, + -8.917539560506295e-01, 4.525205872311800e-01, + -8.916671699216723e-01, 4.526915705907009e-01, + -8.915803510086623e-01, 4.528625373060468e-01, + -8.914934993147914e-01, 4.530334873709316e-01, + -8.914066148432529e-01, 4.532044207790702e-01, + -8.913196975972414e-01, 4.533753375241777e-01, + -8.912327475799525e-01, 4.535462375999701e-01, + -8.911457647945832e-01, 4.537171210001639e-01, + -8.910587492443316e-01, 4.538879877184760e-01, + -8.909717009323969e-01, 4.540588377486244e-01, + -8.908846198619795e-01, 4.542296710843273e-01, + -8.907975060362815e-01, 4.544004877193036e-01, + -8.907103594585056e-01, 4.545712876472729e-01, + -8.906231801318559e-01, 4.547420708619554e-01, + -8.905359680595378e-01, 4.549128373570719e-01, + -8.904487232447579e-01, 4.550835871263438e-01, + -8.903614456907238e-01, 4.552543201634931e-01, + -8.902741354006446e-01, 4.554250364622424e-01, + -8.901867923777302e-01, 4.555957360163150e-01, + -8.900994166251923e-01, 4.557664188194346e-01, + -8.900120081462433e-01, 4.559370848653260e-01, + -8.899245669440967e-01, 4.561077341477141e-01, + -8.898370930219679e-01, 4.562783666603246e-01, + -8.897495863830728e-01, 4.564489823968839e-01, + -8.896620470306289e-01, 4.566195813511189e-01, + -8.895744749678546e-01, 4.567901635167572e-01, + -8.894868701979699e-01, 4.569607288875270e-01, + -8.893992327241955e-01, 4.571312774571570e-01, + -8.893115625497539e-01, 4.573018092193766e-01, + -8.892238596778682e-01, 4.574723241679161e-01, + -8.891361241117632e-01, 4.576428222965058e-01, + -8.890483558546646e-01, 4.578133035988772e-01, + -8.889605549097993e-01, 4.579837680687621e-01, + -8.888727212803956e-01, 4.581542156998931e-01, + -8.887848549696828e-01, 4.583246464860032e-01, + -8.886969559808916e-01, 4.584950604208263e-01, + -8.886090243172539e-01, 4.586654574980966e-01, + -8.885210599820023e-01, 4.588358377115491e-01, + -8.884330629783713e-01, 4.590062010549196e-01, + -8.883450333095964e-01, 4.591765475219441e-01, + -8.882569709789139e-01, 4.593468771063596e-01, + -8.881688759895617e-01, 4.595171898019035e-01, + -8.880807483447789e-01, 4.596874856023139e-01, + -8.879925880478056e-01, 4.598577645013295e-01, + -8.879043951018832e-01, 4.600280264926896e-01, + -8.878161695102544e-01, 4.601982715701343e-01, + -8.877279112761630e-01, 4.603684997274040e-01, + -8.876396204028539e-01, 4.605387109582400e-01, + -8.875512968935734e-01, 4.607089052563841e-01, + -8.874629407515688e-01, 4.608790826155787e-01, + -8.873745519800889e-01, 4.610492430295669e-01, + -8.872861305823831e-01, 4.612193864920924e-01, + -8.871976765617029e-01, 4.613895129968995e-01, + -8.871091899213002e-01, 4.615596225377331e-01, + -8.870206706644284e-01, 4.617297151083388e-01, + -8.869321187943422e-01, 4.618997907024627e-01, + -8.868435343142974e-01, 4.620698493138518e-01, + -8.867549172275508e-01, 4.622398909362533e-01, + -8.866662675373610e-01, 4.624099155634154e-01, + -8.865775852469870e-01, 4.625799231890868e-01, + -8.864888703596896e-01, 4.627499138070167e-01, + -8.864001228787306e-01, 4.629198874109551e-01, + -8.863113428073728e-01, 4.630898439946525e-01, + -8.862225301488806e-01, 4.632597835518601e-01, + -8.861336849065193e-01, 4.634297060763298e-01, + -8.860448070835556e-01, 4.635996115618140e-01, + -8.859558966832570e-01, 4.637695000020656e-01, + -8.858669537088928e-01, 4.639393713908385e-01, + -8.857779781637329e-01, 4.641092257218870e-01, + -8.856889700510490e-01, 4.642790629889658e-01, + -8.855999293741134e-01, 4.644488831858307e-01, + -8.855108561362000e-01, 4.646186863062378e-01, + -8.854217503405837e-01, 4.647884723439440e-01, + -8.853326119905406e-01, 4.649582412927067e-01, + -8.852434410893483e-01, 4.651279931462839e-01, + -8.851542376402851e-01, 4.652977278984346e-01, + -8.850650016466309e-01, 4.654674455429178e-01, + -8.849757331116667e-01, 4.656371460734937e-01, + -8.848864320386746e-01, 4.658068294839227e-01, + -8.847970984309378e-01, 4.659764957679662e-01, + -8.847077322917410e-01, 4.661461449193859e-01, + -8.846183336243699e-01, 4.663157769319444e-01, + -8.845289024321115e-01, 4.664853917994049e-01, + -8.844394387182538e-01, 4.666549895155309e-01, + -8.843499424860861e-01, 4.668245700740870e-01, + -8.842604137388992e-01, 4.669941334688380e-01, + -8.841708524799845e-01, 4.671636796935498e-01, + -8.840812587126350e-01, 4.673332087419884e-01, + -8.839916324401449e-01, 4.675027206079209e-01, + -8.839019736658095e-01, 4.676722152851148e-01, + -8.838122823929251e-01, 4.678416927673382e-01, + -8.837225586247897e-01, 4.680111530483598e-01, + -8.836328023647019e-01, 4.681805961219493e-01, + -8.835430136159619e-01, 4.683500219818765e-01, + -8.834531923818709e-01, 4.685194306219123e-01, + -8.833633386657316e-01, 4.686888220358279e-01, + -8.832734524708474e-01, 4.688581962173953e-01, + -8.831835338005234e-01, 4.690275531603871e-01, + -8.830935826580654e-01, 4.691968928585766e-01, + -8.830035990467808e-01, 4.693662153057375e-01, + -8.829135829699780e-01, 4.695355204956445e-01, + -8.828235344309666e-01, 4.697048084220725e-01, + -8.827334534330576e-01, 4.698740790787974e-01, + -8.826433399795628e-01, 4.700433324595956e-01, + -8.825531940737955e-01, 4.702125685582442e-01, + -8.824630157190702e-01, 4.703817873685207e-01, + -8.823728049187023e-01, 4.705509888842035e-01, + -8.822825616760087e-01, 4.707201730990716e-01, + -8.821922859943074e-01, 4.708893400069045e-01, + -8.821019778769176e-01, 4.710584896014825e-01, + -8.820116373271596e-01, 4.712276218765863e-01, + -8.819212643483550e-01, 4.713967368259976e-01, + -8.818308589438266e-01, 4.715658344434984e-01, + -8.817404211168983e-01, 4.717349147228714e-01, + -8.816499508708953e-01, 4.719039776579002e-01, + -8.815594482091438e-01, 4.720730232423687e-01, + -8.814689131349714e-01, 4.722420514700615e-01, + -8.813783456517069e-01, 4.724110623347640e-01, + -8.812877457626801e-01, 4.725800558302622e-01, + -8.811971134712221e-01, 4.727490319503428e-01, + -8.811064487806651e-01, 4.729179906887928e-01, + -8.810157516943429e-01, 4.730869320394001e-01, + -8.809250222155899e-01, 4.732558559959533e-01, + -8.808342603477420e-01, 4.734247625522415e-01, + -8.807434660941363e-01, 4.735936517020545e-01, + -8.806526394581110e-01, 4.737625234391828e-01, + -8.805617804430057e-01, 4.739313777574174e-01, + -8.804708890521608e-01, 4.741002146505500e-01, + -8.803799652889182e-01, 4.742690341123730e-01, + -8.802890091566210e-01, 4.744378361366792e-01, + -8.801980206586132e-01, 4.746066207172626e-01, + -8.801069997982404e-01, 4.747753878479171e-01, + -8.800159465788491e-01, 4.749441375224378e-01, + -8.799248610037869e-01, 4.751128697346203e-01, + -8.798337430764029e-01, 4.752815844782607e-01, + -8.797425928000474e-01, 4.754502817471559e-01, + -8.796514101780716e-01, 4.756189615351033e-01, + -8.795601952138279e-01, 4.757876238359011e-01, + -8.794689479106702e-01, 4.759562686433481e-01, + -8.793776682719533e-01, 4.761248959512436e-01, + -8.792863563010332e-01, 4.762935057533877e-01, + -8.791950120012675e-01, 4.764620980435812e-01, + -8.791036353760143e-01, 4.766306728156253e-01, + -8.790122264286335e-01, 4.767992300633221e-01, + -8.789207851624858e-01, 4.769677697804742e-01, + -8.788293115809334e-01, 4.771362919608848e-01, + -8.787378056873394e-01, 4.773047965983579e-01, + -8.786462674850681e-01, 4.774732836866981e-01, + -8.785546969774854e-01, 4.776417532197105e-01, + -8.784630941679579e-01, 4.778102051912010e-01, + -8.783714590598535e-01, 4.779786395949762e-01, + -8.782797916565416e-01, 4.781470564248430e-01, + -8.781880919613922e-01, 4.783154556746095e-01, + -8.780963599777771e-01, 4.784838373380840e-01, + -8.780045957090691e-01, 4.786522014090755e-01, + -8.779127991586418e-01, 4.788205478813939e-01, + -8.778209703298705e-01, 4.789888767488495e-01, + -8.777291092261316e-01, 4.791571880052533e-01, + -8.776372158508022e-01, 4.793254816444171e-01, + -8.775452902072614e-01, 4.794937576601530e-01, + -8.774533322988886e-01, 4.796620160462742e-01, + -8.773613421290651e-01, 4.798302567965942e-01, + -8.772693197011732e-01, 4.799984799049273e-01, + -8.771772650185959e-01, 4.801666853650884e-01, + -8.770851780847184e-01, 4.803348731708930e-01, + -8.769930589029259e-01, 4.805030433161575e-01, + -8.769009074766057e-01, 4.806711957946986e-01, + -8.768087238091457e-01, 4.808393306003340e-01, + -8.767165079039354e-01, 4.810074477268816e-01, + -8.766242597643653e-01, 4.811755471681603e-01, + -8.765319793938271e-01, 4.813436289179897e-01, + -8.764396667957136e-01, 4.815116929701899e-01, + -8.763473219734190e-01, 4.816797393185815e-01, + -8.762549449303385e-01, 4.818477679569860e-01, + -8.761625356698685e-01, 4.820157788792256e-01, + -8.760700941954066e-01, 4.821837720791227e-01, + -8.759776205103518e-01, 4.823517475505010e-01, + -8.758851146181038e-01, 4.825197052871844e-01, + -8.757925765220639e-01, 4.826876452829975e-01, + -8.757000062256346e-01, 4.828555675317657e-01, + -8.756074037322193e-01, 4.830234720273149e-01, + -8.755147690452229e-01, 4.831913587634719e-01, + -8.754221021680509e-01, 4.833592277340638e-01, + -8.753294031041109e-01, 4.835270789329187e-01, + -8.752366718568109e-01, 4.836949123538651e-01, + -8.751439084295604e-01, 4.838627279907323e-01, + -8.750511128257700e-01, 4.840305258373500e-01, + -8.749582850488516e-01, 4.841983058875490e-01, + -8.748654251022183e-01, 4.843660681351604e-01, + -8.747725329892841e-01, 4.845338125740162e-01, + -8.746796087134645e-01, 4.847015391979487e-01, + -8.745866522781761e-01, 4.848692480007911e-01, + -8.744936636868366e-01, 4.850369389763773e-01, + -8.744006429428648e-01, 4.852046121185418e-01, + -8.743075900496810e-01, 4.853722674211198e-01, + -8.742145050107063e-01, 4.855399048779470e-01, + -8.741213878293633e-01, 4.857075244828598e-01, + -8.740282385090757e-01, 4.858751262296953e-01, + -8.739350570532682e-01, 4.860427101122913e-01, + -8.738418434653669e-01, 4.862102761244864e-01, + -8.737485977487989e-01, 4.863778242601194e-01, + -8.736553199069926e-01, 4.865453545130303e-01, + -8.735620099433778e-01, 4.867128668770592e-01, + -8.734686678613849e-01, 4.868803613460473e-01, + -8.733752936644460e-01, 4.870478379138364e-01, + -8.732818873559942e-01, 4.872152965742688e-01, + -8.731884489394638e-01, 4.873827373211874e-01, + -8.730949784182901e-01, 4.875501601484360e-01, + -8.730014757959099e-01, 4.877175650498588e-01, + -8.729079410757611e-01, 4.878849520193010e-01, + -8.728143742612824e-01, 4.880523210506083e-01, + -8.727207753559143e-01, 4.882196721376268e-01, + -8.726271443630980e-01, 4.883870052742035e-01, + -8.725334812862762e-01, 4.885543204541862e-01, + -8.724397861288923e-01, 4.887216176714231e-01, + -8.723460588943915e-01, 4.888888969197632e-01, + -8.722522995862199e-01, 4.890561581930560e-01, + -8.721585082078245e-01, 4.892234014851520e-01, + -8.720646847626539e-01, 4.893906267899019e-01, + -8.719708292541578e-01, 4.895578341011574e-01, + -8.718769416857869e-01, 4.897250234127709e-01, + -8.717830220609931e-01, 4.898921947185952e-01, + -8.716890703832297e-01, 4.900593480124839e-01, + -8.715950866559510e-01, 4.902264832882912e-01, + -8.715010708826125e-01, 4.903936005398720e-01, + -8.714070230666710e-01, 4.905606997610820e-01, + -8.713129432115840e-01, 4.907277809457774e-01, + -8.712188313208110e-01, 4.908948440878151e-01, + -8.711246873978119e-01, 4.910618891810526e-01, + -8.710305114460483e-01, 4.912289162193483e-01, + -8.709363034689828e-01, 4.913959251965608e-01, + -8.708420634700790e-01, 4.915629161065499e-01, + -8.707477914528018e-01, 4.917298889431758e-01, + -8.706534874206174e-01, 4.918968437002993e-01, + -8.705591513769932e-01, 4.920637803717820e-01, + -8.704647833253977e-01, 4.922306989514860e-01, + -8.703703832693003e-01, 4.923975994332744e-01, + -8.702759512121719e-01, 4.925644818110106e-01, + -8.701814871574846e-01, 4.927313460785588e-01, + -8.700869911087115e-01, 4.928981922297840e-01, + -8.699924630693269e-01, 4.930650202585517e-01, + -8.698979030428063e-01, 4.932318301587279e-01, + -8.698033110326266e-01, 4.933986219241798e-01, + -8.697086870422657e-01, 4.935653955487748e-01, + -8.696140310752023e-01, 4.937321510263810e-01, + -8.695193431349169e-01, 4.938988883508675e-01, + -8.694246232248909e-01, 4.940656075161036e-01, + -8.693298713486068e-01, 4.942323085159597e-01, + -8.692350875095484e-01, 4.943989913443066e-01, + -8.691402717112006e-01, 4.945656559950160e-01, + -8.690454239570495e-01, 4.947323024619599e-01, + -8.689505442505824e-01, 4.948989307390113e-01, + -8.688556325952879e-01, 4.950655408200436e-01, + -8.687606889946553e-01, 4.952321326989312e-01, + -8.686657134521757e-01, 4.953987063695490e-01, + -8.685707059713409e-01, 4.955652618257725e-01, + -8.684756665556441e-01, 4.957317990614780e-01, + -8.683805952085798e-01, 4.958983180705422e-01, + -8.682854919336433e-01, 4.960648188468429e-01, + -8.681903567343313e-01, 4.962313013842582e-01, + -8.680951896141417e-01, 4.963977656766672e-01, + -8.679999905765735e-01, 4.965642117179493e-01, + -8.679047596251269e-01, 4.967306395019848e-01, + -8.678094967633033e-01, 4.968970490226545e-01, + -8.677142019946051e-01, 4.970634402738403e-01, + -8.676188753225362e-01, 4.972298132494242e-01, + -8.675235167506015e-01, 4.973961679432893e-01, + -8.674281262823069e-01, 4.975625043493191e-01, + -8.673327039211598e-01, 4.977288224613979e-01, + -8.672372496706684e-01, 4.978951222734109e-01, + -8.671417635343425e-01, 4.980614037792434e-01, + -8.670462455156926e-01, 4.982276669727819e-01, + -8.669506956182309e-01, 4.983939118479132e-01, + -8.668551138454704e-01, 4.985601383985251e-01, + -8.667595002009254e-01, 4.987263466185059e-01, + -8.666638546881111e-01, 4.988925365017446e-01, + -8.665681773105445e-01, 4.990587080421309e-01, + -8.664724680717430e-01, 4.992248612335551e-01, + -8.663767269752258e-01, 4.993909960699082e-01, + -8.662809540245130e-01, 4.995571125450818e-01, + -8.661851492231258e-01, 4.997232106529685e-01, + -8.660893125745868e-01, 4.998892903874613e-01, + -8.659934440824195e-01, 5.000553517424539e-01, + -8.658975437501488e-01, 5.002213947118407e-01, + -8.658016115813008e-01, 5.003874192895166e-01, + -8.657056475794024e-01, 5.005534254693774e-01, + -8.656096517479820e-01, 5.007194132453199e-01, + -8.655136240905691e-01, 5.008853826112407e-01, + -8.654175646106944e-01, 5.010513335610380e-01, + -8.653214733118898e-01, 5.012172660886100e-01, + -8.652253501976882e-01, 5.013831801878558e-01, + -8.651291952716238e-01, 5.015490758526754e-01, + -8.650330085372319e-01, 5.017149530769691e-01, + -8.649367899980490e-01, 5.018808118546383e-01, + -8.648405396576129e-01, 5.020466521795847e-01, + -8.647442575194624e-01, 5.022124740457108e-01, + -8.646479435871375e-01, 5.023782774469198e-01, + -8.645515978641793e-01, 5.025440623771157e-01, + -8.644552203541304e-01, 5.027098288302030e-01, + -8.643588110605340e-01, 5.028755768000870e-01, + -8.642623699869350e-01, 5.030413062806735e-01, + -8.641658971368793e-01, 5.032070172658689e-01, + -8.640693925139138e-01, 5.033727097495810e-01, + -8.639728561215868e-01, 5.035383837257176e-01, + -8.638762879634475e-01, 5.037040391881871e-01, + -8.637796880430467e-01, 5.038696761308990e-01, + -8.636830563639358e-01, 5.040352945477632e-01, + -8.635863929296681e-01, 5.042008944326903e-01, + -8.634896977437971e-01, 5.043664757795920e-01, + -8.633929708098784e-01, 5.045320385823803e-01, + -8.632962121314682e-01, 5.046975828349676e-01, + -8.631994217121242e-01, 5.048631085312676e-01, + -8.631025995554049e-01, 5.050286156651941e-01, + -8.630057456648703e-01, 5.051941042306622e-01, + -8.629088600440814e-01, 5.053595742215873e-01, + -8.628119426966003e-01, 5.055250256318854e-01, + -8.627149936259907e-01, 5.056904584554734e-01, + -8.626180128358167e-01, 5.058558726862689e-01, + -8.625210003296445e-01, 5.060212683181897e-01, + -8.624239561110406e-01, 5.061866453451552e-01, + -8.623268801835731e-01, 5.063520037610848e-01, + -8.622297725508112e-01, 5.065173435598985e-01, + -8.621326332163254e-01, 5.066826647355176e-01, + -8.620354621836872e-01, 5.068479672818632e-01, + -8.619382594564693e-01, 5.070132511928582e-01, + -8.618410250382453e-01, 5.071785164624252e-01, + -8.617437589325907e-01, 5.073437630844879e-01, + -8.616464611430813e-01, 5.075089910529709e-01, + -8.615491316732947e-01, 5.076742003617989e-01, + -8.614517705268093e-01, 5.078393910048977e-01, + -8.613543777072049e-01, 5.080045629761940e-01, + -8.612569532180622e-01, 5.081697162696146e-01, + -8.611594970629634e-01, 5.083348508790874e-01, + -8.610620092454915e-01, 5.084999667985409e-01, + -8.609644897692310e-01, 5.086650640219040e-01, + -8.608669386377673e-01, 5.088301425431070e-01, + -8.607693558546872e-01, 5.089952023560801e-01, + -8.606717414235784e-01, 5.091602434547546e-01, + -8.605740953480300e-01, 5.093252658330625e-01, + -8.604764176316321e-01, 5.094902694849364e-01, + -8.603787082779761e-01, 5.096552544043093e-01, + -8.602809672906545e-01, 5.098202205851154e-01, + -8.601831946732610e-01, 5.099851680212895e-01, + -8.600853904293901e-01, 5.101500967067668e-01, + -8.599875545626382e-01, 5.103150066354832e-01, + -8.598896870766023e-01, 5.104798978013757e-01, + -8.597917879748807e-01, 5.106447701983816e-01, + -8.596938572610726e-01, 5.108096238204390e-01, + -8.595958949387791e-01, 5.109744586614868e-01, + -8.594979010116017e-01, 5.111392747154644e-01, + -8.593998754831434e-01, 5.113040719763120e-01, + -8.593018183570085e-01, 5.114688504379703e-01, + -8.592037296368019e-01, 5.116336100943812e-01, + -8.591056093261304e-01, 5.117983509394869e-01, + -8.590074574286015e-01, 5.119630729672302e-01, + -8.589092739478239e-01, 5.121277761715547e-01, + -8.588110588874076e-01, 5.122924605464049e-01, + -8.587128122509635e-01, 5.124571260857257e-01, + -8.586145340421042e-01, 5.126217727834630e-01, + -8.585162242644427e-01, 5.127864006335630e-01, + -8.584178829215939e-01, 5.129510096299730e-01, + -8.583195100171734e-01, 5.131155997666406e-01, + -8.582211055547982e-01, 5.132801710375142e-01, + -8.581226695380861e-01, 5.134447234365435e-01, + -8.580242019706565e-01, 5.136092569576778e-01, + -8.579257028561298e-01, 5.137737715948680e-01, + -8.578271721981274e-01, 5.139382673420654e-01, + -8.577286100002721e-01, 5.141027441932217e-01, + -8.576300162661876e-01, 5.142672021422897e-01, + -8.575313909994992e-01, 5.144316411832228e-01, + -8.574327342038327e-01, 5.145960613099750e-01, + -8.573340458828156e-01, 5.147604625165012e-01, + -8.572353260400765e-01, 5.149248447967565e-01, + -8.571365746792450e-01, 5.150892081446972e-01, + -8.570377918039517e-01, 5.152535525542802e-01, + -8.569389774178288e-01, 5.154178780194629e-01, + -8.568401315245092e-01, 5.155821845342038e-01, + -8.567412541276275e-01, 5.157464720924614e-01, + -8.566423452308188e-01, 5.159107406881956e-01, + -8.565434048377200e-01, 5.160749903153666e-01, + -8.564444329519686e-01, 5.162392209679355e-01, + -8.563454295772036e-01, 5.164034326398640e-01, + -8.562463947170652e-01, 5.165676253251144e-01, + -8.561473283751945e-01, 5.167317990176499e-01, + -8.560482305552339e-01, 5.168959537114342e-01, + -8.559491012608269e-01, 5.170600894004319e-01, + -8.558499404956182e-01, 5.172242060786083e-01, + -8.557507482632539e-01, 5.173883037399291e-01, + -8.556515245673807e-01, 5.175523823783609e-01, + -8.555522694116469e-01, 5.177164419878711e-01, + -8.554529827997018e-01, 5.178804825624277e-01, + -8.553536647351960e-01, 5.180445040959993e-01, + -8.552543152217810e-01, 5.182085065825555e-01, + -8.551549342631096e-01, 5.183724900160661e-01, + -8.550555218628360e-01, 5.185364543905022e-01, + -8.549560780246149e-01, 5.187003996998350e-01, + -8.548566027521028e-01, 5.188643259380369e-01, + -8.547570960489572e-01, 5.190282330990809e-01, + -8.546575579188365e-01, 5.191921211769402e-01, + -8.545579883654005e-01, 5.193559901655896e-01, + -8.544583873923102e-01, 5.195198400590038e-01, + -8.543587550032274e-01, 5.196836708511584e-01, + -8.542590912018155e-01, 5.198474825360302e-01, + -8.541593959917388e-01, 5.200112751075960e-01, + -8.540596693766628e-01, 5.201750485598338e-01, + -8.539599113602542e-01, 5.203388028867220e-01, + -8.538601219461808e-01, 5.205025380822397e-01, + -8.537603011381114e-01, 5.206662541403672e-01, + -8.536604489397164e-01, 5.208299510550847e-01, + -8.535605653546668e-01, 5.209936288203739e-01, + -8.534606503866353e-01, 5.211572874302166e-01, + -8.533607040392954e-01, 5.213209268785957e-01, + -8.532607263163219e-01, 5.214845471594943e-01, + -8.531607172213904e-01, 5.216481482668971e-01, + -8.530606767581783e-01, 5.218117301947885e-01, + -8.529606049303636e-01, 5.219752929371544e-01, + -8.528605017416258e-01, 5.221388364879808e-01, + -8.527603671956453e-01, 5.223023608412546e-01, + -8.526602012961038e-01, 5.224658659909638e-01, + -8.525600040466841e-01, 5.226293519310966e-01, + -8.524597754510701e-01, 5.227928186556421e-01, + -8.523595155129471e-01, 5.229562661585901e-01, + -8.522592242360011e-01, 5.231196944339312e-01, + -8.521589016239198e-01, 5.232831034756564e-01, + -8.520585476803917e-01, 5.234464932777578e-01, + -8.519581624091064e-01, 5.236098638342279e-01, + -8.518577458137548e-01, 5.237732151390602e-01, + -8.517572978980291e-01, 5.239365471862486e-01, + -8.516568186656224e-01, 5.240998599697877e-01, + -8.515563081202290e-01, 5.242631534836734e-01, + -8.514557662655443e-01, 5.244264277219014e-01, + -8.513551931052652e-01, 5.245896826784690e-01, + -8.512545886430891e-01, 5.247529183473734e-01, + -8.511539528827153e-01, 5.249161347226130e-01, + -8.510532858278438e-01, 5.250793317981868e-01, + -8.509525874821757e-01, 5.252425095680947e-01, + -8.508518578494135e-01, 5.254056680263369e-01, + -8.507510969332608e-01, 5.255688071669147e-01, + -8.506503047374221e-01, 5.257319269838298e-01, + -8.505494812656035e-01, 5.258950274710846e-01, + -8.504486265215118e-01, 5.260581086226828e-01, + -8.503477405088550e-01, 5.262211704326281e-01, + -8.502468232313427e-01, 5.263842128949251e-01, + -8.501458746926852e-01, 5.265472360035794e-01, + -8.500448948965942e-01, 5.267102397525970e-01, + -8.499438838467822e-01, 5.268732241359846e-01, + -8.498428415469633e-01, 5.270361891477501e-01, + -8.497417680008525e-01, 5.271991347819013e-01, + -8.496406632121659e-01, 5.273620610324475e-01, + -8.495395271846209e-01, 5.275249678933982e-01, + -8.494383599219361e-01, 5.276878553587637e-01, + -8.493371614278308e-01, 5.278507234225552e-01, + -8.492359317060260e-01, 5.280135720787846e-01, + -8.491346707602436e-01, 5.281764013214644e-01, + -8.490333785942068e-01, 5.283392111446077e-01, + -8.489320552116396e-01, 5.285020015422285e-01, + -8.488307006162675e-01, 5.286647725083413e-01, + -8.487293148118171e-01, 5.288275240369619e-01, + -8.486278978020159e-01, 5.289902561221060e-01, + -8.485264495905926e-01, 5.291529687577906e-01, + -8.484249701812776e-01, 5.293156619380333e-01, + -8.483234595778016e-01, 5.294783356568520e-01, + -8.482219177838970e-01, 5.296409899082659e-01, + -8.481203448032972e-01, 5.298036246862946e-01, + -8.480187406397368e-01, 5.299662399849586e-01, + -8.479171052969514e-01, 5.301288357982790e-01, + -8.478154387786779e-01, 5.302914121202773e-01, + -8.477137410886544e-01, 5.304539689449763e-01, + -8.476120122306197e-01, 5.306165062663993e-01, + -8.475102522083143e-01, 5.307790240785701e-01, + -8.474084610254797e-01, 5.309415223755136e-01, + -8.473066386858583e-01, 5.311040011512550e-01, + -8.472047851931941e-01, 5.312664603998204e-01, + -8.471029005512315e-01, 5.314289001152368e-01, + -8.470009847637169e-01, 5.315913202915317e-01, + -8.468990378343972e-01, 5.317537209227333e-01, + -8.467970597670209e-01, 5.319161020028706e-01, + -8.466950505653374e-01, 5.320784635259735e-01, + -8.465930102330972e-01, 5.322408054860722e-01, + -8.464909387740521e-01, 5.324031278771979e-01, + -8.463888361919549e-01, 5.325654306933826e-01, + -8.462867024905597e-01, 5.327277139286588e-01, + -8.461845376736216e-01, 5.328899775770598e-01, + -8.460823417448970e-01, 5.330522216326194e-01, + -8.459801147081433e-01, 5.332144460893730e-01, + -8.458778565671190e-01, 5.333766509413553e-01, + -8.457755673255840e-01, 5.335388361826031e-01, + -8.456732469872991e-01, 5.337010018071530e-01, + -8.455708955560263e-01, 5.338631478090426e-01, + -8.454685130355288e-01, 5.340252741823104e-01, + -8.453660994295710e-01, 5.341873809209954e-01, + -8.452636547419182e-01, 5.343494680191375e-01, + -8.451611789763371e-01, 5.345115354707771e-01, + -8.450586721365955e-01, 5.346735832699555e-01, + -8.449561342264622e-01, 5.348356114107146e-01, + -8.448535652497071e-01, 5.349976198870972e-01, + -8.447509652101015e-01, 5.351596086931466e-01, + -8.446483341114178e-01, 5.353215778229071e-01, + -8.445456719574292e-01, 5.354835272704234e-01, + -8.444429787519107e-01, 5.356454570297411e-01, + -8.443402544986376e-01, 5.358073670949064e-01, + -8.442374992013870e-01, 5.359692574599667e-01, + -8.441347128639369e-01, 5.361311281189695e-01, + -8.440318954900664e-01, 5.362929790659632e-01, + -8.439290470835559e-01, 5.364548102949971e-01, + -8.438261676481867e-01, 5.366166218001210e-01, + -8.437232571877417e-01, 5.367784135753859e-01, + -8.436203157060042e-01, 5.369401856148429e-01, + -8.435173432067592e-01, 5.371019379125441e-01, + -8.434143396937928e-01, 5.372636704625425e-01, + -8.433113051708921e-01, 5.374253832588916e-01, + -8.432082396418454e-01, 5.375870762956454e-01, + -8.431051431104422e-01, 5.377487495668594e-01, + -8.430020155804729e-01, 5.379104030665889e-01, + -8.428988570557293e-01, 5.380720367888906e-01, + -8.427956675400041e-01, 5.382336507278217e-01, + -8.426924470370917e-01, 5.383952448774400e-01, + -8.425891955507867e-01, 5.385568192318041e-01, + -8.424859130848856e-01, 5.387183737849736e-01, + -8.423825996431858e-01, 5.388799085310084e-01, + -8.422792552294860e-01, 5.390414234639694e-01, + -8.421758798475856e-01, 5.392029185779182e-01, + -8.420724735012856e-01, 5.393643938669170e-01, + -8.419690361943877e-01, 5.395258493250289e-01, + -8.418655679306953e-01, 5.396872849463176e-01, + -8.417620687140125e-01, 5.398487007248476e-01, + -8.416585385481448e-01, 5.400100966546840e-01, + -8.415549774368984e-01, 5.401714727298929e-01, + -8.414513853840813e-01, 5.403328289445407e-01, + -8.413477623935020e-01, 5.404941652926952e-01, + -8.412441084689706e-01, 5.406554817684242e-01, + -8.411404236142981e-01, 5.408167783657967e-01, + -8.410367078332966e-01, 5.409780550788821e-01, + -8.409329611297798e-01, 5.411393119017508e-01, + -8.408291835075616e-01, 5.413005488284741e-01, + -8.407253749704581e-01, 5.414617658531234e-01, + -8.406215355222857e-01, 5.416229629697715e-01, + -8.405176651668625e-01, 5.417841401724915e-01, + -8.404137639080075e-01, 5.419452974553574e-01, + -8.403098317495408e-01, 5.421064348124439e-01, + -8.402058686952836e-01, 5.422675522378265e-01, + -8.401018747490584e-01, 5.424286497255812e-01, + -8.399978499146888e-01, 5.425897272697853e-01, + -8.398937941959995e-01, 5.427507848645159e-01, + -8.397897075968164e-01, 5.429118225038517e-01, + -8.396855901209661e-01, 5.430728401818717e-01, + -8.395814417722771e-01, 5.432338378926559e-01, + -8.394772625545786e-01, 5.433948156302848e-01, + -8.393730524717007e-01, 5.435557733888395e-01, + -8.392688115274752e-01, 5.437167111624023e-01, + -8.391645397257347e-01, 5.438776289450560e-01, + -8.390602370703127e-01, 5.440385267308838e-01, + -8.389559035650445e-01, 5.441994045139703e-01, + -8.388515392137658e-01, 5.443602622884004e-01, + -8.387471440203139e-01, 5.445211000482596e-01, + -8.386427179885273e-01, 5.446819177876345e-01, + -8.385382611222453e-01, 5.448427155006124e-01, + -8.384337734253083e-01, 5.450034931812812e-01, + -8.383292549015583e-01, 5.451642508237293e-01, + -8.382247055548381e-01, 5.453249884220465e-01, + -8.381201253889915e-01, 5.454857059703225e-01, + -8.380155144078638e-01, 5.456464034626486e-01, + -8.379108726153012e-01, 5.458070808931161e-01, + -8.378062000151509e-01, 5.459677382558176e-01, + -8.377014966112617e-01, 5.461283755448460e-01, + -8.375967624074830e-01, 5.462889927542952e-01, + -8.374919974076659e-01, 5.464495898782596e-01, + -8.373872016156619e-01, 5.466101669108349e-01, + -8.372823750353243e-01, 5.467707238461168e-01, + -8.371775176705073e-01, 5.469312606782022e-01, + -8.370726295250660e-01, 5.470917774011885e-01, + -8.369677106028570e-01, 5.472522740091741e-01, + -8.368627609077379e-01, 5.474127504962579e-01, + -8.367577804435672e-01, 5.475732068565398e-01, + -8.366527692142050e-01, 5.477336430841201e-01, + -8.365477272235120e-01, 5.478940591731002e-01, + -8.364426544753504e-01, 5.480544551175819e-01, + -8.363375509735835e-01, 5.482148309116678e-01, + -8.362324167220756e-01, 5.483751865494616e-01, + -8.361272517246923e-01, 5.485355220250674e-01, + -8.360220559852999e-01, 5.486958373325901e-01, + -8.359168295077664e-01, 5.488561324661353e-01, + -8.358115722959607e-01, 5.490164074198094e-01, + -8.357062843537526e-01, 5.491766621877197e-01, + -8.356009656850134e-01, 5.493368967639740e-01, + -8.354956162936154e-01, 5.494971111426810e-01, + -8.353902361834319e-01, 5.496573053179499e-01, + -8.352848253583374e-01, 5.498174792838909e-01, + -8.351793838222077e-01, 5.499776330346149e-01, + -8.350739115789194e-01, 5.501377665642336e-01, + -8.349684086323504e-01, 5.502978798668592e-01, + -8.348628749863800e-01, 5.504579729366048e-01, + -8.347573106448882e-01, 5.506180457675843e-01, + -8.346517156117564e-01, 5.507780983539121e-01, + -8.345460898908669e-01, 5.509381306897039e-01, + -8.344404334861032e-01, 5.510981427690754e-01, + -8.343347464013501e-01, 5.512581345861436e-01, + -8.342290286404934e-01, 5.514181061350261e-01, + -8.341232802074201e-01, 5.515780574098410e-01, + -8.340175011060181e-01, 5.517379884047073e-01, + -8.339116913401768e-01, 5.518978991137452e-01, + -8.338058509137863e-01, 5.520577895310750e-01, + -8.336999798307383e-01, 5.522176596508179e-01, + -8.335940780949251e-01, 5.523775094670961e-01, + -8.334881457102408e-01, 5.525373389740321e-01, + -8.333821826805797e-01, 5.526971481657498e-01, + -8.332761890098382e-01, 5.528569370363733e-01, + -8.331701647019132e-01, 5.530167055800275e-01, + -8.330641097607029e-01, 5.531764537908384e-01, + -8.329580241901067e-01, 5.533361816629323e-01, + -8.328519079940251e-01, 5.534958891904366e-01, + -8.327457611763595e-01, 5.536555763674793e-01, + -8.326395837410128e-01, 5.538152431881891e-01, + -8.325333756918887e-01, 5.539748896466955e-01, + -8.324271370328923e-01, 5.541345157371289e-01, + -8.323208677679297e-01, 5.542941214536200e-01, + -8.322145679009080e-01, 5.544537067903009e-01, + -8.321082374357356e-01, 5.546132717413040e-01, + -8.320018763763220e-01, 5.547728163007625e-01, + -8.318954847265776e-01, 5.549323404628104e-01, + -8.317890624904144e-01, 5.550918442215824e-01, + -8.316826096717451e-01, 5.552513275712140e-01, + -8.315761262744837e-01, 5.554107905058416e-01, + -8.314696123025452e-01, 5.555702330196022e-01, + -8.313630677598459e-01, 5.557296551066334e-01, + -8.312564926503032e-01, 5.558890567610738e-01, + -8.311498869778355e-01, 5.560484379770626e-01, + -8.310432507463623e-01, 5.562077987487399e-01, + -8.309365839598044e-01, 5.563671390702464e-01, + -8.308298866220836e-01, 5.565264589357236e-01, + -8.307231587371229e-01, 5.566857583393139e-01, + -8.306164003088463e-01, 5.568450372751601e-01, + -8.305096113411791e-01, 5.570042957374060e-01, + -8.304027918380475e-01, 5.571635337201962e-01, + -8.302959418033791e-01, 5.573227512176762e-01, + -8.301890612411024e-01, 5.574819482239916e-01, + -8.300821501551470e-01, 5.576411247332894e-01, + -8.299752085494440e-01, 5.578002807397170e-01, + -8.298682364279248e-01, 5.579594162374230e-01, + -8.297612337945230e-01, 5.581185312205561e-01, + -8.296542006531726e-01, 5.582776256832663e-01, + -8.295471370078089e-01, 5.584366996197041e-01, + -8.294400428623682e-01, 5.585957530240208e-01, + -8.293329182207883e-01, 5.587547858903683e-01, + -8.292257630870076e-01, 5.589137982128998e-01, + -8.291185774649660e-01, 5.590727899857685e-01, + -8.290113613586044e-01, 5.592317612031289e-01, + -8.289041147718649e-01, 5.593907118591361e-01, + -8.287968377086906e-01, 5.595496419479458e-01, + -8.286895301730258e-01, 5.597085514637147e-01, + -8.285821921688158e-01, 5.598674404006002e-01, + -8.284748237000071e-01, 5.600263087527604e-01, + -8.283674247705475e-01, 5.601851565143541e-01, + -8.282599953843857e-01, 5.603439836795409e-01, + -8.281525355454714e-01, 5.605027902424811e-01, + -8.280450452577558e-01, 5.606615761973360e-01, + -8.279375245251909e-01, 5.608203415382674e-01, + -8.278299733517299e-01, 5.609790862594382e-01, + -8.277223917413272e-01, 5.611378103550114e-01, + -8.276147796979384e-01, 5.612965138191515e-01, + -8.275071372255198e-01, 5.614551966460233e-01, + -8.273994643280295e-01, 5.616138588297924e-01, + -8.272917610094258e-01, 5.617725003646253e-01, + -8.271840272736691e-01, 5.619311212446895e-01, + -8.270762631247203e-01, 5.620897214641525e-01, + -8.269684685665416e-01, 5.622483010171831e-01, + -8.268606436030962e-01, 5.624068598979511e-01, + -8.267527882383485e-01, 5.625653981006266e-01, + -8.266449024762643e-01, 5.627239156193804e-01, + -8.265369863208100e-01, 5.628824124483844e-01, + -8.264290397759535e-01, 5.630408885818112e-01, + -8.263210628456635e-01, 5.631993440138341e-01, + -8.262130555339102e-01, 5.633577787386270e-01, + -8.261050178446646e-01, 5.635161927503648e-01, + -8.259969497818991e-01, 5.636745860432231e-01, + -8.258888513495868e-01, 5.638329586113782e-01, + -8.257807225517024e-01, 5.639913104490070e-01, + -8.256725633922214e-01, 5.641496415502877e-01, + -8.255643738751205e-01, 5.643079519093986e-01, + -8.254561540043776e-01, 5.644662415205195e-01, + -8.253479037839714e-01, 5.646245103778301e-01, + -8.252396232178822e-01, 5.647827584755114e-01, + -8.251313123100911e-01, 5.649409858077452e-01, + -8.250229710645802e-01, 5.650991923687140e-01, + -8.249145994853332e-01, 5.652573781526008e-01, + -8.248061975763343e-01, 5.654155431535897e-01, + -8.246977653415695e-01, 5.655736873658653e-01, + -8.245893027850253e-01, 5.657318107836131e-01, + -8.244808099106895e-01, 5.658899134010196e-01, + -8.243722867225513e-01, 5.660479952122714e-01, + -8.242637332246006e-01, 5.662060562115567e-01, + -8.241551494208286e-01, 5.663640963930638e-01, + -8.240465353152278e-01, 5.665221157509821e-01, + -8.239378909117914e-01, 5.666801142795016e-01, + -8.238292162145140e-01, 5.668380919728133e-01, + -8.237205112273914e-01, 5.669960488251087e-01, + -8.236117759544203e-01, 5.671539848305801e-01, + -8.235030103995985e-01, 5.673118999834208e-01, + -8.233942145669251e-01, 5.674697942778245e-01, + -8.232853884604001e-01, 5.676276677079862e-01, + -8.231765320840249e-01, 5.677855202681011e-01, + -8.230676454418017e-01, 5.679433519523656e-01, + -8.229587285377340e-01, 5.681011627549765e-01, + -8.228497813758264e-01, 5.682589526701315e-01, + -8.227408039600844e-01, 5.684167216920293e-01, + -8.226317962945150e-01, 5.685744698148691e-01, + -8.225227583831259e-01, 5.687321970328510e-01, + -8.224136902299264e-01, 5.688899033401759e-01, + -8.223045918389263e-01, 5.690475887310451e-01, + -8.221954632141372e-01, 5.692052531996612e-01, + -8.220863043595711e-01, 5.693628967402272e-01, + -8.219771152792416e-01, 5.695205193469471e-01, + -8.218678959771633e-01, 5.696781210140256e-01, + -8.217586464573517e-01, 5.698357017356680e-01, + -8.216493667238239e-01, 5.699932615060805e-01, + -8.215400567805976e-01, 5.701508003194703e-01, + -8.214307166316919e-01, 5.703083181700449e-01, + -8.213213462811267e-01, 5.704658150520130e-01, + -8.212119457329236e-01, 5.706232909595838e-01, + -8.211025149911046e-01, 5.707807458869673e-01, + -8.209930540596936e-01, 5.709381798283744e-01, + -8.208835629427146e-01, 5.710955927780167e-01, + -8.207740416441937e-01, 5.712529847301067e-01, + -8.206644901681575e-01, 5.714103556788572e-01, + -8.205549085186339e-01, 5.715677056184826e-01, + -8.204452966996520e-01, 5.717250345431971e-01, + -8.203356547152418e-01, 5.718823424472166e-01, + -8.202259825694347e-01, 5.720396293247570e-01, + -8.201162802662628e-01, 5.721968951700356e-01, + -8.200065478097597e-01, 5.723541399772699e-01, + -8.198967852039598e-01, 5.725113637406788e-01, + -8.197869924528990e-01, 5.726685664544812e-01, + -8.196771695606139e-01, 5.728257481128975e-01, + -8.195673165311422e-01, 5.729829087101486e-01, + -8.194574333685233e-01, 5.731400482404560e-01, + -8.193475200767969e-01, 5.732971666980422e-01, + -8.192375766600045e-01, 5.734542640771304e-01, + -8.191276031221882e-01, 5.736113403719446e-01, + -8.190175994673915e-01, 5.737683955767096e-01, + -8.189075656996590e-01, 5.739254296856507e-01, + -8.187975018230360e-01, 5.740824426929945e-01, + -8.186874078415697e-01, 5.742394345929679e-01, + -8.185772837593076e-01, 5.743964053797987e-01, + -8.184671295802987e-01, 5.745533550477158e-01, + -8.183569453085932e-01, 5.747102835909483e-01, + -8.182467309482421e-01, 5.748671910037267e-01, + -8.181364865032977e-01, 5.750240772802817e-01, + -8.180262119778134e-01, 5.751809424148451e-01, + -8.179159073758439e-01, 5.753377864016495e-01, + -8.178055727014443e-01, 5.754946092349281e-01, + -8.176952079586717e-01, 5.756514109089151e-01, + -8.175848131515837e-01, 5.758081914178453e-01, + -8.174743882842392e-01, 5.759649507559542e-01, + -8.173639333606985e-01, 5.761216889174783e-01, + -8.172534483850223e-01, 5.762784058966549e-01, + -8.171429333612730e-01, 5.764351016877218e-01, + -8.170323882935139e-01, 5.765917762849178e-01, + -8.169218131858095e-01, 5.767484296824824e-01, + -8.168112080422253e-01, 5.769050618746560e-01, + -8.167005728668278e-01, 5.770616728556794e-01, + -8.165899076636849e-01, 5.772182626197949e-01, + -8.164792124368654e-01, 5.773748311612449e-01, + -8.163684871904392e-01, 5.775313784742727e-01, + -8.162577319284774e-01, 5.776879045531228e-01, + -8.161469466550523e-01, 5.778444093920398e-01, + -8.160361313742368e-01, 5.780008929852699e-01, + -8.159252860901055e-01, 5.781573553270594e-01, + -8.158144108067338e-01, 5.783137964116556e-01, + -8.157035055281983e-01, 5.784702162333066e-01, + -8.155925702585768e-01, 5.786266147862614e-01, + -8.154816050019478e-01, 5.787829920647697e-01, + -8.153706097623913e-01, 5.789393480630818e-01, + -8.152595845439883e-01, 5.790956827754491e-01, + -8.151485293508208e-01, 5.792519961961236e-01, + -8.150374441869722e-01, 5.794082883193579e-01, + -8.149263290565266e-01, 5.795645591394056e-01, + -8.148151839635694e-01, 5.797208086505214e-01, + -8.147040089121871e-01, 5.798770368469603e-01, + -8.145928039064673e-01, 5.800332437229782e-01, + -8.144815689504986e-01, 5.801894292728317e-01, + -8.143703040483711e-01, 5.803455934907783e-01, + -8.142590092041753e-01, 5.805017363710765e-01, + -8.141476844220034e-01, 5.806578579079853e-01, + -8.140363297059484e-01, 5.808139580957645e-01, + -8.139249450601046e-01, 5.809700369286748e-01, + -8.138135304885672e-01, 5.811260944009776e-01, + -8.137020859954327e-01, 5.812821305069350e-01, + -8.135906115847985e-01, 5.814381452408102e-01, + -8.134791072607632e-01, 5.815941385968669e-01, + -8.133675730274266e-01, 5.817501105693696e-01, + -8.132560088888894e-01, 5.819060611525838e-01, + -8.131444148492536e-01, 5.820619903407754e-01, + -8.130327909126220e-01, 5.822178981282117e-01, + -8.129211370830988e-01, 5.823737845091601e-01, + -8.128094533647893e-01, 5.825296494778893e-01, + -8.126977397617995e-01, 5.826854930286685e-01, + -8.125859962782371e-01, 5.828413151557676e-01, + -8.124742229182105e-01, 5.829971158534577e-01, + -8.123624196858292e-01, 5.831528951160104e-01, + -8.122505865852039e-01, 5.833086529376983e-01, + -8.121387236204465e-01, 5.834643893127943e-01, + -8.120268307956697e-01, 5.836201042355728e-01, + -8.119149081149878e-01, 5.837757977003081e-01, + -8.118029555825155e-01, 5.839314697012762e-01, + -8.116909732023690e-01, 5.840871202327534e-01, + -8.115789609786659e-01, 5.842427492890170e-01, + -8.114669189155242e-01, 5.843983568643446e-01, + -8.113548470170637e-01, 5.845539429530153e-01, + -8.112427452874048e-01, 5.847095075493084e-01, + -8.111306137306692e-01, 5.848650506475045e-01, + -8.110184523509795e-01, 5.850205722418845e-01, + -8.109062611524597e-01, 5.851760723267304e-01, + -8.107940401392347e-01, 5.853315508963249e-01, + -8.106817893154308e-01, 5.854870079449513e-01, + -8.105695086851746e-01, 5.856424434668944e-01, + -8.104571982525948e-01, 5.857978574564389e-01, + -8.103448580218205e-01, 5.859532499078706e-01, + -8.102324879969823e-01, 5.861086208154764e-01, + -8.101200881822116e-01, 5.862639701735436e-01, + -8.100076585816411e-01, 5.864192979763605e-01, + -8.098951991994044e-01, 5.865746042182162e-01, + -8.097827100396365e-01, 5.867298888934004e-01, + -8.096701911064731e-01, 5.868851519962040e-01, + -8.095576424040513e-01, 5.870403935209180e-01, + -8.094450639365092e-01, 5.871956134618348e-01, + -8.093324557079860e-01, 5.873508118132477e-01, + -8.092198177226217e-01, 5.875059885694500e-01, + -8.091071499845582e-01, 5.876611437247367e-01, + -8.089944524979377e-01, 5.878162772734029e-01, + -8.088817252669036e-01, 5.879713892097450e-01, + -8.087689682956009e-01, 5.881264795280599e-01, + -8.086561815881750e-01, 5.882815482226452e-01, + -8.085433651487730e-01, 5.884365952877998e-01, + -8.084305189815427e-01, 5.885916207178229e-01, + -8.083176430906333e-01, 5.887466245070145e-01, + -8.082047374801947e-01, 5.889016066496757e-01, + -8.080918021543784e-01, 5.890565671401085e-01, + -8.079788371173363e-01, 5.892115059726150e-01, + -8.078658423732221e-01, 5.893664231414988e-01, + -8.077528179261904e-01, 5.895213186410639e-01, + -8.076397637803965e-01, 5.896761924656154e-01, + -8.075266799399972e-01, 5.898310446094588e-01, + -8.074135664091502e-01, 5.899858750669009e-01, + -8.073004231920144e-01, 5.901406838322488e-01, + -8.071872502927500e-01, 5.902954708998108e-01, + -8.070740477155176e-01, 5.904502362638958e-01, + -8.069608154644797e-01, 5.906049799188133e-01, + -8.068475535437993e-01, 5.907597018588742e-01, + -8.067342619576409e-01, 5.909144020783895e-01, + -8.066209407101697e-01, 5.910690805716714e-01, + -8.065075898055523e-01, 5.912237373330329e-01, + -8.063942092479562e-01, 5.913783723567876e-01, + -8.062807990415505e-01, 5.915329856372500e-01, + -8.061673591905044e-01, 5.916875771687354e-01, + -8.060538896989891e-01, 5.918421469455601e-01, + -8.059403905711763e-01, 5.919966949620410e-01, + -8.058268618112393e-01, 5.921512212124955e-01, + -8.057133034233522e-01, 5.923057256912423e-01, + -8.055997154116901e-01, 5.924602083926008e-01, + -8.054860977804292e-01, 5.926146693108911e-01, + -8.053724505337471e-01, 5.927691084404341e-01, + -8.052587736758222e-01, 5.929235257755513e-01, + -8.051450672108342e-01, 5.930779213105655e-01, + -8.050313311429637e-01, 5.932322950397998e-01, + -8.049175654763923e-01, 5.933866469575785e-01, + -8.048037702153029e-01, 5.935409770582264e-01, + -8.046899453638795e-01, 5.936952853360692e-01, + -8.045760909263071e-01, 5.938495717854336e-01, + -8.044622069067718e-01, 5.940038364006467e-01, + -8.043482933094608e-01, 5.941580791760368e-01, + -8.042343501385624e-01, 5.943123001059328e-01, + -8.041203773982658e-01, 5.944664991846644e-01, + -8.040063750927615e-01, 5.946206764065622e-01, + -8.038923432262413e-01, 5.947748317659576e-01, + -8.037782818028976e-01, 5.949289652571824e-01, + -8.036641908269241e-01, 5.950830768745700e-01, + -8.035500703025157e-01, 5.952371666124538e-01, + -8.034359202338681e-01, 5.953912344651687e-01, + -8.033217406251786e-01, 5.955452804270498e-01, + -8.032075314806449e-01, 5.956993044924334e-01, + -8.030932928044664e-01, 5.958533066556563e-01, + -8.029790246008432e-01, 5.960072869110565e-01, + -8.028647268739767e-01, 5.961612452529725e-01, + -8.027503996280692e-01, 5.963151816757437e-01, + -8.026360428673242e-01, 5.964690961737104e-01, + -8.025216565959464e-01, 5.966229887412132e-01, + -8.024072408181413e-01, 5.967768593725944e-01, + -8.022927955381157e-01, 5.969307080621965e-01, + -8.021783207600774e-01, 5.970845348043627e-01, + -8.020638164882354e-01, 5.972383395934374e-01, + -8.019492827267998e-01, 5.973921224237657e-01, + -8.018347194799813e-01, 5.975458832896932e-01, + -8.017201267519923e-01, 5.976996221855668e-01, + -8.016055045470462e-01, 5.978533391057339e-01, + -8.014908528693570e-01, 5.980070340445427e-01, + -8.013761717231402e-01, 5.981607069963423e-01, + -8.012614611126125e-01, 5.983143579554826e-01, + -8.011467210419914e-01, 5.984679869163143e-01, + -8.010319515154953e-01, 5.986215938731889e-01, + -8.009171525373443e-01, 5.987751788204587e-01, + -8.008023241117591e-01, 5.989287417524769e-01, + -8.006874662429616e-01, 5.990822826635973e-01, + -8.005725789351749e-01, 5.992358015481746e-01, + -8.004576621926228e-01, 5.993892984005645e-01, + -8.003427160195307e-01, 5.995427732151234e-01, + -8.002277404201248e-01, 5.996962259862083e-01, + -8.001127353986324e-01, 5.998496567081772e-01, + -7.999977009592819e-01, 6.000030653753889e-01, + -7.998826371063028e-01, 6.001564519822032e-01, + -7.997675438439257e-01, 6.003098165229804e-01, + -7.996524211763822e-01, 6.004631589920816e-01, + -7.995372691079050e-01, 6.006164793838690e-01, + -7.994220876427280e-01, 6.007697776927052e-01, + -7.993068767850862e-01, 6.009230539129541e-01, + -7.991916365392152e-01, 6.010763080389802e-01, + -7.990763669093524e-01, 6.012295400651485e-01, + -7.989610678997358e-01, 6.013827499858254e-01, + -7.988457395146046e-01, 6.015359377953777e-01, + -7.987303817581992e-01, 6.016891034881730e-01, + -7.986149946347608e-01, 6.018422470585800e-01, + -7.984995781485321e-01, 6.019953685009680e-01, + -7.983841323037564e-01, 6.021484678097072e-01, + -7.982686571046784e-01, 6.023015449791685e-01, + -7.981531525555438e-01, 6.024546000037238e-01, + -7.980376186605994e-01, 6.026076328777454e-01, + -7.979220554240930e-01, 6.027606435956072e-01, + -7.978064628502736e-01, 6.029136321516830e-01, + -7.976908409433912e-01, 6.030665985403482e-01, + -7.975751897076967e-01, 6.032195427559784e-01, + -7.974595091474425e-01, 6.033724647929503e-01, + -7.973437992668817e-01, 6.035253646456415e-01, + -7.972280600702688e-01, 6.036782423084304e-01, + -7.971122915618589e-01, 6.038310977756959e-01, + -7.969964937459088e-01, 6.039839310418180e-01, + -7.968806666266758e-01, 6.041367421011775e-01, + -7.967648102084188e-01, 6.042895309481560e-01, + -7.966489244953973e-01, 6.044422975771359e-01, + -7.965330094918720e-01, 6.045950419825004e-01, + -7.964170652021050e-01, 6.047477641586334e-01, + -7.963010916303591e-01, 6.049004640999198e-01, + -7.961850887808984e-01, 6.050531418007453e-01, + -7.960690566579880e-01, 6.052057972554965e-01, + -7.959529952658939e-01, 6.053584304585605e-01, + -7.958369046088836e-01, 6.055110414043255e-01, + -7.957207846912251e-01, 6.056636300871804e-01, + -7.956046355171881e-01, 6.058161965015150e-01, + -7.954884570910430e-01, 6.059687406417197e-01, + -7.953722494170613e-01, 6.061212625021861e-01, + -7.952560124995156e-01, 6.062737620773064e-01, + -7.951397463426796e-01, 6.064262393614736e-01, + -7.950234509508280e-01, 6.065786943490813e-01, + -7.949071263282370e-01, 6.067311270345245e-01, + -7.947907724791832e-01, 6.068835374121985e-01, + -7.946743894079445e-01, 6.070359254764996e-01, + -7.945579771188004e-01, 6.071882912218252e-01, + -7.944415356160306e-01, 6.073406346425729e-01, + -7.943250649039165e-01, 6.074929557331415e-01, + -7.942085649867406e-01, 6.076452544879308e-01, + -7.940920358687860e-01, 6.077975309013411e-01, + -7.939754775543372e-01, 6.079497849677736e-01, + -7.938588900476797e-01, 6.081020166816304e-01, + -7.937422733531002e-01, 6.082542260373145e-01, + -7.936256274748863e-01, 6.084064130292292e-01, + -7.935089524173267e-01, 6.085585776517795e-01, + -7.933922481847111e-01, 6.087107198993703e-01, + -7.932755147813306e-01, 6.088628397664082e-01, + -7.931587522114771e-01, 6.090149372472998e-01, + -7.930419604794436e-01, 6.091670123364532e-01, + -7.929251395895243e-01, 6.093190650282768e-01, + -7.928082895460141e-01, 6.094710953171802e-01, + -7.926914103532094e-01, 6.096231031975737e-01, + -7.925745020154077e-01, 6.097750886638684e-01, + -7.924575645369071e-01, 6.099270517104761e-01, + -7.923405979220072e-01, 6.100789923318096e-01, + -7.922236021750083e-01, 6.102309105222826e-01, + -7.921065773002124e-01, 6.103828062763095e-01, + -7.919895233019218e-01, 6.105346795883053e-01, + -7.918724401844405e-01, 6.106865304526863e-01, + -7.917553279520732e-01, 6.108383588638692e-01, + -7.916381866091259e-01, 6.109901648162717e-01, + -7.915210161599052e-01, 6.111419483043126e-01, + -7.914038166087195e-01, 6.112937093224109e-01, + -7.912865879598778e-01, 6.114454478649870e-01, + -7.911693302176902e-01, 6.115971639264619e-01, + -7.910520433864680e-01, 6.117488575012573e-01, + -7.909347274705233e-01, 6.119005285837961e-01, + -7.908173824741698e-01, 6.120521771685015e-01, + -7.907000084017216e-01, 6.122038032497980e-01, + -7.905826052574945e-01, 6.123554068221106e-01, + -7.904651730458049e-01, 6.125069878798656e-01, + -7.903477117709705e-01, 6.126585464174893e-01, + -7.902302214373100e-01, 6.128100824294097e-01, + -7.901127020491433e-01, 6.129615959100552e-01, + -7.899951536107911e-01, 6.131130868538549e-01, + -7.898775761265753e-01, 6.132645552552390e-01, + -7.897599696008191e-01, 6.134160011086386e-01, + -7.896423340378463e-01, 6.135674244084853e-01, + -7.895246694419822e-01, 6.137188251492117e-01, + -7.894069758175529e-01, 6.138702033252513e-01, + -7.892892531688857e-01, 6.140215589310384e-01, + -7.891715015003089e-01, 6.141728919610080e-01, + -7.890537208161519e-01, 6.143242024095960e-01, + -7.889359111207452e-01, 6.144754902712390e-01, + -7.888180724184203e-01, 6.146267555403750e-01, + -7.887002047135097e-01, 6.147779982114421e-01, + -7.885823080103471e-01, 6.149292182788796e-01, + -7.884643823132675e-01, 6.150804157371275e-01, + -7.883464276266063e-01, 6.152315905806268e-01, + -7.882284439547005e-01, 6.153827428038192e-01, + -7.881104313018881e-01, 6.155338724011473e-01, + -7.879923896725080e-01, 6.156849793670546e-01, + -7.878743190709002e-01, 6.158360636959851e-01, + -7.877562195014061e-01, 6.159871253823838e-01, + -7.876380909683675e-01, 6.161381644206969e-01, + -7.875199334761278e-01, 6.162891808053710e-01, + -7.874017470290314e-01, 6.164401745308536e-01, + -7.872835316314236e-01, 6.165911455915931e-01, + -7.871652872876510e-01, 6.167420939820387e-01, + -7.870470140020608e-01, 6.168930196966407e-01, + -7.869287117790018e-01, 6.170439227298498e-01, + -7.868103806228235e-01, 6.171948030761176e-01, + -7.866920205378768e-01, 6.173456607298968e-01, + -7.865736315285132e-01, 6.174964956856409e-01, + -7.864552135990858e-01, 6.176473079378039e-01, + -7.863367667539483e-01, 6.177980974808410e-01, + -7.862182909974557e-01, 6.179488643092081e-01, + -7.860997863339639e-01, 6.180996084173620e-01, + -7.859812527678302e-01, 6.182503297997602e-01, + -7.858626903034126e-01, 6.184010284508610e-01, + -7.857440989450704e-01, 6.185517043651237e-01, + -7.856254786971637e-01, 6.187023575370085e-01, + -7.855068295640539e-01, 6.188529879609763e-01, + -7.853881515501036e-01, 6.190035956314887e-01, + -7.852694446596759e-01, 6.191541805430084e-01, + -7.851507088971356e-01, 6.193047426899987e-01, + -7.850319442668481e-01, 6.194552820669240e-01, + -7.849131507731800e-01, 6.196057986682493e-01, + -7.847943284204992e-01, 6.197562924884407e-01, + -7.846754772131743e-01, 6.199067635219647e-01, + -7.845565971555752e-01, 6.200572117632891e-01, + -7.844376882520728e-01, 6.202076372068824e-01, + -7.843187505070389e-01, 6.203580398472137e-01, + -7.841997839248466e-01, 6.205084196787534e-01, + -7.840807885098700e-01, 6.206587766959721e-01, + -7.839617642664841e-01, 6.208091108933419e-01, + -7.838427111990652e-01, 6.209594222653352e-01, + -7.837236293119905e-01, 6.211097108064256e-01, + -7.836045186096382e-01, 6.212599765110876e-01, + -7.834853790963878e-01, 6.214102193737961e-01, + -7.833662107766197e-01, 6.215604393890273e-01, + -7.832470136547154e-01, 6.217106365512577e-01, + -7.831277877350573e-01, 6.218608108549654e-01, + -7.830085330220291e-01, 6.220109622946286e-01, + -7.828892495200155e-01, 6.221610908647268e-01, + -7.827699372334020e-01, 6.223111965597403e-01, + -7.826505961665757e-01, 6.224612793741500e-01, + -7.825312263239242e-01, 6.226113393024377e-01, + -7.824118277098365e-01, 6.227613763390863e-01, + -7.822924003287024e-01, 6.229113904785795e-01, + -7.821729441849130e-01, 6.230613817154013e-01, + -7.820534592828603e-01, 6.232113500440373e-01, + -7.819339456269376e-01, 6.233612954589732e-01, + -7.818144032215388e-01, 6.235112179546964e-01, + -7.816948320710594e-01, 6.236611175256945e-01, + -7.815752321798956e-01, 6.238109941664561e-01, + -7.814556035524446e-01, 6.239608478714707e-01, + -7.813359461931049e-01, 6.241106786352285e-01, + -7.812162601062761e-01, 6.242604864522207e-01, + -7.810965452963585e-01, 6.244102713169393e-01, + -7.809768017677537e-01, 6.245600332238772e-01, + -7.808570295248646e-01, 6.247097721675281e-01, + -7.807372285720945e-01, 6.248594881423863e-01, + -7.806173989138484e-01, 6.250091811429475e-01, + -7.804975405545319e-01, 6.251588511637076e-01, + -7.803776534985520e-01, 6.253084981991640e-01, + -7.802577377503166e-01, 6.254581222438144e-01, + -7.801377933142346e-01, 6.256077232921574e-01, + -7.800178201947160e-01, 6.257573013386929e-01, + -7.798978183961720e-01, 6.259068563779211e-01, + -7.797777879230146e-01, 6.260563884043435e-01, + -7.796577287796569e-01, 6.262058974124621e-01, + -7.795376409705133e-01, 6.263553833967800e-01, + -7.794175244999989e-01, 6.265048463518008e-01, + -7.792973793725303e-01, 6.266542862720293e-01, + -7.791772055925247e-01, 6.268037031519712e-01, + -7.790570031644006e-01, 6.269530969861327e-01, + -7.789367720925775e-01, 6.271024677690209e-01, + -7.788165123814760e-01, 6.272518154951441e-01, + -7.786962240355175e-01, 6.274011401590110e-01, + -7.785759070591250e-01, 6.275504417551315e-01, + -7.784555614567219e-01, 6.276997202780162e-01, + -7.783351872327332e-01, 6.278489757221765e-01, + -7.782147843915845e-01, 6.279982080821247e-01, + -7.780943529377028e-01, 6.281474173523740e-01, + -7.779738928755161e-01, 6.282966035274383e-01, + -7.778534042094531e-01, 6.284457666018327e-01, + -7.777328869439440e-01, 6.285949065700726e-01, + -7.776123410834200e-01, 6.287440234266747e-01, + -7.774917666323130e-01, 6.288931171661565e-01, + -7.773711635950563e-01, 6.290421877830360e-01, + -7.772505319760841e-01, 6.291912352718323e-01, + -7.771298717798316e-01, 6.293402596270656e-01, + -7.770091830107353e-01, 6.294892608432566e-01, + -7.768884656732324e-01, 6.296382389149270e-01, + -7.767677197717615e-01, 6.297871938365992e-01, + -7.766469453107621e-01, 6.299361256027964e-01, + -7.765261422946744e-01, 6.300850342080432e-01, + -7.764053107279404e-01, 6.302339196468644e-01, + -7.762844506150025e-01, 6.303827819137859e-01, + -7.761635619603043e-01, 6.305316210033346e-01, + -7.760426447682908e-01, 6.306804369100380e-01, + -7.759216990434077e-01, 6.308292296284245e-01, + -7.758007247901016e-01, 6.309779991530235e-01, + -7.756797220128206e-01, 6.311267454783653e-01, + -7.755586907160136e-01, 6.312754685989808e-01, + -7.754376309041305e-01, 6.314241685094019e-01, + -7.753165425816225e-01, 6.315728452041610e-01, + -7.751954257529414e-01, 6.317214986777923e-01, + -7.750742804225405e-01, 6.318701289248299e-01, + -7.749531065948739e-01, 6.320187359398091e-01, + -7.748319042743969e-01, 6.321673197172659e-01, + -7.747106734655655e-01, 6.323158802517376e-01, + -7.745894141728376e-01, 6.324644175377618e-01, + -7.744681264006709e-01, 6.326129315698774e-01, + -7.743468101535251e-01, 6.327614223426240e-01, + -7.742254654358607e-01, 6.329098898505418e-01, + -7.741040922521390e-01, 6.330583340881721e-01, + -7.739826906068229e-01, 6.332067550500572e-01, + -7.738612605043755e-01, 6.333551527307400e-01, + -7.737398019492618e-01, 6.335035271247643e-01, + -7.736183149459475e-01, 6.336518782266749e-01, + -7.734967994988990e-01, 6.338002060310173e-01, + -7.733752556125845e-01, 6.339485105323378e-01, + -7.732536832914726e-01, 6.340967917251837e-01, + -7.731320825400331e-01, 6.342450496041033e-01, + -7.730104533627370e-01, 6.343932841636455e-01, + -7.728887957640562e-01, 6.345414953983600e-01, + -7.727671097484639e-01, 6.346896833027977e-01, + -7.726453953204339e-01, 6.348378478715100e-01, + -7.725236524844413e-01, 6.349859890990495e-01, + -7.724018812449625e-01, 6.351341069799692e-01, + -7.722800816064743e-01, 6.352822015088234e-01, + -7.721582535734552e-01, 6.354302726801672e-01, + -7.720363971503845e-01, 6.355783204885561e-01, + -7.719145123417424e-01, 6.357263449285471e-01, + -7.717925991520102e-01, 6.358743459946977e-01, + -7.716706575856703e-01, 6.360223236815663e-01, + -7.715486876472063e-01, 6.361702779837122e-01, + -7.714266893411026e-01, 6.363182088956955e-01, + -7.713046626718448e-01, 6.364661164120772e-01, + -7.711826076439193e-01, 6.366140005274191e-01, + -7.710605242618138e-01, 6.367618612362842e-01, + -7.709384125300169e-01, 6.369096985332359e-01, + -7.708162724530185e-01, 6.370575124128386e-01, + -7.706941040353091e-01, 6.372053028696576e-01, + -7.705719072813808e-01, 6.373530698982591e-01, + -7.704496821957260e-01, 6.375008134932102e-01, + -7.703274287828389e-01, 6.376485336490788e-01, + -7.702051470472142e-01, 6.377962303604335e-01, + -7.700828369933479e-01, 6.379439036218440e-01, + -7.699604986257372e-01, 6.380915534278808e-01, + -7.698381319488798e-01, 6.382391797731153e-01, + -7.697157369672751e-01, 6.383867826521196e-01, + -7.695933136854229e-01, 6.385343620594668e-01, + -7.694708621078247e-01, 6.386819179897307e-01, + -7.693483822389823e-01, 6.388294504374863e-01, + -7.692258740833993e-01, 6.389769593973091e-01, + -7.691033376455797e-01, 6.391244448637757e-01, + -7.689807729300289e-01, 6.392719068314635e-01, + -7.688581799412533e-01, 6.394193452949507e-01, + -7.687355586837603e-01, 6.395667602488163e-01, + -7.686129091620584e-01, 6.397141516876405e-01, + -7.684902313806569e-01, 6.398615196060039e-01, + -7.683675253440663e-01, 6.400088639984884e-01, + -7.682447910567983e-01, 6.401561848596765e-01, + -7.681220285233654e-01, 6.403034821841517e-01, + -7.679992377482813e-01, 6.404507559664981e-01, + -7.678764187360606e-01, 6.405980062013010e-01, + -7.677535714912190e-01, 6.407452328831464e-01, + -7.676306960182734e-01, 6.408924360066214e-01, + -7.675077923217413e-01, 6.410396155663134e-01, + -7.673848604061417e-01, 6.411867715568113e-01, + -7.672619002759945e-01, 6.413339039727043e-01, + -7.671389119358204e-01, 6.414810128085832e-01, + -7.670158953901415e-01, 6.416280980590388e-01, + -7.668928506434807e-01, 6.417751597186635e-01, + -7.667697777003619e-01, 6.419221977820502e-01, + -7.666466765653104e-01, 6.420692122437925e-01, + -7.665235472428522e-01, 6.422162030984854e-01, + -7.664003897375142e-01, 6.423631703407243e-01, + -7.662772040538247e-01, 6.425101139651057e-01, + -7.661539901963129e-01, 6.426570339662269e-01, + -7.660307481695090e-01, 6.428039303386860e-01, + -7.659074779779443e-01, 6.429508030770821e-01, + -7.657841796261510e-01, 6.430976521760151e-01, + -7.656608531186625e-01, 6.432444776300859e-01, + -7.655374984600131e-01, 6.433912794338958e-01, + -7.654141156547383e-01, 6.435380575820477e-01, + -7.652907047073744e-01, 6.436848120691449e-01, + -7.651672656224590e-01, 6.438315428897914e-01, + -7.650437984045305e-01, 6.439782500385927e-01, + -7.649203030581284e-01, 6.441249335101545e-01, + -7.647967795877935e-01, 6.442715932990838e-01, + -7.646732279980671e-01, 6.444182293999884e-01, + -7.645496482934921e-01, 6.445648418074766e-01, + -7.644260404786121e-01, 6.447114305161583e-01, + -7.643024045579717e-01, 6.448579955206437e-01, + -7.641787405361167e-01, 6.450045368155439e-01, + -7.640550484175940e-01, 6.451510543954712e-01, + -7.639313282069511e-01, 6.452975482550384e-01, + -7.638075799087372e-01, 6.454440183888592e-01, + -7.636838035275019e-01, 6.455904647915487e-01, + -7.635599990677961e-01, 6.457368874577223e-01, + -7.634361665341720e-01, 6.458832863819963e-01, + -7.633123059311824e-01, 6.460296615589883e-01, + -7.631884172633813e-01, 6.461760129833163e-01, + -7.630645005353237e-01, 6.463223406495995e-01, + -7.629405557515657e-01, 6.464686445524578e-01, + -7.628165829166644e-01, 6.466149246865120e-01, + -7.626925820351780e-01, 6.467611810463839e-01, + -7.625685531116654e-01, 6.469074136266960e-01, + -7.624444961506872e-01, 6.470536224220715e-01, + -7.623204111568043e-01, 6.471998074271352e-01, + -7.621962981345789e-01, 6.473459686365121e-01, + -7.620721570885746e-01, 6.474921060448281e-01, + -7.619479880233554e-01, 6.476382196467103e-01, + -7.618237909434870e-01, 6.477843094367864e-01, + -7.616995658535354e-01, 6.479303754096853e-01, + -7.615753127580680e-01, 6.480764175600365e-01, + -7.614510316616536e-01, 6.482224358824704e-01, + -7.613267225688614e-01, 6.483684303716183e-01, + -7.612023854842618e-01, 6.485144010221124e-01, + -7.610780204124266e-01, 6.486603478285858e-01, + -7.609536273579282e-01, 6.488062707856725e-01, + -7.608292063253400e-01, 6.489521698880073e-01, + -7.607047573192369e-01, 6.490980451302260e-01, + -7.605802803441944e-01, 6.492438965069649e-01, + -7.604557754047893e-01, 6.493897240128617e-01, + -7.603312425055990e-01, 6.495355276425547e-01, + -7.602066816512024e-01, 6.496813073906832e-01, + -7.600820928461793e-01, 6.498270632518871e-01, + -7.599574760951103e-01, 6.499727952208075e-01, + -7.598328314025774e-01, 6.501185032920862e-01, + -7.597081587731634e-01, 6.502641874603659e-01, + -7.595834582114520e-01, 6.504098477202903e-01, + -7.594587297220282e-01, 6.505554840665039e-01, + -7.593339733094779e-01, 6.507010964936520e-01, + -7.592091889783881e-01, 6.508466849963809e-01, + -7.590843767333466e-01, 6.509922495693377e-01, + -7.589595365789424e-01, 6.511377902071703e-01, + -7.588346685197657e-01, 6.512833069045277e-01, + -7.587097725604074e-01, 6.514287996560598e-01, + -7.585848487054596e-01, 6.515742684564170e-01, + -7.584598969595154e-01, 6.517197133002509e-01, + -7.583349173271690e-01, 6.518651341822139e-01, + -7.582099098130153e-01, 6.520105310969595e-01, + -7.580848744216507e-01, 6.521559040391416e-01, + -7.579598111576723e-01, 6.523012530034155e-01, + -7.578347200256783e-01, 6.524465779844367e-01, + -7.577096010302681e-01, 6.525918789768624e-01, + -7.575844541760418e-01, 6.527371559753503e-01, + -7.574592794676007e-01, 6.528824089745588e-01, + -7.573340769095471e-01, 6.530276379691475e-01, + -7.572088465064846e-01, 6.531728429537768e-01, + -7.570835882630171e-01, 6.533180239231077e-01, + -7.569583021837505e-01, 6.534631808718023e-01, + -7.568329882732908e-01, 6.536083137945239e-01, + -7.567076465362457e-01, 6.537534226859361e-01, + -7.565822769772235e-01, 6.538985075407038e-01, + -7.564568796008337e-01, 6.540435683534926e-01, + -7.563314544116869e-01, 6.541886051189690e-01, + -7.562060014143945e-01, 6.543336178318004e-01, + -7.560805206135691e-01, 6.544786064866553e-01, + -7.559550120138244e-01, 6.546235710782027e-01, + -7.558294756197748e-01, 6.547685116011126e-01, + -7.557039114360359e-01, 6.549134280500560e-01, + -7.555783194672245e-01, 6.550583204197049e-01, + -7.554526997179583e-01, 6.552031887047318e-01, + -7.553270521928557e-01, 6.553480328998105e-01, + -7.552013768965365e-01, 6.554928529996153e-01, + -7.550756738336216e-01, 6.556376489988218e-01, + -7.549499430087326e-01, 6.557824208921060e-01, + -7.548241844264924e-01, 6.559271686741454e-01, + -7.546983980915245e-01, 6.560718923396176e-01, + -7.545725840084538e-01, 6.562165918832019e-01, + -7.544467421819064e-01, 6.563612672995780e-01, + -7.543208726165088e-01, 6.565059185834266e-01, + -7.541949753168892e-01, 6.566505457294289e-01, + -7.540690502876761e-01, 6.567951487322681e-01, + -7.539430975334996e-01, 6.569397275866271e-01, + -7.538171170589908e-01, 6.570842822871902e-01, + -7.536911088687812e-01, 6.572288128286425e-01, + -7.535650729675043e-01, 6.573733192056702e-01, + -7.534390093597936e-01, 6.575178014129601e-01, + -7.533129180502843e-01, 6.576622594452001e-01, + -7.531867990436125e-01, 6.578066932970786e-01, + -7.530606523444151e-01, 6.579511029632855e-01, + -7.529344779573302e-01, 6.580954884385112e-01, + -7.528082758869970e-01, 6.582398497174469e-01, + -7.526820461380553e-01, 6.583841867947850e-01, + -7.525557887151464e-01, 6.585284996652186e-01, + -7.524295036229124e-01, 6.586727883234419e-01, + -7.523031908659964e-01, 6.588170527641495e-01, + -7.521768504490428e-01, 6.589612929820373e-01, + -7.520504823766964e-01, 6.591055089718021e-01, + -7.519240866536036e-01, 6.592497007281415e-01, + -7.517976632844116e-01, 6.593938682457539e-01, + -7.516712122737684e-01, 6.595380115193387e-01, + -7.515447336263237e-01, 6.596821305435961e-01, + -7.514182273467275e-01, 6.598262253132273e-01, + -7.512916934396309e-01, 6.599702958229345e-01, + -7.511651319096865e-01, 6.601143420674205e-01, + -7.510385427615474e-01, 6.602583640413890e-01, + -7.509119259998679e-01, 6.604023617395450e-01, + -7.507852816293037e-01, 6.605463351565939e-01, + -7.506586096545107e-01, 6.606902842872423e-01, + -7.505319100801464e-01, 6.608342091261976e-01, + -7.504051829108693e-01, 6.609781096681681e-01, + -7.502784281513387e-01, 6.611219859078629e-01, + -7.501516458062151e-01, 6.612658378399923e-01, + -7.500248358801598e-01, 6.614096654592669e-01, + -7.498979983778353e-01, 6.615534687603989e-01, + -7.497711333039051e-01, 6.616972477381010e-01, + -7.496442406630335e-01, 6.618410023870869e-01, + -7.495173204598862e-01, 6.619847327020709e-01, + -7.493903726991296e-01, 6.621284386777687e-01, + -7.492633973854311e-01, 6.622721203088966e-01, + -7.491363945234594e-01, 6.624157775901718e-01, + -7.490093641178839e-01, 6.625594105163123e-01, + -7.488823061733751e-01, 6.627030190820374e-01, + -7.487552206946048e-01, 6.628466032820669e-01, + -7.486281076862454e-01, 6.629901631111215e-01, + -7.485009671529704e-01, 6.631336985639230e-01, + -7.483737990994546e-01, 6.632772096351941e-01, + -7.482466035303734e-01, 6.634206963196583e-01, + -7.481193804504036e-01, 6.635641586120398e-01, + -7.479921298642227e-01, 6.637075965070640e-01, + -7.478648517765094e-01, 6.638510099994573e-01, + -7.477375461919433e-01, 6.639943990839466e-01, + -7.476102131152051e-01, 6.641377637552600e-01, + -7.474828525509766e-01, 6.642811040081262e-01, + -7.473554645039402e-01, 6.644244198372752e-01, + -7.472280489787799e-01, 6.645677112374375e-01, + -7.471006059801801e-01, 6.647109782033448e-01, + -7.469731355128268e-01, 6.648542207297297e-01, + -7.468456375814065e-01, 6.649974388113253e-01, + -7.467181121906071e-01, 6.651406324428661e-01, + -7.465905593451173e-01, 6.652838016190872e-01, + -7.464629790496268e-01, 6.654269463347247e-01, + -7.463353713088263e-01, 6.655700665845155e-01, + -7.462077361274078e-01, 6.657131623631976e-01, + -7.460800735100638e-01, 6.658562336655097e-01, + -7.459523834614883e-01, 6.659992804861915e-01, + -7.458246659863761e-01, 6.661423028199835e-01, + -7.456969210894228e-01, 6.662853006616273e-01, + -7.455691487753254e-01, 6.664282740058652e-01, + -7.454413490487817e-01, 6.665712228474406e-01, + -7.453135219144905e-01, 6.667141471810977e-01, + -7.451856673771516e-01, 6.668570470015812e-01, + -7.450577854414661e-01, 6.669999223036375e-01, + -7.449298761121353e-01, 6.671427730820133e-01, + -7.448019393938626e-01, 6.672855993314564e-01, + -7.446739752913517e-01, 6.674284010467155e-01, + -7.445459838093074e-01, 6.675711782225403e-01, + -7.444179649524356e-01, 6.677139308536810e-01, + -7.442899187254433e-01, 6.678566589348893e-01, + -7.441618451330382e-01, 6.679993624609174e-01, + -7.440337441799293e-01, 6.681420414265185e-01, + -7.439056158708265e-01, 6.682846958264467e-01, + -7.437774602104409e-01, 6.684273256554568e-01, + -7.436492772034841e-01, 6.685699309083050e-01, + -7.435210668546691e-01, 6.687125115797480e-01, + -7.433928291687100e-01, 6.688550676645436e-01, + -7.432645641503216e-01, 6.689975991574503e-01, + -7.431362718042198e-01, 6.691401060532276e-01, + -7.430079521351217e-01, 6.692825883466360e-01, + -7.428796051477452e-01, 6.694250460324369e-01, + -7.427512308468090e-01, 6.695674791053925e-01, + -7.426228292370335e-01, 6.697098875602658e-01, + -7.424944003231392e-01, 6.698522713918210e-01, + -7.423659441098485e-01, 6.699946305948230e-01, + -7.422374606018840e-01, 6.701369651640376e-01, + -7.421089498039699e-01, 6.702792750942318e-01, + -7.419804117208311e-01, 6.704215603801731e-01, + -7.418518463571935e-01, 6.705638210166300e-01, + -7.417232537177841e-01, 6.707060569983722e-01, + -7.415946338073311e-01, 6.708482683201696e-01, + -7.414659866305633e-01, 6.709904549767942e-01, + -7.413373121922107e-01, 6.711326169630177e-01, + -7.412086104970043e-01, 6.712747542736135e-01, + -7.410798815496761e-01, 6.714168669033554e-01, + -7.409511253549591e-01, 6.715589548470183e-01, + -7.408223419175873e-01, 6.717010180993783e-01, + -7.406935312422958e-01, 6.718430566552119e-01, + -7.405646933338202e-01, 6.719850705092969e-01, + -7.404358281968980e-01, 6.721270596564117e-01, + -7.403069358362669e-01, 6.722690240913359e-01, + -7.401780162566662e-01, 6.724109638088498e-01, + -7.400490694628356e-01, 6.725528788037347e-01, + -7.399200954595162e-01, 6.726947690707729e-01, + -7.397910942514500e-01, 6.728366346047473e-01, + -7.396620658433800e-01, 6.729784754004421e-01, + -7.395330102400502e-01, 6.731202914526421e-01, + -7.394039274462058e-01, 6.732620827561330e-01, + -7.392748174665925e-01, 6.734038493057017e-01, + -7.391456803059575e-01, 6.735455910961361e-01, + -7.390165159690487e-01, 6.736873081222243e-01, + -7.388873244606151e-01, 6.738290003787560e-01, + -7.387581057854069e-01, 6.739706678605216e-01, + -7.386288599481748e-01, 6.741123105623124e-01, + -7.384995869536711e-01, 6.742539284789204e-01, + -7.383702868066486e-01, 6.743955216051390e-01, + -7.382409595118613e-01, 6.745370899357620e-01, + -7.381116050740643e-01, 6.746786334655845e-01, + -7.379822234980136e-01, 6.748201521894022e-01, + -7.378528147884660e-01, 6.749616461020119e-01, + -7.377233789501797e-01, 6.751031151982114e-01, + -7.375939159879136e-01, 6.752445594727993e-01, + -7.374644259064276e-01, 6.753859789205748e-01, + -7.373349087104829e-01, 6.755273735363385e-01, + -7.372053644048412e-01, 6.756687433148919e-01, + -7.370757929942657e-01, 6.758100882510369e-01, + -7.369461944835203e-01, 6.759514083395770e-01, + -7.368165688773699e-01, 6.760927035753159e-01, + -7.366869161805805e-01, 6.762339739530590e-01, + -7.365572363979191e-01, 6.763752194676116e-01, + -7.364275295341537e-01, 6.765164401137811e-01, + -7.362977955940532e-01, 6.766576358863750e-01, + -7.361680345823874e-01, 6.767988067802018e-01, + -7.360382465039274e-01, 6.769399527900711e-01, + -7.359084313634452e-01, 6.770810739107935e-01, + -7.357785891657136e-01, 6.772221701371803e-01, + -7.356487199155065e-01, 6.773632414640439e-01, + -7.355188236175989e-01, 6.775042878861974e-01, + -7.353889002767667e-01, 6.776453093984549e-01, + -7.352589498977868e-01, 6.777863059956315e-01, + -7.351289724854372e-01, 6.779272776725430e-01, + -7.349989680444967e-01, 6.780682244240066e-01, + -7.348689365797452e-01, 6.782091462448399e-01, + -7.347388780959635e-01, 6.783500431298615e-01, + -7.346087925979335e-01, 6.784909150738911e-01, + -7.344786800904384e-01, 6.786317620717494e-01, + -7.343485405782616e-01, 6.787725841182577e-01, + -7.342183740661883e-01, 6.789133812082384e-01, + -7.340881805590040e-01, 6.790541533365149e-01, + -7.339579600614959e-01, 6.791949004979112e-01, + -7.338277125784517e-01, 6.793356226872526e-01, + -7.336974381146604e-01, 6.794763198993650e-01, + -7.335671366749114e-01, 6.796169921290756e-01, + -7.334368082639957e-01, 6.797576393712120e-01, + -7.333064528867053e-01, 6.798982616206033e-01, + -7.331760705478327e-01, 6.800388588720789e-01, + -7.330456612521721e-01, 6.801794311204697e-01, + -7.329152250045178e-01, 6.803199783606072e-01, + -7.327847618096658e-01, 6.804605005873239e-01, + -7.326542716724128e-01, 6.806009977954530e-01, + -7.325237545975567e-01, 6.807414699798291e-01, + -7.323932105898960e-01, 6.808819171352872e-01, + -7.322626396542308e-01, 6.810223392566637e-01, + -7.321320417953613e-01, 6.811627363387954e-01, + -7.320014170180896e-01, 6.813031083765205e-01, + -7.318707653272183e-01, 6.814434553646779e-01, + -7.317400867275510e-01, 6.815837772981075e-01, + -7.316093812238926e-01, 6.817240741716497e-01, + -7.314786488210485e-01, 6.818643459801467e-01, + -7.313478895238256e-01, 6.820045927184408e-01, + -7.312171033370313e-01, 6.821448143813756e-01, + -7.310862902654743e-01, 6.822850109637956e-01, + -7.309554503139644e-01, 6.824251824605461e-01, + -7.308245834873122e-01, 6.825653288664733e-01, + -7.306936897903290e-01, 6.827054501764246e-01, + -7.305627692278276e-01, 6.828455463852481e-01, + -7.304318218046215e-01, 6.829856174877927e-01, + -7.303008475255255e-01, 6.831256634789087e-01, + -7.301698463953549e-01, 6.832656843534467e-01, + -7.300388184189263e-01, 6.834056801062587e-01, + -7.299077636010571e-01, 6.835456507321975e-01, + -7.297766819465661e-01, 6.836855962261166e-01, + -7.296455734602725e-01, 6.838255165828707e-01, + -7.295144381469970e-01, 6.839654117973154e-01, + -7.293832760115610e-01, 6.841052818643071e-01, + -7.292520870587870e-01, 6.842451267787031e-01, + -7.291208712934982e-01, 6.843849465353617e-01, + -7.289896287205194e-01, 6.845247411291423e-01, + -7.288583593446758e-01, 6.846645105549050e-01, + -7.287270631707938e-01, 6.848042548075106e-01, + -7.285957402037009e-01, 6.849439738818215e-01, + -7.284643904482252e-01, 6.850836677727004e-01, + -7.283330139091964e-01, 6.852233364750112e-01, + -7.282016105914446e-01, 6.853629799836187e-01, + -7.280701804998012e-01, 6.855025982933886e-01, + -7.279387236390986e-01, 6.856421913991875e-01, + -7.278072400141700e-01, 6.857817592958830e-01, + -7.276757296298496e-01, 6.859213019783436e-01, + -7.275441924909728e-01, 6.860608194414387e-01, + -7.274126286023758e-01, 6.862003116800386e-01, + -7.272810379688959e-01, 6.863397786890145e-01, + -7.271494205953710e-01, 6.864792204632390e-01, + -7.270177764866407e-01, 6.866186369975846e-01, + -7.268861056475450e-01, 6.867580282869259e-01, + -7.267544080829250e-01, 6.868973943261376e-01, + -7.266226837976228e-01, 6.870367351100957e-01, + -7.264909327964819e-01, 6.871760506336768e-01, + -7.263591550843460e-01, 6.873153408917590e-01, + -7.262273506660604e-01, 6.874546058792210e-01, + -7.260955195464710e-01, 6.875938455909422e-01, + -7.259636617304249e-01, 6.877330600218032e-01, + -7.258317772227704e-01, 6.878722491666855e-01, + -7.256998660283561e-01, 6.880114130204716e-01, + -7.255679281520323e-01, 6.881505515780448e-01, + -7.254359635986498e-01, 6.882896648342893e-01, + -7.253039723730608e-01, 6.884287527840904e-01, + -7.251719544801180e-01, 6.885678154223343e-01, + -7.250399099246754e-01, 6.887068527439077e-01, + -7.249078387115878e-01, 6.888458647436990e-01, + -7.247757408457113e-01, 6.889848514165970e-01, + -7.246436163319026e-01, 6.891238127574916e-01, + -7.245114651750196e-01, 6.892627487612735e-01, + -7.243792873799212e-01, 6.894016594228343e-01, + -7.242470829514670e-01, 6.895405447370668e-01, + -7.241148518945179e-01, 6.896794046988648e-01, + -7.239825942139355e-01, 6.898182393031225e-01, + -7.238503099145829e-01, 6.899570485447354e-01, + -7.237179990013235e-01, 6.900958324186000e-01, + -7.235856614790221e-01, 6.902345909196134e-01, + -7.234532973525444e-01, 6.903733240426740e-01, + -7.233209066267570e-01, 6.905120317826811e-01, + -7.231884893065275e-01, 6.906507141345346e-01, + -7.230560453967244e-01, 6.907893710931357e-01, + -7.229235749022177e-01, 6.909280026533862e-01, + -7.227910778278775e-01, 6.910666088101892e-01, + -7.226585541785756e-01, 6.912051895584485e-01, + -7.225260039591845e-01, 6.913437448930687e-01, + -7.223934271745776e-01, 6.914822748089559e-01, + -7.222608238296293e-01, 6.916207793010163e-01, + -7.221281939292153e-01, 6.917592583641577e-01, + -7.219955374782119e-01, 6.918977119932888e-01, + -7.218628544814963e-01, 6.920361401833187e-01, + -7.217301449439472e-01, 6.921745429291581e-01, + -7.215974088704438e-01, 6.923129202257182e-01, + -7.214646462658664e-01, 6.924512720679111e-01, + -7.213318571350963e-01, 6.925895984506504e-01, + -7.211990414830157e-01, 6.927278993688498e-01, + -7.210661993145081e-01, 6.928661748174246e-01, + -7.209333306344575e-01, 6.930044247912909e-01, + -7.208004354477492e-01, 6.931426492853654e-01, + -7.206675137592695e-01, 6.932808482945660e-01, + -7.205345655739053e-01, 6.934190218138118e-01, + -7.204015908965448e-01, 6.935571698380223e-01, + -7.202685897320772e-01, 6.936952923621182e-01, + -7.201355620853924e-01, 6.938333893810213e-01, + -7.200025079613817e-01, 6.939714608896540e-01, + -7.198694273649369e-01, 6.941095068829398e-01, + -7.197363203009510e-01, 6.942475273558033e-01, + -7.196031867743181e-01, 6.943855223031697e-01, + -7.194700267899330e-01, 6.945234917199655e-01, + -7.193368403526917e-01, 6.946614356011178e-01, + -7.192036274674912e-01, 6.947993539415549e-01, + -7.190703881392292e-01, 6.949372467362058e-01, + -7.189371223728045e-01, 6.950751139800009e-01, + -7.188038301731169e-01, 6.952129556678708e-01, + -7.186705115450672e-01, 6.953507717947477e-01, + -7.185371664935574e-01, 6.954885623555644e-01, + -7.184037950234898e-01, 6.956263273452549e-01, + -7.182703971397683e-01, 6.957640667587537e-01, + -7.181369728472975e-01, 6.959017805909968e-01, + -7.180035221509832e-01, 6.960394688369207e-01, + -7.178700450557317e-01, 6.961771314914630e-01, + -7.177365415664510e-01, 6.963147685495621e-01, + -7.176030116880491e-01, 6.964523800061578e-01, + -7.174694554254358e-01, 6.965899658561904e-01, + -7.173358727835217e-01, 6.967275260946012e-01, + -7.172022637672181e-01, 6.968650607163325e-01, + -7.170686283814375e-01, 6.970025697163275e-01, + -7.169349666310931e-01, 6.971400530895304e-01, + -7.168012785210995e-01, 6.972775108308865e-01, + -7.166675640563719e-01, 6.974149429353418e-01, + -7.165338232418267e-01, 6.975523493978432e-01, + -7.164000560823810e-01, 6.976897302133388e-01, + -7.162662625829531e-01, 6.978270853767773e-01, + -7.161324427484623e-01, 6.979644148831087e-01, + -7.159985965838287e-01, 6.981017187272838e-01, + -7.158647240939735e-01, 6.982389969042543e-01, + -7.157308252838186e-01, 6.983762494089729e-01, + -7.155969001582875e-01, 6.985134762363930e-01, + -7.154629487223038e-01, 6.986506773814695e-01, + -7.153289709807926e-01, 6.987878528391577e-01, + -7.151949669386801e-01, 6.989250026044141e-01, + -7.150609366008931e-01, 6.990621266721961e-01, + -7.149268799723595e-01, 6.991992250374621e-01, + -7.147927970580082e-01, 6.993362976951711e-01, + -7.146586878627691e-01, 6.994733446402838e-01, + -7.145245523915729e-01, 6.996103658677610e-01, + -7.143903906493514e-01, 6.997473613725650e-01, + -7.142562026410375e-01, 6.998843311496588e-01, + -7.141219883715648e-01, 7.000212751940063e-01, + -7.139877478458678e-01, 7.001581935005727e-01, + -7.138534810688825e-01, 7.002950860643238e-01, + -7.137191880455452e-01, 7.004319528802264e-01, + -7.135848687807936e-01, 7.005687939432483e-01, + -7.134505232795663e-01, 7.007056092483585e-01, + -7.133161515468026e-01, 7.008423987905261e-01, + -7.131817535874432e-01, 7.009791625647224e-01, + -7.130473294064293e-01, 7.011159005659187e-01, + -7.129128790087035e-01, 7.012526127890875e-01, + -7.127784023992090e-01, 7.013892992292022e-01, + -7.126438995828902e-01, 7.015259598812373e-01, + -7.125093705646923e-01, 7.016625947401685e-01, + -7.123748153495617e-01, 7.017992038009717e-01, + -7.122402339424455e-01, 7.019357870586244e-01, + -7.121056263482919e-01, 7.020723445081046e-01, + -7.119709925720501e-01, 7.022088761443919e-01, + -7.118363326186701e-01, 7.023453819624659e-01, + -7.117016464931030e-01, 7.024818619573080e-01, + -7.115669342003007e-01, 7.026183161239001e-01, + -7.114321957452164e-01, 7.027547444572253e-01, + -7.112974311328040e-01, 7.028911469522674e-01, + -7.111626403680184e-01, 7.030275236040112e-01, + -7.110278234558153e-01, 7.031638744074428e-01, + -7.108929804011517e-01, 7.033001993575487e-01, + -7.107581112089854e-01, 7.034364984493167e-01, + -7.106232158842750e-01, 7.035727716777356e-01, + -7.104882944319805e-01, 7.037090190377948e-01, + -7.103533468570624e-01, 7.038452405244849e-01, + -7.102183731644822e-01, 7.039814361327976e-01, + -7.100833733592028e-01, 7.041176058577253e-01, + -7.099483474461874e-01, 7.042537496942615e-01, + -7.098132954304008e-01, 7.043898676374004e-01, + -7.096782173168086e-01, 7.045259596821374e-01, + -7.095431131103768e-01, 7.046620258234688e-01, + -7.094079828160730e-01, 7.047980660563920e-01, + -7.092728264388657e-01, 7.049340803759049e-01, + -7.091376439837240e-01, 7.050700687770068e-01, + -7.090024354556183e-01, 7.052060312546978e-01, + -7.088672008595198e-01, 7.053419678039788e-01, + -7.087319402004006e-01, 7.054778784198521e-01, + -7.085966534832341e-01, 7.056137630973205e-01, + -7.084613407129942e-01, 7.057496218313878e-01, + -7.083260018946559e-01, 7.058854546170590e-01, + -7.081906370331954e-01, 7.060212614493397e-01, + -7.080552461335895e-01, 7.061570423232371e-01, + -7.079198292008163e-01, 7.062927972337585e-01, + -7.077843862398546e-01, 7.064285261759128e-01, + -7.076489172556844e-01, 7.065642291447095e-01, + -7.075134222532863e-01, 7.066999061351594e-01, + -7.073779012376421e-01, 7.068355571422738e-01, + -7.072423542137347e-01, 7.069711821610654e-01, + -7.071067811865476e-01, 7.071067811865475e-01, +#elif TWIDDLE_TABLE_ORDER == 12 + -1.000000000000000e+00, 0.000000000000000e+00, + -9.999988234517019e-01, 1.533980186284766e-03, + -9.999952938095762e-01, 3.067956762965976e-03, + -9.999894110819284e-01, 4.601926120448570e-03, + -9.999811752826011e-01, 6.135884649154475e-03, + -9.999705864309741e-01, 7.669828739531097e-03, + -9.999576445519639e-01, 9.203754782059820e-03, + -9.999423496760239e-01, 1.073765916726449e-02, + -9.999247018391445e-01, 1.227153828571993e-02, + -9.999047010828529e-01, 1.380538852806039e-02, + -9.998823474542126e-01, 1.533920628498810e-02, + -9.998576410058239e-01, 1.687298794728171e-02, + -9.998305817958234e-01, 1.840672990580482e-02, + -9.998011698878843e-01, 1.994042855151444e-02, + -9.997694053512153e-01, 2.147408027546951e-02, + -9.997352882605617e-01, 2.300768146883937e-02, + -9.996988186962042e-01, 2.454122852291229e-02, + -9.996599967439592e-01, 2.607471782910390e-02, + -9.996188224951786e-01, 2.760814577896574e-02, + -9.995752960467492e-01, 2.914150876419372e-02, + -9.995294175010931e-01, 3.067480317663663e-02, + -9.994811869661670e-01, 3.220802540830459e-02, + -9.994306045554617e-01, 3.374117185137758e-02, + -9.993776703880028e-01, 3.527423889821395e-02, + -9.993223845883495e-01, 3.680722294135883e-02, + -9.992647472865944e-01, 3.834012037355269e-02, + -9.992047586183639e-01, 3.987292758773981e-02, + -9.991424187248169e-01, 4.140564097707674e-02, + -9.990777277526454e-01, 4.293825693494082e-02, + -9.990106858540734e-01, 4.447077185493867e-02, + -9.989412931868569e-01, 4.600318213091462e-02, + -9.988695499142836e-01, 4.753548415695930e-02, + -9.987954562051724e-01, 4.906767432741801e-02, + -9.987190122338729e-01, 5.059974903689928e-02, + -9.986402181802653e-01, 5.213170468028332e-02, + -9.985590742297593e-01, 5.366353765273052e-02, + -9.984755805732948e-01, 5.519524434968993e-02, + -9.983897374073402e-01, 5.672682116690775e-02, + -9.983015449338929e-01, 5.825826450043575e-02, + -9.982110033604782e-01, 5.978957074663987e-02, + -9.981181129001492e-01, 6.132073630220858e-02, + -9.980228737714862e-01, 6.285175756416140e-02, + -9.979252861985960e-01, 6.438263092985747e-02, + -9.978253504111116e-01, 6.591335279700380e-02, + -9.977230666441916e-01, 6.744391956366405e-02, + -9.976184351385196e-01, 6.897432762826675e-02, + -9.975114561403035e-01, 7.050457338961386e-02, + -9.974021299012753e-01, 7.203465324688933e-02, + -9.972904566786902e-01, 7.356456359966743e-02, + -9.971764367353262e-01, 7.509430084792130e-02, + -9.970600703394830e-01, 7.662386139203149e-02, + -9.969413577649822e-01, 7.815324163279423e-02, + -9.968202992911657e-01, 7.968243797143013e-02, + -9.966968952028961e-01, 8.121144680959244e-02, + -9.965711457905548e-01, 8.274026454937569e-02, + -9.964430513500426e-01, 8.426888759332407e-02, + -9.963126121827780e-01, 8.579731234443990e-02, + -9.961798285956970e-01, 8.732553520619206e-02, + -9.960447009012520e-01, 8.885355258252460e-02, + -9.959072294174117e-01, 9.038136087786498e-02, + -9.957674144676598e-01, 9.190895649713272e-02, + -9.956252563809943e-01, 9.343633584574779e-02, + -9.954807554919269e-01, 9.496349532963899e-02, + -9.953339121404823e-01, 9.649043135525259e-02, + -9.951847266721969e-01, 9.801714032956060e-02, + -9.950331994381186e-01, 9.954361866006932e-02, + -9.948793307948056e-01, 1.010698627548278e-01, + -9.947231211043257e-01, 1.025958690224363e-01, + -9.945645707342554e-01, 1.041216338720546e-01, + -9.944036800576791e-01, 1.056471537134106e-01, + -9.942404494531879e-01, 1.071724249568088e-01, + -9.940748793048794e-01, 1.086974440131387e-01, + -9.939069700023561e-01, 1.102222072938831e-01, + -9.937367219407246e-01, 1.117467112111266e-01, + -9.935641355205953e-01, 1.132709521775643e-01, + -9.933892111480807e-01, 1.147949266065101e-01, + -9.932119492347945e-01, 1.163186309119048e-01, + -9.930323501978514e-01, 1.178420615083250e-01, + -9.928504144598651e-01, 1.193652148109914e-01, + -9.926661424489480e-01, 1.208880872357771e-01, + -9.924795345987100e-01, 1.224106751992162e-01, + -9.922905913482574e-01, 1.239329751185122e-01, + -9.920993131421918e-01, 1.254549834115462e-01, + -9.919057004306093e-01, 1.269766964968859e-01, + -9.917097536690995e-01, 1.284981107937932e-01, + -9.915114733187439e-01, 1.300192227222333e-01, + -9.913108598461154e-01, 1.315400287028831e-01, + -9.911079137232769e-01, 1.330605251571391e-01, + -9.909026354277800e-01, 1.345807085071262e-01, + -9.906950254426646e-01, 1.361005751757062e-01, + -9.904850842564571e-01, 1.376201215864860e-01, + -9.902728123631691e-01, 1.391393441638262e-01, + -9.900582102622971e-01, 1.406582393328492e-01, + -9.898412784588205e-01, 1.421768035194480e-01, + -9.896220174632009e-01, 1.436950331502945e-01, + -9.894004277913804e-01, 1.452129246528475e-01, + -9.891765099647810e-01, 1.467304744553617e-01, + -9.889502645103030e-01, 1.482476789868960e-01, + -9.887216919603238e-01, 1.497645346773215e-01, + -9.884907928526966e-01, 1.512810379573302e-01, + -9.882575677307495e-01, 1.527971852584434e-01, + -9.880220171432835e-01, 1.543129730130201e-01, + -9.877841416445722e-01, 1.558283976542652e-01, + -9.875439417943592e-01, 1.573434556162382e-01, + -9.873014181578584e-01, 1.588581433338614e-01, + -9.870565713057510e-01, 1.603724572429283e-01, + -9.868094018141855e-01, 1.618863937801118e-01, + -9.865599102647754e-01, 1.633999493829732e-01, + -9.863080972445987e-01, 1.649131204899699e-01, + -9.860539633461954e-01, 1.664259035404641e-01, + -9.857975091675675e-01, 1.679382949747312e-01, + -9.855387353121761e-01, 1.694502912339680e-01, + -9.852776423889412e-01, 1.709618887603012e-01, + -9.850142310122398e-01, 1.724730839967960e-01, + -9.847485018019042e-01, 1.739838733874638e-01, + -9.844804553832209e-01, 1.754942533772714e-01, + -9.842100923869290e-01, 1.770042204121487e-01, + -9.839374134492189e-01, 1.785137709389975e-01, + -9.836624192117303e-01, 1.800229014056995e-01, + -9.833851103215512e-01, 1.815316082611250e-01, + -9.831054874312163e-01, 1.830398879551410e-01, + -9.828235511987052e-01, 1.845477369386196e-01, + -9.825393022874412e-01, 1.860551516634466e-01, + -9.822527413662894e-01, 1.875621285825296e-01, + -9.819638691095552e-01, 1.890686641498062e-01, + -9.816726861969831e-01, 1.905747548202527e-01, + -9.813791933137546e-01, 1.920803970498924e-01, + -9.810833911504867e-01, 1.935855872958036e-01, + -9.807852804032304e-01, 1.950903220161282e-01, + -9.804848617734694e-01, 1.965945976700802e-01, + -9.801821359681174e-01, 1.980984107179536e-01, + -9.798771036995176e-01, 1.996017576211310e-01, + -9.795697656854405e-01, 2.011046348420919e-01, + -9.792601226490820e-01, 2.026070388444211e-01, + -9.789481753190622e-01, 2.041089660928169e-01, + -9.786339244294232e-01, 2.056104130530992e-01, + -9.783173707196277e-01, 2.071113761922186e-01, + -9.779985149345571e-01, 2.086118519782635e-01, + -9.776773578245099e-01, 2.101118368804696e-01, + -9.773539001452000e-01, 2.116113273692276e-01, + -9.770281426577544e-01, 2.131103199160914e-01, + -9.767000861287118e-01, 2.146088109937868e-01, + -9.763697313300211e-01, 2.161067970762195e-01, + -9.760370790390390e-01, 2.176042746384836e-01, + -9.757021300385286e-01, 2.191012401568698e-01, + -9.753648851166570e-01, 2.205976901088735e-01, + -9.750253450669941e-01, 2.220936209732035e-01, + -9.746835106885107e-01, 2.235890292297900e-01, + -9.743393827855759e-01, 2.250839113597928e-01, + -9.739929621679558e-01, 2.265782638456100e-01, + -9.736442496508120e-01, 2.280720831708857e-01, + -9.732932460546982e-01, 2.295653658205189e-01, + -9.729399522055602e-01, 2.310581082806711e-01, + -9.725843689347322e-01, 2.325503070387752e-01, + -9.722264970789363e-01, 2.340419585835434e-01, + -9.718663374802794e-01, 2.355330594049755e-01, + -9.715038909862518e-01, 2.370236059943672e-01, + -9.711391584497251e-01, 2.385135948443184e-01, + -9.707721407289504e-01, 2.400030224487415e-01, + -9.704028386875555e-01, 2.414918853028693e-01, + -9.700312531945440e-01, 2.429801799032639e-01, + -9.696573851242924e-01, 2.444679027478242e-01, + -9.692812353565485e-01, 2.459550503357946e-01, + -9.689028047764289e-01, 2.474416191677733e-01, + -9.685220942744174e-01, 2.489276057457201e-01, + -9.681391047463624e-01, 2.504130065729652e-01, + -9.677538370934755e-01, 2.518978181542170e-01, + -9.673662922223285e-01, 2.533820369955702e-01, + -9.669764710448521e-01, 2.548656596045146e-01, + -9.665843744783331e-01, 2.563486824899429e-01, + -9.661900034454125e-01, 2.578311021621590e-01, + -9.657933588740837e-01, 2.593129151328862e-01, + -9.653944416976894e-01, 2.607941179152755e-01, + -9.649932528549203e-01, 2.622747070239136e-01, + -9.645897932898128e-01, 2.637546789748313e-01, + -9.641840639517458e-01, 2.652340302855118e-01, + -9.637760657954398e-01, 2.667127574748984e-01, + -9.633657997809540e-01, 2.681908570634032e-01, + -9.629532668736839e-01, 2.696683255729151e-01, + -9.625384680443592e-01, 2.711451595268080e-01, + -9.621214042690416e-01, 2.726213554499490e-01, + -9.617020765291225e-01, 2.740969098687064e-01, + -9.612804858113206e-01, 2.755718193109581e-01, + -9.608566331076797e-01, 2.770460803060999e-01, + -9.604305194155658e-01, 2.785196893850531e-01, + -9.600021457376660e-01, 2.799926430802732e-01, + -9.595715130819845e-01, 2.814649379257579e-01, + -9.591386224618419e-01, 2.829365704570554e-01, + -9.587034748958716e-01, 2.844075372112719e-01, + -9.582660714080177e-01, 2.858778347270806e-01, + -9.578264130275329e-01, 2.873474595447295e-01, + -9.573845007889759e-01, 2.888164082060495e-01, + -9.569403357322088e-01, 2.902846772544623e-01, + -9.564939189023951e-01, 2.917522632349893e-01, + -9.560452513499964e-01, 2.932191626942586e-01, + -9.555943341307711e-01, 2.946853721805143e-01, + -9.551411683057708e-01, 2.961508882436238e-01, + -9.546857549413383e-01, 2.976157074350862e-01, + -9.542280951091057e-01, 2.990798263080405e-01, + -9.537681898859903e-01, 3.005432414172735e-01, + -9.533060403541939e-01, 3.020059493192281e-01, + -9.528416476011987e-01, 3.034679465720113e-01, + -9.523750127197659e-01, 3.049292297354024e-01, + -9.519061368079323e-01, 3.063897953708609e-01, + -9.514350209690083e-01, 3.078496400415349e-01, + -9.509616663115751e-01, 3.093087603122687e-01, + -9.504860739494817e-01, 3.107671527496115e-01, + -9.500082450018430e-01, 3.122248139218249e-01, + -9.495281805930367e-01, 3.136817403988915e-01, + -9.490458818527006e-01, 3.151379287525224e-01, + -9.485613499157303e-01, 3.165933755561658e-01, + -9.480745859222762e-01, 3.180480773850149e-01, + -9.475855910177411e-01, 3.195020308160157e-01, + -9.470943663527772e-01, 3.209552324278752e-01, + -9.466009130832835e-01, 3.224076788010699e-01, + -9.461052323704034e-01, 3.238593665178529e-01, + -9.456073253805213e-01, 3.253102921622629e-01, + -9.451071932852606e-01, 3.267604523201317e-01, + -9.446048372614803e-01, 3.282098435790925e-01, + -9.441002584912727e-01, 3.296584625285875e-01, + -9.435934581619604e-01, 3.311063057598764e-01, + -9.430844374660935e-01, 3.325533698660442e-01, + -9.425731976014469e-01, 3.339996514420094e-01, + -9.420597397710173e-01, 3.354451470845316e-01, + -9.415440651830208e-01, 3.368898533922201e-01, + -9.410261750508893e-01, 3.383337669655411e-01, + -9.405060705932683e-01, 3.397768844068269e-01, + -9.399837530340140e-01, 3.412192023202824e-01, + -9.394592236021899e-01, 3.426607173119944e-01, + -9.389324835320646e-01, 3.441014259899388e-01, + -9.384035340631081e-01, 3.455413249639891e-01, + -9.378723764399899e-01, 3.469804108459237e-01, + -9.373390119125750e-01, 3.484186802494346e-01, + -9.368034417359216e-01, 3.498561297901349e-01, + -9.362656671702783e-01, 3.512927560855671e-01, + -9.357256894810804e-01, 3.527285557552107e-01, + -9.351835099389476e-01, 3.541635254204903e-01, + -9.346391298196808e-01, 3.555976617047839e-01, + -9.340925504042590e-01, 3.570309612334300e-01, + -9.335437729788362e-01, 3.584634206337365e-01, + -9.329927988347390e-01, 3.598950365349881e-01, + -9.324396292684624e-01, 3.613258055684543e-01, + -9.318842655816681e-01, 3.627557243673972e-01, + -9.313267090811804e-01, 3.641847895670799e-01, + -9.307669610789837e-01, 3.656129978047739e-01, + -9.302050228922191e-01, 3.670403457197672e-01, + -9.296408958431813e-01, 3.684668299533723e-01, + -9.290745812593159e-01, 3.698924471489341e-01, + -9.285060804732156e-01, 3.713171939518375e-01, + -9.279353948226179e-01, 3.727410670095158e-01, + -9.273625256504011e-01, 3.741640629714579e-01, + -9.267874743045817e-01, 3.755861784892172e-01, + -9.262102421383114e-01, 3.770074102164183e-01, + -9.256308305098727e-01, 3.784277548087656e-01, + -9.250492407826776e-01, 3.798472089240512e-01, + -9.244654743252626e-01, 3.812657692221624e-01, + -9.238795325112867e-01, 3.826834323650898e-01, + -9.232914167195276e-01, 3.841001950169350e-01, + -9.227011283338786e-01, 3.855160538439188e-01, + -9.221086687433452e-01, 3.869310055143886e-01, + -9.215140393420420e-01, 3.883450466988262e-01, + -9.209172415291895e-01, 3.897581740698564e-01, + -9.203182767091106e-01, 3.911703843022539e-01, + -9.197171462912274e-01, 3.925816740729515e-01, + -9.191138516900578e-01, 3.939920400610481e-01, + -9.185083943252123e-01, 3.954014789478164e-01, + -9.179007756213905e-01, 3.968099874167103e-01, + -9.172909970083779e-01, 3.982175621533736e-01, + -9.166790599210427e-01, 3.996241998456468e-01, + -9.160649657993317e-01, 4.010298971835756e-01, + -9.154487160882678e-01, 4.024346508594184e-01, + -9.148303122379462e-01, 4.038384575676541e-01, + -9.142097557035307e-01, 4.052413140049899e-01, + -9.135870479452508e-01, 4.066432168703690e-01, + -9.129621904283982e-01, 4.080441628649787e-01, + -9.123351846233227e-01, 4.094441486922576e-01, + -9.117060320054299e-01, 4.108431710579039e-01, + -9.110747340551764e-01, 4.122412266698829e-01, + -9.104412922580672e-01, 4.136383122384345e-01, + -9.098057081046522e-01, 4.150344244760816e-01, + -9.091679830905224e-01, 4.164295600976372e-01, + -9.085281187163061e-01, 4.178237158202123e-01, + -9.078861164876663e-01, 4.192168883632239e-01, + -9.072419779152958e-01, 4.206090744484025e-01, + -9.065957045149153e-01, 4.220002707997997e-01, + -9.059472978072685e-01, 4.233904741437960e-01, + -9.052967593181188e-01, 4.247796812091088e-01, + -9.046440905782462e-01, 4.261678887267996e-01, + -9.039892931234433e-01, 4.275550934302821e-01, + -9.033323684945118e-01, 4.289412920553295e-01, + -9.026733182372588e-01, 4.303264813400826e-01, + -9.020121439024932e-01, 4.317106580250573e-01, + -9.013488470460220e-01, 4.330938188531520e-01, + -9.006834292286470e-01, 4.344759605696557e-01, + -9.000158920161603e-01, 4.358570799222555e-01, + -8.993462369793416e-01, 4.372371736610441e-01, + -8.986744656939538e-01, 4.386162385385277e-01, + -8.980005797407399e-01, 4.399942713096333e-01, + -8.973245807054183e-01, 4.413712687317167e-01, + -8.966464701786802e-01, 4.427472275645700e-01, + -8.959662497561852e-01, 4.441221445704292e-01, + -8.952839210385576e-01, 4.454960165139817e-01, + -8.945994856313827e-01, 4.468688401623742e-01, + -8.939129451452033e-01, 4.482406122852199e-01, + -8.932243011955153e-01, 4.496113296546065e-01, + -8.925335554027646e-01, 4.509809890451039e-01, + -8.918407093923427e-01, 4.523495872337709e-01, + -8.911457647945832e-01, 4.537171210001639e-01, + -8.904487232447579e-01, 4.550835871263438e-01, + -8.897495863830728e-01, 4.564489823968839e-01, + -8.890483558546646e-01, 4.578133035988772e-01, + -8.883450333095964e-01, 4.591765475219441e-01, + -8.876396204028539e-01, 4.605387109582400e-01, + -8.869321187943422e-01, 4.618997907024627e-01, + -8.862225301488806e-01, 4.632597835518601e-01, + -8.855108561362000e-01, 4.646186863062378e-01, + -8.847970984309378e-01, 4.659764957679662e-01, + -8.840812587126350e-01, 4.673332087419884e-01, + -8.833633386657316e-01, 4.686888220358279e-01, + -8.826433399795628e-01, 4.700433324595956e-01, + -8.819212643483550e-01, 4.713967368259976e-01, + -8.811971134712221e-01, 4.727490319503428e-01, + -8.804708890521608e-01, 4.741002146505500e-01, + -8.797425928000474e-01, 4.754502817471559e-01, + -8.790122264286335e-01, 4.767992300633221e-01, + -8.782797916565416e-01, 4.781470564248430e-01, + -8.775452902072614e-01, 4.794937576601530e-01, + -8.768087238091457e-01, 4.808393306003340e-01, + -8.760700941954066e-01, 4.821837720791227e-01, + -8.753294031041109e-01, 4.835270789329187e-01, + -8.745866522781761e-01, 4.848692480007911e-01, + -8.738418434653669e-01, 4.862102761244864e-01, + -8.730949784182901e-01, 4.875501601484360e-01, + -8.723460588943915e-01, 4.888888969197632e-01, + -8.715950866559510e-01, 4.902264832882912e-01, + -8.708420634700790e-01, 4.915629161065499e-01, + -8.700869911087115e-01, 4.928981922297840e-01, + -8.693298713486068e-01, 4.942323085159597e-01, + -8.685707059713409e-01, 4.955652618257725e-01, + -8.678094967633033e-01, 4.968970490226545e-01, + -8.670462455156926e-01, 4.982276669727819e-01, + -8.662809540245130e-01, 4.995571125450818e-01, + -8.655136240905691e-01, 5.008853826112407e-01, + -8.647442575194624e-01, 5.022124740457108e-01, + -8.639728561215868e-01, 5.035383837257176e-01, + -8.631994217121242e-01, 5.048631085312676e-01, + -8.624239561110406e-01, 5.061866453451552e-01, + -8.616464611430813e-01, 5.075089910529709e-01, + -8.608669386377673e-01, 5.088301425431070e-01, + -8.600853904293901e-01, 5.101500967067668e-01, + -8.593018183570085e-01, 5.114688504379703e-01, + -8.585162242644427e-01, 5.127864006335630e-01, + -8.577286100002721e-01, 5.141027441932217e-01, + -8.569389774178288e-01, 5.154178780194629e-01, + -8.561473283751945e-01, 5.167317990176499e-01, + -8.553536647351960e-01, 5.180445040959993e-01, + -8.545579883654005e-01, 5.193559901655896e-01, + -8.537603011381114e-01, 5.206662541403672e-01, + -8.529606049303636e-01, 5.219752929371544e-01, + -8.521589016239198e-01, 5.232831034756564e-01, + -8.513551931052652e-01, 5.245896826784690e-01, + -8.505494812656035e-01, 5.258950274710846e-01, + -8.497417680008525e-01, 5.271991347819013e-01, + -8.489320552116396e-01, 5.285020015422285e-01, + -8.481203448032972e-01, 5.298036246862946e-01, + -8.473066386858583e-01, 5.311040011512550e-01, + -8.464909387740521e-01, 5.324031278771979e-01, + -8.456732469872991e-01, 5.337010018071530e-01, + -8.448535652497071e-01, 5.349976198870972e-01, + -8.440318954900664e-01, 5.362929790659632e-01, + -8.432082396418454e-01, 5.375870762956454e-01, + -8.423825996431858e-01, 5.388799085310084e-01, + -8.415549774368984e-01, 5.401714727298929e-01, + -8.407253749704581e-01, 5.414617658531234e-01, + -8.398937941959995e-01, 5.427507848645159e-01, + -8.390602370703127e-01, 5.440385267308838e-01, + -8.382247055548381e-01, 5.453249884220465e-01, + -8.373872016156619e-01, 5.466101669108349e-01, + -8.365477272235120e-01, 5.478940591731002e-01, + -8.357062843537526e-01, 5.491766621877197e-01, + -8.348628749863800e-01, 5.504579729366048e-01, + -8.340175011060181e-01, 5.517379884047073e-01, + -8.331701647019132e-01, 5.530167055800275e-01, + -8.323208677679297e-01, 5.542941214536200e-01, + -8.314696123025452e-01, 5.555702330196022e-01, + -8.306164003088463e-01, 5.568450372751601e-01, + -8.297612337945230e-01, 5.581185312205561e-01, + -8.289041147718649e-01, 5.593907118591361e-01, + -8.280450452577558e-01, 5.606615761973360e-01, + -8.271840272736691e-01, 5.619311212446895e-01, + -8.263210628456635e-01, 5.631993440138341e-01, + -8.254561540043776e-01, 5.644662415205195e-01, + -8.245893027850253e-01, 5.657318107836131e-01, + -8.237205112273914e-01, 5.669960488251087e-01, + -8.228497813758264e-01, 5.682589526701315e-01, + -8.219771152792416e-01, 5.695205193469471e-01, + -8.211025149911046e-01, 5.707807458869673e-01, + -8.202259825694347e-01, 5.720396293247570e-01, + -8.193475200767969e-01, 5.732971666980422e-01, + -8.184671295802987e-01, 5.745533550477158e-01, + -8.175848131515837e-01, 5.758081914178453e-01, + -8.167005728668278e-01, 5.770616728556794e-01, + -8.158144108067338e-01, 5.783137964116556e-01, + -8.149263290565266e-01, 5.795645591394056e-01, + -8.140363297059484e-01, 5.808139580957645e-01, + -8.131444148492536e-01, 5.820619903407754e-01, + -8.122505865852039e-01, 5.833086529376983e-01, + -8.113548470170637e-01, 5.845539429530153e-01, + -8.104571982525948e-01, 5.857978574564389e-01, + -8.095576424040513e-01, 5.870403935209180e-01, + -8.086561815881750e-01, 5.882815482226452e-01, + -8.077528179261904e-01, 5.895213186410639e-01, + -8.068475535437993e-01, 5.907597018588742e-01, + -8.059403905711763e-01, 5.919966949620410e-01, + -8.050313311429637e-01, 5.932322950397998e-01, + -8.041203773982658e-01, 5.944664991846644e-01, + -8.032075314806449e-01, 5.956993044924334e-01, + -8.022927955381157e-01, 5.969307080621965e-01, + -8.013761717231402e-01, 5.981607069963423e-01, + -8.004576621926228e-01, 5.993892984005645e-01, + -7.995372691079050e-01, 6.006164793838690e-01, + -7.986149946347608e-01, 6.018422470585800e-01, + -7.976908409433912e-01, 6.030665985403482e-01, + -7.967648102084188e-01, 6.042895309481560e-01, + -7.958369046088836e-01, 6.055110414043255e-01, + -7.949071263282370e-01, 6.067311270345245e-01, + -7.939754775543372e-01, 6.079497849677736e-01, + -7.930419604794436e-01, 6.091670123364532e-01, + -7.921065773002124e-01, 6.103828062763095e-01, + -7.911693302176902e-01, 6.115971639264619e-01, + -7.902302214373100e-01, 6.128100824294097e-01, + -7.892892531688857e-01, 6.140215589310384e-01, + -7.883464276266063e-01, 6.152315905806268e-01, + -7.874017470290314e-01, 6.164401745308536e-01, + -7.864552135990858e-01, 6.176473079378039e-01, + -7.855068295640539e-01, 6.188529879609763e-01, + -7.845565971555752e-01, 6.200572117632891e-01, + -7.836045186096382e-01, 6.212599765110876e-01, + -7.826505961665757e-01, 6.224612793741500e-01, + -7.816948320710594e-01, 6.236611175256945e-01, + -7.807372285720945e-01, 6.248594881423863e-01, + -7.797777879230146e-01, 6.260563884043435e-01, + -7.788165123814760e-01, 6.272518154951441e-01, + -7.778534042094531e-01, 6.284457666018327e-01, + -7.768884656732324e-01, 6.296382389149270e-01, + -7.759216990434077e-01, 6.308292296284245e-01, + -7.749531065948739e-01, 6.320187359398091e-01, + -7.739826906068229e-01, 6.332067550500572e-01, + -7.730104533627370e-01, 6.343932841636455e-01, + -7.720363971503845e-01, 6.355783204885561e-01, + -7.710605242618138e-01, 6.367618612362842e-01, + -7.700828369933479e-01, 6.379439036218440e-01, + -7.691033376455797e-01, 6.391244448637757e-01, + -7.681220285233654e-01, 6.403034821841517e-01, + -7.671389119358204e-01, 6.414810128085832e-01, + -7.661539901963129e-01, 6.426570339662269e-01, + -7.651672656224590e-01, 6.438315428897914e-01, + -7.641787405361167e-01, 6.450045368155439e-01, + -7.631884172633813e-01, 6.461760129833163e-01, + -7.621962981345789e-01, 6.473459686365121e-01, + -7.612023854842618e-01, 6.485144010221124e-01, + -7.602066816512024e-01, 6.496813073906832e-01, + -7.592091889783881e-01, 6.508466849963809e-01, + -7.582099098130153e-01, 6.520105310969595e-01, + -7.572088465064846e-01, 6.531728429537768e-01, + -7.562060014143945e-01, 6.543336178318004e-01, + -7.552013768965365e-01, 6.554928529996153e-01, + -7.541949753168892e-01, 6.566505457294289e-01, + -7.531867990436125e-01, 6.578066932970786e-01, + -7.521768504490428e-01, 6.589612929820373e-01, + -7.511651319096865e-01, 6.601143420674205e-01, + -7.501516458062151e-01, 6.612658378399923e-01, + -7.491363945234594e-01, 6.624157775901718e-01, + -7.481193804504036e-01, 6.635641586120398e-01, + -7.471006059801801e-01, 6.647109782033448e-01, + -7.460800735100638e-01, 6.658562336655097e-01, + -7.450577854414661e-01, 6.669999223036375e-01, + -7.440337441799293e-01, 6.681420414265185e-01, + -7.430079521351217e-01, 6.692825883466360e-01, + -7.419804117208311e-01, 6.704215603801731e-01, + -7.409511253549591e-01, 6.715589548470183e-01, + -7.399200954595162e-01, 6.726947690707729e-01, + -7.388873244606151e-01, 6.738290003787560e-01, + -7.378528147884660e-01, 6.749616461020119e-01, + -7.368165688773699e-01, 6.760927035753159e-01, + -7.357785891657136e-01, 6.772221701371803e-01, + -7.347388780959635e-01, 6.783500431298615e-01, + -7.336974381146604e-01, 6.794763198993650e-01, + -7.326542716724128e-01, 6.806009977954530e-01, + -7.316093812238926e-01, 6.817240741716497e-01, + -7.305627692278276e-01, 6.828455463852481e-01, + -7.295144381469970e-01, 6.839654117973154e-01, + -7.284643904482252e-01, 6.850836677727004e-01, + -7.274126286023758e-01, 6.862003116800386e-01, + -7.263591550843460e-01, 6.873153408917590e-01, + -7.253039723730608e-01, 6.884287527840904e-01, + -7.242470829514670e-01, 6.895405447370668e-01, + -7.231884893065275e-01, 6.906507141345346e-01, + -7.221281939292153e-01, 6.917592583641577e-01, + -7.210661993145081e-01, 6.928661748174246e-01, + -7.200025079613817e-01, 6.939714608896540e-01, + -7.189371223728045e-01, 6.950751139800009e-01, + -7.178700450557317e-01, 6.961771314914630e-01, + -7.168012785210995e-01, 6.972775108308865e-01, + -7.157308252838186e-01, 6.983762494089729e-01, + -7.146586878627691e-01, 6.994733446402838e-01, + -7.135848687807936e-01, 7.005687939432483e-01, + -7.125093705646923e-01, 7.016625947401685e-01, + -7.114321957452164e-01, 7.027547444572253e-01, + -7.103533468570624e-01, 7.038452405244849e-01, + -7.092728264388657e-01, 7.049340803759049e-01, + -7.081906370331954e-01, 7.060212614493397e-01, + -7.071067811865476e-01, 7.071067811865475e-01, +#else +#error Unsupported twiddle table size +#endif +}; diff --git a/media/openmax_dl/dl/sp/src/armSP_FFT_S32TwiddleTable.c b/media/openmax_dl/dl/sp/src/armSP_FFT_S32TwiddleTable.c new file mode 100644 index 0000000000..a0db0575b5 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/armSP_FFT_S32TwiddleTable.c @@ -0,0 +1,556 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + * + * This file was originally licensed as follows. It has been + * relicensed with permission from the copyright holders. + */ + +/** + * + * File Name: armSP_FFT_S32TwiddleTable.c + * OpenMAX DL: v1.0.2 + * Last Modified Revision: 6781 + * Last Modified Date: Wed, 25 Jul 2007 + * + * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. + * + * + * + * Description: + * Twiddle table for Forward FFT in Q31 format. + * It contains complex pairs [-cos (W * i), -sin (W * i)] where W = -2*PI/N + * and 0<= i<= N/8. N is the max size of the FFT. Here N = 2^12. + * Values for N/8 < i < N are generated in the FFTInit function using the + * symmetries of cos and sine. + * + * NOTE: The values are stored negated. This is to represent '1' which cannot be otherwise + * represented as Q31 in 32 bits. +**/ + +#include "dl/api/omxtypes.h" + + +const OMX_S32 armSP_FFT_S32TwiddleTable[1026] ={ + +0x80000000, 0x0, +0x800009df, 0x3243f5, +0x8000277a, 0x6487e3, +0x800058d4, 0x96cbc1, +0x80009dea, 0xc90f88, +0x8000f6bd, 0xfb5330, +0x8001634e, 0x12d96b1, +0x8001e39b, 0x15fda03, +0x800277a6, 0x1921d20, +0x80031f6d, 0x1c45ffe, +0x8003daf1, 0x1f6a297, +0x8004aa32, 0x228e4e2, +0x80058d2f, 0x25b26d7, +0x800683e8, 0x28d6870, +0x80078e5e, 0x2bfa9a4, +0x8008ac90, 0x2f1ea6c, +0x8009de7e, 0x3242abf, +0x800b2427, 0x3566a96, +0x800c7d8c, 0x388a9ea, +0x800deaad, 0x3bae8b2, +0x800f6b88, 0x3ed26e6, +0x8011001f, 0x41f6480, +0x8012a86f, 0x451a177, +0x8014647b, 0x483ddc3, +0x80163440, 0x4b6195d, +0x801817bf, 0x4e8543e, +0x801a0ef8, 0x51a8e5c, +0x801c19ea, 0x54cc7b1, +0x801e3895, 0x57f0035, +0x80206af8, 0x5b137df, +0x8022b114, 0x5e36ea9, +0x80250ae7, 0x615a48b, +0x80277872, 0x647d97c, +0x8029f9b4, 0x67a0d76, +0x802c8ead, 0x6ac406f, +0x802f375d, 0x6de7262, +0x8031f3c2, 0x710a345, +0x8034c3dd, 0x742d311, +0x8037a7ac, 0x77501be, +0x803a9f31, 0x7a72f45, +0x803daa6a, 0x7d95b9e, +0x8040c956, 0x80b86c2, +0x8043fbf6, 0x83db0a7, +0x80474248, 0x86fd947, +0x804a9c4d, 0x8a2009a, +0x804e0a04, 0x8d42699, +0x80518b6b, 0x9064b3a, +0x80552084, 0x9386e78, +0x8058c94c, 0x96a9049, +0x805c85c4, 0x99cb0a7, +0x806055eb, 0x9cecf89, +0x806439c0, 0xa00ece8, +0x80683143, 0xa3308bd, +0x806c3c74, 0xa6522fe, +0x80705b50, 0xa973ba5, +0x80748dd9, 0xac952aa, +0x8078d40d, 0xafb6805, +0x807d2dec, 0xb2d7baf, +0x80819b74, 0xb5f8d9f, +0x80861ca6, 0xb919dcf, +0x808ab180, 0xbc3ac35, +0x808f5a02, 0xbf5b8cb, +0x8094162c, 0xc27c389, +0x8098e5fb, 0xc59cc68, +0x809dc971, 0xc8bd35e, +0x80a2c08b, 0xcbdd865, +0x80a7cb49, 0xcefdb76, +0x80ace9ab, 0xd21dc87, +0x80b21baf, 0xd53db92, +0x80b76156, 0xd85d88f, +0x80bcba9d, 0xdb7d376, +0x80c22784, 0xde9cc40, +0x80c7a80a, 0xe1bc2e4, +0x80cd3c2f, 0xe4db75b, +0x80d2e3f2, 0xe7fa99e, +0x80d89f51, 0xeb199a4, +0x80de6e4c, 0xee38766, +0x80e450e2, 0xf1572dc, +0x80ea4712, 0xf475bff, +0x80f050db, 0xf7942c7, +0x80f66e3c, 0xfab272b, +0x80fc9f35, 0xfdd0926, +0x8102e3c4, 0x100ee8ad, +0x81093be8, 0x1040c5bb, +0x810fa7a0, 0x1072a048, +0x811626ec, 0x10a4784b, +0x811cb9ca, 0x10d64dbd, +0x8123603a, 0x11082096, +0x812a1a3a, 0x1139f0cf, +0x8130e7c9, 0x116bbe60, +0x8137c8e6, 0x119d8941, +0x813ebd90, 0x11cf516a, +0x8145c5c7, 0x120116d5, +0x814ce188, 0x1232d979, +0x815410d4, 0x1264994e, +0x815b53a8, 0x1296564d, +0x8162aa04, 0x12c8106f, +0x816a13e6, 0x12f9c7aa, +0x8171914e, 0x132b7bf9, +0x8179223a, 0x135d2d53, +0x8180c6a9, 0x138edbb1, +0x81887e9a, 0x13c0870a, +0x81904a0c, 0x13f22f58, +0x819828fd, 0x1423d492, +0x81a01b6d, 0x145576b1, +0x81a82159, 0x148715ae, +0x81b03ac2, 0x14b8b17f, +0x81b867a5, 0x14ea4a1f, +0x81c0a801, 0x151bdf86, +0x81c8fbd6, 0x154d71aa, +0x81d16321, 0x157f0086, +0x81d9dde1, 0x15b08c12, +0x81e26c16, 0x15e21445, +0x81eb0dbe, 0x16139918, +0x81f3c2d7, 0x16451a83, +0x81fc8b60, 0x1676987f, +0x82056758, 0x16a81305, +0x820e56be, 0x16d98a0c, +0x82175990, 0x170afd8d, +0x82206fcc, 0x173c6d80, +0x82299971, 0x176dd9de, +0x8232d67f, 0x179f429f, +0x823c26f3, 0x17d0a7bc, +0x82458acc, 0x1802092c, +0x824f0208, 0x183366e9, +0x82588ca7, 0x1864c0ea, +0x82622aa6, 0x18961728, +0x826bdc04, 0x18c7699b, +0x8275a0c0, 0x18f8b83c, +0x827f78d8, 0x192a0304, +0x8289644b, 0x195b49ea, +0x82936317, 0x198c8ce7, +0x829d753a, 0x19bdcbf3, +0x82a79ab3, 0x19ef0707, +0x82b1d381, 0x1a203e1b, +0x82bc1fa2, 0x1a517128, +0x82c67f14, 0x1a82a026, +0x82d0f1d5, 0x1ab3cb0d, +0x82db77e5, 0x1ae4f1d6, +0x82e61141, 0x1b161479, +0x82f0bde8, 0x1b4732ef, +0x82fb7dd8, 0x1b784d30, +0x83065110, 0x1ba96335, +0x8311378d, 0x1bda74f6, +0x831c314e, 0x1c0b826a, +0x83273e52, 0x1c3c8b8c, +0x83325e97, 0x1c6d9053, +0x833d921b, 0x1c9e90b8, +0x8348d8dc, 0x1ccf8cb3, +0x835432d8, 0x1d00843d, +0x835fa00f, 0x1d31774d, +0x836b207d, 0x1d6265dd, +0x8376b422, 0x1d934fe5, +0x83825afb, 0x1dc4355e, +0x838e1507, 0x1df5163f, +0x8399e244, 0x1e25f282, +0x83a5c2b0, 0x1e56ca1e, +0x83b1b649, 0x1e879d0d, +0x83bdbd0e, 0x1eb86b46, +0x83c9d6fc, 0x1ee934c3, +0x83d60412, 0x1f19f97b, +0x83e2444d, 0x1f4ab968, +0x83ee97ad, 0x1f7b7481, +0x83fafe2e, 0x1fac2abf, +0x840777d0, 0x1fdcdc1b, +0x84140490, 0x200d888d, +0x8420a46c, 0x203e300d, +0x842d5762, 0x206ed295, +0x843a1d70, 0x209f701c, +0x8446f695, 0x20d0089c, +0x8453e2cf, 0x21009c0c, +0x8460e21a, 0x21312a65, +0x846df477, 0x2161b3a0, +0x847b19e1, 0x219237b5, +0x84885258, 0x21c2b69c, +0x84959dd9, 0x21f3304f, +0x84a2fc62, 0x2223a4c5, +0x84b06df2, 0x225413f8, +0x84bdf286, 0x22847de0, +0x84cb8a1b, 0x22b4e274, +0x84d934b1, 0x22e541af, +0x84e6f244, 0x23159b88, +0x84f4c2d4, 0x2345eff8, +0x8502a65c, 0x23763ef7, +0x85109cdd, 0x23a6887f, +0x851ea652, 0x23d6cc87, +0x852cc2bb, 0x24070b08, +0x853af214, 0x243743fa, +0x8549345c, 0x24677758, +0x85578991, 0x2497a517, +0x8565f1b0, 0x24c7cd33, +0x85746cb8, 0x24f7efa2, +0x8582faa5, 0x25280c5e, +0x85919b76, 0x2558235f, +0x85a04f28, 0x2588349d, +0x85af15b9, 0x25b84012, +0x85bdef28, 0x25e845b6, +0x85ccdb70, 0x26184581, +0x85dbda91, 0x26483f6c, +0x85eaec88, 0x26783370, +0x85fa1153, 0x26a82186, +0x860948ef, 0x26d809a5, +0x86189359, 0x2707ebc7, +0x8627f091, 0x2737c7e3, +0x86376092, 0x27679df4, +0x8646e35c, 0x27976df1, +0x865678eb, 0x27c737d3, +0x8666213c, 0x27f6fb92, +0x8675dc4f, 0x2826b928, +0x8685aa20, 0x2856708d, +0x86958aac, 0x288621b9, +0x86a57df2, 0x28b5cca5, +0x86b583ee, 0x28e5714b, +0x86c59c9f, 0x29150fa1, +0x86d5c802, 0x2944a7a2, +0x86e60614, 0x29743946, +0x86f656d3, 0x29a3c485, +0x8706ba3d, 0x29d34958, +0x8717304e, 0x2a02c7b8, +0x8727b905, 0x2a323f9e, +0x8738545e, 0x2a61b101, +0x87490258, 0x2a911bdc, +0x8759c2ef, 0x2ac08026, +0x876a9621, 0x2aefddd8, +0x877b7bec, 0x2b1f34eb, +0x878c744d, 0x2b4e8558, +0x879d7f41, 0x2b7dcf17, +0x87ae9cc5, 0x2bad1221, +0x87bfccd7, 0x2bdc4e6f, +0x87d10f75, 0x2c0b83fa, +0x87e2649b, 0x2c3ab2b9, +0x87f3cc48, 0x2c69daa6, +0x88054677, 0x2c98fbba, +0x8816d327, 0x2cc815ee, +0x88287256, 0x2cf72939, +0x883a23ff, 0x2d263596, +0x884be821, 0x2d553afc, +0x885dbeb8, 0x2d843964, +0x886fa7c2, 0x2db330c7, +0x8881a33d, 0x2de2211e, +0x8893b125, 0x2e110a62, +0x88a5d177, 0x2e3fec8b, +0x88b80432, 0x2e6ec792, +0x88ca4951, 0x2e9d9b70, +0x88dca0d3, 0x2ecc681e, +0x88ef0ab4, 0x2efb2d95, +0x890186f2, 0x2f29ebcc, +0x89141589, 0x2f58a2be, +0x8926b677, 0x2f875262, +0x893969b9, 0x2fb5fab2, +0x894c2f4c, 0x2fe49ba7, +0x895f072e, 0x30133539, +0x8971f15a, 0x3041c761, +0x8984edcf, 0x30705217, +0x8997fc8a, 0x309ed556, +0x89ab1d87, 0x30cd5115, +0x89be50c3, 0x30fbc54d, +0x89d1963c, 0x312a31f8, +0x89e4edef, 0x3158970e, +0x89f857d8, 0x3186f487, +0x8a0bd3f5, 0x31b54a5e, +0x8a1f6243, 0x31e39889, +0x8a3302be, 0x3211df04, +0x8a46b564, 0x32401dc6, +0x8a5a7a31, 0x326e54c7, +0x8a6e5123, 0x329c8402, +0x8a823a36, 0x32caab6f, +0x8a963567, 0x32f8cb07, +0x8aaa42b4, 0x3326e2c3, +0x8abe6219, 0x3354f29b, +0x8ad29394, 0x3382fa88, +0x8ae6d720, 0x33b0fa84, +0x8afb2cbb, 0x33def287, +0x8b0f9462, 0x340ce28b, +0x8b240e11, 0x343aca87, +0x8b3899c6, 0x3468aa76, +0x8b4d377c, 0x34968250, +0x8b61e733, 0x34c4520d, +0x8b76a8e4, 0x34f219a8, +0x8b8b7c8f, 0x351fd918, +0x8ba0622f, 0x354d9057, +0x8bb559c1, 0x357b3f5d, +0x8bca6343, 0x35a8e625, +0x8bdf7eb0, 0x35d684a6, +0x8bf4ac05, 0x36041ad9, +0x8c09eb40, 0x3631a8b8, +0x8c1f3c5d, 0x365f2e3b, +0x8c349f58, 0x368cab5c, +0x8c4a142f, 0x36ba2014, +0x8c5f9ade, 0x36e78c5b, +0x8c753362, 0x3714f02a, +0x8c8addb7, 0x37424b7b, +0x8ca099da, 0x376f9e46, +0x8cb667c8, 0x379ce885, +0x8ccc477d, 0x37ca2a30, +0x8ce238f6, 0x37f76341, +0x8cf83c30, 0x382493b0, +0x8d0e5127, 0x3851bb77, +0x8d2477d8, 0x387eda8e, +0x8d3ab03f, 0x38abf0ef, +0x8d50fa59, 0x38d8fe93, +0x8d675623, 0x39060373, +0x8d7dc399, 0x3932ff87, +0x8d9442b8, 0x395ff2c9, +0x8daad37b, 0x398cdd32, +0x8dc175e0, 0x39b9bebc, +0x8dd829e4, 0x39e6975e, +0x8deeef82, 0x3a136712, +0x8e05c6b7, 0x3a402dd2, +0x8e1caf80, 0x3a6ceb96, +0x8e33a9da, 0x3a99a057, +0x8e4ab5bf, 0x3ac64c0f, +0x8e61d32e, 0x3af2eeb7, +0x8e790222, 0x3b1f8848, +0x8e904298, 0x3b4c18ba, +0x8ea7948c, 0x3b78a007, +0x8ebef7fb, 0x3ba51e29, +0x8ed66ce1, 0x3bd19318, +0x8eedf33b, 0x3bfdfecd, +0x8f058b04, 0x3c2a6142, +0x8f1d343a, 0x3c56ba70, +0x8f34eed8, 0x3c830a50, +0x8f4cbadb, 0x3caf50da, +0x8f649840, 0x3cdb8e09, +0x8f7c8701, 0x3d07c1d6, +0x8f94871d, 0x3d33ec39, +0x8fac988f, 0x3d600d2c, +0x8fc4bb53, 0x3d8c24a8, +0x8fdcef66, 0x3db832a6, +0x8ff534c4, 0x3de4371f, +0x900d8b69, 0x3e10320d, +0x9025f352, 0x3e3c2369, +0x903e6c7b, 0x3e680b2c, +0x9056f6df, 0x3e93e950, +0x906f927c, 0x3ebfbdcd, +0x90883f4d, 0x3eeb889c, +0x90a0fd4e, 0x3f1749b8, +0x90b9cc7d, 0x3f430119, +0x90d2acd4, 0x3f6eaeb8, +0x90eb9e50, 0x3f9a5290, +0x9104a0ee, 0x3fc5ec98, +0x911db4a9, 0x3ff17cca, +0x9136d97d, 0x401d0321, +0x91500f67, 0x40487f94, +0x91695663, 0x4073f21d, +0x9182ae6d, 0x409f5ab6, +0x919c1781, 0x40cab958, +0x91b5919a, 0x40f60dfb, +0x91cf1cb6, 0x4121589b, +0x91e8b8d0, 0x414c992f, +0x920265e4, 0x4177cfb1, +0x921c23ef, 0x41a2fc1a, +0x9235f2ec, 0x41ce1e65, +0x924fd2d7, 0x41f93689, +0x9269c3ac, 0x42244481, +0x9283c568, 0x424f4845, +0x929dd806, 0x427a41d0, +0x92b7fb82, 0x42a5311b, +0x92d22fd9, 0x42d0161e, +0x92ec7505, 0x42faf0d4, +0x9306cb04, 0x4325c135, +0x932131d1, 0x4350873c, +0x933ba968, 0x437b42e1, +0x935631c5, 0x43a5f41e, +0x9370cae4, 0x43d09aed, +0x938b74c1, 0x43fb3746, +0x93a62f57, 0x4425c923, +0x93c0faa3, 0x4450507e, +0x93dbd6a0, 0x447acd50, +0x93f6c34a, 0x44a53f93, +0x9411c09e, 0x44cfa740, +0x942cce96, 0x44fa0450, +0x9447ed2f, 0x452456bd, +0x94631c65, 0x454e9e80, +0x947e5c33, 0x4578db93, +0x9499ac95, 0x45a30df0, +0x94b50d87, 0x45cd358f, +0x94d07f05, 0x45f7526b, +0x94ec010b, 0x4621647d, +0x95079394, 0x464b6bbe, +0x9523369c, 0x46756828, +0x953eea1e, 0x469f59b4, +0x955aae17, 0x46c9405c, +0x95768283, 0x46f31c1a, +0x9592675c, 0x471cece7, +0x95ae5c9f, 0x4746b2bc, +0x95ca6247, 0x47706d93, +0x95e67850, 0x479a1d67, +0x96029eb6, 0x47c3c22f, +0x961ed574, 0x47ed5be6, +0x963b1c86, 0x4816ea86, +0x965773e7, 0x48406e08, +0x9673db94, 0x4869e665, +0x96905388, 0x48935397, +0x96acdbbe, 0x48bcb599, +0x96c97432, 0x48e60c62, +0x96e61ce0, 0x490f57ee, +0x9702d5c3, 0x49389836, +0x971f9ed7, 0x4961cd33, +0x973c7817, 0x498af6df, +0x9759617f, 0x49b41533, +0x97765b0a, 0x49dd282a, +0x979364b5, 0x4a062fbd, +0x97b07e7a, 0x4a2f2be6, +0x97cda855, 0x4a581c9e, +0x97eae242, 0x4a8101de, +0x98082c3b, 0x4aa9dba2, +0x9825863d, 0x4ad2a9e2, +0x9842f043, 0x4afb6c98, +0x98606a49, 0x4b2423be, +0x987df449, 0x4b4ccf4d, +0x989b8e40, 0x4b756f40, +0x98b93828, 0x4b9e0390, +0x98d6f1fe, 0x4bc68c36, +0x98f4bbbc, 0x4bef092d, +0x9912955f, 0x4c177a6e, +0x99307ee0, 0x4c3fdff4, +0x994e783d, 0x4c6839b7, +0x996c816f, 0x4c9087b1, +0x998a9a74, 0x4cb8c9dd, +0x99a8c345, 0x4ce10034, +0x99c6fbde, 0x4d092ab0, +0x99e5443b, 0x4d31494b, +0x9a039c57, 0x4d595bfe, +0x9a22042d, 0x4d8162c4, +0x9a407bb9, 0x4da95d96, +0x9a5f02f5, 0x4dd14c6e, +0x9a7d99de, 0x4df92f46, +0x9a9c406e, 0x4e210617, +0x9abaf6a1, 0x4e48d0dd, +0x9ad9bc71, 0x4e708f8f, +0x9af891db, 0x4e984229, +0x9b1776da, 0x4ebfe8a5, +0x9b366b68, 0x4ee782fb, +0x9b556f81, 0x4f0f1126, +0x9b748320, 0x4f369320, +0x9b93a641, 0x4f5e08e3, +0x9bb2d8de, 0x4f857269, +0x9bd21af3, 0x4faccfab, +0x9bf16c7a, 0x4fd420a4, +0x9c10cd70, 0x4ffb654d, +0x9c303dcf, 0x50229da1, +0x9c4fbd93, 0x5049c999, +0x9c6f4cb6, 0x5070e92f, +0x9c8eeb34, 0x5097fc5e, +0x9cae9907, 0x50bf031f, +0x9cce562c, 0x50e5fd6d, +0x9cee229c, 0x510ceb40, +0x9d0dfe54, 0x5133cc94, +0x9d2de94d, 0x515aa162, +0x9d4de385, 0x518169a5, +0x9d6decf4, 0x51a82555, +0x9d8e0597, 0x51ced46e, +0x9dae2d68, 0x51f576ea, +0x9dce6463, 0x521c0cc2, +0x9deeaa82, 0x524295f0, +0x9e0effc1, 0x5269126e, +0x9e2f641b, 0x528f8238, +0x9e4fd78a, 0x52b5e546, +0x9e705a09, 0x52dc3b92, +0x9e90eb94, 0x53028518, +0x9eb18c26, 0x5328c1d0, +0x9ed23bb9, 0x534ef1b5, +0x9ef2fa49, 0x537514c2, +0x9f13c7d0, 0x539b2af0, +0x9f34a449, 0x53c13439, +0x9f558fb0, 0x53e73097, +0x9f7689ff, 0x540d2005, +0x9f979331, 0x5433027d, +0x9fb8ab41, 0x5458d7f9, +0x9fd9d22a, 0x547ea073, +0x9ffb07e7, 0x54a45be6, +0xa01c4c73, 0x54ca0a4b, +0xa03d9fc8, 0x54efab9c, +0xa05f01e1, 0x55153fd4, +0xa08072ba, 0x553ac6ee, +0xa0a1f24d, 0x556040e2, +0xa0c38095, 0x5585adad, +0xa0e51d8c, 0x55ab0d46, +0xa106c92f, 0x55d05faa, +0xa1288376, 0x55f5a4d2, +0xa14a4c5e, 0x561adcb9, +0xa16c23e1, 0x56400758, +0xa18e09fa, 0x566524aa, +0xa1affea3, 0x568a34a9, +0xa1d201d7, 0x56af3750, +0xa1f41392, 0x56d42c99, +0xa21633cd, 0x56f9147e, +0xa2386284, 0x571deefa, +0xa25a9fb1, 0x5742bc06, +0xa27ceb4f, 0x57677b9d, +0xa29f4559, 0x578c2dba, +0xa2c1adc9, 0x57b0d256, +0xa2e4249b, 0x57d5696d, +0xa306a9c8, 0x57f9f2f8, +0xa3293d4b, 0x581e6ef1, +0xa34bdf20, 0x5842dd54, +0xa36e8f41, 0x58673e1b, +0xa3914da8, 0x588b9140, +0xa3b41a50, 0x58afd6bd, +0xa3d6f534, 0x58d40e8c, +0xa3f9de4e, 0x58f838a9, +0xa41cd599, 0x591c550e, +0xa43fdb10, 0x594063b5, +0xa462eeac, 0x59646498, +0xa486106a, 0x598857b2, +0xa4a94043, 0x59ac3cfd, +0xa4cc7e32, 0x59d01475, +0xa4efca31, 0x59f3de12, +0xa513243b, 0x5a1799d1, +0xa5368c4b, 0x5a3b47ab, +0xa55a025b, 0x5a5ee79a, +0xa57d8666, 0x5a82799a +}; + +/*End of File*/ diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTFwd_CToC_FC32_Sfs_s.S b/media/openmax_dl/dl/sp/src/omxSP_FFTFwd_CToC_FC32_Sfs_s.S new file mode 100644 index 0000000000..da0c10f1f6 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTFwd_CToC_FC32_Sfs_s.S @@ -0,0 +1,192 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This is a modification of omxSP_FFTFwd_CToC_SC32_Sfs_s.s +@// to support float instead of SC32. +@// + +@// +@// Description: +@// Compute an inverse FFT for a complex signal +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + +@// Import symbols required from other files +@// (For example tables) + + .extern armSP_FFTFwd_CToC_FC32_Radix2_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_FC32_Radix4_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_FC32_Radix8_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_FC32_Radix4_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_FC32_Radix2_OutOfPlace_unsafe + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + @// Guarding implementation by the processor name + +@// Import symbols required from other files +@// (For example tables) + .extern armSP_FFTFwd_CToC_FC32_Radix2_ls_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_FC32_Sfs_Radix2_ls_OutOfPlace_unsafe + + +@//Input Registers + +#define pSrc r0 +#define pDst r1 +#define pFFTSpec r2 + + +@// Output registers +#define result r0 + +@//Local Scratch Registers + +#define argTwiddle r1 +#define argDst r2 +#define argScale r4 +#define tmpOrder r4 +#define pTwiddle r4 +#define pOut r5 +#define subFFTSize r7 +#define subFFTNum r6 +#define N r6 +#define order r14 +#define diff r9 +@// Total num of radix stages required to comple the FFT +#define count r8 +#define x0r r4 +#define x0i r5 +#define diffMinusOne r2 + +@// Neon registers + +#define dX0 D0.F32 + + + @// Allocate stack memory required by the function + + @// Write function header + M_START omxSP_FFTFwd_CToC_FC32_Sfs,r11,d15 + +@ Structure offsets for the FFTSpec + .set ARMsFFTSpec_N, 0 + .set ARMsFFTSpec_pBitRev, 4 + .set ARMsFFTSpec_pTwiddle, 8 + .set ARMsFFTSpec_pBuf, 12 + + @// Define stack arguments + + @// Read the size from structure and take log + LDR N, [pFFTSpec, #ARMsFFTSpec_N] + + @// Read other structure parameters + LDR pTwiddle, [pFFTSpec, #ARMsFFTSpec_pTwiddle] + LDR pOut, [pFFTSpec, #ARMsFFTSpec_pBuf] + + CLZ order,N @// N = 2^order + RSB order,order,#31 + MOV subFFTSize,#1 + @//MOV subFFTNum,N + + CMP order,#3 + BGT orderGreaterthan3 @// order > 3 + + CMP order,#1 + BGE orderGreaterthan0 @// order > 0 + VLD1 dX0,[pSrc] + VST1 dX0,[pDst] + MOV pSrc,pDst + BLT FFTEnd + +orderGreaterthan0: + @// set the buffers appropriately for various orders + CMP order,#2 + MOVNE argDst,pDst + MOVEQ argDst,pOut + @// Pass the first stage destination in RN5 + MOVEQ pOut,pDst + MOV argTwiddle,pTwiddle + + CMP order,#1 + BGT orderGreaterthan1 + @// order = 1 + BL armSP_FFTFwd_CToC_FC32_Radix2_fs_OutOfPlace_unsafe + B FFTEnd + +orderGreaterthan1: + CMP order,#2 + BGT orderGreaterthan2 + @// order = 2 + BL armSP_FFTFwd_CToC_FC32_Radix2_fs_OutOfPlace_unsafe + BL armSP_FFTFwd_CToC_FC32_Radix2_ls_OutOfPlace_unsafe + B FFTEnd + +orderGreaterthan2: @// order =3 + BL armSP_FFTFwd_CToC_FC32_Radix2_fs_OutOfPlace_unsafe + BL armSP_FFTFwd_CToC_FC32_Radix2_OutOfPlace_unsafe + BL armSP_FFTFwd_CToC_FC32_Radix2_ls_OutOfPlace_unsafe + B FFTEnd + +orderGreaterthan3: + @// Set input args to fft stages + TST order, #2 + MOVNE argDst,pDst + MOVEQ argDst,pOut + @// Pass the first stage destination in RN5 + MOVEQ pOut,pDst + MOV argTwiddle,pTwiddle + + @//check for even or odd order + @// NOTE: The following combination of BL's would work fine even though + @// the first BL would corrupt the flags. This is because the end of + @// the "grpZeroSetLoop" loop inside + @// armSP_FFTFwd_CToC_FC32_Radix4_fs_OutOfPlace_unsafe sets the Z flag + @// to EQ + + TST order,#0x00000001 + BLEQ armSP_FFTFwd_CToC_FC32_Radix4_fs_OutOfPlace_unsafe + BLNE armSP_FFTFwd_CToC_FC32_Radix8_fs_OutOfPlace_unsafe + + CMP subFFTNum,#4 + BLT FFTEnd + + +unscaledRadix4Loop: + BEQ lastStageUnscaledRadix4 + BL armSP_FFTFwd_CToC_FC32_Radix4_OutOfPlace_unsafe + CMP subFFTNum,#4 + B unscaledRadix4Loop + +lastStageUnscaledRadix4: + BL armSP_FFTFwd_CToC_FC32_Radix4_ls_OutOfPlace_unsafe + B FFTEnd + +FFTEnd: + + @// Set return value + MOV result, #OMX_Sts_NoErr + + @// Write function tail + M_END + + .end diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTFwd_CToC_SC16_Sfs_s.S b/media/openmax_dl/dl/sp/src/omxSP_FFTFwd_CToC_SC16_Sfs_s.S new file mode 100644 index 0000000000..ca15c6b06c --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTFwd_CToC_SC16_Sfs_s.S @@ -0,0 +1,356 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. + +@// +@// +@// File Name: omxSP_FFTFwd_CToC_SC16_Sfs_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 6729 +@// Last Modified Date: Tue, 17 Jul 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute an inverse FFT for a complex signal +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + .extern armSP_FFTFwd_CToC_SC16_Sfs_Radix2_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC16_Radix2_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC16_Radix4_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC16_Radix4_ls_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC16_Radix8_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC16_Radix4_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC16_Sfs_Radix4_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC16_Sfs_Radix4_ls_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC16_Sfs_Radix8_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC16_Sfs_Radix4_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC16_Sfs_Radix2_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC16_Radix2_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC16_Sfs_Radix2_ls_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC16_Radix2_ls_OutOfPlace_unsafe + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + +@// Guarding implementation by the processor name + + + .extern armSP_FFTFwd_CToC_SC16_Radix2_ps_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC16_Sfs_Radix2_ps_OutOfPlace_unsafe + +@//Input Registers + +#define pSrc r0 +#define pDst r1 +#define pFFTSpec r2 +#define scale r3 + + +@// Output registers +#define result r0 + +@//Local Scratch Registers +#define argTwiddle r1 +#define argDst r2 +#define argScale r4 +#define pTwiddle r4 +#define tmpOrder r4 +#define pOut r5 +#define subFFTSize r7 +#define subFFTNum r6 +#define N r6 +#define order r14 +#define diff r9 +@// Total num of radix stages required to comple the FFT +#define count r8 +#define x0r r4 +#define x0i r5 +#define diffMinusOne r2 +#define round r3 + +@// Neon registers + +#define dX0 D0.S16 +#define dShift D1.S16 +#define dX0S32 D0.S32 + + + + @// Allocate stack memory required by the function + M_ALLOC4 diffOnStack, 4 + + @// Write function header + M_START omxSP_FFTFwd_CToC_SC16_Sfs,r11,d15 + +@ Structure offsets for the FFTSpec + .set ARMsFFTSpec_N, 0 + .set ARMsFFTSpec_pBitRev, 4 + .set ARMsFFTSpec_pTwiddle, 8 + .set ARMsFFTSpec_pBuf, 12 + + @// Define stack arguments + + @// Read the size from structure and take log + LDR N, [pFFTSpec, #ARMsFFTSpec_N] + + @// Read other structure parameters + LDR pTwiddle, [pFFTSpec, #ARMsFFTSpec_pTwiddle] + LDR pOut, [pFFTSpec, #ARMsFFTSpec_pBuf] + + CLZ order,N @// N = 2^order + RSB order,order,#31 + MOV subFFTSize,#1 + @//MOV subFFTNum,N + + CMP order,#3 + BGT orderGreaterthan3 @// order > 3 + + CMP order,#1 + BGE orderGreaterthan0 @// order > 0 + M_STR scale, diffOnStack,LT @// order = 0 + LDRLT x0r,[pSrc] + STRLT x0r,[pDst] + MOVLT pSrc,pDst + BLT FFTEnd + +orderGreaterthan0: + @// set the buffers appropriately for various orders + CMP order,#2 + MOVNE argDst,pDst + MOVEQ argDst,pOut + MOVEQ pOut,pDst @// Pass the first stage destination in RN5 + MOV argTwiddle,pTwiddle + + SUBS diff,scale,order + M_STR diff,diffOnStack + MOVGT scale,order + @// Now scale <= order + + CMP order,#1 + BGT orderGreaterthan1 + SUBS scale,scale,#1 + BLEQ armSP_FFTFwd_CToC_SC16_Sfs_Radix2_fs_OutOfPlace_unsafe @// order = 1 + BLLT armSP_FFTFwd_CToC_SC16_Radix2_fs_OutOfPlace_unsafe @// order = 1 + B FFTEnd + +orderGreaterthan1: + CMP order,#2 + MOV argScale,scale + BGT orderGreaterthan2 + SUBS argScale,argScale,#1 + BLGE armSP_FFTFwd_CToC_SC16_Sfs_Radix2_fs_OutOfPlace_unsafe @// order =2 + BLLT armSP_FFTFwd_CToC_SC16_Radix2_fs_OutOfPlace_unsafe + SUBS argScale,argScale,#1 + BLEQ armSP_FFTFwd_CToC_SC16_Sfs_Radix2_ls_OutOfPlace_unsafe + BLLT armSP_FFTFwd_CToC_SC16_Radix2_ls_OutOfPlace_unsafe + B FFTEnd + +orderGreaterthan2: @// order =3 + SUBS argScale,argScale,#1 + BLGE armSP_FFTFwd_CToC_SC16_Sfs_Radix2_fs_OutOfPlace_unsafe + BLLT armSP_FFTFwd_CToC_SC16_Radix2_fs_OutOfPlace_unsafe + SUBS argScale,argScale,#1 + BLGE armSP_FFTFwd_CToC_SC16_Sfs_Radix2_ps_OutOfPlace_unsafe + BLLT armSP_FFTFwd_CToC_SC16_Radix2_ps_OutOfPlace_unsafe + SUBS argScale,argScale,#1 + BLEQ armSP_FFTFwd_CToC_SC16_Sfs_Radix2_ls_OutOfPlace_unsafe + BLLT armSP_FFTFwd_CToC_SC16_Radix2_ls_OutOfPlace_unsafe + B FFTEnd + + +orderGreaterthan3: + @// check scale = 0 or scale = order + SUBS diff, scale, order @// scale > order + MOVGT scale,order + BGE specialScaleCase @// scale = 0 or scale = order + CMP scale,#0 + BEQ specialScaleCase + B generalScaleCase + +specialScaleCase: @// scale = 0 or scale = order and order > 3 + + TST order, #2 @// Set input args to fft stages + MOVNE argDst,pDst + MOVEQ argDst,pOut + MOVEQ pOut,pDst @// Pass the first stage destination in RN5 + MOV argTwiddle,pTwiddle + + CMP diff,#0 + M_STR diff, diffOnStack + BGE scaleEqualsOrder + + @//check for even or odd order + @// NOTE: The following combination of BL's would work fine eventhough the first + @// BL would corrupt the flags. This is because the end of the "grpZeroSetLoop" loop inside + @// armSP_FFTFwd_CToC_SC16_Radix4_fs_OutOfPlace_unsafe sets the Z flag to EQ + + TST order,#0x00000001 + BLEQ armSP_FFTFwd_CToC_SC16_Radix4_fs_OutOfPlace_unsafe + BLNE armSP_FFTFwd_CToC_SC16_Radix8_fs_OutOfPlace_unsafe + + CMP subFFTNum,#4 + BLT FFTEnd + +unscaledRadix4Loop: + BEQ lastStageUnscaledRadix4 + BL armSP_FFTFwd_CToC_SC16_Radix4_OutOfPlace_unsafe + CMP subFFTNum,#4 + B unscaledRadix4Loop + +lastStageUnscaledRadix4: + BL armSP_FFTFwd_CToC_SC16_Radix4_ls_OutOfPlace_unsafe + B FFTEnd + +scaleEqualsOrder: + @//check for even or odd order + @// NOTE: The following combination of BL's would work fine eventhough the first + @// BL would corrupt the flags. This is because the end of the "grpZeroSetLoop" loop inside + @// armSP_FFTFwd_CToC_SC32_Radix4_fs_OutOfPlace_unsafe sets the Z flag to EQ + + TST order,#0x00000001 + BLEQ armSP_FFTFwd_CToC_SC16_Sfs_Radix4_fs_OutOfPlace_unsafe + BLNE armSP_FFTFwd_CToC_SC16_Sfs_Radix8_fs_OutOfPlace_unsafe + + CMP subFFTNum,#4 + BLT FFTEnd + +scaledRadix4Loop: + BEQ lastStageScaledRadix4 + BL armSP_FFTFwd_CToC_SC16_Sfs_Radix4_OutOfPlace_unsafe + CMP subFFTNum,#4 + B scaledRadix4Loop + +lastStageScaledRadix4: + BL armSP_FFTFwd_CToC_SC16_Sfs_Radix4_ls_OutOfPlace_unsafe + B FFTEnd + + + +generalScaleCase: @// 0 < scale < order and order > 3 + @// Determine the correct destination buffer + SUB diff,order,scale + TST diff,#0x01 + ADDEQ count,scale,diff,LSR #1 @// count = scale + (order - scale)/2 + MOVNE count,order + TST count,#0x01 @// Is count even or odd ? + + MOVNE argDst,pDst @// Set input args to fft stages + MOVEQ argDst,pOut + MOVEQ pOut,pDst @// Pass the first stage destination in RN5 + MOV argTwiddle,pTwiddle + + CMP diff,#1 + M_STR diff, diffOnStack + BEQ scaleps @// scaling including a radix2_ps stage + + MOV argScale,scale @// Put scale in RN4 so as to save and restore + BL armSP_FFTFwd_CToC_SC16_Sfs_Radix2_fs_OutOfPlace_unsafe @// scaled first stage + SUBS argScale,argScale,#1 + +scaledRadix2Loop: + BLGT armSP_FFTFwd_CToC_SC16_Sfs_Radix2_OutOfPlace_unsafe + SUBS argScale,argScale,#1 @// save and restore scale (RN4) in the scaled stages + BGT scaledRadix2Loop + B outScale + +scaleps: + SUB argScale,scale,#1 @// order>3 and diff=1 => scale >= 3 + BL armSP_FFTFwd_CToC_SC16_Sfs_Radix2_fs_OutOfPlace_unsafe @// scaled first stage + SUBS argScale,argScale,#1 + +scaledRadix2psLoop: + BEQ scaledRadix2psStage + BLGT armSP_FFTFwd_CToC_SC16_Sfs_Radix2_OutOfPlace_unsafe + SUBS argScale,argScale,#1 @// save and restore scale (RN4) in the scaled stages + BGE scaledRadix2psLoop + +scaledRadix2psStage: + BL armSP_FFTFwd_CToC_SC16_Sfs_Radix2_ps_OutOfPlace_unsafe + B generalLastStageUnscaledRadix2 + + +outScale: + M_LDR diff, diffOnStack + @//check for even or odd order + TST diff,#0x00000001 + BEQ generalUnscaledRadix4Loop + B unscaledRadix2Loop + +generalUnscaledRadix4Loop: + CMP subFFTNum,#4 + BEQ generalLastStageUnscaledRadix4 + BL armSP_FFTFwd_CToC_SC16_Radix4_OutOfPlace_unsafe + B generalUnscaledRadix4Loop + +generalLastStageUnscaledRadix4: + BL armSP_FFTFwd_CToC_SC16_Radix4_ls_OutOfPlace_unsafe + B End + +unscaledRadix2Loop: + CMP subFFTNum,#4 + BEQ generalLastTwoStagesUnscaledRadix2 + BL armSP_FFTFwd_CToC_SC16_Radix2_OutOfPlace_unsafe + B unscaledRadix2Loop + +generalLastTwoStagesUnscaledRadix2: + BL armSP_FFTFwd_CToC_SC16_Radix2_ps_OutOfPlace_unsafe +generalLastStageUnscaledRadix2: + BL armSP_FFTFwd_CToC_SC16_Radix2_ls_OutOfPlace_unsafe + B End + + +FFTEnd: @// Does only the scaling + + M_LDR diff, diffOnStack + CMP diff,#0 + BLE End + + RSB diff,diff,#0 @// to use VRSHL for right shift by a variable + VDUP dShift,diff + +scaleFFTData: @// N = subFFTSize ; dataptr = pDst ; scale = diff + VLD1 {dX0S32[0]},[pSrc] @// pSrc contains pDst pointer + SUBS subFFTSize,subFFTSize,#1 + VRSHL dX0,dShift + VST1 {dX0S32[0]},[pSrc]! + + BGT scaleFFTData + + + +End: + @// Set return value + MOV result, #OMX_Sts_NoErr + + @// Write function tail + M_END + + .END diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTFwd_CToC_SC32_Sfs_s.S b/media/openmax_dl/dl/sp/src/omxSP_FFTFwd_CToC_SC32_Sfs_s.S new file mode 100644 index 0000000000..90f969a83d --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTFwd_CToC_SC32_Sfs_s.S @@ -0,0 +1,335 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. +@// +@// +@// File Name: omxSP_FFTFwd_CToC_SC32_Sfs_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 6684 +@// Last Modified Date: Mon, 09 Jul 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute an inverse FFT for a complex signal +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + +@// Import symbols required from other files +@// (For example tables) + + .extern armSP_FFTFwd_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Radix2_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Radix4_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Radix8_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Radix4_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Sfs_Radix4_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Sfs_Radix8_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Sfs_Radix4_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Sfs_Radix2_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Radix2_OutOfPlace_unsafe + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + @// Guarding implementation by the processor name + +@// Import symbols required from other files +@// (For example tables) + .extern armSP_FFTFwd_CToC_SC32_Radix4_ls_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Radix2_ls_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Sfs_Radix4_ls_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Sfs_Radix2_ls_OutOfPlace_unsafe + + +@//Input Registers + +#define pSrc r0 +#define pDst r1 +#define pFFTSpec r2 +#define scale r3 + + +@// Output registers +#define result r0 + +@//Local Scratch Registers + +#define argTwiddle r1 +#define argDst r2 +#define argScale r4 +#define tmpOrder r4 +#define pTwiddle r4 +#define pOut r5 +#define subFFTSize r7 +#define subFFTNum r6 +#define N r6 +#define order r14 +#define diff r9 +@// Total num of radix stages required to comple the FFT +#define count r8 +#define x0r r4 +#define x0i r5 +#define diffMinusOne r2 +#define round r3 + +@// Neon registers + +#define dX0 D0.S32 +#define dShift D1.S32 + + + + @// Allocate stack memory required by the function + M_ALLOC4 diffOnStack, 4 + + @// Write function header + M_START omxSP_FFTFwd_CToC_SC32_Sfs,r11,d15 + +@ Structure offsets for the FFTSpec + .set ARMsFFTSpec_N, 0 + .set ARMsFFTSpec_pBitRev, 4 + .set ARMsFFTSpec_pTwiddle, 8 + .set ARMsFFTSpec_pBuf, 12 + + @// Define stack arguments + + @// Read the size from structure and take log + LDR N, [pFFTSpec, #ARMsFFTSpec_N] + + @// Read other structure parameters + LDR pTwiddle, [pFFTSpec, #ARMsFFTSpec_pTwiddle] + LDR pOut, [pFFTSpec, #ARMsFFTSpec_pBuf] + + CLZ order,N @// N = 2^order + RSB order,order,#31 + MOV subFFTSize,#1 + @//MOV subFFTNum,N + + CMP order,#3 + BGT orderGreaterthan3 @// order > 3 + + CMP order,#1 + BGE orderGreaterthan0 @// order > 0 + M_STR scale, diffOnStack,LT @// order = 0 + VLD1 dX0,[pSrc] + VST1 dX0,[pDst] + MOV pSrc,pDst + BLT FFTEnd + +orderGreaterthan0: + @// set the buffers appropriately for various orders + CMP order,#2 + MOVNE argDst,pDst + MOVEQ argDst,pOut + MOVEQ pOut,pDst @// Pass the first stage destination in RN5 + MOV argTwiddle,pTwiddle + + SUBS diff,scale,order + M_STR diff,diffOnStack + MOVGT scale,order + @// Now scale <= order + + CMP order,#1 + BGT orderGreaterthan1 + SUBS scale,scale,#1 + BLEQ armSP_FFTFwd_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe @// order = 1 + BLLT armSP_FFTFwd_CToC_SC32_Radix2_fs_OutOfPlace_unsafe @// order = 1 + B FFTEnd + +orderGreaterthan1: + CMP order,#2 + MOV argScale,scale + BGT orderGreaterthan2 + SUBS argScale,argScale,#1 + BLGE armSP_FFTFwd_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe @// order =2 + BLLT armSP_FFTFwd_CToC_SC32_Radix2_fs_OutOfPlace_unsafe + SUBS argScale,argScale,#1 + BLEQ armSP_FFTFwd_CToC_SC32_Sfs_Radix2_ls_OutOfPlace_unsafe + BLLT armSP_FFTFwd_CToC_SC32_Radix2_ls_OutOfPlace_unsafe + B FFTEnd + +orderGreaterthan2: @// order =3 + SUBS argScale,argScale,#1 + BLGE armSP_FFTFwd_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe // "fs" means first stage + BLLT armSP_FFTFwd_CToC_SC32_Radix2_fs_OutOfPlace_unsafe + SUBS argScale,argScale,#1 + BLGE armSP_FFTFwd_CToC_SC32_Sfs_Radix2_OutOfPlace_unsafe + BLLT armSP_FFTFwd_CToC_SC32_Radix2_OutOfPlace_unsafe + SUBS argScale,argScale,#1 + BLEQ armSP_FFTFwd_CToC_SC32_Sfs_Radix2_ls_OutOfPlace_unsafe // "ls" means last stage + BLLT armSP_FFTFwd_CToC_SC32_Radix2_ls_OutOfPlace_unsafe + B FFTEnd + + + +orderGreaterthan3: + @// check scale = 0 or scale = order + SUBS diff, scale, order @// scale > order + MOVGT scale,order + BGE specialScaleCase @// scale = 0 or scale = order + CMP scale,#0 + BEQ specialScaleCase + B generalScaleCase + +specialScaleCase: @// scale = 0 or scale = order and order >= 2 + + TST order, #2 @// Set input args to fft stages + MOVNE argDst,pDst + MOVEQ argDst,pOut + MOVEQ pOut,pDst @// Pass the first stage destination in RN5 + MOV argTwiddle,pTwiddle + + CMP diff,#0 + M_STR diff, diffOnStack + BGE scaleEqualsOrder + + @//check for even or odd order + @// NOTE: The following combination of BL's would work fine eventhough the first + @// BL would corrupt the flags. This is because the end of the "grpZeroSetLoop" loop inside + @// armSP_FFTFwd_CToC_SC32_Radix4_fs_OutOfPlace_unsafe sets the Z flag to EQ + + TST order,#0x00000001 + BLEQ armSP_FFTFwd_CToC_SC32_Radix4_fs_OutOfPlace_unsafe + BLNE armSP_FFTFwd_CToC_SC32_Radix8_fs_OutOfPlace_unsafe + + CMP subFFTNum,#4 + BLT FFTEnd + + +unscaledRadix4Loop: + BEQ lastStageUnscaledRadix4 + BL armSP_FFTFwd_CToC_SC32_Radix4_OutOfPlace_unsafe + CMP subFFTNum,#4 + B unscaledRadix4Loop + +lastStageUnscaledRadix4: + BL armSP_FFTFwd_CToC_SC32_Radix4_ls_OutOfPlace_unsafe + B FFTEnd + + +scaleEqualsOrder: + @//check for even or odd order + @// NOTE: The following combination of BL's would work fine eventhough the first + @// BL would corrupt the flags. This is because the end of the "grpZeroSetLoop" loop inside + @// armSP_FFTFwd_CToC_SC32_Radix4_fs_OutOfPlace_unsafe sets the Z flag to EQ + + TST order,#0x00000001 + BLEQ armSP_FFTFwd_CToC_SC32_Sfs_Radix4_fs_OutOfPlace_unsafe + BLNE armSP_FFTFwd_CToC_SC32_Sfs_Radix8_fs_OutOfPlace_unsafe + + CMP subFFTNum,#4 + BLT FFTEnd + + +scaledRadix4Loop: + BEQ lastStageScaledRadix4 + BL armSP_FFTFwd_CToC_SC32_Sfs_Radix4_OutOfPlace_unsafe + CMP subFFTNum,#4 + B scaledRadix4Loop + +lastStageScaledRadix4: + BL armSP_FFTFwd_CToC_SC32_Sfs_Radix4_ls_OutOfPlace_unsafe + B FFTEnd + +generalScaleCase: @// 0 < scale < order and order >= 2 + @// Determine the correct destination buffer + SUB diff,order,scale + TST diff,#0x01 + ADDEQ count,scale,diff,LSR #1 @// count = scale + (order - scale)/2 + MOVNE count,order + TST count,#0x01 @// Is count even or odd ? + + MOVNE argDst,pDst @// Set input args to fft stages + MOVEQ argDst,pOut + MOVEQ pOut,pDst @// Pass the first stage destination in RN5 + MOV argTwiddle,pTwiddle + + M_STR diff, diffOnStack + + MOV argScale,scale @// Put scale in RN4 so as to save and restore + BL armSP_FFTFwd_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe @// scaled first stage + SUBS argScale,argScale,#1 + +scaledRadix2Loop: + BLGT armSP_FFTFwd_CToC_SC32_Sfs_Radix2_OutOfPlace_unsafe + SUBS argScale,argScale,#1 @// save and restore scale (RN4) in the scaled stages + BGT scaledRadix2Loop + + + M_LDR diff, diffOnStack + @//check for even or odd order + TST diff,#0x00000001 + BEQ generalUnscaledRadix4Loop + B unscaledRadix2Loop + +generalUnscaledRadix4Loop: + CMP subFFTNum,#4 + BEQ generalLastStageUnscaledRadix4 + BL armSP_FFTFwd_CToC_SC32_Radix4_OutOfPlace_unsafe + B generalUnscaledRadix4Loop + +generalLastStageUnscaledRadix4: + BL armSP_FFTFwd_CToC_SC32_Radix4_ls_OutOfPlace_unsafe + B End + + +unscaledRadix2Loop: + CMP subFFTNum,#2 + BEQ generalLastStageUnscaledRadix2 + BL armSP_FFTFwd_CToC_SC32_Radix2_OutOfPlace_unsafe + B unscaledRadix2Loop + +generalLastStageUnscaledRadix2: + BL armSP_FFTFwd_CToC_SC32_Radix2_ls_OutOfPlace_unsafe + B End + + +FFTEnd: @// Does only the scaling + + M_LDR diff, diffOnStack + CMP diff,#0 + BLE End + + RSB diff,diff,#0 @// to use VRSHL for right shift by a variable + VDUP dShift,diff + +scaleFFTData: @// N = subFFTSize ; dataptr = pDst ; scale = diff + VLD1 {dX0},[pSrc] @// pSrc contains pDst pointer + SUBS subFFTSize,subFFTSize,#1 + VRSHL dX0,dShift + VST1 {dX0},[pSrc]! + + BGT scaleFFTData + + + +End: + @// Set return value + MOV result, #OMX_Sts_NoErr + + @// Write function tail + M_END + + .end diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTFwd_RToCCS_F32_Sfs_s.S b/media/openmax_dl/dl/sp/src/omxSP_FFTFwd_RToCCS_F32_Sfs_s.S new file mode 100644 index 0000000000..00358352be --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTFwd_RToCCS_F32_Sfs_s.S @@ -0,0 +1,404 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This is a modification of omxSP_FFTFwd_RToCCS_S32_Sfs_s.s +@// to support float instead of SC32. +@// + +@// +@// Description: +@// Compute FFT for a real signal +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + .extern armSP_FFTFwd_CToC_FC32_Radix2_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_FC32_Radix4_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_FC32_Radix8_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_FC32_Radix4_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_FC32_Radix4_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_FC32_Radix8_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_FC32_Radix2_OutOfPlace_unsafe + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + @// Guarding implementation by the processor name + +@// Import symbols required from other files +@// (For example tables) + .extern armSP_FFTFwd_CToC_FC32_Radix4_ls_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_FC32_Radix2_ls_OutOfPlace_unsafe + + +@//Input Registers + +#define pSrc r0 +#define pDst r1 +#define pFFTSpec r2 +#define scale r3 + + +@// Output registers +#define result r0 + +@//Local Scratch Registers + +#define argTwiddle r1 +#define argDst r2 +#define argScale r4 +#define tmpOrder r4 +#define pTwiddle r4 +#define pOut r5 +#define subFFTSize r7 +#define subFFTNum r6 +#define N r6 +#define order r14 +#define diff r9 +@// Total num of radix stages required to comple the FFT +#define count r8 +#define x0r r4 +#define x0i r5 +#define diffMinusOne r2 +#define subFFTSizeTmp r6 +#define step r3 +#define step1 r4 +#define twStep r8 +#define zero r9 +#define pTwiddleTmp r5 +#define t0 r10 + +@// Neon registers + +#define dX0 d0.f32 +#define dzero d1.f32 +#define dZero d2.f32 +#define dShift d3.f32 +#define dX0r d2.f32 +#define dX0i d3.f32 +#define dX1r d4.f32 +#define dX1i d5.f32 +#define dT0 d6.f32 +#define dT1 d7.f32 +#define dT2 d8.f32 +#define dT3 d9.f32 +#define qT0 d10.f32 +#define qT1 d12.f32 +#define dW0r d14.f32 +#define dW0i d15.f32 +#define dW1r d16.f32 +#define dW1i d17.f32 +#define dY0r d14.f32 +#define dY0i d15.f32 +#define dY1r d16.f32 +#define dY1i d17.f32 +#define dY0rS64 d14.s64 +#define dY0iS64 d15.s64 +#define qT2 d18.f32 +#define qT3 d20.f32 +@// lastThreeelements +#define dX1 d3.f32 +#define dW0 d4.f32 +#define dW1 d5.f32 +#define dY0 d10.f32 +#define dY1 d11.f32 +#define dY2 d12.f32 +#define dY3 d13.f32 + +#define half d0.f32 + + @// Allocate stack memory required by the function + + @// Write function header + M_START omxSP_FFTFwd_RToCCS_F32_Sfs,r11,d15 + +@ Structure offsets for the FFTSpec + .set ARMsFFTSpec_N, 0 + .set ARMsFFTSpec_pBitRev, 4 + .set ARMsFFTSpec_pTwiddle, 8 + .set ARMsFFTSpec_pBuf, 12 + + @// Define stack arguments + + @// Read the size from structure and take log + LDR N, [pFFTSpec, #ARMsFFTSpec_N] + + @// Read other structure parameters + LDR pTwiddle, [pFFTSpec, #ARMsFFTSpec_pTwiddle] + LDR pOut, [pFFTSpec, #ARMsFFTSpec_pBuf] + + @// N=1 Treat seperately + CMP N,#1 + BGT sizeGreaterThanOne + VLD1 dX0[0],[pSrc] + MOV zero,#0 + VMOV dzero[0],zero + VMOV dZero[0],zero + VST3 {dX0[0],dzero[0],dZero[0]},[pDst] + + B End + + + +sizeGreaterThanOne: + @// Do a N/2 point complex FFT including the scaling + + MOV N,N,ASR #1 @// N/2 point complex FFT + + CLZ order,N @// N = 2^order + RSB order,order,#31 + MOV subFFTSize,#1 + @//MOV subFFTNum,N + + CMP order,#3 + BGT orderGreaterthan3 @// order > 3 + + CMP order,#1 + BGE orderGreaterthan0 @// order > 0 + VLD1 dX0,[pSrc] + VST1 dX0,[pOut] + MOV pSrc,pOut + MOV argDst,pDst + BLT FFTEnd + +orderGreaterthan0: + @// set the buffers appropriately for various orders + CMP order,#2 + MOVEQ argDst,pDst + MOVNE argDst,pOut + @// Pass the first stage destination in RN5 + MOVNE pOut,pDst + MOV argTwiddle,pTwiddle + + CMP order,#1 + BGT orderGreaterthan1 + @// order = 1 + BL armSP_FFTFwd_CToC_FC32_Radix2_fs_OutOfPlace_unsafe + B FFTEnd + +orderGreaterthan1: + CMP order,#2 + BGT orderGreaterthan2 + @// order =2 + BL armSP_FFTFwd_CToC_FC32_Radix2_fs_OutOfPlace_unsafe + BL armSP_FFTFwd_CToC_FC32_Radix2_ls_OutOfPlace_unsafe + B FFTEnd + +orderGreaterthan2:@// order =3 + BL armSP_FFTFwd_CToC_FC32_Radix2_fs_OutOfPlace_unsafe + BL armSP_FFTFwd_CToC_FC32_Radix2_OutOfPlace_unsafe + BL armSP_FFTFwd_CToC_FC32_Radix2_ls_OutOfPlace_unsafe + + B FFTEnd + + + +orderGreaterthan3: +specialScaleCase: + + @// Set input args to fft stages + TST order, #2 + MOVEQ argDst,pDst + MOVNE argDst,pOut + @// Pass the first stage destination in RN5 + MOVNE pOut,pDst + MOV argTwiddle,pTwiddle + + @//check for even or odd order + @// NOTE: The following combination of BL's would work fine even though + @// the first BL would corrupt the flags. This is because the end of + @// the "grpZeroSetLoop" loop inside + @// armSP_FFTFwd_CToC_FC32_Radix4_fs_OutOfPlace_unsafe sets the Z flag + @// to EQ + + TST order,#0x00000001 + BLEQ armSP_FFTFwd_CToC_FC32_Radix4_fs_OutOfPlace_unsafe + BLNE armSP_FFTFwd_CToC_FC32_Radix8_fs_OutOfPlace_unsafe + + CMP subFFTNum,#4 + BLT FFTEnd + + +unscaledRadix4Loop: + BEQ lastStageUnscaledRadix4 + BL armSP_FFTFwd_CToC_FC32_Radix4_OutOfPlace_unsafe + CMP subFFTNum,#4 + B unscaledRadix4Loop + +lastStageUnscaledRadix4: + BL armSP_FFTFwd_CToC_FC32_Radix4_ls_OutOfPlace_unsafe + B FFTEnd + + +FFTEnd: +finalComplexToRealFixup: + + + @// F(0) = 1/2[Z(0) + Z'(0)] - j [Z(0) - Z'(0)] + @// 1/2[(a+jb) + (a-jb)] - j [(a+jb) - (a-jb)] + @// 1/2[2a+j0] - j [0+j2b] + @// (a+b, 0) + + @// F(N/2) = 1/2[Z(0) + Z'(0)] + j [Z(0) - Z'(0)] + @// 1/2[(a+jb) + (a-jb)] + j [(a+jb) - (a-jb)] + @// 1/2[2a+j0] + j [0+j2b] + @// (a-b, 0) + + @// F(0) and F(N/2) + VLD2 {dX0r[0],dX0i[0]},[pSrc]! + MOV zero,#0 + VMOV dX0r[1],zero + MOV step,subFFTSize,LSL #3 @// step = N/2 * 8 bytes + VMOV dX0i[1],zero + @// twStep = 3N/8 * 8 bytes pointing to W^1 + SUB twStep,step,subFFTSize,LSL #1 + + VADD dY0r,dX0r,dX0i @// F(0) = ((Z0.r+Z0.i) , 0) + MOV step1,subFFTSize,LSL #2 @// step1 = N/2 * 4 bytes + VSUB dY0i,dX0r,dX0i @// F(N/2) = ((Z0.r-Z0.i) , 0) + SUBS subFFTSize,subFFTSize,#2 + + VST1 dY0r,[argDst],step + ADD pTwiddleTmp,argTwiddle,#8 @// W^2 + VST1 dY0i,[argDst]! + ADD argTwiddle,argTwiddle,twStep @// W^1 + + VDUP dzero,zero + SUB argDst,argDst,step + + BLT End + BEQ lastElement + SUB step,step,#24 + SUB step1,step1,#8 @// (N/4-1)*8 bytes + + @// F(k) = 1/2[Z(k) + Z'(N/2-k)] -j*W^(k) [Z(k) - Z'(N/2-k)] + @// Note: W^k is stored as negative values in the table + @// Process 4 elements at a time. E.g: F(1),F(2) and F(N/2-2),F(N/2-1) + @// since both of them require Z(1),Z(2) and Z(N/2-2),Z(N/2-1) + + + ADR t0, HALF + VLD1 half[0], [t0] + +evenOddButterflyLoop: + + + VLD1 dW0r,[argTwiddle],step1 + VLD1 dW1r,[argTwiddle]! + + VLD2 {dX0r,dX0i},[pSrc],step + SUB argTwiddle,argTwiddle,step1 + VLD2 {dX1r,dX1i},[pSrc]! + + + + SUB step1,step1,#8 @// (N/4-2)*8 bytes + VLD1 dW0i,[pTwiddleTmp],step1 + VLD1 dW1i,[pTwiddleTmp]! + SUB pSrc,pSrc,step + + SUB pTwiddleTmp,pTwiddleTmp,step1 + VREV64 dX1r,dX1r + VREV64 dX1i,dX1i + SUBS subFFTSize,subFFTSize,#4 + + + + VSUB dT2,dX0r,dX1r @// a-c + SUB step1,step1,#8 + VADD dT0,dX0r,dX1r @// a+c + VSUB dT1,dX0i,dX1i @// b-d + VADD dT3,dX0i,dX1i @// b+d + VMUL dT0,dT0,half[0] + VMUL dT1,dT1,half[0] + VZIP dW1r,dW1i + VZIP dW0r,dW0i + + + VMUL qT0,dW1r,dT2 + VMUL qT1,dW1r,dT3 + VMUL qT2,dW0r,dT2 + VMUL qT3,dW0r,dT3 + + VMLA qT0,dW1i,dT3 + VMLS qT1,dW1i,dT2 + + VMLS qT2,dW0i,dT3 + VMLA qT3,dW0i,dT2 + + + VMUL dX1r,qT0,half[0] + VMUL dX1i,qT1,half[0] + + VSUB dY1r,dT0,dX1i @// F(N/2 -1) + VADD dY1i,dT1,dX1r + VNEG dY1i,dY1i + + VREV64 dY1r,dY1r + VREV64 dY1i,dY1i + + + VMUL dX0r,qT2,half[0] + VMUL dX0i,qT3,half[0] + + VSUB dY0r,dT0,dX0i @// F(1) + VADD dY0i,dT1,dX0r + + + VST2 {dY0r,dY0i},[argDst],step + VST2 {dY1r,dY1i},[argDst]! + SUB argDst,argDst,step + SUB step,step,#32 @// (N/2-4)*8 bytes + + + BGT evenOddButterflyLoop + + @// set both the ptrs to the last element + SUB pSrc,pSrc,#8 + SUB argDst,argDst,#8 + + + + @// Last element can be expanded as follows + @// 1/2[Z(k) + Z'(k)] + j w^k [Z(k) - Z'(k)] + @// 1/2[(a+jb) + (a-jb)] + j w^k [(a+jb) - (a-jb)] + @// 1/2[2a+j0] + j (c+jd) [0+j2b] + @// (a-bc, -bd) + @// Since (c,d) = (0,1) for the last element, result is just (a,-b) + +lastElement: + VLD1 dX0r,[pSrc] + + VST1 dX0r[0],[argDst]! + VNEG dX0r,dX0r + VST1 dX0r[1],[argDst]! + +End: + @// Set return value + MOV result, #OMX_Sts_NoErr + + @// Write function tail + M_END +HALF: .float 0.5 + .end diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTFwd_RToCCS_S16S32_Sfs_s.S b/media/openmax_dl/dl/sp/src/omxSP_FFTFwd_RToCCS_S16S32_Sfs_s.S new file mode 100644 index 0000000000..84d230036f --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTFwd_RToCCS_S16S32_Sfs_s.S @@ -0,0 +1,158 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. +@// + +@// +@// File Name: omxSP_FFTFwd_RToCCS_S16S32_Sfs_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 7403 +@// Last Modified Date: Mon, 17 Sep 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute FFT for a real signal +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + .extern omxSP_FFTFwd_RToCCS_S32_Sfs + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + @// Guarding implementation by the processor name + +@// Import symbols required from other files +@// (For example tables) + + +@//Input Registers + +#define pSrc r0 +#define pDst r1 +#define pFFTSpec r2 +#define scale r3 + +@// Output registers +#define result r0 + +#define pTmpDst r4 +#define pTmpSrc r5 +#define N r6 +#define order r7 +#define pOut r8 + +@// Neon registers + +#define dX0 D0.S16 +#define qY0 Q1.S32 +#define dY0S32 D2.S32 +#define qX0 Q1.S32 +#define dY1S32 D3.S32 +#define dX0S32 D0.S32 + + + + + @// Allocate stack memory required by the function + + @// Write function header + M_START omxSP_FFTFwd_RToCCS_S16S32_Sfs,r11,d15 + +@ Structure offsets for the FFTSpec + .set ARMsFFTSpec_N, 0 + .set ARMsFFTSpec_pBitRev, 4 + .set ARMsFFTSpec_pTwiddle, 8 + .set ARMsFFTSpec_pBuf, 12 + + @// Define stack arguments + + @// Read the size from structure and take log + LDR N, [pFFTSpec, #ARMsFFTSpec_N] + + @// Read other structure parameters + @//LDR pTwiddle, [pFFTSpec, #ARMsFFTSpec_pTwiddle] + LDR pOut, [pFFTSpec, #ARMsFFTSpec_pBuf] + + + @// N=1 Treat seperately + CMP N,#1 + BGT sizeGreaterThanOne + VLD1 dX0[0],[pSrc] + VMOVL qY0,dX0 + VST1 dY0S32[0],[pDst] + + MOV pSrc,pDst + B realS32FFT + +sizeGreaterThanOne: + MOV N,N,ASR #1 + + CLZ order,N @// N = 2^order + RSB order,order,#31 + + TST order,#1 + MOVEQ pTmpDst,pOut + MOVNE pTmpDst,pDst + MOV pTmpSrc,pTmpDst + + CMP N,#1 + BGT copyS16ToS32 + VLD1 dX0S32[0],[pSrc] + VMOVL qX0,dX0 + VST1 dY0S32,[pTmpDst] + B setpSrc + + +copyS16ToS32: + + VLD1 dX0,[pSrc]! + SUBS N,N,#2 + VMOVL qX0,dX0 + VST1 {dY0S32,dY1S32},[pTmpDst]! + BGT copyS16ToS32 + +setpSrc: + MOV pSrc,pTmpSrc + + + +realS32FFT: + BL omxSP_FFTFwd_RToCCS_S32_Sfs + + + +End: + @// Set return value + MOV result, #OMX_Sts_NoErr + + @// Write function tail + M_END + .end + diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTFwd_RToCCS_S32_Sfs_s.S b/media/openmax_dl/dl/sp/src/omxSP_FFTFwd_RToCCS_S32_Sfs_s.S new file mode 100644 index 0000000000..a742162e61 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTFwd_RToCCS_S32_Sfs_s.S @@ -0,0 +1,549 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. +@// + +@// +@// File Name: omxSP_FFTFwd_RToCCS_S32_Sfs_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 7810 +@// Last Modified Date: Thu, 04 Oct 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute FFT for a real signal +@// + + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + .extern armSP_FFTFwd_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Radix2_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Radix4_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Radix8_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Radix4_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Sfs_Radix4_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Sfs_Radix8_fs_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Sfs_Radix4_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Sfs_Radix2_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Radix2_OutOfPlace_unsafe + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + @// Guarding implementation by the processor name + +@// Import symbols required from other files +@// (For example tables) + .extern armSP_FFTFwd_CToC_SC32_Radix4_ls_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Radix2_ls_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Sfs_Radix4_ls_OutOfPlace_unsafe + .extern armSP_FFTFwd_CToC_SC32_Sfs_Radix2_ls_OutOfPlace_unsafe + + +@//Input Registers + +#define pSrc r0 +#define pDst r1 +#define pFFTSpec r2 +#define scale r3 + + +@// Output registers +#define result r0 + +@//Local Scratch Registers + +#define argTwiddle r1 +#define argDst r2 +#define argScale r4 +#define tmpOrder r4 +#define pTwiddle r4 +#define pOut r5 +#define subFFTSize r7 +#define subFFTNum r6 +#define N r6 +#define order r14 +#define diff r9 +@// Total num of radix stages required to comple the FFT +#define count r8 +#define x0r r4 +#define x0i r5 +#define diffMinusOne r2 +#define subFFTSizeTmp r6 +#define step r3 +#define step1 r4 +#define twStep r8 +#define zero r9 +#define pTwiddleTmp r5 +#define t0 r10 + +@// Neon registers + +#define dX0 d0.s32 +#define dzero d1.s32 +#define dZero d2.s32 +#define dShift d3.s32 +#define dX0r d2.s32 +#define dX0i d3.s32 +#define dX1r d4.s32 +#define dX1i d5.s32 +#define dT0 d6.s32 +#define dT1 d7.s32 +#define dT2 d8.s32 +#define dT3 d9.s32 +#define qT0 q5.s64 +#define qT1 q6.s64 +#define dW0r d14.s32 +#define dW0i d15.s32 +#define dW1r d16.s32 +#define dW1i d17.s32 +#define dY0r d14.s32 +#define dY0i d15.s32 +#define dY1r d16.s32 +#define dY1i d17.s32 +#define dY0rS64 d14.s64 +#define dY0iS64 d15.s64 +#define qT2 q9.s64 +#define qT3 q10.s64 +@// lastThreeelements +#define dX1 d3.s32 +#define dW0 d4.s32 +#define dW1 d5.s32 +#define dY0 d10.s32 +#define dY1 d11.s32 +#define dY2 d12.s32 +#define dY3 d13.s32 + + @// Allocate stack memory required by the function + + M_ALLOC4 diffOnStack, 4 + + @// Write function header + M_START omxSP_FFTFwd_RToCCS_S32_Sfs,r11,d15 + +@ Structure offsets for the FFTSpec + .set ARMsFFTSpec_N, 0 + .set ARMsFFTSpec_pBitRev, 4 + .set ARMsFFTSpec_pTwiddle, 8 + .set ARMsFFTSpec_pBuf, 12 + + @// Define stack arguments + + @// Read the size from structure and take log + LDR N, [pFFTSpec, #ARMsFFTSpec_N] + + @// Read other structure parameters + LDR pTwiddle, [pFFTSpec, #ARMsFFTSpec_pTwiddle] + LDR pOut, [pFFTSpec, #ARMsFFTSpec_pBuf] + + @// N=1 Treat seperately + CMP N,#1 + BGT sizeGreaterThanOne + VLD1 dX0[0],[pSrc] + RSB scale,scale,#0 @// to use VRSHL for right shift by a variable + MOV zero,#0 + VMOV dShift[0],scale + VMOV dzero[0],zero + VRSHL dX0,dShift + VMOV dZero[0],zero + VST3 {dX0[0],dzero[0],dZero[0]},[pDst] + + B End + + + +sizeGreaterThanOne: + @// Do a N/2 point complex FFT including the scaling + + MOV N,N,ASR #1 @// N/2 point complex FFT + + CLZ order,N @// N = 2^order + RSB order,order,#31 + MOV subFFTSize,#1 + @//MOV subFFTNum,N + + CMP order,#3 + BGT orderGreaterthan3 @// order > 3 + + CMP order,#1 + BGE orderGreaterthan0 @// order > 0 + M_STR scale, diffOnStack,LT @// order = 0 + VLD1 dX0,[pSrc] + VST1 dX0,[pOut] + MOV pSrc,pOut + MOV argDst,pDst + BLT FFTEnd + +orderGreaterthan0: + @// set the buffers appropriately for various orders + CMP order,#2 + MOVEQ argDst,pDst + MOVNE argDst,pOut + MOVNE pOut,pDst @// Pass the first stage destination in RN5 + MOV argTwiddle,pTwiddle + + SUBS diff,scale,order + M_STR diff,diffOnStack + MOVGT scale,order + @// Now scale <= order + + CMP order,#1 + BGT orderGreaterthan1 + SUBS scale,scale,#1 + BLEQ armSP_FFTFwd_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe @// order = 1 + BLLT armSP_FFTFwd_CToC_SC32_Radix2_fs_OutOfPlace_unsafe @// order = 1 + B FFTEnd + +orderGreaterthan1: + CMP order,#2 + MOV argScale,scale + BGT orderGreaterthan2 + SUBS argScale,argScale,#1 + BLGE armSP_FFTFwd_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe @// order =2 + BLLT armSP_FFTFwd_CToC_SC32_Radix2_fs_OutOfPlace_unsafe + SUBS argScale,argScale,#1 + BLEQ armSP_FFTFwd_CToC_SC32_Sfs_Radix2_ls_OutOfPlace_unsafe + BLLT armSP_FFTFwd_CToC_SC32_Radix2_ls_OutOfPlace_unsafe + B FFTEnd + +orderGreaterthan2:@// order =3 + SUBS argScale,argScale,#1 + BLGE armSP_FFTFwd_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe + BLLT armSP_FFTFwd_CToC_SC32_Radix2_fs_OutOfPlace_unsafe + SUBS argScale,argScale,#1 + BLGE armSP_FFTFwd_CToC_SC32_Sfs_Radix2_OutOfPlace_unsafe + BLLT armSP_FFTFwd_CToC_SC32_Radix2_OutOfPlace_unsafe + SUBS argScale,argScale,#1 + BLEQ armSP_FFTFwd_CToC_SC32_Sfs_Radix2_ls_OutOfPlace_unsafe + BLLT armSP_FFTFwd_CToC_SC32_Radix2_ls_OutOfPlace_unsafe + B FFTEnd + + + +orderGreaterthan3: + @// check scale = 0 or scale = order + SUBS diff, scale, order @// scale > order + MOVGT scale,order + BGE specialScaleCase @// scale = 0 or scale = order + CMP scale,#0 + BEQ specialScaleCase + B generalScaleCase + +specialScaleCase:@// scale = 0 or scale = order and order >= 2 + + TST order, #2 @// Set input args to fft stages + MOVEQ argDst,pDst + MOVNE argDst,pOut + MOVNE pOut,pDst @// Pass the first stage destination in RN5 + MOV argTwiddle,pTwiddle + + CMP diff,#0 + M_STR diff, diffOnStack + BGE scaleEqualsOrder + + @//check for even or odd order + @// NOTE: The following combination of BL's would work fine eventhough the first + @// BL would corrupt the flags. This is because the end of the "grpZeroSetLoop" loop inside + @// armSP_FFTFwd_CToC_SC32_Radix4_fs_OutOfPlace_unsafe sets the Z flag to EQ + + TST order,#0x00000001 + BLEQ armSP_FFTFwd_CToC_SC32_Radix4_fs_OutOfPlace_unsafe + BLNE armSP_FFTFwd_CToC_SC32_Radix8_fs_OutOfPlace_unsafe + + CMP subFFTNum,#4 + BLT FFTEnd + + +unscaledRadix4Loop: + BEQ lastStageUnscaledRadix4 + BL armSP_FFTFwd_CToC_SC32_Radix4_OutOfPlace_unsafe + CMP subFFTNum,#4 + B unscaledRadix4Loop + +lastStageUnscaledRadix4: + BL armSP_FFTFwd_CToC_SC32_Radix4_ls_OutOfPlace_unsafe + B FFTEnd + + +scaleEqualsOrder: + @//check for even or odd order + @// NOTE: The following combination of BL's would work fine eventhough the first + @// BL would corrupt the flags. This is because the end of the "grpZeroSetLoop" loop inside + @// armSP_FFTFwd_CToC_SC32_Radix4_fs_OutOfPlace_unsafe sets the Z flag to EQ + + TST order,#0x00000001 + BLEQ armSP_FFTFwd_CToC_SC32_Sfs_Radix4_fs_OutOfPlace_unsafe + BLNE armSP_FFTFwd_CToC_SC32_Sfs_Radix8_fs_OutOfPlace_unsafe + + CMP subFFTNum,#4 + BLT FFTEnd + + +scaledRadix4Loop: + BEQ lastStageScaledRadix4 + BL armSP_FFTFwd_CToC_SC32_Sfs_Radix4_OutOfPlace_unsafe + CMP subFFTNum,#4 + B scaledRadix4Loop + +lastStageScaledRadix4: + BL armSP_FFTFwd_CToC_SC32_Sfs_Radix4_ls_OutOfPlace_unsafe + B FFTEnd + +generalScaleCase:@// 0 < scale < order and order >= 2 + @// Determine the correct destination buffer + SUB diff,order,scale + TST diff,#0x01 + ADDEQ count, scale,diff,lsr #1 @// count = scale + (order - scale)/2 + MOVNE count, order + TST count, #0x01 @// Is count even or odd ? + + MOVEQ argDst,pDst @// Set input args to fft stages + MOVNE argDst,pOut + MOVNE pOut,pDst @// Pass the first stage destination in RN5 + MOV argTwiddle,pTwiddle + + M_STR diff, diffOnStack + + MOV argScale,scale @// Put scale in RN4 so as to save and restore + BL armSP_FFTFwd_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe @// scaled first stage + SUBS argScale,argScale,#1 + +scaledRadix2Loop: + BLGT armSP_FFTFwd_CToC_SC32_Sfs_Radix2_OutOfPlace_unsafe + SUBS argScale,argScale,#1 @// save and restore scale (RN4) in the scaled stages + BGT scaledRadix2Loop + + + M_LDR diff, diffOnStack + @//check for even or odd order + TST diff,#0x00000001 + BEQ generalUnscaledRadix4Loop + B unscaledRadix2Loop + +generalUnscaledRadix4Loop: + CMP subFFTNum,#4 + BEQ generalLastStageUnscaledRadix4 + BL armSP_FFTFwd_CToC_SC32_Radix4_OutOfPlace_unsafe + B generalUnscaledRadix4Loop + +generalLastStageUnscaledRadix4: + BL armSP_FFTFwd_CToC_SC32_Radix4_ls_OutOfPlace_unsafe + B finalComplexToRealFixup + + +unscaledRadix2Loop: + CMP subFFTNum,#2 + BEQ generalLastStageUnscaledRadix2 + BL armSP_FFTFwd_CToC_SC32_Radix2_OutOfPlace_unsafe + B unscaledRadix2Loop + +generalLastStageUnscaledRadix2: + BL armSP_FFTFwd_CToC_SC32_Radix2_ls_OutOfPlace_unsafe + B finalComplexToRealFixup + + +FFTEnd:@// Does only the scaling + + M_LDR diff, diffOnStack + CMP diff,#0 + BLE finalComplexToRealFixup + + RSB diff,diff,#0 @// to use VRSHL for right shift by a variable + VDUP dShift,diff + + @// save subFFTSize and use tmpsubfftsize in the folowwing loop + MOV subFFTSizeTmp,subFFTSize @// subFFTSizeTmp same reg as subFFTNum + +scaleFFTData:@// N = subFFTSize ; dataptr = pDst ; scale = diff + VLD1 {dX0},[pSrc] @// pSrc contains pDst pointer + SUBS subFFTSizeTmp,subFFTSizeTmp,#1 + VRSHL dX0,dShift + VST1 {dX0},[pSrc]! + + BGT scaleFFTData + + SUB pSrc,pSrc,subFFTSize,LSL #3 @// reset pSrc for final fixup + + @// change the logic so that output after scaling is in pOut and not in pDst + @// finally store from pOut to pDst + @// change branch "End" to branch "finalComplexToRealFixup" in the above + @// chk the code below for multiplication by j factor + +finalComplexToRealFixup: + + + @// F(0) = 1/2[Z(0) + Z'(0)] - j [Z(0) - Z'(0)] + @// 1/2[(a+jb) + (a-jb)] - j [(a+jb) - (a-jb)] + @// 1/2[2a+j0] - j [0+j2b] + @// (a+b, 0) + + @// F(N/2) = 1/2[Z(0) + Z'(0)] + j [Z(0) - Z'(0)] + @// 1/2[(a+jb) + (a-jb)] + j [(a+jb) - (a-jb)] + @// 1/2[2a+j0] + j [0+j2b] + @// (a-b, 0) + + @// F(0) and F(N/2) + VLD2 {dX0r[0],dX0i[0]},[pSrc]! + MOV zero,#0 + VMOV dX0r[1],zero + MOV step,subFFTSize,LSL #3 @// step = N/2 * 8 bytes + VMOV dX0i[1],zero + SUB twStep,step,subFFTSize,LSL #1 @// twStep = 3N/8 * 8 bytes pointing to W^1 + + VADD dY0r,dX0r,dX0i @// F(0) = ((Z0.r+Z0.i) , 0) + MOV step1,subFFTSize,LSL #2 @// step1 = N/2 * 4 bytes + VSUB dY0i,dX0r,dX0i @// F(N/2) = ((Z0.r-Z0.i) , 0) + SUBS subFFTSize,subFFTSize,#2 + + VST1 dY0r,[argDst],step + ADD pTwiddleTmp,argTwiddle,#8 @// W^2 + VST1 dY0i,[argDst]! + ADD argTwiddle,argTwiddle,twStep @// W^1 + + VDUP dzero,zero + SUB argDst,argDst,step + + BLT End + BEQ lastElement + SUB step,step,#24 + SUB step1,step1,#8 @// (N/4-1)*8 bytes + + @// F(k) = 1/2[Z(k) + Z'(N/2-k)] -j*W^(k) [Z(k) - Z'(N/2-k)] + @// Note: W^k is stored as negative values in the table + @// Process 4 elements at a time. E.g: F(1),F(2) and F(N/2-2),F(N/2-1) since both of them + @// require Z(1),Z(2) and Z(N/2-2),Z(N/2-1) + + +evenOddButterflyLoop: + + + VLD1 dW0r,[argTwiddle],step1 + VLD1 dW1r,[argTwiddle]! + + VLD2 {dX0r,dX0i},[pSrc],step + SUB argTwiddle,argTwiddle,step1 + VLD2 {dX1r,dX1i},[pSrc]! + + + + SUB step1,step1,#8 @// (N/4-2)*8 bytes + VLD1 dW0i,[pTwiddleTmp],step1 + VLD1 dW1i,[pTwiddleTmp]! + SUB pSrc,pSrc,step + + SUB pTwiddleTmp,pTwiddleTmp,step1 + VREV64 dX1r,dX1r + VREV64 dX1i,dX1i + SUBS subFFTSize,subFFTSize,#4 + + + + VSUB dT2,dX0r,dX1r @// a-c + SUB step1,step1,#8 + VADD dT3,dX0i,dX1i @// b+d + VADD dT0,dX0r,dX1r @// a+c + VSUB dT1,dX0i,dX1i @// b-d + VHADD dT0,dT0,dzero + VHADD dT1,dT1,dzero + + VZIP dW1r,dW1i + vzip dW0r,dW0i + + + VMULL qT0,dW1r,dT2 + VMLAL qT0,dW1i,dT3 + VMULL qT1,dW1r,dT3 + VMLSL qT1,dW1i,dT2 + + VMULL qT2,dW0r,dT2 + VMLSL qT2,dW0i,dT3 + VMULL qT3,dW0r,dT3 + VMLAL qT3,dW0i,dT2 + + + VRSHRN dX1r,qT0,#32 + VRSHRN dX1i,qT1,#32 + + VSUB dY1r,dT0,dX1i @// F(N/2 -1) + VADD dY1i,dT1,dX1r + VNEG dY1i,dY1i + + VREV64 dY1r,dY1r + VREV64 dY1i,dY1i + + + VRSHRN dX0r,qT2,#32 + VRSHRN dX0i,qT3,#32 + + + VSUB dY0r,dT0,dX0i @// F(1) + VADD dY0i,dT1,dX0r + + + VST2 {dY0r,dY0i},[argDst],step + VST2 {dY1r,dY1i},[argDst]! + SUB argDst,argDst,step + SUB step,step,#32 @// (N/2-4)*8 bytes + + + BGT evenOddButterflyLoop + + SUB pSrc,pSrc,#8 @// set both the ptrs to the last element + SUB argDst,argDst,#8 + + + + @// Last element can be expanded as follows + @// 1/2[Z(k) + Z'(k)] + j w^k [Z(k) - Z'(k)] + @// 1/2[(a+jb) + (a-jb)] + j w^k [(a+jb) - (a-jb)] + @// 1/2[2a+j0] + j (c+jd) [0+j2b] + @// (a-bc, -bd) + @// Since (c,d) = (0,1) for the last element, result is just (a,-b) + +lastElement: + VLD1 dX0r,[pSrc] + + VST1 dX0r[0],[argDst]! + VNEG dX0r,dX0r + VST1 dX0r[1],[argDst]! + + + + + + +End: + @// Set return value + MOV result, #OMX_Sts_NoErr + + @// Write function tail + M_END + + .end + diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTGetBufSize_C_FC32.c b/media/openmax_dl/dl/sp/src/omxSP_FFTGetBufSize_C_FC32.c new file mode 100644 index 0000000000..081f23739d --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTGetBufSize_C_FC32.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "dl/api/armOMX.h" +#include "dl/api/omxtypes.h" +#include "dl/sp/api/armSP.h" +#include "dl/sp/api/omxSP.h" + + +/** + * Function: omxSP_FFTGetBufSize_C_FC32 + * + * Description: + * These functions compute the size of the specification structure + * required for the length 2^order complex FFT and IFFT functions. The function + * <FFTGetBufSize_C_FC32> is used in conjunction with the 32-bit functions + * <FFTFwd_CToC_FC32_Sfs> and <FFTInv_CToC_FC32_Sfs>. + * + * Input Arguments: + * + * order - base-2 logarithm of the desired block length; valid in the range + * [1,12] ([1,15] if BIG_FFT_TABLE is defined.) + * + * Output Arguments: + * + * pSize - pointer to the number of bytes required for the specification + * structure + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * + * + */ + +OMXResult omxSP_FFTGetBufSize_C_FC32(OMX_INT order, OMX_INT *pSize) { + if (!pSize || (order < 1) || (order > TWIDDLE_TABLE_ORDER)) + return OMX_Sts_BadArgErr; + /* + * The required size is the same as for C_SC32, because the + * elements are the same size and because ARMsFFTSpec_SC32 is + * the same size as ARMsFFTSpec_FC32. + */ + return omxSP_FFTGetBufSize_C_SC32(order, pSize); +} diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTGetBufSize_C_SC16.c b/media/openmax_dl/dl/sp/src/omxSP_FFTGetBufSize_C_SC16.c new file mode 100644 index 0000000000..288c76ca61 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTGetBufSize_C_SC16.c @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + * + * This file was originally licensed as follows. It has been + * relicensed with permission from the copyright holders. + */ + +/** + * + * File Name: omxSP_FFTGetBufSize_C_SC16.c + * OpenMAX DL: v1.0.2 + * Last Modified Revision: 9468 + * Last Modified Date: Thu, 03 Jan 2008 + * + * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. + * + * + * Description: + * Compute the size of the specification structure required + */ + +#include "dl/api/armOMX.h" +#include "dl/api/omxtypes.h" +#include "dl/sp/api/armSP.h" +#include "dl/sp/api/omxSP.h" + + +/** + * Function: omxSP_FFTGetBufSize_C_SC16 (2.2.4.1.6) + * + * Description: + * These functions compute the size of the specification structure + * required for the length 2^order complex FFT and IFFT functions. The function + * <FFTGetBufSize_C_SC16> is used in conjunction with the 16-bit functions + * <FFTFwd_CToC_SC16_Sfs> and <FFTInv_CToC_SC16_Sfs>. + * + * Input Arguments: + * + * order - base-2 logarithm of the desired block length; valid in the range + * [0,12] + * + * Output Arguments: + * + * pSize - pointer to the number of bytes required for the specification + * structure + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * + * + */ + + + +OMXResult omxSP_FFTGetBufSize_C_SC16( + OMX_INT order, + OMX_INT *pSize) +{ + + OMX_INT N,twiddleSize; + + /* Check for order zero */ + if (order == 0) + { + *pSize = sizeof(ARMsFFTSpec_SC16); + return OMX_Sts_NoErr; + } + + + N = 1 << order; + + /*The max size of the twiddle table needed is 3N/4 for a radix-4 stage*/ + twiddleSize = 3*N/4; + + /* 2 pointers to store bitreversed array and twiddle factor array */ + *pSize = sizeof(ARMsFFTSpec_SC16) + /* Twiddle factors */ + + sizeof(OMX_SC16) * twiddleSize + /* Ping Pong buffer */ + + sizeof(OMX_SC16) * N + + 62 ; /* Extra bytes to get 32 byte alignment of ptwiddle and pBuf */ + + return OMX_Sts_NoErr; +} + +/***************************************************************************** + * END OF FILE + *****************************************************************************/ + diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTGetBufSize_C_SC32.c b/media/openmax_dl/dl/sp/src/omxSP_FFTGetBufSize_C_SC32.c new file mode 100644 index 0000000000..0ca3b5664b --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTGetBufSize_C_SC32.c @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + * + * This file was originally licensed as follows. It has been + * relicensed with permission from the copyright holders. + */ + +/** + * + * File Name: omxSP_FFTGetBufSize_C_SC32.c + * OpenMAX DL: v1.0.2 + * Last Modified Revision: 9468 + * Last Modified Date: Thu, 03 Jan 2008 + * + * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. + * + * + * Description: + * Compute the size of the specification structure required + */ + +#include "dl/api/armOMX.h" +#include "dl/api/omxtypes.h" +#include "dl/sp/api/armSP.h" +#include "dl/sp/api/omxSP.h" + + +/** + * Function: omxSP_FFTGetBufSize_C_SC32 (2.2.4.1.6) + * + * Description: + * These functions compute the size of the specification structure + * required for the length 2^order complex FFT and IFFT functions. The function + * <FFTGetBufSize_C_SC32> is used in conjunction with the 32-bit functions + * <FFTFwd_CToC_SC32_Sfs> and <FFTInv_CToC_SC32_Sfs>. + * + * Input Arguments: + * + * order - base-2 logarithm of the desired block length; valid in the range + * [0,12] + * + * Output Arguments: + * + * pSize - pointer to the number of bytes required for the specification + * structure + * + * Return Value: + * + * OMX_Sts_NoErr - no error + * + * + */ + + +OMXResult omxSP_FFTGetBufSize_C_SC32( + OMX_INT order, + OMX_INT *pSize) +{ + + OMX_INT N,twiddleSize; + + /* Check for order zero */ + if (order == 0) + { + *pSize = sizeof(ARMsFFTSpec_SC32); + return OMX_Sts_NoErr; + } + + + N = 1 << order; + + /*The max size of the twiddle table needed is 3N/4 for a radix-4 stage*/ + twiddleSize = 3*N/4; + + *pSize = sizeof(ARMsFFTSpec_SC32) + /* N Twiddle factors */ + + sizeof(OMX_SC32) * twiddleSize + /* Ping Pong buffer */ + + sizeof(OMX_SC32) * N + + 62 ; /* Extra bytes to get 32 byte alignment of ptwiddle and pBuf */ + + return OMX_Sts_NoErr; +} + +/***************************************************************************** + * END OF FILE + *****************************************************************************/ + diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTGetBufSize_R_F32.c b/media/openmax_dl/dl/sp/src/omxSP_FFTGetBufSize_R_F32.c new file mode 100644 index 0000000000..19b16bbd95 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTGetBufSize_R_F32.c @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + * + */ + +#include "dl/api/armOMX.h" +#include "dl/api/omxtypes.h" +#include "dl/sp/api/armSP.h" +#include "dl/sp/api/omxSP.h" + +/** + * Function: omxSP_FFTGetBufSize_R_F32 + * + * Description: + * Computes the size of the specification structure required for the length + * 2^order real FFT and IFFT functions. + * + * Remarks: + * This function is used in conjunction with the 32-bit functions + * <FFTFwd_RToCCS_F32_Sfs> and <FFTInv_CCSToR_F32_Sfs>. + * + * Parameters: + * [in] order base-2 logarithm of the length; valid in the range + * [1,12]. ([1,15] if BIG_FFT_TABLE is defined.) + * [out] pSize pointer to the number of bytes required for the + * specification structure. + * + * Return Value: + * Standard omxError result. See enumeration for possible result codes. + * + */ + +OMXResult omxSP_FFTGetBufSize_R_F32(OMX_INT order, OMX_INT *pSize) { + if (!pSize || (order < 1) || (order > TWIDDLE_TABLE_ORDER)) + return OMX_Sts_BadArgErr; + + /* + * The required size is the same as for R_S32, because the + * elements are the same size and because ARMsFFTSpec_R_SC32 is + * the same size as ARMsFFTSpec_R_FC32. + */ + return omxSP_FFTGetBufSize_R_S32(order, pSize); +} diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTGetBufSize_R_S16S32.c b/media/openmax_dl/dl/sp/src/omxSP_FFTGetBufSize_R_S16S32.c new file mode 100644 index 0000000000..846536386d --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTGetBufSize_R_S16S32.c @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + * + * This file was originally licensed as follows. It has been + * relicensed with permission from the copyright holders. + */ + +/** + * + * File Name: omxSP_FFTGetBufSize_R_S16S32.c + * OpenMAX DL: v1.0.2 + * Last Modified Revision: 7777 + * Last Modified Date: Thu, 27 Sep 2007 + * + * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. + * + * + * Description: + * Computes the size of the specification structure required. + */ + +#include "dl/api/armOMX.h" +#include "dl/api/omxtypes.h" +#include "dl/sp/api/armSP.h" +#include "dl/sp/api/omxSP.h" + +/** + * Function: omxSP_FFTGetBufSize_R_S16S32 + * + * Description: + * Computes the size of the specification structure required for the length + * 2^order real FFT and IFFT functions. + * + * Remarks: + * This function is used in conjunction with the 16-bit functions + * <FFTFwd_RToCCS_S16_S32_Sfs> and <FFTInv_CCSToR_S32_S16_Sfs>. + * + * Parameters: + * [in] order base-2 logarithm of the length; valid in the range + * [0,12]. + * [out] pSize pointer to the number of bytes required for the + * specification structure. + * + * Return Value: + * Standard omxError result. See enumeration for possible result codes. + * + */ + +OMXResult omxSP_FFTGetBufSize_R_S16S32( + OMX_INT order, + OMX_INT *pSize + ) +{ + OMX_INT NBy2,N,twiddleSize; + + + /* Check for order zero */ + if (order == 0) + { + *pSize = sizeof(ARMsFFTSpec_R_SC32) + + sizeof(OMX_S32) * (2); /* Extra size 'N' is used in FFTInv_CCSToR_S32S16_Sfs as a temporary buf */ + + return OMX_Sts_NoErr; + } + + NBy2 = 1 << (order - 1); + N = NBy2<<1; + twiddleSize = 5*N/8; /* 3/4(N/2) + N/4 */ + + /* 2 pointers to store bitreversed array and twiddle factor array */ + *pSize = sizeof(ARMsFFTSpec_R_SC32) + /* Twiddle factors */ + + sizeof(OMX_SC32) * twiddleSize + /* Ping Pong buffer for doing the N/2 point complex FFT */ + + sizeof(OMX_S32) * (N<<1) /* Extra size 'N' is used in FFTInv_CCSToR_S32S16_Sfs as a temporary buf */ + + 62 ; /* Extra bytes to get 32 byte alignment of ptwiddle and pBuf */ + + + return OMX_Sts_NoErr; +} + +/***************************************************************************** + * END OF FILE + *****************************************************************************/ + diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTGetBufSize_R_S32.c b/media/openmax_dl/dl/sp/src/omxSP_FFTGetBufSize_R_S32.c new file mode 100644 index 0000000000..d57294700e --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTGetBufSize_R_S32.c @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + * + * This file was originally licensed as follows. It has been + * relicensed with permission from the copyright holders. + */ + +/** + * + * File Name: omxSP_FFTGetBufSize_R_S32.c + * OpenMAX DL: v1.0.2 + * Last Modified Revision: 7777 + * Last Modified Date: Thu, 27 Sep 2007 + * + * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. + * + * + * Description: + * Computes the size of the specification structure required. + */ + +#include "dl/api/armOMX.h" +#include "dl/api/omxtypes.h" +#include "dl/sp/api/armSP.h" +#include "dl/sp/api/omxSP.h" + +/** + * Function: omxSP_FFTGetBufSize_R_S32 + * + * Description: + * Computes the size of the specification structure required for the length + * 2^order real FFT and IFFT functions. + * + * Remarks: + * This function is used in conjunction with the 32-bit functions + * <FFTFwd_RToCCS_S32_Sfs> and <FFTInv_CCSToR_S32_Sfs>. + * + * Parameters: + * [in] order base-2 logarithm of the length; valid in the range + * [0,12]. + * [out] pSize pointer to the number of bytes required for the + * specification structure. + * + * Return Value: + * Standard omxError result. See enumeration for possible result codes. + * + */ + +OMXResult omxSP_FFTGetBufSize_R_S32( + OMX_INT order, + OMX_INT *pSize + ) +{ + OMX_INT NBy2,N,twiddleSize; + + + /* Check for order zero */ + if (order == 0) + { + *pSize = sizeof(ARMsFFTSpec_R_SC32) + + sizeof(OMX_S32) * (2); /* Extra size 'N' is used in FFTInv_CCSToR_S32S16_Sfs as a temporary buf */ + + return OMX_Sts_NoErr; + } + + NBy2 = 1 << (order - 1); + N = NBy2<<1; + twiddleSize = 5*N/8; /* 3/4(N/2) + N/4 */ + + /* 2 pointers to store bitreversed array and twiddle factor array */ + *pSize = sizeof(ARMsFFTSpec_R_SC32) + /* Twiddle factors */ + + sizeof(OMX_SC32) * twiddleSize + /* Ping Pong buffer for doing the N/2 point complex FFT */ + + sizeof(OMX_S32) * (N<<1) /* Extra size 'N' is used in FFTInv_CCSToR_S32_Sfs as a temporary buf */ + + 62 ; /* Extra bytes to get 32 byte alignment of ptwiddle and pBuf */ + + + return OMX_Sts_NoErr; +} + +/***************************************************************************** + * END OF FILE + *****************************************************************************/ + diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTInit_C_FC32.c b/media/openmax_dl/dl/sp/src/omxSP_FFTInit_C_FC32.c new file mode 100644 index 0000000000..cc53c5912f --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTInit_C_FC32.c @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + * + * This is a modification of omxSP_FFTInit_C_SC32.c to support + * complex float instead of SC32. + */ + +#include "dl/api/armOMX.h" +#include "dl/api/omxtypes.h" +#include "dl/sp/api/armSP.h" +#include "dl/sp/api/omxSP.h" + + +/** + * Function: omxSP_FFTInit_C_FC32 + * + * Description: + * Initializes the specification structures required for the + * complex FFT and IFFT functions. + * + * Remarks: + * Desired block length is specified as an input. The function is used to + * initialize the specification structures for functions <FFTFwd_CToC_FC32_Sfs> + * and <FFTInv_CToC_FC32_Sfs>. Memory for the specification structure *pFFTSpec + * must be allocated prior to calling this function. The space required for + * *pFFTSpec, in bytes, can be determined using <FFTGetBufSize_C_FC32>. + * + * Parameters: + * [in] order base-2 logarithm of the desired block length; + * valid in the range [1,12]. ([1,15] if + * BIG_FFT_TABLE is defined.) + * [out] pFFTSpec pointer to initialized specification structure. + * + * Return Value: + * Standard omxError result. See enumeration for possible result codes. + * + */ + +OMXResult omxSP_FFTInit_C_FC32(OMXFFTSpec_C_FC32* pFFTSpec, OMX_INT order) { + OMX_INT i; + OMX_INT j; + OMX_FC32* pTwiddle; + OMX_FC32* pBuf; + OMX_U16* pBitRev; + OMX_U32 pTmp; + OMX_INT Nby2; + OMX_INT N; + OMX_INT M; + OMX_INT diff; + OMX_INT step; + ARMsFFTSpec_FC32* pFFTStruct = 0; + OMX_F32 x; + OMX_F32 y; + OMX_F32 xNeg; + + pFFTStruct = (ARMsFFTSpec_FC32 *) pFFTSpec; + + /* Validate args */ + if (!pFFTSpec || (order < 1) || (order > TWIDDLE_TABLE_ORDER)) + return OMX_Sts_BadArgErr; + + /* Do the initializations */ + Nby2 = 1 << (order - 1); + N = Nby2 << 1; + M = N >> 3; + + /* optimized implementations don't use bitreversal */ + pBitRev = NULL; + + pTwiddle = (OMX_FC32 *) (sizeof(ARMsFFTSpec_FC32) + (OMX_S8*) pFFTSpec); + + /* Align to 32 byte boundary */ + pTmp = ((OMX_U32) pTwiddle) & 31; + if (pTmp) + pTwiddle = (OMX_FC32*) ((OMX_S8*)pTwiddle + (32 - pTmp)); + + pBuf = (OMX_FC32*) (sizeof(OMX_FC32) * (3 * N / 4) + (OMX_S8*) pTwiddle); + + /* Align to 32 byte boundary */ + pTmp = ((OMX_U32)pBuf) & 31; + if (pTmp) + pBuf = (OMX_FC32*) ((OMX_S8*)pBuf + (32 - pTmp)); + + /* + * Filling Twiddle factors : + * + * The original twiddle table "armSP_FFT_S32TwiddleTable" is of size + * (MaxSize/8 + 1) Rest of the values i.e., upto MaxSize are + * calculated using the symmetries of sin and cos The max size of + * the twiddle table needed is 3N/4 for a radix-4 stage + * + * W = (-2 * PI) / N + * N = 1 << order + * W = -PI >> (order - 1) + */ + + diff = TWIDDLE_TABLE_ORDER - order; + /* step into the twiddle table for the current order */ + step = 1 << diff; + + x = armSP_FFT_F32TwiddleTable[0]; + y = armSP_FFT_F32TwiddleTable[1]; + xNeg = 1; + + if (order >= 3) { + /* i = 0 case */ + pTwiddle[0].Re = x; + pTwiddle[0].Im = y; + pTwiddle[2 * M].Re = -y; + pTwiddle[2 * M].Im = xNeg; + pTwiddle[4 * M].Re = xNeg; + pTwiddle[4 * M].Im = y; + + for (i = 1; i <= M; i++) { + j = i * step; + + x = armSP_FFT_F32TwiddleTable[2 * j]; + y = armSP_FFT_F32TwiddleTable[2 * j + 1]; + + pTwiddle[i].Re = x; + pTwiddle[i].Im = y; + pTwiddle[2 * M - i].Re = -y; + pTwiddle[2 * M - i].Im = -x; + pTwiddle[2 * M + i].Re = y; + pTwiddle[2 * M + i].Im = -x; + pTwiddle[4 * M - i].Re = -x; + pTwiddle[4 * M - i].Im = y; + pTwiddle[4 * M + i].Re = -x; + pTwiddle[4 * M + i].Im = -y; + pTwiddle[6 * M - i].Re = y; + pTwiddle[6 * M - i].Im = x; + } + } else if (order == 2) { + pTwiddle[0].Re = x; + pTwiddle[0].Im = y; + pTwiddle[1].Re = -y; + pTwiddle[1].Im = xNeg; + pTwiddle[2].Re = xNeg; + pTwiddle[2].Im = y; + } else if (order == 1) { + pTwiddle[0].Re = x; + pTwiddle[0].Im = y; + } + + /* Update the structure */ + pFFTStruct->N = N; + pFFTStruct->pTwiddle = pTwiddle; + pFFTStruct->pBitRev = pBitRev; + pFFTStruct->pBuf = pBuf; + + return OMX_Sts_NoErr; +} + +/***************************************************************************** + * END OF FILE + *****************************************************************************/ diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTInit_C_SC16.c b/media/openmax_dl/dl/sp/src/omxSP_FFTInit_C_SC16.c new file mode 100644 index 0000000000..f8248bbbf0 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTInit_C_SC16.c @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + * + * This file was originally licensed as follows. It has been + * relicensed with permission from the copyright holders. + */ + +/** + * + * File Name: omxSP_FFTInit_C_SC16.c + * OpenMAX DL: v1.0.2 + * Last Modified Revision: 15322 + * Last Modified Date: Wed, 15 Oct 2008 + * + * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. + * + * + * Description: + * Initializes the specification structures required + */ + +#include "dl/api/armOMX.h" +#include "dl/api/omxtypes.h" +#include "dl/sp/api/armSP.h" +#include "dl/sp/api/omxSP.h" + + +/** + * Function: omxSP_FFTInit_C_SC16 + * + * Description: + * These functions initialize the specification structures required for the + * complex FFT and IFFT functions. + * + * Remarks: + * Desired block length is specified as an input. The function is used to + * initialize the specification structures for functions <FFTFwd_CToC_SC16_Sfs> + * and <FFTInv_CToC_SC16_Sfs>. Memory for the specification structure *pFFTSpec + * must be allocated prior to calling this function. The space required for + * *pFFTSpec, in bytes, can be determined using <FFTGetBufSize_C_SC16>. + * + * Parameters: + * [in] order base-2 logarithm of the desired block length; + * valid in the range [0,12]. + * [out] pFFTSpec pointer to initialized specification structure. + * + * Return Value: + * Standard omxError result. See enumeration for possible result codes. + * + */ + +OMXResult omxSP_FFTInit_C_SC16( + OMXFFTSpec_C_SC16* pFFTSpec, + OMX_INT order + ) + { + OMX_INT i,j; + OMX_SC16 *pTwiddle, *pBuf; + OMX_U16 *pBitRev; + OMX_INT Nby2,N,M,diff,step; + OMX_U32 pTmp; + ARMsFFTSpec_SC16 *pFFTStruct = 0; + OMX_S16 x,y,xNeg; + OMX_S32 xS32,yS32; + + + pFFTStruct = (ARMsFFTSpec_SC16 *) pFFTSpec; + + /* if order zero no init is needed */ + if (order == 0) + { + pFFTStruct->N = 1; + return OMX_Sts_NoErr; + } + + /* Do the initializations */ + Nby2 = 1 << (order - 1); + N = Nby2 << 1; + M = N>>3; + + pBitRev = NULL ; + + pTwiddle = (OMX_SC16 *) + (sizeof(ARMsFFTSpec_SC16) + (OMX_S8*) pFFTSpec); + + /* Align to 32 byte boundary */ + pTmp = ((OMX_U32)pTwiddle)&31; /* (OMX_U32)pTwiddle % 32 */ + if(pTmp != 0) + pTwiddle = (OMX_SC16*) ((OMX_S8*)pTwiddle + (32-pTmp)); + + pBuf = (OMX_SC16 *) + (sizeof(OMX_SC16) * (3*N/4) + (OMX_S8*) pTwiddle); + + /* Align to 32 byte boundary */ + pTmp = ((OMX_U32)pBuf)&31; /* (OMX_U32)pBuf % 32 */ + if(pTmp != 0) + pBuf = (OMX_SC16*) ((OMX_S8*)pBuf + (32-pTmp)); + + + + /* + * Filling Twiddle factors : + * The original twiddle table "armSP_FFT_S16TwiddleTable" is of size (MaxSize/8 + 1) + * Rest of the values i.e., upto MaxSize are calculated using the symmetries of sin and cos + * The max size of the twiddle table needed is 3N/4 for a radix-4 stage + * + * W = (-2 * PI) / N + * N = 1 << order + * W = -PI >> (order - 1) + */ + + + + diff = 12 - order; + step = 1<<diff; /* step into the twiddle table for the current order */ + + xS32 = armSP_FFT_S32TwiddleTable[0]; + yS32 = armSP_FFT_S32TwiddleTable[1]; + x = (xS32+0x8000)>>16; + y = (yS32+0x8000)>>16; + + xNeg = 0x7FFF; + + if(order >=3) + { + /* i = 0 case */ + pTwiddle[0].Re = x; + pTwiddle[0].Im = y; + pTwiddle[2*M].Re = -y; + pTwiddle[2*M].Im = xNeg; + pTwiddle[4*M].Re = xNeg; + pTwiddle[4*M].Im = y; + + + for (i=1; i<=M; i++) + { + j = i*step; + + xS32 = armSP_FFT_S32TwiddleTable[2*j]; + yS32 = armSP_FFT_S32TwiddleTable[2*j+1]; + x = (xS32+0x8000)>>16; + y = (yS32+0x8000)>>16; + + pTwiddle[i].Re = x; + pTwiddle[i].Im = y; + pTwiddle[2*M-i].Re = -y; + pTwiddle[2*M-i].Im = -x; + pTwiddle[2*M+i].Re = y; + pTwiddle[2*M+i].Im = -x; + pTwiddle[4*M-i].Re = -x; + pTwiddle[4*M-i].Im = y; + pTwiddle[4*M+i].Re = -x; + pTwiddle[4*M+i].Im = -y; + pTwiddle[6*M-i].Re = y; + pTwiddle[6*M-i].Im = x; + } + + + } + else + { + if (order == 2) + { + pTwiddle[0].Re = x; + pTwiddle[0].Im = y; + pTwiddle[1].Re = -y; + pTwiddle[1].Im = xNeg; + pTwiddle[2].Re = xNeg; + pTwiddle[2].Im = y; + + } + if (order == 1) + { + pTwiddle[0].Re = x; + pTwiddle[0].Im = y; + + } + + + } + + + /* Update the structure */ + pFFTStruct->N = N; + pFFTStruct->pTwiddle = pTwiddle; + pFFTStruct->pBitRev = pBitRev; + pFFTStruct->pBuf = pBuf; + + return OMX_Sts_NoErr; +} + +/***************************************************************************** + * END OF FILE + *****************************************************************************/ + diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTInit_C_SC32.c b/media/openmax_dl/dl/sp/src/omxSP_FFTInit_C_SC32.c new file mode 100644 index 0000000000..9ea103f3d6 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTInit_C_SC32.c @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + * + * This file was originally licensed as follows. It has been + * relicensed with permission from the copyright holders. + */ + +/** + * + * File Name: omxSP_FFTInit_C_SC32.c + * OpenMAX DL: v1.0.2 + * Last Modified Revision: 7769 + * Last Modified Date: Thu, 27 Sep 2007 + * + * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. + * + * + * Description: + * Initializes the specification structures required + */ + +#include "dl/api/armOMX.h" +#include "dl/api/omxtypes.h" +#include "dl/sp/api/armSP.h" +#include "dl/sp/api/omxSP.h" + + +/** + * Function: omxSP_FFTInit_C_SC32 + * + * Description: + * Initializes the specification structures required for the + * complex FFT and IFFT functions. + * + * Remarks: + * Desired block length is specified as an input. The function is used to + * initialize the specification structures for functions <FFTFwd_CToC_SC32_Sfs> + * and <FFTInv_CToC_SC32_Sfs>. Memory for the specification structure *pFFTSpec + * must be allocated prior to calling this function. The space required for + * *pFFTSpec, in bytes, can be determined using <FFTGetBufSize_C_SC32>. + * + * Parameters: + * [in] order base-2 logarithm of the desired block length; + * valid in the range [0,12]. + * [out] pFFTSpec pointer to initialized specification structure. + * + * Return Value: + * Standard omxError result. See enumeration for possible result codes. + * + */ + +OMXResult omxSP_FFTInit_C_SC32( + OMXFFTSpec_C_SC32* pFFTSpec, + OMX_INT order + ) +{ + OMX_INT i,j; + OMX_SC32 *pTwiddle, *pBuf; + OMX_U16 *pBitRev; + OMX_U32 pTmp; + OMX_INT Nby2,N,M,diff, step; + ARMsFFTSpec_SC32 *pFFTStruct = 0; + OMX_S32 x,y,xNeg; + + pFFTStruct = (ARMsFFTSpec_SC32 *) pFFTSpec; + + /* if order zero no init is needed */ + if (order == 0) + { + pFFTStruct->N = 1; + return OMX_Sts_NoErr; + } + + /* Do the initializations */ + Nby2 = 1 << (order - 1); + N = Nby2 << 1; + M = N>>3; + + + pBitRev = NULL ; /* optimized implementations don't use bitreversal */ + + pTwiddle = (OMX_SC32 *) + (sizeof(ARMsFFTSpec_SC32) + (OMX_S8*) pFFTSpec); + + /* Align to 32 byte boundary */ + pTmp = ((OMX_U32)pTwiddle)&31; /* (OMX_U32)pTwiddle % 32 */ + if(pTmp != 0) + pTwiddle = (OMX_SC32*) ((OMX_S8*)pTwiddle + (32-pTmp)); + + pBuf = (OMX_SC32*) + (sizeof(OMX_SC32) * (3*N/4) + (OMX_S8*) pTwiddle); + + /* Align to 32 byte boundary */ + pTmp = ((OMX_U32)pBuf)&31; /* (OMX_U32)pBuf % 32 */ + if(pTmp != 0) + pBuf = (OMX_SC32*) ((OMX_S8*)pBuf + (32-pTmp)); + + + + + /* + * Filling Twiddle factors : + * The original twiddle table "armSP_FFT_S32TwiddleTable" is of size (MaxSize/8 + 1) + * Rest of the values i.e., upto MaxSize are calculated using the symmetries of sin and cos + * The max size of the twiddle table needed is 3N/4 for a radix-4 stage + * + * W = (-2 * PI) / N + * N = 1 << order + * W = -PI >> (order - 1) + */ + + + diff = 12 - order; + step = 1<<diff; /* step into the twiddle table for the current order */ + + x = armSP_FFT_S32TwiddleTable[0]; + y = armSP_FFT_S32TwiddleTable[1]; + xNeg = 0x7FFFFFFF; + + if(order >=3) + { + /* i = 0 case */ + pTwiddle[0].Re = x; + pTwiddle[0].Im = y; + pTwiddle[2*M].Re = -y; + pTwiddle[2*M].Im = xNeg; + pTwiddle[4*M].Re = xNeg; + pTwiddle[4*M].Im = y; + + + for (i=1; i<=M; i++) + { + j = i*step; + + x = armSP_FFT_S32TwiddleTable[2*j]; + y = armSP_FFT_S32TwiddleTable[2*j+1]; + + pTwiddle[i].Re = x; + pTwiddle[i].Im = y; + pTwiddle[2*M-i].Re = -y; + pTwiddle[2*M-i].Im = -x; + pTwiddle[2*M+i].Re = y; + pTwiddle[2*M+i].Im = -x; + pTwiddle[4*M-i].Re = -x; + pTwiddle[4*M-i].Im = y; + pTwiddle[4*M+i].Re = -x; + pTwiddle[4*M+i].Im = -y; + pTwiddle[6*M-i].Re = y; + pTwiddle[6*M-i].Im = x; + } + + + } + else + { + if (order == 2) + { + pTwiddle[0].Re = x; + pTwiddle[0].Im = y; + pTwiddle[1].Re = -y; + pTwiddle[1].Im = xNeg; + pTwiddle[2].Re = xNeg; + pTwiddle[2].Im = y; + + } + if (order == 1) + { + pTwiddle[0].Re = x; + pTwiddle[0].Im = y; + + } + + + } + + + + /* Update the structure */ + pFFTStruct->N = N; + pFFTStruct->pTwiddle = pTwiddle; + pFFTStruct->pBitRev = pBitRev; + pFFTStruct->pBuf = pBuf; + + return OMX_Sts_NoErr; +} + +/***************************************************************************** + * END OF FILE + *****************************************************************************/ + diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTInit_R_F32.c b/media/openmax_dl/dl/sp/src/omxSP_FFTInit_R_F32.c new file mode 100644 index 0000000000..32d22230ed --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTInit_R_F32.c @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + * + * This is a modification of omxSP_FFTInit_R_S32.c to support float + * instead of S32. + */ + +#include "dl/api/armOMX.h" +#include "dl/api/omxtypes.h" +#include "dl/sp/api/armSP.h" +#include "dl/sp/api/omxSP.h" + +/** + * Function: omxSP_FFTInit_R_F32 + * + * Description: + * Initialize the real forward-FFT specification information struct. + * + * Remarks: + * This function is used to initialize the specification structures + * for functions <ippsFFTFwd_RToCCS_F32_Sfs> and + * <ippsFFTInv_CCSToR_F32_Sfs>. Memory for *pFFTSpec must be + * allocated prior to calling this function. The number of bytes + * required for *pFFTSpec can be determined using + * <FFTGetBufSize_R_F32>. + * + * Parameters: + * [in] order base-2 logarithm of the desired block length; + * valid in the range [1,12]. ([1,15] if + * BIG_FFT_TABLE is defined.) + * [out] pFFTFwdSpec pointer to the initialized specification structure. + * + * Return Value: + * Standard omxError result. See enumeration for possible result codes. + * + */ +OMXResult omxSP_FFTInit_R_F32(OMXFFTSpec_R_F32* pFFTSpec, OMX_INT order) { + OMX_INT i; + OMX_INT j; + OMX_FC32* pTwiddle; + OMX_FC32* pTwiddle1; + OMX_FC32* pTwiddle2; + OMX_FC32* pTwiddle3; + OMX_FC32* pTwiddle4; + OMX_F32* pBuf; + OMX_U16* pBitRev; + OMX_U32 pTmp; + OMX_INT Nby2; + OMX_INT N; + OMX_INT M; + OMX_INT diff; + OMX_INT step; + OMX_F32 x; + OMX_F32 y; + OMX_F32 xNeg; + ARMsFFTSpec_R_FC32* pFFTStruct = 0; + + pFFTStruct = (ARMsFFTSpec_R_FC32 *) pFFTSpec; + + /* Validate args */ + if (!pFFTSpec || (order < 1) || (order > TWIDDLE_TABLE_ORDER)) + return OMX_Sts_BadArgErr; + + /* Do the initializations */ + Nby2 = 1 << (order - 1); + N = Nby2 << 1; + + /* optimized implementations don't use bitreversal */ + pBitRev = NULL; + + pTwiddle = (OMX_FC32 *) (sizeof(ARMsFFTSpec_R_SC32) + (OMX_S8*) pFFTSpec); + + /* Align to 32 byte boundary */ + pTmp = ((OMX_U32)pTwiddle) & 31; + if (pTmp) + pTwiddle = (OMX_FC32*) ((OMX_S8*)pTwiddle + (32 - pTmp)); + + pBuf = (OMX_F32*) (sizeof(OMX_FC32)*(5*N/8) + (OMX_S8*) pTwiddle); + + /* Align to 32 byte boundary */ + pTmp = ((OMX_U32)pBuf)&31; /* (OMX_U32)pBuf % 32 */ + if (pTmp) + pBuf = (OMX_F32*) ((OMX_S8*)pBuf + (32 - pTmp)); + + /* + * Filling Twiddle factors : + * + * exp^(-j*2*PI*k/ (N/2) ) ; k=0,1,2,...,3/4(N/2) + * + * N/2 point complex FFT is used to compute N point real FFT The + * original twiddle table "armSP_FFT_F32TwiddleTable" is of size + * (MaxSize/8 + 1) Rest of the values i.e., upto MaxSize are + * calculated using the symmetries of sin and cos The max size of + * the twiddle table needed is 3/4(N/2) for a radix-4 stage + * + * W = (-2 * PI) / N + * N = 1 << order + * W = -PI >> (order - 1) + */ + + M = Nby2 >> 3; + diff = TWIDDLE_TABLE_ORDER - (order - 1); + /* step into the twiddle table for the current order */ + step = 1 << diff; + + x = armSP_FFT_F32TwiddleTable[0]; + y = armSP_FFT_F32TwiddleTable[1]; + xNeg = 1; + + if ((order - 1) >= 3) { + /* i = 0 case */ + pTwiddle[0].Re = x; + pTwiddle[0].Im = y; + pTwiddle[2*M].Re = -y; + pTwiddle[2*M].Im = xNeg; + pTwiddle[4*M].Re = xNeg; + pTwiddle[4*M].Im = y; + + for (i = 1; i <= M; i++) { + j = i*step; + + x = armSP_FFT_F32TwiddleTable[2*j]; + y = armSP_FFT_F32TwiddleTable[2*j+1]; + + pTwiddle[i].Re = x; + pTwiddle[i].Im = y; + pTwiddle[2*M-i].Re = -y; + pTwiddle[2*M-i].Im = -x; + pTwiddle[2*M+i].Re = y; + pTwiddle[2*M+i].Im = -x; + pTwiddle[4*M-i].Re = -x; + pTwiddle[4*M-i].Im = y; + pTwiddle[4*M+i].Re = -x; + pTwiddle[4*M+i].Im = -y; + pTwiddle[6*M-i].Re = y; + pTwiddle[6*M-i].Im = x; + } + } else if ((order - 1) == 2) { + pTwiddle[0].Re = x; + pTwiddle[0].Im = y; + pTwiddle[1].Re = -y; + pTwiddle[1].Im = xNeg; + pTwiddle[2].Re = xNeg; + pTwiddle[2].Im = y; + } else if ((order-1) == 1) { + pTwiddle[0].Re = x; + pTwiddle[0].Im = y; + } + + /* + * Now fill the last N/4 values : exp^(-j*2*PI*k/N) ; + * k=1,3,5,...,N/2-1 These are used for the final twiddle fix-up for + * converting complex to real FFT + */ + + M = N >> 3; + diff = TWIDDLE_TABLE_ORDER - order; + step = 1 << diff; + + pTwiddle1 = pTwiddle + 3*N/8; + pTwiddle4 = pTwiddle1 + (N/4 - 1); + pTwiddle3 = pTwiddle1 + N/8; + pTwiddle2 = pTwiddle1 + (N/8 - 1); + + x = armSP_FFT_F32TwiddleTable[0]; + y = armSP_FFT_F32TwiddleTable[1]; + xNeg = 1; + + if (order >=3) { + for (i = 1; i <= M; i += 2) { + j = i*step; + + x = armSP_FFT_F32TwiddleTable[2*j]; + y = armSP_FFT_F32TwiddleTable[2*j+1]; + + pTwiddle1[0].Re = x; + pTwiddle1[0].Im = y; + pTwiddle1 += 1; + pTwiddle2[0].Re = -y; + pTwiddle2[0].Im = -x; + pTwiddle2 -= 1; + pTwiddle3[0].Re = y; + pTwiddle3[0].Im = -x; + pTwiddle3 += 1; + pTwiddle4[0].Re = -x; + pTwiddle4[0].Im = y; + pTwiddle4 -= 1; + } + } else { + if (order == 2) { + pTwiddle1[0].Re = -y; + pTwiddle1[0].Im = xNeg; + } + } + + + /* Update the structure */ + pFFTStruct->N = N; + pFFTStruct->pTwiddle = pTwiddle; + pFFTStruct->pBitRev = pBitRev; + pFFTStruct->pBuf = pBuf; + + return OMX_Sts_NoErr; +} diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTInit_R_S16S32.c b/media/openmax_dl/dl/sp/src/omxSP_FFTInit_R_S16S32.c new file mode 100644 index 0000000000..d157b3457c --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTInit_R_S16S32.c @@ -0,0 +1,263 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + * + * This file was originally licensed as follows. It has been + * relicensed with permission from the copyright holders. + */ + +/** + * + * File Name: omxSP_FFTInit_R_S16S32.c + * OpenMAX DL: v1.0.2 + * Last Modified Revision: 7777 + * Last Modified Date: Thu, 27 Sep 2007 + * + * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. + * + * + * Description: + * Initialize the real forward-FFT specification information struct. + */ + +#include "dl/api/armOMX.h" +#include "dl/api/omxtypes.h" +#include "dl/sp/api/armSP.h" +#include "dl/sp/api/omxSP.h" + + + +/** + * Function: omxSP_FFTInit_R_S16_S32 + * + * Description: + * Initialize the real forward-FFT specification information struct. + * + * Remarks: + * This function is used to initialize the specification structures + * for functions <ippsFFTFwd_RToCCS_S16_S32_Sfs> and + * <ippsFFTInv_CCSToR_S32_S16_Sfs>. Memory for *pFFTSpec must be + * allocated prior to calling this function. The number of bytes + * required for *pFFTSpec can be determined using + * <FFTGetBufSize_R_S16_S32>. + * + * Parameters: + * [in] order base-2 logarithm of the desired block length; + * valid in the range [0,12]. + * [out] pFFTFwdSpec pointer to the initialized specification structure. + * + * Return Value: + * Standard omxError result. See enumeration for possible result codes. + * + */ + +OMXResult omxSP_FFTInit_R_S16S32( + OMXFFTSpec_R_S16S32* pFFTSpec, + OMX_INT order +) +{ + OMX_INT i,j; + OMX_SC32 *pTwiddle,*pTwiddle1,*pTwiddle2,*pTwiddle3,*pTwiddle4; + OMX_S32 *pBuf; + OMX_U16 *pBitRev; + OMX_U32 pTmp; + OMX_INT Nby2,N,M,diff, step; + OMX_S32 x,y,xNeg; + ARMsFFTSpec_R_SC32 *pFFTStruct = 0; + + + pFFTStruct = (ARMsFFTSpec_R_SC32 *) pFFTSpec; + + /* if order zero no init is needed */ + if (order == 0) + { + pFFTStruct->N = 1; + pFFTStruct->pTwiddle = NULL; + pFFTStruct->pBuf = (OMX_S32 *) + (sizeof(ARMsFFTSpec_R_SC32) + (OMX_S8*) pFFTSpec); + + return OMX_Sts_NoErr; + } + + /* Do the initializations */ + Nby2 = 1 << (order - 1); + N = Nby2 << 1; + + + + pBitRev = NULL ; /* optimized implementations don't use bitreversal */ + + pTwiddle = (OMX_SC32 *) + (sizeof(ARMsFFTSpec_R_SC32) + (OMX_S8*) pFFTSpec); + + /* Align to 32 byte boundary */ + pTmp = ((OMX_U32)pTwiddle)&31; /* (OMX_U32)pTwiddle % 32 */ + if(pTmp != 0) + pTwiddle = (OMX_SC32*) ((OMX_S8*)pTwiddle + (32-pTmp)); + + + pBuf = (OMX_S32*) + (sizeof(OMX_SC32) * (5*N/8) + (OMX_S8*) pTwiddle); + + /* Align to 32 byte boundary */ + pTmp = ((OMX_U32)pBuf)&31; /* (OMX_U32)pBuf % 32 */ + if(pTmp != 0) + pBuf = (OMX_S32*) ((OMX_S8*)pBuf + (32-pTmp)); + + + + + /* + * Filling Twiddle factors : exp^(-j*2*PI*k/ (N/2) ) ; k=0,1,2,...,3/4(N/2) + * N/2 point complex FFT is used to compute N point real FFT + * The original twiddle table "armSP_FFT_S32TwiddleTable" is of size (MaxSize/8 + 1) + * Rest of the values i.e., upto MaxSize are calculated using the symmetries of sin and cos + * The max size of the twiddle table needed is 3/4(N/2) for a radix-4 stage + * + * W = (-2 * PI) / N + * N = 1 << order + * W = -PI >> (order - 1) + */ + + M = Nby2>>3; + diff = 12 - (order-1); + step = 1<<diff; /* step into the twiddle table for the current order */ + + x = armSP_FFT_S32TwiddleTable[0]; + y = armSP_FFT_S32TwiddleTable[1]; + xNeg = 0x7FFFFFFF; + + if((order-1) >=3) + { + /* i = 0 case */ + pTwiddle[0].Re = x; + pTwiddle[0].Im = y; + pTwiddle[2*M].Re = -y; + pTwiddle[2*M].Im = xNeg; + pTwiddle[4*M].Re = xNeg; + pTwiddle[4*M].Im = y; + + + for (i=1; i<=M; i++) + { + j = i*step; + + x = armSP_FFT_S32TwiddleTable[2*j]; + y = armSP_FFT_S32TwiddleTable[2*j+1]; + + pTwiddle[i].Re = x; + pTwiddle[i].Im = y; + pTwiddle[2*M-i].Re = -y; + pTwiddle[2*M-i].Im = -x; + pTwiddle[2*M+i].Re = y; + pTwiddle[2*M+i].Im = -x; + pTwiddle[4*M-i].Re = -x; + pTwiddle[4*M-i].Im = y; + pTwiddle[4*M+i].Re = -x; + pTwiddle[4*M+i].Im = -y; + pTwiddle[6*M-i].Re = y; + pTwiddle[6*M-i].Im = x; + } + + + } + else + { + if ((order-1) == 2) + { + pTwiddle[0].Re = x; + pTwiddle[0].Im = y; + pTwiddle[1].Re = -y; + pTwiddle[1].Im = xNeg; + pTwiddle[2].Re = xNeg; + pTwiddle[2].Im = y; + + } + if ((order-1) == 1) + { + pTwiddle[0].Re = x; + pTwiddle[0].Im = y; + + } + + + } + + + /* + * Now fill the last N/4 values : exp^(-j*2*PI*k/N) ; k=1,3,5,...,N/2-1 + * These are used for the final twiddle fix-up for converting complex to real FFT + */ + + M = N>>3; + diff = 12 - order; + step = 1<<diff; + + pTwiddle1 = pTwiddle + 3*N/8; + pTwiddle4 = pTwiddle1 + (N/4-1); + pTwiddle3 = pTwiddle1 + N/8; + pTwiddle2 = pTwiddle1 + (N/8-1); + + x = armSP_FFT_S32TwiddleTable[0]; + y = armSP_FFT_S32TwiddleTable[1]; + xNeg = 0x7FFFFFFF; + + if((order) >=3) + { + + + for (i=1; i<=M; i+=2 ) + { + j = i*step; + + x = armSP_FFT_S32TwiddleTable[2*j]; + y = armSP_FFT_S32TwiddleTable[2*j+1]; + + pTwiddle1[0].Re = x; + pTwiddle1[0].Im = y; + pTwiddle1 += 1; + pTwiddle2[0].Re = -y; + pTwiddle2[0].Im = -x; + pTwiddle2 -= 1; + pTwiddle3[0].Re = y; + pTwiddle3[0].Im = -x; + pTwiddle3 += 1; + pTwiddle4[0].Re = -x; + pTwiddle4[0].Im = y; + pTwiddle4 -= 1; + + } + + + } + else + { + if (order == 2) + { + + pTwiddle1[0].Re = -y; + pTwiddle1[0].Im = xNeg; + + } + + + } + + + /* Update the structure */ + pFFTStruct->N = N; + pFFTStruct->pTwiddle = pTwiddle; + pFFTStruct->pBitRev = pBitRev; + pFFTStruct->pBuf = pBuf; + + return OMX_Sts_NoErr; +} +/***************************************************************************** + * END OF FILE + *****************************************************************************/ + diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTInit_R_S32.c b/media/openmax_dl/dl/sp/src/omxSP_FFTInit_R_S32.c new file mode 100644 index 0000000000..337f2a20b2 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTInit_R_S32.c @@ -0,0 +1,261 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + * + * This file was originally licensed as follows. It has been + * relicensed with permission from the copyright holders. + */ + +/** + * + * File Name: omxSP_FFTInit_R_S32.c + * OpenMAX DL: v1.0.2 + * Last Modified Revision: 7777 + * Last Modified Date: Thu, 27 Sep 2007 + * + * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. + * + * + * Description: + * Initialize the real forward-FFT specification information struct. + */ + +#include "dl/api/armOMX.h" +#include "dl/api/omxtypes.h" +#include "dl/sp/api/armSP.h" +#include "dl/sp/api/omxSP.h" + + + +/** + * Function: omxSP_FFTInit_R_S32 + * + * Description: + * Initialize the real forward-FFT specification information struct. + * + * Remarks: + * This function is used to initialize the specification structures + * for functions <ippsFFTFwd_RToCCS_S32_Sfs> and + * <ippsFFTInv_CCSToR_S32_Sfs>. Memory for *pFFTSpec must be + * allocated prior to calling this function. The number of bytes + * required for *pFFTSpec can be determined using + * <FFTGetBufSize_R_S32>. + * + * Parameters: + * [in] order base-2 logarithm of the desired block length; + * valid in the range [0,12]. + * [out] pFFTFwdSpec pointer to the initialized specification structure. + * + * Return Value: + * Standard omxError result. See enumeration for possible result codes. + * + */ +OMXResult omxSP_FFTInit_R_S32( + OMXFFTSpec_R_S32* pFFTSpec, + OMX_INT order +) +{ + OMX_INT i,j; + OMX_SC32 *pTwiddle,*pTwiddle1,*pTwiddle2,*pTwiddle3,*pTwiddle4; + OMX_S32 *pBuf; + OMX_U16 *pBitRev; + OMX_U32 pTmp; + OMX_INT Nby2,N,M,diff, step; + OMX_S32 x,y,xNeg; + ARMsFFTSpec_R_SC32 *pFFTStruct = 0; + + + pFFTStruct = (ARMsFFTSpec_R_SC32 *) pFFTSpec; + + /* if order zero no init is needed */ + if (order == 0) + { + pFFTStruct->N = 1; + pFFTStruct->pTwiddle = NULL; + pFFTStruct->pBuf = (OMX_S32 *) + (sizeof(ARMsFFTSpec_R_SC32) + (OMX_S8*) pFFTSpec); + + return OMX_Sts_NoErr; + } + + /* Do the initializations */ + Nby2 = 1 << (order - 1); + N = Nby2 << 1; + + + + pBitRev = NULL ; /* optimized implementations don't use bitreversal */ + + pTwiddle = (OMX_SC32 *) + (sizeof(ARMsFFTSpec_R_SC32) + (OMX_S8*) pFFTSpec); + + /* Align to 32 byte boundary */ + pTmp = ((OMX_U32)pTwiddle)&31; /* (OMX_U32)pTwiddle % 32 */ + if(pTmp != 0) + pTwiddle = (OMX_SC32*) ((OMX_S8*)pTwiddle + (32-pTmp)); + + pBuf = (OMX_S32*) + (sizeof(OMX_SC32) * (5*N/8) + (OMX_S8*) pTwiddle); + + /* Align to 32 byte boundary */ + pTmp = ((OMX_U32)pBuf)&31; /* (OMX_U32)pBuf % 32 */ + if(pTmp != 0) + pBuf = (OMX_S32*) ((OMX_S8*)pBuf + (32-pTmp)); + + + + + /* + * Filling Twiddle factors : exp^(-j*2*PI*k/ (N/2) ) ; k=0,1,2,...,3/4(N/2) + * N/2 point complex FFT is used to compute N point real FFT + * The original twiddle table "armSP_FFT_S32TwiddleTable" is of size (MaxSize/8 + 1) + * Rest of the values i.e., upto MaxSize are calculated using the symmetries of sin and cos + * The max size of the twiddle table needed is 3/4(N/2) for a radix-4 stage + * + * W = (-2 * PI) / N + * N = 1 << order + * W = -PI >> (order - 1) + */ + + M = Nby2>>3; + diff = 12 - (order-1); + step = 1<<diff; /* step into the twiddle table for the current order */ + + x = armSP_FFT_S32TwiddleTable[0]; + y = armSP_FFT_S32TwiddleTable[1]; + xNeg = 0x7FFFFFFF; + + if((order-1) >=3) + { + /* i = 0 case */ + pTwiddle[0].Re = x; + pTwiddle[0].Im = y; + pTwiddle[2*M].Re = -y; + pTwiddle[2*M].Im = xNeg; + pTwiddle[4*M].Re = xNeg; + pTwiddle[4*M].Im = y; + + + for (i=1; i<=M; i++) + { + j = i*step; + + x = armSP_FFT_S32TwiddleTable[2*j]; + y = armSP_FFT_S32TwiddleTable[2*j+1]; + + pTwiddle[i].Re = x; + pTwiddle[i].Im = y; + pTwiddle[2*M-i].Re = -y; + pTwiddle[2*M-i].Im = -x; + pTwiddle[2*M+i].Re = y; + pTwiddle[2*M+i].Im = -x; + pTwiddle[4*M-i].Re = -x; + pTwiddle[4*M-i].Im = y; + pTwiddle[4*M+i].Re = -x; + pTwiddle[4*M+i].Im = -y; + pTwiddle[6*M-i].Re = y; + pTwiddle[6*M-i].Im = x; + } + + + } + else + { + if ((order-1) == 2) + { + pTwiddle[0].Re = x; + pTwiddle[0].Im = y; + pTwiddle[1].Re = -y; + pTwiddle[1].Im = xNeg; + pTwiddle[2].Re = xNeg; + pTwiddle[2].Im = y; + + } + if ((order-1) == 1) + { + pTwiddle[0].Re = x; + pTwiddle[0].Im = y; + + } + + + } + + + /* + * Now fill the last N/4 values : exp^(-j*2*PI*k/N) ; k=1,3,5,...,N/2-1 + * These are used for the final twiddle fix-up for converting complex to real FFT + */ + + M = N>>3; + diff = 12 - order; + step = 1<<diff; + + pTwiddle1 = pTwiddle + 3*N/8; + pTwiddle4 = pTwiddle1 + (N/4-1); + pTwiddle3 = pTwiddle1 + N/8; + pTwiddle2 = pTwiddle1 + (N/8-1); + + x = armSP_FFT_S32TwiddleTable[0]; + y = armSP_FFT_S32TwiddleTable[1]; + xNeg = 0x7FFFFFFF; + + if((order) >=3) + { + + + for (i=1; i<=M; i+=2 ) + { + j = i*step; + + x = armSP_FFT_S32TwiddleTable[2*j]; + y = armSP_FFT_S32TwiddleTable[2*j+1]; + + pTwiddle1[0].Re = x; + pTwiddle1[0].Im = y; + pTwiddle1 += 1; + pTwiddle2[0].Re = -y; + pTwiddle2[0].Im = -x; + pTwiddle2 -= 1; + pTwiddle3[0].Re = y; + pTwiddle3[0].Im = -x; + pTwiddle3 += 1; + pTwiddle4[0].Re = -x; + pTwiddle4[0].Im = y; + pTwiddle4 -= 1; + + } + + + } + else + { + if (order == 2) + { + + pTwiddle1[0].Re = -y; + pTwiddle1[0].Im = xNeg; + + } + + + } + + + /* Update the structure */ + pFFTStruct->N = N; + pFFTStruct->pTwiddle = pTwiddle; + pFFTStruct->pBitRev = pBitRev; + pFFTStruct->pBuf = pBuf; + + return OMX_Sts_NoErr; +} +/***************************************************************************** + * END OF FILE + *****************************************************************************/ + diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CCSToR_F32_Sfs_s.S b/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CCSToR_F32_Sfs_s.S new file mode 100644 index 0000000000..2616506ac0 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CCSToR_F32_Sfs_s.S @@ -0,0 +1,283 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This is a modification of omxSP_FFTInv_CCSToR_S32_Sfs_s.s +@// to support float instead of SC32. +@// + +@// +@// Description: +@// Compute an inverse FFT for a complex signal +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + .extern armSP_FFTInv_CToC_FC32_Radix2_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_FC32_Radix4_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_FC32_Radix8_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_FC32_Radix4_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_FC32_Radix2_OutOfPlace_unsafe + .extern armSP_FFTInv_CCSToR_F32_preTwiddleRadix2_unsafe + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + @// Guarding implementation by the processor name + +@// Import symbols required from other files +@// (For example tables) + .extern armSP_FFTInv_CToC_FC32_Radix4_ls_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_FC32_Radix2_ls_OutOfPlace_unsafe + + +@//Input Registers + +#define pSrc r0 +#define pDst r1 +#define pFFTSpec r2 +#define scale r3 + + +@// Output registers +#define result r0 + +@//Local Scratch Registers + +#define argTwiddle r1 +#define argDst r2 +#define argScale r4 +#define tmpOrder r4 +#define pTwiddle r4 +#define pOut r5 +#define subFFTSize r7 +#define subFFTNum r6 +#define N r6 +#define order r14 +#define diff r9 +@// Total num of radix stages required to comple the FFT +#define count r8 +#define x0r r4 +#define x0i r5 +#define diffMinusOne r2 +#define round r3 + +#define pOut1 r2 +#define size r7 +#define step r8 +#define step1 r9 +#define twStep r10 +#define pTwiddleTmp r11 +#define argTwiddle1 r12 +#define zero r14 + +@// Neon registers + +#define dX0 D0.F32 +#define dShift D1.F32 +#define dX1 D1.F32 +#define dY0 D2.F32 +#define dY1 D3.F32 +#define dX0r D0.F32 +#define dX0i D1.F32 +#define dX1r D2.F32 +#define dX1i D3.F32 +#define dW0r D4.F32 +#define dW0i D5.F32 +#define dW1r D6.F32 +#define dW1i D7.F32 +#define dT0 D8.F32 +#define dT1 D9.F32 +#define dT2 D10.F32 +#define dT3 D11.F32 +#define qT0 d12.F32 +#define qT1 d14.F32 +#define qT2 d16.F32 +#define qT3 d18.F32 +#define dY0r D4.F32 +#define dY0i D5.F32 +#define dY1r D6.F32 +#define dY1i D7.F32 +#define dzero D20.F32 + +#define dY2 D4.F32 +#define dY3 D5.F32 +#define dW0 D6.F32 +#define dW1 D7.F32 +#define dW0Tmp D10.F32 +#define dW1Neg D11.F32 + +#define sN S0.S32 +#define fN S1.F32 +@// one must be the same as dScale[0]! +#define dScale D2.F32 +#define one S4.F32 + + + @// Allocate stack memory required by the function + M_ALLOC4 complexFFTSize, 4 + + @// Write function header + M_START omxSP_FFTInv_CCSToR_F32_Sfs,r11,d15 + +@ Structure offsets for the FFTSpec + .set ARMsFFTSpec_N, 0 + .set ARMsFFTSpec_pBitRev, 4 + .set ARMsFFTSpec_pTwiddle, 8 + .set ARMsFFTSpec_pBuf, 12 + + @// Define stack arguments + + @// Read the size from structure and take log + LDR N, [pFFTSpec, #ARMsFFTSpec_N] + + @// Read other structure parameters + LDR pTwiddle, [pFFTSpec, #ARMsFFTSpec_pTwiddle] + LDR pOut, [pFFTSpec, #ARMsFFTSpec_pBuf] + + @// N=1 Treat seperately + CMP N,#1 + BGT sizeGreaterThanOne + VLD1 dX0[0],[pSrc] + VST1 dX0[0],[pDst] + + B End + +sizeGreaterThanOne: + + @// Call the preTwiddle Radix2 stage before doing the compledIFFT + + + BL armSP_FFTInv_CCSToR_F32_preTwiddleRadix2_unsafe + + +complexIFFT: + + ASR N,N,#1 @// N/2 point complex IFFT + M_STR N, complexFFTSize @ Save N for scaling later + ADD pSrc,pOut,N,LSL #3 @// set pSrc as pOut1 + + CLZ order,N @// N = 2^order + RSB order,order,#31 + MOV subFFTSize,#1 + @//MOV subFFTNum,N + + CMP order,#3 + BGT orderGreaterthan3 @// order > 3 + + CMP order,#1 + BGE orderGreaterthan0 @// order > 0 + + VLD1 dX0,[pSrc] + VST1 dX0,[pDst] + MOV pSrc,pDst + BLT FFTEnd + +orderGreaterthan0: + @// set the buffers appropriately for various orders + CMP order,#2 + MOVNE argDst,pDst + MOVEQ argDst,pOut + @// Pass the first stage destination in RN5 + MOVEQ pOut,pDst + MOV argTwiddle,pTwiddle + + BGE orderGreaterthan1 + BLLT armSP_FFTInv_CToC_FC32_Radix2_fs_OutOfPlace_unsafe @// order = 1 + B FFTEnd + +orderGreaterthan1: + MOV tmpOrder,order @// tmpOrder = RN 4 + BL armSP_FFTInv_CToC_FC32_Radix2_fs_OutOfPlace_unsafe + CMP tmpOrder,#2 + BLGT armSP_FFTInv_CToC_FC32_Radix2_OutOfPlace_unsafe + BL armSP_FFTInv_CToC_FC32_Radix2_ls_OutOfPlace_unsafe + B FFTEnd + + +orderGreaterthan3: +specialScaleCase: + + @// Set input args to fft stages + TST order, #2 + MOVNE argDst,pDst + MOVEQ argDst,pOut + @// Pass the first stage destination in RN5 + MOVEQ pOut,pDst + MOV argTwiddle,pTwiddle + + @//check for even or odd order + @// NOTE: The following combination of BL's would work fine even though + @// the first BL would corrupt the flags. This is because the end of + @// the "grpZeroSetLoop" loop inside + @// armSP_FFTInv_CToC_FC32_Radix4_fs_OutOfPlace_unsafe sets the Z flag + @// to EQ + + TST order,#0x00000001 + BLEQ armSP_FFTInv_CToC_FC32_Radix4_fs_OutOfPlace_unsafe + BLNE armSP_FFTInv_CToC_FC32_Radix8_fs_OutOfPlace_unsafe + + CMP subFFTNum,#4 + BLT FFTEnd + + +unscaledRadix4Loop: + BEQ lastStageUnscaledRadix4 + BL armSP_FFTInv_CToC_FC32_Radix4_OutOfPlace_unsafe + CMP subFFTNum,#4 + B unscaledRadix4Loop + +lastStageUnscaledRadix4: + BL armSP_FFTInv_CToC_FC32_Radix4_ls_OutOfPlace_unsafe + B FFTEnd + +FFTEnd: @// Does only the scaling + @ Scale inverse FFT result by 1/N + + M_LDR N, complexFFTSize + VMOV sN,N + VCVT fN, sN @ fn = fftSize, as a float + VMOV one, 1.0 + VDIV one, one, fN @ one = dScale[0] = 1 / fftSize + + + @// N = subFFTSize ; dataptr = pDst +scaleFFTData: + VLD1 {dX0},[pSrc] @// pSrc contains pDst pointer + SUBS subFFTSize,subFFTSize,#1 + VMUL dX0, dX0, dScale[0] + VST1 {dX0},[pSrc]! + + BGT scaleFFTData + +End: + @// Set return value + MOV result, #OMX_Sts_NoErr + + @// Write function tail + M_END + + + + .end diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CCSToR_F32_Sfs_unscaled_s.S b/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CCSToR_F32_Sfs_unscaled_s.S new file mode 100644 index 0000000000..0a8cb4dccc --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CCSToR_F32_Sfs_unscaled_s.S @@ -0,0 +1,284 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Copyright 2016, Mozilla Foundation and contributors +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This is a modification of omxSP_FFTInv_CCSToR_S32_Sfs_s.s +@// to support float instead of SC32. +@// +@// It is further modified to produce an "unscaled" version, which +@// actually multiplies by two for consistency with the other FFT functions +@// in use. +@// + +@// +@// Description: +@// Compute an inverse FFT for a complex signal +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + .extern armSP_FFTInv_CToC_FC32_Radix2_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_FC32_Radix4_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_FC32_Radix8_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_FC32_Radix4_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_FC32_Radix2_OutOfPlace_unsafe + .extern armSP_FFTInv_CCSToR_F32_preTwiddleRadix2_unsafe + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + @// Guarding implementation by the processor name + +@// Import symbols required from other files +@// (For example tables) + .extern armSP_FFTInv_CToC_FC32_Radix4_ls_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_FC32_Radix2_ls_OutOfPlace_unsafe + + +@//Input Registers + +#define pSrc r0 +#define pDst r1 +#define pFFTSpec r2 +#define scale r3 + + +@// Output registers +#define result r0 + +@//Local Scratch Registers + +#define argTwiddle r1 +#define argDst r2 +#define argScale r4 +#define tmpOrder r4 +#define pTwiddle r4 +#define pOut r5 +#define subFFTSize r7 +#define subFFTNum r6 +#define N r6 +#define order r14 +#define diff r9 +@// Total num of radix stages required to comple the FFT +#define count r8 +#define x0r r4 +#define x0i r5 +#define diffMinusOne r2 +#define round r3 + +#define pOut1 r2 +#define size r7 +#define step r8 +#define step1 r9 +#define twStep r10 +#define pTwiddleTmp r11 +#define argTwiddle1 r12 +#define zero r14 + +@// Neon registers + +#define dX0 D0.F32 +#define dShift D1.F32 +#define dX1 D1.F32 +#define dY0 D2.F32 +#define dY1 D3.F32 +#define dX0r D0.F32 +#define dX0i D1.F32 +#define dX1r D2.F32 +#define dX1i D3.F32 +#define dW0r D4.F32 +#define dW0i D5.F32 +#define dW1r D6.F32 +#define dW1i D7.F32 +#define dT0 D8.F32 +#define dT1 D9.F32 +#define dT2 D10.F32 +#define dT3 D11.F32 +#define qT0 d12.F32 +#define qT1 d14.F32 +#define qT2 d16.F32 +#define qT3 d18.F32 +#define dY0r D4.F32 +#define dY0i D5.F32 +#define dY1r D6.F32 +#define dY1i D7.F32 +#define dzero D20.F32 + +#define dY2 D4.F32 +#define dY3 D5.F32 +#define dW0 D6.F32 +#define dW1 D7.F32 +#define dW0Tmp D10.F32 +#define dW1Neg D11.F32 + +#define sN S0.S32 +#define fN S1.F32 +@// two must be the same as dScale[0]! +#define dScale D2.F32 +#define two S4.F32 + + + @// Allocate stack memory required by the function + M_ALLOC4 complexFFTSize, 4 + + @// Write function header + M_START omxSP_FFTInv_CCSToR_F32_Sfs_unscaled,r11,d15 + +@ Structure offsets for the FFTSpec + .set ARMsFFTSpec_N, 0 + .set ARMsFFTSpec_pBitRev, 4 + .set ARMsFFTSpec_pTwiddle, 8 + .set ARMsFFTSpec_pBuf, 12 + + @// Define stack arguments + + @// Read the size from structure and take log + LDR N, [pFFTSpec, #ARMsFFTSpec_N] + + @// Read other structure parameters + LDR pTwiddle, [pFFTSpec, #ARMsFFTSpec_pTwiddle] + LDR pOut, [pFFTSpec, #ARMsFFTSpec_pBuf] + + @// N=1 Treat seperately + CMP N,#1 + BGT sizeGreaterThanOne + VLD1 dX0[0],[pSrc] + VST1 dX0[0],[pDst] + + B End + +sizeGreaterThanOne: + + @// Call the preTwiddle Radix2 stage before doing the compledIFFT + + + BL armSP_FFTInv_CCSToR_F32_preTwiddleRadix2_unsafe + + +complexIFFT: + + ASR N,N,#1 @// N/2 point complex IFFT + M_STR N, complexFFTSize @ Save N for scaling later + ADD pSrc,pOut,N,LSL #3 @// set pSrc as pOut1 + + CLZ order,N @// N = 2^order + RSB order,order,#31 + MOV subFFTSize,#1 + @//MOV subFFTNum,N + + CMP order,#3 + BGT orderGreaterthan3 @// order > 3 + + CMP order,#1 + BGE orderGreaterthan0 @// order > 0 + + VLD1 dX0,[pSrc] + VST1 dX0,[pDst] + MOV pSrc,pDst + BLT FFTEnd + +orderGreaterthan0: + @// set the buffers appropriately for various orders + CMP order,#2 + MOVNE argDst,pDst + MOVEQ argDst,pOut + @// Pass the first stage destination in RN5 + MOVEQ pOut,pDst + MOV argTwiddle,pTwiddle + + BGE orderGreaterthan1 + BLLT armSP_FFTInv_CToC_FC32_Radix2_fs_OutOfPlace_unsafe @// order = 1 + B FFTEnd + +orderGreaterthan1: + MOV tmpOrder,order @// tmpOrder = RN 4 + BL armSP_FFTInv_CToC_FC32_Radix2_fs_OutOfPlace_unsafe + CMP tmpOrder,#2 + BLGT armSP_FFTInv_CToC_FC32_Radix2_OutOfPlace_unsafe + BL armSP_FFTInv_CToC_FC32_Radix2_ls_OutOfPlace_unsafe + B FFTEnd + + +orderGreaterthan3: +specialScaleCase: + + @// Set input args to fft stages + TST order, #2 + MOVNE argDst,pDst + MOVEQ argDst,pOut + @// Pass the first stage destination in RN5 + MOVEQ pOut,pDst + MOV argTwiddle,pTwiddle + + @//check for even or odd order + @// NOTE: The following combination of BL's would work fine even though + @// the first BL would corrupt the flags. This is because the end of + @// the "grpZeroSetLoop" loop inside + @// armSP_FFTInv_CToC_FC32_Radix4_fs_OutOfPlace_unsafe sets the Z flag + @// to EQ + + TST order,#0x00000001 + BLEQ armSP_FFTInv_CToC_FC32_Radix4_fs_OutOfPlace_unsafe + BLNE armSP_FFTInv_CToC_FC32_Radix8_fs_OutOfPlace_unsafe + + CMP subFFTNum,#4 + BLT FFTEnd + + +unscaledRadix4Loop: + BEQ lastStageUnscaledRadix4 + BL armSP_FFTInv_CToC_FC32_Radix4_OutOfPlace_unsafe + CMP subFFTNum,#4 + B unscaledRadix4Loop + +lastStageUnscaledRadix4: + BL armSP_FFTInv_CToC_FC32_Radix4_ls_OutOfPlace_unsafe + B FFTEnd + +FFTEnd: @// Does only the scaling + @ Scale inverse FFT result by 2 for consistency with other FFTs + VMOV two, 2.0 @ two = dScale[0] + + @// N = subFFTSize ; dataptr = pDst +scaleFFTData: + VLD1 {dX0},[pSrc] @// pSrc contains pDst pointer + SUBS subFFTSize,subFFTSize,#1 + VMUL dX0, dX0, dScale[0] + VST1 {dX0},[pSrc]! + + BGT scaleFFTData + + +End: + @// Set return value + MOV result, #OMX_Sts_NoErr + + @// Write function tail + M_END + + + + .end diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CCSToR_S32S16_Sfs_s.S b/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CCSToR_S32S16_Sfs_s.S new file mode 100644 index 0000000000..becc0327e7 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CCSToR_S32S16_Sfs_s.S @@ -0,0 +1,146 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. +@// + +@// +@// File Name: omxSP_FFTInv_CCSToR_S32S16_Sfs_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 7098 +@// Last Modified Date: Thu, 16 Aug 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute an inverse FFT for a complex signal +@// + + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + .extern omxSP_FFTInv_CCSToR_S32_Sfs + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + @// Guarding implementation by the processor name + + +@// Import symbols required from other files +@// (For example tables) + + +@//Input Registers + +#define pSrc r0 +#define pDst r1 +#define pFFTSpec r2 +#define scale r3 + + +@// Output registers +#define result r0 + + +#define N r6 +#define pOut r5 +#define pTmpDst r4 + + +@// Neon registers + +#define dX0 D0.S32 +#define dX01 D1.S32 +#define qX0 Q0.S32 +#define dY0 D2.S16 +#define dY0S32 D2.S32 + + + + @// Allocate stack memory required by the function + + @// Write function header + M_START omxSP_FFTInv_CCSToR_S32S16_Sfs,r11,d15 + + .set ARMsFFTSpec_N, 0 + .set ARMsFFTSpec_pBitRev, 4 + .set ARMsFFTSpec_pTwiddle, 8 + .set ARMsFFTSpec_pBuf, 12 + + @// Define stack arguments + + @// Read the size from structure and take log + LDR N, [pFFTSpec, #ARMsFFTSpec_N] + + @// Read other structure parameters + @//LDR pTwiddle, [pFFTSpec, #ARMsFFTSpec_pTwiddle] + LDR pOut, [pFFTSpec, #ARMsFFTSpec_pBuf] + + + MOV pTmpDst,pDst + ADD pDst,pOut,N, LSL #2 + + + BL omxSP_FFTInv_CCSToR_S32_Sfs + + ADD pDst,pOut,N, LSL #2 + + CMP N,#2 + BGT copyLoop + BEQ copyS32ToS16 + VLD1 dX0[0],[pDst] + VQMOVN dY0,qX0 + VST1 dY0[0],[pTmpDst] + + B End + +copyS32ToS16: + + VLD1 dX0,[pDst] + VQMOVN dY0,qX0 + VST1 dY0S32[0],[pTmpDst] + B End + +copyLoop: + + VLD1 {dX0,dX01},[pDst]! + SUBS N,N,#4 + VQMOVN dY0,qX0 + VST1 dY0,[pTmpDst]! + + BGT copyLoop + + +End: + @// Set return value + MOV result, #OMX_Sts_NoErr + + @// Write function tail + M_END + + .end diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CCSToR_S32_Sfs_s.S b/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CCSToR_S32_Sfs_s.S new file mode 100644 index 0000000000..003d666036 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CCSToR_S32_Sfs_s.S @@ -0,0 +1,390 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. +@// + +@// +@// File Name: omxSP_FFTInv_CCSToR_S32_Sfs_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 7469 +@// Last Modified Date: Thu, 20 Sep 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute an inverse FFT for a complex signal +@// + + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + + +@// Import symbols required from other files +@// (For example tables) + + .extern armSP_FFTInv_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Radix2_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Radix4_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Radix8_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Radix4_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Sfs_Radix4_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Sfs_Radix8_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Sfs_Radix4_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Sfs_Radix2_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Radix2_OutOfPlace_unsafe + .extern armSP_FFTInv_CCSToR_S32_Sfs_preTwiddleRadix2_unsafe + .extern armSP_FFTInv_CCSToR_S32_preTwiddleRadix2_unsafe + + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + @// Guarding implementation by the processor name + +@// Import symbols required from other files +@// (For example tables) + .extern armSP_FFTInv_CToC_SC32_Radix4_ls_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Radix2_ls_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Sfs_Radix2_ls_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Sfs_Radix4_ls_OutOfPlace_unsafe + + +@//Input Registers + +#define pSrc r0 +#define pDst r1 +#define pFFTSpec r2 +#define scale r3 + + +@// Output registers +#define result r0 + +@//Local Scratch Registers + +#define argTwiddle r1 +#define argDst r2 +#define argScale r4 +#define tmpOrder r4 +#define pTwiddle r4 +#define pOut r5 +#define subFFTSize r7 +#define subFFTNum r6 +#define N r6 +#define order r14 +#define diff r9 +@// Total num of radix stages required to comple the FFT +#define count r8 +#define x0r r4 +#define x0i r5 +#define diffMinusOne r2 +#define round r3 + +#define pOut1 r2 +#define size r7 +#define step r8 +#define step1 r9 +#define twStep r10 +#define pTwiddleTmp r11 +#define argTwiddle1 r12 +#define zero r14 + +@// Neon registers + +#define dX0 D0.S32 +#define dShift D1.S32 +#define dX1 D1.S32 +#define dY0 D2.S32 +#define dY1 D3.S32 +#define dX0r D0.S32 +#define dX0i D1.S32 +#define dX1r D2.S32 +#define dX1i D3.S32 +#define dW0r D4.S32 +#define dW0i D5.S32 +#define dW1r D6.S32 +#define dW1i D7.S32 +#define dT0 D8.S32 +#define dT1 D9.S32 +#define dT2 D10.S32 +#define dT3 D11.S32 +#define qT0 Q6.S64 +#define qT1 Q7.S64 +#define qT2 Q8.S64 +#define qT3 Q9.S64 +#define dY0r D4.S32 +#define dY0i D5.S32 +#define dY1r D6.S32 +#define dY1i D7.S32 +#define dzero D20.S32 + +#define dY2 D4.S32 +#define dY3 D5.S32 +#define dW0 D6.S32 +#define dW1 D7.S32 +#define dW0Tmp D10.S32 +#define dW1Neg D11.S32 + + + + @// Allocate stack memory required by the function + M_ALLOC4 diffOnStack, 4 + + @// Write function header + M_START omxSP_FFTInv_CCSToR_S32_Sfs,r11,d15 + +@ Structure offsets for the FFTSpec + .set ARMsFFTSpec_N, 0 + .set ARMsFFTSpec_pBitRev, 4 + .set ARMsFFTSpec_pTwiddle, 8 + .set ARMsFFTSpec_pBuf, 12 + + @// Define stack arguments + + @// Read the size from structure and take log + LDR N, [pFFTSpec, #ARMsFFTSpec_N] + + @// Read other structure parameters + LDR pTwiddle, [pFFTSpec, #ARMsFFTSpec_pTwiddle] + LDR pOut, [pFFTSpec, #ARMsFFTSpec_pBuf] + + @// N=1 Treat seperately + CMP N,#1 + BGT sizeGreaterThanOne + VLD1 dX0[0],[pSrc] + RSB scale,scale,#0 @// to use VRSHL for right shift by a variable + VMOV dShift[0],scale + VRSHL dX0,dShift + VST1 dX0[0],[pDst] + + B End + +sizeGreaterThanOne: + + @// Call the preTwiddle Radix2 stage before doing the compledIFFT + + @// The following conditional BL combination would work since + @// evenOddButterflyLoop in the first call would set Z flag to zero + + CMP scale,#0 + BLEQ armSP_FFTInv_CCSToR_S32_preTwiddleRadix2_unsafe + BLGT armSP_FFTInv_CCSToR_S32_Sfs_preTwiddleRadix2_unsafe + + + +complexIFFT: + + ASR N,N,#1 @// N/2 point complex IFFT + ADD pSrc,pOut,N,LSL #3 @// set pSrc as pOut1 + + CLZ order,N @// N = 2^order + RSB order,order,#31 + MOV subFFTSize,#1 + @//MOV subFFTNum,N + + ADD scale,scale,order @// FFTInverse has a final scaling factor by N + + CMP order,#3 + BGT orderGreaterthan3 @// order > 3 + + CMP order,#1 + BGE orderGreaterthan0 @// order > 0 + M_STR scale, diffOnStack,LT @// order = 0 + VLD1 dX0,[pSrc] + VST1 dX0,[pDst] + MOV pSrc,pDst + BLT FFTEnd + +orderGreaterthan0: + @// set the buffers appropriately for various orders + CMP order,#2 + MOVNE argDst,pDst + MOVEQ argDst,pOut + MOVEQ pOut,pDst @// Pass the first stage destination in RN5 + MOV argTwiddle,pTwiddle + @// Store the scale factor and scale at the end + SUB diff,scale,order + M_STR diff, diffOnStack + BGE orderGreaterthan1 + BLLT armSP_FFTInv_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe @// order = 1 + B FFTEnd + +orderGreaterthan1: + MOV tmpOrder,order @// tmpOrder = RN 4 + BL armSP_FFTInv_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe + CMP tmpOrder,#2 + BLGT armSP_FFTInv_CToC_SC32_Sfs_Radix2_OutOfPlace_unsafe + BL armSP_FFTInv_CToC_SC32_Sfs_Radix2_ls_OutOfPlace_unsafe + B FFTEnd + + +orderGreaterthan3: + @// check scale = 0 or scale = order + SUBS diff, scale, order @// scale > order + MOVGT scale,order + BGE specialScaleCase @// scale = 0 or scale = order + CMP scale,#0 + BEQ specialScaleCase + B generalScaleCase + +specialScaleCase: @// scale = 0 or scale = order and order >= 2 + + TST order, #2 @// Set input args to fft stages + MOVNE argDst,pDst + MOVEQ argDst,pOut + MOVEQ pOut,pDst @// Pass the first stage destination in RN5 + MOV argTwiddle,pTwiddle + + CMP diff,#0 + M_STR diff, diffOnStack + BGE scaleEqualsOrder + + @//check for even or odd order + @// NOTE: The following combination of BL's would work fine eventhough the first + @// BL would corrupt the flags. This is because the end of the "grpZeroSetLoop" loop inside + @// armSP_FFTInv_CToC_SC32_Radix4_fs_OutOfPlace_unsafe sets the Z flag to EQ + + TST order,#0x00000001 + BLEQ armSP_FFTInv_CToC_SC32_Radix4_fs_OutOfPlace_unsafe + BLNE armSP_FFTInv_CToC_SC32_Radix8_fs_OutOfPlace_unsafe + + CMP subFFTNum,#4 + BLT FFTEnd + + +unscaledRadix4Loop: + BEQ lastStageUnscaledRadix4 + BL armSP_FFTInv_CToC_SC32_Radix4_OutOfPlace_unsafe + CMP subFFTNum,#4 + B unscaledRadix4Loop + +lastStageUnscaledRadix4: + BL armSP_FFTInv_CToC_SC32_Radix4_ls_OutOfPlace_unsafe + B FFTEnd + + +scaleEqualsOrder: + @//check for even or odd order + @// NOTE: The following combination of BL's would work fine eventhough the first + @// BL would corrupt the flags. This is because the end of the "grpZeroSetLoop" loop inside + @// armSP_FFTInv_CToC_SC32_Radix4_fs_OutOfPlace_unsafe sets the Z flag to EQ + + TST order,#0x00000001 + BLEQ armSP_FFTInv_CToC_SC32_Sfs_Radix4_fs_OutOfPlace_unsafe + BLNE armSP_FFTInv_CToC_SC32_Sfs_Radix8_fs_OutOfPlace_unsafe + + CMP subFFTNum,#4 + BLT FFTEnd + + +scaledRadix4Loop: + BEQ lastStageScaledRadix4 + BL armSP_FFTInv_CToC_SC32_Sfs_Radix4_OutOfPlace_unsafe + CMP subFFTNum,#4 + B scaledRadix4Loop + +lastStageScaledRadix4: + BL armSP_FFTInv_CToC_SC32_Sfs_Radix4_ls_OutOfPlace_unsafe + B FFTEnd + +generalScaleCase: @// 0 < scale < order and order >= 2 + @// Determine the correct destination buffer + SUB diff,order,scale + TST diff,#0x01 + ADDEQ count,scale,diff,LSR #1 @// count = scale + (order - scale)/2 + MOVNE count,order + TST count,#0x01 @// Is count even or odd ? + + MOVNE argDst,pDst @// Set input args to fft stages + MOVEQ argDst,pOut + MOVEQ pOut,pDst @// Pass the first stage destination in RN5 + MOV argTwiddle,pTwiddle + + M_STR diff, diffOnStack + + MOV argScale,scale @// Put scale in RN4 so as to save and restore + BL armSP_FFTInv_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe @// scaled first stage + SUBS argScale,argScale,#1 + +scaledRadix2Loop: + BLGT armSP_FFTInv_CToC_SC32_Sfs_Radix2_OutOfPlace_unsafe + SUBS argScale,argScale,#1 @// save and restore scale (RN4) in the scaled stages + BGT scaledRadix2Loop + + + M_LDR diff, diffOnStack + @//check for even or odd order + TST diff,#0x00000001 + BEQ generalUnscaledRadix4Loop + B unscaledRadix2Loop + +generalUnscaledRadix4Loop: + CMP subFFTNum,#4 + BEQ generalLastStageUnscaledRadix4 + BL armSP_FFTInv_CToC_SC32_Radix4_OutOfPlace_unsafe + B generalUnscaledRadix4Loop + +generalLastStageUnscaledRadix4: + BL armSP_FFTInv_CToC_SC32_Radix4_ls_OutOfPlace_unsafe + B End + + +unscaledRadix2Loop: + CMP subFFTNum,#2 + BEQ generalLastStageUnscaledRadix2 + BL armSP_FFTInv_CToC_SC32_Radix2_OutOfPlace_unsafe + B unscaledRadix2Loop + +generalLastStageUnscaledRadix2: + BL armSP_FFTInv_CToC_SC32_Radix2_ls_OutOfPlace_unsafe + B End + + +FFTEnd: @// Does only the scaling + + M_LDR diff, diffOnStack + CMP diff,#0 + BLE End + + RSB diff,diff,#0 @// to use VRSHL for right shift by a variable + VDUP dShift,diff + +scaleFFTData: @// N = subFFTSize ; dataptr = pDst ; scale = diff + VLD1 {dX0},[pSrc] @// pSrc contains pDst pointer + SUBS subFFTSize,subFFTSize,#1 + VRSHL dX0,dShift + VST1 {dX0},[pSrc]! + + BGT scaleFFTData + + +End: + @// Set return value + MOV result, #OMX_Sts_NoErr + + @// Write function tail + M_END + + + + .end diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CToC_FC32_Sfs_s.S b/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CToC_FC32_Sfs_s.S new file mode 100644 index 0000000000..e23ad01121 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CToC_FC32_Sfs_s.S @@ -0,0 +1,214 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This is a modification of armSP_FFT_CToC_SC32_Radix2_fs_unsafe_s.s +@// to support float instead of SC32. +@// + +@// +@// Description: +@// Compute an inverse FFT for a complex signal +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + +@// Import symbols required from other files +@// (For example tables) + + .extern armSP_FFTInv_CToC_FC32_Radix2_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_FC32_Radix4_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_FC32_Radix8_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_FC32_Radix4_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_FC32_Radix2_OutOfPlace_unsafe + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + @// Guarding implementation by the processor name + +@// Import symbols required from other files +@// (For example tables) + .extern armSP_FFTInv_CToC_FC32_Radix4_ls_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_FC32_Radix2_ls_OutOfPlace_unsafe + + +@//Input Registers + +#define pSrc r0 +#define pDst r1 +#define pFFTSpec r2 + + +@// Output registers +#define result r0 + +@//Local Scratch Registers + +#define argTwiddle r1 +#define argDst r2 +#define argScale r4 +#define tmpOrder r4 +#define pTwiddle r4 +#define pOut r5 +#define subFFTSize r7 +#define subFFTNum r6 +#define N r6 +#define order r14 +#define diff r9 +@// Total num of radix stages required to comple the FFT +#define count r8 +#define x0r r4 +#define x0i r5 +#define diffMinusOne r2 + +@// Neon registers + +#define dX0 D0.F32 +#define qX0 Q0.F32 +#define sN S0.S32 +#define fN S1.F32 +@// one must be the same as dScale[0]! +#define dScale D4.F32 +#define one S8.F32 + + + + @// Allocate stack memory required by the function + M_ALLOC4 fftSize, 4 + + @// Write function header + M_START omxSP_FFTInv_CToC_FC32_Sfs,r11,d15 + +@ Structure offsets for the FFTSpec + .set ARMsFFTSpec_N, 0 + .set ARMsFFTSpec_pBitRev, 4 + .set ARMsFFTSpec_pTwiddle, 8 + .set ARMsFFTSpec_pBuf, 12 + + @// Define stack arguments + + @// Read the size from structure and take log + LDR N, [pFFTSpec, #ARMsFFTSpec_N] + M_STR N, fftSize + + @// Read other structure parameters + LDR pTwiddle, [pFFTSpec, #ARMsFFTSpec_pTwiddle] + LDR pOut, [pFFTSpec, #ARMsFFTSpec_pBuf] + + CLZ order,N @// N = 2^order + RSB order,order,#31 + MOV subFFTSize,#1 + @//MOV subFFTNum,N + + CMP order,#3 + BGT orderGreaterthan3 @// order > 3 + + CMP order,#1 + BGE orderGreaterthan0 @// order > 0 + VLD1 dX0,[pSrc] + VST1 dX0,[pDst] + MOV pSrc,pDst + BLT FFTEnd + +orderGreaterthan0: + @// set the buffers appropriately for various orders + CMP order,#2 + MOVNE argDst,pDst + MOVEQ argDst,pOut + @// Pass the first stage destination in RN5 + MOVEQ pOut,pDst + MOV argTwiddle,pTwiddle + BGE orderGreaterthan1 + @// order = 1 + BLLT armSP_FFTInv_CToC_FC32_Radix2_fs_OutOfPlace_unsafe + B FFTEnd + +orderGreaterthan1: + MOV tmpOrder,order @// tmpOrder = RN 4 + BL armSP_FFTInv_CToC_FC32_Radix2_fs_OutOfPlace_unsafe + CMP tmpOrder,#2 + BLGT armSP_FFTInv_CToC_FC32_Radix2_OutOfPlace_unsafe + BL armSP_FFTInv_CToC_FC32_Radix2_ls_OutOfPlace_unsafe + B FFTEnd + + +orderGreaterthan3: + + @// Set input args to fft stages + TST order, #2 + MOVNE argDst,pDst + MOVEQ argDst,pOut + @// Pass the first stage destination in RN5 + MOVEQ pOut,pDst + MOV argTwiddle,pTwiddle + + @//check for even or odd order + @// NOTE: The following combination of BL's would work fine even though + @// the first BL would corrupt the flags. This is because the end of + @// the "grpZeroSetLoop" loop inside + @// armSP_FFTInv_CToC_SC32_Radix4_fs_OutOfPlace_unsafe sets the Z flag + @// to EQ + + TST order,#0x00000001 + BLEQ armSP_FFTInv_CToC_FC32_Radix4_fs_OutOfPlace_unsafe + BLNE armSP_FFTInv_CToC_FC32_Radix8_fs_OutOfPlace_unsafe + + CMP subFFTNum,#4 + BLT FFTEnd + + +unscaledRadix4Loop: + BEQ lastStageUnscaledRadix4 + BL armSP_FFTInv_CToC_FC32_Radix4_OutOfPlace_unsafe + CMP subFFTNum,#4 + B unscaledRadix4Loop + +lastStageUnscaledRadix4: + BL armSP_FFTInv_CToC_FC32_Radix4_ls_OutOfPlace_unsafe + B FFTEnd + +FFTEnd: @// Does only the scaling + + M_LDR N, fftSize + + VMOV sN,N + VCVT fN, sN @ fn = fftSize, as a float + VMOV one, 1.0 + VDIV one, one, fN @ one = dScale[0] = 1 / fftSize + + @ Scale data, doing 2 complex values at a time (because N is + @ always even). + + @// N = subFFTSize ; dataptr = pDst ; scale = diff +scaleFFTData: + VLD1 {qX0},[pSrc, :128] @// pSrc contains pDst pointer + SUBS subFFTSize,subFFTSize,#2 + VMUL qX0, qX0, dScale[0] + VST1 {qX0},[pSrc, :128]! + + BGT scaleFFTData +End: + @// Set return value + MOV result, #OMX_Sts_NoErr + + @// Write function tail + M_END + + .end diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CToC_SC16_Sfs_s.S b/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CToC_SC16_Sfs_s.S new file mode 100644 index 0000000000..ff85e2b5af --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CToC_SC16_Sfs_s.S @@ -0,0 +1,342 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. + +@// +@// +@// File Name: omxSP_FFTInv_CToC_SC16_Sfs_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 6729 +@// Last Modified Date: Tue, 17 Jul 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute an inverse FFT for a complex signal +@// +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + +@// Import symbols required from other files +@// (For example tables) + + .extern armSP_FFTInv_CToC_SC16_Sfs_Radix2_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC16_Radix2_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC16_Radix4_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC16_Radix4_ls_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC16_Radix8_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC16_Radix4_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC16_Sfs_Radix4_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC16_Sfs_Radix4_ls_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC16_Sfs_Radix8_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC16_Sfs_Radix4_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC16_Sfs_Radix2_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC16_Radix2_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC16_Sfs_Radix2_ls_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC16_Radix2_ls_OutOfPlace_unsafe + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + +@// Guarding implementation by the processor name + + + .extern armSP_FFTInv_CToC_SC16_Radix2_ps_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC16_Sfs_Radix2_ps_OutOfPlace_unsafe + +@//Input Registers + +#define pSrc r0 +#define pDst r1 +#define pFFTSpec r2 +#define scale r3 + + +@// Output registers +#define result r0 + +@//Local Scratch Registers + +#define argTwiddle r1 +#define argDst r2 +#define argScale r4 +#define pTwiddle r4 +#define tmpOrder r4 +#define pOut r5 +#define subFFTSize r7 +#define subFFTNum r6 +#define N r6 +#define order r14 +#define diff r9 +@// Total num of radix stages required to comple the FFT +#define count r8 +#define x0r r4 +#define x0i r5 +#define diffMinusOne r2 +#define round r3 + +@// Neon registers + +#define dX0 D0.S16 +#define dShift D1.S16 +#define dX0S32 D0.S32 + + + @// Allocate stack memory required by the function + M_ALLOC4 diffOnStack, 4 + + @// Write function header + M_START omxSP_FFTInv_CToC_SC16_Sfs,r11,d15 + +@ Structure offsets for the FFTSpec + .set ARMsFFTSpec_N, 0 + .set ARMsFFTSpec_pBitRev, 4 + .set ARMsFFTSpec_pTwiddle, 8 + .set ARMsFFTSpec_pBuf, 12 + + @// Define stack arguments + + @// Read the size from structure and take log + LDR N, [pFFTSpec, #ARMsFFTSpec_N] + + @// Read other structure parameters + LDR pTwiddle, [pFFTSpec, #ARMsFFTSpec_pTwiddle] + LDR pOut, [pFFTSpec, #ARMsFFTSpec_pBuf] + + CLZ order,N @// N = 2^order + RSB order,order,#31 + MOV subFFTSize,#1 + @//MOV subFFTNum,N + + ADD scale,scale,order @// FFTInverse has a final scaling factor by N + + CMP order,#3 + BGT orderGreaterthan3 @// order > 3 + + CMP order,#1 + BGE orderGreaterthan0 @// order > 0 + M_STR scale, diffOnStack,LT @// order = 0 + LDRLT x0r,[pSrc] + STRLT x0r,[pDst] + MOVLT pSrc,pDst + BLT FFTEnd + +orderGreaterthan0: + @// set the buffers appropriately for various orders + CMP order,#2 + MOVNE argDst,pDst + MOVEQ argDst,pOut + MOVEQ pOut,pDst @// Pass the first stage destination in RN5 + MOV argTwiddle,pTwiddle + @// Store the scale factor and scale at the end + SUB diff,scale,order + M_STR diff, diffOnStack + BGE orderGreaterthan1 + BLLT armSP_FFTInv_CToC_SC16_Sfs_Radix2_fs_OutOfPlace_unsafe @// order = 1 + B FFTEnd + + +orderGreaterthan1: + MOV tmpOrder,order @// tmpOrder = RN 4 + BL armSP_FFTInv_CToC_SC16_Sfs_Radix2_fs_OutOfPlace_unsafe + CMP tmpOrder,#2 + BLGT armSP_FFTInv_CToC_SC16_Sfs_Radix2_ps_OutOfPlace_unsafe + BL armSP_FFTInv_CToC_SC16_Sfs_Radix2_ls_OutOfPlace_unsafe + B FFTEnd + + + + +orderGreaterthan3: + @// check scale = 0 or scale = order + SUBS diff, scale, order @// scale > order + MOVGT scale,order + BGE specialScaleCase @// scale = 0 or scale = order + CMP scale,#0 + BEQ specialScaleCase + B generalScaleCase + +specialScaleCase: @// scale = 0 or scale = order and order > 3 + + TST order, #2 @// Set input args to fft stages + MOVNE argDst,pDst + MOVEQ argDst,pOut + MOVEQ pOut,pDst @// Pass the first stage destination in RN5 + MOV argTwiddle,pTwiddle + + CMP diff,#0 + M_STR diff, diffOnStack + BGE scaleEqualsOrder + + @//check for even or odd order + @// NOTE: The following combination of BL's would work fine eventhough the first + @// BL would corrupt the flags. This is because the end of the "grpZeroSetLoop" loop inside + @// armSP_FFTInv_CToC_SC16_Radix4_fs_OutOfPlace_unsafe sets the Z flag to EQ + + TST order,#0x00000001 + BLEQ armSP_FFTInv_CToC_SC16_Radix4_fs_OutOfPlace_unsafe + BLNE armSP_FFTInv_CToC_SC16_Radix8_fs_OutOfPlace_unsafe + + CMP subFFTNum,#4 + BLT FFTEnd + +unscaledRadix4Loop: + BEQ lastStageUnscaledRadix4 + BL armSP_FFTInv_CToC_SC16_Radix4_OutOfPlace_unsafe + CMP subFFTNum,#4 + B unscaledRadix4Loop + +lastStageUnscaledRadix4: + BL armSP_FFTInv_CToC_SC16_Radix4_ls_OutOfPlace_unsafe + B FFTEnd + +scaleEqualsOrder: + @//check for even or odd order + @// NOTE: The following combination of BL's would work fine eventhough the first + @// BL would corrupt the flags. This is because the end of the "grpZeroSetLoop" loop inside + @// armSP_FFTInv_CToC_SC32_Radix4_fs_OutOfPlace_unsafe sets the Z flag to EQ + + TST order,#0x00000001 + BLEQ armSP_FFTInv_CToC_SC16_Sfs_Radix4_fs_OutOfPlace_unsafe + BLNE armSP_FFTInv_CToC_SC16_Sfs_Radix8_fs_OutOfPlace_unsafe + + CMP subFFTNum,#4 + BLT FFTEnd + +scaledRadix4Loop: + BEQ lastStageScaledRadix4 + BL armSP_FFTInv_CToC_SC16_Sfs_Radix4_OutOfPlace_unsafe + CMP subFFTNum,#4 + B scaledRadix4Loop + +lastStageScaledRadix4: + BL armSP_FFTInv_CToC_SC16_Sfs_Radix4_ls_OutOfPlace_unsafe + B FFTEnd + + + +generalScaleCase: @// 0 < scale < order and order > 3 + @// Determine the correct destination buffer + SUB diff,order,scale + TST diff,#0x01 + ADDEQ count,scale,diff,LSR #1 @// count = scale + (order - scale)/2 + MOVNE count,order + TST count,#0x01 @// Is count even or odd ? + + MOVNE argDst,pDst @// Set input args to fft stages + MOVEQ argDst,pOut + MOVEQ pOut,pDst @// Pass the first stage destination in RN5 + MOV argTwiddle,pTwiddle + + CMP diff,#1 + M_STR diff, diffOnStack + BEQ scaleps @// scaling including a radix2_ps stage + + MOV argScale,scale @// Put scale in RN4 so as to save and restore + BL armSP_FFTInv_CToC_SC16_Sfs_Radix2_fs_OutOfPlace_unsafe @// scaled first stage + SUBS argScale,argScale,#1 + +scaledRadix2Loop: + BLGT armSP_FFTInv_CToC_SC16_Sfs_Radix2_OutOfPlace_unsafe + SUBS argScale,argScale,#1 @// save and restore scale (RN4) in the scaled stages + BGT scaledRadix2Loop + B outScale + +scaleps: + SUB argScale,scale,#1 @// order>3 and diff=1 => scale >= 3 + BL armSP_FFTInv_CToC_SC16_Sfs_Radix2_fs_OutOfPlace_unsafe @// scaled first stage + SUBS argScale,argScale,#1 + +scaledRadix2psLoop: + BEQ scaledRadix2psStage + BLGT armSP_FFTInv_CToC_SC16_Sfs_Radix2_OutOfPlace_unsafe + SUBS argScale,argScale,#1 @// save and restore scale (RN4) in the scaled stages + BGE scaledRadix2psLoop + +scaledRadix2psStage: + BL armSP_FFTInv_CToC_SC16_Sfs_Radix2_ps_OutOfPlace_unsafe + B generalLastStageUnscaledRadix2 + + +outScale: + M_LDR diff, diffOnStack + @//check for even or odd order + TST diff,#0x00000001 + BEQ generalUnscaledRadix4Loop + B unscaledRadix2Loop + +generalUnscaledRadix4Loop: + CMP subFFTNum,#4 + BEQ generalLastStageUnscaledRadix4 + BL armSP_FFTInv_CToC_SC16_Radix4_OutOfPlace_unsafe + B generalUnscaledRadix4Loop + +generalLastStageUnscaledRadix4: + BL armSP_FFTInv_CToC_SC16_Radix4_ls_OutOfPlace_unsafe + B End + +unscaledRadix2Loop: + CMP subFFTNum,#4 + BEQ generalLastTwoStagesUnscaledRadix2 + BL armSP_FFTInv_CToC_SC16_Radix2_OutOfPlace_unsafe + B unscaledRadix2Loop + +generalLastTwoStagesUnscaledRadix2: + BL armSP_FFTInv_CToC_SC16_Radix2_ps_OutOfPlace_unsafe +generalLastStageUnscaledRadix2: + BL armSP_FFTInv_CToC_SC16_Radix2_ls_OutOfPlace_unsafe + B End + + +FFTEnd: @// Does only the scaling + + M_LDR diff, diffOnStack + CMP diff,#0 + BLE End + + RSB diff,diff,#0 @// to use VRSHL for right shift by a variable + VDUP dShift,diff + +scaleFFTData: @// N = subFFTSize ; dataptr = pDst ; scale = diff + VLD1 {dX0S32[0]},[pSrc] @// pSrc contains pDst pointer + SUBS subFFTSize,subFFTSize,#1 + VRSHL dX0,dShift + VST1 {dX0S32[0]},[pSrc]! + + BGT scaleFFTData + + +End: + @// Set return value + MOV result, #OMX_Sts_NoErr + + @// Write function tail + M_END + + + + + + + .END diff --git a/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CToC_SC32_Sfs_s.S b/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CToC_SC32_Sfs_s.S new file mode 100644 index 0000000000..09c461cc78 --- /dev/null +++ b/media/openmax_dl/dl/sp/src/omxSP_FFTInv_CToC_SC32_Sfs_s.S @@ -0,0 +1,314 @@ +@// +@// Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. +@// +@// Use of this source code is governed by a BSD-style license +@// that can be found in the LICENSE file in the root of the source +@// tree. An additional intellectual property rights grant can be found +@// in the file PATENTS. All contributing project authors may +@// be found in the AUTHORS file in the root of the source tree. +@// +@// This file was originally licensed as follows. It has been +@// relicensed with permission from the copyright holders. +@// + +@// +@// File Name: omxSP_FFTInv_CToC_SC32_Sfs_s.s +@// OpenMAX DL: v1.0.2 +@// Last Modified Revision: 6675 +@// Last Modified Date: Fri, 06 Jul 2007 +@// +@// (c) Copyright 2007-2008 ARM Limited. All Rights Reserved. +@// +@// +@// +@// Description: +@// Compute an inverse FFT for a complex signal +@// + + +@// Include standard headers + +#include "dl/api/armCOMM_s.h" +#include "dl/api/omxtypes_s.h" + +@// Import symbols required from other files +@// (For example tables) + + .extern armSP_FFTInv_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Radix2_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Radix4_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Radix8_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Radix4_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Sfs_Radix4_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Sfs_Radix8_fs_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Sfs_Radix4_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Sfs_Radix2_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Radix2_OutOfPlace_unsafe + +@// Set debugging level +@//DEBUG_ON SETL {TRUE} + + + +@// Guarding implementation by the processor name + + + + @// Guarding implementation by the processor name + +@// Import symbols required from other files +@// (For example tables) + .extern armSP_FFTInv_CToC_SC32_Radix4_ls_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Radix2_ls_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Sfs_Radix2_ls_OutOfPlace_unsafe + .extern armSP_FFTInv_CToC_SC32_Sfs_Radix4_ls_OutOfPlace_unsafe + + +@//Input Registers + +#define pSrc r0 +#define pDst r1 +#define pFFTSpec r2 +#define scale r3 + + +@// Output registers +#define result r0 + +@//Local Scratch Registers + +#define argTwiddle r1 +#define argDst r2 +#define argScale r4 +#define tmpOrder r4 +#define pTwiddle r4 +#define pOut r5 +#define subFFTSize r7 +#define subFFTNum r6 +#define N r6 +#define order r14 +#define diff r9 +@// Total num of radix stages required to comple the FFT +#define count r8 +#define x0r r4 +#define x0i r5 +#define diffMinusOne r2 +#define round r3 + +@// Neon registers + +#define dX0 D0.S32 +#define dShift D1.S32 + + + + @// Allocate stack memory required by the function + M_ALLOC4 diffOnStack, 4 + + @// Write function header + M_START omxSP_FFTInv_CToC_SC32_Sfs,r11,d15 + +@ Structure offsets for the FFTSpec + .set ARMsFFTSpec_N, 0 + .set ARMsFFTSpec_pBitRev, 4 + .set ARMsFFTSpec_pTwiddle, 8 + .set ARMsFFTSpec_pBuf, 12 + + @// Define stack arguments + + @// Read the size from structure and take log + LDR N, [pFFTSpec, #ARMsFFTSpec_N] + + @// Read other structure parameters + LDR pTwiddle, [pFFTSpec, #ARMsFFTSpec_pTwiddle] + LDR pOut, [pFFTSpec, #ARMsFFTSpec_pBuf] + + CLZ order,N @// N = 2^order + RSB order,order,#31 + MOV subFFTSize,#1 + @//MOV subFFTNum,N + + ADD scale,scale,order @// FFTInverse has a final scaling factor by N + + CMP order,#3 + BGT orderGreaterthan3 @// order > 3 + + CMP order,#1 + BGE orderGreaterthan0 @// order > 0 + M_STR scale, diffOnStack,LT @// order = 0 + VLD1 dX0,[pSrc] + VST1 dX0,[pDst] + MOV pSrc,pDst + BLT FFTEnd + +orderGreaterthan0: + @// set the buffers appropriately for various orders + CMP order,#2 + MOVNE argDst,pDst + MOVEQ argDst,pOut + MOVEQ pOut,pDst @// Pass the first stage destination in RN5 + MOV argTwiddle,pTwiddle + @// Store the scale factor and scale at the end + SUB diff,scale,order + M_STR diff, diffOnStack + BGE orderGreaterthan1 + BLLT armSP_FFTInv_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe @// order = 1 + B FFTEnd + +orderGreaterthan1: + MOV tmpOrder,order @// tmpOrder = RN 4 + BL armSP_FFTInv_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe + CMP tmpOrder,#2 + BLGT armSP_FFTInv_CToC_SC32_Sfs_Radix2_OutOfPlace_unsafe + BL armSP_FFTInv_CToC_SC32_Sfs_Radix2_ls_OutOfPlace_unsafe + B FFTEnd + + +orderGreaterthan3: + @// check scale = 0 or scale = order + SUBS diff, scale, order @// scale > order + MOVGT scale,order + BGE specialScaleCase @// scale = 0 or scale = order + CMP scale,#0 + BEQ specialScaleCase + B generalScaleCase + +specialScaleCase: @// scale = 0 or scale = order and order >= 2 + + TST order, #2 @// Set input args to fft stages + MOVNE argDst,pDst + MOVEQ argDst,pOut + MOVEQ pOut,pDst @// Pass the first stage destination in RN5 + MOV argTwiddle,pTwiddle + + CMP diff,#0 + M_STR diff, diffOnStack + BGE scaleEqualsOrder + + @//check for even or odd order + @// NOTE: The following combination of BL's would work fine eventhough the first + @// BL would corrupt the flags. This is because the end of the "grpZeroSetLoop" loop inside + @// armSP_FFTInv_CToC_SC32_Radix4_fs_OutOfPlace_unsafe sets the Z flag to EQ + + TST order,#0x00000001 + BLEQ armSP_FFTInv_CToC_SC32_Radix4_fs_OutOfPlace_unsafe + BLNE armSP_FFTInv_CToC_SC32_Radix8_fs_OutOfPlace_unsafe + + CMP subFFTNum,#4 + BLT FFTEnd + + +unscaledRadix4Loop: + BEQ lastStageUnscaledRadix4 + BL armSP_FFTInv_CToC_SC32_Radix4_OutOfPlace_unsafe + CMP subFFTNum,#4 + B unscaledRadix4Loop + +lastStageUnscaledRadix4: + BL armSP_FFTInv_CToC_SC32_Radix4_ls_OutOfPlace_unsafe + B FFTEnd + + +scaleEqualsOrder: + @//check for even or odd order + @// NOTE: The following combination of BL's would work fine eventhough the first + @// BL would corrupt the flags. This is because the end of the "grpZeroSetLoop" loop inside + @// armSP_FFTInv_CToC_SC32_Radix4_fs_OutOfPlace_unsafe sets the Z flag to EQ + + TST order,#0x00000001 + BLEQ armSP_FFTInv_CToC_SC32_Sfs_Radix4_fs_OutOfPlace_unsafe + BLNE armSP_FFTInv_CToC_SC32_Sfs_Radix8_fs_OutOfPlace_unsafe + + CMP subFFTNum,#4 + BLT FFTEnd + + +scaledRadix4Loop: + BEQ lastStageScaledRadix4 + BL armSP_FFTInv_CToC_SC32_Sfs_Radix4_OutOfPlace_unsafe + CMP subFFTNum,#4 + B scaledRadix4Loop + +lastStageScaledRadix4: + BL armSP_FFTInv_CToC_SC32_Sfs_Radix4_ls_OutOfPlace_unsafe + B FFTEnd + +generalScaleCase: @// 0 < scale < order and order >= 2 + @// Determine the correct destination buffer + SUB diff,order,scale + TST diff,#0x01 + ADDEQ count,scale,diff,LSR #1 @// count = scale + (order - scale)/2 + MOVNE count,order + TST count,#0x01 @// Is count even or odd ? + + MOVNE argDst,pDst @// Set input args to fft stages + MOVEQ argDst,pOut + MOVEQ pOut,pDst @// Pass the first stage destination in RN5 + MOV argTwiddle,pTwiddle + + M_STR diff, diffOnStack + + MOV argScale,scale @// Put scale in RN4 so as to save and restore + BL armSP_FFTInv_CToC_SC32_Sfs_Radix2_fs_OutOfPlace_unsafe @// scaled first stage + SUBS argScale,argScale,#1 + +scaledRadix2Loop: + BLGT armSP_FFTInv_CToC_SC32_Sfs_Radix2_OutOfPlace_unsafe + SUBS argScale,argScale,#1 @// save and restore scale (RN4) in the scaled stages + BGT scaledRadix2Loop + + + M_LDR diff, diffOnStack + @//check for even or odd order + TST diff,#0x00000001 + BEQ generalUnscaledRadix4Loop + B unscaledRadix2Loop + +generalUnscaledRadix4Loop: + CMP subFFTNum,#4 + BEQ generalLastStageUnscaledRadix4 + BL armSP_FFTInv_CToC_SC32_Radix4_OutOfPlace_unsafe + B generalUnscaledRadix4Loop + +generalLastStageUnscaledRadix4: + BL armSP_FFTInv_CToC_SC32_Radix4_ls_OutOfPlace_unsafe + B End + + +unscaledRadix2Loop: + CMP subFFTNum,#2 + BEQ generalLastStageUnscaledRadix2 + BL armSP_FFTInv_CToC_SC32_Radix2_OutOfPlace_unsafe + B unscaledRadix2Loop + +generalLastStageUnscaledRadix2: + BL armSP_FFTInv_CToC_SC32_Radix2_ls_OutOfPlace_unsafe + B End + + +FFTEnd: @// Does only the scaling + + M_LDR diff, diffOnStack + CMP diff,#0 + BLE End + + RSB diff,diff,#0 @// to use VRSHL for right shift by a variable + VDUP dShift,diff + +scaleFFTData: @// N = subFFTSize ; dataptr = pDst ; scale = diff + VLD1 {dX0},[pSrc] @// pSrc contains pDst pointer + SUBS subFFTSize,subFFTSize,#1 + VRSHL dX0,dShift + VST1 {dX0},[pSrc]! + + BGT scaleFFTData + + +End: + @// Set return value + MOV result, #OMX_Sts_NoErr + + @// Write function tail + M_END + + .end diff --git a/media/openmax_dl/moz.build b/media/openmax_dl/moz.build new file mode 100644 index 0000000000..02bd9eab62 --- /dev/null +++ b/media/openmax_dl/moz.build @@ -0,0 +1,7 @@ +# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- +# vim: set filetype=python: +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +DIRS += ['dl']
\ No newline at end of file |