diff --git a/vp10/encoder/encoder.c b/vp10/encoder/encoder.c
index 01be7cc70cc84d82138e2a9b9a354e23232f211d..a7dd1d777dac4a6ce8936d3a16ccdcc2a0f447c2 100644
--- a/vp10/encoder/encoder.c
+++ b/vp10/encoder/encoder.c
@@ -323,7 +323,6 @@ void vp10_initialize_enc(void) {
     vp10_init_me_luts();
     vp10_rc_init_minq_luts();
     vp10_entropy_mv_init();
-    vp10_temporal_filter_init();
     vp10_encode_token_init();
     init_done = 1;
   }
diff --git a/vp10/encoder/temporal_filter.c b/vp10/encoder/temporal_filter.c
index a88564df0bbf11a62fbc72c827149c3902147b24..b19469a5e6e93b6bb221d7a401d118036dbbb290 100644
--- a/vp10/encoder/temporal_filter.c
+++ b/vp10/encoder/temporal_filter.c
@@ -15,6 +15,7 @@
 #include "vp10/common/onyxc_int.h"
 #include "vp10/common/quant_common.h"
 #include "vp10/common/reconinter.h"
+#include "vp10/common/odintrin.h"
 #include "vp10/encoder/extend.h"
 #include "vp10/encoder/firstpass.h"
 #include "vp10/encoder/mcomp.h"
@@ -29,8 +30,6 @@
 #include "vpx_ports/vpx_timer.h"
 #include "vpx_scale/vpx_scale.h"
 
-static int fixed_divide[512];
-
 static void temporal_filter_predictors_mb_c(
     MACROBLOCKD *xd, uint8_t *y_mb_ptr, uint8_t *u_mb_ptr, uint8_t *v_mb_ptr,
     int stride, int uv_block_width, int uv_block_height, int mv_row, int mv_col,
@@ -80,13 +79,6 @@ static void temporal_filter_predictors_mb_c(
                              which_mv, kernel, mv_precision_uv, x, y);
 }
 
-void vp10_temporal_filter_init(void) {
-  int i;
-
-  fixed_divide[0] = 0;
-  for (i = 1; i < 512; ++i) fixed_divide[i] = 0x80000 / i;
-}
-
 void vp10_temporal_filter_apply_c(uint8_t *frame1, unsigned int stride,
                                   uint8_t *frame2, unsigned int block_width,
                                   unsigned int block_height, int strength,
@@ -379,11 +371,8 @@ static void temporal_filter_iterate_c(VP10_COMP *cpi,
         byte = mb_y_offset;
         for (i = 0, k = 0; i < 16; i++) {
           for (j = 0; j < 16; j++, k++) {
-            unsigned int pval = accumulator[k] + (count[k] >> 1);
-            pval *= fixed_divide[count[k]];
-            pval >>= 19;
-
-            dst1_16[byte] = (uint16_t)pval;
+            dst1_16[byte] =
+                (uint16_t)OD_DIVU(accumulator[k] + (count[k] >> 1), count[k]);
 
             // move to next pixel
             byte++;
@@ -403,16 +392,12 @@ static void temporal_filter_iterate_c(VP10_COMP *cpi,
             int m = k + 256;
 
             // U
-            unsigned int pval = accumulator[k] + (count[k] >> 1);
-            pval *= fixed_divide[count[k]];
-            pval >>= 19;
-            dst1_16[byte] = (uint16_t)pval;
+            dst1_16[byte] =
+                (uint16_t)OD_DIVU(accumulator[k] + (count[k] >> 1), count[k]);
 
             // V
-            pval = accumulator[m] + (count[m] >> 1);
-            pval *= fixed_divide[count[m]];
-            pval >>= 19;
-            dst2_16[byte] = (uint16_t)pval;
+            dst2_16[byte] =
+                (uint16_t)OD_DIVU(accumulator[m] + (count[m] >> 1), count[m]);
 
             // move to next pixel
             byte++;
@@ -427,11 +412,8 @@ static void temporal_filter_iterate_c(VP10_COMP *cpi,
         byte = mb_y_offset;
         for (i = 0, k = 0; i < 16; i++) {
           for (j = 0; j < 16; j++, k++) {
-            unsigned int pval = accumulator[k] + (count[k] >> 1);
-            pval *= fixed_divide[count[k]];
-            pval >>= 19;
-
-            dst1[byte] = (uint8_t)pval;
+            dst1[byte] =
+                (uint8_t)OD_DIVU(accumulator[k] + (count[k] >> 1), count[k]);
 
             // move to next pixel
             byte++;
@@ -448,16 +430,12 @@ static void temporal_filter_iterate_c(VP10_COMP *cpi,
             int m = k + 256;
 
             // U
-            unsigned int pval = accumulator[k] + (count[k] >> 1);
-            pval *= fixed_divide[count[k]];
-            pval >>= 19;
-            dst1[byte] = (uint8_t)pval;
+            dst1[byte] =
+                (uint8_t)OD_DIVU(accumulator[k] + (count[k] >> 1), count[k]);
 
             // V
-            pval = accumulator[m] + (count[m] >> 1);
-            pval *= fixed_divide[count[m]];
-            pval >>= 19;
-            dst2[byte] = (uint8_t)pval;
+            dst2[byte] =
+                (uint8_t)OD_DIVU(accumulator[m] + (count[m] >> 1), count[m]);
 
             // move to next pixel
             byte++;
@@ -472,11 +450,8 @@ static void temporal_filter_iterate_c(VP10_COMP *cpi,
       byte = mb_y_offset;
       for (i = 0, k = 0; i < 16; i++) {
         for (j = 0; j < 16; j++, k++) {
-          unsigned int pval = accumulator[k] + (count[k] >> 1);
-          pval *= fixed_divide[count[k]];
-          pval >>= 19;
-
-          dst1[byte] = (uint8_t)pval;
+          dst1[byte] =
+              (uint8_t)OD_DIVU(accumulator[k] + (count[k] >> 1), count[k]);
 
           // move to next pixel
           byte++;
@@ -493,16 +468,12 @@ static void temporal_filter_iterate_c(VP10_COMP *cpi,
           int m = k + 256;
 
           // U
-          unsigned int pval = accumulator[k] + (count[k] >> 1);
-          pval *= fixed_divide[count[k]];
-          pval >>= 19;
-          dst1[byte] = (uint8_t)pval;
+          dst1[byte] =
+              (uint8_t)OD_DIVU(accumulator[k] + (count[k] >> 1), count[k]);
 
           // V
-          pval = accumulator[m] + (count[m] >> 1);
-          pval *= fixed_divide[count[m]];
-          pval >>= 19;
-          dst2[byte] = (uint8_t)pval;
+          dst2[byte] =
+              (uint8_t)OD_DIVU(accumulator[m] + (count[m] >> 1), count[m]);
 
           // move to next pixel
           byte++;
diff --git a/vp10/encoder/temporal_filter.h b/vp10/encoder/temporal_filter.h
index 6e331e6ad006785434c94888bb0d6c8e93128259..ce5291a53df2a10e9f4d988714ccabc9b2c6b324 100644
--- a/vp10/encoder/temporal_filter.h
+++ b/vp10/encoder/temporal_filter.h
@@ -15,7 +15,6 @@
 extern "C" {
 #endif
 
-void vp10_temporal_filter_init(void);
 void vp10_temporal_filter(VP10_COMP *cpi, int distance);
 
 #ifdef __cplusplus