Skip to content

Commit 5077d83

Browse files
authored
Use googletest to run tests (#20)
1 parent 3617681 commit 5077d83

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+396
-602
lines changed

.github/workflows/build_and_test.yml

+4-10
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ jobs:
5959

6060
- name: Create sysroot
6161
run: |
62-
sudo debootstrap --arch=riscv64 --verbose --include=fakeroot,symlinks --resolve-deps --variant=minbase --components=main,universe focal sysroot
62+
sudo debootstrap --arch=riscv64 --verbose --include=fakeroot,symlinks,googletest --resolve-deps --variant=minbase --components=main,universe jammy sysroot
6363
# Remove unused files to minimize cache
6464
sudo chroot sysroot symlinks -cr .
6565
sudo chown ${USER} -R sysroot
@@ -72,6 +72,7 @@ jobs:
7272
- name: Build
7373
shell: bash -ex -o pipefail {0}
7474
run: |
75+
export QEMU_LD_PREFIX=$(pwd)/sysroot
7576
cmake -S . -B build -GNinja \
7677
-DCMAKE_INSTALL_PREFIX="$(pwd)/install" \
7778
-DCMAKE_TOOLCHAIN_FILE=$(pwd)/CMakeToolchain/riscv.clang.cross.cmake \
@@ -115,11 +116,6 @@ jobs:
115116
path: sysroot
116117
key: sysroot-${{ hashFiles('./.github/workflows/build_and_test.yml') }}
117118

118-
- name: Install dependencies
119-
run: |
120-
sudo apt-get update -y -qq
121-
sudo apt-get install -y -qq libgmp-dev libmpfr-dev
122-
123119
- name: Download build artifacts
124120
uses: actions/download-artifact@v4
125121
with:
@@ -133,12 +129,10 @@ jobs:
133129
env:
134130
CTEST_OUTPUT_ON_FAILURE: "TRUE"
135131
run: |
136-
if [[ -n "${{ matrix.qemu_cpu }}" ]]; then
137-
export QEMU_CPU="${{ matrix.qemu_cpu }}"
138-
fi
132+
export QEMU_CPU="${{ matrix.qemu_cpu }}"
139133
export QEMU_LD_PREFIX=$(pwd)/sysroot
140134
cd build
141-
ctest -j$(nproc)
135+
ctest -j$(nproc) --output-on-failure
142136
143137
- name: Upload test-${{ strategy.job-index }} artifacts
144138
uses: actions/upload-artifact@v4

CMakeLists.txt

+93-87
Original file line numberDiff line numberDiff line change
@@ -3,107 +3,113 @@
33
# SPDX-License-Identifier: Apache-2.0
44

55
cmake_minimum_required(VERSION 3.22)
6-
project(veclibm C)
6+
project(veclibm C CXX)
77

8-
# Adds a test target
9-
include(CTest)
8+
option(VECLIBM_BUILD_TESTS "Build tests" ON)
9+
10+
if (VECLIBM_BUILD_TESTS)
11+
# Adds a test target
12+
include(CTest)
13+
14+
include(GoogleTest)
15+
16+
set(GTest_ROOT ${CMAKE_SYSROOT}/usr/src/googletest/googletest)
17+
add_subdirectory(${GTest_ROOT} "${CMAKE_CURRENT_BINARY_DIR}/googletest" EXCLUDE_FROM_ALL)
18+
endif()
1019

1120
set(PROJECT_SOURCES
12-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_acosD.c
13-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_acosDI.c
14-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_acospiD.c
15-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_acospiDI.c
16-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_asinD.c
17-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_asinDI.c
18-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_asinpiD.c
19-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_asinpiDI.c
20-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_atanD.c
21-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_atanDI.c
22-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_atanpiD.c
23-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_atanpiDI.c
24-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_atan2D.c
25-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_atan2DI.c
26-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_atan2piD.c
27-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_atan2piDI.c
28-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_acoshD.c
29-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_acoshDI.c
30-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_asinhD.c
31-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_asinhDI.c
32-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_atanhD.c
33-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_atanhDI.c
34-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_cbrtD.c
35-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_cbrtDI.c
36-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_cdfnormD.c
37-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_cdfnormDI.c
38-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_erfD.c
39-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_erfDI.c
40-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_erfcD.c
41-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_erfcDI.c
42-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_expD_tbl.c
43-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_expD.c
44-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_expDI.c
45-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_exp2D.c
46-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_exp2DI.c
47-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_exp10D.c
48-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_exp10DI.c
49-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_expm1D.c
50-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_expm1DI.c
51-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_logD_tbl.c
52-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_logD.c
53-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_logDI.c
54-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_log2D.c
55-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_log2DI.c
56-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_log10D.c
57-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_log10DI.c
58-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_log1pD.c
59-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_log1pDI.c
60-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_powD_tbl.c
61-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_powD.c
62-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_powDI.c
63-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_2ovpi_tbl.c
64-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_cosD.c
65-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_cosDI.c
66-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_cospiD.c
67-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_cospiDI.c
68-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_sinD.c
69-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_sinDI.c
70-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_sinpiD.c
71-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_sinpiDI.c
72-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_sincosD.c
73-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_sincosDI.c
74-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_sincospiD.c
75-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_sincospiDI.c
76-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_tanD.c
77-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_tanDI.c
78-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_tanpiD.c
79-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_tanpiDI.c
80-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_coshD.c
81-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_coshDI.c
82-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_sinhD.c
83-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_sinhDI.c
84-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_tanhD.c
85-
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_tanhDI.c
21+
src/rvvlm_acosD.c
22+
src/rvvlm_acosDI.c
23+
src/rvvlm_acospiD.c
24+
src/rvvlm_acospiDI.c
25+
src/rvvlm_asinD.c
26+
src/rvvlm_asinDI.c
27+
src/rvvlm_asinpiD.c
28+
src/rvvlm_asinpiDI.c
29+
src/rvvlm_atanD.c
30+
src/rvvlm_atanDI.c
31+
src/rvvlm_atanpiD.c
32+
src/rvvlm_atanpiDI.c
33+
src/rvvlm_atan2D.c
34+
src/rvvlm_atan2DI.c
35+
src/rvvlm_atan2piD.c
36+
src/rvvlm_atan2piDI.c
37+
src/rvvlm_acoshD.c
38+
src/rvvlm_acoshDI.c
39+
src/rvvlm_asinhD.c
40+
src/rvvlm_asinhDI.c
41+
src/rvvlm_atanhD.c
42+
src/rvvlm_atanhDI.c
43+
src/rvvlm_cbrtD.c
44+
src/rvvlm_cbrtDI.c
45+
src/rvvlm_cdfnormD.c
46+
src/rvvlm_cdfnormDI.c
47+
src/rvvlm_erfD.c
48+
src/rvvlm_erfDI.c
49+
src/rvvlm_erfcD.c
50+
src/rvvlm_erfcDI.c
51+
src/rvvlm_expD_tbl.c
52+
src/rvvlm_expD.c
53+
src/rvvlm_expDI.c
54+
src/rvvlm_exp2D.c
55+
src/rvvlm_exp2DI.c
56+
src/rvvlm_exp10D.c
57+
src/rvvlm_exp10DI.c
58+
src/rvvlm_expm1D.c
59+
src/rvvlm_expm1DI.c
60+
src/rvvlm_logD_tbl.c
61+
src/rvvlm_logD.c
62+
src/rvvlm_logDI.c
63+
src/rvvlm_log2D.c
64+
src/rvvlm_log2DI.c
65+
src/rvvlm_log10D.c
66+
src/rvvlm_log10DI.c
67+
src/rvvlm_log1pD.c
68+
src/rvvlm_log1pDI.c
69+
src/rvvlm_powD_tbl.c
70+
src/rvvlm_powD.c
71+
src/rvvlm_powDI.c
72+
src/rvvlm_2ovpi_tbl.c
73+
src/rvvlm_cosD.c
74+
src/rvvlm_cosDI.c
75+
src/rvvlm_cospiD.c
76+
src/rvvlm_cospiDI.c
77+
src/rvvlm_sinD.c
78+
src/rvvlm_sinDI.c
79+
src/rvvlm_sinpiD.c
80+
src/rvvlm_sinpiDI.c
81+
src/rvvlm_sincosD.c
82+
src/rvvlm_sincosDI.c
83+
src/rvvlm_sincospiD.c
84+
src/rvvlm_sincospiDI.c
85+
src/rvvlm_tanD.c
86+
src/rvvlm_tanDI.c
87+
src/rvvlm_tanpiD.c
88+
src/rvvlm_tanpiDI.c
89+
src/rvvlm_coshD.c
90+
src/rvvlm_coshDI.c
91+
src/rvvlm_sinhD.c
92+
src/rvvlm_sinhDI.c
93+
src/rvvlm_tanhD.c
94+
src/rvvlm_tanhDI.c
8695
)
8796

8897
add_library(vecm
8998
${PROJECT_SOURCES}
9099
)
91100

92101
target_include_directories(vecm
93-
PRIVATE
94-
${CMAKE_CURRENT_SOURCE_DIR}/include
102+
PUBLIC
103+
include
95104
)
96105

97106
target_compile_options(vecm
98107
PUBLIC
99108
$<$<COMPILE_LANGUAGE:C>:-std=c11>
100109
)
101110

102-
set(CMAKE_BUILD_TYPE "Release"
103-
CACHE STRING
104-
"The type of build to perform. Choose from [Release, Debug, RelWithDebInfo]"
105-
)
106-
107-
# Add tests as well. Split this out into its own file. This means that the tests
108-
# are in a 'test' subdirectory of the current build directory
109-
add_subdirectory(test)
111+
if (VECLIBM_BUILD_TESTS)
112+
# Add tests as well. Split this out into its own file. This means that the tests
113+
# are in a 'test' subdirectory of the current build directory
114+
add_subdirectory(test)
115+
endif()

README.md

+41
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,44 @@ We sometimes provide multiple implementations for a single function as each may
2222

2323
A simple test program test_funcs.c uses the existing long double function as a reference. At this point we only aim to develop double-precision (and perhaps single-precision) functions, thus testing their accuracy with long-double function is deemed sufficient.
2424

25+
# Building & Testing
26+
27+
The veclibm project is built and tested on GitHub Actions. See `.github/workflows/build_and_test.yml` for reference.
28+
29+
## Cross-compiling
30+
31+
First, a sysroot is required with appropriate dependencies installed in it. For veclibm the following command will set up a sysroot:
32+
```
33+
sudo debootstrap --arch=riscv64 --verbose --include=fakeroot,symlinks,googletest --resolve-deps --variant=minbase --components=main,universe jammy sysroot
34+
```
35+
36+
Then, assuming you've the necessary toolchains installed (refer to the [GHA workflow file](https://github.com/rivosinc/veclibm/blob/main/.github/workflows/build_and_test.yml) for versions and steps), veclibm is built with the following command:
37+
```
38+
cmake -S . -B build -DCMAKE_INSTALL_PREFIX="$(pwd)/install" -DCMAKE_TOOLCHAIN_FILE=$(pwd)/CMakeToolchain/riscv.clang.cross.cmake -DCMAKE_SYSROOT=$(pwd)/sysroot
39+
```
40+
41+
Finally, veclibm is built with:
42+
```
43+
cmake --build build
44+
```
45+
46+
This will build the `libvecm.so` library as well as the tests.
47+
48+
## Testing
49+
50+
_The following steps take the assumption the user is cross-compiling and using QEMU to execute the riscv64 binary on your host machine._
51+
52+
The easiest is to simply run `test/test_veclibm`:
53+
```
54+
QEMU_CPU=rv64,zba=true,zbb=true,zbs=true,v=true QEMU_LD_PREFIX=$(pwd)/sysroot build/test/test_veclibm
55+
```
56+
57+
To run only a specific test, for example the `erf.test`, the user can filter with:
58+
```
59+
QEMU_CPU=rv64,zba=true,zbb=true,zbs=true,v=true QEMU_LD_PREFIX=$(pwd)/sysroot build/test/test_veclibm --gtest_filter=erf.test
60+
```
61+
62+
Refer to the help for more options:
63+
```
64+
QEMU_CPU=rv64,zba=true,zbb=true,zbs=true,v=true QEMU_LD_PREFIX=$(pwd)/sysroot build/test/test_veclibm --help
65+
```

include/rvvlm_fp.inc.h

+27-21
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22
//
33
// SPDX-License-Identifier: Apache-2.0
44

5+
#ifndef __VECLIBM_RVVLM_FP_INC_H
6+
#define __VECLIBM_RVVLM_FP_INC_H
7+
#else
8+
#warning "are you sure you want to include this file multiple times?"
9+
#endif
10+
511
#include <assert.h>
612

713
#ifndef _GNU_SOURCE
@@ -189,31 +195,31 @@ static_assert(false, "API_SIGNATURE ill or undefined" __FILE__);
189195
#define VMVU_VX MAKE_FUNC(__riscv_vmv_v_x_u)
190196
#define VFMV_VF MAKE_FUNC(__riscv_vfmv_v_f_f)
191197

192-
const INT int_Zero = 0;
193-
const UINT uint_Zero = 0;
198+
static const INT int_Zero = 0;
199+
static const UINT uint_Zero = 0;
194200

195201
#if (BIT_WIDTH == 64)
196202
#define EXP_BIAS 1023
197203
#define MAN_LEN 52
198-
const uint64_t class_sNaN = 0x100;
199-
const uint64_t class_qNaN = 0x200;
200-
const uint64_t class_NaN = 0x300;
201-
const uint64_t class_negInf = 0x1;
202-
const uint64_t class_posInf = 0x80;
203-
const uint64_t class_Inf = 0x81;
204-
const uint64_t class_negZero = 0x8;
205-
const uint64_t class_posZero = 0x10;
206-
const uint64_t class_Zero = 0x18;
207-
const uint64_t class_negDenorm = 0x4;
208-
const uint64_t class_posDenorm = 0x20;
209-
const uint64_t class_Denorm = 0x24;
210-
const uint64_t class_negNormal = 0x2;
211-
const uint64_t class_posNormal = 0x40;
212-
const uint64_t class_Normal = 0x42;
213-
const uint64_t class_negative = 0x7;
214-
const uint64_t class_positive = 0xe0;
215-
const uint64_t class_finite_neg = 0x06;
216-
const uint64_t class_finite_pos = 0x60;
204+
static const uint64_t class_sNaN = 0x100;
205+
static const uint64_t class_qNaN = 0x200;
206+
static const uint64_t class_NaN = 0x300;
207+
static const uint64_t class_negInf = 0x1;
208+
static const uint64_t class_posInf = 0x80;
209+
static const uint64_t class_Inf = 0x81;
210+
static const uint64_t class_negZero = 0x8;
211+
static const uint64_t class_posZero = 0x10;
212+
static const uint64_t class_Zero = 0x18;
213+
static const uint64_t class_negDenorm = 0x4;
214+
static const uint64_t class_posDenorm = 0x20;
215+
static const uint64_t class_Denorm = 0x24;
216+
static const uint64_t class_negNormal = 0x2;
217+
static const uint64_t class_posNormal = 0x40;
218+
static const uint64_t class_Normal = 0x42;
219+
static const uint64_t class_negative = 0x7;
220+
static const uint64_t class_positive = 0xe0;
221+
static const uint64_t class_finite_neg = 0x06;
222+
static const uint64_t class_finite_pos = 0x60;
217223

218224
static const double fp_sNaN = __builtin_nans("");
219225
static const double fp_qNaN = __builtin_nan("");

0 commit comments

Comments
 (0)