lv_sve2_util.h
API reference for lv_sve2_util.h
Summary
Macros
SVE_0_CONNECT2
#define SVE_0_CONNECT2(ma_A, ma_B) \
ma_A##ma_BSVE_0_CONNECT3
#define SVE_0_CONNECT3(ma_A, ma_B, ma_C) \
ma_A##ma_B##ma_CSVE_0_CONNECT4
#define SVE_0_CONNECT4(ma_A, ma_B, ma_C, ma_D) \
ma_A##ma_B##ma_C##ma_DSVE_0_CONNECT5
#define SVE_0_CONNECT5(ma_A, ma_B, ma_C, ma_D, ma_E) \
ma_A##ma_B##ma_C##ma_D##ma_ESVE_0_CONNECT6
#define SVE_0_CONNECT6(ma_A, ma_B, ma_C, ma_D, ma_E, ma_F) \
ma_A##ma_B##ma_C##ma_D##ma_E##ma_FSVE_0_CONNECT7
#define SVE_0_CONNECT7(ma_A, ma_B, ma_C, ma_D, ma_E, ma_F, ma_G) \
ma_A##ma_B##ma_C##ma_D##ma_E##ma_F##ma_GSVE_0_CONNECT8
#define SVE_0_CONNECT8(ma_A, ma_B, ma_C, ma_D, ma_E, ma_F, ma_G, ma_H) \
ma_A##ma_B##ma_C##ma_D##ma_E##ma_F##ma_G##ma_HSVE_0_CONNECT9
#define SVE_0_CONNECT9(ma_A, ma_B, ma_C, ma_D, ma_E, ma_F, ma_G, ma_H, ma_I) \
ma_A##ma_B##ma_C##ma_D##ma_E##ma_F##ma_G##ma_H##ma_IALT_SVE_CONNECT2
#define ALT_SVE_CONNECT2(ma_A, ma_B) \
SVE_0_CONNECT2(ma_A, ma_B)SVE_CONNECT2
#define SVE_CONNECT2(ma_A, ma_B) \
SVE_0_CONNECT2(ma_A, ma_B)SVE_CONNECT3
#define SVE_CONNECT3(ma_A, ma_B, ma_C) \
SVE_0_CONNECT3(ma_A, ma_B, ma_C)SVE_CONNECT4
#define SVE_CONNECT4(ma_A, ma_B, ma_C, ma_D) \
SVE_0_CONNECT4(ma_A, ma_B, ma_C, ma_D)SVE_CONNECT5
#define SVE_CONNECT5(ma_A, ma_B, ma_C, ma_D, ma_E) \
SVE_0_CONNECT5(ma_A, ma_B, ma_C, ma_D, ma_E)SVE_CONNECT6
#define SVE_CONNECT6(ma_A, ma_B, ma_C, ma_D, ma_E, ma_F) \
SVE_0_CONNECT6(ma_A, ma_B, ma_C, ma_D, ma_E, ma_F)SVE_CONNECT7
#define SVE_CONNECT7(ma_A, ma_B, ma_C, ma_D, ma_E, ma_F, ma_G) \
SVE_0_CONNECT7(ma_A, ma_B, ma_C, ma_D, ma_E, ma_F, ma_G)SVE_CONNECT8
#define SVE_CONNECT8(ma_A, ma_B, ma_C, ma_D, ma_E, ma_F, ma_G, ma_H) \
SVE_0_CONNECT8(ma_A, ma_B, ma_C, ma_D, ma_E, ma_F, ma_G, ma_H)SVE_CONNECT9
#define SVE_CONNECT9(ma_A, ma_B, ma_C, ma_D, ma_E, ma_F, ma_G, ma_H, ma_I) \
SVE_0_CONNECT9(ma_A, ma_B, ma_C, ma_D, ma_E, ma_F, ma_G, ma_H, ma_I)SVE_CONNECT
#define SVE_CONNECT(...) \
ALT_SVE_CONNECT2(SVE_CONNECT, \
SVE_VA_NUM_ARGS(__VA_ARGS__))(__VA_ARGS__)SVE_VA_NUM_ARGS_IMPL
#define SVE_VA_NUM_ARGS_IMPL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, ma_N, ...) \
ma_NSVE_VA_NUM_ARGS
#define SVE_VA_NUM_ARGS(...) \
SVE_VA_NUM_ARGS_IMPL(0, ##__VA_ARGS__, 16, 15, 14, 13, 12, 11, 10, 9, \
8, 7, 6, 5, 4, 3, 2, 1, 0)SVE_SAFE_NAME
#define SVE_SAFE_NAME(ma_NAME) \
SVE_CONNECT3(ma_, ma_NAME, ma_LINEma_)SVT_PRINT_VECTOR
#define SVT_PRINT_VECTOR(ma_VECOTOR, ma_ELEMENT_T, ma_FORMAT_STRING) \
do { \
int_fast8_t nElementCount = svcntb_pat(SV_ALL) / sizeof(ma_ELEMENT_T); \
uint8_t SVE_SAFE_NAME(chVectorBuffer) \
[nElementCount * sizeof(ma_ELEMENT_T)]; \
\
svst1_u8(svptrue_b8(), \
SVE_SAFE_NAME(chVectorBuffer), \
svreinterpret_u8(ma_VECOTOR)); \
\
ma_ELEMENT_T *pElement = (ma_ELEMENT_T *)SVE_SAFE_NAME(chVectorBuffer); \
printf("%s\t[", #ma_VECOTOR); \
do { \
printf(ma_FORMAT_STRING "\t", (int)*pElement++); \
} while (--nElementCount); \
printf("]\r\n"); \
} while (0)SVT_INIT_VECOTR
#define SVT_INIT_VECOTR(ma_VECTOR, ma_ELEMENT_T, ...) \
do { \
uint8_t SVE_SAFE_NAME(chVectorBuffer)[svcntb_pat(SV_ALL)]; \
\
memset(SVE_SAFE_NAME(chVectorBuffer), /* This should NOT be LV_memset() */ \
0, \
sizeof(SVE_SAFE_NAME(chVectorBuffer))); \
memcpy(SVE_SAFE_NAME(chVectorBuffer), /* This should NOT be LV_memcpy() */ \
(ma_ELEMENT_T[]){ __VA_ARGS__ }, \
MIN(sizeof(SVE_SAFE_NAME(chVectorBuffer)), \
sizeof((ma_ELEMENT_T[]){ __VA_ARGS__ }))); \
\
ma_VECTOR = svld1(svptrue_b8(), \
(ma_ELEMENT_T *)SVE_SAFE_NAME(chVectorBuffer)); \
} while (0)SVT_INIT_PRED
#define SVT_INIT_PRED(ma_PREDICT, ...) \
do { \
uint8_t SVE_SAFE_NAME(chBuffer)[svlen(svundef_u64())]; \
memset(SVE_SAFE_NAME(chBuffer), /* This should NOT be LV_memset() */ \
0, \
sizeof(SVE_SAFE_NAME(chBuffer))); \
\
memcpy(SVE_SAFE_NAME(chBuffer), /* This should NOT be LV_memcpy() */ \
(uint8_t[]){ __VA_ARGS__ }, \
MIN(sizeof(SVE_SAFE_NAME(chBuffer)), \
sizeof((uint8_t[]){ __VA_ARGS__ }))); \
\
ma_PREDICT = (*(svbool_t *)SVE_SAFE_NAME(chBuffer)); \
} while (0)SVT_PRINT_PRED
#define SVT_PRINT_PRED(ma_PREDICT, ma_TYPE_T)SVT_PRINT_BUFFER
#define SVT_PRINT_BUFFER(ma_BUFF_PTR, ma_SIZE, ma_TYPE_T, ma_FMT_STR, ma_STRIDE) \
do { \
ma_TYPE_T *pBuffer = (ma_TYPE_T *)ma_BUFF_PTR; \
size_t nElementCount = (ma_SIZE) / sizeof(ma_TYPE_T); \
\
size_t nStrideSize = (ma_STRIDE); \
size_t nLineCount = 0; \
\
printf("%s\n\t", #ma_BUFF_PTR); \
do { \
\
printf(ma_FMT_STR " ", *pBuffer++); \
nLineCount++; \
if (nLineCount >= nStrideSize) { \
nLineCount = 0; \
printf("\n\t"); \
} \
\
} while (--nElementCount); \
printf("\n"); \
\
} while (0)LV_TARGETING
#define LV_TARGETING(...) \
__attribute__((target(__VA_ARGS__)))MIN
#define MIN(a, b) \
((a) > (b) ? (b) : (a))Dependencies
Last updated on