⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inline.h

📁 libminigui-1.3.0.tar.gz。 miniGUI的库函数源代码!
💻 H
字号:
/*** $Id: inline.h,v 1.11 2003/08/12 07:46:18 weiym Exp $**** inline.h: Some inline functions.**** Copyright (c) 2003 Feynman Software.** Copyright (c) 1999 ~ 2002 Wei Yongming.**** Create date: 1999/4/21*/#ifndef GUI_INLINE_H    #define GUI_INLINE_H#include <string.h>#ifdef __cplusplusextern "C" {#endif  /* __cplusplus */#if defined(__GNUC__) && defined(i386)#define ASM_memset2(s, c, count)  \do {                            \    int eax, edi, ecx;          \    __asm__ __volatile__ (      \            "cld\n\t"           \            "rep\n\t"           \            "stosw"             \            : "=&D" (edi), "=&a" (eax), "=&c" (ecx) \            : "0"(s), "1"(c), "2"(count)            \            : "memory");        \} while (0)#define ASM_memset4(s, c, count)    \do {                                \    int eax, edi, ecx;              \    __asm__ __volatile__ (          \            "cld\n\t"               \            "rep\n\t"               \            "stosl"                 \            : "=&D" (edi), "=&a" (eax), "=&c" (ecx) \            : "0"(s), "1"(c), "2"(count)    \            : "memory");            \} while (0)#define ASM_memxorset(s, c, n)      \do {                                \    int ecx, edx, esi, edi;         \    __asm__ __volatile__ (          \            "cld\n\t"               \            "1:\n\t"                \            "lodsb\n\t"             \            "xorb %%dl, %%al\n\t"   \            "stosb\n\t"             \            "loop 1b\n\t"           \            : "=&D" (edi), "=&S" (esi), "=&c" (ecx), "=&d" (edx)    \            : "0" (s), "1" (s), "2" (n), "3" (c)    \            : "al");            \} while (0)#define ASM_memxorset2(s, c, n)     \do {                                \    int ecx, edx, esi, edi;         \    __asm__ __volatile__ (          \            "cld\n\t"               \            "1:\n\t"                \            "lodsw\n\t"             \            "xorw %%dx, %%ax\n\t"   \            "stosw\n\t"             \            "loop 1b\n\t"           \            : "=&D" (edi), "=&S" (esi), "=&c" (ecx), "=&d" (edx)    \            : "0" (s), "1" (s), "2" (n), "3" (c)    \            : "ax");            \} while (0)#define ASM_memxorset4(s, c, n)     \do {                                \    int ecx, edx, esi, edi;         \    __asm__ __volatile__ (          \            "cld\n\t"               \            "1:\n\t"                \            "lodsl\n\t"             \            "xorl %%edx, %%eax\n\t" \            "stosl\n\t"             \            "loop 1b\n\t"           \            : "=&D" (edi), "=&S" (esi), "=&c" (ecx), "=&d" (edx)    \            : "0" (s), "1" (s), "2" (n), "3" (c)    \            : "eax");            \} while (0)#define ASM_memandset4(s, c, n)     \do {                                \    int ecx, edx, esi, edi;         \    __asm__ __volatile__ (          \            "cld\n\t"               \            "1:\n\t"                \            "lodsl\n\t"             \            "andl %%edx, %%eax\n\t" \            "stosl\n\t"             \            "loop 1b\n\t"           \            : "=&D" (edi), "=&S" (esi), "=&c" (ecx), "=&d" (edx)    \            : "0" (s), "1" (s), "2" (n), "3" (c)    \            : "eax");            \} while (0)#define ASM_memorset4(s, c, n)      \do {                                \    int ecx, edx, esi, edi;         \    __asm__ __volatile__ (          \            "cld\n\t"               \            "1:\n\t"                \            "lodsl\n\t"             \            "orl %%edx, %%eax\n\t"  \            "stosl\n\t"             \            "loop 1b\n\t"           \            : "=&D" (edi), "=&S" (esi), "=&c" (ecx), "=&d" (edx)    \            : "0" (s), "1" (s), "2" (n), "3" (c)    \            : "eax");            \} while (0)#define ASM_memandcpy4(dst, src, n) \do {                                \    int edi, esi, ecx;              \    __asm__ __volatile__ (          \            "cld\n\t"               \            "1:\n\t"                \            "lodsl\n\t"             \            "andl %%eax, (%%edi)\n\t"   \            "addl $4, %%edi\n\t"    \            "loop 1b\n\t"           \            : "=&D" (edi), "=&S" (esi), "=&c" (ecx) \            : "0" (dst), "1" (src), "2" (n) \            : "eax");            \} while (0)#define ASM_memorcpy4(dst, src, n)  \do {                                \    int edi, esi, ecx;              \    __asm__ __volatile__ (          \            "cld\n\t"               \            "1:\n\t"                \            "lodsl\n\t"             \            "orl %%eax, (%%edi)\n\t"    \            "addl $4, %%edi\n\t"    \            "loop 1b\n\t"           \            : "=&D" (edi), "=&S" (esi), "=&c" (ecx) \            : "0" (dst), "1" (src), "2" (n) \            : "eax");            \} while (0)#define ASM_memxorcpy4(dst, src, n) \do {                                \    int edi, esi, ecx;              \    __asm__ __volatile__ (          \            "cld\n\t"               \            "1:\n\t"                \            "lodsl\n\t"             \            "xorl %%eax, (%%edi)\n\t"   \            "addl $4, %%edi\n\t"    \            "loop 1b\n\t"           \            : "=&D" (edi), "=&S" (esi), "=&c" (ecx) \            : "0" (dst), "1" (src), "2" (n) \            : "eax");            \} while (0)#if 0static inline void * __memset4(void *s, unsigned c, size_t count){    __asm__ __volatile__ (            "cld\n\t"            "rep\n\t"            "stosl"  : :       "a"(c), "D"(s), "c"(count)  :         "cx", "di");    return s;}static inline void * __memset3(void *s, int c, size_t count)/* count is in 24-bit pixels (3 bytes per pixel) */{    __asm__ __volatile__ (            "cmpl $8,%%edx\n\t"    /* "jmp 2f\n\t" *//* debug */            "jl 2f\n\t"            "movl %%eax,%%ebx\n\t"   /* eax = (low) BGR0 (high) */            "shll $24,%%ebx\n\t"     /* ebx = 000B */            "orl %%ebx,%%eax\n\t"    /* eax = BGRB */            "movl %%eax,%%ebx\n\t"            "shrl $8,%%ebx\n\t"      /* ebx = GRB0 */            "movl %%ebx,%%ecx\n\t"            "shll $24,%%ecx\n\t"     /* ecx = 000G */            "orl %%ecx,%%ebx\n\t"    /* ebx = GRBG */            "movl %%eax,%%ecx\n\t"            "shll $8,%%ecx\n\t"      /* ecx = 0BGR */            "movb %%bh,%%cl\n\t"     /* ecx = RBGR */            "cmpl $16,%%edx\n\t"            "jl 1f\n\t"            "jmp 5f\n\t"            ".align 4,0x90\n\t"            "5:\n\t"         /* loop unrolling */            "movl %%eax,(%%edi)\n\t"         /* write BGRB */            "movl %%ebx,4(%%edi)\n\t"        /* write GRBG */            "movl %%ecx,8(%%edi)\n\t"        /* write RBGR */            "movl %%eax,12(%%edi)\n\t"            "movl %%ebx,16(%%edi)\n\t"            "movl %%ecx,20(%%edi)\n\t"            "movl %%eax,24(%%edi)\n\t"            "movl %%ebx,28(%%edi)\n\t"            "movl %%ecx,32(%%edi)\n\t"            "movl %%eax,36(%%edi)\n\t"            "subl $16,%%edx\n\t"     /* blend end-of-loop instr. */            "movl %%ebx,40(%%edi)\n\t"            "movl %%ecx,44(%%edi)\n\t"            "addl $48,%%edi\n\t"            "cmpl $16,%%edx\n\t"            "jge 5b\n\t"            "andl %%edx,%%edx\n\t"            "jz 4f\n\t"      /* finished */            "cmpl $4,%%edx\n\t"            "jl 2f\n\t"      /* less than 4 pixels left */            "jmp 1f\n\t"            ".align 4,0x90\n\t"            "1:\n\t"            "movl %%eax,(%%edi)\n\t"         /* write BGRB */            "movl %%ebx,4(%%edi)\n\t"        /* write GRBG */            "movl %%ecx,8(%%edi)\n\t"        /* write RBGR */            "addl $12,%%edi\n\t"            "subl $4,%%edx\n\t"            "cmpl $4,%%edx\n\t"            "jge 1b\n\t"            "2:\n\t"            "cmpl $0,%%edx\n\t"      /* none left? */            "jle 4f\n\t"     /* finished */            "mov %%eax,%%ecx\n\t"            "shrl $16,%%ecx\n\t"     /* B in cl */            "3:\n\t"         /* write last few pixels */            "movw %%ax,(%%edi)\n\t"  /* write RG */            "movb %%cl,2(%%edi)\n\t"         /* write B */            "addl $3,%%edi\n\t"            "decl %%edx\n\t"            "jnz 3b\n\t"            "4:\n\t"  : :       "a"(c), "D"(s), "d"(count)  :         "ax", "bx", "cx", "dx", "di");    return s;}static inline void * __memset(void *s, char c, size_t count){   int d0;    __asm__ (       "cld\n\t"       "cmpl $12,%%edx\n\t"       "jl 1f\n\t" /* if (count >= 12) */       "movzbl %%al,%%ax\n\t"       "movl %%eax,%%ecx\n\t"       "shll $8,%%ecx\n\t" /* c |= c << 8 */       "orl %%ecx,%%eax\n\t"       "movl %%eax,%%ecx\n\t"       "shll $16,%%ecx\n\t" /* c |= c << 16 */       "orl %%ecx,%%eax\n\t"       "movl %%edx,%%ecx\n\t"       "negl %%ecx\n\t"       "andl $3,%%ecx\n\t" /* (-s % 4) */       "subl %%ecx,%%edx\n\t" /* count -= (-s % 4) */       "rep ; stosb\n\t" /* align to longword boundary */       "movl %%edx,%%ecx\n\t"       "shrl $2,%%ecx\n\t"       "rep ; stosl\n\t" /* fill longwords */       "andl $3,%%edx\n" /* fill last few bytes */       "1:\tmovl %%edx,%%ecx\n\t" /* <= 12 entry point */       "rep ; stosb\n\t"  :    "=&a"(d0)  :    "a"(c), "D"(s), "d"(count)  :    "eax", "ecx", "edx", "edi", "esi");    return s;}static inline void * __memset2(void *s, short c, size_t count)/* count is in 16-bit pixels *//* s is assumed to be 16-bit aligned */{    int eax, ecx, edi, edx;    __asm__ __volatile__ (            "cld\n\t"            "cmpl $12,%%edx\n\t"            "jl 1f\n\t"      /* if (count >= 12) */            "movzwl %%ax,%%eax\n\t"            "movl %%eax,%%ecx\n\t"            "shll $16,%%ecx\n\t"     /* c |= c << 16 */            "orl %%ecx,%%eax\n\t"            "movl %%edi,%%ecx\n\t"            "andl $2,%%ecx\n\t"      /* s & 2 */            "jz 2f\n\t"            "decl %%edx\n\t" /* count -= 1 */            "stosw\n\t"      /* align to longword boundary */            "2:\n\t"            "movl %%edx,%%ecx\n\t"            "shrl $1,%%ecx\n\t"            "rep ; stosl\n\t"        /* fill longwords */            "andl $1,%%edx\n"        /* one 16-bit word left? */            "jz 3f\n\t"      /* no, finished */            "1:\tmovl %%edx,%%ecx\n\t"       /* <= 12 entry point */            "rep ; stosw\n\t"            "3:\n\t"            : "=&D" (edi), "=&a" (eax), "=&c" (ecx), "=&d" (edx)            : "0" (s), "1" (c), "2" (count)            : "memory");    return s;}static inline void * __memcpy (void *to, const void *from, size_t n){   int d0;   __asm__ (            "cld\n\t"            "movl %%edi,%%ecx\n\t"            "andl $1,%%ecx\n\t"            "subl %%ecx,%%edx\n\t"            "rep ; movsb\n\t"   /* 16-bit align destination */            "movl %%edx,%%ecx\n\t"            "shrl $2,%%ecx\n\t"            "rep ; movsl\n\t"            "testb $1,%%dl\n\t"            "je 1f\n\t"            "movsb\n"            "1:\ttestb $2,%%dl\n\t"            "je 2f\n\t"            "movsw\n"            "2:\n"  :         "=&S"(d0)  :         "d"(n), "D"((long) to), "S"((long) from)  :         "eax", "ecx", "edi", "esi");    return (to);}static inline void *__memcpyf ( void * dest, void * src, long size ){ __asm__ __volatile__ (        "movl    %%ecx, %%eax\n\t"        "andl    $0xFFFFFFFC, %%ecx\n\t"        "shr     $2, %%ecx\n\t"        "rep;    movsl\n\t"        "movl    %%eax, %%ecx\n\t"        "andl    $3, %%ecx\n\t"        "rep;    movsb\n"        : : "S" ((unsigned long)src), "D" ((unsigned long)dest), "c" (size)        : "esi", "edi", "ecx", "eax" ); return dest;}static inline void *__memsetf ( void * dest, char c, long size ){ __asm__ __volatile__ (        "movl    %%ecx, %%edx\n\t"        "andl    $0xFFFFFFFC, %%ecx\n\t"        "shr     $2, %%ecx\n\t"        "rep;    stosl\n\t"        "movl    %%edx, %%ecx\n\t"        "andl    $3, %%ecx\n\t"        "rep;    stosb\n"        : : "D" ((unsigned long)dest), "b" ((unsigned long)c), "c" (size)        : "edi", "ecx", "eax", "edx" ); return dest;}#endif#endif /* defined(__GNUC__) && defined(i386) */#ifndef ASM_memcpy#define ASM_memcpy  memcpy#endif#ifndef ASM_memset#define ASM_memset  memset#endif#ifdef __cplusplus}#endif  /* __cplusplus */#endif  /* GUI_INLINE_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -