blob: 9d8ce124a93388990b2cc377f793fc6e61092333 [file] [log] [blame]
#ifndef XTHEADMEMIDX_HELPERS_H
#define XTHEADMEMIDX_HELPERS_H
#include <stdint-gcc.h>
#define intX_t long
#define uintX_t unsigned long
#define PRE_DEC_LOAD(T, N) \
void \
T ## _pre_dec_load_ ## N (T *p) \
{ \
extern void f ## T ## N (T*, uintX_t); \
p = p - N; \
T x = *p; \
f ## T ## N (p, x); \
}
#define PRE_INC_LOAD(T, N) \
void \
T ## _pre_inc_load_ ## N (T *p) \
{ \
extern void f ## T ## N (T*, uintX_t); \
p = p + N; \
T x = *p; \
f ## T ## N (p, x); \
}
#define POST_DEC_LOAD(T, N) \
void \
T ## _post_dec_load_ ## N (T *p) \
{ \
extern void f ## T ## N (T*, uintX_t); \
T x = *p; \
p = p - N; \
f ## T ## N (p, x); \
}
#define POST_INC_LOAD(T,N) \
void \
T ## _post_inc_load_ ## N (T *p) \
{ \
extern void f ## T ## N (T*,uintX_t); \
T x = *p; \
p = p + N; \
f ## T ## N (p, x); \
}
#define PRE_DEC_STORE(T, N) \
T * \
T ## _pre_dec_store_ ## N (T *p, T v) \
{ \
p = p - N; \
*p = v; \
return p; \
}
#define PRE_INC_STORE(T, N) \
T * \
T ## _pre_inc_store_ ## N (T *p, T v) \
{ \
p = p + N; \
*p = v; \
return p; \
}
#define POST_DEC_STORE(T, N) \
T * \
T ## _post_dec_store_ ## N (T *p, T v) \
{ \
*p = v; \
p = p - N; \
return p; \
}
#define POST_INC_STORE(T, N) \
T * \
T ## _post_inc_store_ ## N (T *p, T v) \
{ \
*p = v; \
p = p + N; \
return p; \
}
#define LR_REG_IMM(T, IMM) \
intX_t \
lr_reg_imm_ ## T ## _ ## IMM (intX_t rs1, intX_t rs2) \
{ \
return *(T*)(rs1 + (rs2 << IMM)); \
}
#define SR_REG_IMM(T, IMM) \
void \
sr_reg_imm_ ## T ## _ ## IMM (intX_t rs1, intX_t rs2, T val) \
{ \
*(T*)(rs1 + (rs2 << IMM)) = val; \
}
#define LR_REG_IMM_UPD(T, IMM) \
intX_t \
lr_reg_imm_upd_ ## T ## _ ## IMM (intX_t *rs1, intX_t rs2) \
{ \
*rs1 = *rs1 + (rs2 << IMM); \
return *(T*)(*rs1); \
}
#define SR_REG_IMM_UPD(T, IMM) \
void \
sr_reg_imm_upd_ ## T ## _ ## IMM (intX_t *rs1, intX_t rs2, T val) \
{ \
*rs1 = *rs1 + (rs2 << IMM); \
*(T*)(*rs1) = val; \
}
#define LRU_REG_IMM(T, IMM) \
intX_t \
lru_reg_imm_ ## T ## IMM (intX_t rs1, intX_t rs2) \
{ \
rs2 = (uint32_t)rs2; \
return *(T*)(rs1 + (rs2 << IMM)); \
}
#define SRU_REG_IMM(T, IMM) \
void \
sr_reg_imm_ ## T ## _ ## IMM (intX_t rs1, intX_t rs2, T val) \
{ \
rs2 = (uint32_t)rs2; \
*(T*)(rs1 + (rs2 << IMM)) = val; \
}
#define LRU_REG_IMM_UPD(T, IMM) \
intX_t \
lru_reg_imm_upd_ ## T ## IMM (intX_t rs1, intX_t *rs2) \
{ \
uintX_t rs2_32 = (uint32_t)*rs2; \
intX_t t = rs1 + (rs2_32 << IMM); \
intX_t v = *(T*)t; \
*rs2 = t; \
return v; \
}
#define SRU_REG_IMM_UPD(T, IMM) \
void \
sr_reg_imm_upd_ ## T ## _ ## IMM (intX_t rs1, intX_t *rs2, T val) \
{ \
uintX_t rs2_32 = (uint32_t)*rs2; \
intX_t t = rs1 + (rs2_32 << IMM); \
*(T*)t = val; \
*rs2 = t; \
}
#endif /* XTHEADMEMIDX_HELPERS_H */