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

GCC中SIMD指令的应用方法--嵌入汇编

GCC中SIMD指令的应用方法--嵌入汇编

GCC一开始就允许C代码中嵌入asm指令,并不只是针对MMX指令, 不过对于MMX技术,显然也是一个很好的利用方法, 详细的语法请参考GNU GCC手册 , 或者GCC: The Complete Reference ''Inline Assembly''一节。 如下是一个点积的例子:      
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
32
33
34
#include <stdio.h>
/** GCC -o ins  inlinemmx.c **/
int main(int argc,char *argv[])
{
  int i;
  int result;
  short a[] = {1, 2, 3, 4, 5, 6, 7, 8};
  short b[] = {1, 1, 1, 1, 1, 1, 1, 1};
  printf("...with MMX instructions...\n");
   
  /*首先,将点积合累积寄存器清零,实际缺省就为0?*/
  asm("pandn %%mm5,%%mm5;":;
  /*读入a, b,每四对数相乘后分两组相加,形成两组和*/
  /*这里的循环控制是C在做*/
  for(i = 0; i < sizeof(a)/sizeof(short); i += 4){
    asm("movq %0,%%mm0;\
    movq %1,%%mm1;\
    pmaddwd %%mm1,%%mm0;\
    paddd %%mm0,%%mm5; #相乘后相加 "
    :
    : "m" (a), "m" (b));
  }
  /*将两组和分离,并相加*/
  asm("movq %%mm5, %%mm0;\
  psrlq $32,%%mm5;\
  paddd %%mm0, %%mm5;\
  movd %%mm5,%0;\
  emms"
  :"=r" (result)
  ;
  printf("result: 0x%x\n", result);
  //这里结果为0x24
  return(0);
}




几点说明:
  • 这里是典型的在函数中C和汇编混合编程;
  • 注意汇编指令中操作数的顺序;
  • 这里可以直接使用movq等没有intrinsics/built-in对应的指令;
  • 注意在asm指令序列中间不要加杂注释,可能导致生成的代码不正确。
返回列表