Merge "Add SSE2 versions of 128x128 vpx_sad*" into nextgenv2
diff --git a/test/sad_test.cc b/test/sad_test.cc
index 1985e18..ab723e7 100644
--- a/test/sad_test.cc
+++ b/test/sad_test.cc
@@ -763,6 +763,11 @@
#if HAVE_SSE2
#if CONFIG_USE_X86INC
const SadMxNParam sse2_tests[] = {
+#if CONFIG_VP10 && CONFIG_EXT_PARTITION
+ make_tuple(128, 128, &vpx_sad128x128_sse2, -1),
+ make_tuple(128, 64, &vpx_sad128x64_sse2, -1),
+ make_tuple(64, 128, &vpx_sad64x128_sse2, -1),
+#endif // CONFIG_VP10 && CONFIG_EXT_PARTITION
make_tuple(64, 64, &vpx_sad64x64_sse2, -1),
make_tuple(64, 32, &vpx_sad64x32_sse2, -1),
make_tuple(32, 64, &vpx_sad32x64_sse2, -1),
@@ -815,6 +820,11 @@
INSTANTIATE_TEST_CASE_P(SSE2, SADTest, ::testing::ValuesIn(sse2_tests));
const SadMxNAvgParam avg_sse2_tests[] = {
+#if CONFIG_VP10 && CONFIG_EXT_PARTITION
+ make_tuple(128, 128, &vpx_sad128x128_avg_sse2, -1),
+ make_tuple(128, 64, &vpx_sad128x64_avg_sse2, -1),
+ make_tuple(64, 128, &vpx_sad64x128_avg_sse2, -1),
+#endif // CONFIG_VP10 && CONFIG_EXT_PARTITION
make_tuple(64, 64, &vpx_sad64x64_avg_sse2, -1),
make_tuple(64, 32, &vpx_sad64x32_avg_sse2, -1),
make_tuple(32, 64, &vpx_sad32x64_avg_sse2, -1),
@@ -867,6 +877,11 @@
INSTANTIATE_TEST_CASE_P(SSE2, SADavgTest, ::testing::ValuesIn(avg_sse2_tests));
const SadMxNx4Param x4d_sse2_tests[] = {
+#if CONFIG_VP10 && CONFIG_EXT_PARTITION
+ make_tuple(128, 128, &vpx_sad128x128x4d_sse2, -1),
+ make_tuple(128, 64, &vpx_sad128x64x4d_sse2, -1),
+ make_tuple(64, 128, &vpx_sad64x128x4d_sse2, -1),
+#endif // CONFIG_VP10 && CONFIG_EXT_PARTITION
make_tuple(64, 64, &vpx_sad64x64x4d_sse2, -1),
make_tuple(64, 32, &vpx_sad64x32x4d_sse2, -1),
make_tuple(32, 64, &vpx_sad32x64x4d_sse2, -1),
diff --git a/vpx_dsp/vpx_dsp_rtcd_defs.pl b/vpx_dsp/vpx_dsp_rtcd_defs.pl
index 779c41a..6e566c8 100644
--- a/vpx_dsp/vpx_dsp_rtcd_defs.pl
+++ b/vpx_dsp/vpx_dsp_rtcd_defs.pl
@@ -1029,33 +1029,39 @@
add_proto qw/unsigned int/, "vpx_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";
}
-specialize qw/vpx_sad64x64 avx2 neon msa/, "$sse2_x86inc";
-specialize qw/vpx_sad64x32 avx2 msa/, "$sse2_x86inc";
-specialize qw/vpx_sad32x64 avx2 msa/, "$sse2_x86inc";
-specialize qw/vpx_sad32x32 avx2 neon msa/, "$sse2_x86inc";
-specialize qw/vpx_sad32x16 avx2 msa/, "$sse2_x86inc";
-specialize qw/vpx_sad16x32 msa/, "$sse2_x86inc";
-specialize qw/vpx_sad16x16 mmx media neon msa/, "$sse2_x86inc";
-specialize qw/vpx_sad16x8 mmx neon msa/, "$sse2_x86inc";
-specialize qw/vpx_sad8x16 mmx neon msa/, "$sse2_x86inc";
-specialize qw/vpx_sad8x8 mmx neon msa/, "$sse2_x86inc";
-specialize qw/vpx_sad8x4 msa/, "$sse2_x86inc";
-specialize qw/vpx_sad4x8 msa/, "$sse2_x86inc";
-specialize qw/vpx_sad4x4 mmx neon msa/, "$sse2_x86inc";
+specialize qw/vpx_sad128x128 /, "$sse2_x86inc";
+specialize qw/vpx_sad128x64 /, "$sse2_x86inc";
+specialize qw/vpx_sad64x128 /, "$sse2_x86inc";
+specialize qw/vpx_sad64x64 avx2 neon msa/, "$sse2_x86inc";
+specialize qw/vpx_sad64x32 avx2 msa/, "$sse2_x86inc";
+specialize qw/vpx_sad32x64 avx2 msa/, "$sse2_x86inc";
+specialize qw/vpx_sad32x32 avx2 neon msa/, "$sse2_x86inc";
+specialize qw/vpx_sad32x16 avx2 msa/, "$sse2_x86inc";
+specialize qw/vpx_sad16x32 msa/, "$sse2_x86inc";
+specialize qw/vpx_sad16x16 mmx media neon msa/, "$sse2_x86inc";
+specialize qw/vpx_sad16x8 mmx neon msa/, "$sse2_x86inc";
+specialize qw/vpx_sad8x16 mmx neon msa/, "$sse2_x86inc";
+specialize qw/vpx_sad8x8 mmx neon msa/, "$sse2_x86inc";
+specialize qw/vpx_sad8x4 msa/, "$sse2_x86inc";
+specialize qw/vpx_sad4x8 msa/, "$sse2_x86inc";
+specialize qw/vpx_sad4x4 mmx neon msa/, "$sse2_x86inc";
-specialize qw/vpx_sad64x64_avg avx2 msa/, "$sse2_x86inc";
-specialize qw/vpx_sad64x32_avg avx2 msa/, "$sse2_x86inc";
-specialize qw/vpx_sad32x64_avg avx2 msa/, "$sse2_x86inc";
-specialize qw/vpx_sad32x32_avg avx2 msa/, "$sse2_x86inc";
-specialize qw/vpx_sad32x16_avg avx2 msa/, "$sse2_x86inc";
-specialize qw/vpx_sad16x32_avg msa/, "$sse2_x86inc";
-specialize qw/vpx_sad16x16_avg msa/, "$sse2_x86inc";
-specialize qw/vpx_sad16x8_avg msa/, "$sse2_x86inc";
-specialize qw/vpx_sad8x16_avg msa/, "$sse2_x86inc";
-specialize qw/vpx_sad8x8_avg msa/, "$sse2_x86inc";
-specialize qw/vpx_sad8x4_avg msa/, "$sse2_x86inc";
-specialize qw/vpx_sad4x8_avg msa/, "$sse2_x86inc";
-specialize qw/vpx_sad4x4_avg msa/, "$sse2_x86inc";
+specialize qw/vpx_sad128x128_avg /, "$sse2_x86inc";
+specialize qw/vpx_sad128x64_avg /, "$sse2_x86inc";
+specialize qw/vpx_sad64x128_avg /, "$sse2_x86inc";
+specialize qw/vpx_sad64x64_avg avx2 msa/, "$sse2_x86inc";
+specialize qw/vpx_sad64x32_avg avx2 msa/, "$sse2_x86inc";
+specialize qw/vpx_sad32x64_avg avx2 msa/, "$sse2_x86inc";
+specialize qw/vpx_sad32x32_avg avx2 msa/, "$sse2_x86inc";
+specialize qw/vpx_sad32x16_avg avx2 msa/, "$sse2_x86inc";
+specialize qw/vpx_sad16x32_avg msa/, "$sse2_x86inc";
+specialize qw/vpx_sad16x16_avg msa/, "$sse2_x86inc";
+specialize qw/vpx_sad16x8_avg msa/, "$sse2_x86inc";
+specialize qw/vpx_sad8x16_avg msa/, "$sse2_x86inc";
+specialize qw/vpx_sad8x8_avg msa/, "$sse2_x86inc";
+specialize qw/vpx_sad8x4_avg msa/, "$sse2_x86inc";
+specialize qw/vpx_sad4x8_avg msa/, "$sse2_x86inc";
+specialize qw/vpx_sad4x4_avg msa/, "$sse2_x86inc";
if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") eq "yes") {
foreach (@block_sizes) {
@@ -1149,19 +1155,23 @@
($w, $h) = @$_;
add_proto qw/void/, "vpx_sad${w}x${h}x4d", "const uint8_t *src_ptr, int src_stride, const uint8_t * const ref_ptr[], int ref_stride, uint32_t *sad_array";
}
-specialize qw/vpx_sad64x64x4d avx2 neon msa/, "$sse2_x86inc";
-specialize qw/vpx_sad64x32x4d msa/, "$sse2_x86inc";
-specialize qw/vpx_sad32x64x4d msa/, "$sse2_x86inc";
-specialize qw/vpx_sad32x32x4d avx2 neon msa/, "$sse2_x86inc";
-specialize qw/vpx_sad32x16x4d msa/, "$sse2_x86inc";
-specialize qw/vpx_sad16x32x4d msa/, "$sse2_x86inc";
-specialize qw/vpx_sad16x16x4d neon msa/, "$sse2_x86inc";
-specialize qw/vpx_sad16x8x4d msa/, "$sse2_x86inc";
-specialize qw/vpx_sad8x16x4d msa/, "$sse2_x86inc";
-specialize qw/vpx_sad8x8x4d msa/, "$sse2_x86inc";
-specialize qw/vpx_sad8x4x4d msa/, "$sse2_x86inc";
-specialize qw/vpx_sad4x8x4d msa/, "$sse2_x86inc";
-specialize qw/vpx_sad4x4x4d msa/, "$sse2_x86inc";
+
+specialize qw/vpx_sad128x128x4d /, "$sse2_x86inc";
+specialize qw/vpx_sad128x64x4d /, "$sse2_x86inc";
+specialize qw/vpx_sad64x128x4d /, "$sse2_x86inc";
+specialize qw/vpx_sad64x64x4d avx2 neon msa/, "$sse2_x86inc";
+specialize qw/vpx_sad64x32x4d msa/, "$sse2_x86inc";
+specialize qw/vpx_sad32x64x4d msa/, "$sse2_x86inc";
+specialize qw/vpx_sad32x32x4d avx2 neon msa/, "$sse2_x86inc";
+specialize qw/vpx_sad32x16x4d msa/, "$sse2_x86inc";
+specialize qw/vpx_sad16x32x4d msa/, "$sse2_x86inc";
+specialize qw/vpx_sad16x16x4d neon msa/, "$sse2_x86inc";
+specialize qw/vpx_sad16x8x4d msa/, "$sse2_x86inc";
+specialize qw/vpx_sad8x16x4d msa/, "$sse2_x86inc";
+specialize qw/vpx_sad8x8x4d msa/, "$sse2_x86inc";
+specialize qw/vpx_sad8x4x4d msa/, "$sse2_x86inc";
+specialize qw/vpx_sad4x8x4d msa/, "$sse2_x86inc";
+specialize qw/vpx_sad4x4x4d msa/, "$sse2_x86inc";
if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") eq "yes") {
#
diff --git a/vpx_dsp/x86/sad4d_sse2.asm b/vpx_dsp/x86/sad4d_sse2.asm
index 3f6e55c..6d49869 100644
--- a/vpx_dsp/x86/sad4d_sse2.asm
+++ b/vpx_dsp/x86/sad4d_sse2.asm
@@ -175,6 +175,12 @@
PROCESS_32x2x4 0, %4, %5, %4 + 32, %5 + 32, %6
%endmacro
+; PROCESS_128x2x4 first, off_{first,second}_{src,ref}, advance_at_end
+%macro PROCESS_128x2x4 5-6 0
+ PROCESS_64x2x4 %1, %2, %3, %2 + 64, %3 + 64
+ PROCESS_64x2x4 0, %4, %5, %4 + 64, %5 + 64, %6
+%endmacro
+
; void vpx_sadNxNx4d_sse2(uint8_t *src, int src_stride,
; uint8_t *ref[4], int ref_stride,
; uint32_t res[4]);
@@ -224,6 +230,11 @@
%endmacro
INIT_XMM sse2
+%if CONFIG_EXT_PARTITION
+SADNXN4D 128, 128
+SADNXN4D 128, 64
+SADNXN4D 64, 128
+%endif
SADNXN4D 64, 64
SADNXN4D 64, 32
SADNXN4D 32, 64
diff --git a/vpx_dsp/x86/sad_sse2.asm b/vpx_dsp/x86/sad_sse2.asm
index 1ec906c..edef2a7 100644
--- a/vpx_dsp/x86/sad_sse2.asm
+++ b/vpx_dsp/x86/sad_sse2.asm
@@ -44,6 +44,76 @@
%endif ; %3 == 7
%endmacro
+%if CONFIG_EXT_PARTITION
+; unsigned int vpx_sad128x128_sse2(uint8_t *src, int src_stride,
+; uint8_t *ref, int ref_stride);
+%macro SAD128XN 1-2 0
+ SAD_FN 128, %1, 5, %2
+ mov n_rowsd, %1
+ pxor m0, m0
+
+.loop:
+ movu m1, [refq]
+ movu m2, [refq+16]
+ movu m3, [refq+32]
+ movu m4, [refq+48]
+%if %2 == 1
+ pavgb m1, [second_predq+mmsize*0]
+ pavgb m2, [second_predq+mmsize*1]
+ pavgb m3, [second_predq+mmsize*2]
+ pavgb m4, [second_predq+mmsize*3]
+%endif
+ psadbw m1, [srcq]
+ psadbw m2, [srcq+16]
+ psadbw m3, [srcq+32]
+ psadbw m4, [srcq+48]
+
+ paddd m1, m2
+ paddd m3, m4
+ paddd m0, m1
+ paddd m0, m3
+
+ movu m1, [refq+64]
+ movu m2, [refq+80]
+ movu m3, [refq+96]
+ movu m4, [refq+112]
+%if %2 == 1
+ pavgb m1, [second_predq+mmsize*4]
+ pavgb m2, [second_predq+mmsize*5]
+ pavgb m3, [second_predq+mmsize*6]
+ pavgb m4, [second_predq+mmsize*7]
+ lea second_predq, [second_predq+mmsize*8]
+%endif
+ psadbw m1, [srcq+64]
+ psadbw m2, [srcq+80]
+ psadbw m3, [srcq+96]
+ psadbw m4, [srcq+112]
+
+ add refq, ref_strideq
+ add srcq, src_strideq
+
+ paddd m1, m2
+ paddd m3, m4
+ paddd m0, m1
+ paddd m0, m3
+
+ sub n_rowsd, 1
+ jg .loop
+
+ movhlps m1, m0
+ paddd m0, m1
+ movd eax, m0
+ RET
+%endmacro
+
+INIT_XMM sse2
+SAD128XN 128 ; sad128x128_sse2
+SAD128XN 128, 1 ; sad128x128_avg_sse2
+SAD128XN 64 ; sad128x64_sse2
+SAD128XN 64, 1 ; sad128x64_avg_sse2
+%endif
+
+
; unsigned int vpx_sad64x64_sse2(uint8_t *src, int src_stride,
; uint8_t *ref, int ref_stride);
%macro SAD64XN 1-2 0
@@ -82,6 +152,10 @@
%endmacro
INIT_XMM sse2
+%if CONFIG_EXT_PARTITION
+SAD64XN 128 ; sad64x128_sse2
+SAD64XN 128, 1 ; sad64x128_avg_sse2
+%endif
SAD64XN 64 ; sad64x64_sse2
SAD64XN 32 ; sad64x32_sse2
SAD64XN 64, 1 ; sad64x64_avg_sse2