1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
| | #include <stddef.h>
#include <sys/auxv.h>
#include "libc.h"
void *__memset_scalar(void *s, int c, size_t n);
void *__memset_vect(void *s, int c, size_t n);
void *__memcpy_scalar(void *restrict dest, const void *restrict src, size_t n);
void *__memcpy_vect(void *restrict dest, const void *restrict src, size_t n);
void *__memmove_scalar(void *restrict dest, const void *restrict src, size_t n);
void *__memmove_vect(void *restrict dest, const void *restrict src, size_t n);
/* string function pointer, runtime-dispatched based on RVV support */
#ifndef __riscv_vector
static void *(*__memset_ptr)(void *, int, size_t) = __memset_scalar;
static void *(*__memcpy_ptr)(void *, const void *, size_t) = __memcpy_scalar;
static void *(*__memmove_ptr)(void *, const void *, size_t) = __memmove_scalar;
#else
static void *(*__memset_ptr)(void *, int, size_t) = __memset_vect;
static void *(*__memcpy_ptr)(void *, const void *, size_t) = __memcpy_vect;
static void *(*__memmove_ptr)(void *, const void *, size_t) = __memmove_vect;
#endif
void *memset(void *s, int c, size_t n)
{
return __memset_ptr(s, c, n);
}
void *memcpy(void *restrict dest, const void *restrict src, size_t n)
{
return __memcpy_ptr(dest, src, n);
}
void *memmove(void *dest, const void *src, size_t n)
{
return __memmove_ptr(dest, src, n);
}
static inline int __has_rvv_via_hwcap(void)
{
const unsigned long V_bit = (1ul << ('V' - 'A'));
unsigned long hwcap = __getauxval(AT_HWCAP);
return (hwcap & V_bit) != 0;
}
hidden void __init_riscv_string_optimizations(void)
{
if (__has_rvv_via_hwcap()) {
__memset_ptr = __memset_vect;
__memcpy_ptr = __memcpy_vect;
__memmove_ptr = __memmove_vect;
}
}
|