亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? memcpy.h

?? linux下實現視頻播放的播放器
?? H
字號:
/* * Used and modified for FripTV project 2007 * * Copyright (C) 2001-2004 the xine project * * This file is part of xine, a free video player. * * xine is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * xine is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA * * These are the MMX/MMX2/SSE optimized versions of memcpy * * This code was adapted from Linux Kernel sources by Nick Kurshev to * the mplayer program. (http://mplayer.sourceforge.net) * * Miguel Freitas split the #ifdefs into several specialized functions that * are benchmarked at runtime by xine. Some original comments from Nick * have been preserved documenting some MMX/SSE oddities. * Also added kernel memcpy function that seems faster than libc one. * *//* $Id$ */#ifndef MEMCPY_H#define MEMCPY_H/* Original comments from mplayer (file: aclib.c) This part of code was taken by me from Linux-2.4.3 and slightly modifiedfor MMX, MMX2, SSE instruction set. I have done it since linux uses page alignedblocks but mplayer uses weakly ordered data and original sources can notspeedup them. Only using PREFETCHNTA and MOVNTQ together have effect!>From IA-32 Intel Architecture Software Developer's Manual Volume 1,Order Number 245470:"10.4.6. Cacheability Control, Prefetch, and Memory Ordering Instructions"Data referenced by a program can be temporal (data will be used again) ornon-temporal (data will be referenced once and not reused in the immediatefuture). To make efficient use of the processor's caches, it is generallydesirable to cache temporal data and not cache non-temporal data. Overloadingthe processor's caches with non-temporal data is sometimes referred to as"polluting the caches".The non-temporal data is written to memory with Write-Combining semantics.The PREFETCHh instructions permits a program to load data into the processorat a suggested cache level, so that it is closer to the processors load andstore unit when it is needed. If the data is already present in a level ofthe cache hierarchy that is closer to the processor, the PREFETCHh instructionwill not result in any data movement.But we should you PREFETCHNTA: Non-temporal data fetch data into locationclose to the processor, minimizing cache pollution.The MOVNTQ (store quadword using non-temporal hint) instruction storespacked integer data from an MMX register to memory, using a non-temporal hint.The MOVNTPS (store packed single-precision floating-point values usingnon-temporal hint) instruction stores packed floating-point data from anXMM register to memory, using a non-temporal hint.The SFENCE (Store Fence) instruction controls write ordering by creating afence for memory store operations. This instruction guarantees that the resultsof every store instruction that precedes the store fence in program order isglobally visible before any store instruction that follows the fence. TheSFENCE instruction provides an efficient way of ensuring ordering betweenprocedures that produce weakly-ordered data and procedures that consume thatdata.If you have questions please contact with me: Nick Kurshev: nickols_k@mail.ru.*//*  mmx v.1 Note: Since we added alignment of destinition it speedups    of memory copying on PentMMX, Celeron-1 and P2 upto 12% versus    standard (non MMX-optimized) version.    Note: on K6-2+ it speedups memory copying upto 25% and          on K7 and P3 about 500% (5 times).*//* Additional notes on gcc assembly and processors: [MF]prefetch is specific for AMD processors, the intel ones should beprefetch0, prefetch1, prefetch2 which are not recognized by my gcc.prefetchnta is supported both on athlon and pentium 3.therefore i will take off prefetchnta instructions from the mmx1 versionto avoid problems on pentium mmx and k6-2.quote of the day:"Using prefetches efficiently is more of an art than a science"*/#if (C_HOSTCPU == X86) || (C_HOSTCPU == X86_64)#ifndef _MSC_VER/* linux kernel __memcpy (from: /include/asm/string.h) */static __inline__ void * linux_kernel_memcpy_impl (void * to, const void * from, size_t n){int d0, d1, d2;  if( n < 4 ) {    small_memcpy(to,from,n);  }  else    __asm__ __volatile__(    "rep ; movsl\n\t"    "testb $2,%b4\n\t"    "je 1f\n\t"    "movsw\n"    "1:\ttestb $1,%b4\n\t"    "je 2f\n\t"    "movsb\n"    "2:"    : "=&c" (d0), "=&D" (d1), "=&S" (d2)    :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)    : "memory");  return (to);}#define SSE_MMREG_SIZE 16#define MMX_MMREG_SIZE 8#define MMX1_MIN_LEN 0x800  /* 2K blocks */#define MIN_LEN 0x40  /* 64-byte blocks *//* SSE note: i tried to move 128 bytes a time instead of 64 but itdidn't make any measureable difference. i'm using 64 for the sake ofsimplicity. [MF] */static __inline__ void * sse_memcpy(void * to, const void * from, size_t len){  void *retval;  size_t i;  retval = to;  /* PREFETCH has effect even for MOVSB instruction ;) */  __asm__ __volatile__ (    "   prefetchnta (%0)\n"    "   prefetchnta 32(%0)\n"    "   prefetchnta 64(%0)\n"    "   prefetchnta 96(%0)\n"    "   prefetchnta 128(%0)\n"    "   prefetchnta 160(%0)\n"    "   prefetchnta 192(%0)\n"    "   prefetchnta 224(%0)\n"    "   prefetchnta 256(%0)\n"    "   prefetchnta 288(%0)\n"    : : "r" (from) );  if(len >= MIN_LEN)  {    register unsigned long int delta;    /* Align destinition to MMREG_SIZE -boundary */    delta = ((unsigned long int)to)&(SSE_MMREG_SIZE-1);    if(delta)    {      delta=SSE_MMREG_SIZE-delta;      len -= delta;      small_memcpy(to, from, delta);    }    i = len >> 6; /* len/64 */    len&=63;    if(((unsigned long)from) & 15)      /* if SRC is misaligned */      for(; i>0; i--)      {        __asm__ __volatile__ (        "prefetchnta 320(%0)\n"        "prefetchnta 352(%0)\n"        "movups (%0), %%xmm0\n"        "movups 16(%0), %%xmm1\n"        "movups 32(%0), %%xmm2\n"        "movups 48(%0), %%xmm3\n"        "movntps %%xmm0, (%1)\n"        "movntps %%xmm1, 16(%1)\n"        "movntps %%xmm2, 32(%1)\n"        "movntps %%xmm3, 48(%1)\n"        :: "r" (from), "r" (to) : "memory");        from = ((const unsigned char *)from) + 64;        to = ((unsigned char *)to) + 64;      }    else      /*         Only if SRC is aligned on 16-byte boundary.         It allows to use movaps instead of movups, which required data         to be aligned or a general-protection exception (#GP) is generated.      */      for(; i>0; i--)      {        __asm__ __volatile__ (        "prefetchnta 320(%0)\n"        "prefetchnta 352(%0)\n"        "movaps (%0), %%xmm0\n"        "movaps 16(%0), %%xmm1\n"        "movaps 32(%0), %%xmm2\n"        "movaps 48(%0), %%xmm3\n"        "movntps %%xmm0, (%1)\n"        "movntps %%xmm1, 16(%1)\n"        "movntps %%xmm2, 32(%1)\n"        "movntps %%xmm3, 48(%1)\n"        :: "r" (from), "r" (to) : "memory");        from = ((const unsigned char *)from) + 64;        to = ((unsigned char *)to) + 64;      }    /* since movntq is weakly-ordered, a "sfence"     * is needed to become ordered again. */    __asm__ __volatile__ ("sfence":::"memory");    /* enables to use FPU */    __asm__ __volatile__ ("emms":::"memory");  }  /*   *	Now do the tail of the block   */  if(len) linux_kernel_memcpy_impl(to, from, len);  return retval;}static __inline__ void * mmx_memcpy(void * to, const void * from, size_t len){  void *retval;  size_t i;  retval = to;  if(len >= MMX1_MIN_LEN)  {    register unsigned long int delta;    /* Align destinition to MMREG_SIZE -boundary */    delta = ((unsigned long int)to)&(MMX_MMREG_SIZE-1);    if(delta)    {      delta=MMX_MMREG_SIZE-delta;      len -= delta;      small_memcpy(to, from, delta);    }    i = len >> 6; /* len/64 */    len&=63;    for(; i>0; i--)    {      __asm__ __volatile__ (      "movq (%0), %%mm0\n"      "movq 8(%0), %%mm1\n"      "movq 16(%0), %%mm2\n"      "movq 24(%0), %%mm3\n"      "movq 32(%0), %%mm4\n"      "movq 40(%0), %%mm5\n"      "movq 48(%0), %%mm6\n"      "movq 56(%0), %%mm7\n"      "movq %%mm0, (%1)\n"      "movq %%mm1, 8(%1)\n"      "movq %%mm2, 16(%1)\n"      "movq %%mm3, 24(%1)\n"      "movq %%mm4, 32(%1)\n"      "movq %%mm5, 40(%1)\n"      "movq %%mm6, 48(%1)\n"      "movq %%mm7, 56(%1)\n"      :: "r" (from), "r" (to) : "memory");      from = ((const unsigned char *)from) + 64;      to = ((unsigned char *)to) + 64;    }    __asm__ __volatile__ ("emms":::"memory");  }  /*   *	Now do the tail of the block   */  if(len) linux_kernel_memcpy_impl(to, from, len);  return retval;}static __inline__ void * mmx2_memcpy(void * to, const void * from, size_t len){  void *retval;  size_t i;  retval = to;  /* PREFETCH has effect even for MOVSB instruction ;) */  __asm__ __volatile__ (    "   prefetchnta (%0)\n"    "   prefetchnta 32(%0)\n"    "   prefetchnta 64(%0)\n"    "   prefetchnta 96(%0)\n"    "   prefetchnta 128(%0)\n"    "   prefetchnta 160(%0)\n"    "   prefetchnta 192(%0)\n"    "   prefetchnta 224(%0)\n"    "   prefetchnta 256(%0)\n"    "   prefetchnta 288(%0)\n"    : : "r" (from) );  if(len >= MIN_LEN)  {    register unsigned long int delta;    /* Align destinition to MMREG_SIZE -boundary */    delta = ((unsigned long int)to)&(MMX_MMREG_SIZE-1);    if(delta)    {      delta=MMX_MMREG_SIZE-delta;      len -= delta;      small_memcpy(to, from, delta);    }    i = len >> 6; /* len/64 */    len&=63;    for(; i>0; i--)    {      __asm__ __volatile__ (      "prefetchnta 320(%0)\n"      "prefetchnta 352(%0)\n"      "movq (%0), %%mm0\n"      "movq 8(%0), %%mm1\n"      "movq 16(%0), %%mm2\n"      "movq 24(%0), %%mm3\n"      "movq 32(%0), %%mm4\n"      "movq 40(%0), %%mm5\n"      "movq 48(%0), %%mm6\n"      "movq 56(%0), %%mm7\n"      "movntq %%mm0, (%1)\n"      "movntq %%mm1, 8(%1)\n"      "movntq %%mm2, 16(%1)\n"      "movntq %%mm3, 24(%1)\n"      "movntq %%mm4, 32(%1)\n"      "movntq %%mm5, 40(%1)\n"      "movntq %%mm6, 48(%1)\n"      "movntq %%mm7, 56(%1)\n"      :: "r" (from), "r" (to) : "memory");      from = ((const unsigned char *)from) + 64;      to = ((unsigned char *)to) + 64;    }     /* since movntq is weakly-ordered, a "sfence"     * is needed to become ordered again. */    __asm__ __volatile__ ("sfence":::"memory");    __asm__ __volatile__ ("emms":::"memory");  }  /*   *	Now do the tail of the block   */  if(len) linux_kernel_memcpy_impl(to, from, len);  return retval;}#endif /* _MSC_VER */#endif /* ARCH_X86 *//* SDL_memcpy is a macro, use IPTV_memcpy where function pointer is required */static __inline__ void* IPTV_memcpy(void * src, const void * dst, size_t len){    SDL_memcpy(src, dst, len);}#endif // MEMCPY_H

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品国产无套在线观| 蜜乳av一区二区三区| 成人精品免费视频| 欧美极品xxx| 91亚洲精品乱码久久久久久蜜桃 | 日韩中文字幕不卡| 91精品蜜臀在线一区尤物| 免费国产亚洲视频| 91国产丝袜在线播放| 一区二区高清免费观看影视大全| 91国偷自产一区二区三区观看| 亚洲自拍偷拍九九九| 91国产福利在线| 国产在线精品一区二区三区不卡 | 欧美va天堂va视频va在线| 国产成人免费视频网站| 一区二区在线观看视频| 国产日韩av一区二区| 丁香六月综合激情| 婷婷久久综合九色综合伊人色| 精品国产一区二区三区av性色 | 久久精品一区蜜桃臀影院| 99久久国产综合精品色伊| 国产精品欧美极品| 91精品国产入口在线| 成人黄色电影在线 | 亚洲午夜在线视频| 久久久久久免费毛片精品| 欧美偷拍一区二区| 97久久人人超碰| 国产一区二区在线观看免费| 亚洲五月六月丁香激情| 国产精品网站导航| 久久久久久久综合狠狠综合| 久久免费偷拍视频| 欧美性xxxxx极品少妇| 成人av资源在线| 在线观看免费成人| 91麻豆swag| 日本韩国欧美一区二区三区| 成人性生交大片免费看中文 | 欧美在线视频日韩| 欧美午夜精品久久久久久超碰 | 亚洲乱码国产乱码精品精可以看| 久久精品一二三| 欧美国产成人在线| 中文字幕一区日韩精品欧美| 国产午夜亚洲精品不卡| 久久久久久久综合色一本| 欧美经典一区二区| 午夜精品久久一牛影视| 天天色天天爱天天射综合| 日韩精彩视频在线观看| 久久激情五月激情| 波多野结衣中文字幕一区二区三区 | 美国毛片一区二区| 精品在线视频一区| 国产成人亚洲综合a∨猫咪| 成人精品高清在线| 欧美日韩和欧美的一区二区| 制服.丝袜.亚洲.中文.综合| 欧美电视剧免费全集观看| 国产欧美精品在线观看| 亚洲欧美日韩人成在线播放| 日韩成人dvd| av激情综合网| 欧美一区二区三区视频| 亚洲欧美在线视频观看| 日本麻豆一区二区三区视频| 高清不卡在线观看| 精品国产污网站| 亚洲午夜影视影院在线观看| 国产精品伊人色| 欧美日韩在线电影| 成人欧美一区二区三区| 日韩电影在线观看网站| 色综合久久中文字幕综合网| 国产亚洲va综合人人澡精品| 一区二区在线观看免费| 91精彩视频在线| 国产清纯美女被跳蛋高潮一区二区久久w| 亚洲欧美色一区| 成人黄色软件下载| 久久久噜噜噜久久中文字幕色伊伊| 性久久久久久久| 欧美图区在线视频| 亚洲国产视频直播| av一区二区久久| 国产精品日产欧美久久久久| 奇米一区二区三区| 日韩一级免费观看| 日韩国产成人精品| 日韩精品专区在线| 国产麻豆精品theporn| 日韩欧美国产一区二区三区 | 国产精品不卡在线| av不卡在线播放| 亚洲色图欧洲色图婷婷| 欧美在线三级电影| 午夜激情一区二区三区| 欧美一区二区三区免费大片| 久久精品国产精品青草| 精品少妇一区二区| 不卡一区在线观看| 亚洲人成亚洲人成在线观看图片| av午夜一区麻豆| 亚洲伊人色欲综合网| 欧美一区二区三区视频在线| 麻豆视频观看网址久久| 国产欧美精品一区二区色综合| 99久久国产综合精品女不卡| 亚洲成人久久影院| 亚洲精品一线二线三线| 99re这里只有精品6| 日本亚洲电影天堂| 中文av一区特黄| 欧美少妇xxx| 国产成人免费视频| 亚洲自拍偷拍图区| 国产网红主播福利一区二区| 99精品视频在线观看| 日韩av电影天堂| 亚洲欧美日本在线| 国产精品看片你懂得| 久久精品水蜜桃av综合天堂| 91老师国产黑色丝袜在线| 日本三级韩国三级欧美三级| 国产精品久久久久aaaa| av动漫一区二区| 国产精品久久久久久亚洲伦 | 欧美三区在线观看| 92精品国产成人观看免费 | 麻豆精品一区二区| 午夜一区二区三区视频| 中文字幕中文字幕在线一区| 日韩免费看的电影| 欧美一区二区国产| 亚洲婷婷综合久久一本伊一区| 久久久综合精品| 久久丝袜美腿综合| 中文字幕免费观看一区| 国产午夜亚洲精品羞羞网站| 久久久国际精品| 国产精品网站在线| 国产精品久久三| 亚洲欧美另类小说视频| 亚洲综合无码一区二区| 性欧美疯狂xxxxbbbb| 美女尤物国产一区| 国产精品一区一区| 国产91精品在线观看| 国产一区二区三区高清播放| 成人免费毛片aaaaa**| 欧美日韩性生活| 日韩一区二区三区高清免费看看| 日韩午夜三级在线| 国产亚洲人成网站| 一区二区在线观看视频| 日日摸夜夜添夜夜添国产精品| 蓝色福利精品导航| 一本色道**综合亚洲精品蜜桃冫| 国产午夜精品久久久久久久 | 亚洲午夜精品网| 激情丁香综合五月| 91在线你懂得| 日韩精品中文字幕一区 | 成人欧美一区二区三区| 日本美女视频一区二区| 成人丝袜视频网| 欧美电影免费观看高清完整版| 亚洲天天做日日做天天谢日日欢| 极品少妇一区二区| 91久久精品国产91性色tv| 久久久亚洲综合| 精品在线免费观看| 欧美日韩国产高清一区二区| 久久婷婷成人综合色| 美女www一区二区| 日本韩国一区二区三区| 国产精品三级在线观看| 日本aⅴ免费视频一区二区三区| av不卡免费电影| 国产精品私人影院| 国产麻豆精品在线观看| 日韩一级片网址| 蜜臂av日日欢夜夜爽一区| 欧美色精品在线视频| 一区二区三区在线影院| 97久久超碰国产精品| 一区在线观看视频| 99在线精品视频| 国产精品对白交换视频 | 性做久久久久久| 欧美色男人天堂| 偷窥国产亚洲免费视频 | 99国产精品久久久久| 国产欧美久久久精品影院| 国产高清不卡二三区| 欧美国产日韩亚洲一区| 成人精品gif动图一区|