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