第五步:测试(测试参考了下面的声明链接,只将v_test.s 里面的向量指令修改成了0.10版本对应的指令) 在桌面上新建v_test.s文件里面的内容为 #void #saxpy(size_t n, const float a, const float *x, float *y) # { # ??????size_t i; # ??????for (i=0; i<n; i++) ?y[i] = a * x[i] + y[i]; # } # ?register arguments: # ?????a0 ?????n # ?????fa0 ????a # ?????a1 ?????x # ?????a2 ?????y .global saxpy saxpy: ????????vsetvli a4, a0, e32, m8,ta,ma ????????vle32.v v0, (a1) ????????sub a0, a0, a4 ????????slli a4, a4, 2 ????????add a1, a1, a4 ????????vle32.v v8, (a2) ????????vfmacc.vf v8, fa0, v0 ????????vse32.v v8, (a2) ????????add a2, a2, a4 ????????bnez a0, saxpy ????????ret 保存 在桌面目录执行指令:riscv64-unknown-elf-as -march=rv64gcv --mabi=lp64d v_test.s -o v_test.o 会在桌面上看到生成的v_test.o文件 然后新建callsaxpy.c内容为: #include <stddef.h> #include <stdio.h> extern void ?saxpy(size_t n, const float a, const float *x, float *y); int main(){ ????????size_t size=3; ????????const float a=1.0; ????????const float array1[]={1.0,2.0,3.0}; ????????float array2[]={1.0,2.0,3.0}; ????????for(int i =0;i<size;i++){ ????????????????printf("%f\n", array2[i]); ????????} ????????printf("----------------\n"); ????????//调用saxpy函数 ????????saxpy(size,a,array1,array2); ????????for(int i =0;i<size;i++){ ????????????????printf("%f\n", array2[i]); ????????} ????????return 0; } 保存 执行指令:riscv64-unknown-elf-gcc -c callsaxpy.c -o callsaxpy.o 会在桌面上看到生成的callsaxpy.o文件 接着在桌面目录下执行:riscv64-unknown-elf-gcc -static v_test.o callsaxpy.o -o out 在桌面会看到生成的out可执行文件 最后:进入显示右边内容的目录 在此目录下执行:spike --isa=RV64GCV pk ../../../../../Desktop/out? ?//其实就是pk桌面目录的out文件 可以看到输出: 完成,测试证明支持rvv1.0版本指令。 |