linux sse 头文件,gcc  嵌入汇编使用sse指令

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"

分享:

a4c26d1e5885305701be709a3d33442f.png喜欢

0

a4c26d1e5885305701be709a3d33442f.png赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

a4c26d1e5885305701be709a3d33442f.png

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值