1#ifndef HEX_UTILS_H
2#define HEX_UTILS_H
3
4#include <stdbool.h>
5#include <stdint.h>
6
7#include "hexagon_types.h"
8
9#include "hex-fastdiv.h"
10#include "hex-dump.h"
11
12#ifndef MAX
13#define MAX(a, b) ((a) > (b) ? (a) : (b))
14#endif
15
16#ifndef MIN
17#define MIN(a, b) ((a) < (b) ? (a) : (b))
18#endif
19
20static inline uint64_t hex_get_cycles() {
21 uint64_t cycles = 0;
22 asm volatile(" %0 = c15:14\n" : "=r"(cycles));
23 return cycles;
24}
25
26static inline uint64_t hex_get_pktcnt() {
27 uint64_t pktcnt;
28 asm volatile(" %0 = c19:18\n" : "=r"(pktcnt));
29 return pktcnt;
30}
31
32static inline int32_t hex_is_aligned(void * addr, uint32_t align) {
33 return ((size_t) addr & (align - 1)) == 0;
34}
35
36static inline int32_t hex_is_one_chunk(void * addr, uint32_t n, uint32_t chunk_size) {
37 uint32_t left_off = (size_t) addr & (chunk_size - 1);
38 uint32_t right_off = left_off + n;
39 return right_off <= chunk_size;
40}
41
42static inline uint32_t hex_round_up(uint32_t n, uint32_t m) {
43 return m * ((n + m - 1) / m);
44}
45
46static inline void hex_l2fetch(const void * p, uint32_t width, uint32_t stride, uint32_t height) {
47 const uint64_t control = Q6_P_combine_RR(stride, Q6_R_combine_RlRl(width, height));
48 Q6_l2fetch_AP((void *) p, control);
49}
50
51#endif /* HEX_UTILS_H */