annotate libvo/fastmemcpy.h @ 358:223439e2de87

fast memcpy() using x86 asm or mmxext
author arpi_esp
date Wed, 11 Apr 2001 20:14:49 +0000
parents
children 22d2004b721e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
358
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
1 /*
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
2 This part of code was taken by from Linux-2.4.3 and slightly modified
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
3 for MMX2 instruction set. I have done it since linux uses page aligned
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
4 blocks but mplayer uses weakly ordered data and original sources can not
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
5 speedup their. Only using prefetch and movntq together have effect!
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
6 If you have questions please contact with me: Nick Kurshev: nickols_k@mail.ru.
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
7 */
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
8
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
9 #ifndef HAVE_MMX2
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
10 //static inline void * __memcpy(void * to, const void * from, unsigned n)
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
11 inline static void * memcpy(void * to, const void * from, unsigned n)
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
12 {
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
13 int d0, d1, d2;
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
14 __asm__ __volatile__(
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
15 "rep ; movsl\n\t"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
16 "testb $2,%b4\n\t"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
17 "je 1f\n\t"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
18 "movsw\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
19 "1:\ttestb $1,%b4\n\t"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
20 "je 2f\n\t"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
21 "movsb\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
22 "2:"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
23 : "=&c" (d0), "=&D" (d1), "=&S" (d2)
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
24 :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
25 : "memory");
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
26 return (to);
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
27 }
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
28 #else
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
29 //inline static void *__memcpy_mmx2(void *to, const void *from, unsigned len)
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
30 inline static void * memcpy(void * to, const void * from, unsigned n)
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
31 {
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
32 void *p;
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
33 int i;
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
34
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
35 if(len >= 0x200) /* 512-byte blocks */
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
36 {
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
37 p = to;
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
38 i = len >> 6; /* len/64 */
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
39 __asm__ __volatile__ (
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
40 "1: prefetch (%0)\n" /* This set is 28 bytes */
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
41 " prefetch 64(%0)\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
42 " prefetch 128(%0)\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
43 " prefetch 192(%0)\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
44 " prefetch 256(%0)\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
45 "2: \n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
46 ".section .fixup, \"ax\"\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
47 "3: movw $0x1AEB, 1b\n" /* jmp on 26 bytes */
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
48 " jmp 2b\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
49 ".previous\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
50 ".section __ex_table,\"a\"\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
51 " .align 4\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
52 " .long 1b, 3b\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
53 ".previous"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
54 : : "r" (from) );
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
55
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
56
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
57 for(; i>0; i--)
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
58 {
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
59 __asm__ __volatile__ (
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
60 "1: prefetch 320(%0)\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
61 "2: movq (%0), %%mm0\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
62 " movq 8(%0), %%mm1\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
63 " movq 16(%0), %%mm2\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
64 " movq 24(%0), %%mm3\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
65 " movntq %%mm0, (%1)\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
66 " movntq %%mm1, 8(%1)\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
67 " movntq %%mm2, 16(%1)\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
68 " movntq %%mm3, 24(%1)\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
69 " movq 32(%0), %%mm0\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
70 " movq 40(%0), %%mm1\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
71 " movq 48(%0), %%mm2\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
72 " movq 56(%0), %%mm3\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
73 " movntq %%mm0, 32(%1)\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
74 " movntq %%mm1, 40(%1)\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
75 " movntq %%mm2, 48(%1)\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
76 " movntq %%mm3, 56(%1)\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
77 ".section .fixup, \"ax\"\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
78 "3: movw $0x05EB, 1b\n" /* jmp on 5 bytes */
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
79 " jmp 2b\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
80 ".previous\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
81 ".section __ex_table,\"a\"\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
82 " .align 4\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
83 " .long 1b, 3b\n"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
84 ".previous"
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
85 : : "r" (from), "r" (to) : "memory");
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
86 from+=64;
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
87 to+=64;
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
88 }
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
89 __asm__ __volatile__ ("emms":::"memory");
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
90 }
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
91 /*
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
92 * Now do the tail of the block
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
93 */
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
94 __memcpy(to, from, len&63);
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
95 return p;
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
96 }
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
97 #endif
223439e2de87 fast memcpy() using x86 asm or mmxext
arpi_esp
parents:
diff changeset
98