Board logo

标题: GCC中SIMD指令的应用方法--嵌入汇编 [打印本页]

作者: look_w    时间: 2018-5-9 20:01     标题: 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);
}




几点说明:





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0