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