Turn on sse2 simd optimization Change-Id: Ia72e71a61cc48b97ef9596aaa6526381f9364f1a
diff --git a/av1/common/av1_rtcd_defs.pl b/av1/common/av1_rtcd_defs.pl index 64c052e..22dc89a 100755 --- a/av1/common/av1_rtcd_defs.pl +++ b/av1/common/av1_rtcd_defs.pl
@@ -335,6 +335,9 @@ add_proto qw/void av1_fwd_idtx/, "const int16_t *src_diff, tran_low_t *coeff, int stride, int bsx, int bsy, TX_TYPE tx_type"; #fwd txfm + add_proto qw/void av1_lowbd_fwd_txfm/, "const int16_t *src_diff, tran_low_t *coeff, int diff_stride, TxfmParam *txfm_param"; + specialize qw/av1_lowbd_fwd_txfm sse2/; + add_proto qw/void av1_fwd_txfm2d_4x8/, "const int16_t *input, int32_t *output, int stride, TX_TYPE tx_type, int bd"; add_proto qw/void av1_fwd_txfm2d_8x4/, "const int16_t *input, int32_t *output, int stride, TX_TYPE tx_type, int bd"; add_proto qw/void av1_fwd_txfm2d_8x16/, "const int16_t *input, int32_t *output, int stride, TX_TYPE tx_type, int bd";
diff --git a/av1/common/x86/av1_txfm_sse2.h b/av1/common/x86/av1_txfm_sse2.h index e373faf..77cd32a 100644 --- a/av1/common/x86/av1_txfm_sse2.h +++ b/av1/common/x86/av1_txfm_sse2.h
@@ -160,26 +160,26 @@ } } -void av1_fwd_txfm2d_8x8_sse2(const int16_t *input, int32_t *output, int stride, - TX_TYPE tx_type, int bd); +void av1_lowbd_fwd_txfm2d_8x8_sse2(const int16_t *input, int32_t *output, + int stride, TX_TYPE tx_type, int bd); -void av1_fwd_txfm2d_8x16_sse2(const int16_t *input, int32_t *output, int stride, - TX_TYPE tx_type, int bd); +void av1_lowbd_fwd_txfm2d_8x16_sse2(const int16_t *input, int32_t *output, + int stride, TX_TYPE tx_type, int bd); -void av1_fwd_txfm2d_16x8_sse2(const int16_t *input, int32_t *output, int stride, - TX_TYPE tx_type, int bd); +void av1_lowbd_fwd_txfm2d_16x8_sse2(const int16_t *input, int32_t *output, + int stride, TX_TYPE tx_type, int bd); -void av1_fwd_txfm2d_16x16_sse2(const int16_t *input, int32_t *output, - int stride, TX_TYPE tx_type, int bd); +void av1_lowbd_fwd_txfm2d_16x16_sse2(const int16_t *input, int32_t *output, + int stride, TX_TYPE tx_type, int bd); -void av1_fwd_txfm2d_16x32_sse2(const int16_t *input, int32_t *output, - int stride, TX_TYPE tx_type, int bd); +void av1_lowbd_fwd_txfm2d_16x32_sse2(const int16_t *input, int32_t *output, + int stride, TX_TYPE tx_type, int bd); -void av1_fwd_txfm2d_32x16_sse2(const int16_t *input, int32_t *output, - int stride, TX_TYPE tx_type, int bd); +void av1_lowbd_fwd_txfm2d_32x16_sse2(const int16_t *input, int32_t *output, + int stride, TX_TYPE tx_type, int bd); -void av1_fwd_txfm2d_32x32_sse2(const int16_t *input, int32_t *output, - int stride, TX_TYPE tx_type, int bd); +void av1_lowbd_fwd_txfm2d_32x32_sse2(const int16_t *input, int32_t *output, + int stride, TX_TYPE tx_type, int bd); typedef void (*transform_1d_sse2)(const __m128i *input, __m128i *output, int8_t cos_bit);
diff --git a/av1/encoder/encodemb.c b/av1/encoder/encodemb.c index 62a3f54..fa397f6 100644 --- a/av1/encoder/encodemb.c +++ b/av1/encoder/encodemb.c
@@ -499,7 +499,7 @@ txfm_param.bd = xd->bd; txfm_param.is_hbd = get_bitdepth_data_path_index(xd); - av1_highbd_fwd_txfm(src_diff, coeff, diff_stride, &txfm_param); + av1_fwd_txfm(src_diff, coeff, diff_stride, &txfm_param); if (xform_quant_idx != AV1_XFORM_QUANT_SKIP_QUANT) { const int n_coeffs = av1_get_max_eob(tx_size);
diff --git a/av1/encoder/hybrid_fwd_txfm.c b/av1/encoder/hybrid_fwd_txfm.c index befb53f..b8c33a7 100644 --- a/av1/encoder/hybrid_fwd_txfm.c +++ b/av1/encoder/hybrid_fwd_txfm.c
@@ -535,62 +535,15 @@ void av1_fwd_txfm(const int16_t *src_diff, tran_low_t *coeff, int diff_stride, TxfmParam *txfm_param) { - assert(av1_ext_tx_used[txfm_param->tx_set_type][txfm_param->tx_type]); - const TX_SIZE tx_size = txfm_param->tx_size; - switch (tx_size) { -#if CONFIG_TX64X64 - case TX_64X64: - fwd_txfm_64x64(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_32X64: - fwd_txfm_32x64(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_64X32: - fwd_txfm_64x32(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_16X64: - fwd_txfm_16x64(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_64X16: - fwd_txfm_64x16(src_diff, coeff, diff_stride, txfm_param); - break; -#endif // CONFIG_TX64X64 - case TX_32X32: - fwd_txfm_32x32(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_16X16: - fwd_txfm_16x16(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_8X8: fwd_txfm_8x8(src_diff, coeff, diff_stride, txfm_param); break; - case TX_4X8: fwd_txfm_4x8(src_diff, coeff, diff_stride, txfm_param); break; - case TX_8X4: fwd_txfm_8x4(src_diff, coeff, diff_stride, txfm_param); break; - case TX_8X16: - fwd_txfm_8x16(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_16X8: - fwd_txfm_16x8(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_16X32: - fwd_txfm_16x32(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_32X16: - fwd_txfm_32x16(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_4X4: fwd_txfm_4x4(src_diff, coeff, diff_stride, txfm_param); break; - case TX_4X16: - fwd_txfm_4x16(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_16X4: - fwd_txfm_16x4(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_8X32: - fwd_txfm_8x32(src_diff, coeff, diff_stride, txfm_param); - break; - case TX_32X8: - fwd_txfm_32x8(src_diff, coeff, diff_stride, txfm_param); - break; - default: assert(0); break; - } + if (txfm_param->bd == 8) + av1_lowbd_fwd_txfm(src_diff, coeff, diff_stride, txfm_param); + else + av1_highbd_fwd_txfm(src_diff, coeff, diff_stride, txfm_param); +} + +void av1_lowbd_fwd_txfm_c(const int16_t *src_diff, tran_low_t *coeff, + int diff_stride, TxfmParam *txfm_param) { + av1_highbd_fwd_txfm(src_diff, coeff, diff_stride, txfm_param); } void av1_highbd_fwd_txfm(const int16_t *src_diff, tran_low_t *coeff,
diff --git a/av1/encoder/x86/av1_fwd_txfm_sse2.c b/av1/encoder/x86/av1_fwd_txfm_sse2.c index 520bf85..f76af9b 100644 --- a/av1/encoder/x86/av1_fwd_txfm_sse2.c +++ b/av1/encoder/x86/av1_fwd_txfm_sse2.c
@@ -1672,8 +1672,8 @@ { NULL, NULL }, // H_FLIPADST }; -void av1_fwd_txfm2d_8x8_sse2(const int16_t *input, int32_t *output, int stride, - TX_TYPE tx_type, int bd) { +void av1_lowbd_fwd_txfm2d_8x8_sse2(const int16_t *input, int32_t *output, + int stride, TX_TYPE tx_type, int bd) { (void)stride; (void)bd; __m128i buf[8]; @@ -1708,8 +1708,8 @@ store_buffer_16bit_to_32bit_8x8(buf, output, buf_size); } -void av1_fwd_txfm2d_8x16_sse2(const int16_t *input, int32_t *output, int stride, - TX_TYPE tx_type, int bd) { +void av1_lowbd_fwd_txfm2d_8x16_sse2(const int16_t *input, int32_t *output, + int stride, TX_TYPE tx_type, int bd) { (void)bd; __m128i buf0[16], buf1[16]; const int8_t *shift = fwd_txfm_shift_ls[TX_8X16]; @@ -1751,8 +1751,8 @@ } } -void av1_fwd_txfm2d_16x8_sse2(const int16_t *input, int32_t *output, int stride, - TX_TYPE tx_type, int bd) { +void av1_lowbd_fwd_txfm2d_16x8_sse2(const int16_t *input, int32_t *output, + int stride, TX_TYPE tx_type, int bd) { (void)bd; __m128i buf0[16], buf1[16]; const int8_t *shift = fwd_txfm_shift_ls[TX_16X8]; @@ -1795,8 +1795,8 @@ store_rect_buffer_16bit_to_32bit_8x8(buf + 8, output + 8, width); } -void av1_fwd_txfm2d_16x16_sse2(const int16_t *input, int32_t *output, - int stride, TX_TYPE tx_type, int bd) { +void av1_lowbd_fwd_txfm2d_16x16_sse2(const int16_t *input, int32_t *output, + int stride, TX_TYPE tx_type, int bd) { (void)bd; __m128i buf0[16], buf1[32]; const int8_t *shift = fwd_txfm_shift_ls[TX_16X16]; @@ -1842,8 +1842,8 @@ } } -void av1_fwd_txfm2d_16x32_sse2(const int16_t *input, int32_t *output, - int stride, TX_TYPE tx_type, int bd) { +void av1_lowbd_fwd_txfm2d_16x32_sse2(const int16_t *input, int32_t *output, + int stride, TX_TYPE tx_type, int bd) { (void)bd; __m128i buf0[32], buf1[64]; const int8_t *shift = fwd_txfm_shift_ls[TX_16X32]; @@ -1896,8 +1896,8 @@ } } -void av1_fwd_txfm2d_32x16_sse2(const int16_t *input, int32_t *output, - int stride, TX_TYPE tx_type, int bd) { +void av1_lowbd_fwd_txfm2d_32x16_sse2(const int16_t *input, int32_t *output, + int stride, TX_TYPE tx_type, int bd) { (void)bd; __m128i buf0[16], buf1[64]; const int8_t *shift = fwd_txfm_shift_ls[TX_32X16]; @@ -1954,8 +1954,8 @@ } } -void av1_fwd_txfm2d_32x32_sse2(const int16_t *input, int32_t *output, - int stride, TX_TYPE tx_type, int bd) { +void av1_lowbd_fwd_txfm2d_32x32_sse2(const int16_t *input, int32_t *output, + int stride, TX_TYPE tx_type, int bd) { (void)bd; __m128i buf0[32], buf1[128]; const int8_t *shift = fwd_txfm_shift_ls[TX_32X32]; @@ -2013,3 +2013,45 @@ av1_fwd_txfm2d_32x32_c(input, output, stride, tx_type, bd); } } + +typedef void (*FwdTxfm2dFuncSSE2)(const int16_t *input, int32_t *output, + int stride, TX_TYPE tx_type, int bd); + +FwdTxfm2dFuncSSE2 fwd_txfm2d_func_ls[TX_SIZES_ALL] = { + NULL, // 4x4 transform + av1_lowbd_fwd_txfm2d_8x8_sse2, // 8x8 transform + av1_lowbd_fwd_txfm2d_16x16_sse2, // 16x16 transform + av1_lowbd_fwd_txfm2d_32x32_sse2, // 32x32 transform +#if CONFIG_TX64X64 + NULL, // 64x64 transform +#endif // CONFIG_TX64X64 + NULL, // 4x8 transform + NULL, // 8x4 transform + av1_lowbd_fwd_txfm2d_8x16_sse2, // 8x16 transform + av1_lowbd_fwd_txfm2d_16x8_sse2, // 16x8 transform + av1_lowbd_fwd_txfm2d_16x32_sse2, // 16x32 transform + av1_lowbd_fwd_txfm2d_32x16_sse2, // 32x16 transform +#if CONFIG_TX64X64 + NULL, // 32x64 transform + NULL, // 64x32 transform +#endif // CONFIG_TX64X64 + NULL, // 4x16 transform + NULL, // 16x4 transform + NULL, // 8x32 transform + NULL, // 32x8 transform +#if CONFIG_TX64X64 + NULL, // 16x64 transform + NULL, // 64x16 transform +#endif // CONFIG_TX64X64 +}; + +void av1_lowbd_fwd_txfm_sse2(const int16_t *src_diff, tran_low_t *coeff, + int diff_stride, TxfmParam *txfm_param) { + FwdTxfm2dFuncSSE2 fwd_txfm2d_func = fwd_txfm2d_func_ls[txfm_param->tx_size]; + + if (fwd_txfm2d_func) + fwd_txfm2d_func(src_diff, coeff, diff_stride, txfm_param->tx_type, + txfm_param->bd); + else + av1_lowbd_fwd_txfm_c(src_diff, coeff, diff_stride, txfm_param); +}
diff --git a/test/av1_fwd_txfm2d_test.cc b/test/av1_fwd_txfm2d_test.cc index b962189..67ea78e 100644 --- a/test/av1_fwd_txfm2d_test.cc +++ b/test/av1_fwd_txfm2d_test.cc
@@ -211,20 +211,19 @@ #if HAVE_SSE2 && defined(__SSE2__) #include "av1/common/x86/av1_txfm_sse2.h" FwdTxfm2dFunc fwd_func_sse2_list[TX_SIZES_ALL][2] = { - { NULL, NULL }, // TX_4X4 - { av1_fwd_txfm2d_8x8_c, - av1_fwd_txfm2d_8x8_sse2 }, // TX_8X8 // 8x8 transform - { av1_fwd_txfm2d_16x16_c, av1_fwd_txfm2d_16x16_sse2 }, // TX_16X16 - { av1_fwd_txfm2d_32x32_c, av1_fwd_txfm2d_32x32_sse2 }, // TX_32X32 + { NULL, NULL }, // TX_4X4 + { av1_fwd_txfm2d_8x8_c, av1_lowbd_fwd_txfm2d_8x8_sse2 }, // TX_8X8 + { av1_fwd_txfm2d_16x16_c, av1_lowbd_fwd_txfm2d_16x16_sse2 }, // TX_16X16 + { av1_fwd_txfm2d_32x32_c, av1_lowbd_fwd_txfm2d_32x32_sse2 }, // TX_32X32 #if CONFIG_TX64X64 - { NULL, NULL }, // TX_64X64 -#endif // CONFIG_TX64X64 - { NULL, NULL }, // TX_4X8 - { NULL, NULL }, // TX_8X4 - { av1_fwd_txfm2d_8x16_c, av1_fwd_txfm2d_8x16_sse2 }, // TX_8X16 - { av1_fwd_txfm2d_16x8_c, av1_fwd_txfm2d_16x8_sse2 }, // TX_16X8 - { av1_fwd_txfm2d_16x32_c, av1_fwd_txfm2d_16x32_sse2 }, // TX_16X32 - { av1_fwd_txfm2d_32x16_c, av1_fwd_txfm2d_32x16_sse2 }, // TX_32X16 + { NULL, NULL }, // TX_64X64 +#endif // CONFIG_TX64X64 + { NULL, NULL }, // TX_4X8 + { NULL, NULL }, // TX_8X4 + { av1_fwd_txfm2d_8x16_c, av1_lowbd_fwd_txfm2d_8x16_sse2 }, // TX_8X16 + { av1_fwd_txfm2d_16x8_c, av1_lowbd_fwd_txfm2d_16x8_sse2 }, // TX_16X8 + { av1_fwd_txfm2d_16x32_c, av1_lowbd_fwd_txfm2d_16x32_sse2 }, // TX_16X32 + { av1_fwd_txfm2d_32x16_c, av1_lowbd_fwd_txfm2d_32x16_sse2 }, // TX_32X16 #if CONFIG_TX64X64 { NULL, NULL }, // TX_32X64 { NULL, NULL }, // TX_64X32