From 6ff9d9ccd5ca909f4a42ef48a0d466e5b4ad1d53 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Sun, 25 Jan 2026 14:03:33 -0800 Subject: [PATCH] Add simple vector extension test to CI --- ci-tests/test-spike | 2 ++ ci-tests/vector-sum.c | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 ci-tests/vector-sum.c diff --git a/ci-tests/test-spike b/ci-tests/test-spike index ebec4c63..780d721b 100755 --- a/ci-tests/test-spike +++ b/ci-tests/test-spike @@ -26,6 +26,7 @@ riscv64-linux-gnu-gcc -static -O2 -o hello $CI/hello.c riscv64-linux-gnu-gcc -static -O2 -o dummy-slliuw $CI/dummy-slliuw.c riscv64-linux-gnu-gcc -static -O2 -o customcsr $CI/customcsr.c riscv64-linux-gnu-gcc -static -O2 -o atomics $CI/atomics.c +riscv64-linux-gnu-gcc -static -O2 -march=rv64gcv -o vector-sum $CI/vector-sum.c # run snippy-based tests wget https://github.com/syntacore/snippy/releases/download/snippy-2.1/snippy-x86_64-linux.tar.xz @@ -45,6 +46,7 @@ g++ -std=c++2a -I$INSTALL/include -L$INSTALL/lib $CI/testlib.cc -lriscv -o /dev/ # run tests time $INSTALL/bin/spike --isa=rv64gc $BUILD/pk/pk hello | grep "Hello, world! Pi is approximately 3.141588." +time $INSTALL/bin/spike --isa=rv64gcv $BUILD/pk/pk vector-sum | grep "The sum of the first 1000 positive integers is 500500." $INSTALL/bin/spike --log-commits --isa=rv64gc $BUILD/pk/pk atomics 2> /dev/null | grep "First atomic counter is 1000, second is 100" LD_LIBRARY_PATH=$INSTALL/lib ./test-libriscv $BUILD/pk/pk hello | grep "Hello, world! Pi is approximately 3.141588." LD_LIBRARY_PATH=$INSTALL/lib ./test-customext $BUILD/pk/pk dummy-slliuw | grep "Executed successfully" diff --git a/ci-tests/vector-sum.c b/ci-tests/vector-sum.c new file mode 100644 index 00000000..0fc58ea6 --- /dev/null +++ b/ci-tests/vector-sum.c @@ -0,0 +1,27 @@ +#include +#include +#include + +int main() +{ + const size_t N = 1001; + volatile int a[N]; + int* b = (int*)a; + + for (size_t i = 0; i < N; i++) + a[i] = i; + + vint32m8_t vsum = __riscv_vmv_v_x_i32m8(0, -1); + for (size_t i = 0; i < N; ) { + size_t vl = __riscv_vsetvl_e32m8(N - i); + vint32m8_t v = __riscv_vle32_v_i32m8(b + i, vl); + vsum = __riscv_vadd_vv_i32m8(vsum, v, vl); + i += vl; + } + vint32m1_t vzero = __riscv_vmv_v_x_i32m1(0, 1); + int sum = __riscv_vmv_x_s_i32m1_i32(__riscv_vredsum_vs_i32m8_i32m1(vsum, vzero, -1)); + + printf("The sum of the first %zu positive integers is %d.\n", N - 1, sum); + + return 0; +}