summaryrefslogtreecommitdiff
path: root/vp8/common/riscv/copymem_rvv.c
diff options
context:
space:
mode:
Diffstat (limited to 'vp8/common/riscv/copymem_rvv.c')
-rw-r--r--vp8/common/riscv/copymem_rvv.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/vp8/common/riscv/copymem_rvv.c b/vp8/common/riscv/copymem_rvv.c
new file mode 100644
index 000000000..1999a4fad
--- /dev/null
+++ b/vp8/common/riscv/copymem_rvv.c
@@ -0,0 +1,54 @@
+#include <riscv_vector.h>
+#include "./vpx_config.h"
+#include "./vp8_rtcd.h"
+
+void vp8_copy_mem16x16_rvv(unsigned char *src, int src_stride,
+ unsigned char *dst, int dst_stride) {
+ vuint64m2_t v;
+ size_t vl;
+ size_t n = 16;
+ while (n) {
+ /* Assume e64 is supported. */
+ vl = __riscv_vsetvl_e64m2(n);
+
+ v = __riscv_vlse64_v_u64m2((uint64_t *) src, src_stride, vl);
+ __riscv_vsse64_v_u64m2((uint64_t *) dst, dst_stride, v, vl);
+
+ v = __riscv_vlse64_v_u64m2((uint64_t *) (src + 8), src_stride, vl);
+ __riscv_vsse64_v_u64m2((uint64_t *) (dst + 8), dst_stride, v, vl);
+
+ n -= vl;
+ src += src_stride * vl;
+ dst += dst_stride * vl;
+ }
+}
+
+void vp8_copy_mem8x8_rvv(unsigned char *src, int src_stride,
+ unsigned char *dst, int dst_stride) {
+ size_t n = 8;
+ size_t vl;
+ vuint64m2_t v;
+
+ while (n) {
+ /* Assume e64 is supported. */
+ vl = __riscv_vsetvl_e64m2(n);
+
+ v = __riscv_vlse64_v_u64m2((uint64_t *) src, src_stride, vl);
+ __riscv_vsse64_v_u64m2((uint64_t *) dst, dst_stride, v, vl);
+
+ n -= vl;
+ src += src_stride * vl;
+ dst += dst_stride * vl;
+ }
+}
+
+void vp8_copy_mem8x4_rvv(unsigned char *src, int src_stride,
+ unsigned char *dst, int dst_stride) {
+ size_t vl;
+ vuint64m2_t v;
+
+ /* VL must be 4 because VLEN must be >= 128. Assume e64 is supported. */
+ vl = __riscv_vsetvl_e64m2(4);
+ v = __riscv_vlse64_v_u64m2((uint64_t *) src, src_stride, vl);
+ __riscv_vsse64_v_u64m2((uint64_t *) dst, dst_stride, v, vl);
+}