Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions c/common/platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,10 @@ To apply compiler hint, enclose the branching condition into macros, like this:
#define BROTLI_TARGET_RISCV64
#endif

#if defined(BROTLI_TARGET_RISCV64) && defined(__riscv_v) && __riscv_v >= 1000000
#define BROTLI_RVV_1
#endif

#if defined(__loongarch_lp64)
#define BROTLI_TARGET_LOONGARCH64
#endif
Expand Down
8 changes: 8 additions & 0 deletions c/dec/decode.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@
#include <arm_neon.h>
#endif

#if defined(BROTLI_RVV_1)
#include <riscv_vector.h>
#endif

#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif
Expand Down Expand Up @@ -182,6 +186,10 @@ static BrotliDecoderErrorCode DecodeWindowBits(BrotliDecoderState* s,
static BROTLI_INLINE void memmove16(uint8_t* dst, uint8_t* src) {
#if defined(BROTLI_TARGET_NEON)
vst1q_u8(dst, vld1q_u8(src));
#elif defined(BROTLI_RVV_1)
size_t vl = __riscv_vsetvl_e8m1(16);
vuint8m1_t v = __riscv_vle8_v_u8m1(src, vl);
__riscv_vse8_v_u8m1(dst, v, vl);
#else
uint32_t buffer[4];
memcpy(buffer, src, 16);
Expand Down
26 changes: 24 additions & 2 deletions c/enc/find_match_length.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,30 @@
extern "C" {
#endif

/* Separate implementation for little-endian 64-bit targets, for speed. */
#if defined(BROTLI_TZCNT64) && BROTLI_64_BITS && BROTLI_LITTLE_ENDIAN
#if defined(BROTLI_RVV_1)
#include <riscv_vector.h>

static BROTLI_INLINE size_t FindMatchLengthWithLimit(const uint8_t* s1,
const uint8_t* s2,
size_t limit) {
const uint8_t* s1_orig = s1;
while (limit > 0) {
size_t vl = __riscv_vsetvl_e8m1(limit);
vuint8m1_t v1 = __riscv_vle8_v_u8m1(s1, vl);
vuint8m1_t v2 = __riscv_vle8_v_u8m1(s2, vl);
vbool8_t mask = __riscv_vmsne_vv_u8m1_b8(v1, v2, vl);
long first_diff = __riscv_vfirst_m_b8(mask, vl);
if (first_diff >= 0) {
return (size_t)(s1 - s1_orig) + (size_t)first_diff;
}
s1 += vl;
s2 += vl;
limit -= vl;
}
return (size_t)(s1 - s1_orig);
}

#elif defined(BROTLI_TZCNT64) && BROTLI_64_BITS && BROTLI_LITTLE_ENDIAN
static BROTLI_INLINE size_t FindMatchLengthWithLimit(const uint8_t* s1,
const uint8_t* s2,
size_t limit) {
Expand Down