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
| | #include <stddef.h>
#include <stdint.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);
/* memset function pointer, runtime-dispatched based on RVV support */
__attribute__((visibility("hidden")))
#ifndef __riscv_vector
void *(*__memset_ptr)(void *, int, size_t) = __memset_scalar;
#else
void *(*__memset_ptr)(void *, int, size_t) = __memset_vect;
#endif
void *memset(void *s, int c, size_t n)
{
return __memset_ptr(s, c, 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;
}
__attribute__((visibility("hidden")))
void __init_riscv_string_optimizations(void)
{
if (__has_rvv_via_hwcap())
__memset_ptr = __memset_vect;
else
__memset_ptr = __memset_scalar;
}
|