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

📄 memops.h

📁 libminigui-1.3.0.tar.gz。 miniGUI的库函数源代码!
💻 H
字号:
/*** $Id: memops.h,v 1.4 2003/09/04 03:40:35 weiym Exp $**  ** Copyring (C) 2003 Feynman Software.** Copyring (C) 2001 ~ 2002 Wei Yongming.**** SDL - Simple DirectMedia Layer** Copyright (C) 1997 ~ 2001  Sam Lantinga (slouken@devolution.com)**** Port to MiniGUI by Wei Yongming (2001/10/03).*/#ifndef _GAL_memops_h#define _GAL_memops_h/* System dependent optimized memory manipulation routines:*/#include <string.h>#if defined(__GNUC__) && defined(i386)/* Thanks to Brennan "Bas" Underwood, for the inspiration. :) */#define GAL_memcpy(dst, src, len)					  \do {									  \	int u0, u1, u2;						  \	__asm__ __volatile__ (						  \		"cld\n\t"						  \		"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" (u0), "=&D" (u1), "=&S" (u2)			  \		: "0" ((unsigned)(len)/4), "q" (len), "1" (dst),"2" (src) \		: "memory" );						  \} while(0)#define GAL_memcpy4(dst, src, len)				\do {								\	int ecx, edi, esi;					\	__asm__ __volatile__ (					\		"cld\n\t"					\		"rep ; movsl"					\		: "=&c" (ecx), "=&D" (edi), "=&S" (esi)		\		: "0" ((unsigned)(len)), "1" (dst), "2" (src)	\		: "memory" );					\} while(0)#define GAL_revcpy(dst, src, len)			\do {							\	int u0, u1, u2;					\	char *dstp = (char *)(dst);			\	char *srcp = (char *)(src);			\	int n = (len);					\	if ( n >= 4 ) {					\	__asm__ __volatile__ (				\		"std\n\t"				\		"rep ; movsl\n\t"			\		: "=&c" (u0), "=&D" (u1), "=&S" (u2)	\		: "0" (n >> 2),				\		  "1" (dstp+(n-4)), "2" (srcp+(n-4))	\		: "memory" );				\	}						\	switch (n & 3) {				\		case 3: dstp[2] = srcp[2];		\		case 2: dstp[1] = srcp[1];		\		case 1: dstp[0] = srcp[0];		\			break;				\		default:				\			break;				\	}						\} while(0)#define GAL_memmove(dst, src, len)			\do {							\	if ( (dst) < (src) ) {				\		GAL_memcpy((dst), (src), (len));	\	} else {					\		GAL_revcpy((dst), (src), (len));	\	}						\} while(0)#define GAL_memset4(dst, val, len)				\do {								\	int u0, u1, u2;					\	__asm__ __volatile__ (					\		"cld\n\t"					\		"rep ; stosl\n\t"				\		: "=&D" (u0), "=&a" (u1), "=&c" (u2)		\		: "0" (dst), "1" (val), "2" ((Uint32)(len))	\		: "memory" );					\} while(0)#endif /* GNU C and x86 *//* If there are no optimized versions, define the normal versions */#ifndef GAL_memcpy#define GAL_memcpy(dst, src, len)	memcpy(dst, src, len)#endif#ifndef GAL_memcpy4#define GAL_memcpy4(dst, src, len)	memcpy(dst, src, (len) << 2)#endif#ifndef GAL_revcpy#define GAL_revcpy(dst, src, len)	memmove(dst, src, len)#endif#ifndef GAL_memset4#define GAL_memset4(dst, val, len)		\do {						\	unsigned _count = (len);		\	unsigned _n = (_count + 3) / 4;		\	Uint32 *_p = (Uint32 *)(dst);		\	Uint32 _val = (val);			\        switch (_count % 4) {			\        case 0: do {    *_p++ = _val;		\        case 3:         *_p++ = _val;		\        case 2:         *_p++ = _val;		\        case 1:         *_p++ = _val;		\		} while ( --_n );		\	}					\} while(0)#endif#endif /* _GAL_memops_h */

⌨️ 快捷键说明

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