GCC中SIMD指令的应用方法--使用built-in操作
- UID
- 1066743
|
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还可以强制转换为通用数据。
|
|
|
|
|
|