Enable isac NEON building on Aarch64
Passed building isac_neon and modules_unittests on Android ARM64 and ARMv7. Passed modules_unittests with following filters: --gtest_filter=FiltersTest* --gtest_filter=LpcMaskingModelTest* --gtest_filter=TransformTest* --gtest_filter=FilterBanksTest* WebRtcIsacfix_CalculateResidualEnergyNeon is not enabled due to Issue 4224. BUG=4002 R=andrew@webrtc.org, jridges@masque.com, kjellander@webrtc.org Review URL: https://webrtc-codereview.appspot.com/39979004 Patch from Zhongwei Yao <zhongwei.yao@arm.com>. Cr-Commit-Position: refs/heads/master@{#8632} git-svn-id: http://webrtc.googlecode.com/svn/trunk@8632 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
parent
0d5ea21325
commit
75e850e192
@ -532,6 +532,10 @@ source_set("isacfix") {
|
|||||||
"../../system_wrappers",
|
"../../system_wrappers",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if (cpu_arch == "arm64") {
|
||||||
|
deps += [ ":isac_neon" ]
|
||||||
|
}
|
||||||
|
|
||||||
if (rtc_build_armv7_neon) {
|
if (rtc_build_armv7_neon) {
|
||||||
deps += [ ":isac_neon" ]
|
deps += [ ":isac_neon" ]
|
||||||
|
|
||||||
@ -582,10 +586,12 @@ source_set("isacfix") {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rtc_build_armv7_neon) {
|
if (rtc_build_armv7_neon || cpu_arch == "arm64") {
|
||||||
source_set("isac_neon") {
|
source_set("isac_neon") {
|
||||||
sources = [
|
sources = [ "codecs/isac/fix/source/entropy_coding_neon.c" ]
|
||||||
"codecs/isac/fix/source/entropy_coding_neon.c",
|
|
||||||
|
if (rtc_build_armv7_neon) {
|
||||||
|
sources += [
|
||||||
"codecs/isac/fix/source/filterbanks_neon.S",
|
"codecs/isac/fix/source/filterbanks_neon.S",
|
||||||
"codecs/isac/fix/source/filters_neon.S",
|
"codecs/isac/fix/source/filters_neon.S",
|
||||||
"codecs/isac/fix/source/lattice_neon.S",
|
"codecs/isac/fix/source/lattice_neon.S",
|
||||||
@ -593,6 +599,27 @@ if (rtc_build_armv7_neon) {
|
|||||||
"codecs/isac/fix/source/transform_neon.S",
|
"codecs/isac/fix/source/transform_neon.S",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# Enable compilation for the ARM v7 Neon instruction set. This is needed
|
||||||
|
# since //build/config/arm.gni only enables Neon for iOS, not Android.
|
||||||
|
# This provides the same functionality as webrtc/build/arm_neon.gypi.
|
||||||
|
# TODO(kjellander): Investigate if this can be moved into webrtc.gni or
|
||||||
|
# //build/config/arm.gni instead, to reduce code duplication.
|
||||||
|
# Remove the -mfpu=vfpv3-d16 cflag.
|
||||||
|
configs -= [ "//build/config/compiler:compiler_arm_fpu" ]
|
||||||
|
cflags = [
|
||||||
|
"-mfpu=neon",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cpu_arch == "arm64") {
|
||||||
|
sources += [
|
||||||
|
"codecs/isac/fix/source/filterbanks_neon.c",
|
||||||
|
"codecs/isac/fix/source/filters_neon.c",
|
||||||
|
"codecs/isac/fix/source/lattice_neon.c",
|
||||||
|
"codecs/isac/fix/source/transform_neon.c",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
include_dirs = [
|
include_dirs = [
|
||||||
"../../..",
|
"../../..",
|
||||||
]
|
]
|
||||||
@ -605,17 +632,6 @@ if (rtc_build_armv7_neon) {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
# Enable compilation for the ARM v7 Neon instruction set. This is needed
|
|
||||||
# since //build/config/arm.gni only enables Neon for iOS, not Android.
|
|
||||||
# This provides the same functionality as webrtc/build/arm_neon.gypi.
|
|
||||||
# TODO(kjellander): Investigate if this can be moved into webrtc.gni or
|
|
||||||
# //build/config/arm.gni instead, to reduce code duplication.
|
|
||||||
# Remove the -mfpu=vfpv3-d16 cflag.
|
|
||||||
configs -= [ "//build/config/compiler:compiler_arm_fpu" ]
|
|
||||||
cflags = [
|
|
||||||
"-mfpu=neon",
|
|
||||||
]
|
|
||||||
|
|
||||||
configs += [ "../..:common_config" ]
|
configs += [ "../..:common_config" ]
|
||||||
public_configs = [ "../..:common_inherited_config" ]
|
public_configs = [ "../..:common_inherited_config" ]
|
||||||
|
|
||||||
|
@ -90,7 +90,8 @@ void WebRtcIsacfix_Spec2TimeC(int16_t* inreQ7,
|
|||||||
int32_t* outre1Q16,
|
int32_t* outre1Q16,
|
||||||
int32_t* outre2Q16);
|
int32_t* outre2Q16);
|
||||||
|
|
||||||
#if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON)
|
#if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON) || \
|
||||||
|
(defined WEBRTC_ARCH_ARM64_NEON)
|
||||||
void WebRtcIsacfix_Time2SpecNeon(int16_t* inre1Q9,
|
void WebRtcIsacfix_Time2SpecNeon(int16_t* inre1Q9,
|
||||||
int16_t* inre2Q9,
|
int16_t* inre2Q9,
|
||||||
int16_t* outre,
|
int16_t* outre,
|
||||||
@ -174,7 +175,8 @@ void WebRtcIsacfix_FilterMaLoopC(int16_t input0,
|
|||||||
int32_t* ptr1,
|
int32_t* ptr1,
|
||||||
int32_t* ptr2);
|
int32_t* ptr2);
|
||||||
|
|
||||||
#if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON)
|
#if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON) || \
|
||||||
|
(defined WEBRTC_ARCH_ARM64_NEON)
|
||||||
int WebRtcIsacfix_AutocorrNeon(int32_t* __restrict r,
|
int WebRtcIsacfix_AutocorrNeon(int32_t* __restrict r,
|
||||||
const int16_t* __restrict x,
|
const int16_t* __restrict x,
|
||||||
int16_t N,
|
int16_t N,
|
||||||
|
@ -147,7 +147,8 @@ void WebRtcIsacfix_MatrixProduct2C(const int16_t matrix0[],
|
|||||||
const int matrix0_index_factor,
|
const int matrix0_index_factor,
|
||||||
const int matrix0_index_step);
|
const int matrix0_index_step);
|
||||||
|
|
||||||
#if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON)
|
#if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON) || \
|
||||||
|
(defined WEBRTC_ARCH_ARM64_NEON)
|
||||||
void WebRtcIsacfix_MatrixProduct1Neon(const int16_t matrix0[],
|
void WebRtcIsacfix_MatrixProduct1Neon(const int16_t matrix0[],
|
||||||
const int32_t matrix1[],
|
const int32_t matrix1[],
|
||||||
int32_t matrix_product[],
|
int32_t matrix_product[],
|
||||||
|
@ -60,7 +60,8 @@ void WebRtcIsacfix_AllpassFilter2FixDec16C(
|
|||||||
int32_t *filter_state_ch1,
|
int32_t *filter_state_ch1,
|
||||||
int32_t *filter_state_ch2);
|
int32_t *filter_state_ch2);
|
||||||
|
|
||||||
#if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON)
|
#if (defined WEBRTC_DETECT_ARM_NEON) || (defined WEBRTC_ARCH_ARM_NEON) || \
|
||||||
|
(defined WEBRTC_ARCH_ARM64_NEON)
|
||||||
void WebRtcIsacfix_AllpassFilter2FixDec16Neon(
|
void WebRtcIsacfix_AllpassFilter2FixDec16Neon(
|
||||||
int16_t *data_ch1,
|
int16_t *data_ch1,
|
||||||
int16_t *data_ch2,
|
int16_t *data_ch2,
|
||||||
|
@ -198,14 +198,17 @@ int16_t WebRtcIsacfix_FreeInternal(ISACFIX_MainStruct *ISAC_main_inst)
|
|||||||
* This function initializes function pointers for ARM Neon platform.
|
* This function initializes function pointers for ARM Neon platform.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if (defined WEBRTC_DETECT_ARM_NEON || defined WEBRTC_ARCH_ARM_NEON)
|
#if (defined WEBRTC_DETECT_ARM_NEON || defined WEBRTC_ARCH_ARM_NEON) || \
|
||||||
|
(defined WEBRTC_ARCH_ARM64_NEON)
|
||||||
static void WebRtcIsacfix_InitNeon(void) {
|
static void WebRtcIsacfix_InitNeon(void) {
|
||||||
WebRtcIsacfix_AutocorrFix = WebRtcIsacfix_AutocorrNeon;
|
WebRtcIsacfix_AutocorrFix = WebRtcIsacfix_AutocorrNeon;
|
||||||
WebRtcIsacfix_FilterMaLoopFix = WebRtcIsacfix_FilterMaLoopNeon;
|
WebRtcIsacfix_FilterMaLoopFix = WebRtcIsacfix_FilterMaLoopNeon;
|
||||||
WebRtcIsacfix_Spec2Time = WebRtcIsacfix_Spec2TimeNeon;
|
WebRtcIsacfix_Spec2Time = WebRtcIsacfix_Spec2TimeNeon;
|
||||||
WebRtcIsacfix_Time2Spec = WebRtcIsacfix_Time2SpecNeon;
|
WebRtcIsacfix_Time2Spec = WebRtcIsacfix_Time2SpecNeon;
|
||||||
|
#if !(defined WEBRTC_ARCH_ARM64_NEON)
|
||||||
WebRtcIsacfix_CalculateResidualEnergy =
|
WebRtcIsacfix_CalculateResidualEnergy =
|
||||||
WebRtcIsacfix_CalculateResidualEnergyNeon;
|
WebRtcIsacfix_CalculateResidualEnergyNeon;
|
||||||
|
#endif
|
||||||
WebRtcIsacfix_AllpassFilter2FixDec16 =
|
WebRtcIsacfix_AllpassFilter2FixDec16 =
|
||||||
WebRtcIsacfix_AllpassFilter2FixDec16Neon;
|
WebRtcIsacfix_AllpassFilter2FixDec16Neon;
|
||||||
WebRtcIsacfix_MatrixProduct1 = WebRtcIsacfix_MatrixProduct1Neon;
|
WebRtcIsacfix_MatrixProduct1 = WebRtcIsacfix_MatrixProduct1Neon;
|
||||||
@ -334,7 +337,7 @@ int16_t WebRtcIsacfix_EncoderInit(ISACFIX_MainStruct *ISAC_main_inst,
|
|||||||
if ((WebRtc_GetCPUFeaturesARM() & kCPUFeatureNEON) != 0) {
|
if ((WebRtc_GetCPUFeaturesARM() & kCPUFeatureNEON) != 0) {
|
||||||
WebRtcIsacfix_InitNeon();
|
WebRtcIsacfix_InitNeon();
|
||||||
}
|
}
|
||||||
#elif defined(WEBRTC_ARCH_ARM_NEON)
|
#elif defined(WEBRTC_ARCH_ARM_NEON) || defined(WEBRTC_ARCH_ARM64_NEON)
|
||||||
WebRtcIsacfix_InitNeon();
|
WebRtcIsacfix_InitNeon();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -95,6 +95,9 @@
|
|||||||
}],
|
}],
|
||||||
],
|
],
|
||||||
}],
|
}],
|
||||||
|
['target_arch=="arm64"', {
|
||||||
|
'dependencies': ['isac_neon', ],
|
||||||
|
}],
|
||||||
['target_arch=="mipsel" and mips_arch_variant!="r6" and android_webview_build==0', {
|
['target_arch=="mipsel" and mips_arch_variant!="r6" and android_webview_build==0', {
|
||||||
'sources': [
|
'sources': [
|
||||||
'fix/source/entropy_coding_mips.c',
|
'fix/source/entropy_coding_mips.c',
|
||||||
@ -128,7 +131,7 @@
|
|||||||
},
|
},
|
||||||
],
|
],
|
||||||
'conditions': [
|
'conditions': [
|
||||||
['target_arch=="arm" and arm_version>=7', {
|
['target_arch=="arm" and arm_version>=7 or target_arch=="arm64"', {
|
||||||
'targets': [
|
'targets': [
|
||||||
{
|
{
|
||||||
'target_name': 'isac_neon',
|
'target_name': 'isac_neon',
|
||||||
@ -156,6 +159,21 @@
|
|||||||
'-ffat-lto-objects',
|
'-ffat-lto-objects',
|
||||||
],
|
],
|
||||||
}],
|
}],
|
||||||
|
['target_arch=="arm64"', {
|
||||||
|
'sources!': [
|
||||||
|
'fix/source/filterbanks_neon.S',
|
||||||
|
'fix/source/filters_neon.S',
|
||||||
|
'fix/source/lattice_neon.S',
|
||||||
|
'fix/source/lpc_masking_model_neon.S',
|
||||||
|
'fix/source/transform_neon.S',
|
||||||
|
],
|
||||||
|
'sources': [
|
||||||
|
'fix/source/filterbanks_neon.c',
|
||||||
|
'fix/source/filters_neon.c',
|
||||||
|
'fix/source/lattice_neon.c',
|
||||||
|
'fix/source/transform_neon.c',
|
||||||
|
],
|
||||||
|
}]
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
Loading…
x
Reference in New Issue
Block a user