我正试图围绕如何使用GCC的内联汇编添加,乘法或实现任意数量的POWER8向量指令。希望这里有人可以举几个例子来看看GCC内联汇编的背景 - 我专门针对POWER ISA。任何教程或进一步阅读的链接都非常感谢!
所以,我对编写任何程序集都很陌生,我开始阅读IBM内联汇编教程,但它们只涵盖了加载存储和操作立即值的基本情况,我没有找到任何与向量指令有关的内容。我在追求什么。
假设我有2个输入数组v1,v2和1个输出数组v3,我想用向量指令添加它们,它看起来像什么?
我有类似的东西:
int main(void)
{
float v1[8];
float v2[8];
float v3[8];
int i=0;
for (i=0; i<8; i++) {
v1[i] = 1.1;
v2[i] = 3.3;
v3[i] = 0.0;
printf("%.2f %.2f %.2f\n", v1[i], v2[i], v3[i]);
}
__asm__("before:");
__asm__("vaddfp %0,%1,%2\n\t"
: "=wf"(v3[0])
: "wf"(v1[0]), "wf"(v2[0]));
__asm__("vaddfp %0,%1,%2\n\t"
: "=wf"(v3[4])
: "wf"(v1[4]), "wf"(v2[4]));
__asm__("after:");
for (i=0; i<8; i++) {
printf("\n%.2f %.2f %.2f\n", v1[i], v2[i], v3[i]);
}
return 0;
}
这实际上确实修改了v3 [0,4],但所有其他区域都保持不变。
编辑: 事实证明我使用了错误的约束和错误的指令。 下面的代码完成了我设想的,使用向量指令添加两个向量示例。
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
float *sv1, *sv2, *sv3;
sv1 = calloc(4, sizeof(float));
sv2 = calloc(4, sizeof(float));
sv3 = calloc(4, sizeof(float));
vector float *v1;
vector float *v2;
vector float *v3;
v1 = (vector float*) &(sv1[0]);
v2 = (vector float*) &(sv2[0]);
v3 = (vector float*) &(sv3[0]);
long i=0;
/* populate the data */
printf("before\n");
for (i=0; i<4; i++) {
sv1[i] = 1.1;
sv2[i] = 2.2;
sv3[i] = 0.0;
printf("%.2f %.2f %.2f\n", sv1[i], sv2[i], sv3[i]);
}
__asm__("before:");
__asm__("xvaddsp %0,%1,%2\n\t"
: "=wf"(v3[0])
: "wf"(v1[0]), "wf"(v2[0]));
__asm__("after:");
printf("after\n");
for (i=0; i<4; i++) {
printf("%.2f %.2f %.2f\n", sv1[i], sv2[i], sv3[i]);
}
return 0;
}