?? fbcon.h
字號:
"movew %1@+,%0@+ ; subqw #2,%2 ; jra 2f\n\t" "1: lsrl #1,%3 ; jcc 2f\n\t" "movew %1@+,%0@+ ; subqw #2,%2\n\t" "2: movew %2,%-; lsrl #2,%2 ; jeq 6f\n\t" "lsrl #1,%2 ; jcc 3f ; movel %1@+,%0@+\n\t" "3: lsrl #1,%2 ; jcc 4f ; movel %1@+,%0@+ ; movel %1@+,%0@+\n\t" "4: subql #1,%2 ; jcs 6f\n\t" "5: movel %1@+,%0@+;movel %1@+,%0@+\n\t" "movel %1@+,%0@+;movel %1@+,%0@+\n\t" "dbra %2,5b ; clrw %2; subql #1,%2; jcc 5b\n\t" "6: movew %+,%2; btst #1,%2 ; jeq 7f ; movew %1@+,%0@+\n\t" "7: ; btst #0,%2 ; jeq 8f ; moveb %1@+,%0@+\n\t" "8:" : "=a" (d), "=a" (s), "=d" (count), "=d" (tmp) : "0" (d), "1" (s), "2" (count) ); } } else { if (count < 16) { __asm__ __volatile__( "lsrl #1,%2 ; jcc 1f ; moveb %1@-,%0@-\n\t" "1: lsrl #1,%2 ; jcc 1f ; movew %1@-,%0@-\n\t" "1: lsrl #1,%2 ; jcc 1f ; movel %1@-,%0@-\n\t" "1: lsrl #1,%2 ; jcc 1f ; movel %1@-,%0@- ; movel %1@-,%0@-\n\t" "1:" : "=a" (d), "=a" (s), "=d" (count) : "0" ((char *) d + count), "1" ((char *) s + count), "2" (count) ); } else { long tmp; __asm__ __volatile__( "movel %0,%3\n\t" "lsrl #1,%3 ; jcc 1f ; moveb %1@-,%0@- ; subqw #1,%2\n\t" "lsrl #1,%3 ; jcs 2f\n\t" /* %0 increased=>bit 2 switched*/ "movew %1@-,%0@- ; subqw #2,%2 ; jra 2f\n\t" "1: lsrl #1,%3 ; jcc 2f\n\t" "movew %1@-,%0@- ; subqw #2,%2\n\t" "2: movew %2,%-; lsrl #2,%2 ; jeq 6f\n\t" "lsrl #1,%2 ; jcc 3f ; movel %1@-,%0@-\n\t" "3: lsrl #1,%2 ; jcc 4f ; movel %1@-,%0@- ; movel %1@-,%0@-\n\t" "4: subql #1,%2 ; jcs 6f\n\t" "5: movel %1@-,%0@-;movel %1@-,%0@-\n\t" "movel %1@-,%0@-;movel %1@-,%0@-\n\t" "dbra %2,5b ; clrw %2; subql #1,%2; jcc 5b\n\t" "6: movew %+,%2; btst #1,%2 ; jeq 7f ; movew %1@-,%0@-\n\t" "7: ; btst #0,%2 ; jeq 8f ; moveb %1@-,%0@-\n\t" "8:" : "=a" (d), "=a" (s), "=d" (count), "=d" (tmp) : "0" ((char *) d + count), "1" ((char *) s + count), "2" (count) ); } } return(0);}/* ++andreas: Simple and fast version of memmove, assumes size is divisible by 16, suitable for moving the whole screen bitplane */static __inline__ void fast_memmove(char *dst, const char *src, size_t size){ if (!size) return; if (dst < src) __asm__ __volatile__ ("1:" " moveml %0@+,%/d0/%/d1/%/a0/%/a1\n" " moveml %/d0/%/d1/%/a0/%/a1,%1@\n" " addql #8,%1; addql #8,%1\n" " dbra %2,1b\n" " clrw %2; subql #1,%2\n" " jcc 1b" : "=a" (src), "=a" (dst), "=d" (size) : "0" (src), "1" (dst), "2" (size / 16 - 1) : "d0", "d1", "a0", "a1", "memory"); else __asm__ __volatile__ ("1:" " subql #8,%0; subql #8,%0\n" " moveml %0@,%/d0/%/d1/%/a0/%/a1\n" " moveml %/d0/%/d1/%/a0/%/a1,%1@-\n" " dbra %2,1b\n" " clrw %2; subql #1,%2\n" " jcc 1b" : "=a" (src), "=a" (dst), "=d" (size) : "0" (src + size), "1" (dst + size), "2" (size / 16 - 1) : "d0", "d1", "a0", "a1", "memory");}#elif defined(CONFIG_SUN4)/* You may think that I'm crazy and that I should use generic routines. No, I'm not: sun4's framebuffer crashes if we std into it, so we cannot use memset. */static __inline__ void *sun4_memset(void *s, char val, size_t count){ int i; for(i=0; i<count;i++) ((char *) s) [i] = val; return s;}static __inline__ void *fb_memset255(void *s, size_t count){ return sun4_memset(s, 255, count);}static __inline__ void *fb_memclear(void *s, size_t count){ return sun4_memset(s, 0, count);}static __inline__ void *fb_memclear_small(void *s, size_t count){ return sun4_memset(s, 0, count);}/* To be honest, this is slow_memmove :). But sun4 is crappy, so what we can do. */static __inline__ void fast_memmove(void *d, const void *s, size_t count){ int i; if (d<s) { for (i=0; i<count; i++) ((char *) d)[i] = ((char *) s)[i]; } else for (i=0; i<count; i++) ((char *) d)[count-i-1] = ((char *) s)[count-i-1];}static __inline__ void *fb_memmove(char *dst, const char *src, size_t size){ fast_memmove(dst, src, size); return dst;}#elsestatic __inline__ void *fb_memclear_small(void *s, size_t count){ char *xs = (char *) s; while (count--) fb_writeb(0, xs++); return s;}static __inline__ void *fb_memclear(void *s, size_t count){ unsigned long xs = (unsigned long) s; if (count < 8) goto rest; if (xs & 1) { fb_writeb(0, xs++); count--; } if (xs & 2) { fb_writew(0, xs); xs += 2; count -= 2; } while (count > 3) { fb_writel(0, xs); xs += 4; count -= 4; }rest: while (count--) fb_writeb(0, xs++); return s;}static __inline__ void *fb_memset255(void *s, size_t count){ unsigned long xs = (unsigned long) s; if (count < 8) goto rest; if (xs & 1) { fb_writeb(0xff, xs++); count--; } if (xs & 2) { fb_writew(0xffff, xs); xs += 2; count -= 2; } while (count > 3) { fb_writel(0xffffffff, xs); xs += 4; count -= 4; }rest: while (count--) fb_writeb(0xff, xs++); return s;}#if defined(__i386__)static __inline__ void fast_memmove(void *d, const void *s, size_t count){ int d0, d1, d2, d3; if (d < s) {__asm__ __volatile__ ( "cld\n\t" "shrl $1,%%ecx\n\t" "jnc 1f\n\t" "movsb\n" "1:\tshrl $1,%%ecx\n\t" "jnc 2f\n\t" "movsw\n" "2:\trep\n\t" "movsl" : "=&c" (d0), "=&D" (d1), "=&S" (d2) :"0"(count),"1"((long)d),"2"((long)s) :"memory"); } else {__asm__ __volatile__ ( "std\n\t" "shrl $1,%%ecx\n\t" "jnc 1f\n\t" "movb 3(%%esi),%%al\n\t" "movb %%al,3(%%edi)\n\t" "decl %%esi\n\t" "decl %%edi\n" "1:\tshrl $1,%%ecx\n\t" "jnc 2f\n\t" "movw 2(%%esi),%%ax\n\t" "movw %%ax,2(%%edi)\n\t" "decl %%esi\n\t" "decl %%edi\n\t" "decl %%esi\n\t" "decl %%edi\n" "2:\trep\n\t" "movsl\n\t" "cld" : "=&c" (d0), "=&D" (d1), "=&S" (d2), "=&a" (d3) :"0"(count),"1"(count-4+(long)d),"2"(count-4+(long)s) :"memory"); }}static __inline__ void *fb_memmove(char *dst, const char *src, size_t size){ fast_memmove(dst, src, size); return dst;}#else /* !__i386__ */ /* * Anyone who'd like to write asm functions for other CPUs? * (Why are these functions better than those from include/asm/string.h?) */static __inline__ void *fb_memmove(void *d, const void *s, size_t count){ unsigned long dst, src; if (d < s) { dst = (unsigned long) d; src = (unsigned long) s; if ((count < 8) || ((dst ^ src) & 3)) goto restup; if (dst & 1) { fb_writeb(fb_readb(src++), dst++); count--; } if (dst & 2) { fb_writew(fb_readw(src), dst); src += 2; dst += 2; count -= 2; } while (count > 3) { fb_writel(fb_readl(src), dst); src += 4; dst += 4; count -= 4; } restup: while (count--) fb_writeb(fb_readb(src++), dst++); } else { dst = (unsigned long) d + count; src = (unsigned long) s + count; if ((count < 8) || ((dst ^ src) & 3)) goto restdown; if (dst & 1) { src--; dst--; count--; fb_writeb(fb_readb(src), dst); } if (dst & 2) { src -= 2; dst -= 2; count -= 2; fb_writew(fb_readw(src), dst); } while (count > 3) { src -= 4; dst -= 4; count -= 4; fb_writel(fb_readl(src), dst); } restdown: while (count--) { src--; dst--; fb_writeb(fb_readb(src), dst); } } return d;}static __inline__ void fast_memmove(char *d, const char *s, size_t count){ unsigned long dst, src; if (d < s) { dst = (unsigned long) d; src = (unsigned long) s; if ((count < 8) || ((dst ^ src) & 3)) goto restup; if (dst & 1) { fb_writeb(fb_readb(src++), dst++); count--; } if (dst & 2) { fb_writew(fb_readw(src), dst); src += 2; dst += 2; count -= 2; } while (count > 3) { fb_writel(fb_readl(src), dst); src += 4; dst += 4; count -= 4; } restup: while (count--) fb_writeb(fb_readb(src++), dst++); } else { dst = (unsigned long) d + count; src = (unsigned long) s + count; if ((count < 8) || ((dst ^ src) & 3)) goto restdown; if (dst & 1) { src--; dst--; count--; fb_writeb(fb_readb(src), dst); } if (dst & 2) { src -= 2; dst -= 2; count -= 2; fb_writew(fb_readw(src), dst); } while (count > 3) { src -= 4; dst -= 4; count -= 4; fb_writel(fb_readl(src), dst); } restdown: while (count--) { src--; dst--; fb_writeb(fb_readb(src), dst); } }}#endif /* !__i386__ */#endif /* !__mc68000__ */#endif /* _VIDEO_FBCON_H */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -