Commit ab3acb58d6 for aom
commit ab3acb58d6fccbf97d4edfba4ed3c28a9d472610
Author: Steven Robertson <strobe@google.com>
Date: Wed Oct 21 07:18:50 2026 +0000
Mark x86 assembly-only RTCD specializations
Add an ENABLE_X86_ASM option (default ON) and HAVE_X86_ASM, set on x86
and x86_64 targets when the option is on, along the lines of libvpx's
--disable-x86-asm. With -DENABLE_X86_ASM=0 the nasm/yasm kernels are not
built and only the C and intrinsics versions are used, e.g. for MSan
builds or for coverage of the intrinsics.
In the RTCD definitions, $sse2_asm, $ssse3_asm and $avx2_asm (following
libvpx) replace the plain flavor names for specializations that are
written in x86 assembly or that call assembly helpers, and the 64-bit
only aom_dsp specializations, which are all assembly, also require
HAVE_X86_ASM. aom_subtract_block_avx2 and the 8-wide
aom_highbd_10_sub_pixel_variance avx2 functions fall back to C instead
of the SSE2 assembly. The unit tests that reference assembly-only
functions directly are guarded by HAVE_X86_ASM.
With the default ENABLE_X86_ASM=1 the generated rtcd headers are
unchanged. This also lets the x86 intrinsics be built for targets that
cannot assemble x86 code.
Change-Id: I77ea176fa710d66e64eef5b78cfd4fde635b87bd
diff --git a/aom_dsp/aom_dsp.cmake b/aom_dsp/aom_dsp.cmake
index 42914e8b2a..e249af360b 100644
--- a/aom_dsp/aom_dsp.cmake
+++ b/aom_dsp/aom_dsp.cmake
@@ -445,7 +445,9 @@ function(setup_aom_dsp_targets)
endif()
if(HAVE_SSE2)
- add_asm_library("aom_dsp_common_sse2" "AOM_DSP_COMMON_ASM_SSE2")
+ if(HAVE_X86_ASM)
+ add_asm_library("aom_dsp_common_sse2" "AOM_DSP_COMMON_ASM_SSE2")
+ endif()
add_intrinsics_object_library("-msse2" "sse2" "aom_dsp_common"
"AOM_DSP_COMMON_INTRIN_SSE2")
@@ -453,14 +455,18 @@ function(setup_aom_dsp_targets)
if("${AOM_TARGET_CPU}" STREQUAL "x86_64")
list(APPEND AOM_DSP_ENCODER_ASM_SSE2 ${AOM_DSP_ENCODER_ASM_SSE2_X86_64})
endif()
- add_asm_library("aom_dsp_encoder_sse2" "AOM_DSP_ENCODER_ASM_SSE2")
+ if(HAVE_X86_ASM)
+ add_asm_library("aom_dsp_encoder_sse2" "AOM_DSP_ENCODER_ASM_SSE2")
+ endif()
add_intrinsics_object_library("-msse2" "sse2" "aom_dsp_encoder"
"AOM_DSP_ENCODER_INTRIN_SSE2")
endif()
endif()
if(HAVE_SSSE3)
- add_asm_library("aom_dsp_common_ssse3" "AOM_DSP_COMMON_ASM_SSSE3")
+ if(HAVE_X86_ASM)
+ add_asm_library("aom_dsp_common_ssse3" "AOM_DSP_COMMON_ASM_SSSE3")
+ endif()
add_intrinsics_object_library("-mssse3" "ssse3" "aom_dsp_common"
"AOM_DSP_COMMON_INTRIN_SSSE3")
@@ -469,7 +475,9 @@ function(setup_aom_dsp_targets)
list(APPEND AOM_DSP_ENCODER_ASM_SSSE3
${AOM_DSP_ENCODER_ASM_SSSE3_X86_64})
endif()
- add_asm_library("aom_dsp_encoder_ssse3" "AOM_DSP_ENCODER_ASM_SSSE3")
+ if(HAVE_X86_ASM)
+ add_asm_library("aom_dsp_encoder_ssse3" "AOM_DSP_ENCODER_ASM_SSSE3")
+ endif()
add_intrinsics_object_library("-mssse3" "ssse3" "aom_dsp_encoder"
"AOM_DSP_ENCODER_INTRIN_SSSE3")
endif()
diff --git a/aom_dsp/aom_dsp_rtcd_defs.pl b/aom_dsp/aom_dsp_rtcd_defs.pl
index a570954bc0..440aac1f79 100755
--- a/aom_dsp/aom_dsp_rtcd_defs.pl
+++ b/aom_dsp/aom_dsp_rtcd_defs.pl
@@ -24,14 +24,16 @@ EOF
forward_decls qw/aom_dsp_forward_decls/;
# optimizations which depend on multiple features
+# (aom_convolve8_{horiz,vert}_avx2 also call SSSE3 assembly.)
$avx2_ssse3 = '';
-if ((aom_config("HAVE_AVX2") eq "yes") && (aom_config("HAVE_SSSE3") eq "yes")) {
+if ((aom_config("HAVE_AVX2") eq "yes") && (aom_config("HAVE_SSSE3") eq "yes") &&
+ (aom_config("HAVE_X86_ASM") eq "yes")) {
$avx2_ssse3 = 'avx2';
}
-# functions that are 64 bit only.
+# functions that are 64 bit only. In this file they are all x86 assembly.
$mmx_x86_64 = $sse2_x86_64 = $ssse3_x86_64 = $avx_x86_64 = $avx2_x86_64 = '';
-if ($opts{arch} eq "x86_64") {
+if ($opts{arch} eq "x86_64" && aom_config("HAVE_X86_ASM") eq "yes") {
$mmx_x86_64 = 'mmx';
$sse2_x86_64 = 'sse2';
$ssse3_x86_64 = 'ssse3';
@@ -39,6 +41,17 @@ if ($opts{arch} eq "x86_64") {
$avx2_x86_64 = 'avx2';
}
+# Flavors of functions that require x86 assembly (nasm/yasm), either directly
+# or through helpers. They are unavailable when the assembly is disabled
+# (ENABLE_X86_ASM=0) or the x86 intrinsics are built for other targets, e.g.
+# wasm32 with Emscripten.
+$sse2_asm = $ssse3_asm = $avx2_asm = '';
+if (aom_config("HAVE_X86_ASM") eq "yes") {
+ $sse2_asm = 'sse2';
+ $ssse3_asm = 'ssse3';
+ $avx2_asm = 'avx2';
+}
+
@block_widths = (4, 8, 16, 32, 64, 128);
@encoder_block_sizes = ();
@@ -88,72 +101,72 @@ foreach (@tx_sizes) {
}
}
-specialize qw/aom_dc_top_predictor_4x4 neon sse2/;
+specialize qw/aom_dc_top_predictor_4x4 neon/, "$sse2_asm";
specialize qw/aom_dc_top_predictor_4x8 neon sse2/;
specialize qw/aom_dc_top_predictor_8x4 neon sse2/;
-specialize qw/aom_dc_top_predictor_8x8 neon sse2/;
+specialize qw/aom_dc_top_predictor_8x8 neon/, "$sse2_asm";
specialize qw/aom_dc_top_predictor_8x16 neon sse2/;
specialize qw/aom_dc_top_predictor_16x8 neon sse2/;
-specialize qw/aom_dc_top_predictor_16x16 neon sse2/;
+specialize qw/aom_dc_top_predictor_16x16 neon/, "$sse2_asm";
specialize qw/aom_dc_top_predictor_16x32 neon sse2/;
specialize qw/aom_dc_top_predictor_32x16 neon sse2 avx2/;
-specialize qw/aom_dc_top_predictor_32x32 neon sse2 avx2/;
+specialize qw/aom_dc_top_predictor_32x32 neon avx2/, "$sse2_asm";
specialize qw/aom_dc_top_predictor_32x64 neon sse2 avx2/;
specialize qw/aom_dc_top_predictor_64x32 neon sse2 avx2/;
specialize qw/aom_dc_top_predictor_64x64 neon sse2 avx2/;
-specialize qw/aom_dc_left_predictor_4x4 neon sse2/;
+specialize qw/aom_dc_left_predictor_4x4 neon/, "$sse2_asm";
specialize qw/aom_dc_left_predictor_4x8 neon sse2/;
specialize qw/aom_dc_left_predictor_8x4 neon sse2/;
-specialize qw/aom_dc_left_predictor_8x8 neon sse2/;
+specialize qw/aom_dc_left_predictor_8x8 neon/, "$sse2_asm";
specialize qw/aom_dc_left_predictor_8x16 neon sse2/;
specialize qw/aom_dc_left_predictor_16x8 neon sse2/;
-specialize qw/aom_dc_left_predictor_16x16 neon sse2/;
+specialize qw/aom_dc_left_predictor_16x16 neon/, "$sse2_asm";
specialize qw/aom_dc_left_predictor_16x32 neon sse2/;
specialize qw/aom_dc_left_predictor_32x16 neon sse2 avx2/;
-specialize qw/aom_dc_left_predictor_32x32 neon sse2 avx2/;
+specialize qw/aom_dc_left_predictor_32x32 neon avx2/, "$sse2_asm";
specialize qw/aom_dc_left_predictor_32x64 neon sse2 avx2/;
specialize qw/aom_dc_left_predictor_64x32 neon sse2 avx2/;
specialize qw/aom_dc_left_predictor_64x64 neon sse2 avx2/;
-specialize qw/aom_dc_128_predictor_4x4 neon sse2/;
+specialize qw/aom_dc_128_predictor_4x4 neon/, "$sse2_asm";
specialize qw/aom_dc_128_predictor_4x8 neon sse2/;
specialize qw/aom_dc_128_predictor_8x4 neon sse2/;
-specialize qw/aom_dc_128_predictor_8x8 neon sse2/;
+specialize qw/aom_dc_128_predictor_8x8 neon/, "$sse2_asm";
specialize qw/aom_dc_128_predictor_8x16 neon sse2/;
specialize qw/aom_dc_128_predictor_16x8 neon sse2/;
-specialize qw/aom_dc_128_predictor_16x16 neon sse2/;
+specialize qw/aom_dc_128_predictor_16x16 neon/, "$sse2_asm";
specialize qw/aom_dc_128_predictor_16x32 neon sse2/;
specialize qw/aom_dc_128_predictor_32x16 neon sse2 avx2/;
-specialize qw/aom_dc_128_predictor_32x32 neon sse2 avx2/;
+specialize qw/aom_dc_128_predictor_32x32 neon avx2/, "$sse2_asm";
specialize qw/aom_dc_128_predictor_32x64 neon sse2 avx2/;
specialize qw/aom_dc_128_predictor_64x32 neon sse2 avx2/;
specialize qw/aom_dc_128_predictor_64x64 neon sse2 avx2/;
-specialize qw/aom_v_predictor_4x4 neon sse2/;
+specialize qw/aom_v_predictor_4x4 neon/, "$sse2_asm";
specialize qw/aom_v_predictor_4x8 neon sse2/;
specialize qw/aom_v_predictor_8x4 neon sse2/;
-specialize qw/aom_v_predictor_8x8 neon sse2/;
+specialize qw/aom_v_predictor_8x8 neon/, "$sse2_asm";
specialize qw/aom_v_predictor_8x16 neon sse2/;
specialize qw/aom_v_predictor_16x8 neon sse2/;
-specialize qw/aom_v_predictor_16x16 neon sse2/;
+specialize qw/aom_v_predictor_16x16 neon/, "$sse2_asm";
specialize qw/aom_v_predictor_16x32 neon sse2/;
specialize qw/aom_v_predictor_32x16 neon sse2 avx2/;
-specialize qw/aom_v_predictor_32x32 neon sse2 avx2/;
+specialize qw/aom_v_predictor_32x32 neon avx2/, "$sse2_asm";
specialize qw/aom_v_predictor_32x64 neon sse2 avx2/;
specialize qw/aom_v_predictor_64x32 neon sse2 avx2/;
specialize qw/aom_v_predictor_64x64 neon sse2 avx2/;
-specialize qw/aom_h_predictor_4x4 neon sse2/;
+specialize qw/aom_h_predictor_4x4 neon/, "$sse2_asm";
specialize qw/aom_h_predictor_4x8 neon sse2/;
specialize qw/aom_h_predictor_8x4 neon sse2/;
-specialize qw/aom_h_predictor_8x8 neon sse2/;
+specialize qw/aom_h_predictor_8x8 neon/, "$sse2_asm";
specialize qw/aom_h_predictor_8x16 neon sse2/;
specialize qw/aom_h_predictor_16x8 neon sse2/;
-specialize qw/aom_h_predictor_16x16 neon sse2/;
+specialize qw/aom_h_predictor_16x16 neon/, "$sse2_asm";
specialize qw/aom_h_predictor_16x32 neon sse2/;
specialize qw/aom_h_predictor_32x16 neon sse2/;
-specialize qw/aom_h_predictor_32x32 neon sse2 avx2/;
+specialize qw/aom_h_predictor_32x32 neon avx2/, "$sse2_asm";
specialize qw/aom_h_predictor_32x64 neon sse2/;
specialize qw/aom_h_predictor_64x32 neon sse2/;
specialize qw/aom_h_predictor_64x64 neon sse2/;
@@ -216,16 +229,16 @@ specialize qw/aom_smooth_h_predictor_64x64 neon ssse3/;
# TODO(yunqingwang): optimize rectangular DC_PRED to replace division
# by multiply and shift.
-specialize qw/aom_dc_predictor_4x4 neon sse2/;
+specialize qw/aom_dc_predictor_4x4 neon/, "$sse2_asm";
specialize qw/aom_dc_predictor_4x8 neon sse2/;
specialize qw/aom_dc_predictor_8x4 neon sse2/;
-specialize qw/aom_dc_predictor_8x8 neon sse2/;
+specialize qw/aom_dc_predictor_8x8 neon/, "$sse2_asm";
specialize qw/aom_dc_predictor_8x16 neon sse2/;
specialize qw/aom_dc_predictor_16x8 neon sse2/;
-specialize qw/aom_dc_predictor_16x16 neon sse2/;
+specialize qw/aom_dc_predictor_16x16 neon/, "$sse2_asm";
specialize qw/aom_dc_predictor_16x32 neon sse2/;
specialize qw/aom_dc_predictor_32x16 neon sse2 avx2/;
-specialize qw/aom_dc_predictor_32x32 neon sse2 avx2/;
+specialize qw/aom_dc_predictor_32x32 neon avx2/, "$sse2_asm";
specialize qw/aom_dc_predictor_32x64 neon sse2 avx2/;
specialize qw/aom_dc_predictor_64x64 neon sse2 avx2/;
specialize qw/aom_dc_predictor_64x32 neon sse2 avx2/;
@@ -304,32 +317,32 @@ if ((aom_config("CONFIG_REALTIME_ONLY") ne "yes") || (aom_config("CONFIG_AV1_DEC
} # !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
if (aom_config("CONFIG_AV1_HIGHBITDEPTH") eq "yes") {
- specialize qw/aom_highbd_v_predictor_4x4 sse2 neon/;
+ specialize qw/aom_highbd_v_predictor_4x4 neon/, "$sse2_asm";
specialize qw/aom_highbd_v_predictor_4x8 sse2 neon/;
specialize qw/aom_highbd_v_predictor_8x4 sse2 neon/;
- specialize qw/aom_highbd_v_predictor_8x8 sse2 neon/;
+ specialize qw/aom_highbd_v_predictor_8x8 neon/, "$sse2_asm";
specialize qw/aom_highbd_v_predictor_8x16 sse2 neon/;
specialize qw/aom_highbd_v_predictor_16x8 sse2 neon/;
- specialize qw/aom_highbd_v_predictor_16x16 sse2 neon/;
+ specialize qw/aom_highbd_v_predictor_16x16 neon/, "$sse2_asm";
specialize qw/aom_highbd_v_predictor_16x32 sse2 neon/;
specialize qw/aom_highbd_v_predictor_32x16 sse2 neon/;
- specialize qw/aom_highbd_v_predictor_32x32 sse2 neon/;
+ specialize qw/aom_highbd_v_predictor_32x32 neon/, "$sse2_asm";
specialize qw/aom_highbd_v_predictor_32x64 neon/;
specialize qw/aom_highbd_v_predictor_64x32 neon/;
specialize qw/aom_highbd_v_predictor_64x64 neon/;
# TODO(yunqingwang): optimize rectangular DC_PRED to replace division
# by multiply and shift.
- specialize qw/aom_highbd_dc_predictor_4x4 sse2 neon/;
+ specialize qw/aom_highbd_dc_predictor_4x4 neon/, "$sse2_asm";
specialize qw/aom_highbd_dc_predictor_4x8 sse2 neon/;
specialize qw/aom_highbd_dc_predictor_8x4 sse2 neon/;
- specialize qw/aom_highbd_dc_predictor_8x8 sse2 neon/;
+ specialize qw/aom_highbd_dc_predictor_8x8 neon/, "$sse2_asm";
specialize qw/aom_highbd_dc_predictor_8x16 sse2 neon/;
specialize qw/aom_highbd_dc_predictor_16x8 sse2 neon/;
- specialize qw/aom_highbd_dc_predictor_16x16 sse2 neon/;
+ specialize qw/aom_highbd_dc_predictor_16x16 neon/, "$sse2_asm";
specialize qw/aom_highbd_dc_predictor_16x32 sse2 neon/;
specialize qw/aom_highbd_dc_predictor_32x16 sse2 neon/;
- specialize qw/aom_highbd_dc_predictor_32x32 sse2 neon/;
+ specialize qw/aom_highbd_dc_predictor_32x32 neon/, "$sse2_asm";
specialize qw/aom_highbd_dc_predictor_32x64 neon/;
specialize qw/aom_highbd_dc_predictor_64x32 neon/;
specialize qw/aom_highbd_dc_predictor_64x64 neon/;
@@ -527,8 +540,8 @@ add_proto qw/void aom_convolve8_horiz/, "const uint8_t *src, ptrdiff_t
add_proto qw/void aom_convolve8_vert/, "const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst, ptrdiff_t dst_stride, const int16_t *filter_x, int x_step_q4, const int16_t *filter_y, int y_step_q4, int w, int h";
specialize qw/aom_convolve_copy neon sse2 avx2/;
-specialize qw/aom_convolve8_horiz neon neon_dotprod neon_i8mm ssse3/, "$avx2_ssse3";
-specialize qw/aom_convolve8_vert neon neon_dotprod neon_i8mm ssse3/, "$avx2_ssse3";
+specialize qw/aom_convolve8_horiz neon neon_dotprod neon_i8mm/, "$avx2_ssse3", "$ssse3_asm";
+specialize qw/aom_convolve8_vert neon neon_dotprod neon_i8mm/, "$avx2_ssse3", "$ssse3_asm";
if (aom_config("CONFIG_HIGHWAY") eq "yes") {
specialize qw/aom_convolve8_horiz avx512/;
@@ -543,10 +556,10 @@ if (aom_config("CONFIG_AV1_HIGHBITDEPTH") eq "yes") {
specialize qw/aom_highbd_convolve_copy sse2 avx2 neon/;
add_proto qw/void aom_highbd_convolve8_horiz/, "const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst, ptrdiff_t dst_stride, const int16_t *filter_x, int x_step_q4, const int16_t *filter_y, int y_step_q4, int w, int h, int bd";
- specialize qw/aom_highbd_convolve8_horiz sse2 avx2 neon sve/;
+ specialize qw/aom_highbd_convolve8_horiz neon sve/, "$sse2_asm", "$avx2_asm";
add_proto qw/void aom_highbd_convolve8_vert/, "const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst, ptrdiff_t dst_stride, const int16_t *filter_x, int x_step_q4, const int16_t *filter_y, int y_step_q4, int w, int h, int bd";
- specialize qw/aom_highbd_convolve8_vert sse2 avx2 neon sve/;
+ specialize qw/aom_highbd_convolve8_vert neon sve/, "$sse2_asm", "$avx2_asm";
}
#
@@ -804,7 +817,7 @@ if (aom_config("CONFIG_AV1_ENCODER") eq "yes") {
# Block subtraction
#
add_proto qw/void aom_subtract_block/, "int rows, int cols, int16_t *diff_ptr, ptrdiff_t diff_stride, const uint8_t *src_ptr, ptrdiff_t src_stride, const uint8_t *pred_ptr, ptrdiff_t pred_stride";
- specialize qw/aom_subtract_block neon sse2 avx2/;
+ specialize qw/aom_subtract_block neon avx2/, "$sse2_asm";
add_proto qw/int64_t/, "aom_sse", "const uint8_t *a, int a_stride, const uint8_t *b,int b_stride, int width, int height";
specialize qw/aom_sse sse4_1 avx2 neon neon_dotprod/;
@@ -853,11 +866,11 @@ if (aom_config("CONFIG_AV1_ENCODER") eq "yes") {
add_proto qw/uint64_t aom_sum_sse_2d_i16/, "const int16_t *src, int src_stride, int width, int height, int *sum";
specialize qw/aom_sum_sse_2d_i16 avx2 neon sse2 sve/;
- specialize qw/aom_sad128x128 avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad128x64 avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad64x128 avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad64x64 avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad64x32 avx2 sse2 neon neon_dotprod/;
+ specialize qw/aom_sad128x128 avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad128x64 avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad64x128 avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad64x64 avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad64x32 avx2 neon neon_dotprod/, "$sse2_asm";
if(aom_config("CONFIG_HIGHWAY") eq "yes") {
specialize qw/aom_sad128x128 avx512/;
@@ -867,30 +880,30 @@ if (aom_config("CONFIG_AV1_ENCODER") eq "yes") {
specialize qw/aom_sad64x32 avx512/;
}
- specialize qw/aom_sad32x64 avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad32x32 avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad32x16 avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad16x32 sse2 neon neon_dotprod/;
- specialize qw/aom_sad16x16 sse2 neon neon_dotprod/;
- specialize qw/aom_sad16x8 sse2 neon neon_dotprod/;
- specialize qw/aom_sad8x16 sse2 neon/;
- specialize qw/aom_sad8x8 sse2 neon/;
- specialize qw/aom_sad8x4 sse2 neon/;
- specialize qw/aom_sad4x8 sse2 neon/;
- specialize qw/aom_sad4x4 sse2 neon/;
-
- specialize qw/aom_sad4x16 sse2 neon/;
- specialize qw/aom_sad16x4 sse2 neon neon_dotprod/;
- specialize qw/aom_sad8x32 sse2 neon/;
- specialize qw/aom_sad32x8 sse2 neon neon_dotprod/;
- specialize qw/aom_sad16x64 sse2 neon neon_dotprod/;
- specialize qw/aom_sad64x16 sse2 neon neon_dotprod/;
-
- specialize qw/aom_sad_skip_128x128 avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_128x64 avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_64x128 avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_64x64 avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_64x32 avx2 sse2 neon neon_dotprod/;
+ specialize qw/aom_sad32x64 avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad32x32 avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad32x16 avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad16x32 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad16x16 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad16x8 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad8x16 neon/, "$sse2_asm";
+ specialize qw/aom_sad8x8 neon/, "$sse2_asm";
+ specialize qw/aom_sad8x4 neon/, "$sse2_asm";
+ specialize qw/aom_sad4x8 neon/, "$sse2_asm";
+ specialize qw/aom_sad4x4 neon/, "$sse2_asm";
+
+ specialize qw/aom_sad4x16 neon/, "$sse2_asm";
+ specialize qw/aom_sad16x4 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad8x32 neon/, "$sse2_asm";
+ specialize qw/aom_sad32x8 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad16x64 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad64x16 neon neon_dotprod/, "$sse2_asm";
+
+ specialize qw/aom_sad_skip_128x128 avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad_skip_128x64 avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad_skip_64x128 avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad_skip_64x64 avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad_skip_64x32 avx2 neon neon_dotprod/, "$sse2_asm";
if(aom_config("CONFIG_HIGHWAY") eq "yes") {
specialize qw/aom_sad_skip_128x128 avx512/;
@@ -900,25 +913,25 @@ if (aom_config("CONFIG_AV1_ENCODER") eq "yes") {
specialize qw/aom_sad_skip_64x32 avx512/;
}
- specialize qw/aom_sad_skip_32x64 avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_32x32 avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_32x16 avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_16x32 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_16x16 sse2 neon neon_dotprod/;
+ specialize qw/aom_sad_skip_32x64 avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad_skip_32x32 avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad_skip_32x16 avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad_skip_16x32 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad_skip_16x16 neon neon_dotprod/, "$sse2_asm";
specialize qw/aom_sad_skip_16x8 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_8x16 sse2 neon/;
+ specialize qw/aom_sad_skip_8x16 neon/, "$sse2_asm";
- specialize qw/aom_sad_skip_4x16 sse2 neon/;
- specialize qw/aom_sad_skip_8x32 sse2 neon/;
- specialize qw/aom_sad_skip_16x64 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_64x16 sse2 neon neon_dotprod/;
+ specialize qw/aom_sad_skip_4x16 neon/, "$sse2_asm";
+ specialize qw/aom_sad_skip_8x32 neon/, "$sse2_asm";
+ specialize qw/aom_sad_skip_16x64 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad_skip_64x16 neon neon_dotprod/, "$sse2_asm";
- specialize qw/aom_sad128x128_avg avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad128x64_avg avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad64x128_avg avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad64x64_avg avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad64x32_avg avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad32x64_avg avx2 sse2 neon neon_dotprod/;
+ specialize qw/aom_sad128x128_avg avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad128x64_avg avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad64x128_avg avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad64x64_avg avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad64x32_avg avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad32x64_avg avx2 neon neon_dotprod/, "$sse2_asm";
if(aom_config("CONFIG_HIGHWAY") eq "yes") {
specialize qw/aom_sad128x128_avg avx512/;
@@ -928,18 +941,18 @@ if (aom_config("CONFIG_AV1_ENCODER") eq "yes") {
specialize qw/aom_sad64x32_avg avx512/;
}
- specialize qw/aom_sad32x32_avg avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad32x16_avg avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad16x32_avg sse2 neon neon_dotprod/;
- specialize qw/aom_sad16x16_avg sse2 neon neon_dotprod/;
- specialize qw/aom_sad16x8_avg sse2 neon neon_dotprod/;
- specialize qw/aom_sad8x16_avg sse2 neon/;
- specialize qw/aom_sad8x8_avg sse2 neon/;
+ specialize qw/aom_sad32x32_avg avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad32x16_avg avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad16x32_avg neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad16x16_avg neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad16x8_avg neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad8x16_avg neon/, "$sse2_asm";
+ specialize qw/aom_sad8x8_avg neon/, "$sse2_asm";
- specialize qw/aom_sad8x32_avg sse2 neon/;
- specialize qw/aom_sad32x8_avg sse2 neon neon_dotprod/;
- specialize qw/aom_sad16x64_avg sse2 neon neon_dotprod/;
- specialize qw/aom_sad64x16_avg sse2 neon neon_dotprod/;
+ specialize qw/aom_sad8x32_avg neon/, "$sse2_asm";
+ specialize qw/aom_sad32x8_avg neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad16x64_avg neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad64x16_avg neon neon_dotprod/, "$sse2_asm";
if (aom_config("CONFIG_AV1_HIGHBITDEPTH") eq "yes") {
foreach (@encoder_block_sizes) {
@@ -952,69 +965,69 @@ if (aom_config("CONFIG_AV1_ENCODER") eq "yes") {
add_proto qw/unsigned int/, "aom_highbd_sad${w}x${h}_avg", "const uint8_t *src_ptr, int src_stride, const uint8_t *ref_ptr, int ref_stride, const uint8_t *second_pred";
}
if ($w != 128 && $h != 128 && $w != 4) {
- specialize "aom_highbd_sad${w}x${h}", qw/sse2/;
- specialize "aom_highbd_sad${w}x${h}_avg", qw/sse2/;
+ specialize "aom_highbd_sad${w}x${h}", "$sse2_asm";
+ specialize "aom_highbd_sad${w}x${h}_avg", "$sse2_asm";
}
}
specialize qw/aom_highbd_sad128x128 avx2 neon/;
specialize qw/aom_highbd_sad128x64 avx2 neon/;
specialize qw/aom_highbd_sad64x128 avx2 neon/;
- specialize qw/aom_highbd_sad64x64 avx2 sse2 neon/;
- specialize qw/aom_highbd_sad64x32 avx2 sse2 neon/;
- specialize qw/aom_highbd_sad32x64 avx2 sse2 neon/;
- specialize qw/aom_highbd_sad32x32 avx2 sse2 neon/;
- specialize qw/aom_highbd_sad32x16 avx2 sse2 neon/;
- specialize qw/aom_highbd_sad16x32 avx2 sse2 neon/;
- specialize qw/aom_highbd_sad16x16 avx2 sse2 neon/;
- specialize qw/aom_highbd_sad16x8 avx2 sse2 neon/;
- specialize qw/aom_highbd_sad8x16 sse2 neon/;
- specialize qw/aom_highbd_sad8x8 sse2 neon/;
- specialize qw/aom_highbd_sad8x4 sse2 neon/;
- specialize qw/aom_highbd_sad4x8 sse2 neon/;
- specialize qw/aom_highbd_sad4x4 sse2 neon/;
-
- specialize qw/aom_highbd_sad4x16 sse2 neon/;
- specialize qw/aom_highbd_sad16x4 avx2 sse2 neon/;
- specialize qw/aom_highbd_sad8x32 sse2 neon/;
- specialize qw/aom_highbd_sad32x8 avx2 sse2 neon/;
- specialize qw/aom_highbd_sad16x64 avx2 sse2 neon/;
- specialize qw/aom_highbd_sad64x16 avx2 sse2 neon/;
+ specialize qw/aom_highbd_sad64x64 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad64x32 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad32x64 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad32x32 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad32x16 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad16x32 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad16x16 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad16x8 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad8x16 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad8x8 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad8x4 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad4x8 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad4x4 neon/, "$sse2_asm";
+
+ specialize qw/aom_highbd_sad4x16 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad16x4 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad8x32 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad32x8 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad16x64 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad64x16 avx2 neon/, "$sse2_asm";
specialize qw/aom_highbd_sad_skip_128x128 avx2 neon/;
specialize qw/aom_highbd_sad_skip_128x64 avx2 neon/;
specialize qw/aom_highbd_sad_skip_64x128 avx2 neon/;
- specialize qw/aom_highbd_sad_skip_64x64 avx2 sse2 neon/;
- specialize qw/aom_highbd_sad_skip_64x32 avx2 sse2 neon/;
- specialize qw/aom_highbd_sad_skip_32x64 avx2 sse2 neon/;
- specialize qw/aom_highbd_sad_skip_32x32 avx2 sse2 neon/;
- specialize qw/aom_highbd_sad_skip_32x16 avx2 sse2 neon/;
- specialize qw/aom_highbd_sad_skip_16x32 avx2 sse2 neon/;
- specialize qw/aom_highbd_sad_skip_16x16 avx2 sse2 neon/;
- specialize qw/aom_highbd_sad_skip_8x16 sse2 neon/;
-
- specialize qw/aom_highbd_sad_skip_4x16 sse2 neon/;
- specialize qw/aom_highbd_sad_skip_8x32 sse2 neon/;
- specialize qw/aom_highbd_sad_skip_16x64 avx2 sse2 neon/;
- specialize qw/aom_highbd_sad_skip_64x16 avx2 sse2 neon/;
+ specialize qw/aom_highbd_sad_skip_64x64 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_64x32 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_32x64 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_32x32 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_32x16 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_16x32 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_16x16 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_8x16 neon/, "$sse2_asm";
+
+ specialize qw/aom_highbd_sad_skip_4x16 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_8x32 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_16x64 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_64x16 avx2 neon/, "$sse2_asm";
specialize qw/aom_highbd_sad128x128_avg avx2 neon/;
specialize qw/aom_highbd_sad128x64_avg avx2 neon/;
specialize qw/aom_highbd_sad64x128_avg avx2 neon/;
- specialize qw/aom_highbd_sad64x64_avg avx2 sse2 neon/;
- specialize qw/aom_highbd_sad64x32_avg avx2 sse2 neon/;
- specialize qw/aom_highbd_sad32x64_avg avx2 sse2 neon/;
- specialize qw/aom_highbd_sad32x32_avg avx2 sse2 neon/;
- specialize qw/aom_highbd_sad32x16_avg avx2 sse2 neon/;
- specialize qw/aom_highbd_sad16x32_avg avx2 sse2 neon/;
- specialize qw/aom_highbd_sad16x16_avg avx2 sse2 neon/;
- specialize qw/aom_highbd_sad16x8_avg avx2 sse2 neon/;
+ specialize qw/aom_highbd_sad64x64_avg avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad64x32_avg avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad32x64_avg avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad32x32_avg avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad32x16_avg avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad16x32_avg avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad16x16_avg avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad16x8_avg avx2 neon/, "$sse2_asm";
specialize qw/aom_highbd_sad8x16_avg neon/;
specialize qw/aom_highbd_sad8x8_avg neon/;
- specialize qw/aom_highbd_sad8x32_avg sse2 neon/;
- specialize qw/aom_highbd_sad16x64_avg avx2 sse2 neon/;
- specialize qw/aom_highbd_sad32x8_avg avx2 sse2 neon/;
- specialize qw/aom_highbd_sad64x16_avg avx2 sse2 neon/;
+ specialize qw/aom_highbd_sad8x32_avg neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad16x64_avg avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad32x8_avg avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad64x16_avg avx2 neon/, "$sse2_asm";
}
#
# Masked SAD
@@ -1068,12 +1081,12 @@ if (aom_config("CONFIG_AV1_ENCODER") eq "yes") {
}
}
- specialize qw/aom_sad128x128x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad128x64x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad64x128x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad64x64x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad64x32x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad32x64x4d avx2 sse2 neon neon_dotprod/;
+ specialize qw/aom_sad128x128x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad128x64x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad64x128x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad64x64x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad64x32x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad32x64x4d avx2 neon neon_dotprod/, "$sse2_asm";
if(aom_config("CONFIG_HIGHWAY") eq "yes") {
specialize qw/aom_sad128x128x4d avx512/;
@@ -1083,34 +1096,34 @@ if (aom_config("CONFIG_AV1_ENCODER") eq "yes") {
specialize qw/aom_sad64x32x4d avx512/;
}
- specialize qw/aom_sad32x32x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad32x16x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad16x32x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad16x16x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad16x8x4d avx2 sse2 neon neon_dotprod/;
-
- specialize qw/aom_sad8x16x4d sse2 neon/;
- specialize qw/aom_sad8x8x4d sse2 neon/;
- specialize qw/aom_sad8x4x4d sse2 neon/;
- specialize qw/aom_sad4x8x4d sse2 neon/;
- specialize qw/aom_sad4x4x4d sse2 neon/;
-
- specialize qw/aom_sad64x16x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad32x8x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad16x64x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad16x4x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad8x32x4d sse2 neon/;
- specialize qw/aom_sad4x16x4d sse2 neon/;
-
- specialize qw/aom_sad_skip_128x128x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_128x64x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_64x128x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_64x64x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_64x32x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_64x16x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_32x64x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_32x32x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_32x16x4d avx2 sse2 neon neon_dotprod/;
+ specialize qw/aom_sad32x32x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad32x16x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad16x32x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad16x16x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad16x8x4d avx2 neon neon_dotprod/, "$sse2_asm";
+
+ specialize qw/aom_sad8x16x4d neon/, "$sse2_asm";
+ specialize qw/aom_sad8x8x4d neon/, "$sse2_asm";
+ specialize qw/aom_sad8x4x4d neon/, "$sse2_asm";
+ specialize qw/aom_sad4x8x4d neon/, "$sse2_asm";
+ specialize qw/aom_sad4x4x4d neon/, "$sse2_asm";
+
+ specialize qw/aom_sad64x16x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad32x8x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad16x64x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad16x4x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad8x32x4d neon/, "$sse2_asm";
+ specialize qw/aom_sad4x16x4d neon/, "$sse2_asm";
+
+ specialize qw/aom_sad_skip_128x128x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad_skip_128x64x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad_skip_64x128x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad_skip_64x64x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad_skip_64x32x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad_skip_64x16x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad_skip_32x64x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad_skip_32x32x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad_skip_32x16x4d avx2 neon neon_dotprod/, "$sse2_asm";
if(aom_config("CONFIG_HIGHWAY") eq "yes") {
specialize qw/aom_sad_skip_128x128x4d avx512/;
@@ -1120,13 +1133,13 @@ if (aom_config("CONFIG_AV1_ENCODER") eq "yes") {
specialize qw/aom_sad_skip_64x32x4d avx512/;
}
- specialize qw/aom_sad_skip_16x64x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_16x32x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_16x16x4d avx2 sse2 neon neon_dotprod/;
+ specialize qw/aom_sad_skip_16x64x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad_skip_16x32x4d avx2 neon neon_dotprod/, "$sse2_asm";
+ specialize qw/aom_sad_skip_16x16x4d avx2 neon neon_dotprod/, "$sse2_asm";
specialize qw/aom_sad_skip_16x8x4d avx2 sse2 neon neon_dotprod/;
- specialize qw/aom_sad_skip_8x32x4d sse2 neon/;
- specialize qw/aom_sad_skip_8x16x4d sse2 neon/;
- specialize qw/aom_sad_skip_4x16x4d sse2 neon/;
+ specialize qw/aom_sad_skip_8x32x4d neon/, "$sse2_asm";
+ specialize qw/aom_sad_skip_8x16x4d neon/, "$sse2_asm";
+ specialize qw/aom_sad_skip_4x16x4d neon/, "$sse2_asm";
specialize qw/aom_sad128x128x3d avx2 neon neon_dotprod/;
specialize qw/aom_sad128x64x3d avx2 neon neon_dotprod/;
@@ -1173,49 +1186,49 @@ if (aom_config("CONFIG_AV1_ENCODER") eq "yes") {
add_proto qw/void/, "aom_highbd_sad_skip_${w}x${h}x4d", "const uint8_t *src_ptr, int src_stride, const uint8_t * const ref_ptr[4], int ref_stride, uint32_t sad_array[4]";
}
if ($w != 128 && $h != 128) {
- specialize "aom_highbd_sad${w}x${h}x4d", qw/sse2/;
+ specialize "aom_highbd_sad${w}x${h}x4d", "$sse2_asm";
}
}
specialize qw/aom_highbd_sad128x128x4d avx2 neon/;
specialize qw/aom_highbd_sad128x64x4d avx2 neon/;
specialize qw/aom_highbd_sad64x128x4d avx2 neon/;
- specialize qw/aom_highbd_sad64x64x4d sse2 avx2 neon/;
- specialize qw/aom_highbd_sad64x32x4d sse2 avx2 neon/;
- specialize qw/aom_highbd_sad32x64x4d sse2 avx2 neon/;
- specialize qw/aom_highbd_sad32x32x4d sse2 avx2 neon/;
- specialize qw/aom_highbd_sad32x16x4d sse2 avx2 neon/;
- specialize qw/aom_highbd_sad16x32x4d sse2 avx2 neon/;
- specialize qw/aom_highbd_sad16x16x4d sse2 avx2 neon/;
- specialize qw/aom_highbd_sad16x8x4d sse2 avx2 neon/;
- specialize qw/aom_highbd_sad8x16x4d sse2 neon/;
- specialize qw/aom_highbd_sad8x8x4d sse2 neon/;
- specialize qw/aom_highbd_sad8x4x4d sse2 neon/;
- specialize qw/aom_highbd_sad4x8x4d sse2 neon/;
- specialize qw/aom_highbd_sad4x4x4d sse2 neon/;
-
- specialize qw/aom_highbd_sad4x16x4d sse2 neon/;
- specialize qw/aom_highbd_sad16x4x4d avx2 sse2 neon/;
- specialize qw/aom_highbd_sad8x32x4d sse2 neon/;
- specialize qw/aom_highbd_sad32x8x4d avx2 sse2 neon/;
- specialize qw/aom_highbd_sad16x64x4d avx2 sse2 neon/;
- specialize qw/aom_highbd_sad64x16x4d avx2 sse2 neon/;
+ specialize qw/aom_highbd_sad64x64x4d avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad64x32x4d avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad32x64x4d avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad32x32x4d avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad32x16x4d avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad16x32x4d avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad16x16x4d avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad16x8x4d avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad8x16x4d neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad8x8x4d neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad8x4x4d neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad4x8x4d neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad4x4x4d neon/, "$sse2_asm";
+
+ specialize qw/aom_highbd_sad4x16x4d neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad16x4x4d avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad8x32x4d neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad32x8x4d avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad16x64x4d avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad64x16x4d avx2 neon/, "$sse2_asm";
specialize qw/aom_highbd_sad_skip_128x128x4d avx2 neon/;
specialize qw/aom_highbd_sad_skip_128x64x4d avx2 neon/;
specialize qw/aom_highbd_sad_skip_64x128x4d avx2 neon/;
- specialize qw/aom_highbd_sad_skip_64x64x4d avx2 sse2 neon/;
- specialize qw/aom_highbd_sad_skip_64x32x4d avx2 sse2 neon/;
- specialize qw/aom_highbd_sad_skip_32x64x4d avx2 sse2 neon/;
- specialize qw/aom_highbd_sad_skip_32x32x4d avx2 sse2 neon/;
- specialize qw/aom_highbd_sad_skip_32x16x4d avx2 sse2 neon/;
- specialize qw/aom_highbd_sad_skip_16x32x4d avx2 sse2 neon/;
- specialize qw/aom_highbd_sad_skip_16x16x4d avx2 sse2 neon/;
- specialize qw/aom_highbd_sad_skip_8x16x4d sse2 neon/;
-
- specialize qw/aom_highbd_sad_skip_4x16x4d sse2 neon/;
- specialize qw/aom_highbd_sad_skip_8x32x4d sse2 neon/;
- specialize qw/aom_highbd_sad_skip_16x64x4d avx2 sse2 neon/;
- specialize qw/aom_highbd_sad_skip_64x16x4d avx2 sse2 neon/;
+ specialize qw/aom_highbd_sad_skip_64x64x4d avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_64x32x4d avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_32x64x4d avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_32x32x4d avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_32x16x4d avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_16x32x4d avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_16x16x4d avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_8x16x4d neon/, "$sse2_asm";
+
+ specialize qw/aom_highbd_sad_skip_4x16x4d neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_8x32x4d neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_16x64x4d avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_sad_skip_64x16x4d avx2 neon/, "$sse2_asm";
specialize qw/aom_highbd_sad128x128x3d avx2 neon/;
specialize qw/aom_highbd_sad128x64x3d avx2 neon/;
@@ -1355,20 +1368,20 @@ if (aom_config("CONFIG_AV1_ENCODER") eq "yes") {
add_proto qw/unsigned int/, "aom_highbd_${bd}_mse8x8", "const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse";
if ($bd eq 8) {
- specialize "aom_highbd_${bd}_mse16x16", qw/sse2 neon neon_dotprod/;
+ specialize "aom_highbd_${bd}_mse16x16", qw/neon neon_dotprod/, "$sse2_asm";
specialize "aom_highbd_${bd}_mse16x8", qw/neon neon_dotprod/;
specialize "aom_highbd_${bd}_mse8x16", qw/neon neon_dotprod/;
- specialize "aom_highbd_${bd}_mse8x8", qw/sse2 neon neon_dotprod/;
+ specialize "aom_highbd_${bd}_mse8x8", qw/neon neon_dotprod/, "$sse2_asm";
} elsif ($bd eq 10) {
- specialize "aom_highbd_${bd}_mse16x16", qw/avx2 sse2 neon sve/;
+ specialize "aom_highbd_${bd}_mse16x16", qw/avx2 neon sve/, "$sse2_asm";
specialize "aom_highbd_${bd}_mse16x8", qw/neon sve/;
specialize "aom_highbd_${bd}_mse8x16", qw/neon sve/;
- specialize "aom_highbd_${bd}_mse8x8", qw/sse2 neon sve/;
+ specialize "aom_highbd_${bd}_mse8x8", qw/neon sve/, "$sse2_asm";
} else {
- specialize "aom_highbd_${bd}_mse16x16", qw/sse2 neon sve/;
+ specialize "aom_highbd_${bd}_mse16x16", qw/neon sve/, "$sse2_asm";
specialize "aom_highbd_${bd}_mse16x8", qw/neon sve/;
specialize "aom_highbd_${bd}_mse8x16", qw/neon sve/;
- specialize "aom_highbd_${bd}_mse8x8", qw/sse2 neon sve/;
+ specialize "aom_highbd_${bd}_mse8x8", qw/neon sve/, "$sse2_asm";
}
}
@@ -1419,39 +1432,39 @@ if (aom_config("CONFIG_AV1_ENCODER") eq "yes") {
specialize qw/aom_variance4x8 sse2 neon neon_dotprod/;
specialize qw/aom_variance4x4 sse2 neon/;
- specialize qw/aom_sub_pixel_variance128x128 avx2 neon neon_dotprod ssse3/;
- specialize qw/aom_sub_pixel_variance128x64 avx2 neon neon_dotprod ssse3/;
- specialize qw/aom_sub_pixel_variance64x128 avx2 neon neon_dotprod ssse3/;
- specialize qw/aom_sub_pixel_variance64x64 avx2 neon neon_dotprod ssse3/;
- specialize qw/aom_sub_pixel_variance64x32 avx2 neon neon_dotprod ssse3/;
- specialize qw/aom_sub_pixel_variance32x64 avx2 neon neon_dotprod ssse3/;
- specialize qw/aom_sub_pixel_variance32x32 avx2 neon neon_dotprod ssse3/;
- specialize qw/aom_sub_pixel_variance32x16 avx2 neon neon_dotprod ssse3/;
- specialize qw/aom_sub_pixel_variance16x32 avx2 neon neon_dotprod ssse3/;
- specialize qw/aom_sub_pixel_variance16x16 avx2 neon neon_dotprod ssse3/;
- specialize qw/aom_sub_pixel_variance16x8 avx2 neon neon_dotprod ssse3/;
- specialize qw/aom_sub_pixel_variance8x16 neon neon_dotprod ssse3/;
- specialize qw/aom_sub_pixel_variance8x8 neon neon_dotprod ssse3/;
- specialize qw/aom_sub_pixel_variance8x4 neon neon_dotprod ssse3/;
- specialize qw/aom_sub_pixel_variance4x8 neon neon_dotprod ssse3/;
- specialize qw/aom_sub_pixel_variance4x4 neon ssse3/;
-
- specialize qw/aom_sub_pixel_avg_variance128x128 avx2 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance128x64 avx2 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance64x128 avx2 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance64x64 avx2 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance64x32 avx2 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance32x64 avx2 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance32x32 avx2 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance32x16 avx2 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance16x32 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance16x16 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance16x8 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance8x16 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance8x8 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance8x4 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance4x8 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance4x4 neon ssse3/;
+ specialize qw/aom_sub_pixel_variance128x128 avx2 neon neon_dotprod/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance128x64 avx2 neon neon_dotprod/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance64x128 avx2 neon neon_dotprod/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance64x64 avx2 neon neon_dotprod/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance64x32 avx2 neon neon_dotprod/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance32x64 avx2 neon neon_dotprod/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance32x32 avx2 neon neon_dotprod/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance32x16 avx2 neon neon_dotprod/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance16x32 avx2 neon neon_dotprod/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance16x16 avx2 neon neon_dotprod/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance16x8 avx2 neon neon_dotprod/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance8x16 neon neon_dotprod/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance8x8 neon neon_dotprod/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance8x4 neon neon_dotprod/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance4x8 neon neon_dotprod/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance4x4 neon/, "$ssse3_asm";
+
+ specialize qw/aom_sub_pixel_avg_variance128x128 avx2 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance128x64 avx2 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance64x128 avx2 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance64x64 avx2 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance64x32 avx2 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance32x64 avx2 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance32x32 avx2 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance32x16 avx2 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance16x32 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance16x16 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance16x8 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance8x16 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance8x8 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance8x4 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance4x8 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance4x4 neon/, "$ssse3_asm";
if (aom_config("CONFIG_REALTIME_ONLY") ne "yes") {
specialize qw/aom_variance4x16 neon neon_dotprod sse2/;
@@ -1461,18 +1474,18 @@ if (aom_config("CONFIG_AV1_ENCODER") eq "yes") {
specialize qw/aom_variance16x64 neon neon_dotprod sse2 avx2/;
specialize qw/aom_variance64x16 neon neon_dotprod sse2 avx2/;
- specialize qw/aom_sub_pixel_variance4x16 neon neon_dotprod ssse3/;
- specialize qw/aom_sub_pixel_variance16x4 neon neon_dotprod avx2 ssse3/;
- specialize qw/aom_sub_pixel_variance8x32 neon neon_dotprod ssse3/;
- specialize qw/aom_sub_pixel_variance32x8 neon neon_dotprod ssse3/;
- specialize qw/aom_sub_pixel_variance16x64 neon neon_dotprod avx2 ssse3/;
- specialize qw/aom_sub_pixel_variance64x16 neon neon_dotprod ssse3/;
- specialize qw/aom_sub_pixel_avg_variance4x16 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance16x4 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance8x32 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance32x8 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance16x64 neon ssse3/;
- specialize qw/aom_sub_pixel_avg_variance64x16 neon ssse3/;
+ specialize qw/aom_sub_pixel_variance4x16 neon neon_dotprod/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance16x4 neon neon_dotprod avx2/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance8x32 neon neon_dotprod/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance32x8 neon neon_dotprod/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance16x64 neon neon_dotprod avx2/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_variance64x16 neon neon_dotprod/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance4x16 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance16x4 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance8x32 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance32x8 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance16x64 neon/, "$ssse3_asm";
+ specialize qw/aom_sub_pixel_avg_variance64x16 neon/, "$ssse3_asm";
}
if (aom_config("CONFIG_AV1_HIGHBITDEPTH") eq "yes") {
@@ -1485,53 +1498,53 @@ if (aom_config("CONFIG_AV1_ENCODER") eq "yes") {
}
}
- specialize qw/aom_highbd_12_variance128x128 sse2 neon sve/;
- specialize qw/aom_highbd_12_variance128x64 sse2 neon sve/;
- specialize qw/aom_highbd_12_variance64x128 sse2 neon sve/;
- specialize qw/aom_highbd_12_variance64x64 sse2 neon sve/;
- specialize qw/aom_highbd_12_variance64x32 sse2 neon sve/;
- specialize qw/aom_highbd_12_variance32x64 sse2 neon sve/;
- specialize qw/aom_highbd_12_variance32x32 sse2 neon sve/;
- specialize qw/aom_highbd_12_variance32x16 sse2 neon sve/;
- specialize qw/aom_highbd_12_variance16x32 sse2 neon sve/;
- specialize qw/aom_highbd_12_variance16x16 sse2 neon sve/;
- specialize qw/aom_highbd_12_variance16x8 sse2 neon sve/;
- specialize qw/aom_highbd_12_variance8x16 sse2 neon sve/;
- specialize qw/aom_highbd_12_variance8x8 sse2 neon sve/;
+ specialize qw/aom_highbd_12_variance128x128 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_12_variance128x64 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_12_variance64x128 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_12_variance64x64 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_12_variance64x32 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_12_variance32x64 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_12_variance32x32 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_12_variance32x16 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_12_variance16x32 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_12_variance16x16 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_12_variance16x8 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_12_variance8x16 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_12_variance8x8 neon sve/, "$sse2_asm";
specialize qw/aom_highbd_12_variance8x4 neon sve/;
specialize qw/aom_highbd_12_variance4x8 neon sve/;
specialize qw/aom_highbd_12_variance4x4 sse4_1 neon sve/;
- specialize qw/aom_highbd_10_variance128x128 sse2 avx2 neon sve/;
- specialize qw/aom_highbd_10_variance128x64 sse2 avx2 neon sve/;
- specialize qw/aom_highbd_10_variance64x128 sse2 avx2 neon sve/;
- specialize qw/aom_highbd_10_variance64x64 sse2 avx2 neon sve/;
- specialize qw/aom_highbd_10_variance64x32 sse2 avx2 neon sve/;
- specialize qw/aom_highbd_10_variance32x64 sse2 avx2 neon sve/;
- specialize qw/aom_highbd_10_variance32x32 sse2 avx2 neon sve/;
- specialize qw/aom_highbd_10_variance32x16 sse2 avx2 neon sve/;
- specialize qw/aom_highbd_10_variance16x32 sse2 avx2 neon sve/;
- specialize qw/aom_highbd_10_variance16x16 sse2 avx2 neon sve/;
- specialize qw/aom_highbd_10_variance16x8 sse2 avx2 neon sve/;
- specialize qw/aom_highbd_10_variance8x16 sse2 avx2 neon sve/;
- specialize qw/aom_highbd_10_variance8x8 sse2 avx2 neon sve/;
+ specialize qw/aom_highbd_10_variance128x128 avx2 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_10_variance128x64 avx2 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_10_variance64x128 avx2 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_10_variance64x64 avx2 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_10_variance64x32 avx2 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_10_variance32x64 avx2 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_10_variance32x32 avx2 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_10_variance32x16 avx2 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_10_variance16x32 avx2 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_10_variance16x16 avx2 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_10_variance16x8 avx2 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_10_variance8x16 avx2 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_10_variance8x8 avx2 neon sve/, "$sse2_asm";
specialize qw/aom_highbd_10_variance8x4 neon sve/;
specialize qw/aom_highbd_10_variance4x8 neon sve/;
specialize qw/aom_highbd_10_variance4x4 sse4_1 neon sve/;
- specialize qw/aom_highbd_8_variance128x128 sse2 neon sve/;
- specialize qw/aom_highbd_8_variance128x64 sse2 neon sve/;
- specialize qw/aom_highbd_8_variance64x128 sse2 neon sve/;
- specialize qw/aom_highbd_8_variance64x64 sse2 neon sve/;
- specialize qw/aom_highbd_8_variance64x32 sse2 neon sve/;
- specialize qw/aom_highbd_8_variance32x64 sse2 neon sve/;
- specialize qw/aom_highbd_8_variance32x32 sse2 neon sve/;
- specialize qw/aom_highbd_8_variance32x16 sse2 neon sve/;
- specialize qw/aom_highbd_8_variance16x32 sse2 neon sve/;
- specialize qw/aom_highbd_8_variance16x16 sse2 neon sve/;
- specialize qw/aom_highbd_8_variance16x8 sse2 neon sve/;
- specialize qw/aom_highbd_8_variance8x16 sse2 neon sve/;
- specialize qw/aom_highbd_8_variance8x8 sse2 neon sve/;
+ specialize qw/aom_highbd_8_variance128x128 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_8_variance128x64 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_8_variance64x128 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_8_variance64x64 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_8_variance64x32 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_8_variance32x64 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_8_variance32x32 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_8_variance32x16 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_8_variance16x32 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_8_variance16x16 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_8_variance16x8 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_8_variance8x16 neon sve/, "$sse2_asm";
+ specialize qw/aom_highbd_8_variance8x8 neon sve/, "$sse2_asm";
specialize qw/aom_highbd_8_variance8x4 neon sve/;
specialize qw/aom_highbd_8_variance4x8 neon sve/;
specialize qw/aom_highbd_8_variance4x4 sse4_1 neon sve/;
@@ -1539,73 +1552,73 @@ if (aom_config("CONFIG_AV1_ENCODER") eq "yes") {
if (aom_config("CONFIG_REALTIME_ONLY") ne "yes") {
foreach $bd (8, 10, 12) {
my $avx2 = ($bd == 10) ? "avx2" : "";
- specialize "aom_highbd_${bd}_variance64x16" , $avx2, qw/sse2 neon sve/;
- specialize "aom_highbd_${bd}_variance32x8" , $avx2, qw/sse2 neon sve/;
- specialize "aom_highbd_${bd}_variance16x64" , $avx2, qw/sse2 neon sve/;
+ specialize "aom_highbd_${bd}_variance64x16" , $avx2, qw/neon sve/, "$sse2_asm";
+ specialize "aom_highbd_${bd}_variance32x8" , $avx2, qw/neon sve/, "$sse2_asm";
+ specialize "aom_highbd_${bd}_variance16x64" , $avx2, qw/neon sve/, "$sse2_asm";
specialize "aom_highbd_${bd}_variance16x4" , qw/neon sve/;
- specialize "aom_highbd_${bd}_variance8x32" , $avx2, qw/sse2 neon sve/;
+ specialize "aom_highbd_${bd}_variance8x32" , $avx2, qw/neon sve/, "$sse2_asm";
specialize "aom_highbd_${bd}_variance4x16" , qw/neon sve/;
}
}
- specialize qw/aom_highbd_12_sub_pixel_variance128x128 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_variance128x64 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_variance64x128 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_variance64x64 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_variance64x32 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_variance32x64 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_variance32x32 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_variance32x16 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_variance16x32 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_variance16x16 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_variance16x8 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_variance8x16 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_variance8x8 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_variance8x4 sse2 neon/;
+ specialize qw/aom_highbd_12_sub_pixel_variance128x128 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_variance128x64 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_variance64x128 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_variance64x64 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_variance64x32 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_variance32x64 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_variance32x32 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_variance32x16 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_variance16x32 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_variance16x16 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_variance16x8 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_variance8x16 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_variance8x8 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_variance8x4 neon/, "$sse2_asm";
specialize qw/aom_highbd_12_sub_pixel_variance4x8 neon/;
specialize qw/aom_highbd_12_sub_pixel_variance4x4 sse4_1 neon/;
- specialize qw/aom_highbd_10_sub_pixel_variance128x128 sse2 avx2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_variance128x64 sse2 avx2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_variance64x128 sse2 avx2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_variance64x64 sse2 avx2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_variance64x32 sse2 avx2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_variance32x64 sse2 avx2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_variance32x32 sse2 avx2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_variance32x16 sse2 avx2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_variance16x32 sse2 avx2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_variance16x16 sse2 avx2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_variance16x8 sse2 avx2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_variance8x16 sse2 avx2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_variance8x8 sse2 avx2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_variance8x4 sse2 neon/;
+ specialize qw/aom_highbd_10_sub_pixel_variance128x128 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_variance128x64 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_variance64x128 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_variance64x64 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_variance64x32 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_variance32x64 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_variance32x32 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_variance32x16 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_variance16x32 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_variance16x16 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_variance16x8 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_variance8x16 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_variance8x8 avx2 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_variance8x4 neon/, "$sse2_asm";
specialize qw/aom_highbd_10_sub_pixel_variance4x8 neon/;
specialize qw/aom_highbd_10_sub_pixel_variance4x4 sse4_1 neon/;
- specialize qw/aom_highbd_8_sub_pixel_variance128x128 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_variance128x64 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_variance64x128 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_variance64x64 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_variance64x32 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_variance32x64 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_variance32x32 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_variance32x16 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_variance16x32 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_variance16x16 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_variance16x8 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_variance8x16 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_variance8x8 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_variance8x4 sse2 neon/;
+ specialize qw/aom_highbd_8_sub_pixel_variance128x128 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_variance128x64 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_variance64x128 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_variance64x64 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_variance64x32 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_variance32x64 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_variance32x32 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_variance32x16 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_variance16x32 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_variance16x16 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_variance16x8 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_variance8x16 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_variance8x8 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_variance8x4 neon/, "$sse2_asm";
specialize qw/aom_highbd_8_sub_pixel_variance4x8 neon/;
specialize qw/aom_highbd_8_sub_pixel_variance4x4 sse4_1 neon/;
if (aom_config("CONFIG_REALTIME_ONLY") ne "yes") {
foreach $bd (8, 10, 12) {
- specialize "aom_highbd_${bd}_sub_pixel_variance64x16" , qw/sse2 neon/;
- specialize "aom_highbd_${bd}_sub_pixel_variance32x8" , qw/sse2 neon/;
- specialize "aom_highbd_${bd}_sub_pixel_variance16x64" , qw/sse2 neon/;
- specialize "aom_highbd_${bd}_sub_pixel_variance16x4" , qw/sse2 neon/;
- specialize "aom_highbd_${bd}_sub_pixel_variance8x32" , qw/sse2 neon/;
+ specialize "aom_highbd_${bd}_sub_pixel_variance64x16" , qw/neon/, "$sse2_asm";
+ specialize "aom_highbd_${bd}_sub_pixel_variance32x8" , qw/neon/, "$sse2_asm";
+ specialize "aom_highbd_${bd}_sub_pixel_variance16x64" , qw/neon/, "$sse2_asm";
+ specialize "aom_highbd_${bd}_sub_pixel_variance16x4" , qw/neon/, "$sse2_asm";
+ specialize "aom_highbd_${bd}_sub_pixel_variance8x32" , qw/neon/, "$sse2_asm";
specialize "aom_highbd_${bd}_sub_pixel_variance4x16" , qw/neon/;
}
}
@@ -1613,61 +1626,61 @@ if (aom_config("CONFIG_AV1_ENCODER") eq "yes") {
specialize qw/aom_highbd_12_sub_pixel_avg_variance128x128 neon/;
specialize qw/aom_highbd_12_sub_pixel_avg_variance128x64 neon/;
specialize qw/aom_highbd_12_sub_pixel_avg_variance64x128 neon/;
- specialize qw/aom_highbd_12_sub_pixel_avg_variance64x64 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_avg_variance64x32 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_avg_variance32x64 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_avg_variance32x32 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_avg_variance32x16 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_avg_variance16x32 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_avg_variance16x16 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_avg_variance16x8 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_avg_variance8x16 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_avg_variance8x8 sse2 neon/;
- specialize qw/aom_highbd_12_sub_pixel_avg_variance8x4 sse2 neon/;
+ specialize qw/aom_highbd_12_sub_pixel_avg_variance64x64 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_avg_variance64x32 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_avg_variance32x64 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_avg_variance32x32 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_avg_variance32x16 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_avg_variance16x32 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_avg_variance16x16 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_avg_variance16x8 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_avg_variance8x16 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_avg_variance8x8 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_12_sub_pixel_avg_variance8x4 neon/, "$sse2_asm";
specialize qw/aom_highbd_12_sub_pixel_avg_variance4x8 neon/;
specialize qw/aom_highbd_12_sub_pixel_avg_variance4x4 sse4_1 neon/;
specialize qw/aom_highbd_10_sub_pixel_avg_variance128x128 neon/;
specialize qw/aom_highbd_10_sub_pixel_avg_variance128x64 neon/;
specialize qw/aom_highbd_10_sub_pixel_avg_variance64x128 neon/;
- specialize qw/aom_highbd_10_sub_pixel_avg_variance64x64 sse2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_avg_variance64x32 sse2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_avg_variance32x64 sse2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_avg_variance32x32 sse2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_avg_variance32x16 sse2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_avg_variance16x32 sse2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_avg_variance16x16 sse2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_avg_variance16x8 sse2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_avg_variance8x16 sse2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_avg_variance8x8 sse2 neon/;
- specialize qw/aom_highbd_10_sub_pixel_avg_variance8x4 sse2 neon/;
+ specialize qw/aom_highbd_10_sub_pixel_avg_variance64x64 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_avg_variance64x32 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_avg_variance32x64 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_avg_variance32x32 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_avg_variance32x16 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_avg_variance16x32 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_avg_variance16x16 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_avg_variance16x8 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_avg_variance8x16 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_avg_variance8x8 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_10_sub_pixel_avg_variance8x4 neon/, "$sse2_asm";
specialize qw/aom_highbd_10_sub_pixel_avg_variance4x8 neon/;
specialize qw/aom_highbd_10_sub_pixel_avg_variance4x4 sse4_1 neon/;
specialize qw/aom_highbd_8_sub_pixel_avg_variance128x128 neon/;
specialize qw/aom_highbd_8_sub_pixel_avg_variance128x64 neon/;
specialize qw/aom_highbd_8_sub_pixel_avg_variance64x128 neon/;
- specialize qw/aom_highbd_8_sub_pixel_avg_variance64x64 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_avg_variance64x32 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_avg_variance32x64 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_avg_variance32x32 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_avg_variance32x16 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_avg_variance16x32 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_avg_variance16x16 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_avg_variance16x8 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_avg_variance8x16 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_avg_variance8x8 sse2 neon/;
- specialize qw/aom_highbd_8_sub_pixel_avg_variance8x4 sse2 neon/;
+ specialize qw/aom_highbd_8_sub_pixel_avg_variance64x64 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_avg_variance64x32 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_avg_variance32x64 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_avg_variance32x32 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_avg_variance32x16 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_avg_variance16x32 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_avg_variance16x16 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_avg_variance16x8 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_avg_variance8x16 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_avg_variance8x8 neon/, "$sse2_asm";
+ specialize qw/aom_highbd_8_sub_pixel_avg_variance8x4 neon/, "$sse2_asm";
specialize qw/aom_highbd_8_sub_pixel_avg_variance4x8 neon/;
specialize qw/aom_highbd_8_sub_pixel_avg_variance4x4 sse4_1 neon/;
if (aom_config("CONFIG_REALTIME_ONLY") ne "yes") {
foreach $bd (8, 10, 12) {
- specialize "aom_highbd_${bd}_sub_pixel_avg_variance64x16" , qw/sse2 neon/;
- specialize "aom_highbd_${bd}_sub_pixel_avg_variance32x8" , qw/sse2 neon/;
- specialize "aom_highbd_${bd}_sub_pixel_avg_variance16x64" , qw/sse2 neon/;
- specialize "aom_highbd_${bd}_sub_pixel_avg_variance16x4" , qw/sse2 neon/;
- specialize "aom_highbd_${bd}_sub_pixel_avg_variance8x32" , qw/sse2 neon/;
+ specialize "aom_highbd_${bd}_sub_pixel_avg_variance64x16" , qw/neon/, "$sse2_asm";
+ specialize "aom_highbd_${bd}_sub_pixel_avg_variance32x8" , qw/neon/, "$sse2_asm";
+ specialize "aom_highbd_${bd}_sub_pixel_avg_variance16x64" , qw/neon/, "$sse2_asm";
+ specialize "aom_highbd_${bd}_sub_pixel_avg_variance16x4" , qw/neon/, "$sse2_asm";
+ specialize "aom_highbd_${bd}_sub_pixel_avg_variance8x32" , qw/neon/, "$sse2_asm";
specialize "aom_highbd_${bd}_sub_pixel_avg_variance4x16" , qw/neon/;
}
}
diff --git a/aom_dsp/x86/aom_subpixel_8t_intrin_avx2.c b/aom_dsp/x86/aom_subpixel_8t_intrin_avx2.c
index ab8041296e..0f93603d84 100644
--- a/aom_dsp/x86/aom_subpixel_8t_intrin_avx2.c
+++ b/aom_dsp/x86/aom_subpixel_8t_intrin_avx2.c
@@ -42,7 +42,7 @@
#define MM256_BROADCASTSI128_SI256(x) _mm256_broadcastsi128_si256(x)
#endif // __clang__
-#if !CONFIG_HIGHWAY
+#if !CONFIG_HIGHWAY && HAVE_X86_ASM
static inline void xx_storeu2_epi32(const uint8_t *output_ptr,
const ptrdiff_t stride, const __m256i *a) {
*((int *)(output_ptr)) = _mm_cvtsi128_si32(_mm256_castsi256_si128(*a));
@@ -1401,9 +1401,9 @@ static void aom_filter_block1d4_v4_avx2(
srcReg4x = srcReg6x;
}
}
-#endif // !CONFIG_HIGHWAY
+#endif // !CONFIG_HIGHWAY && HAVE_X86_ASM
-#if HAVE_AVX2 && HAVE_SSSE3
+#if HAVE_AVX2 && HAVE_SSSE3 && HAVE_X86_ASM
#if !CONFIG_HIGHWAY
filter8_1dfunction aom_filter_block1d16_h2_ssse3;
filter8_1dfunction aom_filter_block1d8_h2_ssse3;
@@ -1436,4 +1436,4 @@ filter8_1dfunction aom_filter_block1d4_v2_ssse3;
FUN_CONV_1D(vert, y_step_q4, filter_y, v, src - src_stride * 3, , avx2)
#endif // !CONFIG_HIGHWAY
-#endif // HAVE_AVX2 && HAVE_SSSE3
+#endif // HAVE_AVX2 && HAVE_SSSE3 && HAVE_X86_ASM
diff --git a/aom_dsp/x86/aom_subpixel_8t_intrin_ssse3.c b/aom_dsp/x86/aom_subpixel_8t_intrin_ssse3.c
index 9978d23258..dc03d76ce2 100644
--- a/aom_dsp/x86/aom_subpixel_8t_intrin_ssse3.c
+++ b/aom_dsp/x86/aom_subpixel_8t_intrin_ssse3.c
@@ -11,6 +11,7 @@
#include <tmmintrin.h>
+#include "config/aom_config.h"
#include "config/aom_dsp_rtcd.h"
#include "aom_dsp/aom_filter.h"
@@ -23,6 +24,7 @@
#include "aom_ports/mem.h"
#include "aom_ports/emmintrin_compat.h"
+#if HAVE_X86_ASM
DECLARE_ALIGNED(32, static const uint8_t, filt_h4[]) = {
0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 0, 1, 1,
2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 2, 3, 3, 4, 4, 5,
@@ -484,6 +486,7 @@ static void aom_filter_block1d16_v4_ssse3(
srcReg4 = srcReg6;
}
}
+#endif // HAVE_X86_ASM
static inline __m128i shuffle_filter_convolve8_8_ssse3(
const __m128i *const s, const int16_t *const filter) {
@@ -819,6 +822,7 @@ void aom_scaled_2d_ssse3(const uint8_t *src, ptrdiff_t src_stride, uint8_t *dst,
}
}
+#if HAVE_X86_ASM
filter8_1dfunction aom_filter_block1d16_v8_ssse3;
filter8_1dfunction aom_filter_block1d16_h8_ssse3;
filter8_1dfunction aom_filter_block1d8_v8_ssse3;
@@ -845,3 +849,4 @@ filter8_1dfunction aom_filter_block1d4_h2_ssse3;
// int w, int h);
FUN_CONV_1D(horiz, x_step_q4, filter_x, h, src, , ssse3)
FUN_CONV_1D(vert, y_step_q4, filter_y, v, src - src_stride * 3, , ssse3)
+#endif // HAVE_X86_ASM
diff --git a/aom_dsp/x86/highbd_convolve_avx2.c b/aom_dsp/x86/highbd_convolve_avx2.c
index a98e14bda1..c57b6105ba 100644
--- a/aom_dsp/x86/highbd_convolve_avx2.c
+++ b/aom_dsp/x86/highbd_convolve_avx2.c
@@ -11,6 +11,7 @@
#include <immintrin.h>
#include <string.h>
+#include "config/aom_config.h"
#include "config/av1_rtcd.h"
#include "aom_dsp/x86/convolve.h"
@@ -20,6 +21,7 @@
// -----------------------------------------------------------------------------
// Copy and average
+#if HAVE_X86_ASM
static const uint8_t ip_shuffle_f2f3[32] = { 0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6,
7, 6, 7, 8, 9, 0, 1, 2, 3, 2, 3,
4, 5, 4, 5, 6, 7, 6, 7, 8, 9 };
@@ -27,6 +29,7 @@ static const uint8_t ip_shuffle_f4f5[32] = { 4, 5, 6, 7, 6, 7, 8, 9,
8, 9, 10, 11, 10, 11, 12, 13,
4, 5, 6, 7, 6, 7, 8, 9,
8, 9, 10, 11, 10, 11, 12, 13 };
+#endif // HAVE_X86_ASM
void av1_highbd_convolve_x_sr_ssse3(const uint16_t *src, int src_stride,
uint16_t *dst, int dst_stride, int w, int h,
@@ -288,6 +291,9 @@ void av1_highbd_convolve_x_sr_avx2(const uint16_t *src, int src_stride,
// -----------------------------------------------------------------------------
// Horizontal and vertical filtering
+#if HAVE_X86_ASM
+// The aom_highbd_convolve8_{horiz,vert}_avx2 functions below also call SSE2
+// assembly.
static const uint8_t signal_pattern_0[32] = { 0, 1, 2, 3, 2, 3, 4, 5, 4, 5, 6,
7, 6, 7, 8, 9, 0, 1, 2, 3, 2, 3,
4, 5, 4, 5, 6, 7, 6, 7, 8, 9 };
@@ -1246,3 +1252,4 @@ HIGH_FUN_CONV_1D(horiz, x_step_q4, filter_x, h, src, , avx2)
HIGH_FUN_CONV_1D(vert, y_step_q4, filter_y, v, src - src_stride * 3, , avx2)
#undef HIGHBD_FUNC
+#endif // HAVE_X86_ASM
diff --git a/aom_dsp/x86/highbd_convolve_sse2.c b/aom_dsp/x86/highbd_convolve_sse2.c
index 2f2b413d0a..51726fe714 100644
--- a/aom_dsp/x86/highbd_convolve_sse2.c
+++ b/aom_dsp/x86/highbd_convolve_sse2.c
@@ -10,11 +10,13 @@
*/
#include <emmintrin.h>
+#include "config/aom_config.h"
#include "config/aom_dsp_rtcd.h"
#include "aom_dsp/x86/convolve.h"
// -----------------------------------------------------------------------------
+#if HAVE_X86_ASM
static void aom_highbd_filter_block1d4_v4_sse2(
const uint16_t *src_ptr, ptrdiff_t src_pitch, uint16_t *dst_ptr,
ptrdiff_t dst_pitch, uint32_t height, const int16_t *filter, int bd) {
@@ -380,3 +382,4 @@ highbd_filter8_1dfunction aom_highbd_filter_block1d4_h2_sse2;
// int w, int h, int bd);
HIGH_FUN_CONV_1D(horiz, x_step_q4, filter_x, h, src, , sse2)
HIGH_FUN_CONV_1D(vert, y_step_q4, filter_y, v, src - src_stride * 3, , sse2)
+#endif // HAVE_X86_ASM
diff --git a/aom_dsp/x86/highbd_variance_avx2.c b/aom_dsp/x86/highbd_variance_avx2.c
index e8e538b754..0606916910 100644
--- a/aom_dsp/x86/highbd_variance_avx2.c
+++ b/aom_dsp/x86/highbd_variance_avx2.c
@@ -762,16 +762,23 @@ SSE2_HEIGHT(16)
#undef SSE2_HEIGHT
+// The 8-wide SSE2 versions are x86 assembly; use C when that is unavailable.
+#if HAVE_X86_ASM
+#define HIGHBD_10_SUBPIX_VAR_8XH(H) aom_highbd_10_sub_pixel_variance8x##H##_sse2
+#else
+#define HIGHBD_10_SUBPIX_VAR_8XH(H) aom_highbd_10_sub_pixel_variance8x##H##_c
+#endif
+
#define HIGHBD_SUBPIX_VAR(W, H) \
uint32_t aom_highbd_10_sub_pixel_variance##W##x##H##_avx2( \
const uint8_t *src, int src_stride, int xoffset, int yoffset, \
const uint8_t *dst, int dst_stride, uint32_t *sse) { \
if (W == 8 && H == 16) \
- return aom_highbd_10_sub_pixel_variance8x16_sse2( \
- src, src_stride, xoffset, yoffset, dst, dst_stride, sse); \
+ return HIGHBD_10_SUBPIX_VAR_8XH(16)(src, src_stride, xoffset, yoffset, \
+ dst, dst_stride, sse); \
else if (W == 8 && H == 8) \
- return aom_highbd_10_sub_pixel_variance8x8_sse2( \
- src, src_stride, xoffset, yoffset, dst, dst_stride, sse); \
+ return HIGHBD_10_SUBPIX_VAR_8XH(8)(src, src_stride, xoffset, yoffset, \
+ dst, dst_stride, sse); \
else \
return aom_highbd_var_filter_block2d_bil_avx2( \
src, src_stride, 1, H, W, xoffset, yoffset, dst, dst_stride, sse); \
@@ -792,6 +799,7 @@ HIGHBD_SUBPIX_VAR(8, 16)
HIGHBD_SUBPIX_VAR(8, 8)
#undef HIGHBD_SUBPIX_VAR
+#undef HIGHBD_10_SUBPIX_VAR_8XH
static uint64_t mse_4xh_16bit_highbd_avx2(uint16_t *dst, int dstride,
uint16_t *src, int sstride, int h) {
diff --git a/aom_dsp/x86/highbd_variance_sse2.c b/aom_dsp/x86/highbd_variance_sse2.c
index 1654cf0fee..d5789e82fc 100644
--- a/aom_dsp/x86/highbd_variance_sse2.c
+++ b/aom_dsp/x86/highbd_variance_sse2.c
@@ -21,6 +21,7 @@
#include "av1/common/filter.h"
#include "av1/common/reconinter.h"
+#if HAVE_X86_ASM
typedef uint32_t (*high_variance_fn_t)(const uint16_t *src, int src_stride,
const uint16_t *ref, int ref_stride,
uint32_t *sse, int *sum);
@@ -607,6 +608,7 @@ FNS(sse2)
#undef FNS
#undef FN
+#endif // HAVE_X86_ASM
static uint64_t mse_4xh_16bit_highbd_sse2(uint16_t *dst, int dstride,
uint16_t *src, int sstride, int h) {
diff --git a/aom_dsp/x86/subtract_avx2.c b/aom_dsp/x86/subtract_avx2.c
index fec954f65e..b9e2a090c8 100644
--- a/aom_dsp/x86/subtract_avx2.c
+++ b/aom_dsp/x86/subtract_avx2.c
@@ -102,8 +102,13 @@ void aom_subtract_block_avx2(int rows, int cols, int16_t *diff_ptr,
src_stride, pred_ptr, pred_stride);
break;
default:
+#if HAVE_X86_ASM
aom_subtract_block_sse2(rows, cols, diff_ptr, diff_stride, src_ptr,
src_stride, pred_ptr, pred_stride);
+#else
+ aom_subtract_block_c(rows, cols, diff_ptr, diff_stride, src_ptr,
+ src_stride, pred_ptr, pred_stride);
+#endif
break;
}
}
diff --git a/aom_dsp/x86/variance_ssse3.c b/aom_dsp/x86/variance_ssse3.c
index c95c7d8fec..f7dcf3e82a 100644
--- a/aom_dsp/x86/variance_ssse3.c
+++ b/aom_dsp/x86/variance_ssse3.c
@@ -17,6 +17,7 @@
#include "aom_dsp/aom_dsp_common.h"
+#if HAVE_X86_ASM
// The 2 unused parameters are place holders for PIC enabled build.
// These definitions are for functions defined in subpel_variance.asm
#define DECL(w, opt) \
@@ -206,3 +207,4 @@ FNS(ssse3)
#undef FNS
#undef FN
+#endif // HAVE_X86_ASM
diff --git a/av1/av1.cmake b/av1/av1.cmake
index 491dd37c2e..c95a0478c1 100644
--- a/av1/av1.cmake
+++ b/av1/av1.cmake
@@ -740,7 +740,7 @@ function(setup_av1_targets)
add_intrinsics_object_library("-msse2" "sse2" "aom_av1_common"
"AOM_AV1_COMMON_INTRIN_SSE2")
if(CONFIG_AV1_DECODER)
- if(AOM_AV1_DECODER_ASM_SSE2)
+ if(AOM_AV1_DECODER_ASM_SSE2 AND HAVE_X86_ASM)
add_asm_library("aom_av1_decoder_sse2" "AOM_AV1_DECODER_ASM_SSE2")
endif()
@@ -751,7 +751,9 @@ function(setup_av1_targets)
endif()
if(CONFIG_AV1_ENCODER)
- add_asm_library("aom_av1_encoder_sse2" "AOM_AV1_ENCODER_ASM_SSE2")
+ if(HAVE_X86_ASM)
+ add_asm_library("aom_av1_encoder_sse2" "AOM_AV1_ENCODER_ASM_SSE2")
+ endif()
add_intrinsics_object_library("-msse2" "sse2" "aom_av1_encoder"
"AOM_AV1_ENCODER_INTRIN_SSE2")
endif()
@@ -788,7 +790,7 @@ function(setup_av1_targets)
"AOM_AV1_COMMON_INTRIN_SSE4_1")
if(CONFIG_AV1_ENCODER)
- if("${AOM_TARGET_CPU}" STREQUAL "x86_64")
+ if("${AOM_TARGET_CPU}" STREQUAL "x86_64" AND HAVE_X86_ASM)
add_asm_library("aom_av1_encoder_ssse3"
"AOM_AV1_ENCODER_ASM_SSSE3_X86_64")
endif()
diff --git a/av1/common/av1_rtcd_defs.pl b/av1/common/av1_rtcd_defs.pl
index 78bbf0327f..006017c8fd 100644
--- a/av1/common/av1_rtcd_defs.pl
+++ b/av1/common/av1_rtcd_defs.pl
@@ -97,6 +97,16 @@ if ($opts{arch} eq "x86_64") {
$avx2_x86_64 = 'avx2';
}
+# Flavors of functions that require x86 assembly (nasm/yasm), either directly
+# or through helpers. They are unavailable when the assembly is disabled
+# (ENABLE_X86_ASM=0) or the x86 intrinsics are built for other targets, e.g.
+# wasm32 with Emscripten.
+$sse2_asm = $ssse3_asm = '';
+if (aom_config("HAVE_X86_ASM") eq "yes") {
+ $sse2_asm = 'sse2';
+ $ssse3_asm = 'ssse3';
+}
+
add_proto qw/void av1_convolve_horiz_rs/, "const uint8_t *src, int src_stride, uint8_t *dst, int dst_stride, int w, int h, const int16_t *x_filters, int x0_qn, int x_step_qn";
specialize qw/av1_convolve_horiz_rs sse4_1 neon/;
@@ -285,7 +295,7 @@ if (aom_config("CONFIG_AV1_ENCODER") eq "yes") {
# the transform coefficients are held in 32-bit
# values, so the assembler code for av1_block_error can no longer be used.
add_proto qw/int64_t av1_block_error/, "const tran_low_t *coeff, const tran_low_t *dqcoeff, intptr_t block_size, int64_t *ssz";
- specialize qw/av1_block_error sse2 avx2 neon sve/;
+ specialize qw/av1_block_error avx2 neon sve/, "$sse2_asm";
add_proto qw/int64_t av1_block_error_lp/, "const int16_t *coeff, const int16_t *dqcoeff, intptr_t block_size";
specialize qw/av1_block_error_lp sse2 avx2 neon sve/;
diff --git a/cmake/aom_config_defaults.cmake b/cmake/aom_config_defaults.cmake
index 8bb02590fe..c5c3c3d3cc 100644
--- a/cmake/aom_config_defaults.cmake
+++ b/cmake/aom_config_defaults.cmake
@@ -60,6 +60,7 @@ set_aom_detect_var(HAVE_SSE4_2 0 "Enables SSE 4.2 optimizations.")
set_aom_detect_var(HAVE_AVX 0 "Enables AVX optimizations.")
set_aom_detect_var(HAVE_AVX2 0 "Enables AVX2 optimizations.")
set_aom_detect_var(HAVE_AVX512 0 "Enables AVX512 optimizations.")
+set_aom_detect_var(HAVE_X86_ASM 0 "Enables x86 assembly optimizations.")
# RISC-V64 feature flags.
set_aom_detect_var(HAVE_RVV 0 "Enables RVV optimizations.")
@@ -215,6 +216,8 @@ set_aom_option_var(ENABLE_GOMA "Enable goma support." OFF)
set_aom_option_var(
ENABLE_IDE_TEST_HOSTING
"Enables running tests within IDEs like Visual Studio and Xcode." OFF)
+set_aom_option_var(ENABLE_X86_ASM
+ "Enables x86 assembly optimizations on x86 targets." ON)
set_aom_option_var(ENABLE_NASM "Use nasm instead of yasm for x86 assembly." OFF)
set_aom_option_var(ENABLE_TESTDATA "Enables unit test data download targets."
ON)
diff --git a/cmake/cpu.cmake b/cmake/cpu.cmake
index 314e04582c..7b988bd71f 100644
--- a/cmake/cpu.cmake
+++ b/cmake/cpu.cmake
@@ -106,6 +106,9 @@ elseif("${AOM_TARGET_CPU}" MATCHES "ppc")
set(AOM_RTCD_FLAGS ${AOM_RTCD_FLAGS} --disable-vsx)
endif()
elseif("${AOM_TARGET_CPU}" MATCHES "^x86")
+ if(ENABLE_X86_ASM)
+ set(HAVE_X86_ASM 1)
+ endif()
if("${AOM_TARGET_CPU}" STREQUAL "x86")
set(AOM_ARCH_X86 1)
# Disable avx512
diff --git a/test/convolve_test.cc b/test/convolve_test.cc
index 2d1e12cd09..dc61239089 100644
--- a/test/convolve_test.cc
+++ b/test/convolve_test.cc
@@ -734,14 +734,14 @@ using std::make_tuple;
aom_highbd_##func(src, src_stride, dst, dst_stride, filter_x, \
filter_x_stride, filter_y, filter_y_stride, w, h, bd); \
}
-#if HAVE_SSE2 && AOM_ARCH_X86_64
+#if HAVE_SSE2 && AOM_ARCH_X86_64 && HAVE_X86_ASM
WRAP(convolve8_horiz_sse2, 8)
WRAP(convolve8_vert_sse2, 8)
WRAP(convolve8_horiz_sse2, 10)
WRAP(convolve8_vert_sse2, 10)
WRAP(convolve8_horiz_sse2, 12)
WRAP(convolve8_vert_sse2, 12)
-#endif // HAVE_SSE2 && AOM_ARCH_X86_64
+#endif // HAVE_SSE2 && AOM_ARCH_X86_64 && HAVE_X86_ASM
WRAP(convolve8_horiz_c, 8)
WRAP(convolve8_vert_c, 8)
@@ -750,7 +750,7 @@ WRAP(convolve8_vert_c, 10)
WRAP(convolve8_horiz_c, 12)
WRAP(convolve8_vert_c, 12)
-#if HAVE_AVX2
+#if HAVE_AVX2 && HAVE_X86_ASM
WRAP(convolve8_horiz_avx2, 8)
WRAP(convolve8_vert_avx2, 8)
@@ -759,7 +759,7 @@ WRAP(convolve8_vert_avx2, 10)
WRAP(convolve8_horiz_avx2, 12)
WRAP(convolve8_vert_avx2, 12)
-#endif // HAVE_AVX2
+#endif // HAVE_AVX2 && HAVE_X86_ASM
#if HAVE_NEON
WRAP(convolve8_horiz_neon, 8)
@@ -825,7 +825,7 @@ const ConvolveParam kArrayConvolve_c[] = { ALL_SIZES(convolve8_c) };
INSTANTIATE_TEST_SUITE_P(C, LowbdConvolveTest,
::testing::ValuesIn(kArrayConvolve_c));
-#if HAVE_SSE2 && AOM_ARCH_X86_64
+#if HAVE_SSE2 && AOM_ARCH_X86_64 && HAVE_X86_ASM
#if CONFIG_AV1_HIGHBITDEPTH
const ConvolveFunctions wrap_convolve8_sse2(wrap_convolve8_horiz_sse2_8,
wrap_convolve8_vert_sse2_8, 8);
@@ -843,7 +843,7 @@ INSTANTIATE_TEST_SUITE_P(SSE2, HighbdConvolveTest,
#endif
#endif
-#if HAVE_SSSE3
+#if HAVE_SSSE3 && HAVE_X86_ASM
const ConvolveFunctions convolve8_ssse3(aom_convolve8_horiz_ssse3,
aom_convolve8_vert_ssse3, 0);
@@ -853,7 +853,7 @@ INSTANTIATE_TEST_SUITE_P(SSSE3, LowbdConvolveTest,
::testing::ValuesIn(kArrayConvolve8_ssse3));
#endif
-#if HAVE_AVX2
+#if HAVE_AVX2 && HAVE_X86_ASM
#if CONFIG_AV1_HIGHBITDEPTH
const ConvolveFunctions wrap_convolve8_avx2(wrap_convolve8_horiz_avx2_8,
wrap_convolve8_vert_avx2_8, 8);
@@ -876,7 +876,7 @@ const ConvolveParam kArray_Convolve8_avx2[] = { ALL_SIZES(convolve8_avx2) };
INSTANTIATE_TEST_SUITE_P(AVX2, LowbdConvolveTest,
::testing::ValuesIn(kArray_Convolve8_avx2));
-#endif // HAVE_AVX2
+#endif // HAVE_AVX2 && HAVE_X86_ASM
#if HAVE_AVX512 && CONFIG_HIGHWAY
extern "C" void aom_convolve8_horiz_avx512(
diff --git a/test/error_block_test.cc b/test/error_block_test.cc
index 2139537238..794558ac83 100644
--- a/test/error_block_test.cc
+++ b/test/error_block_test.cc
@@ -255,8 +255,10 @@ const ErrorBlockParam kErrorBlockTestParamsSse2[] = {
make_tuple(&av1_highbd_block_error_sse2, &av1_highbd_block_error_c,
AOM_BITS_8),
#endif
+#if HAVE_X86_ASM
make_tuple(&BlockError8BitWrapper<av1_block_error_sse2>,
&BlockError8BitWrapper<av1_block_error_c>, AOM_BITS_8),
+#endif // HAVE_X86_ASM
make_tuple(&BlockErrorLpWrapper<av1_block_error_lp_sse2>,
&BlockErrorLpWrapper<av1_block_error_lp_c>, AOM_BITS_8)
};
diff --git a/test/intrapred_test.cc b/test/intrapred_test.cc
index f3a246be55..ffe73fce29 100644
--- a/test/intrapred_test.cc
+++ b/test/intrapred_test.cc
@@ -352,10 +352,39 @@ TEST_P(LowbdIntraPredTest, DISABLED_Speed) {
#endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
#if HAVE_SSE2
+#if !HAVE_X86_ASM
+// The SSE2 4x4, 8x8, 16x16 and 32x32 predictors below are written in x86
+// assembly, so only the other sizes are available without it.
+#if !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
+#define lowbd_intrapred_sse2_no_asm(type) \
+ lowbd_entry(type, 4, 8, sse2), lowbd_entry(type, 4, 16, sse2), \
+ lowbd_entry(type, 8, 4, sse2), lowbd_entry(type, 8, 16, sse2), \
+ lowbd_entry(type, 8, 32, sse2), lowbd_entry(type, 16, 4, sse2), \
+ lowbd_entry(type, 16, 8, sse2), lowbd_entry(type, 16, 32, sse2), \
+ lowbd_entry(type, 16, 64, sse2), lowbd_entry(type, 32, 8, sse2), \
+ lowbd_entry(type, 32, 16, sse2), lowbd_entry(type, 32, 64, sse2), \
+ lowbd_entry(type, 64, 16, sse2), lowbd_entry(type, 64, 32, sse2), \
+ lowbd_entry(type, 64, 64, sse2)
+#else
+#define lowbd_intrapred_sse2_no_asm(type) \
+ lowbd_entry(type, 4, 8, sse2), lowbd_entry(type, 8, 4, sse2), \
+ lowbd_entry(type, 8, 16, sse2), lowbd_entry(type, 16, 8, sse2), \
+ lowbd_entry(type, 16, 32, sse2), lowbd_entry(type, 32, 16, sse2), \
+ lowbd_entry(type, 32, 64, sse2), lowbd_entry(type, 64, 32, sse2), \
+ lowbd_entry(type, 64, 64, sse2)
+#endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
+#endif // !HAVE_X86_ASM
+
const IntraPredFunc<IntraPred> LowbdIntraPredTestVector[] = {
+#if HAVE_X86_ASM
lowbd_intrapred(dc, sse2), lowbd_intrapred(dc_top, sse2),
lowbd_intrapred(dc_left, sse2), lowbd_intrapred(dc_128, sse2),
lowbd_intrapred(v, sse2), lowbd_intrapred(h, sse2),
+#else
+ lowbd_intrapred_sse2_no_asm(dc), lowbd_intrapred_sse2_no_asm(dc_top),
+ lowbd_intrapred_sse2_no_asm(dc_left), lowbd_intrapred_sse2_no_asm(dc_128),
+ lowbd_intrapred_sse2_no_asm(v), lowbd_intrapred_sse2_no_asm(h),
+#endif // HAVE_X86_ASM
};
INSTANTIATE_TEST_SUITE_P(SSE2, LowbdIntraPredTest,
@@ -466,16 +495,24 @@ INSTANTIATE_TEST_SUITE_P(NEON, HighbdIntraPredTest,
#if HAVE_SSE2
const IntraPredFunc<HighbdIntraPred> HighbdIntraPredTestVectorSse2[] = {
+#if HAVE_X86_ASM
highbd_entry(dc, 4, 4, sse2, 12),
+#endif // HAVE_X86_ASM
highbd_entry(dc, 4, 8, sse2, 12),
highbd_entry(dc, 8, 4, sse2, 12),
+#if HAVE_X86_ASM
highbd_entry(dc, 8, 8, sse2, 12),
+#endif // HAVE_X86_ASM
highbd_entry(dc, 8, 16, sse2, 12),
highbd_entry(dc, 16, 8, sse2, 12),
+#if HAVE_X86_ASM
highbd_entry(dc, 16, 16, sse2, 12),
+#endif // HAVE_X86_ASM
highbd_entry(dc, 16, 32, sse2, 12),
highbd_entry(dc, 32, 16, sse2, 12),
+#if HAVE_X86_ASM
highbd_entry(dc, 32, 32, sse2, 12),
+#endif // HAVE_X86_ASM
highbd_entry(dc_top, 4, 4, sse2, 12),
highbd_entry(dc_top, 4, 8, sse2, 12),
@@ -510,16 +547,24 @@ const IntraPredFunc<HighbdIntraPred> HighbdIntraPredTestVectorSse2[] = {
highbd_entry(dc_128, 32, 16, sse2, 12),
highbd_entry(dc_128, 32, 32, sse2, 12),
+#if HAVE_X86_ASM
highbd_entry(v, 4, 4, sse2, 12),
+#endif // HAVE_X86_ASM
highbd_entry(v, 4, 8, sse2, 12),
highbd_entry(v, 8, 4, sse2, 12),
+#if HAVE_X86_ASM
highbd_entry(v, 8, 8, sse2, 12),
+#endif // HAVE_X86_ASM
highbd_entry(v, 8, 16, sse2, 12),
highbd_entry(v, 16, 8, sse2, 12),
+#if HAVE_X86_ASM
highbd_entry(v, 16, 16, sse2, 12),
+#endif // HAVE_X86_ASM
highbd_entry(v, 16, 32, sse2, 12),
highbd_entry(v, 32, 16, sse2, 12),
+#if HAVE_X86_ASM
highbd_entry(v, 32, 32, sse2, 12),
+#endif // HAVE_X86_ASM
highbd_entry(h, 4, 4, sse2, 12),
highbd_entry(h, 4, 8, sse2, 12),
diff --git a/test/quantize_func_test.cc b/test/quantize_func_test.cc
index c047cbcf9a..a36752964f 100644
--- a/test/quantize_func_test.cc
+++ b/test/quantize_func_test.cc
@@ -767,7 +767,7 @@ INSTANTIATE_TEST_SUITE_P(NEON, FullPrecisionQuantizeTest,
::testing::ValuesIn(kQParamArrayNEON));
#endif
-#if HAVE_SSSE3 && AOM_ARCH_X86_64
+#if HAVE_SSSE3 && AOM_ARCH_X86_64 && HAVE_X86_ASM
INSTANTIATE_TEST_SUITE_P(
SSSE3, FullPrecisionQuantizeTest,
::testing::Values(
@@ -778,7 +778,7 @@ INSTANTIATE_TEST_SUITE_P(
make_tuple(&aom_quantize_b_64x64_c, &aom_quantize_b_64x64_ssse3,
static_cast<TX_SIZE>(TX_64X64), TYPE_B, AOM_BITS_8)));
-#endif // HAVE_SSSE3 && AOM_ARCH_X86_64
+#endif // HAVE_SSSE3 && AOM_ARCH_X86_64 && HAVE_X86_ASM
#if HAVE_AVX
INSTANTIATE_TEST_SUITE_P(
diff --git a/test/sad_test.cc b/test/sad_test.cc
index 9800d2d540..2f344ae833 100644
--- a/test/sad_test.cc
+++ b/test/sad_test.cc
@@ -2129,6 +2129,7 @@ INSTANTIATE_TEST_SUITE_P(NEON_DOTPROD, SADSkipx4Test,
//------------------------------------------------------------------------------
// x86 functions
#if HAVE_SSE2
+#if HAVE_X86_ASM
const SadMxNParam sse2_tests[] = {
make_tuple(128, 128, &aom_sad128x128_sse2, -1),
make_tuple(128, 64, &aom_sad128x64_sse2, -1),
@@ -2221,7 +2222,9 @@ const SadMxNParam sse2_tests[] = {
#endif // !CONFIG_REALTIME_ONLY
};
INSTANTIATE_TEST_SUITE_P(SSE2, SADTest, ::testing::ValuesIn(sse2_tests));
+#endif // HAVE_X86_ASM
+#if HAVE_X86_ASM
const SadSkipMxNParam skip_sse2_tests[] = {
make_tuple(128, 128, &aom_sad_skip_128x128_sse2, -1),
make_tuple(128, 64, &aom_sad_skip_128x64_sse2, -1),
@@ -2289,7 +2292,9 @@ const SadSkipMxNParam skip_sse2_tests[] = {
};
INSTANTIATE_TEST_SUITE_P(SSE2, SADSkipTest,
::testing::ValuesIn(skip_sse2_tests));
+#endif // HAVE_X86_ASM
+#if HAVE_X86_ASM
const SadMxNAvgParam avg_sse2_tests[] = {
make_tuple(128, 128, &aom_sad128x128_avg_sse2, -1),
make_tuple(128, 64, &aom_sad128x64_avg_sse2, -1),
@@ -2360,7 +2365,9 @@ const SadMxNAvgParam avg_sse2_tests[] = {
#endif // !CONFIG_REALTIME_ONLY
};
INSTANTIATE_TEST_SUITE_P(SSE2, SADavgTest, ::testing::ValuesIn(avg_sse2_tests));
+#endif // HAVE_X86_ASM
+#if HAVE_X86_ASM
const SadMxNx4Param x4d_sse2_tests[] = {
make_tuple(128, 128, &aom_sad128x128x4d_sse2, -1),
make_tuple(128, 64, &aom_sad128x64x4d_sse2, -1),
@@ -2453,7 +2460,9 @@ const SadMxNx4Param x4d_sse2_tests[] = {
#endif
};
INSTANTIATE_TEST_SUITE_P(SSE2, SADx4Test, ::testing::ValuesIn(x4d_sse2_tests));
+#endif // HAVE_X86_ASM
+#if HAVE_X86_ASM
const SadSkipMxNx4Param skip_x4d_sse2_tests[] = {
make_tuple(128, 128, &aom_sad_skip_128x128x4d_sse2, -1),
make_tuple(128, 64, &aom_sad_skip_128x64x4d_sse2, -1),
@@ -2519,6 +2528,7 @@ const SadSkipMxNx4Param skip_x4d_sse2_tests[] = {
};
INSTANTIATE_TEST_SUITE_P(SSE2, SADSkipx4Test,
::testing::ValuesIn(skip_x4d_sse2_tests));
+#endif // HAVE_X86_ASM
#endif // HAVE_SSE2
#if HAVE_SSE3
diff --git a/test/subtract_test.cc b/test/subtract_test.cc
index c478210d24..9d3e059682 100644
--- a/test/subtract_test.cc
+++ b/test/subtract_test.cc
@@ -226,7 +226,7 @@ INSTANTIATE_TEST_SUITE_P(
::testing::Values(&aom_subtract_block_c),
::testing::Values(&aom_subtract_block_c)));
-#if HAVE_SSE2
+#if HAVE_SSE2 && HAVE_X86_ASM
INSTANTIATE_TEST_SUITE_P(
SSE2, AV1SubtractBlockTest,
::testing::Combine(::testing::ValuesIn(kValidBlockSize),
diff --git a/test/test_intra_pred_speed.cc b/test/test_intra_pred_speed.cc
index 80e1719951..27c86adc2f 100644
--- a/test/test_intra_pred_speed.cc
+++ b/test/test_intra_pred_speed.cc
@@ -399,6 +399,14 @@ static const char *const kSignatures[TX_SIZES_ALL][kNumAv1IntraFuncs] = {
// Defines a test case for |arch| (e.g., C, SSE2, ...) passing the predictors
// to TestIntraPred. The test name is 'arch.TestIntraPred_tx_size', e.g.,
// C.TestIntraPred.0
+// Kernels that are only implemented in x86 assembly, which is not available
+// when the x86 intrinsics are built for other targets.
+#if HAVE_X86_ASM
+#define ASM_ONLY(fn) fn
+#else
+#define ASM_ONLY(fn) nullptr
+#endif
+
#define INTRA_PRED_TEST(arch, tx_size, dc, dc_left, dc_top, dc_128, v, h, \
paeth, smooth, smooth_v, smooth_h) \
TEST(arch, DISABLED_##TestIntraPred_##tx_size) { \
@@ -430,10 +438,13 @@ INTRA_PRED_TEST(C, TX_4X16, aom_dc_predictor_4x16_c,
aom_smooth_h_predictor_4x16_c)
#endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
#if HAVE_SSE2
-INTRA_PRED_TEST(SSE2, TX_4X4, aom_dc_predictor_4x4_sse2,
- aom_dc_left_predictor_4x4_sse2, aom_dc_top_predictor_4x4_sse2,
- aom_dc_128_predictor_4x4_sse2, aom_v_predictor_4x4_sse2,
- aom_h_predictor_4x4_sse2, nullptr, nullptr, nullptr, nullptr)
+INTRA_PRED_TEST(SSE2, TX_4X4, ASM_ONLY(aom_dc_predictor_4x4_sse2),
+ ASM_ONLY(aom_dc_left_predictor_4x4_sse2),
+ ASM_ONLY(aom_dc_top_predictor_4x4_sse2),
+ ASM_ONLY(aom_dc_128_predictor_4x4_sse2),
+ ASM_ONLY(aom_v_predictor_4x4_sse2),
+ ASM_ONLY(aom_h_predictor_4x4_sse2), nullptr, nullptr, nullptr,
+ nullptr)
INTRA_PRED_TEST(SSE2, TX_4X8, aom_dc_predictor_4x8_sse2,
aom_dc_left_predictor_4x8_sse2, aom_dc_top_predictor_4x8_sse2,
aom_dc_128_predictor_4x8_sse2, aom_v_predictor_4x8_sse2,
@@ -520,10 +531,13 @@ INTRA_PRED_TEST(C, TX_8X32, aom_dc_predictor_8x32_c,
#endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
#if HAVE_SSE2
-INTRA_PRED_TEST(SSE2, TX_8X8, aom_dc_predictor_8x8_sse2,
- aom_dc_left_predictor_8x8_sse2, aom_dc_top_predictor_8x8_sse2,
- aom_dc_128_predictor_8x8_sse2, aom_v_predictor_8x8_sse2,
- aom_h_predictor_8x8_sse2, nullptr, nullptr, nullptr, nullptr)
+INTRA_PRED_TEST(SSE2, TX_8X8, ASM_ONLY(aom_dc_predictor_8x8_sse2),
+ ASM_ONLY(aom_dc_left_predictor_8x8_sse2),
+ ASM_ONLY(aom_dc_top_predictor_8x8_sse2),
+ ASM_ONLY(aom_dc_128_predictor_8x8_sse2),
+ ASM_ONLY(aom_v_predictor_8x8_sse2),
+ ASM_ONLY(aom_h_predictor_8x8_sse2), nullptr, nullptr, nullptr,
+ nullptr)
INTRA_PRED_TEST(SSE2, TX_8X4, aom_dc_predictor_8x4_sse2,
aom_dc_left_predictor_8x4_sse2, aom_dc_top_predictor_8x4_sse2,
aom_dc_128_predictor_8x4_sse2, aom_v_predictor_8x4_sse2,
@@ -633,11 +647,13 @@ INTRA_PRED_TEST(C, TX_16X64, aom_dc_predictor_16x64_c,
#endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
#if HAVE_SSE2
-INTRA_PRED_TEST(SSE2, TX_16X16, aom_dc_predictor_16x16_sse2,
- aom_dc_left_predictor_16x16_sse2,
- aom_dc_top_predictor_16x16_sse2,
- aom_dc_128_predictor_16x16_sse2, aom_v_predictor_16x16_sse2,
- aom_h_predictor_16x16_sse2, nullptr, nullptr, nullptr, nullptr)
+INTRA_PRED_TEST(SSE2, TX_16X16, ASM_ONLY(aom_dc_predictor_16x16_sse2),
+ ASM_ONLY(aom_dc_left_predictor_16x16_sse2),
+ ASM_ONLY(aom_dc_top_predictor_16x16_sse2),
+ ASM_ONLY(aom_dc_128_predictor_16x16_sse2),
+ ASM_ONLY(aom_v_predictor_16x16_sse2),
+ ASM_ONLY(aom_h_predictor_16x16_sse2), nullptr, nullptr, nullptr,
+ nullptr)
INTRA_PRED_TEST(SSE2, TX_16X8, aom_dc_predictor_16x8_sse2,
aom_dc_left_predictor_16x8_sse2, aom_dc_top_predictor_16x8_sse2,
aom_dc_128_predictor_16x8_sse2, aom_v_predictor_16x8_sse2,
@@ -781,11 +797,13 @@ INTRA_PRED_TEST(C, TX_32X8, aom_dc_predictor_32x8_c,
#endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
#if HAVE_SSE2
-INTRA_PRED_TEST(SSE2, TX_32X32, aom_dc_predictor_32x32_sse2,
- aom_dc_left_predictor_32x32_sse2,
- aom_dc_top_predictor_32x32_sse2,
- aom_dc_128_predictor_32x32_sse2, aom_v_predictor_32x32_sse2,
- aom_h_predictor_32x32_sse2, nullptr, nullptr, nullptr, nullptr)
+INTRA_PRED_TEST(SSE2, TX_32X32, ASM_ONLY(aom_dc_predictor_32x32_sse2),
+ ASM_ONLY(aom_dc_left_predictor_32x32_sse2),
+ ASM_ONLY(aom_dc_top_predictor_32x32_sse2),
+ ASM_ONLY(aom_dc_128_predictor_32x32_sse2),
+ ASM_ONLY(aom_v_predictor_32x32_sse2),
+ ASM_ONLY(aom_h_predictor_32x32_sse2), nullptr, nullptr, nullptr,
+ nullptr)
INTRA_PRED_TEST(SSE2, TX_32X16, aom_dc_predictor_32x16_sse2,
aom_dc_left_predictor_32x16_sse2,
aom_dc_top_predictor_32x16_sse2,
@@ -1335,11 +1353,11 @@ HIGHBD_INTRA_PRED_TEST(
#endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
#if HAVE_SSE2
-HIGHBD_INTRA_PRED_TEST(SSE2, TX_4X4, aom_highbd_dc_predictor_4x4_sse2,
+HIGHBD_INTRA_PRED_TEST(SSE2, TX_4X4, ASM_ONLY(aom_highbd_dc_predictor_4x4_sse2),
aom_highbd_dc_left_predictor_4x4_sse2,
aom_highbd_dc_top_predictor_4x4_sse2,
aom_highbd_dc_128_predictor_4x4_sse2,
- aom_highbd_v_predictor_4x4_sse2,
+ ASM_ONLY(aom_highbd_v_predictor_4x4_sse2),
aom_highbd_h_predictor_4x4_sse2, nullptr, nullptr,
nullptr, nullptr)
@@ -1422,11 +1440,11 @@ HIGHBD_INTRA_PRED_TEST(
#endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
#if HAVE_SSE2
-HIGHBD_INTRA_PRED_TEST(SSE2, TX_8X8, aom_highbd_dc_predictor_8x8_sse2,
+HIGHBD_INTRA_PRED_TEST(SSE2, TX_8X8, ASM_ONLY(aom_highbd_dc_predictor_8x8_sse2),
aom_highbd_dc_left_predictor_8x8_sse2,
aom_highbd_dc_top_predictor_8x8_sse2,
aom_highbd_dc_128_predictor_8x8_sse2,
- aom_highbd_v_predictor_8x8_sse2,
+ ASM_ONLY(aom_highbd_v_predictor_8x8_sse2),
aom_highbd_h_predictor_8x8_sse2, nullptr, nullptr,
nullptr, nullptr)
HIGHBD_INTRA_PRED_TEST(SSE2, TX_8X4, aom_highbd_dc_predictor_8x4_sse2,
@@ -1537,11 +1555,12 @@ HIGHBD_INTRA_PRED_TEST(
#endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
#if HAVE_SSE2
-HIGHBD_INTRA_PRED_TEST(SSE2, TX_16X16, aom_highbd_dc_predictor_16x16_sse2,
+HIGHBD_INTRA_PRED_TEST(SSE2, TX_16X16,
+ ASM_ONLY(aom_highbd_dc_predictor_16x16_sse2),
aom_highbd_dc_left_predictor_16x16_sse2,
aom_highbd_dc_top_predictor_16x16_sse2,
aom_highbd_dc_128_predictor_16x16_sse2,
- aom_highbd_v_predictor_16x16_sse2,
+ ASM_ONLY(aom_highbd_v_predictor_16x16_sse2),
aom_highbd_h_predictor_16x16_sse2, nullptr, nullptr,
nullptr, nullptr)
HIGHBD_INTRA_PRED_TEST(SSE2, TX_16X8, aom_highbd_dc_predictor_16x8_sse2,
@@ -1666,11 +1685,12 @@ HIGHBD_INTRA_PRED_TEST(
#endif // !CONFIG_REALTIME_ONLY || CONFIG_AV1_DECODER
#if HAVE_SSE2
-HIGHBD_INTRA_PRED_TEST(SSE2, TX_32X32, aom_highbd_dc_predictor_32x32_sse2,
+HIGHBD_INTRA_PRED_TEST(SSE2, TX_32X32,
+ ASM_ONLY(aom_highbd_dc_predictor_32x32_sse2),
aom_highbd_dc_left_predictor_32x32_sse2,
aom_highbd_dc_top_predictor_32x32_sse2,
aom_highbd_dc_128_predictor_32x32_sse2,
- aom_highbd_v_predictor_32x32_sse2,
+ ASM_ONLY(aom_highbd_v_predictor_32x32_sse2),
aom_highbd_h_predictor_32x32_sse2, nullptr, nullptr,
nullptr, nullptr)
HIGHBD_INTRA_PRED_TEST(SSE2, TX_32X16, aom_highbd_dc_predictor_32x16_sse2,
diff --git a/test/variance_test.cc b/test/variance_test.cc
index 43ff6f3b8d..13a3868fe1 100644
--- a/test/variance_test.cc
+++ b/test/variance_test.cc
@@ -2506,6 +2506,7 @@ INSTANTIATE_TEST_SUITE_P(
MseHBDWxHParams(2, 2, &aom_mse_wxh_16bit_highbd_sse2,
10)));
+#if HAVE_X86_ASM
INSTANTIATE_TEST_SUITE_P(
SSE2, AvxHBDMseTest,
::testing::Values(MseParams(4, 4, &aom_highbd_12_mse16x16_sse2, 12),
@@ -2514,6 +2515,7 @@ INSTANTIATE_TEST_SUITE_P(
MseParams(3, 3, &aom_highbd_10_mse8x8_sse2, 10),
MseParams(4, 4, &aom_highbd_8_mse16x16_sse2, 8),
MseParams(3, 3, &aom_highbd_8_mse8x8_sse2, 8)));
+#endif // HAVE_X86_ASM
#endif // HAVE_SSE2
#if HAVE_SSE4_1
INSTANTIATE_TEST_SUITE_P(
@@ -2546,6 +2548,7 @@ INSTANTIATE_TEST_SUITE_P(
::testing::Values(MseParams(4, 4, &aom_highbd_10_mse16x16_avx2, 10)));
#endif // HAVE_AVX2
+#if HAVE_X86_ASM
const VarianceParams kArrayHBDVariance_sse2[] = {
VarianceParams(7, 7, &aom_highbd_12_variance128x128_sse2, 12),
VarianceParams(7, 6, &aom_highbd_12_variance128x64_sse2, 12),
@@ -2609,6 +2612,7 @@ const VarianceParams kArrayHBDVariance_sse2[] = {
};
INSTANTIATE_TEST_SUITE_P(SSE2, AvxHBDVarianceTest,
::testing::ValuesIn(kArrayHBDVariance_sse2));
+#endif // HAVE_X86_ASM
#if HAVE_AVX2
@@ -2665,6 +2669,7 @@ INSTANTIATE_TEST_SUITE_P(AVX2, AvxHBDSubpelVarianceTest,
::testing::ValuesIn(kArrayHBDSubpelVariance_avx2));
#endif // HAVE_AVX2
+#if HAVE_X86_ASM
const SubpelVarianceParams kArrayHBDSubpelVariance_sse2[] = {
SubpelVarianceParams(7, 7, &aom_highbd_12_sub_pixel_variance128x128_sse2, 12),
SubpelVarianceParams(7, 6, &aom_highbd_12_sub_pixel_variance128x64_sse2, 12),
@@ -2731,7 +2736,9 @@ const SubpelVarianceParams kArrayHBDSubpelVariance_sse2[] = {
};
INSTANTIATE_TEST_SUITE_P(SSE2, AvxHBDSubpelVarianceTest,
::testing::ValuesIn(kArrayHBDSubpelVariance_sse2));
+#endif // HAVE_X86_ASM
+#if HAVE_X86_ASM
const SubpelAvgVarianceParams kArrayHBDSubpelAvgVariance_sse2[] = {
SubpelAvgVarianceParams(6, 6, &aom_highbd_12_sub_pixel_avg_variance64x64_sse2,
12),
@@ -2842,10 +2849,12 @@ const SubpelAvgVarianceParams kArrayHBDSubpelAvgVariance_sse2[] = {
INSTANTIATE_TEST_SUITE_P(SSE2, AvxHBDSubpelAvgVarianceTest,
::testing::ValuesIn(kArrayHBDSubpelAvgVariance_sse2));
+#endif // HAVE_X86_ASM
#endif // HAVE_SSE2
#endif // CONFIG_AV1_HIGHBITDEPTH
#if HAVE_SSSE3
+#if HAVE_X86_ASM
const SubpelVarianceParams kArraySubpelVariance_ssse3[] = {
SubpelVarianceParams(7, 7, &aom_sub_pixel_variance128x128_ssse3, 0),
SubpelVarianceParams(7, 6, &aom_sub_pixel_variance128x64_ssse3, 0),
@@ -2874,7 +2883,9 @@ const SubpelVarianceParams kArraySubpelVariance_ssse3[] = {
};
INSTANTIATE_TEST_SUITE_P(SSSE3, AvxSubpelVarianceTest,
::testing::ValuesIn(kArraySubpelVariance_ssse3));
+#endif // HAVE_X86_ASM
+#if HAVE_X86_ASM
const SubpelAvgVarianceParams kArraySubpelAvgVariance_ssse3[] = {
SubpelAvgVarianceParams(7, 7, &aom_sub_pixel_avg_variance128x128_ssse3, 0),
SubpelAvgVarianceParams(7, 6, &aom_sub_pixel_avg_variance128x64_ssse3, 0),
@@ -2903,6 +2914,7 @@ const SubpelAvgVarianceParams kArraySubpelAvgVariance_ssse3[] = {
};
INSTANTIATE_TEST_SUITE_P(SSSE3, AvxSubpelAvgVarianceTest,
::testing::ValuesIn(kArraySubpelAvgVariance_ssse3));
+#endif // HAVE_X86_ASM
#endif // HAVE_SSSE3
#if HAVE_SSE4_1