Skip to content

Commit cf15f40

Browse files
authored
Merge pull request #316 from SChernykh/rvv
RISC-V: Added vector and hardware AES support
2 parents 1049447 + f7c3a9c commit cf15f40

26 files changed

+2939
-35
lines changed

.github/workflows/c-cpp.yml

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
- {arch: armhf, branch: latest-stable}
2121
- {arch: armv7, branch: latest-stable}
2222
- {arch: ppc64le, branch: latest-stable}
23-
- {arch: riscv64, branch: edge}
23+
- {arch: riscv64, branch: latest-stable}
2424
- {arch: s390x, branch: latest-stable}
2525

2626
steps:
@@ -45,7 +45,7 @@ jobs:
4545
run: |
4646
mkdir build
4747
cd build
48-
cmake ..
48+
cmake .. -DCMAKE_BUILD_TYPE=Release -DARCH=native
4949
make -j$(nproc)
5050
5151
- name: Run tests
@@ -61,8 +61,7 @@ jobs:
6161
strategy:
6262
matrix:
6363
config:
64-
- {os: ubuntu-20.04, c: gcc-11, cpp: g++-11}
65-
- {os: ubuntu-22.04, c: gcc-12, cpp: g++-12}
64+
- {os: ubuntu-24.04, c: gcc-14, cpp: g++-14}
6665

6766
steps:
6867
- name: Install dependencies
@@ -165,7 +164,7 @@ jobs:
165164

166165
strategy:
167166
matrix:
168-
os: [macos-13, macos-14, macos-15]
167+
os: [macos-14, macos-15]
169168

170169
steps:
171170
- name: Checkout repository
@@ -197,13 +196,13 @@ jobs:
197196
os:
198197
- name: freebsd
199198
architecture: x86-64
200-
version: '13.2'
201-
host: ubuntu-22.04
199+
version: '13.3'
200+
host: ubuntu-latest
202201

203202
- name: freebsd
204203
architecture: arm64
205-
version: '13.2'
206-
host: ubuntu-22.04
204+
version: '13.3'
205+
host: ubuntu-latest
207206

208207
steps:
209208
- name: Checkout repository
@@ -212,11 +211,13 @@ jobs:
212211
submodules: recursive
213212

214213
- name: Build RandomX
215-
uses: cross-platform-actions/action@v0.19.0
214+
uses: cross-platform-actions/action@v0.24.0
216215
with:
217216
operating_system: ${{ matrix.os.name }}
218217
architecture: ${{ matrix.os.architecture }}
219218
version: ${{ matrix.os.version }}
219+
memory: 12G
220+
cpu_count: 4
220221
shell: bash
221222
run: |
222223
sudo pkg install -y cmake

CMakeLists.txt

Lines changed: 116 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -176,37 +176,149 @@ endif()
176176
# RISC-V
177177
if(ARCH_ID STREQUAL "riscv64")
178178
list(APPEND randomx_sources
179+
src/aes_hash_rv64_vector.cpp
180+
src/aes_hash_rv64_zvkned.cpp
179181
src/jit_compiler_rv64_static.S
180-
src/jit_compiler_rv64.cpp)
182+
src/jit_compiler_rv64.cpp
183+
src/jit_compiler_rv64_vector.cpp
184+
src/jit_compiler_rv64_vector_static.S
185+
src/cpu_rv64.S)
186+
181187
# cheat because cmake and ccache hate each other
182188
set_property(SOURCE src/jit_compiler_rv64_static.S PROPERTY LANGUAGE C)
183-
set_property(SOURCE src/jit_compiler_rv64_static.S PROPERTY XCODE_EXPLICIT_FILE_TYPE sourcecode.asm)
189+
set_property(SOURCE src/jit_compiler_rv64_vector_static.S PROPERTY LANGUAGE C)
190+
set_property(SOURCE src/cpu_rv64.S PROPERTY LANGUAGE C)
184191

185192
# default build uses the RV64GC baseline
186193
set(RVARCH "rv64gc")
187194

188195
# for native builds, enable Zba and Zbb if supported by the CPU
189196
if(ARCH STREQUAL "native")
190197
enable_language(ASM)
198+
199+
try_run(RANDOMX_VECTOR_RUN_FAIL
200+
RANDOMX_VECTOR_COMPILE_OK
201+
${CMAKE_CURRENT_BINARY_DIR}/
202+
${CMAKE_CURRENT_SOURCE_DIR}/src/tests/riscv64_vector.s
203+
COMPILE_DEFINITIONS "-march=rv64gcv")
204+
205+
if (RANDOMX_VECTOR_COMPILE_OK AND NOT RANDOMX_VECTOR_RUN_FAIL)
206+
set(RVARCH_V ON)
207+
message(STATUS "RISC-V vector extension detected")
208+
else()
209+
set(RVARCH_V OFF)
210+
endif()
211+
212+
try_run(RANDOMX_ZICBOP_RUN_FAIL
213+
RANDOMX_ZICBOP_COMPILE_OK
214+
${CMAKE_CURRENT_BINARY_DIR}/
215+
${CMAKE_CURRENT_SOURCE_DIR}/src/tests/riscv64_zicbop.s
216+
COMPILE_DEFINITIONS "-march=rv64gc_zicbop")
217+
218+
if (RANDOMX_ZICBOP_COMPILE_OK AND NOT RANDOMX_ZICBOP_RUN_FAIL)
219+
set(RVARCH_ZICBOP ON)
220+
message(STATUS "RISC-V zicbop extension detected")
221+
else()
222+
set(RVARCH_ZICBOP OFF)
223+
endif()
224+
191225
try_run(RANDOMX_ZBA_RUN_FAIL
192226
RANDOMX_ZBA_COMPILE_OK
193227
${CMAKE_CURRENT_BINARY_DIR}/
194228
${CMAKE_CURRENT_SOURCE_DIR}/src/tests/riscv64_zba.s
195229
COMPILE_DEFINITIONS "-march=rv64gc_zba")
230+
196231
if (RANDOMX_ZBA_COMPILE_OK AND NOT RANDOMX_ZBA_RUN_FAIL)
197-
set(RVARCH "${RVARCH}_zba")
232+
set(RVARCH_ZBA ON)
233+
message(STATUS "RISC-V zba extension detected")
234+
else()
235+
set(RVARCH_ZBA OFF)
198236
endif()
237+
199238
try_run(RANDOMX_ZBB_RUN_FAIL
200239
RANDOMX_ZBB_COMPILE_OK
201240
${CMAKE_CURRENT_BINARY_DIR}/
202241
${CMAKE_CURRENT_SOURCE_DIR}/src/tests/riscv64_zbb.s
203242
COMPILE_DEFINITIONS "-march=rv64gc_zbb")
243+
204244
if (RANDOMX_ZBB_COMPILE_OK AND NOT RANDOMX_ZBB_RUN_FAIL)
205-
set(RVARCH "${RVARCH}_zbb")
245+
set(RVARCH_ZBB ON)
246+
message(STATUS "RISC-V zbb extension detected")
247+
else()
248+
set(RVARCH_ZBB OFF)
249+
endif()
250+
251+
try_run(RANDOMX_ZVKB_RUN_FAIL
252+
RANDOMX_ZVKB_COMPILE_OK
253+
${CMAKE_CURRENT_BINARY_DIR}/
254+
${CMAKE_CURRENT_SOURCE_DIR}/src/tests/riscv64_zvkb.s
255+
COMPILE_DEFINITIONS "-march=rv64gcv_zvkb")
256+
257+
if (RANDOMX_ZVKB_COMPILE_OK AND NOT RANDOMX_ZVKB_RUN_FAIL)
258+
set(RVARCH_ZVKB ON)
259+
message(STATUS "RISC-V zvkb extension detected")
260+
else()
261+
set(RVARCH_ZVKB OFF)
262+
endif()
263+
264+
try_run(RANDOMX_ZVKNED_RUN_FAIL
265+
RANDOMX_ZVKNED_COMPILE_OK
266+
${CMAKE_CURRENT_BINARY_DIR}/
267+
${CMAKE_CURRENT_SOURCE_DIR}/src/tests/riscv64_zvkned.s
268+
COMPILE_DEFINITIONS "-march=rv64gcv_zvkned")
269+
270+
if (RANDOMX_ZVKNED_COMPILE_OK AND NOT RANDOMX_ZVKNED_RUN_FAIL)
271+
set(RVARCH_ZVKNED ON)
272+
message(STATUS "RISC-V zvkned extension detected")
273+
else()
274+
set(RVARCH_ZVKNED OFF)
275+
endif()
276+
277+
# for native builds, enable Zba and Zbb if supported by the CPU
278+
if (ARCH STREQUAL "native")
279+
if (RVARCH_V)
280+
set(RVARCH "${RVARCH}v")
281+
endif()
282+
if (RVARCH_ZICBOP)
283+
set(RVARCH "${RVARCH}_zicbop")
284+
endif()
285+
if (RVARCH_ZBA)
286+
set(RVARCH "${RVARCH}_zba")
287+
endif()
288+
if (RVARCH_ZBB)
289+
set(RVARCH "${RVARCH}_zbb")
290+
endif()
291+
if (RVARCH_ZVKB)
292+
set(RVARCH "${RVARCH}_zvkb")
293+
endif()
294+
if (RVARCH_ZVKNED)
295+
set(RVARCH "${RVARCH}_zvkned")
296+
endif()
206297
endif()
207298
endif()
208299

209300
add_flag("-march=${RVARCH}")
301+
302+
set(RV64_VECTOR_FILE_ARCH "rv64gcv")
303+
304+
if (ARCH STREQUAL "native")
305+
if (RVARCH_ZICBOP)
306+
set(RV64_VECTOR_FILE_ARCH "${RV64_VECTOR_FILE_ARCH}_zicbop")
307+
endif()
308+
if (RVARCH_ZBA)
309+
set(RV64_VECTOR_FILE_ARCH "${RV64_VECTOR_FILE_ARCH}_zba")
310+
endif()
311+
if (RVARCH_ZBB)
312+
set(RV64_VECTOR_FILE_ARCH "${RV64_VECTOR_FILE_ARCH}_zbb")
313+
endif()
314+
if (RVARCH_ZVKB)
315+
set(RV64_VECTOR_FILE_ARCH "${RV64_VECTOR_FILE_ARCH}_zvkb")
316+
endif()
317+
endif()
318+
319+
set_source_files_properties(src/jit_compiler_rv64_vector_static.S PROPERTIES COMPILE_FLAGS "-march=${RV64_VECTOR_FILE_ARCH}")
320+
set_source_files_properties(src/aes_hash_rv64_vector.cpp PROPERTIES COMPILE_FLAGS "-O3 -march=${RV64_VECTOR_FILE_ARCH}")
321+
set_source_files_properties(src/aes_hash_rv64_zvkned.cpp PROPERTIES COMPILE_FLAGS "-O3 -march=${RV64_VECTOR_FILE_ARCH}_zvkned")
210322
endif()
211323

212324
set(RANDOMX_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/src" CACHE STRING "RandomX Include path")

src/aes_hash.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2727
*/
2828

2929
#include "soft_aes.h"
30+
#include "cpu.hpp"
3031
#include <cassert>
3132

33+
#ifdef __riscv
34+
#include "aes_hash_rv64_zvkned.hpp"
35+
#include "aes_hash_rv64_vector.hpp"
36+
#endif
37+
3238
//NOTE: The functions below were tuned for maximum performance
3339
//and are not cryptographically secure outside of the scope of RandomX.
3440
//It's not recommended to use them as general hash functions and PRNGs.
@@ -60,6 +66,19 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
6066
template<bool softAes>
6167
void hashAes1Rx4(const void *input, size_t inputSize, void *hash) {
6268
assert(inputSize % 64 == 0);
69+
70+
#ifdef __riscv
71+
if (randomx::cpu.hasAes()) {
72+
hashAes1Rx4_zvkned(input, inputSize, hash);
73+
return;
74+
}
75+
76+
if (randomx::cpu.hasRVV() && (randomx::cpu.getRVV_Length() >= 256)) {
77+
hashAes1Rx4_RVV(input, inputSize, hash);
78+
return;
79+
}
80+
#endif
81+
6382
const uint8_t* inptr = (uint8_t*)input;
6483
const uint8_t* inputEnd = inptr + inputSize;
6584

@@ -132,6 +151,19 @@ template void hashAes1Rx4<true>(const void *input, size_t inputSize, void *hash)
132151
template<bool softAes>
133152
void fillAes1Rx4(void *state, size_t outputSize, void *buffer) {
134153
assert(outputSize % 64 == 0);
154+
155+
#ifdef __riscv
156+
if (randomx::cpu.hasAes()) {
157+
fillAes1Rx4_zvkned(state, outputSize, buffer);
158+
return;
159+
}
160+
161+
if (randomx::cpu.hasRVV() && (randomx::cpu.getRVV_Length() >= 256)) {
162+
fillAes1Rx4_RVV(state, outputSize, buffer);
163+
return;
164+
}
165+
#endif
166+
135167
const uint8_t* outptr = (uint8_t*)buffer;
136168
const uint8_t* outputEnd = outptr + outputSize;
137169

@@ -187,6 +219,19 @@ template void fillAes1Rx4<false>(void *state, size_t outputSize, void *buffer);
187219
template<bool softAes>
188220
void fillAes4Rx4(void *state, size_t outputSize, void *buffer) {
189221
assert(outputSize % 64 == 0);
222+
223+
#ifdef __riscv
224+
if (randomx::cpu.hasAes()) {
225+
fillAes4Rx4_zvkned(state, outputSize, buffer);
226+
return;
227+
}
228+
229+
if (randomx::cpu.hasRVV() && (randomx::cpu.getRVV_Length() >= 256)) {
230+
fillAes4Rx4_RVV(state, outputSize, buffer);
231+
return;
232+
}
233+
#endif
234+
190235
const uint8_t* outptr = (uint8_t*)buffer;
191236
const uint8_t* outputEnd = outptr + outputSize;
192237

@@ -242,6 +287,18 @@ template void fillAes4Rx4<false>(void *state, size_t outputSize, void *buffer);
242287

243288
template<bool softAes>
244289
void hashAndFillAes1Rx4(void *scratchpad, size_t scratchpadSize, void *hash, void* fill_state) {
290+
#ifdef __riscv
291+
if (randomx::cpu.hasAes()) {
292+
hashAndFillAes1Rx4_zvkned(scratchpad, scratchpadSize, hash, fill_state);
293+
return;
294+
}
295+
296+
if (randomx::cpu.hasRVV() && (randomx::cpu.getRVV_Length() >= 256)) {
297+
hashAndFillAes1Rx4_RVV(scratchpad, scratchpadSize, hash, fill_state);
298+
return;
299+
}
300+
#endif
301+
245302
uint8_t* scratchpadPtr = (uint8_t*)scratchpad;
246303
const uint8_t* scratchpadEnd = scratchpadPtr + scratchpadSize;
247304

0 commit comments

Comments
 (0)