关于GCC下使用内建的多媒体指令集(MMX、SSE)函数

 在VC2005以上版本(包括2005)有非常丰富的针对x86架构处理器指令集的内建函数,包括典型的BFS、RDTSC、以及MMX、3DNOW!(+)、SSE、SSE2。到VC2008以后又支持了SSE3、SSSE3、以及SSE4A、SSE4.1和SSE4.2。

然而,当这些搬到GCC上时用起来就显得十分麻烦。下面我就先举一个VC2008上的例子:

 

还是相同的代码,放到GCC上看看:

上述两段代码的输出结果均为0xab00ff00。

 

VC代码没什么可讲,这里主要谈一下GCC的代码。

首先,最上面的三个类型定义是定义向量数据类型。v8qi表示向量有8个单元,并且每个单元都占用1个字节。这里比较奇怪的是这些基本类型的定义GCC没有默认支持也没有放在某个特定的头文件中。这样要去一个个定义也是比较麻烦的。

然后,由于很多操作所基于的单元大小是不同的,比如说PADDB的每个单元是1个字节,而PADDW就是2个字节,因此在要做其它与变量定义不同的单元个数的操作时需要进行类型转换。可以看到上面有很多类型转换。

另外还有一点比较讨厌的是GCC没有提供MOVD这样的基本操作,使得基本类型与向量类型直接的转换也比较麻烦。这里的做法是直接通过访问变量地址,这样做会带来性能上的降低。不过目前也没有其它什么好的办法。

不过幸好GCC的内联汇编功能很强,我对于GCC在这方面的做法还是非常看好的。所以本人基于GCC的内联汇编的便利性以及灵活性自己定义了一套常用的MMX以及SSE的指令访问接口:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值