gcc 嵌入汇编使用sse指令
(2012-04-10 02:48:59)
标签:
杂谈
gcc 嵌入汇编使用sse指令如下指令有什么问题?
float root = 0.f;
float x = 0;
__asm__ __volatile__(
"sqrtss %X1, %%xmm0\n\t"
"movss %%xmm0, %X0\n\t"
: "=X" (root)
: "X" (x)
: "%xmm0"
);
我编译的时候爆出“error: unknown register name '%xmm0' in 'asm'”
是不是xmm0寄存器不能用在嵌入汇编的“修改”部分,即第2各冒号的右边 ?用intrinsics吧回复 #1 UnixStudier
的帖子好像这个问题很普遍,应该是xmm0寄存器不能用在嵌入汇编的“修改”部分gcc默认的CPU是什么?也许是386memcpy.c
#include
#include
#include
#include
#include
#include "memcpy.h"
#include "cpu_accel.h"
#if defined (ARCH_X86) || defined (ARCH_X86_64) || defined
(ARCH_PPC) || (SIZEOF_LONG == 8)
# define RUN_BENCHMARK1
#else
# define RUN_BENCHMARK0
#endif
#if defined (ARCH_X86) || defined (ARCH_X86_64)
#define small_memcpy(to,from,n)\
{\
register unsigned long int dummy;\
__asm__ __volatile__(\
"rep; movsb"\
:"=&D"(to),
"=&S"(from),
"=&c"(dummy)\
:"0" (to),
"1"
(from),"2" (n)\
: "memory");\
}
static inline void * __memcpy(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,�\n\t"
"je 1f\n\t"
"movsw\n"
"1:\ttestb $1,�\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);
}
#ifdef USE_MMX
#define MMX_MMREG_SIZE 8
#define MMX1_MIN_LEN 0x800
#define MIN_LEN 0x40
static 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;
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&=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"
分享:
喜欢
0
赠金笔
加载中,请稍候......
评论加载中,请稍候...
发评论
登录名: 密码: 找回密码 注册记住登录状态
昵 称:
评论并转载此博文
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。