我正在使用 RISC-V 汇编语言和 GNU C 内联 asm 实现 3*3 矩阵和 3*1 矩阵乘法。
// description: matrix multiply with two-level for loop
#include<stdio.h>
int main()
{
int f,i=0;
int h[9]={0}, x[3]={0}, y[3]={0};
FILE *input = fopen("../input/3.txt","r");
for(i = 0; i<9; i++) fscanf(input, "%d", &h[i]);
for(i = 0; i<3; i++) fscanf(input, "%d", &x[i]);
for(i = 0; i<3; i++) fscanf(input, "%d", &y[i]);
fclose(input);
int *p_x = &x[0] ;
int *p_h = &h[0] ;
int *p_y = &y[0] ;
for (i = 0 ; i < 3; i++)
{
p_x = &x[0] ;
/*
for (f = 0 ; f < 3; f++)
*p_y += *p_h++ * *p_x++ ;
*/
for (f = 0 ; f < 3; f++){
asm volatile (
"addi t0, zero, 2\n\t"
"bne t0, %[f], Multi\n\t"
"mul t1, %[sp_h], %[sp_x]\n\t"
"add %[sp_y], %[sp_y], t1\n\t"
"addi %[p_h], %[p_h], 4\n\t"
"addi %[p_x], %[p_x], 4\n\t"
"addi %[p_y], %[p_y], 4\n\t"
"beq zero, zero, Exit\n\t"
"Multi: \n\t"
"mul t1, %[sp_h], %[sp_x]\n\t"
"add %[sp_y], %[sp_y], t1\n\t"
"addi %[p_h], %[p_h], 4\n\t"
"addi %[p_x], %[p_x], 4\n\t"
"Exit: \n\t"
:[p_y] "+&r"(p_y),
[p_x] "+&r"(p_x),
[p_h] "+&r"(p_h),
[sp_y] "+&r"(*p_y)
:[sp_h] "r"(*p_h),
[sp_x] "r"(*p_x),
[f] "r"(f)
:"t0","t1"
);
printf("x value=%d, h value=%d, y value=%d, y address=%d\n", *p_x, *p_h, *p_y, p_y);
}
}
p_y = &y[0];
for(i = 0; i<3; i++)
printf("%d \n", *p_y++);
return(0) ;
}
我要转这个评论
for (f = 0 ; f < 3; f++)
*p_y += *p_h++ * *p_x++ ;
p_y++;
进入 asm volatile(...),但是上面的 asm 代码我遇到了这个问题: 看起来
p_y
地址添加正确,我的乘法正确,但我存储到内存中的值是错误的。它存储到内存中的速度太快了,现在我的答案将以前的答案加在一起。上面的代码答案是5 28 69
有人可以帮助我吗?
我已经将 "+r"
编辑为 "+&r"
并将代码添加到代码中,但它不起作用。
顺便说一下,我从这段代码中得到了正确答案:
for (f = 0 ; f < 3; f++)
asm volatile ("mul %[tmp], %[sp_h], %[sp_x]\n\t"
"add %[sp_y], %[sp_y], %[tmp]\n\t"
"addi %[p_x], %[p_x], 4\n\t"
"addi %[p_h], %[p_h], 4\n\t"
:[tmp] "=r"(tmp),
[p_x] "+r"(p_x),
[p_h] "+r"(p_h),
[sp_y] "+r"(*p_y)
:[sp_h] "r"(*p_h),
[sp_x] "r"(*p_x)
);
p_y++;
期待
14
32
50
求答案。 这是输入数据:
1 2 3 4 5 6 7 8 9
1 2 3
0 0 0