aboutsummaryrefslogtreecommitdiff
path: root/include/ejit/ejit.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/ejit/ejit.h')
-rw-r--r--include/ejit/ejit.h24
1 files changed, 24 insertions, 0 deletions
diff --git a/include/ejit/ejit.h b/include/ejit/ejit.h
index d3bc6c3..9343110 100644
--- a/include/ejit/ejit.h
+++ b/include/ejit/ejit.h
@@ -564,6 +564,16 @@ static inline void ejit_ldxi_ptr(struct ejit_func *s, struct ejit_gpr r0,
abort();
}
+static inline void ejit_ldi_ptr(struct ejit_func *s, struct ejit_gpr r0, void *p)
+{
+ if (sizeof(void *) == sizeof(int64_t))
+ ejit_ldi_u64(s, r0, p);
+ else if (sizeof(void *) == sizeof(int32_t))
+ ejit_ldi_u32(s, r0, p);
+ else
+ abort();
+}
+
static inline void ejit_ldxi_label(struct ejit_func *s, struct ejit_gpr r0,
struct ejit_gpr r1, int64_t o)
{
@@ -571,6 +581,20 @@ static inline void ejit_ldxi_label(struct ejit_func *s, struct ejit_gpr r0,
ejit_ldxi_ptr(s, r0, r1, o);
}
+#define EJIT_LDI(f, t, r0, o) \
+ _Generic((t)(0), \
+ int8_t: ejit_ldi_i8, \
+ uint8_t: ejit_ldi_u8, \
+ int16_t: ejit_ldi_i16, \
+ uint16_t: ejit_ldi_u16, \
+ int32_t: ejit_ldi_i32, \
+ uint32_t: ejit_ldi_u32, \
+ int64_t: ejit_ldi_i64, \
+ uint64_t: ejit_ldi_u64, \
+ float: ejit_ldi_f, \
+ double: ejit_ldi_d, \
+ default: ejit_ldi_ptr)((f), (r0), (o))
+
#define EJIT_LDXI(f, t, r0, r1, o) \
_Generic((t)(0), \
int8_t: ejit_ldxi_i8, \