首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

GCC中SIMD指令的应用方法--使用built-in操作

GCC中SIMD指令的应用方法--使用built-in操作

使用built-in操作 ...GCC built-in Operation 什么是built-in操作?就是对待MMX操作数,就如int, float等基本数据类型一般, 有相应定义的操作,如加(+)、减(-),或者数据类型之间的转换。 详细内容参考GNU GCC Manual  Extensions to the C Language Family4#4Built-in Functions4#4 X86 Built-in Functions一节。      
一些MMX指令有其相应的built-in操作, 下面一段代码为例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
/*无需特别的头文件,built-in嘛*/
/* gcc -Wall  -o bins  builtinmmx.c*/
/*定义了一个vector数据类型,hi表示16位,4表示4个*/
typedef int v4hi __attribute__ ((mode(V4HI)));
/*定义了2个32位的vector类型,si表示32位*/
typedef int v2si __attribute__ ((mode(V2SI)));
int main(int argc,char *argv[])
{
  short pa[4] = {0x8000, 0x8000, 1, -1};
  short pb[4] = {0x8000, 0x7FFF, -1, -2};
   
  v4hi va, vb;
  v4hi vsum;
   
  va = ((v4hi*)pa)[0];
  vb = ((v4hi*)pb)[0];
   
  /* 4个16位进行饱和加 */
  //vsum = __builtin_ia32_paddsw(va, vb);
  /* 4个16位还可以直接进行加法,但不同于两个long long相加 */
  vsum =  va + vb;
   
  /*vector的输出还需要强制转换为long long*/
  printf("...with MMX instructions...to compute vec_add: %llx \n", (long long)vsum);
   
  //结果1:0xfffd0000ffff8000
  //结果2:0xfffd0000ffff0000
   
  return(0);
}




几点说明:
  • 是的,这里built-in vector及其操作,随着GCC的发展正在加强。如果需要使用以上范例,应使用GCC 3.4以上版本;
  • 使用builtin函数时,与intrinsic相似;但本质却是不同,这里两个向量使用‘+’操作就说明了vector也如其它数据类型一样,编译器直接支持,只不过这里的加法就是指四个单元数分别相加,低位单元的进位不会影响相邻高位单元的数据;
  • vector还可以强制转换为通用数据。
返回列表