1 /* 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 12 #include "vpx_ports/config.h" 13 #include "vpx_ports/x86.h" 14 #include "vp8/common/g_common.h" 15 #include "vp8/common/subpixel.h" 16 #include "vp8/common/loopfilter.h" 17 #include "vp8/common/recon.h" 18 #include "vp8/common/idct.h" 19 #include "vp8/common/pragmas.h" 20 #include "vp8/common/onyxc_int.h" 21 vp8_arch_x86_common_init(VP8_COMMON * ctx)22void vp8_arch_x86_common_init(VP8_COMMON *ctx) 23 { 24 #if CONFIG_RUNTIME_CPU_DETECT 25 VP8_COMMON_RTCD *rtcd = &ctx->rtcd; 26 int flags = x86_simd_caps(); 27 int mmx_enabled = flags & HAS_MMX; 28 int xmm_enabled = flags & HAS_SSE; 29 int wmt_enabled = flags & HAS_SSE2; 30 int SSSE3Enabled = flags & HAS_SSSE3; 31 32 /* Note: 33 * 34 * This platform can be built without runtime CPU detection as well. If 35 * you modify any of the function mappings present in this file, be sure 36 * to also update them in static mapings (<arch>/filename_<arch>.h) 37 */ 38 39 /* Override default functions with fastest ones for this CPU. */ 40 #if HAVE_MMX 41 42 if (mmx_enabled) 43 { 44 rtcd->idct.idct1 = vp8_short_idct4x4llm_1_mmx; 45 rtcd->idct.idct16 = vp8_short_idct4x4llm_mmx; 46 rtcd->idct.idct1_scalar_add = vp8_dc_only_idct_add_mmx; 47 rtcd->idct.iwalsh16 = vp8_short_inv_walsh4x4_mmx; 48 rtcd->idct.iwalsh1 = vp8_short_inv_walsh4x4_1_mmx; 49 50 51 52 rtcd->recon.recon = vp8_recon_b_mmx; 53 rtcd->recon.copy8x8 = vp8_copy_mem8x8_mmx; 54 rtcd->recon.copy8x4 = vp8_copy_mem8x4_mmx; 55 rtcd->recon.copy16x16 = vp8_copy_mem16x16_mmx; 56 57 rtcd->subpix.sixtap16x16 = vp8_sixtap_predict16x16_mmx; 58 rtcd->subpix.sixtap8x8 = vp8_sixtap_predict8x8_mmx; 59 rtcd->subpix.sixtap8x4 = vp8_sixtap_predict8x4_mmx; 60 rtcd->subpix.sixtap4x4 = vp8_sixtap_predict4x4_mmx; 61 rtcd->subpix.bilinear16x16 = vp8_bilinear_predict16x16_mmx; 62 rtcd->subpix.bilinear8x8 = vp8_bilinear_predict8x8_mmx; 63 rtcd->subpix.bilinear8x4 = vp8_bilinear_predict8x4_mmx; 64 rtcd->subpix.bilinear4x4 = vp8_bilinear_predict4x4_mmx; 65 66 rtcd->loopfilter.normal_mb_v = vp8_loop_filter_mbv_mmx; 67 rtcd->loopfilter.normal_b_v = vp8_loop_filter_bv_mmx; 68 rtcd->loopfilter.normal_mb_h = vp8_loop_filter_mbh_mmx; 69 rtcd->loopfilter.normal_b_h = vp8_loop_filter_bh_mmx; 70 rtcd->loopfilter.simple_mb_v = vp8_loop_filter_mbvs_mmx; 71 rtcd->loopfilter.simple_b_v = vp8_loop_filter_bvs_mmx; 72 rtcd->loopfilter.simple_mb_h = vp8_loop_filter_mbhs_mmx; 73 rtcd->loopfilter.simple_b_h = vp8_loop_filter_bhs_mmx; 74 75 #if CONFIG_POSTPROC 76 rtcd->postproc.down = vp8_mbpost_proc_down_mmx; 77 /*rtcd->postproc.across = vp8_mbpost_proc_across_ip_c;*/ 78 rtcd->postproc.downacross = vp8_post_proc_down_and_across_mmx; 79 rtcd->postproc.addnoise = vp8_plane_add_noise_mmx; 80 #endif 81 } 82 83 #endif 84 #if HAVE_SSE2 85 86 if (wmt_enabled) 87 { 88 rtcd->recon.recon2 = vp8_recon2b_sse2; 89 rtcd->recon.recon4 = vp8_recon4b_sse2; 90 rtcd->recon.copy16x16 = vp8_copy_mem16x16_sse2; 91 92 rtcd->idct.iwalsh16 = vp8_short_inv_walsh4x4_sse2; 93 94 rtcd->subpix.sixtap16x16 = vp8_sixtap_predict16x16_sse2; 95 rtcd->subpix.sixtap8x8 = vp8_sixtap_predict8x8_sse2; 96 rtcd->subpix.sixtap8x4 = vp8_sixtap_predict8x4_sse2; 97 rtcd->subpix.bilinear16x16 = vp8_bilinear_predict16x16_sse2; 98 rtcd->subpix.bilinear8x8 = vp8_bilinear_predict8x8_sse2; 99 100 rtcd->loopfilter.normal_mb_v = vp8_loop_filter_mbv_sse2; 101 rtcd->loopfilter.normal_b_v = vp8_loop_filter_bv_sse2; 102 rtcd->loopfilter.normal_mb_h = vp8_loop_filter_mbh_sse2; 103 rtcd->loopfilter.normal_b_h = vp8_loop_filter_bh_sse2; 104 rtcd->loopfilter.simple_mb_v = vp8_loop_filter_mbvs_sse2; 105 rtcd->loopfilter.simple_b_v = vp8_loop_filter_bvs_sse2; 106 rtcd->loopfilter.simple_mb_h = vp8_loop_filter_mbhs_sse2; 107 rtcd->loopfilter.simple_b_h = vp8_loop_filter_bhs_sse2; 108 109 #if CONFIG_POSTPROC 110 rtcd->postproc.down = vp8_mbpost_proc_down_xmm; 111 rtcd->postproc.across = vp8_mbpost_proc_across_ip_xmm; 112 rtcd->postproc.downacross = vp8_post_proc_down_and_across_xmm; 113 rtcd->postproc.addnoise = vp8_plane_add_noise_wmt; 114 #endif 115 } 116 117 #endif 118 119 #if HAVE_SSSE3 120 121 if (SSSE3Enabled) 122 { 123 rtcd->subpix.sixtap16x16 = vp8_sixtap_predict16x16_ssse3; 124 rtcd->subpix.sixtap8x8 = vp8_sixtap_predict8x8_ssse3; 125 rtcd->subpix.sixtap8x4 = vp8_sixtap_predict8x4_ssse3; 126 rtcd->subpix.sixtap4x4 = vp8_sixtap_predict4x4_ssse3; 127 rtcd->subpix.bilinear16x16 = vp8_bilinear_predict16x16_ssse3; 128 rtcd->subpix.bilinear8x8 = vp8_bilinear_predict8x8_ssse3; 129 } 130 #endif 131 132 #endif 133 } 134